X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FAccTransCorrections.pm;h=2ecad9fb8f492cfa4e7ce71ea53c491678517795;hb=577042c61c5e1fffb8747079b4f9826e51532ee8;hp=ec440f1bb2cb38ba597fe34a877d7b21557d9712;hpb=37452fcb0ef4537ac851fa3e816148cec345ae0c;p=kivitendo-erp.git diff --git a/SL/AccTransCorrections.pm b/SL/AccTransCorrections.pm index ec440f1bb..2ecad9fb8 100644 --- a/SL/AccTransCorrections.pm +++ b/SL/AccTransCorrections.pm @@ -1,11 +1,13 @@ package AccTransCorrections; +use utf8; use strict; use List::Util qw(first); use SL::DBUtils; use SL::Taxkeys; +use SL::DB; sub new { my $type = shift; @@ -129,8 +131,8 @@ sub _prepare_data { delete $entry->{chartlink}; } - # Verknüpfungen zwischen Steuerschlüsseln und zum Zeitpunkt der Transaktion - # gültigen Steuersätze + # 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); @@ -184,8 +186,8 @@ sub _prepare_data { } } - # Alle Einträge entfernen, die die Gegenkonten zu Zahlungsein- und - # -ausgängen darstellen. + # 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'; @@ -253,14 +255,18 @@ sub _group_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. +# 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 = @_; + # ist nur für bestandsmethode notwendig. bei der Aufwandsmethode + # können Warenkonten mit Steuerschlüssel sein (5400 in SKR04) + return 0 if $::instance_conf->get_inventory_system eq 'periodic'; + if (!$params{transaction}->[0]->{invoice}) { $main::lxdebug->leave_sub(); return 0; @@ -289,7 +295,7 @@ sub _check_trans_invoices_inventory_with_taxkeys { } # Problemfall: Verkaufsrechnungen, bei denen Steuern verbucht wurden, obwohl -# kein Steuerschlüssel eingetragen ist. +# kein Steuerschlüssel eingetragen ist. sub _check_missing_taxkeys_in_invoices { $::lxdebug->enter_sub; @@ -331,8 +337,8 @@ sub _check_missing_taxkeys_in_invoices { return $found_broken; } -# Problemfall: Kreditorenbuchungen, bei denen mit Umsatzsteuerschlüsseln -# gebucht wurde und Debitorenbuchungen, bei denen mit Vorsteuerschlüsseln +# 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(); @@ -360,8 +366,8 @@ sub _check_trans_ap_ar_wrong_taxkeys { } # 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. +# 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(); @@ -385,7 +391,7 @@ sub _check_trans_split_multiple_credit_and_debit { } # Problemfall: Buchungen, bei denen Steuersummen nicht mit den Summen -# übereinstimmen, die nach ausgewähltem Steuerschlüssel hätten auftreten müssen. +# übereinstimmen, die nach ausgewähltem Steuerschlüssel hätten auftreten müssen. sub _check_trans_wrong_taxkeys { $main::lxdebug->enter_sub(); @@ -510,16 +516,16 @@ sub _check_trans_wrong_taxkeys { return $retval; } -# Inaktiver Code für das Erraten möglicher Verteilungen von -# Steuerschlüsseln. Deaktiviert, weil er exponentiell Zeit -# benötigt. +# 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 +# # Ü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; @@ -533,7 +539,7 @@ sub _check_trans_wrong_taxkeys { # while ($num_entries == scalar @taxkey_indices) { # my @tax_cache = (); -# # Berechnen der Steuersumme für die aktuell angenommenen Steuerschlüssel. +# # 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]]; @@ -543,9 +549,9 @@ sub _check_trans_wrong_taxkeys { # $tax_sum += $tax_cache[$i]; # } -# # Entspricht die Steuersumme mit den aktuell angenommenen Steuerschlüsseln +# # Entspricht die Steuersumme mit den aktuell angenommenen Steuerschlüsseln # # der verbuchten Steuersumme? Wenn ja, dann ist das eine potenzielle -# # Lösung. +# # Lösung. # if (abs($tax_sum - $data{$side}->{tax_sum}) < 0.02) { # push @solutions, { # 'taxkeys' => [ @potential_taxkeys[@taxkey_indices] ], @@ -553,8 +559,8 @@ sub _check_trans_wrong_taxkeys { # } # } -# # Weiterzählen der Steuerschlüsselindices zum Interieren über -# # alle möglichen Kombinationen. +# # Weiterzählen der Steuerschlüsselindices zum Interieren über +# # alle möglichen Kombinationen. # my $i = 0; # while (1) { # $taxkey_indices[$i]++; @@ -648,6 +654,8 @@ sub analyze { my @problems = @{ $self->{problems} }; + map { $self->{$_} ||= [] } qw(ap_ar_taxkey_problems invoice_inventory_taxkey_problems missing_taxkeys_in_invoices); + if (0 != scalar @{ $self->{ap_ar_taxkey_problems} }) { my $problem = { 'type' => 'ap_ar_wrong_taxkeys', @@ -691,7 +699,7 @@ sub fix_ap_ar_wrong_taxkeys { my $myconfig = \%main::myconfig; my $form = $main::form; - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + my $dbh = $params{dbh} || SL::DB->client->dbh; my $query = qq|SELECT 'ap' AS module, at.acc_trans_id, at.trans_id, at.chart_id, at.amount, at.taxkey, at.transdate, @@ -771,24 +779,25 @@ sub fix_ap_ar_wrong_taxkeys { } if (scalar @corrections) { - my $q_taxkey_only = qq|UPDATE acc_trans SET taxkey = ? WHERE acc_trans_id = ?|; - 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 acc_trans_id = ?|; - 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->{acc_trans_id}); - } else { - do_statement($form, $h_taxkey_only, $q_taxkey_only, $entry->{taxkey}, $entry->{acc_trans_id}); + SL::DB->client->with_transaction(sub { + my $q_taxkey_only = qq|UPDATE acc_trans SET taxkey = ? WHERE acc_trans_id = ?|; + 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 acc_trans_id = ?|; + 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->{acc_trans_id}); + } else { + do_statement($form, $h_taxkey_only, $q_taxkey_only, $entry->{taxkey}, $entry->{acc_trans_id}); + } } - } - - $h_taxkey_only->finish(); - $h_taxkey_chart_id->finish(); - $dbh->commit() unless ($params{dbh}); + $h_taxkey_only->finish(); + $h_taxkey_chart_id->finish(); + 1; + }) or do { die SL::DB->client->error }; } $main::lxdebug->leave_sub(); @@ -800,10 +809,14 @@ sub fix_invoice_inventory_with_taxkeys { my $self = shift; my %params = @_; + # ist nur für bestandsmethode notwendig. bei der Aufwandsmethode + # können Warenkonten mit Steuerschlüssel sein (5400 in SKR04) + return 0 if $::instance_conf->get_inventory_system eq 'periodic'; + my $myconfig = \%main::myconfig; my $form = $main::form; - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); + my $dbh = $params{dbh} || SL::DB->client->dbh; my $query = qq|SELECT at.*, c.link FROM acc_trans at @@ -851,17 +864,17 @@ sub fix_invoice_inventory_with_taxkeys { } if (@corrections) { - $query = qq|UPDATE acc_trans SET taxkey = 0 WHERE acc_trans_id = ?|; - $sth = prepare_query($form, $dbh, $query); + SL::DB->client->with_transaction(sub { + $query = qq|UPDATE acc_trans SET taxkey = 0 WHERE acc_trans_id = ?|; + $sth = prepare_query($form, $dbh, $query); - foreach my $acc_trans_id (@corrections) { - do_statement($form, $sth, $query, $acc_trans_id); - } - - $sth->finish(); + foreach my $acc_trans_id (@corrections) { + do_statement($form, $sth, $query, $acc_trans_id); + } - $dbh->commit() unless ($params{dbh}); -# $dbh->rollback(); + $sth->finish(); + 1; + }) or do { die SL::DB->client->error }; } $main::lxdebug->leave_sub(); @@ -878,41 +891,41 @@ sub fix_wrong_taxkeys { 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 acc_trans_id = ?|; - my $h_taxkey_only = prepare_query($form, $dbh, $q_taxkey_only); + my $dbh = $params{dbh} || SL::DB->client->dbh; - my $q_taxkey_chart = qq|UPDATE acc_trans SET taxkey = ?, chart_id = ? WHERE acc_trans_id = ?|; - my $h_taxkey_chart = prepare_query($form, $dbh, $q_taxkey_chart); + SL::DB->client->with_transaction(sub { + my $q_taxkey_only = qq|UPDATE acc_trans SET taxkey = ? WHERE acc_trans_id = ?|; + my $h_taxkey_only = prepare_query($form, $dbh, $q_taxkey_only); - my $q_transdate = qq|SELECT transdate FROM acc_trans WHERE acc_trans_id = ?|; - my $h_transdate = prepare_query($form, $dbh, $q_transdate); + my $q_taxkey_chart = qq|UPDATE acc_trans SET taxkey = ?, chart_id = ? WHERE acc_trans_id = ?|; + my $h_taxkey_chart = prepare_query($form, $dbh, $q_taxkey_chart); - foreach my $fix (@{ $params{fixes} }) { - next unless ($fix->{acc_trans_id}); + my $q_transdate = qq|SELECT transdate FROM acc_trans WHERE acc_trans_id = ?|; + my $h_transdate = prepare_query($form, $dbh, $q_transdate); - do_statement($form, $h_taxkey_only, $q_taxkey_only, conv_i($fix->{taxkey}), conv_i($fix->{acc_trans_id})); + foreach my $fix (@{ $params{fixes} }) { + next unless ($fix->{acc_trans_id}); - next unless ($fix->{tax_entry_acc_trans_id}); + do_statement($form, $h_taxkey_only, $q_taxkey_only, conv_i($fix->{taxkey}), conv_i($fix->{acc_trans_id})); - do_statement($form, $h_transdate, $q_transdate, conv_i($fix->{tax_entry_acc_trans_id})); - my ($transdate) = $h_transdate->fetchrow_array(); + next unless ($fix->{tax_entry_acc_trans_id}); - my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $transdate); - my $tax_info = $all_taxes{taxkeys}->{ $fix->{taxkey} }; + do_statement($form, $h_transdate, $q_transdate, conv_i($fix->{tax_entry_acc_trans_id})); + my ($transdate) = $h_transdate->fetchrow_array(); - next unless ($tax_info); + my %all_taxes = $self->{taxkeys}->get_full_tax_info('transdate' => $transdate); + my $tax_info = $all_taxes{taxkeys}->{ $fix->{taxkey} }; - do_statement($form, $h_taxkey_chart, $q_taxkey_chart, conv_i($fix->{taxkey}), conv_i($tax_info->{taxchart_id}), conv_i($fix->{tax_entry_acc_trans_id})); - } + next unless ($tax_info); - $h_taxkey_only->finish(); - $h_taxkey_chart->finish(); - $h_transdate->finish(); + do_statement($form, $h_taxkey_chart, $q_taxkey_chart, conv_i($fix->{taxkey}), conv_i($tax_info->{taxchart_id}), conv_i($fix->{tax_entry_acc_trans_id})); + } -# $dbh->rollback(); - $dbh->commit() unless ($params{dbh}); + $h_taxkey_only->finish(); + $h_taxkey_chart->finish(); + $h_transdate->finish(); + 1; + }) or do { die SL::DB->client->error }; $main::lxdebug->leave_sub(); } @@ -928,19 +941,19 @@ sub delete_transaction { 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})); + my $dbh = $params{dbh} || SL::DB->client->dbh; - 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})); + SL::DB->client->with_transaction(sub { + 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})); -# $dbh->rollback(); - $dbh->commit() unless ($params{dbh}); + 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})); + 1; + }) or do { die SL::DB->client->error }; $main::lxdebug->leave_sub(); }