package AccTransCorrections;
 
+use utf8;
 use strict;
 
 use List::Util qw(first);
     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 $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;