- my $tax_rate = 1 + $taxes{ $taxid_taxkeys{$trans->[$j]->{'taxkey'}} };
- $new_trans{'amount'} = $form->round_amount(($trans->[$j]->{'amount'} * $tax_rate * -1), 2);
- $new_trans{'umsatz'} = abs($form->round_amount(($trans->[$j]->{'amount'} * $tax_rate), 2)) * $ml;
- $trans->[$j]->{'umsatz'} = abs($form->round_amount(($trans->[$j]->{'amount'} * $tax_rate), 2)) * $ml;
+ my $tax_rate = $tax_info{taxkeys}->{ $trans->[$j]->{'taxkey'} }->{taxrate};
+ $new_trans{'net_amount'} = $trans->[$j]->{'amount'} * -1;
+ $new_trans{'tax_rate'} = 1 + $tax_rate;
+
+ if (!$trans->[$j]->{'invoice'}) {
+ $new_trans{'amount'} = $form->round_amount(-1 * ($trans->[$j]->{amount} + $trans->[$j]->{tax_amount}), 2);
+ $new_trans{'umsatz'} = abs($new_trans{'amount'}) * $ml;
+ $trans->[$j]->{'umsatz'} = $new_trans{'umsatz'};
+ $absumsatz += -1 * $new_trans{'amount'};
+
+ } else {
+ my $unrounded = $trans->[$j]->{'amount'} * (1 + $tax_rate) * -1 + $rounding_error;
+ my $rounded = $form->round_amount($unrounded, 2);
+
+ $rounding_error = $unrounded - $rounded;
+ $new_trans{'amount'} = $rounded;
+ $new_trans{'umsatz'} = abs($rounded) * $ml;
+ $trans->[$j]->{'umsatz'} = $new_trans{umsatz};
+ $absumsatz -= $rounded;
+ }
+
+ push @{ $form->{DATEV} }, [ \%new_trans, $trans->[$j] ];
+ push @taxed, $form->{DATEV}->[-1];
+ }
+ }
+
+ my $idx = 0;
+ my $correction = 0;
+ while ((abs($absumsatz) >= 0.01) && (abs($absumsatz) < 1.00)) {
+ if ($idx >= scalar @taxed) {
+ last if (!$correction);
+
+ $correction = 0;
+ $idx = 0;
+ }
+
+ my $transaction = $taxed[$idx]->[0];
+
+ my $old_amount = $transaction->{amount};
+ my $old_correction = $correction;
+ my @possible_diffs;