package DATEV;
-use List::Util qw(max);
+use utf8;
+use strict;
use SL::DBUtils;
use SL::DATEV::KNEFile;
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();
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();
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];
my ($notsplitindex);
my @errors = ();
+ $form->{net_gross_differences} = [];
+ $form->{sum_net_gross_differences} = 0;
+
$fromto =~ s/transdate/ac\.transdate/g;
my $taxkeys = Taxkeys->new();
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")) {
my $count = $ref->{amount};
my $firstrun = 1;
+ my $subcent = abs($count) < 0.02;
- while (abs($count) > 0.01 || $firstrun) {
+ while (abs($count) > 0.01 || $firstrun || ($subcent && abs($count) > 0.005)) {
my $ref2 = $sth->fetchrow_hashref("NAME_lc");
last unless ($ref2);
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;
$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] ];
$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;
}
}
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)) {