X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/a6a97a5fb2ea27466c69d6d4bd7472c9c12fec05..321bd6025faf943442b6a125faa30cfaee34fdda:/SL/DB/Helper/Payment.pm diff --git a/SL/DB/Helper/Payment.pm b/SL/DB/Helper/Payment.pm index a778e927f..8d0174d9b 100644 --- a/SL/DB/Helper/Payment.pm +++ b/SL/DB/Helper/Payment.pm @@ -77,6 +77,7 @@ sub pay_invoice { }; # currency is either passed or use the invoice currency if it differs from the default currency + # TODO remove my ($exchangerate,$currency); if ($params{currency} || $params{currency_id} || $self->currency_id != $::instance_conf->get_currency_id) { if ($params{currency} || $params{currency_id} ) { # currency was specified @@ -290,6 +291,67 @@ sub pay_invoice { $arap_booking->save; push @new_acc_ids, $arap_booking->acc_trans_id; + # hook for invoice_for_advance_payment DATEV always pairs, acc_trans_id has to be higher than arap_booking ;-) + if ($self->invoice_type eq 'invoice_for_advance_payment') { + my $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 $clearing_chart eq 'SL::DB::Chart'; + + # what does ptc say + my %inv_calc = $self->calculate_prices_and_taxes(); + my @trans_ids = keys %{ $inv_calc{amounts} }; + die "Invalid state for advance payment 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}; + } + if ($tax and $tax->rate != 0) { + my ($netamount, $taxamount); + my $roundplaces = 2; + # we dont have a clue about skonto, that's why we use $arap_amount as taxincluded + ($netamount, $taxamount) = Form->calculate_tax($arap_amount, $tax->rate, 1, $roundplaces); + # for debugging database set + my $fullmatch = $netamount == $entry->{amount} ? '::netamount total true' : ''; + 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'; + + my $arap_full_booking= SL::DB::AccTransaction->new(trans_id => $self->id, + chart_id => $clearing_chart->id, + chart_link => $clearing_chart->link, + amount => $arap_amount * -1, # full amount + transdate => $transdate_obj, + source => 'Automatic Tax Booking for Payment in Advance' . $fullmatch, + taxkey => 0, + tax_id => SL::DB::Manager::Tax->find_by(taxkey => 0)->id); + $arap_full_booking->save; + push @new_acc_ids, $arap_full_booking->acc_trans_id; + + my $arap_tax_booking= SL::DB::AccTransaction->new(trans_id => $self->id, + chart_id => $transfer_chart->id, + chart_link => $transfer_chart->link, + amount => _round($netamount), # full amount + transdate => $transdate_obj, + source => 'Automatic Tax Booking for Payment in Advance' . $fullmatch, + taxkey => $tax->taxkey, + tax_id => $tax->id); + $arap_tax_booking->save; + push @new_acc_ids, $arap_tax_booking->acc_trans_id; + + my $tax_booking= SL::DB::AccTransaction->new(trans_id => $self->id, + chart_id => $tax->chart_id, + chart_link => $tax->chart->link, + amount => _round($taxamount), + transdate => $transdate_obj, + source => 'Automatic Tax Booking for Payment in Advance' . $fullmatch, + taxkey => 0, + tax_id => SL::DB::Manager::Tax->find_by(taxkey => 0)->id); + + $tax_booking->save; + push @new_acc_ids, $tax_booking->acc_trans_id; + } + } $fx_gain_loss_amount *= -1 if $self->is_sales; $self->paid($self->paid + _round($paid_amount) + $fx_gain_loss_amount) if $paid_amount; $self->datepaid($transdate_obj); @@ -778,7 +840,10 @@ to be lower than the payment or open invoice amount. Transdate can either be a date object or a date string. Chart_id is the id of the payment booking chart. -Amount is either a postive or negative number, but never 0. +Amount is either a positive or negative number, but never 0. + +CAVEAT! The helper tries to get the sign right and all calls from BankTransaction are +positive (abs($value)) values. Example: