X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDATEV.pm;h=60eb97f904def421538aa18eccfa2c3896fb2570;hb=89c9ff022d3f13e27ba6bda085df15707fcfb0eb;hp=1a455f3ec36a7b1ededaaa8feb8e23b7de1acce8;hpb=c510d88bbfea6818ffafaddb7286e88aec96d3b8;p=kivitendo-erp.git diff --git a/SL/DATEV.pm b/SL/DATEV.pm index 1a455f3ec..60eb97f90 100644 --- a/SL/DATEV.pm +++ b/SL/DATEV.pm @@ -26,7 +26,8 @@ package DATEV; -use List::Util qw(max); +use utf8; +use strict; use SL::DBUtils; use SL::DATEV::KNEFile; @@ -34,10 +35,9 @@ use SL::Taxkeys; use Data::Dumper; use File::Path; +use List::Util qw(max); use Time::HiRes qw(gettimeofday); -use strict; - sub _get_export_path { $main::lxdebug->enter_sub(); @@ -58,7 +58,7 @@ sub get_path_for_download_token { my $path; if ($token =~ m|^(\d+)-(\d+)-(\d+)$|) { - $path = "${main::userspath}/datev-export-${1}-${2}-${3}"; + $path = $::lx_office_conf{paths}->{userspath} . "/datev-export-${1}-${2}-${3}"; } $main::lxdebug->leave_sub(); @@ -84,7 +84,7 @@ sub get_download_token_for_path { sub clean_temporary_directories { $main::lxdebug->enter_sub(); - foreach my $path (glob "${main::userspath}/datev-export-*") { + foreach my $path (glob($::lx_office_conf{paths}->{userspath} . "/datev-export-*")) { next unless (-d $path); my $mtime = (stat($path))[9]; @@ -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(); @@ -383,6 +386,7 @@ sub _get_transactions { ORDER BY trans_id, acc_trans_id|; my $sth = prepare_execute_query($form, $dbh, $query); + $form->{DATEV} = []; my $counter = 0; while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { @@ -402,7 +406,7 @@ sub _get_transactions { if ($ref2->{trans_id} != $trans->[0]->{trans_id}) { $form->error("Unbalanced ledger! old trans_id " . $trans->[0]->{trans_id} . " new trans_id " . $ref2->{trans_id} . " count $count"); - exit 1; + ::end_of_request(); } push @{ $trans }, $ref2; @@ -445,6 +449,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 +486,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 +539,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; } } @@ -766,14 +777,14 @@ sub kne_buchungsexport { my $taxkey = 0; my $charttax = 0; my ($haben, $soll); - my $iconv = $main::locale->{iconv_iso8859}; - my %umlaute = ($iconv->convert('ä') => 'ae', - $iconv->convert('ö') => 'oe', - $iconv->convert('ü') => 'ue', - $iconv->convert('Ä') => 'Ae', - $iconv->convert('Ö') => 'Oe', - $iconv->convert('Ü') => 'Ue', - $iconv->convert('ß') => 'sz'); + my $iconv = $::locale->{iconv_utf8}; + my %umlaute = ($iconv->convert('ä') => 'ae', + $iconv->convert('ö') => 'oe', + $iconv->convert('ü') => 'ue', + $iconv->convert('Ä') => 'Ae', + $iconv->convert('Ö') => 'Oe', + $iconv->convert('Ü') => 'Ue', + $iconv->convert('ß') => 'sz'); for (my $i = 0; $i < $trans_lines; $i++) { if ($trans_lines == 2) { if (abs($transaction->[$i]->{'amount'}) > abs($umsatz)) {