+sub generate_datev_lines {
+ my ($self) = @_;
+
+ my @datev_lines = ();
+
+ foreach my $transaction ( @{ $self->{DATEV} } ) {
+
+ # each $transaction entry contains data from several acc_trans entries
+ # belonging to the same trans_id
+
+ my %datev_data = (); # data for one transaction
+ my $trans_lines = scalar(@{$transaction});
+
+ my $umsatz = 0;
+ my $gegenkonto = "";
+ my $konto = "";
+ my $belegfeld1 = "";
+ my $datum = "";
+ my $waehrung = "";
+ my $buchungstext = "";
+ my $belegfeld2 = "";
+ my $datevautomatik = 0;
+ my $taxkey = 0;
+ my $charttax = 0;
+ my $ustid ="";
+ my ($haben, $soll);
+ for (my $i = 0; $i < $trans_lines; $i++) {
+ if ($trans_lines == 2) {
+ if (abs($transaction->[$i]->{'amount'}) > abs($umsatz)) {
+ $umsatz = $transaction->[$i]->{'amount'};
+ }
+ } else {
+ if (abs($transaction->[$i]->{'umsatz'}) > abs($umsatz)) {
+ $umsatz = $transaction->[$i]->{'umsatz'};
+ }
+ }
+ if ($transaction->[$i]->{'datevautomatik'}) {
+ $datevautomatik = 1;
+ }
+ if ($transaction->[$i]->{'taxkey'}) {
+ $taxkey = $transaction->[$i]->{'taxkey'};
+ }
+ if ($transaction->[$i]->{'charttax'}) {
+ $charttax = $transaction->[$i]->{'charttax'};
+ }
+ if ($transaction->[$i]->{'amount'} > 0) {
+ $haben = $i;
+ } else {
+ $soll = $i;
+ }
+ }
+
+ if ($trans_lines >= 2) {
+
+ $datev_data{'gegenkonto'} = $transaction->[$haben]->{'accno'};
+ $datev_data{'konto'} = $transaction->[$soll]->{'accno'};
+ if ($transaction->[$haben]->{'invnumber'} ne "") {
+ $datev_data{belegfeld1} = $transaction->[$haben]->{'invnumber'};
+ }
+ $datev_data{datum} = $transaction->[$haben]->{'transdate'};
+ $datev_data{waehrung} = 'EUR';
+ $datev_data{kost1} = $transaction->[$haben]->{'departmentdescription'};
+ $datev_data{kost2} = $transaction->[$haben]->{'projectdescription'};
+
+ if ($transaction->[$haben]->{'name'} ne "") {
+ $datev_data{buchungstext} = $transaction->[$haben]->{'name'};
+ }
+ if (($transaction->[$haben]->{'ustid'} // '') ne "") {
+ $datev_data{ustid} = $transaction->[$haben]->{'ustid'};
+ }
+ if (($transaction->[$haben]->{'duedate'} // '') ne "") {
+ $datev_data{belegfeld2} = $transaction->[$haben]->{'duedate'};
+ }
+ }
+ $datev_data{soll_haben_kennzeichen} = (0 < $umsatz) ? 'H' : 'S';
+ $datev_data{umsatz} = abs($umsatz); # sales invoices without tax have a different sign???
+
+ # Dies ist die einzige Stelle die datevautomatik auswertet. Was soll gesagt werden?
+ # Im Prinzip hat jeder acc_trans Eintrag einen Steuerschlüssel, außer, bei gewissen Fällen
+ # wie: Kreditorenbuchung mit negativen Vorzeichen, SEPA-Export oder Rechnungen die per
+ # Skript angelegt werden.
+ # Also falls ein Steuerschlüssel da ist und NICHT datevautomatik diesen Block hinzufügen.
+ # Oder aber datevautomatik ist WAHR, aber der Steuerschlüssel in der acc_trans weicht
+ # von dem in der Chart ab: Also wahrscheinlich Programmfehler (NULL übergeben, statt
+ # DATEV-Steuerschlüssel) oder der Steuerschlüssel des Kontos weicht WIRKLICH von dem Eintrag in der
+ # acc_trans ab. Gibt es für diesen Fall eine plausiblen Grund?
+ #
+
+ # only set buchungsschluessel if the following conditions are met:
+ if ( ( $datevautomatik || $taxkey)
+ && (!$datevautomatik || ($datevautomatik && ($charttax ne $taxkey)))) {
+ # $datev_data{buchungsschluessel} = !$datevautomatik ? $taxkey : "4";
+ $datev_data{buchungsschluessel} = $taxkey;
+ }
+
+ push(@datev_lines, \%datev_data);
+ }
+
+ # example of modifying export data:
+ # foreach my $datev_line ( @datev_lines ) {
+ # if ( $datev_line{"konto"} eq '1234' ) {
+ # $datev_line{"konto"} = '9999';
+ # }
+ # }
+ #
+
+ return \@datev_lines;
+}
+
+