From eb0c10b0a09da8ff4590c3043a9fa6dd10775ee4 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 11 May 2009 12:17:56 +0000 Subject: [PATCH] =?utf8?q?Korrekturmodul=20f=C3=BCr=20das=20Hauptbuch=20im?= =?utf8?q?plementiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Frührere Lx-Office-Versionen enthalten einige Bugs und Features, die den Export von Buchungsdaten ins DATEV-Format verhindern und allgemein zu ungültigen und/oder unlogischen Einträgen in acc_trans führen. Mit Hilfe dieses Modules, das über den Menüpunkt "System -> Korrekturen -> Korrekturen im Hauptbuch" erreichbar ist, können die Auswirkungen dieser Bugs und Features teils automatisch, teils manuell behoben werden. --- SL/AccTransCorrections.pm | 895 ++++++++++++++++++ SL/Locale.pm | 11 +- SL/Taxkeys.pm | 120 +++ SL/Template/Plugin/LxERP.pm | 7 + acctranscorrections.pl | 1 + bin/mozilla/acctranscorrections.pl | 215 +++++ image/error.png | Bin 0 -> 890 bytes image/ok.png | Bin 0 -> 883 bytes locale/de/acctranscorrections | 191 ++++ locale/de/all | 71 ++ locale/de/ct | 1 + locale/de/menu | 2 + locale/de/menunew | 2 + menu.ini | 10 + .../analyze_filter_de.html | 51 + .../analyze_filter_master.html | 56 ++ .../analyze_overview_de.html | 137 +++ .../analyze_overview_master.html | 137 +++ .../assistant_for_ap_ar_wrong_taxkeys_de.html | 31 + ...istant_for_ap_ar_wrong_taxkeys_master.html | 36 + ...for_invoice_inventory_with_taxkeys_de.html | 27 + ...invoice_inventory_with_taxkeys_master.html | 31 + .../assistant_for_wrong_taxes_de.html | 80 ++ .../assistant_for_wrong_taxes_master.html | 80 ++ .../assistant_for_wrong_taxkeys_de.html | 145 +++ .../assistant_for_wrong_taxkeys_master.html | 158 ++++ .../delete_transaction_confirmation_de.html | 32 + ...elete_transaction_confirmation_master.html | 32 + .../delete_transaction_de.html | 25 + .../delete_transaction_master.html | 25 + .../fix_ap_ar_wrong_taxkeys_de.html | 22 + .../fix_ap_ar_wrong_taxkeys_master.html | 24 + ...fix_invoice_inventory_with_taxkeys_de.html | 22 + ...invoice_inventory_with_taxkeys_master.html | 24 + .../fix_wrong_taxkeys_de.html | 22 + .../fix_wrong_taxkeys_master.html | 23 + 36 files changed, 2741 insertions(+), 5 deletions(-) create mode 100644 SL/AccTransCorrections.pm create mode 100644 SL/Taxkeys.pm create mode 100644 acctranscorrections.pl create mode 100644 bin/mozilla/acctranscorrections.pl create mode 100644 image/error.png create mode 100644 image/ok.png create mode 100644 locale/de/acctranscorrections create mode 100644 templates/webpages/acctranscorrections/analyze_filter_de.html create mode 100644 templates/webpages/acctranscorrections/analyze_filter_master.html create mode 100644 templates/webpages/acctranscorrections/analyze_overview_de.html create mode 100644 templates/webpages/acctranscorrections/analyze_overview_master.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_master.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_master.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_wrong_taxes_de.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_wrong_taxes_master.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_master.html create mode 100644 templates/webpages/acctranscorrections/delete_transaction_confirmation_de.html create mode 100644 templates/webpages/acctranscorrections/delete_transaction_confirmation_master.html create mode 100644 templates/webpages/acctranscorrections/delete_transaction_de.html create mode 100644 templates/webpages/acctranscorrections/delete_transaction_master.html create mode 100644 templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_master.html create mode 100644 templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_master.html create mode 100644 templates/webpages/acctranscorrections/fix_wrong_taxkeys_de.html create mode 100644 templates/webpages/acctranscorrections/fix_wrong_taxkeys_master.html diff --git a/SL/AccTransCorrections.pm b/SL/AccTransCorrections.pm new file mode 100644 index 000000000..610d87e7e --- /dev/null +++ b/SL/AccTransCorrections.pm @@ -0,0 +1,895 @@ +package AccTransCorrections; + +use strict; + +use List::Util qw(first); + +use SL::DBUtils; +use SL::Taxkeys; + +sub new { + my $type = shift; + + my $self = {}; + + bless $self, $type; + + $self->{taxkeys} = Taxkeys->new(); + + return $self; +} + +sub _fetch_transactions { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my (@where, @values) = ((), ()); + + if ($params{transdate_from}) { + push @where, qq|at.transdate >= ?|; + push @values, $params{transdate_from}; + } + + if ($params{transdate_to}) { + push @where, qq|at.transdate <= ?|; + push @values, $params{transdate_to}; + } +# $params{trans_id} = 3150; + if ($params{trans_id}) { + push @where, qq|at.trans_id = ?|; + push @values, $params{trans_id}; + } + + my $where = ''; + if (scalar @where) { + $where = 'WHERE ' . join(' AND ', map { "($_)" } @where); + } + + my $query = qq! + SELECT at.oid, at.*, + c.accno, c.description AS chartdescription, c.charttype, c.category AS chartcategory, c.link AS chartlink, + COALESCE(gl.reference, COALESCE(ap.invnumber, ar.invnumber)) AS reference, + COALESCE(ap.invoice, COALESCE(ar.invoice, FALSE)) AS invoice, + CASE + WHEN gl.id IS NOT NULL THEN gl.storno AND (gl.storno_id IS NOT NULL) + WHEN ap.id IS NOT NULL THEN ap.storno AND (ap.storno_id IS NOT NULL) + ELSE ar.storno AND (ar.storno_id IS NOT NULL) + END AS is_storno, + CASE + WHEN gl.id IS NOT NULL THEN 'gl' + WHEN ap.id IS NOT NULL THEN 'ap' + ELSE 'ar' + END AS module + + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + LEFT JOIN gl ON (at.trans_id = gl.id) + LEFT JOIN ap ON (at.trans_id = ap.id) + LEFT JOIN ar ON (at.trans_id = ar.id) + $where + ORDER BY at.trans_id, at.oid +!; + + my @transactions = (); + my $last_trans = undef; + + foreach my $entry (@{ selectall_hashref_query($form, $dbh, $query, @values) }) { + if (!$last_trans || ($last_trans->[0]->{trans_id} != $entry->{trans_id})) { + $last_trans = []; + push @transactions, $last_trans; + } + + push @{ $last_trans }, $entry; + } + + $main::lxdebug->leave_sub(); + + return @transactions; +} + +sub _prepare_data { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $transaction = $params{transaction}; + my $callback = $params{callback}; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $data = { + 'credit' => { + 'num' => 0, + 'sum' => 0, + 'entries' => [], + 'tax_sum' => 0, + 'tax_entries' => [], + }, + 'debit' => { + 'num' => 0, + 'sum' => 0, + 'entries' => [], + 'tax_sum' => 0, + 'tax_entries' => [], + }, + 'payments' => [], + }; + + foreach my $entry (@{ $transaction }) { + $entry->{chartlinks} = { map { $_ => 1 } split(m/:/, $entry->{chartlink}) }; + delete $entry->{chartlink}; + } + + # Verknüpfungen zwischen Steuerschlüsseln und zum Zeitpunkt der Transaktion + # gültigen Steuersätze + my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $transaction->[0]->{transdate}); + + my ($trans_type, $previous_non_tax_entry); + my $sum = 0; + my $first_sub_trans = 1; + + my $storno_mult = $transaction->[0]->{is_storno} ? -1 : 1; + + # Aufteilung der Buchungspositionen in Soll-, Habenseite sowie + # getrennte Auflistung der Positionen, die auf Steuerkonten gebucht werden. + foreach my $entry (@{ $transaction }) { + if (!$first_sub_trans && ($entry->{chartlinks}->{AP_paid} || $entry->{chartlinks}->{AR_paid})) { + push @{ $data->{payments} }, $entry; + next; + } + + my $tax_info = $all_taxes{taxkeys}->{ $entry->{taxkey} }; + if ($tax_info) { + $entry->{taxdescription} = $tax_info->{taxdescription} . ' ' . $form->format_amount($myconfig, $tax_info->{taxrate} * 100) . ' %'; + } + + if ($entry->{chartlinks}->{AP}) { + $trans_type = 'AP'; + } elsif ($entry->{chartlinks}->{AR}) { + $trans_type = 'AR'; + } + + my $idx = 0 < ($entry->{amount} * $storno_mult) ? 'credit' : 'debit'; + + if ($entry->{chartlinks}->{AP_tax} || $entry->{chartlinks}->{AR_tax}) { + $data->{$idx}->{tax_sum} += $entry->{amount}; + push @{ $data->{$idx}->{tax_entries} }, $entry; + + if ($previous_non_tax_entry) { + $previous_non_tax_entry->{tax_entry} = $entry; + undef $previous_non_tax_entry; + } + + } else { + $data->{$idx}->{sum} += $entry->{amount}; + push @{ $data->{$idx}->{entries} }, $entry; + + $previous_non_tax_entry = $entry; + } + + $sum += $entry->{amount}; + + if (abs($sum) < 0.02) { + $sum = 0; + $first_sub_trans = 0; + } + } + + # Alle Einträge entfernen, die die Gegenkonten zu Zahlungsein- und + # -ausgängen darstellen. + foreach my $payment (@{ $data->{payments} }) { + my $idx = 0 < $payment->{amount} ? 'debit' : 'credit'; + + foreach my $i (0 .. scalar(@{ $data->{$idx}->{entries} }) - 1) { + my $entry = $data->{$idx}->{entries}->[$i]; + + next if ((($payment->{amount} * -1) != $entry->{amount}) || ($payment->{transdate} ne $entry->{transdate})); + + splice @{ $data->{$idx}->{entries} }, $i, 1; + + last; + } + } + + delete $data->{payments}; + + map { $data->{$_}->{num} = scalar @{ $data->{$_}->{entries} } } qw(credit debit); + + my $info = $transaction->[0]; + my $script = ($info->{module} eq 'ar') && $info->{invoice} ? 'is' + : ($info->{module} eq 'ap') && $info->{invoice} ? 'ir' + : $info->{module}; + + my %common_args = ( + 'data' => $data, + 'trans_type' => $trans_type, + 'all_taxes' => { %all_taxes }, + 'transaction' => $transaction, + 'full_analysis' => $params{full_analysis}, + 'problem' => { + 'data' => $info, + 'link' => $script . ".pl?action=edit${callback}&id=" . $info->{trans_id}, + }, + ); + + $main::lxdebug->leave_sub(); + + return %common_args; +} + +sub _group_sub_transactions { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $transaction = shift; + + my @sub_transactions = (); + my $sum = 0; + + foreach my $i (0 .. scalar(@{ $transaction }) - 1) { + my $entry = $transaction->[$i]; + + if (abs($sum) <= 0.01) { + push @sub_transactions, []; + $sum = 0; + } + $sum += $entry->{amount}; + + push @{ $sub_transactions[-1] }, $entry; + } + + $main::lxdebug->leave_sub(); + + return @sub_transactions; +} + +# Problemfall: Verkaufsrechnungen, bei denen Buchungen auf Warenbestandskonten +# mit Steuerschlüssel != 0 durchgeführt wurden. Richtig wäre, dass alle +# Steuerschlüssel für solche Warenbestandsbuchungen 0 sind. +sub _check_trans_invoices_inventory_with_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + if (!$params{transaction}->[0]->{invoice}) { + $main::lxdebug->leave_sub(); + return 0; + } + + my @sub_transactions = $self->_group_sub_transactions($params{transaction}); + + foreach my $sub_transaction (@sub_transactions) { + my $is_cogs = first { $_->{chartlinks}->{IC_cogs} } @{ $sub_transaction }; + next unless ($is_cogs); + + my $needs_fixing = first { $_->{taxkey} != 0 } @{ $sub_transaction }; + next unless ($needs_fixing); + + $params{problem}->{type} = 'invoice_inventory_with_taxkeys'; + push @{ $self->{invoice_inventory_taxkey_problems} }, $params{problem}; + + $main::lxdebug->leave_sub(); + + return 1; + } + + $main::lxdebug->leave_sub(); + + return 0; +} + +# Problemfall: Kreditorenbuchungen, bei denen mit Umsatzsteuerschlüsseln +# gebucht wurde und Debitorenbuchungen, bei denen mit Vorsteuerschlüsseln +# gebucht wurde. +sub _check_trans_ap_ar_wrong_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $retval = 0; + + if (!$params{transaction}->[0]->{invoice} + && (( ($params{transaction}->[0]->{module} eq 'ap') + && (first { my $taxkey = $_->{taxkey}; first { $taxkey == $_ } (2, 3, 12, 13) } @{ $params{transaction} })) + || + ( ($params{transaction}->[0]->{module} eq 'ar') + && (first { my $taxkey = $_->{taxkey}; first { $taxkey == $_ } (8, 9, 18, 19) } @{ $params{transaction} })))) { + $params{problem}->{type} = 'ap_ar_wrong_taxkeys'; + push @{ $self->{ap_ar_taxkey_problems} }, $params{problem}; + + $retval = 1; + } + + $main::lxdebug->leave_sub(); + + return $retval; +} + +# Problemfall: Splitbuchungen, die mehrere Haben- und Sollkonten ansprechen. +# Aber nur für Debitoren- und Kreditorenbuchungen, weil das bei Einkaufs- und +# Verkaufsrechnungen hingegen völlig normal ist. +sub _check_trans_split_multiple_credit_and_debit { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $retval = 0; + + if ( !$params{transaction}->[0]->{invoice} + && (1 < $params{data}->{credit}->{num}) + && (1 < $params{data}->{debit}->{num})) { + $params{problem}->{type} = 'split_multiple_credit_and_debit'; + push @{ $self->{problems} }, $params{problem}; + + $retval = 1; + } + + $main::lxdebug->leave_sub(); + + return $retval; +} + +# Problemfall: Buchungen, bei denen Steuersummen nicht mit den Summen +# übereinstimmen, die nach ausgewähltem Steuerschlüssel hätten auftreten müssen. +sub _check_trans_wrong_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $form = $main::form; + + my %data = %{ $params{data} }; + my $transaction = $params{transaction}; + + if ( $transaction->[0]->{invoice} + || $transaction->[0]->{ob_transaction} + || $transaction->[0]->{cb_transaction} + || (!scalar @{ $data{credit}->{entries} } && !scalar @{ $data{debit}->{entries} }) + || ( ($transaction->[0]->{module} eq 'gl') + && (!scalar @{ $data{credit}->{entries} } || !scalar @{ $data{debit}->{entries} }))) { + $main::lxdebug->leave_sub(); + return 0; + } + + my $retval = 0; + + my ($side, $other_side); + if ( (grep { $_->{taxkey} * 1 } @{ $data{credit}->{entries} }) + || (scalar @{ $data{credit}->{tax_entries} })) { + $side = 'credit'; + $other_side = 'debit'; + + } elsif ( (grep { $_->{taxkey} * 1 } @{ $data{debit}->{entries} }) + || (scalar @{ $data{debit}->{tax_entries} })) { + $side = 'debit'; + $other_side = 'credit'; + } + + if (!$side) { + $main::lxdebug->leave_sub(); + return 0; + } + + my $expected_tax = 0; + my %num_entries_per_chart = (); + my $num_taxed_entries = 0; + + foreach my $entry (@{ $data{$side}->{entries} }) { + my $taxinfo = $params{all_taxes}->{taxkeys}->{$entry->{taxkey}} || { }; + $entry->{expected_tax} = $entry->{amount} * $taxinfo->{taxrate}; + $expected_tax += $entry->{expected_tax}; + + $num_taxed_entries++ if ($taxinfo->{taxrate} * 1); + + my $chart_key = $entry->{chart_id} . "-" . $entry->{taxkey}; + $num_entries_per_chart{$chart_key} ||= 0; + $num_entries_per_chart{$chart_key}++; + } + +# $main::lxdebug->message(0, "side $side trans_id $transaction->[0]->{trans_id} expected tax $expected_tax actual tax $data{$side}->{tax_sum}"); + + if (abs($expected_tax - $data{$side}->{tax_sum}) >= (0.01 * ($num_taxed_entries + 1))) { + if ($params{full_analysis}) { + my $storno_mult = $data{$side}->{entries}->[0]->{is_storno} ? -1 : 1; + + foreach my $entry (@{ $data{$other_side}->{entries} }) { + $entry->{display_amount} = $form->round_amount(abs($entry->{amount}) * $storno_mult, 2); + } + + foreach my $entry (@{ $data{$side}->{entries} }) { + $entry->{actual_tax} = $form->round_amount(abs($entry->{tax_entry} ? $entry->{tax_entry}->{amount} : 0), 2); + $entry->{expected_tax} = $form->round_amount(abs($entry->{expected_tax}), 2); + $entry->{taxkey_error} = ( $entry->{taxkey} && !$entry->{tax_entry}) + || (!$entry->{taxkey} && $entry->{tax_entry}) + || (abs($entry->{expected_tax} - $entry->{actual_tax}) >= 0.02); + $entry->{tax_entry_oid} = $entry->{tax_entry}->{oid}; + delete $entry->{tax_entry}; + + $entry->{display_amount} = $form->round_amount(abs($entry->{amount}) * $storno_mult, 2); + $entry->{display_actual_tax} = $entry->{actual_tax} * $storno_mult; + $entry->{display_expected_tax} = $entry->{expected_tax} * $storno_mult; + + if ($entry->{taxkey_error}) { + $self->{negative_taxkey_filter} ||= { + 'ar' => { map { $_ => 1 } ( 8, 9, 18, 19) }, + 'ap' => { map { $_ => 1 } (1, 2, 3, 12, 13) }, + 'gl' => { }, + }; + + $entry->{correct_taxkeys} = []; + + my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $entry->{transdate}); + + foreach my $taxkey (sort { $a <=> $b } keys %{ $all_taxes{taxkeys} }) { + next if ($self->{negative_taxkey_filter}->{ $entry->{module} }->{$taxkey}); + + my $tax_info = $all_taxes{taxkeys}->{$taxkey}; + + next if ((!$tax_info || (0 == $tax_info->{taxrate} * 1)) && $entry->{tax_entry_oid}); + + push @{ $entry->{correct_taxkeys} }, { + 'taxkey' => $taxkey, + 'tax' => $form->round_amount(abs($entry->{amount}) * $tax_info->{taxrate}, 2), + 'description' => sprintf("%s %d%%", $tax_info->{taxdescription}, int($tax_info->{taxrate} * 100)), + }; + } + } + } + } + + if (first { $_ > 1 } values %num_entries_per_chart) { + $params{problem}->{type} = 'wrong_taxkeys'; + } else { + $params{problem}->{type} = 'wrong_taxes'; + } + + $params{problem}->{acc_trans} = { %data }; + push @{ $self->{problems} }, $params{problem}; + + $retval = 1; + } + + $main::lxdebug->leave_sub(); + + return $retval; +} + +# Inaktiver Code für das Erraten möglicher Verteilungen von +# Steuerschlüsseln. Deaktiviert, weil er exponentiell Zeit +# benötigt. + +# if (abs($expected_tax - $data{$side}->{tax_sum}) >= 0.02) { +# my @potential_taxkeys = $trans_type eq 'AP' ? (0, 8, 9) : (0, 1, 2, 3); + +# $main::lxdebug->dump(0, "pota", \@potential_taxkeys); + +# # Über alle Kombinationen aus Buchungssätzen und potenziellen Steuerschlüsseln +# # iterieren und jeweils die Summe ermitteln. +# my $num_entries = scalar @{ $data{$side}->{entries} }; +# my @taxkey_indices = (0) x $num_entries; + +# my @solutions = (); + +# my $start_time = time(); + +# $main::lxdebug->message(0, "num_entries $num_entries"); + +# while ($num_entries == scalar @taxkey_indices) { +# my @tax_cache = (); + +# # Berechnen der Steuersumme für die aktuell angenommenen Steuerschlüssel. +# my $tax_sum = 0; +# foreach my $i (0 .. $num_entries - 1) { +# my $taxkey = $potential_taxkeys[$taxkey_indices[$i]]; +# my $entry = $data{$side}->{entries}->[$i]; +# my $taxinfo = $all_taxes{taxkeys}->{ $taxkey } || { }; +# $tax_cache[$i] = $entry->{amount} * $taxinfo->{taxrate}; +# $tax_sum += $tax_cache[$i]; +# } + +# # Entspricht die Steuersumme mit den aktuell angenommenen Steuerschlüsseln +# # der verbuchten Steuersumme? Wenn ja, dann ist das eine potenzielle +# # Lösung. +# if (abs($tax_sum - $data{$side}->{tax_sum}) < 0.02) { +# push @solutions, { +# 'taxkeys' => [ @potential_taxkeys[@taxkey_indices] ], +# 'taxes' => [ @tax_cache ], +# } +# } + +# # Weiterzählen der Steuerschlüsselindices zum Interieren über +# # alle möglichen Kombinationen. +# my $i = 0; +# while (1) { +# $taxkey_indices[$i]++; +# last if ($taxkey_indices[$i] < scalar @potential_taxkeys); + +# $taxkey_indices[$i] = 0; +# $i++; +# } + +# my $now = time(); +# if (($now - $start_time) >= 5) { +# $main::lxdebug->message(0, " " . join("", @taxkey_indices)); +# $start_time = $now; +# } +# } + +# foreach my $solution (@solutions) { +# $solution->{rows} = []; +# $solution->{changes} = []; +# my $error = 0; + +# foreach my $i (0 .. $num_entries - 1) { +# if ($solution->{taxes}->[$i]) { +# my $tax_rounded = $form->round_amount($solution->{taxes}->[$i] + $error, 2); +# $error = $solution->{taxes}->[$i] + $error - $tax_rounded; +# $solution->{taxes}->[$i] = $tax_rounded; +# } + +# my $entry = $data{$side}->{entries}->[$i]; +# my $tax_entry = $all_taxes{taxkeys}->{ $solution->{taxkeys}->[$i] }; + +# push @{ $solution->{rows} }, { +# %{ $entry }, +# %{ $tax_entry }, +# 'taxamount' => $solution->{taxes}->[$i], +# }; + +# $solution->{rows}->[$i]->{taxdescription} .= ' ' . $form->format_amount(\%myconfig, $tax_entry->{taxrate} * 100) . ' %'; + +# push @{ $solution->{changes} }, { +# 'oid' => $entry->{oid}, +# 'taxkey' => $solution->{taxkeys}->[$i], +# }; +# } + +# push @{ $solution->{rows} }, @{ $data{$other_side}->{entries} }; + +# delete @{ $solution }{ qw(taxes taxkeys) }; +# } + +# $problem->{type} = 'wrong_taxkeys'; +# $problem->{solutions} = [ @solutions ]; +# $problem->{acc_trans} = { %data }; +# push @problems, $problem; + +# next; +# } + +sub analyze { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my @transactions = $self->_fetch_transactions(%params, 'dbh' => $dbh); + + if (!scalar @transactions) { + $main::lxdebug->leave_sub(); + return (); + } + + my $callback = $params{callback} ? '&callback=' . $params{callback} : ''; + + $self->{problems} = []; + $self->{ap_ar_taxkey_problems} = []; + $self->{invoice_inventory_taxkey_problems} = []; + + foreach my $transaction (@transactions) { + my %common_args = $self->_prepare_data('transaction' => $transaction, 'callback' => $callback, 'full_analysis' => $params{full_analysis}); + + next if ($self->_check_trans_ap_ar_wrong_taxkeys(%common_args)); + next if ($self->_check_trans_invoices_inventory_with_taxkeys(%common_args)); + next if ($self->_check_trans_split_multiple_credit_and_debit(%common_args)); + next if ($self->_check_trans_wrong_taxkeys(%common_args)); + } + + my @problems = @{ $self->{problems} }; + + if (0 != scalar @{ $self->{ap_ar_taxkey_problems} }) { + my $problem = { + 'type' => 'ap_ar_wrong_taxkeys', + 'ap_problems' => [ grep { $_->{data}->{module} eq 'ap' } @{ $self->{ap_ar_taxkey_problems} } ], + 'ar_problems' => [ grep { $_->{data}->{module} eq 'ar' } @{ $self->{ap_ar_taxkey_problems} } ], + }; + unshift @problems, $problem; + } + + if (0 != scalar @{ $self->{invoice_inventory_taxkey_problems} }) { + my $problem = { + 'type' => 'invoice_inventory_with_taxkeys', + 'ap_problems' => [ grep { $_->{data}->{module} eq 'ap' } @{ $self->{invoice_inventory_taxkey_problems} } ], + 'ar_problems' => [ grep { $_->{data}->{module} eq 'ar' } @{ $self->{invoice_inventory_taxkey_problems} } ], + }; + unshift @problems, $problem; + } + + $main::lxdebug->leave_sub(); + + + return @problems; +} + +sub fix_ap_ar_wrong_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $query = qq|SELECT 'ap' AS module, + at.oid, at.trans_id, at.chart_id, at.amount, at.taxkey, at.transdate, + c.link + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (trans_id IN (SELECT id FROM ap WHERE NOT invoice)) + AND (taxkey IN (2, 3, 12, 13)) + + UNION + + SELECT 'ar' AS module, + at.oid, at.trans_id, at.chart_id, at.amount, at.taxkey, at.transdate, + c.link + FROM acc_trans at + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (trans_id IN (SELECT id FROM ar WHERE NOT invoice)) + AND (taxkey IN (8, 9, 18, 19)) + + ORDER BY trans_id, oid|; + + my $sth = prepare_execute_query($form, $dbh, $query); + my @transactions; + + while (my $ref = $sth->fetchrow_hashref()) { + if ((!scalar @transactions) || ($ref->{trans_id} != $transactions[-1]->[0]->{trans_id})) { + push @transactions, []; + } + + push @{ $transactions[-1] }, $ref; + } + + $sth->finish(); + + @transactions = grep { (scalar(@transactions) % 2) == 0 } @transactions; + + my %taxkey_replacements = ( + 2 => 8, + 3 => 9, + 8 => 2, + 9 => 3, + 12 => 18, + 13 => 19, + 18 => 12, + 19 => 13, + ); + + my %bad_taxkeys = ( + 'ap' => { map { $_ => 1 } (2, 3, 12, 13) }, + 'ar' => { map { $_ => 1 } (8, 9, 18, 19) }, + ); + + my @corrections = (); + + foreach my $transaction (@transactions) { + + for (my $i = 0; $i < scalar @{ $transaction }; $i += 2) { + my ($non_tax_idx, $tax_idx) = abs($transaction->[$i]->{amount}) > abs($transaction->[$i + 1]->{amount}) ? ($i, $i + 1) : ($i + 1, $i); + my ($non_tax, $tax) = @{ $transaction }[$non_tax_idx, $tax_idx]; + + last if ($non_tax->{link} =~ m/(:?AP|AR)_tax(:?$|:)/); + last if ($tax->{link} !~ m/(:?AP|AR)_tax(:?$|:)/); + + next if (!$bad_taxkeys{ $non_tax->{module} }->{ $non_tax->{taxkey} }); + + my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $non_tax->{transdate}); + + push @corrections, ({ 'oid' => $non_tax->{oid}, + 'taxkey' => $taxkey_replacements{$non_tax->{taxkey}}, + }, + { + 'oid' => $tax->{oid}, + 'taxkey' => $taxkey_replacements{$non_tax->{taxkey}}, + 'chart_id' => $all_taxes{taxkeys}->{ $taxkey_replacements{$non_tax->{taxkey}} }->{taxchart_id}, + }); + } + } + + if (scalar @corrections) { + my $q_taxkey_only = qq|UPDATE acc_trans SET taxkey = ? WHERE oid = ?|; + my $h_taxkey_only = prepare_query($form, $dbh, $q_taxkey_only); + + my $q_taxkey_chart_id = qq|UPDATE acc_trans SET taxkey = ?, chart_id = ? WHERE oid = ?|; + my $h_taxkey_chart_id = prepare_query($form, $dbh, $q_taxkey_chart_id); + + foreach my $entry (@corrections) { + if ($entry->{chart_id}) { + do_statement($form, $h_taxkey_chart_id, $q_taxkey_chart_id, $entry->{taxkey}, $entry->{chart_id}, $entry->{oid}); + } else { + do_statement($form, $h_taxkey_only, $q_taxkey_only, $entry->{taxkey}, $entry->{oid}); + } + } + + $h_taxkey_only->finish(); + $h_taxkey_chart_id->finish(); + + $dbh->commit() unless ($params{dbh}); + } + + $main::lxdebug->leave_sub(); +} + +sub fix_invoice_inventory_with_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $query = qq|SELECT at.oid, at.*, c.link + FROM acc_trans at + LEFT JOIN ar ON (at.trans_id = ar.id) + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (ar.invoice) + + UNION + + SELECT at.oid, at.*, c.link + FROM acc_trans at + LEFT JOIN ap ON (at.trans_id = ap.id) + LEFT JOIN chart c ON (at.chart_id = c.id) + WHERE (ap.invoice) + + ORDER BY trans_id, oid|; + + my $sth = prepare_execute_query($form, $dbh, $query); + my @transactions; + + while (my $ref = $sth->fetchrow_hashref()) { + if ((!scalar @transactions) || ($ref->{trans_id} != $transactions[-1]->[0]->{trans_id})) { + push @transactions, []; + } + + push @{ $transactions[-1] }, $ref; + } + + $sth->finish(); + + my @corrections = (); + + foreach my $transaction (@transactions) { + my @sub_transactions = $self->_group_sub_transactions($transaction); + + foreach my $sub_transaction (@sub_transactions) { + my $is_cogs = first { $_->{link} =~ m/IC_cogs/ } @{ $sub_transaction }; + next unless ($is_cogs); + + foreach my $entry (@{ $sub_transaction }) { + next if ($entry->{taxkey} == 0); + push @corrections, $entry->{oid}; + } + } + } + + if (@corrections) { + $query = qq|UPDATE acc_trans SET taxkey = 0 WHERE oid = ?|; + $sth = prepare_query($form, $dbh, $query); + + foreach my $oid (@corrections) { + do_statement($form, $sth, $query, $oid); + } + + $sth->finish(); + + $dbh->commit() unless ($params{dbh}); +# $dbh->rollback(); + } + + $main::lxdebug->leave_sub(); +} + +sub fix_wrong_taxkeys { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(fixes)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + my $q_taxkey_only = qq|UPDATE acc_trans SET taxkey = ? WHERE oid = ?|; + my $h_taxkey_only = prepare_query($form, $dbh, $q_taxkey_only); + + my $q_taxkey_chart = qq|UPDATE acc_trans SET taxkey = ?, chart_id = ? WHERE oid = ?|; + my $h_taxkey_chart = prepare_query($form, $dbh, $q_taxkey_chart); + + my $q_transdate = qq|SELECT transdate FROM acc_trans WHERE oid = ?|; + my $h_transdate = prepare_query($form, $dbh, $q_transdate); + + foreach my $fix (@{ $params{fixes} }) { + next unless ($fix->{oid}); + + do_statement($form, $h_taxkey_only, $q_taxkey_only, conv_i($fix->{taxkey}), conv_i($fix->{oid})); + + next unless ($fix->{tax_entry_oid}); + + do_statement($form, $h_transdate, $q_transdate, conv_i($fix->{tax_entry_oid})); + my ($transdate) = $h_transdate->fetchrow_array(); + + my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $transdate); + my $tax_info = $all_taxes{taxkeys}->{ $fix->{taxkey} }; + + next unless ($tax_info); + + do_statement($form, $h_taxkey_chart, $q_taxkey_chart, conv_i($fix->{taxkey}), conv_i($tax_info->{taxchart_id}), conv_i($fix->{tax_entry_oid})); + } + + $h_taxkey_only->finish(); + $h_taxkey_chart->finish(); + $h_transdate->finish(); + +# $dbh->rollback(); + $dbh->commit() unless ($params{dbh}); + + $main::lxdebug->leave_sub(); +} + +sub delete_transaction { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(trans_id)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + + do_query($form, $dbh, qq|UPDATE ar SET storno_id = NULL WHERE storno_id = ?|, conv_i($params{trans_id})); + do_query($form, $dbh, qq|UPDATE ap SET storno_id = NULL WHERE storno_id = ?|, conv_i($params{trans_id})); + do_query($form, $dbh, qq|UPDATE gl SET storno_id = NULL WHERE storno_id = ?|, conv_i($params{trans_id})); + + do_query($form, $dbh, qq|DELETE FROM ar WHERE id = ?|, conv_i($params{trans_id})); + do_query($form, $dbh, qq|DELETE FROM ap WHERE id = ?|, conv_i($params{trans_id})); + do_query($form, $dbh, qq|DELETE FROM gl WHERE id = ?|, conv_i($params{trans_id})); + do_query($form, $dbh, qq|DELETE FROM acc_trans WHERE trans_id = ?|, conv_i($params{trans_id})); + +# $dbh->rollback(); + $dbh->commit() unless ($params{dbh}); + + $main::lxdebug->leave_sub(); +} + +1; diff --git a/SL/Locale.pm b/SL/Locale.pm index 0ddcf0451..0b535d740 100644 --- a/SL/Locale.pm +++ b/SL/Locale.pm @@ -85,12 +85,13 @@ sub _init { $self->{charset} = Common::DEFAULT_CHARSET; } - my $db_charset = $main::dbcharset || Common::DEFAULT_CHARSET; + my $db_charset = $main::dbcharset || Common::DEFAULT_CHARSET; - $self->{iconv} = Text::Iconv->new($self->{charset}, $db_charset); - $self->{iconv_reverse} = Text::Iconv->new($db_charset, $self->{charset}); - $self->{iconv_english} = Text::Iconv->new('ASCII', $db_charset); - $self->{iconv_iso8859} = Text::Iconv->new('ISO-8859-15', $db_charset); + $self->{iconv} = Text::Iconv->new($self->{charset}, $db_charset); + $self->{iconv_reverse} = Text::Iconv->new($db_charset, $self->{charset}); + $self->{iconv_english} = Text::Iconv->new('ASCII', $db_charset); + $self->{iconv_iso8859} = Text::Iconv->new('ISO-8859-15', $db_charset); + $self->{iconv_to_iso8859} = Text::Iconv->new($db_charset, 'ISO-8859-15'); $self->_read_special_chars_file($country); } diff --git a/SL/Taxkeys.pm b/SL/Taxkeys.pm new file mode 100644 index 000000000..8d90dcb3c --- /dev/null +++ b/SL/Taxkeys.pm @@ -0,0 +1,120 @@ +package Taxkeys; + +use strict; + +use Memoize; + +use SL::DBUtils; + +sub new { + my $type = shift; + + my $self = {}; + + bless $self, $type; + + return $self->_init(); +} + +sub DESTROY { + my $self = shift; + + $self->_finish_statements(); +} + +sub _init { + my $self = shift; + + $self->{handles} = { }; + $self->{queries} = { }; + + memoize 'get_tax_info'; + memoize 'get_full_tax_info'; + + return $self; +} + +sub _finish_statements { + $main::lxdebug->enter_sub(); + + my $self = shift; + + foreach my $idx (keys %{ $self->{handles} }) { + $self->{handles}->{$idx}->finish(); + delete $self->{handles}->{$idx}; + } + + $main::lxdebug->leave_sub(); +} + +sub get_tax_info { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(transdate taxkey)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + if (!$self->{handles}->{get_tax_info}) { + $self->{queries}->{get_tax_info} = qq| + SELECT t.rate AS taxrate, t.taxnumber, t.taxdescription, t.chart_id AS taxchart_id, + c.accno AS taxaccno, c.description AS taxaccount + FROM taxkeys tk + LEFT JOIN tax t ON (tk.tax_id = t.id) + LEFT JOIN chart c ON (t.chart_id = c.id) + WHERE tk.id = + (SELECT id + FROM taxkeys + WHERE (taxkey_id = ?) + AND (startdate <= ?) + ORDER BY startdate DESC + LIMIT 1) +|; + + $self->{handles}->{get_tax_info} = prepare_query($form, $params{dbh} || $form->get_standard_dbh($myconfig), $self->{queries}->{get_tax_info}); + } + + my $sth = $self->{handles}->{get_tax_info}; + do_statement($form, $sth, $self->{queries}->{get_tax_info}, $params{taxkey}, $params{transdate}); + + my $ref = $sth->fetchrow_hashref() || { }; + + $main::lxdebug->leave_sub(); + + return $ref; +} + +sub get_full_tax_info { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, qw(transdate)); + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my %tax_info = ( + 'taxkeys' => { }, + 'taxchart_ids' => { }, + ); + + my @all_taxkeys = map { $_->{taxkey} } (selectall_hashref_query($form, $form->get_standard_dbh(), qq|SELECT DISTINCT taxkey FROM tax WHERE taxkey IS NOT NULL|)); + + foreach my $taxkey (@all_taxkeys) { + my $ref = $self->get_tax_info('transdate' => $params{transdate}, 'taxkey' => $taxkey); + + $tax_info{taxkeys}->{$taxkey} = $ref; + $tax_info{accnos}->{$ref->{taxchart_id}} = $ref if ($ref->{taxchart_id}); + } + + $main::lxdebug->leave_sub(); + + return %tax_info; +} + +1; diff --git a/SL/Template/Plugin/LxERP.pm b/SL/Template/Plugin/LxERP.pm index d1d93d13c..acb3f4d2e 100644 --- a/SL/Template/Plugin/LxERP.pm +++ b/SL/Template/Plugin/LxERP.pm @@ -90,4 +90,11 @@ sub turn90 { } } +sub abs { + my $self = shift; + my $var = shift; + + return $var < 0 ? $var * -1 : $var; +} + 1; diff --git a/acctranscorrections.pl b/acctranscorrections.pl new file mode 100644 index 000000000..1b089e1f3 --- /dev/null +++ b/acctranscorrections.pl @@ -0,0 +1 @@ +link am.pl \ No newline at end of file diff --git a/bin/mozilla/acctranscorrections.pl b/bin/mozilla/acctranscorrections.pl new file mode 100644 index 000000000..78d21b08b --- /dev/null +++ b/bin/mozilla/acctranscorrections.pl @@ -0,0 +1,215 @@ +use SL::AccTransCorrections; +use SL::Form; +use SL::User; +use Data::Dumper; +use YAML; + +require "bin/mozilla/common.pl"; + +sub analyze_filter { + $lxdebug->enter_sub(); + + $form->{jsscript} = 1; + $form->{title} = $locale->text('General ledger corrections'); + $form->header(); + print $form->parse_html_template('acctranscorrections/analyze_filter'); + + $lxdebug->leave_sub(); +} + +sub analyze { + $lxdebug->enter_sub(); + + $form->{title} = $locale->text('General ledger corrections'); + + delete @{ $form }{qw(transdate_from transdate_to)} if ($form->{scope} eq 'full'); + + my $callback = 'acctranscorrections.pl?action=analyze'; + map { $callback .= "&${_}=" . $form->escape($form->{$_}) } grep { $form->{$_} } qw(transdate_from transdate_to); + $callback = $form->escape($callback); + + my $analyzer = AccTransCorrections->new(); + + my %params = map { $_ => $form->{$_} } qw(transdate_from transdate_to); + my @problems = $analyzer->analyze(%params, 'callback' => $callback); + + if (!scalar @problems) { + $form->show_generic_information($locale->text('No problems were recognized.')); + + $lxdebug->leave_sub(); + return; + } + + $form->header(); + print $form->parse_html_template('acctranscorrections/analyze_overview', + { 'PROBLEMS' => \@problems, + 'callback' => $callback, + }); + + $lxdebug->leave_sub(); +} + +sub assistant { + $lxdebug->enter_sub(); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + + $form->isblank('trans_id', $locale->text('Transaction ID missing.')); + + my $analyzer = AccTransCorrections->new(); + my ($problem) = $analyzer->analyze('trans_id' => $form->{trans_id}, 'full_analysis' => 1); + + if (!$problem) { + my $module = + $form->{trans_module} eq 'ar' ? $locale->text('AR Transaction') + : $form->{trans_module} eq 'ap' ? $locale->text('AP Transaction') + : $locale->text('General Ledger Transaction'); + + $form->show_generic_information($locale->text('The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.', + "$module $form->{trans_reference}")); + + $lxdebug->leave_sub(); + return; + } + + if ($problem->{type} eq 'wrong_taxkeys') { + assistant_for_wrong_taxkeys($problem); + + } elsif ($problem->{type} eq 'wrong_taxes') { + assistant_for_wrong_taxkeys($problem); +# assistant_for_wrong_taxes($problem); + + } else { + $form->show_generic_error($locale->text('Unknown problem type.')); + } + + $lxdebug->leave_sub(); +} + +sub assistant_for_ap_ar_wrong_taxkeys { + $lxdebug->enter_sub(); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + + $form->header(); + print $form->parse_html_template('acctranscorrections/assistant_for_ap_ar_wrong_taxkeys'); + + $lxdebug->leave_sub(); +} + +sub fix_ap_ar_wrong_taxkeys { + $lxdebug->enter_sub(); + + my $analyzer = AccTransCorrections->new(); + $analyzer->fix_ap_ar_wrong_taxkeys(); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + $form->header(); + print $form->parse_html_template('acctranscorrections/fix_ap_ar_wrong_taxkeys'); + + $lxdebug->leave_sub(); +} + +sub assistant_for_invoice_inventory_with_taxkeys { + $lxdebug->enter_sub(); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + + $form->header(); + print $form->parse_html_template('acctranscorrections/assistant_for_invoice_inventory_with_taxkeys'); + + $lxdebug->leave_sub(); +} + +sub fix_invoice_inventory_with_taxkeys { + $lxdebug->enter_sub(); + + my $analyzer = AccTransCorrections->new(); + $analyzer->fix_invoice_inventory_with_taxkeys(); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + $form->header(); + print $form->parse_html_template('acctranscorrections/fix_invoice_inventory_with_taxkeys'); + + $lxdebug->leave_sub(); +} + +sub assistant_for_wrong_taxes { + $lxdebug->enter_sub(); + + my $problem = shift; + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + + $form->header(); + print $form->parse_html_template('acctranscorrections/assistant_for_wrong_taxes', { 'problem' => $problem, }); + + $lxdebug->leave_sub(); +} + +sub assistant_for_wrong_taxkeys { + $lxdebug->enter_sub(); + + my $problem = shift; + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + + $form->header(); + print $form->parse_html_template('acctranscorrections/assistant_for_wrong_taxkeys', { 'problem' => $problem, }); + + $lxdebug->leave_sub(); +} + +sub fix_wrong_taxkeys { + $lxdebug->enter_sub(); + + my $fixes = ref $form->{fixes} eq 'ARRAY' ? $form->{fixes} : []; + + my $analyzer = AccTransCorrections->new(); + $analyzer->fix_wrong_taxkeys('fixes' => $fixes); + + $form->{title} = $locale->text('Assistant for general ledger corrections'); + $form->header(); + print $form->parse_html_template('acctranscorrections/fix_wrong_taxkeys'); + + $lxdebug->leave_sub(); +} + +sub delete_transaction { + $lxdebug->enter_sub(); + + $form->{title} = $locale->text('Delete transaction'); + $form->header(); + + if (!$form->{confirmation}) { + print $form->parse_html_template('acctranscorrections/delete_transaction_confirmation'); + } else { + my $analyzer = AccTransCorrections->new(); + $analyzer->delete_transaction('trans_id' => $form->{trans_id}); + + print $form->parse_html_template('acctranscorrections/delete_transaction'); + } + + $lxdebug->leave_sub(); +} + +sub redirect { + $lxdebug->enter_sub(); + + $form->redirect('Missing callbcak'); + + $lxdebug->leave_sub(); +} + +sub dispatcher { + foreach my $action (qw(fix_wrong_taxkeys delete_transaction)) { + if ($form->{"action_${action}"}) { + call_sub($action); + return; + } + } + + $form->error($locale->text('No action defined.')); +} + +1; diff --git a/image/error.png b/image/error.png new file mode 100644 index 0000000000000000000000000000000000000000..6b990a2f7793a1c3c5ea305f8b716ff98517213a GIT binary patch literal 890 zcmV-=1BLvFP)= z9~4vsDJm9GRx7>;7JbkP+Mu+QmR`~(sVz2HY-G(+bJ?($Y&Py>XU2zUv`s(w-p)C2 zzH>g|HgkDfzt3^qJ_ov7Tyc@>69B6HS zJC;m7>VNSC^pJ_Cr3EXW$EnrU7o{)~akO|0?YHTG%+3Y1NA{1Xi@kk54?O4Hw->uw zMUO_&fHMW54B&e65M`20E^##hxy5;v{#mJl`=ak)tx%fr6Lg;g#w~!pcIQozb5kd zV|Y8-G4>_^SUUU>fuB#{U0MbKpQhmv>CyqwEDJ3+gBS*482AbcFgFixzOi<_@d<)Q zzxgjWR{??}qLhnVcgkg=Q&}QcuF`yIj6f)a_kU!zrs0D_{|E@^8g-|^ib!5nbZxY3 z+hq|!G=-#l(B6G#4SetwcjjO>6XKOX#$gC179UVB& zKC|Ze(EAkYb&B_NQ~Wr?>QolFuZP;6L1vY(;L(re;;|b7Fw#HJ9I+dtEjxB}8ZFVa z2y?j&MKV$;s+Y!CICn1pQ(Nnk(}~#VdX>K)*xi}5tdVd!eYe@&jmXVp*M;ijB&CUo z{OM%kz^}>p=}ab5xe4~=?gv{_wUyTcfxwV)SIYD@H3LvD6|sKLEf?#59Xp?hAD&Lc zu4FQq%7$+Q7#>U@?=)SpVYx2KHYj68q7Z QjQ{`u07*qoM6N<$g2bwzdjJ3c literal 0 HcmV?d00001 diff --git a/image/ok.png b/image/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/locale/de/acctranscorrections b/locale/de/acctranscorrections new file mode 100644 index 000000000..cc8af027a --- /dev/null +++ b/locale/de/acctranscorrections @@ -0,0 +1,191 @@ +#!/usr/bin/perl + +$self->{texts} = { + 'ADDED' => 'Hinzugefügt', + 'AP' => 'Einkauf', + 'AP Transaction' => 'Kreditorenbuchung', + 'AR' => 'Verkauf', + 'AR Transaction' => 'Debitorenbuchung', + 'Address' => 'Adresse', + 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung', + 'All reports' => 'Alle Berichte (Kontenübersicht, Summen- u. Saldenliste, GuV, BWA, Bilanz, Projektbuchungen)', + 'Assistant for general ledger corrections' => 'Assistent für die Korrektur von Hauptbucheinträgen', + 'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.', + 'Bcc' => 'Bcc', + 'Bin List' => 'Lagerliste', + 'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte überprüfen Sie die Angaben in config/authentication.pl.', + 'CANCELED' => 'Storniert', + 'Cc' => 'Cc', + 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')', + 'Confirmation' => 'Auftragsbestätigung', + 'Contact' => 'Kontakt', + 'Create and edit RFQs' => 'Lieferantenanfragen erfassen und bearbeiten', + 'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten', + 'Create and edit dunnings' => 'Mahnungen erfassen und bearbeiten', + 'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten', + 'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten', + 'Create and edit projects' => 'Projekte erfassen und bearbeiten', + 'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten', + 'Create and edit purchase orders' => 'Lieferantenaufträge erfassen und bearbeiten', + 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten', + 'Create and edit sales orders' => 'Auftragsbestätigungen erfassen und bearbeiten', + 'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten', + 'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten', + 'Credit Note' => 'Gutschrift', + 'Customer Number' => 'Kundennummer', + 'Customer details' => 'Kundendetails', + 'DATEV Export' => 'DATEV-Export', + 'DELETED' => 'Gelöscht', + 'DUNNING STARTED' => 'Mahnprozess gestartet', + 'Dataset upgrade' => 'Datenbankaktualisierung', + 'Date' => 'Datum', + 'Delete transaction' => 'Buchung löschen', + 'Delivery Order' => 'Lieferschein', + 'Dependency loop detected:' => 'Schleife in den Abhängigkeiten entdeckt:', + 'Directory' => 'Verzeichnis', + 'ELSE' => 'Zusatz', + 'Enter longdescription' => 'Langtext eingeben', + 'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s', + 'File' => 'Datei', + 'General Ledger Transaction' => 'Dialogbuchung', + 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr', + 'General ledger corrections' => 'Korrekturen im Hauptbuch', + 'History' => 'Historie', + 'Invoice' => 'Rechnung', + 'MAILED' => 'Gesendet', + 'Manage license keys' => 'Lizenzschlüssel verwalten', + 'Mark as paid?' => 'Als bezahlt markieren?', + 'Marked as paid' => 'Als bezahlt markiert', + 'Master Data' => 'Stammdaten', + 'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen', + 'Message' => 'Nachricht', + 'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.', + 'Missing \'tag\' field.' => 'Fehlendes Feld \'tag\'.', + 'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.', + 'Missing parameter (at least one of #1) in call to sub #2.' => 'Fehlernder Parameter (mindestens einer aus \'#1\') in Funktionsaufruf \'#2\'.', + 'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.', + 'Name' => 'Name', + 'No %s was found matching the search parameters.' => 'Es wurde kein %s gefunden, auf den die Suchparameter zutreffen.', + 'No Customer was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Endkunde gefunden', + 'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden', + 'No action defined.' => 'Keine Aktion definiert.', + 'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.', + 'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.', + 'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.', + 'No problems were recognized.' => 'Es wurden keine Probleme gefunden.', + 'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.', + 'Others' => 'Andere', + 'PAYMENT POSTED' => 'Rechung gebucht', + 'POSTED' => 'Gebucht', + 'POSTED AS NEW' => 'Als neu gebucht', + 'PRINTED' => 'Gedruckt', + 'Packing List' => 'Lieferschein', + 'Part Number' => 'Artikelnummer', + 'Part description' => 'Artikelbeschreibung', + 'Pick List' => 'Packliste', + 'Please enter values' => 'Bitte Werte eingeben', + 'Preview' => 'Druckvorschau', + 'Proforma Invoice' => 'Proformarechnung', + 'Purchase Order' => 'Lieferantenauftrag', + 'Quotation' => 'Angebot', + 'RFQ' => 'Anfrage', + 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich', + 'Reports' => 'Berichte', + 'SAVED' => 'Gespeichert', + 'SAVED FOR DUNNING' => 'Gespeichert', + 'SCREENED' => 'Angezeigt', + 'Select a Customer' => 'Endkunde auswählen', + 'Select a customer' => 'Einen Kunden auswählen', + 'Select a part' => 'Artikel auswählen', + 'Select a vendor' => 'Einen Lieferanten auswählen', + 'Storno Invoice' => 'Stornorechnung', + 'Storno Packing List' => 'Stornolieferschein', + 'Subject' => 'Betreff', + 'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.', + 'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte überprüfen Sie die Angaben in config/authentication.pl.', + 'The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.' => 'Der Korrekturassistent konnte kein Problem bei #1 feststellen. Eventuell wurde das Problem in der Zwischenzeit bereits behoben.', + 'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ungütigen Perl-Code:', + 'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.', + 'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => 'Die Verbindung zum LDAP-Server kann nicht verschlüsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprüfen Sie die Angaben in config/authentication.pl.', + 'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:', + 'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:', + 'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:', + 'To (email)' => 'An', + 'Transaction ID missing.' => 'Die Buchungs-ID fehlt.', + 'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen', + 'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.', + 'Unit' => 'Einheit', + 'Unknown dependency \'%s\'.' => 'Unbekannte Abhängigkeit \'%s\'.', + 'Unknown problem type.' => 'Unbekannter Problem-Typ', + 'Value' => 'Wert', + 'Variable' => 'Variable', + 'Vendor details' => 'Lieferantendetails', + 'View warehouse content' => 'Lagerbestand ansehen', + 'Warehouse management' => 'Lagerverwaltung/Bestandsveränderung', + 'You do not have the permissions to access this function.' => 'Sie verfügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.', + '[email]' => '[email]', + 'bin_list' => 'Lagerliste', + 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.', + 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlüssel "LDAP_config" fehlt.', + 'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Benötigte Parameter sind "host", "db" und "user".', + 'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Benötigt werden "host", "attribute" und "base_dn".', + 'customer' => 'Kunde', + 'invoice' => 'Rechnung', + 'no' => 'nein', + 'packing_list' => 'Versandliste', + 'pick_list' => 'Entnahmeliste', + 'proforma' => 'Proforma', + 'purchase_order' => 'Auftrag', + 'request_quotation' => 'Angebotsanforderung', + 'sales_order' => 'Kundenauftrag', + 'sales_quotation' => 'Verkaufsangebot', + 'vendor' => 'Lieferant', + 'yes' => 'ja', +}; + +$self->{subs} = { + 'E' => 'E', + 'H' => 'H', + 'J' => 'J', + 'NTI' => 'NTI', + 'Q' => 'Q', + 'analyze' => 'analyze', + 'analyze_filter' => 'analyze_filter', + 'assistant' => 'assistant', + 'assistant_for_ap_ar_wrong_taxkeys' => 'assistant_for_ap_ar_wrong_taxkeys', + 'assistant_for_invoice_inventory_with_taxkeys' => 'assistant_for_invoice_inventory_with_taxkeys', + 'assistant_for_wrong_taxes' => 'assistant_for_wrong_taxes', + 'assistant_for_wrong_taxkeys' => 'assistant_for_wrong_taxkeys', + 'build_std_url' => 'build_std_url', + 'calculate_qty' => 'calculate_qty', + 'call_sub' => 'call_sub', + 'cov_selection_internal' => 'cov_selection_internal', + 'delete_transaction' => 'delete_transaction', + 'delivery_customer_selection' => 'delivery_customer_selection', + 'dispatcher' => 'dispatcher', + 'fix_ap_ar_wrong_taxkeys' => 'fix_ap_ar_wrong_taxkeys', + 'fix_invoice_inventory_with_taxkeys' => 'fix_invoice_inventory_with_taxkeys', + 'fix_wrong_taxkeys' => 'fix_wrong_taxkeys', + 'format_dates' => 'format_dates', + 'mark_as_paid_common' => 'mark_as_paid_common', + 'part_selection_internal' => 'part_selection_internal', + 'redirect' => 'redirect', + 'reformat_numbers' => 'reformat_numbers', + 'retrieve_partunits' => 'retrieve_partunits', + 'select_part' => 'select_part', + 'select_part_internal' => 'select_part_internal', + 'set_longdescription' => 'set_longdescription', + 'show_history' => 'show_history', + 'show_vc_details' => 'show_vc_details', + 'vendor_selection' => 'vendor_selection', + 'weiter' => 'continue', + 'buchung_löschen' => 'delete_transaction', + 'buchung_korrigieren' => 'fix_transaction', + 'buchungen_korrigieren' => 'fix_transactions', + 'neue_ware' => 'new_part', + 'analyse_wiederholen' => 're_run_analysis', + 'analyse_beginnen' => 'start_analysis', + 'ja' => 'yes', +}; + +1; diff --git a/locale/de/all b/locale/de/all index fc24ccf36..47f6f3572 100644 --- a/locale/de/all +++ b/locale/de/all @@ -22,6 +22,7 @@ $self->{texts} = { '<%total%> -- Amount payable' => '<%total%> -- Noch zu bezahlender Betrag', '<%total_wo_skonto%> -- Amount payable less discount' => '<%total_wo_skonto%> -- Noch zu bezahlender Betrag abzüglich Skonto', '*/' => '*/', + '---please select---' => '---bitte auswählen---', '...after loggin in' => '...nach dem Anmelden', '...done' => '...fertig', '...on the TODO list' => '...auf der Aufgabenliste', @@ -45,6 +46,7 @@ $self->{texts} = { 'AP Transaction Storno (one letter abbreviation)' => 'S', 'AP Transaction with Storno (abbreviation)' => 'K(S)', 'AP Transactions' => 'Kreditorenbuchungen', + 'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => 'Kreditorenbuchungen mit Umsatzsteuer-Steuerschlüsseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschlüsseln', 'AR' => 'Verkauf', 'AR Aging' => 'Offene Forderungen', 'AR Transaction' => 'Debitorenbuchung', @@ -158,6 +160,7 @@ $self->{texts} = { 'All Datasets up to date!' => 'Alle Datenbanken sind auf aktuellem Stand.', 'All changes in that file have been reverted.' => 'Alle Änderungen in dieser Datei wurden rückgängig gemacht.', 'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.', + 'All general ledger entries' => 'Alle Hauptbucheinträge', 'All reports' => 'Alle Berichte (Kontenübersicht, Summen- u. Saldenliste, GuV, BWA, Bilanz, Projektbuchungen)', 'Allow access' => 'Zugriff erlauben', 'Allow the following users access to my follow-ups:' => 'Erlaube den folgenden Benutzern Zugriff auf meine Wiedervorlagen:', @@ -194,10 +197,12 @@ $self->{texts} = { 'Assets' => 'Aktiva', 'Assign new units' => 'Neue Einheiten zuweisen', 'Assign units' => 'Einheiten zuweisen', + 'Assistant for general ledger corrections' => 'Assistent für die Korrektur von Hauptbucheinträgen', 'Assume Tax Consultant Data in Tax Computation?' => 'Beraterdaten in UStVA übernehmen?', 'At least' => 'Mindestens', 'At least one Perl module that Lx-Office ERP requires for running is not installed on your system.' => 'Mindestes ein Perl-Modul, das Lx-Office ERP zur Ausführung benötigt, ist auf Ihrem System nicht installiert.', 'At most' => 'Höchstens', + 'At the moment the transaction looks like this:' => 'Aktuell sieht die Buchung wie folgt aus:', 'Attach PDF:' => 'PDF anhängen', 'Attachment' => 'als Anhang', 'Attachment name' => 'Name des Anhangs', @@ -359,6 +364,8 @@ $self->{texts} = { 'Continue' => 'Weiter', 'Contra' => 'gegen', 'Copies' => 'Kopien', + 'Correct taxkey' => 'Richtiger Steuerschlüssel', + 'Corrections' => 'Korrekturen', 'Cost Center' => 'Kostenstelle', 'Costs' => 'Kosten', 'Could not copy %s to %s. Reason: %s' => 'Die Datei "%s" konnte nicht nach "%s" kopiert werden. Grund: %s', @@ -482,6 +489,7 @@ $self->{texts} = { 'Delete delivery order' => 'Lieferschein löschen', 'Delete drafts' => 'Entwürfe löschen', 'Delete group' => 'Gruppe löschen', + 'Delete transaction' => 'Buchung löschen', 'Delivered' => 'Geliefert', 'Delivery Date' => 'Lieferdatum', 'Delivery Order' => 'Lieferschein', @@ -512,6 +520,9 @@ $self->{texts} = { 'Display' => 'Anzeigen', 'Display file' => 'Datei anzeigen', 'Display options' => 'Anzeigeoptionen', + 'Do you really want to delete AP transaction #1?' => 'Wollen Sie wirklich die Kreditorenbuchung #1 löschen?', + 'Do you really want to delete AR transaction #1?' => 'Wollen Sie wirklich die Debitorenbuchung #1 löschen?', + 'Do you really want to delete GL transaction #1?' => 'Wollen Sie wirklich die Dialogbuchung #1 löschen?', 'Do you really want to delete this group:' => 'Wollen Sie wirklich diese Gruppe löschen:', 'Do you really want to delete this warehouse?' => 'Wollen Sie dieses Lager wirklich löschen?', 'Do you want Lx-Office to create a group for access to all functions?' => 'Wollen Sie, dass Lx-Office eine Gruppe mit Zugriff auf alle Funktionen anlegt?', @@ -561,6 +572,7 @@ $self->{texts} = { 'EU without VAT ID' => 'EU ohne UstId-Nummer', 'EUER' => 'Einnahmen-/Überschussrechnung', 'EUR' => 'E/Ü-Rechnung', + 'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => 'Frühere Versionen von Lx-Office enthielten Bugs, die zu falschen Einträgen im Hauptbuch geführt haben können.', 'Edit' => 'Bearbeiten', 'Edit ' => 'Bearbeiten', 'Edit Access Rights' => 'Zugriffsrechte bearbeiten', @@ -647,6 +659,7 @@ $self->{texts} = { 'Existing Buchungsgruppen' => 'Existierende Buchungsgruppen', 'Existing Datasets' => 'existierende Datenbanken', 'Existing pending follow-ups for this item' => 'Noch nicht erledigte Wiedervorlagen für dieses Dokument', + 'Expected Tax' => 'Erwartete Steuern', 'Expense' => 'Aufwandskonto', 'Expense Account' => 'Aufwandskonto', 'Expense accno' => 'Aufwandskonto', @@ -674,6 +687,8 @@ $self->{texts} = { 'Files created by Lx-Office\'s "Backup Dataset" function are such files.' => 'Dateien, die von Lx-Office\' Funktion "Datenbank sichern" erstellt wurden, erfüllen diese Kriterien.', 'Filter' => 'Filter', 'Finish' => 'Abschließen', + 'Fix transaction' => 'Buchung korrigieren', + 'Fix transactions' => 'Buchungen korrigieren', 'Folgekonto' => 'Folgekonto', 'Follow-Up' => 'Wiedervorlage', 'Follow-Up Date' => 'Wiedervorlagedatum', @@ -686,6 +701,8 @@ $self->{texts} = { 'Follow-up for' => 'Wiedervorlage für', 'Font' => 'Schriftart', 'Font size' => 'Schriftgröße', + 'For AP transactions it will replace the sales taxkeys with input taxkeys with the same tax rate.' => 'Bei Kreditorenbuchungen werden die Umsatzsteuer-Steuerschlüssel durch Vorsteuer-Steuerschlüssel mit demselben Steuersatz ersetzt.', + 'For AR transactions it will replace the input taxkeys with sales taxkeys with the same tax rate.' => 'Bei Debitorenbuchungen werden die Vorsteuer-Steuerschlüssel durch Umsatzsteuer-Steuerschlüssel mit demselben Steuersatz ersetzt.', 'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the "smaller" one. A factor may not be less than 1. Therefore you may define "kg" with the base unit "g" and a factor of "1", but not the other way round.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit auswählen, dann müssen Sie auch einen Faktor eingeben. Sie müssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von "kg" mit der Basiseinheit "g" und dem Faktor 1000 zulässig, die Definition von "g" mit der Basiseinheit "kg" und dem Faktor "0,001" hingegen nicht.', 'Foreign Exchange Gain' => 'Wechselkurserträge', 'Foreign Exchange Loss' => 'Wechselkursaufwendungen', @@ -703,7 +720,10 @@ $self->{texts} = { 'GL Transaction' => 'Dialogbuchung', 'Gegenkonto' => 'Gegenkonto', 'General Ledger' => 'Finanzbuchhaltung', + 'General Ledger Corrections' => 'Korrekturen im Hauptbuch', + 'General Ledger Transaction' => 'Dialogbuchung', 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr', + 'General ledger corrections' => 'Korrekturen im Hauptbuch', 'Generic Tax Report' => 'USTVA Bericht', 'Given Name' => 'Vorname', 'Greeting' => 'Anrede', @@ -747,6 +767,7 @@ $self->{texts} = { 'Image' => 'Grafik', 'Import CSV' => 'CSV-Import', 'In Lx-Office 2.4.0 the administrator has to enter a list of units in the administrative section.' => 'In Lx-Office 2.4.0 muss der Administrator in den Systemeinstellungen eine Liste von verwendbaren Einheiten angeben.', + 'In order to do that hit the button "Delete transaction".' => 'Drücken Sie dafür auf den Button "Buchung löschen".', 'In the latter case the tables needed by Lx-Office will be created in that database.' => 'In letzterem Fall werden die von Lx-Office benötigten Tabellen in dieser existierenden Datenbank angelegt.', 'In-line' => 'im Text', 'Inactive' => 'Inaktiv', @@ -798,9 +819,11 @@ $self->{texts} = { 'Invoice with Storno (abbreviation)' => 'R(S)', 'Invoices' => 'Rechnungen', 'Is this a summary account to record' => 'Buchungskonto in', + 'It is possible that even after such a correction there is something wrong with this transaction (e.g. taxes that don\'t match the selected taxkey). Therefore you should re-run the general ledger analysis.' => 'Auch nach einer Korrektur kann es mit dieser Buchung noch weitere Probleme geben (z.B. nicht zum Steuerschlüssel passende Steuern), weshalb ein erneutes Ausführen der Hauptbuchanalyse empfohlen wird.', 'It is possible to do this automatically for some Buchungsgruppen, but not for all.' => 'Es ist möglich, dies für einige, aber nicht für alle Buchungsgruppen automatisch zu erledigen.', 'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => 'Das ist für einige Einheiten automatisch möglich, aber bei anderen muss der Benutzer die neue Einheit auswählen.', 'It may optionally be compressed with "gzip".' => 'Sie darf optional mit "gzip" komprimiert sein.', + 'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf 0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.', 'Item deleted!' => 'Artikel gelöscht!', 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!', 'Jahresverkehrszahlen neu' => 'Jahresverkehrszahlen neu', @@ -884,7 +907,9 @@ $self->{texts} = { 'Long Dates' => 'Lange Monatsnamen', 'Long Description' => 'Langtext', 'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => 'Lx-Office 2.4.0 führt zwei neue Konzepte ein: Steuerzonen und Buchungsgruppen.', + 'Lx-Office can fix these problems automatically.' => 'Lx-Office kann solche Probleme automatisch beheben.', 'Lx-Office has been switched to group-based access restrictions.' => 'Lx-Office wurde auf eine gruppenbasierte Benutzerzugriffsverwaltung umgestellt.', + 'Lx-Office has found one or more problems in the general ledger.' => 'Lx-Office hat ein oder mehrere Probleme im Hauptbuch gefunden.', 'Lx-Office is about to update the database [% HTML.escape(dbname) %]. You should create a backup of the database before proceeding because the backup might not be reversible.' => 'Lx-Office wird gleich die Datenbank [% HTML.escape(dbname) %] aktualisieren. Sie sollten eine Sicherungskopie der Datenbank erstellen, bevor Sie fortfahren, da die Aktualisierung unter Umständen nicht umkehrbar ist.', 'Lx-Office is now able to manage warehouses instead of just tracking the amount of goods in your system.' => 'Lx-Office enthält jetzt auch echte Lagerverwaultung anstatt reiner Mengenzählung.', 'Lx-Office website' => 'Lx-Office-Webseite', @@ -971,6 +996,7 @@ $self->{texts} = { 'No licenses were found that match the search criteria.' => 'Es wurden keine Lizenzen gefunden, auf die die Suchkriterien zutreffen.', 'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.', 'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.', + 'No problems were recognized.' => 'Es wurden keine Probleme gefunden.', 'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.', 'No user has been selected.' => 'Es wurde kein Benutzer ausgewählt.', 'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.', @@ -1073,6 +1099,8 @@ $self->{texts} = { 'Payment terms deleted!' => 'Zahlungskonditionen gelöscht!', 'Payments' => 'Zahlungsausgänge', 'Period' => 'Zeitraum', + 'Period:' => 'Zeitraum:', + 'Periodicity' => 'Periodizität', 'Personal settings' => 'Persönliche Einstellungen', 'Pg Database Administration' => 'Datenbankadministration', 'Phone' => 'Telefon', @@ -1091,6 +1119,7 @@ $self->{texts} = { 'Please insert your language values below' => 'Bitte die Übersetzungen unten eintragen', 'Please insert your longdescription below' => 'Bitte den Langtext eingeben', 'Please install the below listed modules or ask your system administrator to.' => 'Bitte installieren Sie die unten aufgeführten Module, oder bitten Sie Ihren Administrator darum.', + 'Please re-run the analysis for broken general ledger entries by clicking this button:' => 'Bitte wiederholen Sie die Analyse der Hauptbucheinträge, indem Sie auf diesen Button klicken:', 'Please select a customer from the list below.' => 'Bitte einen Endkunden aus der Liste auswählen', 'Please select a part from the list below.' => 'Bitte wählen Sie einen Artikel aus der Liste aus.', 'Please select a vendor from the list below.' => 'Bitte einen Händler aus der Liste auswählen', @@ -1143,6 +1172,7 @@ $self->{texts} = { 'Private Phone' => 'Privates Tel.', 'Produce Assembly' => 'Erzeugnis fertigen', 'Productivity' => 'Produktivität', + 'Problem' => 'Problem', 'Profit Center' => 'Erfolgsbereich', 'Proforma Invoice' => 'Proformarechnung', 'Programm' => 'Programm', @@ -1159,6 +1189,7 @@ $self->{texts} = { 'Prozentual/Absolut' => 'Prozentual/Absolut', 'Purchase Order' => 'Lieferantenauftrag', 'Purchase Orders' => 'Lieferantenaufträge', + 'Purchase invoices' => 'Einkaufsrechnungen', 'Qty' => 'Menge', 'Qty according to delivery order' => 'Menge laut Lieferschein', 'Qty in stock' => 'Lagerbestand', @@ -1183,6 +1214,7 @@ $self->{texts} = { 'ROP' => 'Mindestlagerbestand', 'Ranges of numbers' => 'Nummernkreise', 'Ranges of numbers and default accounts' => 'Nummernkreise und Standardkonten', + 'Re-run analysis' => 'Analyse wiederholen', 'Receipt' => 'Zahlungseingang', 'Receipt posted!' => 'Beleg gebucht!', 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich', @@ -1191,6 +1223,8 @@ $self->{texts} = { 'Rechnungsnummer' => 'Rechnungsnummer', 'Reconciliation' => 'Kontenabgleich', 'Record in' => 'Buchen auf', + 'Recorded Tax' => 'Gespeicherte Steuern', + 'Recorded taxkey' => 'Gespeicherter Steuerschlüssel', 'Reference' => 'Referenz', 'Reference missing!' => 'Referenz fehlt!', 'Release From Stock' => 'Lagerausgang', @@ -1234,7 +1268,10 @@ $self->{texts} = { 'Sales Invoices' => 'Kundenrechnung', 'Sales Order' => 'Kundenauftrag', 'Sales Orders' => 'Aufträge', + 'Sales and purchase invoices with inventory transactions with taxkeys' => 'Einkaufs- und Verkaufsrechnungen mit Warenbestandsbuchungen mit Steuerschlüsseln', + 'Sales invoice' => 'Verkaufsrechnung', 'Sales invoice number' => 'Ausgangsrechnungsnummer', + 'Sales invoices' => 'Verkaufsrechnungen', 'Sales quotation' => 'Angebot', 'Salesman' => 'Verkäufer/in', 'Salesperson' => 'Verkäufer', @@ -1318,10 +1355,14 @@ $self->{texts} = { 'Skonto' => 'Skonto', 'Skonto Terms' => 'Zahlungsziel Skonto', 'Sold' => 'Verkauft', + 'Solution' => 'Lösung', 'Source' => 'Beleg', 'Source bin' => 'Quelllagerplatz', 'Spoolfile' => 'Druckdatei', 'Start Dunning Process' => 'Mahnprozess starten', + 'Start analysis' => 'Analyse beginnen', + 'Start date' => 'Startdatum', + 'Start the correction assistant' => 'Korrekturassistenten starten', 'Startdate_coa' => 'Gültig ab', 'Starting Balance' => 'Eröffnungsbilanzwerte', 'Statement' => 'Sammelrechnung', @@ -1344,6 +1385,7 @@ $self->{texts} = { 'Subject' => 'Betreff', 'Subject:' => 'Betreff:', 'Subtotal' => 'Zwischensumme', + 'Such entries cannot be exported into the DATEV format and have to be fixed as well.' => 'Solche Einträge sind aber nicht DATEV-exportiertbar und müssen ebenfalls korrigiert werden.', 'Sum Credit' => 'Summe Haben', 'Sum Debit' => 'Summe Soll', 'Sum for' => 'Summe für', @@ -1400,9 +1442,13 @@ $self->{texts} = { 'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => 'Textzeilen: \'MAXLENGTH=n\' setzt eine Maximallänge von n Zeichen.', 'Text, text field and number variables: The default value will be used as-is.' => 'Textzeilen, Textfelder und Zahlenvariablen: Der Standardwert wird so wie er ist übernommen.', 'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.', + 'The AP transaction #1 has been deleted.' => 'Die Kreditorenbuchung #1 wurde gelöscht.', + 'The AR transaction #1 has been deleted.' => 'Die Debitorenbuchung #1 wurde gelöscht.', + 'The GL transaction #1 has been deleted.' => 'Die Dialogbuchung #1 wurde gelöscht.', 'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte überprüfen Sie die Angaben in config/authentication.pl.', 'The access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.', 'The assembly has been created.' => 'Das Erzeugnis wurde hergestellt.', + 'The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.' => 'Der Korrekturassistent konnte kein Problem bei #1 feststellen. Eventuell wurde das Problem in der Zwischenzeit bereits behoben.', 'The authentication configuration file "config/authentication.pl" does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei für die Authentifizierung "config/authentication.pl" wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollständig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.', 'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => 'Die Authentifizierungsdatenbank kann momentan nicht erreicht werden. Entweder wurde sie noch nicht eingerichtet, oder der Datenbankserver antwortet nicht. Bitte wenden Sie sich an Ihren Administrator.', 'The available options depend on the varibale type:' => 'Die verfügbaren Optionen hängen vom Variablentypen ab:', @@ -1441,10 +1487,13 @@ $self->{texts} = { 'The email address is missing.' => 'Die Emailadresse fehlt.', 'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.', 'The factor is missing.' => 'Der Faktor fehlt.', + 'The first reason is that Lx-Office contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => 'Zum Einen gab es einen Bug in Lx-Office, der dazu führte, dass bei Buchungen mit verschiedenen Steuerschlüssel auf ein Konto teilweise falsche Steuerschlüssel gespeichert wurden.', 'The follow-up date is missing.' => 'Das Wiedervorlagedatum fehlt.', 'The following Buchungsgruppen have already been created:' => 'Die folgenden Buchungsgruppen wurden bereits angelegt:', 'The following Datasets need to be updated' => 'Folgende Datenbanken müssen aktualisiert werden', 'The following drafts have been saved and can be loaded.' => 'Die folgenden Entwürfe wurden gespeichert und können geladen werden.', + 'The following transaction contains wrong taxes:' => 'Die folgende Buchung enthält falsche Steuern:', + 'The following transaction contains wrong taxkeys:' => 'Die folgende Buchung enthält falsche Steuerschlüssel:', 'The following units are unknown.' => 'Die folgenden Einheiten sind unbekannt.', 'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:', 'The following users have been migrated into the authentication database:' => 'Die folgenden Benutzer wurden in die Authentifizierungsdatenbank migriert:', @@ -1477,6 +1526,7 @@ $self->{texts} = { 'The project has been saved.' => 'Das Projekt wurde gespeichert.', 'The restoration process has started. Here\'s the output of the "pg_restore" command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des "pg_restore"-Programmes:', 'The restoration process is complete. Please review "pg_restore"\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von "pg_restore" an, um festzustellen, ob die Wiederherstellung erfolgreich war.', + 'The second reason is that Lx-Office allowed the user to enter the tax amount manually regardless of the taxkey used.' => 'Zum Anderen war es möglich, die Steuern unabhängig vom ausgewählten Steuerschlüssel selber einzugeben.', 'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => 'Die zweite Variante besteht darin, Perls CPAN-Modul zu benutzen und es das Modul für Sie installieren zu lassen.', 'The selected PostgreSQL installation uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => 'Der ausgewählte PostgreSQL-Installation benutzt UTF-8 als Zeichensatz. Deshalb müssen Sie Lx-Office so konfigurieren, dass es ebenfalls UTF-8 als Zeichensatz benutzt.', 'The selected bin does not exist.' => 'Der ausgewählte Lagerplatz existiert nicht.', @@ -1488,6 +1538,7 @@ $self->{texts} = { 'The tables for user management and authentication do not exist. They will be created in the next step in the following database:' => 'Die Tabellen zum Speichern der Benutzerdaten und zur Benutzerauthentifizierung wurden nicht gefunden. Sie werden in der folgenden Datenbank angelegt:', 'The tabulator character' => 'Das Tabulator-Symbol', 'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => 'Die dritte Variante besteht darin, das Paket von der oben genannten URL herunterzuladen und es manuell zu installieren. Beachten Sie dabei die im Paket enthaltenen Installationsanweisungen.', + 'The transaction is shown below in its current state.' => 'Nachfolgend wird angezeigt, wie die Buchung momentan aussieht.', 'The unit has been saved.' => 'Die Einheit wurde gespeichert.', 'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gelöscht worden.', 'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr geändert werden.', @@ -1500,27 +1551,38 @@ $self->{texts} = { 'The warehouse could not be deleted because it has already been used.' => 'Das Lager konnte nicht gelöscht werden, da es bereits in Benutzung war.', 'The warehouse does not contain any bins.' => 'Das Lager enthält keine Lagerplätze.', 'The warehouse or the bin is missing.' => 'Das Lager oder der Lagerplatz fehlen.', + 'The wrong taxkeys for AP and AR transactions have been fixed.' => 'Die Probleme mit falschen Steuerschlüssel bei Kreditoren- und Debitorenbuchungen wurden behoben.', + 'The wrong taxkeys for inventory transactions for sales and purchase invoices have been fixed.' => 'Die falschen Steuerschlüssel für Warenbestandsbuchungen bei Einkaufs- und Verkaufsrechnungen wurden behoben.', + 'The wrong taxkeys have been fixed.' => 'Die Steuerschlüssel wurden nach Ihrer Auswahl korrigiert.', 'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 fällig ist/sind.', 'There are four tax zones.' => 'Es gibt vier Steuerzonen.', 'There are no items in stock.' => 'Dieser Artikel ist nicht eingelagert.', 'There are no items on your TODO list at the moment.' => 'Ihre Aufgabenliste enthält momentan keine Einträge.', 'There are still entries in the database for which no unit has been assigned.' => 'Es gibt noch Einträge in der Datenbank, für die keine Einheit zugeordnet ist.', 'There are usually three ways to install Perl modules.' => 'Es gibt normalerweise drei Arten, ein Perlmodul zu installieren.', + 'There is at least one sales or purchase invoice for which Lx-Office recorded an inventory transaction with taxkeys even though no tax was recorded.' => 'Es gibt mindestens eine Einkaufs- oder Verkaufsrechnung, für die Lx-Office einen Steuerschlüssel ungleich 0 verzeichnet hat, obwohl für Warenbestandsbuchugen bei Rechnungen nie Steuern gebucht werden.', + 'There is at least one transaction for which the user has chosen a logically wrong taxkey.' => 'Es gibt mindestens eine Buchung, bei der ein logisch nicht passender Steuerschlüssel ausgewählt wurde.', 'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, for the transfer of #5.' => 'Von \'#1\' ist in Lager \'#2\', Lagerplatz \'#3\', #4, nicht genügend eingelagert, um insgesamt #5 auszulagern.', 'There is not enough left of \'#1\' in bin \'#2\' for the removal of #3.' => 'In Lagerplatz \'#2\' ist nicht genug von \'#1\' vorhanden, um #3 zu entnehmen.', 'There is nothing to do in this step.' => 'In diesem Schritt gibt es nichts mehr zu tun.', 'Therefore there\'s no need to create the same article more than once if it is sold or bought in/from another tax zone.' => 'Deswegen muss man den gleichen Artikel nicht mehr mehrmals anlegen, wenn er in verschiedenen Steuerzonen gehandelt werden soll.', 'These units can be based on other units so that Lx-Office can convert prices when the user switches from one unit to another.' => 'Diese Einheiten können auf anderen Einheiten basieren, sodass Lx-Office Preise umrechnen kann, wenn der Benutzer von einer Einheit zu einer anderen Wechselt.', 'These will only be effective if the account is NOT a summary account AND there exists at least one taxkey. Setting the account as a summary account will erase these settings.' => 'Dieser Block ist nur dann gültig, wenn das Konto KEIN Bucungskonto ist, und wenn ein gültiger Steuerschlüssel für das Konto existiert. Wird das Konto als Buchungskonto markiert, werden diese Einstellungen entfernt.', + 'These wrong entries cannot be fixed automatically.' => 'Diese Einträge können nicht automatisch bereinigt werden.', 'This corresponds to Lx-Office\'s behavior prior to version 2.4.4.' => 'Dieses entspricht dem Verhalten von Lx-Office vor Version 2.4.4.', + 'This could have happened for two reasons:' => 'Dies kann aus zwei Gründen geschehen sein:', 'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.', 'This group will be called "Full Access".' => 'Diese Gruppe wird "Vollzugriff" genannt.', 'This installation uses an unknown chart of accounts ("[% HTML.escape(coa) %]"). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen ("[% HTML.escape(coa) %]"). Dieses Datenbankupgrade kann die Standardbuchungsgruppen nicht automatisch anlegen.', 'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'In diesem Schritt werden bestehende Datenbanken gesucht. Es werden noch keine Änderungen vorgenommen!', + 'This means that the user has created an AP transaction and chosen a taxkey for sales taxes, or that he has created an AR transaction and chosen a taxkey for input taxes.' => 'Das bedeutet, dass ein Benutzer eine Kreditorenbuchung angelegt und in ihr einen Umsatzsteuer-Steuerschlüssel verwendet oder eine Debitorenbuchung mit Vorsteuer-Steuerschlüssel angelegt hat.', + 'This module can help you identify and correct such entries by analyzing the general ledger and presenting you likely solutions but also allowing you to fix problems yourself.' => 'Dieses Modul kann Ihnen helfen, problematische Einträge im Hauptbuch zu identifizieren und teilweise zu beheben. Dabei werden je nach Problem mögliche Lösungen aufgezeigt, wobei Sie die entscheiden können, welche Probleme automatisch gelöst werden sollen.', + 'This transaction has to be split into several transactions manually.' => 'Diese Buchung muss manuell in mehrere Buchungen aufgeteilt werden.', 'This update will change the nature the onhand of goods is tracked.' => 'Dieses update ändert die Art und Weise wie Lagermengen gezält werden.', 'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.', 'This upgrade script tries to map all existing units in the database to the newly created units.' => 'Dieses Update-Script versucht, alle bestehenden Einheiten automatisch in die neuen Einheiten umzuwandeln.', 'This vendor number is already in use.' => 'Diese Lieferantennummer wird bereits verwendet.', + 'Time period for the analysis:' => 'Analysezeitraum:', 'Timestamp' => 'Uhrzeit', 'Title' => 'Titel', 'To' => 'An', @@ -1542,11 +1604,14 @@ $self->{texts} = { 'Trade Discount' => 'Rabatt', 'Trans Id' => 'Trans-ID', 'Trans Type' => 'Transfertyp', + 'Transaction' => 'Buchung', 'Transaction %d cancelled.' => 'Buchung %d erfolgreich storniert.', 'Transaction Date missing!' => 'Buchungsdatum fehlt!', + 'Transaction ID missing.' => 'Die Buchungs-ID fehlt.', 'Transaction deleted!' => 'Buchung gelöscht!', 'Transaction description' => 'Vorgangsbezeichnung', 'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.', + 'Transaction has been split on both the credit and the debit side' => 'Sowohl auf der Soll- als auch auf der Haben-Seite gesplittete Buchung', 'Transaction posted!' => 'Buchung verbucht!', 'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen', 'Transfer' => 'Umlagern', @@ -1586,6 +1651,7 @@ $self->{texts} = { 'Unknown Link' => 'Unbekannte Verknüpfung', 'Unknown chart of accounts' => 'Unbekannter Kontenrahmen', 'Unknown dependency \'%s\'.' => 'Unbekannte Abhängigkeit \'%s\'.', + 'Unknown problem type.' => 'Unbekannter Problem-Typ', 'Unlock System' => 'System entsperren', 'Until' => 'Bis', 'Update' => 'Erneuern', @@ -1652,6 +1718,8 @@ $self->{texts} = { 'Workflow sales_quotation' => 'Workflow Angebot', 'Wrong Period' => 'Falscher Zeitraum', 'Wrong date format!' => 'Falsches Datumsformat!', + 'Wrong tax keys recorded' => 'Gespeicherte Steuerschlüssel sind falsch', + 'Wrong taxes recorded' => 'Gespeicherte Steuern passen nicht zum Steuerschlüssel', 'YYYY' => 'JJJJ', 'Year' => 'Jahr', 'Year End' => 'Jahresende', @@ -1662,6 +1730,8 @@ $self->{texts} = { 'Yes/No (Checkbox)' => 'Ja/Nein (Checkbox)', 'You are logged out!' => 'Auf Wiedersehen!', 'You can also create new units now.' => 'Sie können jetzt auch neue Einheiten anlegen.', + 'You can also delete this transaction and re-enter it manually.' => 'Alternativ können Sie die Buchung auch mit löschen lassen und sie anschließend neu eingeben.', + 'You can correct this transaction by chosing the correct taxkeys from the drop down boxes and hitting the button "Fix transaction" afterwards.' => 'Sie haben die Möglichkeit, die Buchung zu korrigieren, indem Sie in den Drop-Down-Boxen die richtigen Steuerschlüssel auswählen und anschließend auf den Button "Buchung korrigieren" drücken.', 'You can create a missing dataset by going back and chosing "Create Dataset".' => 'Sie können eine fehlende Datenbank erstellen, indem Sie jetzt zuück gehen und den Punkt "Datenbank anlegen" wählen.', 'You can create warehouses and bins via the menu "System -> Warehouses".' => 'Sie können Lager und Lagerplätze über das Menü "System -> Lager" anlegen.', 'You can declare different translations for singular and plural for each unit (e.g. "day" and "days).' => 'Bei den Übersetzungen können Sie unterschiedliche Varianten für singular und plural angeben (z.B. "day" und "days").', @@ -1696,6 +1766,7 @@ $self->{texts} = { '[email]' => '[email]', 'account_description' => 'Beschreibung', 'accrual' => 'Bilanzierung (Soll-Versteuerung)', + 'all entries' => 'alle Einträge', 'ap_aging_list' => 'liste_offene_verbindlichkeiten', 'ar_aging_list' => 'liste_offene_forderungen', 'as at' => 'zum Stand', diff --git a/locale/de/ct b/locale/de/ct index 9cb4384d4..609c00c3d 100644 --- a/locale/de/ct +++ b/locale/de/ct @@ -72,6 +72,7 @@ $self->{texts} = { 'Dataset upgrade' => 'Datenbankaktualisierung', 'Date' => 'Datum', 'Delivery Order' => 'Lieferschein', + 'Department' => 'Abteilung', 'Dependency loop detected:' => 'Schleife in den Abhängigkeiten entdeckt:', 'Directory' => 'Verzeichnis', 'Dunning' => 'Mahnung', diff --git a/locale/de/menu b/locale/de/menu index e9c0e0c98..d298beb97 100644 --- a/locale/de/menu +++ b/locale/de/menu @@ -72,6 +72,7 @@ $self->{texts} = { 'Chart of Accounts' => 'Kontenübersicht', 'Checks' => 'Schecks', 'Contacts' => 'Kontakte', + 'Corrections' => 'Korrekturen', 'Create and edit RFQs' => 'Lieferantenanfragen erfassen und bearbeiten', 'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten', 'Create and edit dunnings' => 'Mahnungen erfassen und bearbeiten', @@ -103,6 +104,7 @@ $self->{texts} = { 'File' => 'Datei', 'Follow-Ups' => 'Wiedervorlagen', 'General Ledger' => 'Finanzbuchhaltung', + 'General Ledger Corrections' => 'Korrekturen im Hauptbuch', 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr', 'Groups' => 'Warengruppen', 'HTML Templates' => 'HTML-Vorlagen', diff --git a/locale/de/menunew b/locale/de/menunew index 2941f10cc..90c1665c3 100644 --- a/locale/de/menunew +++ b/locale/de/menunew @@ -71,6 +71,7 @@ $self->{texts} = { 'Chart of Accounts' => 'Kontenübersicht', 'Checks' => 'Schecks', 'Contacts' => 'Kontakte', + 'Corrections' => 'Korrekturen', 'Create and edit RFQs' => 'Lieferantenanfragen erfassen und bearbeiten', 'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten', 'Create and edit dunnings' => 'Mahnungen erfassen und bearbeiten', @@ -102,6 +103,7 @@ $self->{texts} = { 'File' => 'Datei', 'Follow-Ups' => 'Wiedervorlagen', 'General Ledger' => 'Finanzbuchhaltung', + 'General Ledger Corrections' => 'Korrekturen im Hauptbuch', 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr', 'Groups' => 'Warengruppen', 'HTML Templates' => 'HTML-Vorlagen', diff --git a/menu.ini b/menu.ini index 22039f5d6..bb4deb426 100644 --- a/menu.ini +++ b/menu.ini @@ -774,6 +774,16 @@ module=amtemplates.pl action=display_template_form type=stylesheet +[System--Corrections] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[System--Corrections--General Ledger Corrections] +module=acctranscorrections.pl +action=analyze_filter + [System--Audit Control] module=am.pl action=audit_control diff --git a/templates/webpages/acctranscorrections/analyze_filter_de.html b/templates/webpages/acctranscorrections/analyze_filter_de.html new file mode 100644 index 000000000..9f5e94206 --- /dev/null +++ b/templates/webpages/acctranscorrections/analyze_filter_de.html @@ -0,0 +1,51 @@ +[% USE HTML %] + +

[% title %]

+ +

+ Frühere Versionen von Lx-Office enthielten Bugs, die zu falschen Einträgen im Hauptbuch geführt haben können. + Diese Einträge können nicht automatisch bereinigt werden. + Dieses Modul kann Ihnen helfen, problematische Einträge im Hauptbuch zu identifizieren und teilweise zu beheben. Dabei werden je nach Problem mögliche Lösungen aufgezeigt, wobei Sie die entscheiden können, welche Probleme automatisch gelöst werden sollen. +

+ +
+ +

Analysezeitraum:

+ +

+ + + + + + + + + + +
+ Zeitraum: + von + + + bis + + +
+

+ +

+ +

+ + +
+ + + + diff --git a/templates/webpages/acctranscorrections/analyze_filter_master.html b/templates/webpages/acctranscorrections/analyze_filter_master.html new file mode 100644 index 000000000..12ce06285 --- /dev/null +++ b/templates/webpages/acctranscorrections/analyze_filter_master.html @@ -0,0 +1,56 @@ +[% USE HTML %] + +

[% title %]

+ +

+ Earlier versions of Lx-Office contained bugs which might + have led to wrong entries in the general ledger. + These wrong entries cannot be fixed + automatically. + This module can help you identify and correct such + entries by analyzing the general ledger and presenting you likely + solutions but also allowing you to fix problems + yourself. +

+ +
+ +

Time period for the analysis:

+ +

+ + + + + + + + + + +
+ Period: + from (time) + + + to (time) + + +
+

+ +

+ +

+ + +
+ + + + diff --git a/templates/webpages/acctranscorrections/analyze_overview_de.html b/templates/webpages/acctranscorrections/analyze_overview_de.html new file mode 100644 index 000000000..8a6876c4c --- /dev/null +++ b/templates/webpages/acctranscorrections/analyze_overview_de.html @@ -0,0 +1,137 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

Lx-Office hat ein oder mehrere Probleme im Hauptbuch gefunden.

+ +

+ Zeitraum: + [%- IF transdate_from || transdate_to %] + [%- IF transdate_from %] + von [% transdate_from %] + [%- END %] + [%- IF transdate_to %] + bis [% transdate_to %] + [%- END %] + [%- ELSE %] + alle Einträge + [%- END %] +

+ +

+ + + + + + + + [%- FOREACH problem = PROBLEMS %] + + + + + + + + [%- END %] + +
BuchungProblemLösung
+ [%- IF problem.type == 'ap_ar_wrong_taxkeys' %] + [%- IF problem.ap_problems.size %] + Kreditorenbuchungen + [%- FOREACH ap = problem.ap_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(ap.data.reference) %] + [%- END %] + [%- END %] + + [%- IF problem.ar_problems.size %] + [%- IF problem.ap_problems.size %]; [%- END %] + Debitorenbuchungen + [%- FOREACH ar = problem.ar_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(ar.data.reference) %] + [%- END %] + [%- END %] + + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + [%- IF problem.ar_problems.size %] + Verkaufsrechnungen + [%- FOREACH subproblem = problem.ar_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(subproblem.data.reference) %] + [%- END %] + [%- END %] + + [%- IF problem.ap_problems.size %] + [%- IF problem.ar_problems.size %]; [%- END %] + Einkaufsrechnungen + [%- FOREACH subproblem = problem.ap_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(subproblem.data.reference) %] + [%- END %] + [%- END %] + + [%- ELSE %] + + + [%- IF problem.data.module == 'ar' %] + Debitorenbuchung + [%- ELSIF problem.data.module == 'ap' %] + Kreditorenbuchung + [%- ELSE %] + Dialogbuchung + [%- END %] + [% HTML.escape(problem.data.reference) %] + + + + + [%- END %] + + [%- IF problem.type == 'split_multiple_credit_and_debit' %] + Sowohl auf der Soll- als auch auf der Haben-Seite gesplittete Buchung + + [%- ELSIF problem.type == 'wrong_taxkeys' %] + Gespeicherte Steuerschlüssel sind falsch + + [%- ELSIF problem.type == 'wrong_taxes' %] + Gespeicherte Steuern passen nicht zum Steuerschlüssel + + [%- ELSIF problem.type == 'ap_ar_wrong_taxkeys' %] + Kreditorenbuchungen mit Umsatzsteuer-Steuerschlüsseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschlüsseln + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + Einkaufs- und Verkaufsrechnungen mit Warenbestandsbuchungen mit Steuerschlüsseln + + [%- END %] + + [%- IF problem.type == 'split_multiple_credit_and_debit' %] + Diese Buchung muss manuell in mehrere Buchungen aufgeteilt werden. + + [%- ELSIF (problem.type == 'wrong_taxkeys') || (problem.type == 'wrong_taxes') %] + + Korrekturassistenten starten + + + [%- ELSIF problem.type == 'ap_ar_wrong_taxkeys' %] + + Korrekturassistenten starten + + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + + Korrekturassistenten starten + + + [%- END %] +
+

+ +
+ + + diff --git a/templates/webpages/acctranscorrections/analyze_overview_master.html b/templates/webpages/acctranscorrections/analyze_overview_master.html new file mode 100644 index 000000000..bb574ca64 --- /dev/null +++ b/templates/webpages/acctranscorrections/analyze_overview_master.html @@ -0,0 +1,137 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

Lx-Office has found one or more problems in the general ledger.

+ +

+ Period: + [%- IF transdate_from || transdate_to %] + [%- IF transdate_from %] + from (time) [% transdate_from %] + [%- END %] + [%- IF transdate_to %] + to (time) [% transdate_to %] + [%- END %] + [%- ELSE %] + all entries + [%- END %] +

+ +

+ + + + + + + + [%- FOREACH problem = PROBLEMS %] + + + + + + + + [%- END %] + +
TransactionProblemSolution
+ [%- IF problem.type == 'ap_ar_wrong_taxkeys' %] + [%- IF problem.ap_problems.size %] + AP Transactions + [%- FOREACH ap = problem.ap_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(ap.data.reference) %] + [%- END %] + [%- END %] + + [%- IF problem.ar_problems.size %] + [%- IF problem.ap_problems.size %]; [%- END %] + AR Transactions + [%- FOREACH ar = problem.ar_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(ar.data.reference) %] + [%- END %] + [%- END %] + + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + [%- IF problem.ar_problems.size %] + Sales invoices + [%- FOREACH subproblem = problem.ar_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(subproblem.data.reference) %] + [%- END %] + [%- END %] + + [%- IF problem.ap_problems.size %] + [%- IF problem.ar_problems.size %]; [%- END %] + Purchase invoices + [%- FOREACH subproblem = problem.ap_problems %] + [%- UNLESS loop.first %], [%- END %] + [% HTML.escape(subproblem.data.reference) %] + [%- END %] + [%- END %] + + [%- ELSE %] + + + [%- IF problem.data.module == 'ar' %] + AR Transaction + [%- ELSIF problem.data.module == 'ap' %] + AP Transaction + [%- ELSE %] + General Ledger Transaction + [%- END %] + [% HTML.escape(problem.data.reference) %] + + + + + [%- END %] + + [%- IF problem.type == 'split_multiple_credit_and_debit' %] + Transaction has been split on both the credit and the debit side + + [%- ELSIF problem.type == 'wrong_taxkeys' %] + Wrong tax keys recorded + + [%- ELSIF problem.type == 'wrong_taxes' %] + Wrong taxes recorded + + [%- ELSIF problem.type == 'ap_ar_wrong_taxkeys' %] + AP transactions with sales taxkeys and/or AR transactions with input taxkeys + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + Sales and purchase invoices with inventory transactions with taxkeys + + [%- END %] + + [%- IF problem.type == 'split_multiple_credit_and_debit' %] + This transaction has to be split into several transactions manually. + + [%- ELSIF (problem.type == 'wrong_taxkeys') || (problem.type == 'wrong_taxes') %] + + Start the correction assistant + + + [%- ELSIF problem.type == 'ap_ar_wrong_taxkeys' %] + + Start the correction assistant + + + [%- ELSIF problem.type == 'invoice_inventory_with_taxkeys' %] + + Start the correction assistant + + + [%- END %] +
+

+ +
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_de.html b/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_de.html new file mode 100644 index 000000000..f97c05575 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_de.html @@ -0,0 +1,31 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ Es gibt mindestens eine Buchung, bei der ein logisch nicht passender Steuerschlüssel ausgewählt wurde. + + Das bedeutet, dass ein Benutzer eine Kreditorenbuchung angelegt und in ihr einen Umsatzsteuer-Steuerschlüssel verwendet oder eine Debitorenbuchung mit Vorsteuer-Steuerschlüssel angelegt hat. +

+ +

+ Lx-Office kann solche Probleme automatisch beheben. + + Bei Kreditorenbuchungen werden die Umsatzsteuer-Steuerschlüssel durch Vorsteuer-Steuerschlüssel mit demselben Steuersatz ersetzt. + + Bei Debitorenbuchungen werden die Vorsteuer-Steuerschlüssel durch Umsatzsteuer-Steuerschlüssel mit demselben Steuersatz ersetzt. +

+ +
+ +

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_master.html b/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_master.html new file mode 100644 index 000000000..a310aa973 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_ap_ar_wrong_taxkeys_master.html @@ -0,0 +1,36 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ There is at least one transaction for which the user has + chosen a logically wrong taxkey. + + This means that the user has created an AP transaction + and chosen a taxkey for sales taxes, or that he has created an AR + transaction and chosen a taxkey for input taxes. +

+ +

+ Lx-Office can fix these problems automatically. + + For AP transactions it will replace the sales taxkeys + with input taxkeys with the same tax rate. + + For AR transactions it will replace the input taxkeys + with sales taxkeys with the same tax rate. +

+ +
+ +

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_de.html b/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_de.html new file mode 100644 index 000000000..0a29b51d9 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_de.html @@ -0,0 +1,27 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ Es gibt mindestens eine Einkaufs- oder Verkaufsrechnung, für die Lx-Office einen Steuerschlüssel ungleich 0 verzeichnet hat, obwohl für Warenbestandsbuchugen bei Rechnungen nie Steuern gebucht werden. +

+ +

+ Lx-Office kann solche Probleme automatisch beheben. + + Es wird einfach die Steuerschlüssel auf 0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist. +

+ +
+ +

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_master.html b/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_master.html new file mode 100644 index 000000000..32ada4291 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_invoice_inventory_with_taxkeys_master.html @@ -0,0 +1,31 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ There is at least one sales or purchase invoice for which + Lx-Office recorded an inventory transaction with taxkeys even + though no tax was recorded. +

+ +

+ Lx-Office can fix these problems automatically. + + It will simply set the taxkey to 0 (meaning "no taxes") + which is the correct value for such inventory + transactions. +

+ +
+ +

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_de.html b/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_de.html new file mode 100644 index 000000000..8b045cb31 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_de.html @@ -0,0 +1,80 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ Die folgende Buchung enthält falsche Steuern: + + [%- IF problem.data.module == 'ar' %] + Debitorenbuchung + [%- ELSIF problem.data.module == 'ap' %] + Kreditorenbuchung + [%- ELSE %] + Dialogbuchung + [%- END %] + [% HTML.escape(problem.data.reference) %] + +

+ +

Aktuell sieht die Buchung wie folgt aus:

+ +

+ + + + + + + + + + + + [%- SET curr_row = 0 %] + [%- IF problem.acc_trans.credit.entries.size > problem.acc_trans.debit.entries.size %] + [%- SET order = [ 'credit', 'debit' ] %] + [%- SET other_side = 'debit' %] + [%- ELSE %] + [%- SET order = [ 'debit', 'credit' ] %] + [%- SET other_side = 'credit' %] + [%- END %] + + [%- FOREACH idx = order %] + [%- FOREACH row = problem.acc_trans.$idx.entries %] + [%- SET curr_row = curr_row + 1 %] + + + + + + + + + + [%- END %] + [%- END %] + +
KontoSollHabenSteuerschlüsselGespeicherte SteuernErwartete Steuern
[% HTML.escape(row.accno) %]--[% HTML.escape(row.chartdescription) %] + [%- IF idx == 'debit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + + [%- IF idx == 'credit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + [% IF idx != other_side %][% HTML.escape(row.taxdescription) %][% END %][% IF row.actual_tax %][% LxERP.format_amount(row.actual_tax, 2) %][% END %][% IF row.expected_tax %][% LxERP.format_amount(row.expected_tax, 2) %][% END %]
+

+
+ +
+

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_master.html b/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_master.html new file mode 100644 index 000000000..f35960d72 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_wrong_taxes_master.html @@ -0,0 +1,80 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ The following transaction contains wrong taxes: + + [%- IF problem.data.module == 'ar' %] + AR Transaction + [%- ELSIF problem.data.module == 'ap' %] + AP Transaction + [%- ELSE %] + General Ledger Transaction + [%- END %] + [% HTML.escape(problem.data.reference) %] + +

+ +

At the moment the transaction looks like this:

+ +

+ + + + + + + + + + + + [%- SET curr_row = 0 %] + [%- IF problem.acc_trans.credit.entries.size > problem.acc_trans.debit.entries.size %] + [%- SET order = [ 'credit', 'debit' ] %] + [%- SET other_side = 'debit' %] + [%- ELSE %] + [%- SET order = [ 'debit', 'credit' ] %] + [%- SET other_side = 'credit' %] + [%- END %] + + [%- FOREACH idx = order %] + [%- FOREACH row = problem.acc_trans.$idx.entries %] + [%- SET curr_row = curr_row + 1 %] + + + + + + + + + + [%- END %] + [%- END %] + +
AccountDebitCreditTaxkeyRecorded TaxExpected Tax
[% HTML.escape(row.accno) %]--[% HTML.escape(row.chartdescription) %] + [%- IF idx == 'debit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + + [%- IF idx == 'credit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + [% IF idx != other_side %][% HTML.escape(row.taxdescription) %][% END %][% IF row.actual_tax %][% LxERP.format_amount(row.actual_tax, 2) %][% END %][% IF row.expected_tax %][% LxERP.format_amount(row.expected_tax, 2) %][% END %]
+

+
+ +
+

+ + + + +

+
+ + + diff --git a/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_de.html b/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_de.html new file mode 100644 index 000000000..b5c3ff929 --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_de.html @@ -0,0 +1,145 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ Die folgende Buchung enthält falsche Steuerschlüssel: + + [%- IF problem.data.module == 'ar' %] + Debitorenbuchung + [%- ELSIF problem.data.module == 'ap' %] + Kreditorenbuchung + [%- ELSE %] + Dialogbuchung + [%- END %] + [% HTML.escape(problem.data.reference) %] + +

+ +

+ Dies kann aus zwei Gründen geschehen sein: + + Zum Einen gab es einen Bug in Lx-Office, der dazu führte, dass bei Buchungen mit verschiedenen Steuerschlüssel auf ein Konto teilweise falsche Steuerschlüssel gespeichert wurden. + + Zum Anderen war es möglich, die Steuern unabhängig vom ausgewählten Steuerschlüssel selber einzugeben. + + Solche Einträge sind aber nicht DATEV-exportiertbar und müssen ebenfalls korrigiert werden. +

+ +

+ Nachfolgend wird angezeigt, wie die Buchung momentan aussieht. + + Sie haben die Möglichkeit, die Buchung zu korrigieren, indem Sie in den Drop-Down-Boxen die richtigen Steuerschlüssel auswählen und anschließend auf den Button "Buchung korrigieren" drücken. + + Auch nach einer Korrektur kann es mit dieser Buchung noch weitere Probleme geben (z.B. nicht zum Steuerschlüssel passende Steuern), weshalb ein erneutes Ausführen der Hauptbuchanalyse empfohlen wird. +

+ +

+ Alternativ können Sie die Buchung auch mit löschen lassen und sie anschließend neu eingeben. + + Drücken Sie dafür auf den Button "Buchung löschen". +

+ +

Aktuell sieht die Buchung wie folgt aus:

+ +
+

+ + + + + + + + + + + + + [%- SET curr_row = 0 %] + [%- IF (problem.data.module == 'ar') || ((problem.data.module == 'gl') && (problem.acc_trans.credit.entries.first.oid < problem.acc_trans.debit.entries.first.oid)) %] + [%- SET order = [ 'credit', 'debit' ] %] + [%- SET other_side = 'debit' %] + [%- ELSE %] + [%- SET order = [ 'debit', 'credit' ] %] + [%- SET other_side = 'credit' %] + [%- END %] + + + [%- IF problem.acc_trans.credit.entries.size > problem.acc_trans.debit.entries.size %] + [%- ELSE %] + [%- END %] + + + [%- FOREACH idx = order %] + [%- FOREACH row = problem.acc_trans.$idx.entries %] + [%- SET curr_row = curr_row + 1 %] + + + + + + + + + + + [%- END %] + [%- END %] + +
KontoSollHabenGespeicherte SteuernGespeicherter SteuerschlüsselErwartete SteuernRichtiger Steuerschlüssel
[% HTML.escape(row.accno) %]--[% HTML.escape(row.chartdescription) %] + [%- IF idx == 'debit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + + [%- IF idx == 'credit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + [% IF row.actual_tax %][% LxERP.format_amount(row.display_actual_tax, 2) %][% END %][% IF (problem.data.module == 'gl') || (idx != other_side) %][% HTML.escape(row.taxdescription) %][% END %][% IF row.expected_tax %][% LxERP.format_amount(row.display_expected_tax, 2) %][% END %] + [%- IF row.taxkey_error %] + + +
+

+
+ +

+ + + + + + + + + +

+
+ + + + + + diff --git a/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_master.html b/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_master.html new file mode 100644 index 000000000..27d75f54e --- /dev/null +++ b/templates/webpages/acctranscorrections/assistant_for_wrong_taxkeys_master.html @@ -0,0 +1,158 @@ +[% USE HTML %][% USE LxERP %] + + +

[% title %]

+ +

+ The following transaction contains wrong taxkeys: + + [%- IF problem.data.module == 'ar' %] + AR Transaction + [%- ELSIF problem.data.module == 'ap' %] + AP Transaction + [%- ELSE %] + General Ledger Transaction + [%- END %] + [% HTML.escape(problem.data.reference) %] + +

+ +

+ This could have happened for two reasons: + + The first reason is that Lx-Office contained a bug which + resulted in the wrong taxkeys being recorded for transactions in + which two entries are posted for the same chart with different + taxkeys. + + The second reason is that Lx-Office allowed the user to + enter the tax amount manually regardless of the taxkey + used. + + Such entries cannot be exported into the DATEV format and + have to be fixed as well. +

+ +

+ The transaction is shown below in its current state. + + You can correct this transaction by chosing the correct + taxkeys from the drop down boxes and hitting the button "Fix + transaction" afterwards. + + It is possible that even after such a correction there is + something wrong with this transaction (e.g. taxes that don't match + the selected taxkey). Therefore you should re-run the general ledger + analysis. +

+ +

+ You can also delete this transaction and re-enter it + manually. + + In order to do that hit the button "Delete + transaction". +

+ +

At the moment the transaction looks like this:

+ +
+

+ + + + + + + + + + + + + [%- SET curr_row = 0 %] + [%- IF (problem.data.module == 'ar') || ((problem.data.module == 'gl') && (problem.acc_trans.credit.entries.first.oid < problem.acc_trans.debit.entries.first.oid)) %] + [%- SET order = [ 'credit', 'debit' ] %] + [%- SET other_side = 'debit' %] + [%- ELSE %] + [%- SET order = [ 'debit', 'credit' ] %] + [%- SET other_side = 'credit' %] + [%- END %] + + + [%- IF problem.acc_trans.credit.entries.size > problem.acc_trans.debit.entries.size %] + [%- ELSE %] + [%- END %] + + + [%- FOREACH idx = order %] + [%- FOREACH row = problem.acc_trans.$idx.entries %] + [%- SET curr_row = curr_row + 1 %] + + + + + + + + + + + [%- END %] + [%- END %] + +
AccountDebitCreditRecorded TaxRecorded taxkeyExpected TaxCorrect taxkey
[% HTML.escape(row.accno) %]--[% HTML.escape(row.chartdescription) %] + [%- IF idx == 'debit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + + [%- IF idx == 'credit' %] + [% LxERP.format_amount(row.display_amount, 2) %] + [%- END %] + [% IF row.actual_tax %][% LxERP.format_amount(row.display_actual_tax, 2) %][% END %][% IF (problem.data.module == 'gl') || (idx != other_side) %][% HTML.escape(row.taxdescription) %][% END %][% IF row.expected_tax %][% LxERP.format_amount(row.display_expected_tax, 2) %][% END %] + [%- IF row.taxkey_error %] + + +
+

+
+ +

+ + + + + + + + + +

+
+ + + + + + diff --git a/templates/webpages/acctranscorrections/delete_transaction_confirmation_de.html b/templates/webpages/acctranscorrections/delete_transaction_confirmation_de.html new file mode 100644 index 000000000..39fb2c67e --- /dev/null +++ b/templates/webpages/acctranscorrections/delete_transaction_confirmation_de.html @@ -0,0 +1,32 @@ +[% USE HTML %] +[% USE LxERP %] + +

[% title %]

+ +

+ [%- IF module == 'ar' %] + [%- HTML.escape(LxERP.format_string('Wollen Sie wirklich die Debitorenbuchung #1 löschen?', reference)) %] + [%- ELSIF module == 'ap' %] + [%- HTML.escape(LxERP.format_string('Wollen Sie wirklich die Kreditorenbuchung #1 löschen?', reference)) %] + [%- ELSE %] + [%- HTML.escape(LxERP.format_string('Wollen Sie wirklich die Dialogbuchung #1 löschen?', reference)) %] + [%- END %] +

+ +

+

+ + + + + + + + + + + +
+

+ + diff --git a/templates/webpages/acctranscorrections/delete_transaction_confirmation_master.html b/templates/webpages/acctranscorrections/delete_transaction_confirmation_master.html new file mode 100644 index 000000000..bfc667502 --- /dev/null +++ b/templates/webpages/acctranscorrections/delete_transaction_confirmation_master.html @@ -0,0 +1,32 @@ +[% USE HTML %] +[% USE LxERP %] + +

[% title %]

+ +

+ [%- IF module == 'ar' %] + [%- HTML.escape(LxERP.format_string('Do you really want to delete AR transaction #1?', reference)) %] + [%- ELSIF module == 'ap' %] + [%- HTML.escape(LxERP.format_string('Do you really want to delete AP transaction #1?', reference)) %] + [%- ELSE %] + [%- HTML.escape(LxERP.format_string('Do you really want to delete GL transaction #1?', reference)) %] + [%- END %] +

+ +

+

+ + + + + + + + + + + +
+

+ + diff --git a/templates/webpages/acctranscorrections/delete_transaction_de.html b/templates/webpages/acctranscorrections/delete_transaction_de.html new file mode 100644 index 000000000..d992ecfef --- /dev/null +++ b/templates/webpages/acctranscorrections/delete_transaction_de.html @@ -0,0 +1,25 @@ +[% USE HTML %] +[% USE LxERP %] + +

[% title %]

+ +

+ [%- IF module == 'ar' %] + [%- HTML.escape(LxERP.format_string('Die Debitorenbuchung #1 wurde gelöscht.', reference)) %] + [%- ELSIF module == 'ap' %] + [%- HTML.escape(LxERP.format_string('Die Kreditorenbuchung #1 wurde gelöscht.', reference)) %] + [%- ELSE %] + [%- HTML.escape(LxERP.format_string('Die Dialogbuchung #1 wurde gelöscht.', reference)) %] + [%- END %] +

+ +

+

+ + + + +
+

+ + diff --git a/templates/webpages/acctranscorrections/delete_transaction_master.html b/templates/webpages/acctranscorrections/delete_transaction_master.html new file mode 100644 index 000000000..9bae3777a --- /dev/null +++ b/templates/webpages/acctranscorrections/delete_transaction_master.html @@ -0,0 +1,25 @@ +[% USE HTML %] +[% USE LxERP %] + +

[% title %]

+ +

+ [%- IF module == 'ar' %] + [%- HTML.escape(LxERP.format_string('The AR transaction #1 has been deleted.', reference)) %] + [%- ELSIF module == 'ap' %] + [%- HTML.escape(LxERP.format_string('The AP transaction #1 has been deleted.', reference)) %] + [%- ELSE %] + [%- HTML.escape(LxERP.format_string('The GL transaction #1 has been deleted.', reference)) %] + [%- END %] +

+ +

+

+ + + + +
+

+ + diff --git a/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_de.html b/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_de.html new file mode 100644 index 000000000..134b5d660 --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_de.html @@ -0,0 +1,22 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ Die Probleme mit falschen Steuerschlüssel bei Kreditoren- und Debitorenbuchungen wurden behoben. + + Bitte wiederholen Sie die Analyse der Hauptbucheinträge, indem Sie auf diesen Button klicken: +

+ +

+

+ + + + +
+

+ + + diff --git a/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_master.html b/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_master.html new file mode 100644 index 000000000..2e75f2742 --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_ap_ar_wrong_taxkeys_master.html @@ -0,0 +1,24 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ The wrong taxkeys for AP and AR transactions have been + fixed. + + Please re-run the analysis for broken general ledger + entries by clicking this button: +

+ +

+

+ + + + +
+

+ + + diff --git a/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_de.html b/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_de.html new file mode 100644 index 000000000..920e0645b --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_de.html @@ -0,0 +1,22 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ Die falschen Steuerschlüssel für Warenbestandsbuchungen bei Einkaufs- und Verkaufsrechnungen wurden behoben. + + Bitte wiederholen Sie die Analyse der Hauptbucheinträge, indem Sie auf diesen Button klicken: +

+ +

+

+ + + + +
+

+ + + diff --git a/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_master.html b/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_master.html new file mode 100644 index 000000000..8fb9bb84c --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_invoice_inventory_with_taxkeys_master.html @@ -0,0 +1,24 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ The wrong taxkeys for inventory transactions for sales + and purchase invoices have been fixed. + + Please re-run the analysis for broken general ledger + entries by clicking this button: +

+ +

+

+ + + + +
+

+ + + diff --git a/templates/webpages/acctranscorrections/fix_wrong_taxkeys_de.html b/templates/webpages/acctranscorrections/fix_wrong_taxkeys_de.html new file mode 100644 index 000000000..64a6cdaa2 --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_wrong_taxkeys_de.html @@ -0,0 +1,22 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ Die Steuerschlüssel wurden nach Ihrer Auswahl korrigiert. + + Bitte wiederholen Sie die Analyse der Hauptbucheinträge, indem Sie auf diesen Button klicken: +

+ +

+

+ + + + +
+

+ + + diff --git a/templates/webpages/acctranscorrections/fix_wrong_taxkeys_master.html b/templates/webpages/acctranscorrections/fix_wrong_taxkeys_master.html new file mode 100644 index 000000000..fca2c2e45 --- /dev/null +++ b/templates/webpages/acctranscorrections/fix_wrong_taxkeys_master.html @@ -0,0 +1,23 @@ +[% USE HTML %] + + +

[% title %]

+ +

+ The wrong taxkeys have been fixed. + + Please re-run the analysis for broken general ledger + entries by clicking this button: +

+ +

+

+ + + + +
+

+ + + -- 2.20.1