+ # Sanity checks for invoices for advance payment and final invoices
+ my $advance_payment_clearing_chart;
+ if (any { $_ eq $form->{type} } qw(invoice_for_advance_payment final_invoice)) {
+ $advance_payment_clearing_chart = SL::DB::Chart->new(id => $::instance_conf->get_advance_payment_clearing_chart_id)->load;
+ die "No Clearing Chart for Advance Payment" unless ref $advance_payment_clearing_chart eq 'SL::DB::Chart';
+
+ my @current_taxaccounts = (split(/ /, $form->{taxaccounts}));
+ die 'Wrong call: Cannot post invoice for advance payment or final invoice with more than one tax' if (scalar @current_taxaccounts > 1);
+
+ my @trans_ids = keys %{ $form->{amount} };
+ if (scalar @trans_ids > 1) {
+ require Data::Dumper;
+ die "Invalid state for advance payment more than one trans_id " . Dumper($form->{amount});
+ }
+ }
+
+ my $iap_amounts;
+ if ($form->{type} eq 'final_invoice') {
+ my $id_for_iap = $form->{convert_from_oe_ids} || $form->{convert_from_ar_ids} || $form->{id};
+ my $from_order = !!$form->{convert_from_oe_ids};
+ my $invoices_for_advance_payment = $self->_get_invoices_for_advance_payment($id_for_iap, $from_order);
+ if (scalar @$invoices_for_advance_payment > 0) {
+ # reverse booking for invoices for advance payment
+ foreach my $invoice_for_advance_payment (@$invoices_for_advance_payment) {
+ # delete ?
+ # --> is implemented below (bookings are marked in memo field)
+ #
+ # TODO: helper table acc_trans_advance_payment
+ # trans_id for final invoice connects to acc_trans_id here
+ # my $booking = SL::DB::AccTrans->new( ...)
+ # --> helper table not nessessary because of mark in memo field
+ #
+ # TODO: If final_invoice change (delete storno) delete all connectin acc_trans entries, if
+ # period is not closed
+ # --> no problem because gldate of reverse booking is date of final invoice
+ # if deletion of final invoice is allowed, reverting bookings in invoices
+ # for advance payment are allowed, too.
+ # $booking->id, $self->id in helper table
+ if (!$already_booked) {
+ # move all netamount to correct transfer chart (19% or 7%)
+ my %inv_calc = $invoice_for_advance_payment->calculate_prices_and_taxes();
+ my @trans_ids = keys %{ $inv_calc{amounts} };
+ die "Invalid state for advance payment invoice,more than one trans_id" if (scalar @trans_ids > 1);
+ my $entry = delete $inv_calc{amounts}{$trans_ids[0]};
+ my $tax;
+ if ($entry->{tax_id}) {
+ $tax = SL::DB::Manager::Tax->find_by(id => $entry->{tax_id}); # || die "Can't find tax with id " . $entry->{tax_id};
+ }
+ # no tax, no prob
+ if ($tax and $tax->rate != 0) {
+ my $transfer_chart = $tax->taxkey == 2 ? SL::DB::Chart->new(id => $::instance_conf->get_advance_payment_taxable_7_id)->load
+ : $tax->taxkey == 3 ? SL::DB::Chart->new(id => $::instance_conf->get_advance_payment_taxable_19_id)->load
+ : undef;
+ die "No Transfer Chart for Advance Payment" unless ref $transfer_chart eq 'SL::DB::Chart';
+ $form->{amount}->{$invoice_for_advance_payment->id}->{$transfer_chart->accno} = -1 * $invoice_for_advance_payment->netamount;
+ $form->{memo} ->{$invoice_for_advance_payment->id}->{$transfer_chart->accno} = 'reverse booking by final invoice';
+ # AR
+ $form->{amount}->{$invoice_for_advance_payment->id}->{$form->{AR}} = $invoice_for_advance_payment->netamount;
+ $form->{memo} ->{$invoice_for_advance_payment->id}->{$form->{AR}} = 'reverse booking by final invoice';
+ }
+ }
+
+ # VAT for invoices for advance payment is booked on payment of these. So do not book this VAT for final invoice.
+ # And book the amount of the invoices for advance payment with taxkey 0 (see below).
+ # Collect amounts and VAT of invoices for advance payment.
+
+ # Set sellprices to fxsellprices for items, because
+ # the PriceTaxCalculator sets fxsellprice from sellprice before calculating.
+ $_->sellprice($_->fxsellprice) for @{$invoice_for_advance_payment->items};
+ my %pat = $invoice_for_advance_payment->calculate_prices_and_taxes;
+
+ foreach my $tax_chart_id (keys %{ $pat{taxes_by_chart_id} }) {
+ my $tax_accno = SL::DB::Chart->load_cached($tax_chart_id)->accno;
+ $form->{amount}{ $form->{id} }{$tax_accno} -= $pat{taxes_by_chart_id}->{$tax_chart_id};
+ $form->{amount}{ $form->{id} }{$form->{AR}} += $pat{taxes_by_chart_id}->{$tax_chart_id};
+ }