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;
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);
}
}
- # 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';
}
# 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;
}
# 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;
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();
}
# 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();
}
# 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();
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;
# 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]];
# $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] ],
# }
# }
-# # 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]++;
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',
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,
}
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();
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
}
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();
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();
}
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();
}