From: Holger Lindemann Date: Thu, 11 Feb 2010 10:44:04 +0000 (+0100) Subject: Merge branch 'master' of ssh://lx-office/~/lx-office-erp X-Git-Tag: release-2.6.1beta1~55^2 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/0a0de6a62c138e156275169601087754b4469097?hp=e66d4dda8ce261100c6a4c36671a1323caed9c11 Merge branch 'master' of ssh://lx-office/~/lx-office-erp --- diff --git a/.gitignore b/.gitignore index 513d2a776..43e03e901 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ tags crm +/users/datev-export* diff --git a/SL/DATEV.pm b/SL/DATEV.pm index 1a455f3ec..49e824b50 100644 --- a/SL/DATEV.pm +++ b/SL/DATEV.pm @@ -330,6 +330,9 @@ sub _get_transactions { my ($notsplitindex); my @errors = (); + $form->{net_gross_differences} = []; + $form->{sum_net_gross_differences} = 0; + $fromto =~ s/transdate/ac\.transdate/g; my $taxkeys = Taxkeys->new(); @@ -445,6 +448,7 @@ sub _get_transactions { my $ml = ($trans->[0]->{'umsatz'} > 0) ? 1 : -1; my $rounding_error = 0; + my @taxed; for my $j (0 .. (scalar(@{$trans}) - 1)) { if ( ($j != $notsplitindex) @@ -481,23 +485,24 @@ sub _get_transactions { $absumsatz += -1 * $new_trans{'amount'}; } else { - my $unrounded = $trans->[$j]->{'amount'} * (1 + $tax_rate) * -1; # + $rounding_error; + my $unrounded = $trans->[$j]->{'amount'} * (1 + $tax_rate) * -1 + $rounding_error; my $rounded = $form->round_amount($unrounded, 2); - $rounding_error += $unrounded - $rounded; + + $rounding_error = $unrounded - $rounded; $new_trans{'amount'} = $rounded; - $new_trans{'umsatz'} = abs($form->round_amount(($trans->[$j]->{'amount'} * (1 + $tax_rate)), 2)) * $ml; - $trans->[$j]->{'umsatz'} = abs($form->round_amount(($trans->[$j]->{'amount'} * (1 + $tax_rate)), 2)) * $ml; - $absumsatz += $form->round_amount($trans->[$j]->{'amount'} + $trans->[$j]->{'amount'} * $tax_rate, 2); + $new_trans{'umsatz'} = abs($rounded) * $ml; + $trans->[$j]->{'umsatz'} = $new_trans{umsatz}; + $absumsatz -= $rounded; } push @{ $form->{DATEV} }, [ \%new_trans, $trans->[$j] ]; + push @taxed, $form->{DATEV}->[-1]; } } my $idx = 0; my $correction = 0; - our @taxed; # most likely defunct - while (abs($absumsatz) >= 0.01) { + while ((abs($absumsatz) >= 0.01) && (abs($absumsatz) < 1.00)) { if ($idx >= scalar @taxed) { last if (!$correction); @@ -533,8 +538,13 @@ sub _get_transactions { $idx++; } - if (abs($absumsatz) >= 0.01) { - push @errors, "Datev-Export fehlgeschlagen! Bei Transaktion $trans->[0]->{trans_id} ($absumsatz, Rundungsfehler $rounding_error)\n"; + $absumsatz = $form->round_amount($absumsatz, 2); + if (abs($absumsatz) >= (0.01 * (1 + scalar @taxed))) { + push @errors, "Datev-Export fehlgeschlagen! Bei Transaktion $trans->[0]->{trans_id} ($absumsatz)\n"; + + } elsif (abs($absumsatz) >= 0.01) { + push @{ $form->{net_gross_differences} }, $absumsatz; + $form->{sum_net_gross_differences} += $absumsatz; } } diff --git a/bin/mozilla/datev.pl b/bin/mozilla/datev.pl index 9f758b0e4..4ada35f10 100644 --- a/bin/mozilla/datev.pl +++ b/bin/mozilla/datev.pl @@ -363,6 +363,8 @@ sub export3 { print(qq|
| . $locale->text('KNE-Export erfolgreich!') . qq|

Download|); + print $form->parse_html_template('datev/net_gross_difference') if @{ $form->{net_gross_differences} }; + } else { $form->error("KNE-Export schlug fehl."); } diff --git a/locale/de/all b/locale/de/all index 8173d6ab3..305a847b7 100644 --- a/locale/de/all +++ b/locale/de/all @@ -1080,6 +1080,7 @@ $self->{texts} = { 'Number missing in Row' => 'Nummer fehlt in Zeile', 'Number of bins' => 'Anzahl Lagerplätze', 'Number of copies' => 'Anzahl Kopien', + 'Number of entries changed: #1' => 'Anzahl geänderter Einträge: #1', 'Number of new bins' => 'Anzahl neuer Lagerplätze', 'Number pages' => 'Seiten nummerieren', 'Number variables: \'PRECISION=n\' forces numbers to be shown with exactly n decimal places.' => 'Zahlenvariablen: Mit \'PRECISION=n\' erzwingt man, dass Zahlen mit n Nachkommastellen formatiert werden.', diff --git a/locale/de/fix_acc_trans_ap_taxkey_bug b/locale/de/fix_acc_trans_ap_taxkey_bug new file mode 100644 index 000000000..31846ea0d --- /dev/null +++ b/locale/de/fix_acc_trans_ap_taxkey_bug @@ -0,0 +1,14 @@ +#!/usr/bin/perl + +$self->{texts} = { + 'Database update error:' => 'Fehler beim Datenbankupgrade:', + 'Number of entries changed: #1' => 'Anzahl geänderter Einträge: #1', +}; + +$self->{subs} = { + 'do_query' => 'do_query', + 'do_update' => 'do_update', + 'mydberror' => 'mydberror', +}; + +1; diff --git a/sql/Pg-upgrade2/fix_acc_trans_ap_taxkey_bug.pl b/sql/Pg-upgrade2/fix_acc_trans_ap_taxkey_bug.pl new file mode 100644 index 000000000..a2e70f944 --- /dev/null +++ b/sql/Pg-upgrade2/fix_acc_trans_ap_taxkey_bug.pl @@ -0,0 +1,108 @@ +# @tag: fix_acc_trans_ap_taxkey_bug +# @description: Korrektur falscher Steuerschlüssel in acc_trans bei Eingangsrechnungen +# @depends: release_2_6_0 + +use strict; + +die "This script cannot be run from the command line." unless $::form; + +sub mydberror { + my $msg = shift; + die $dbup_locale->text("Database update error:") . "
$msg
" . $DBI::errstr; +} + +sub do_query { + my $query = shift; + my $may_fail = shift; + + if (!$dbh->do($query)) { + mydberror($query) unless $may_fail; + $dbh->rollback(); + $dbh->begin_work(); + } +} + +sub do_update { + my $q_find = < 0) + )) + ORDER BY ap.id + ) AS the_query + WHERE the_query.actual_taxkey <> the_query.wanted_taxkey +SQL + + my $q_change = <prepare($q_find) || mydberror($q_find); + my $h_change = $dbh->prepare($q_change) || mydberror($q_change); + + $h_find->execute() || mydberror($q_find); + + my $num_changed = 0; + + while (my $ref = $h_find->fetchrow_hashref()) { + # $::lxdebug->dump(0, "ref", $ref); + $h_change->execute($ref->{wanted_taxkey}, $ref->{acc_trans_id}) || mydberror($q_change); + $num_changed++; + } + + $h_find->finish(); + $h_change->finish(); + + print $dbup_locale->text('Number of entries changed: #1', $num_changed) . "
\n"; +} + +do_update(); diff --git a/templates/webpages/datev/net_gross_difference_de.html b/templates/webpages/datev/net_gross_difference_de.html new file mode 100644 index 000000000..98e963e74 --- /dev/null +++ b/templates/webpages/datev/net_gross_difference_de.html @@ -0,0 +1,27 @@ +[% USE HTML %][% USE LxERP %] + +

+ Hinweis: +

+ +

+ Lx-Office speichert Buchungsdaten als aggregierte Nettowerte. + + Das DATEV-Dateiformat hingegen erwartet aufgeteilte Buchungssätze mit + Bruttowerten. + + Es ist deshalb technisch nicht immer möglich, aus den vorhandenen + aggregierten Nettowerten solche Bruttowerte zu errechnen, sodass für + einen Beleg betrachtet die von Lx-Office angezeigten und die in den + DATEV-Export geschriebenen Bruttowerte exakt übereinstimmen. + + Abweichungen im Cent-Bereich sind in beide Richtungen möglich (Brutto + Lx-Office ist größer als Brutto DATEV und umgekehrt), werden aber von + den Steuerbehörden anstandslos akzeptiert. +

+ +

+ In dem gerade durchgeführten Export gab es [% net_gross_differences.size %] + solcher Fälle. Die Summe aller Abweichungen beläuft sich auf + [% LxERP.format_amount(sum_net_gross_differences, 2) %]. +

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

+ Hinweis: +

+ +

+ Lx-Office speichert Buchungsdaten als aggregierte Nettowerte. + + Das DATEV-Dateiformat hingegen erwartet aufgeteilte Buchungssätze mit + Bruttowerten. + + Es ist deshalb technisch nicht immer möglich, aus den vorhandenen + aggregierten Nettowerten solche Bruttowerte zu errechnen, sodass für + einen Beleg betrachtet die von Lx-Office angezeigten und die in den + DATEV-Export geschriebenen Bruttowerte exakt übereinstimmen. + + Abweichungen im Cent-Bereich sind in beide Richtungen möglich (Brutto + Lx-Office ist größer als Brutto DATEV und umgekehrt), werden aber von + den Steuerbehörden anstandslos akzeptiert. +

+ +

+ In dem gerade durchgeführten Export gab es [% net_gross_differences.size %] + solcher Fälle. Die Summe aller Abweichungen beläuft sich auf + [% LxERP.format_amount(sum_net_gross_differences, 2) %]. +