From: Jan Büren Date: Wed, 16 Mar 2022 07:10:08 +0000 (+0100) Subject: Kreditorenbeleg prinzipiell um reverse_charge für beliebige Steuerschlüssel erw. X-Git-Tag: kivitendo-mebil_0.1-0~10^2~2^2~81 X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=commitdiff_plain;h=5a1856a8dc3dfc32759713c23ac40c93fe8ae598 Kreditorenbeleg prinzipiell um reverse_charge für beliebige Steuerschlüssel erw. Sobald eine Steuer ein Gegenkonto (reverse_charge_chart_id) besitzt wird die Steuer immer gespiegelt gebucht. Unabhängig vom Steuersatz oder Steuerschlüssel. --- diff --git a/SL/AP.pm b/SL/AP.pm index 2e3bbd6db..d399b7c1b 100644 --- a/SL/AP.pm +++ b/SL/AP.pm @@ -428,10 +428,6 @@ sub _post_transaction { sub _reverse_charge { my ($self, $myconfig, $form) = @_; - # check taxkey settings or return - my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => 94 ]); - return unless ref $tax eq 'SL::DB::Tax'; - # delete previous bookings, if they exists (repost) my $ap_gl = SL::DB::Manager::ApGl->get_first(where => [ ap_id => $form->{id} ]); my $gl_id = ref $ap_gl eq 'SL::DB::ApGl' ? $ap_gl->gl_id : undef; @@ -440,20 +436,22 @@ sub _reverse_charge { SL::DB::Manager::ApGl-> delete_all(where => [ ap_id => $form->{id} ]) if $gl_id; SL::DB::Manager::RecordLink-> delete_all(where => [ from_table => 'ap', to_table => 'gl', from_id => $form->{id} ]); - # gl booking - my ($credit, $debit); - $credit = SL::DB::Manager::Chart->find_by(id => $tax->chart_id); - $debit = SL::DB::Manager::Chart->find_by(id => $tax->reverse_charge_chart_id); - - croak("No such Chart ID" . $tax->chart_id) unless ref $credit eq 'SL::DB::Chart'; - croak("No such Chart ID" . $tax->reverse_chart_id) unless ref $debit eq 'SL::DB::Chart'; - my ($i, $current_transaction); for $i (1 .. $form->{rowcount}) { - next unless $form->{"taxkey_$i"} == 94; - my ($tmpnetamount, $tmptaxamount) = $form->calculate_tax($form->{"amount_$i"}, 0.19, $form->{taxincluded}, 2); + my $tax = SL::DB::Manager::Tax->get_first( where => [id => $form->{"tax_id_$i"}, '!reverse_charge_chart_id' => undef ]); + next unless ref $tax eq 'SL::DB::Tax'; + + # gl booking + my ($credit, $debit); + $credit = SL::DB::Manager::Chart->find_by(id => $tax->chart_id); + $debit = SL::DB::Manager::Chart->find_by(id => $tax->reverse_charge_chart_id); + + croak("No such Chart ID" . $tax->chart_id) unless ref $credit eq 'SL::DB::Chart'; + croak("No such Chart ID" . $tax->reverse_chart_id) unless ref $debit eq 'SL::DB::Chart'; + + my ($tmpnetamount, $tmptaxamount) = $form->calculate_tax($form->{"amount_$i"}, $tax->rate, $form->{taxincluded}, 2); $current_transaction = SL::DB::GLTransaction->new( employee_id => $form->{employee_id}, transdate => $form->{transdate}, @@ -466,10 +464,12 @@ sub _reverse_charge { chart => $tmptaxamount > 0 ? $debit : $credit, debit => abs($tmptaxamount), source => "Reverse Charge for " . $form->{invnumber}, + tax_id => 0, )->add_chart_booking( chart => $tmptaxamount > 0 ? $credit : $debit, credit => abs($tmptaxamount), source => "Reverse Charge for " . $form->{invnumber}, + tax_id => 0, )->post; # add a stable link from ap to gl my %props_gl = ( diff --git a/bin/mozilla/ap.pl b/bin/mozilla/ap.pl index 3c1386e0d..0e3048ab6 100644 --- a/bin/mozilla/ap.pl +++ b/bin/mozilla/ap.pl @@ -496,9 +496,11 @@ sub form_header { $form->{"taxcharts_$i"} = \@taxcharts; # reverse charge hack for template, display two taxes - if ($taxchart_to_use->taxkey == 94) { + if ($taxchart_to_use->reverse_charge_chart_id) { my $tmpnetamount; - ($tmpnetamount, $form->{"tax_reverse_$i"}) = $form->calculate_tax($form->parse_amount(\%myconfig, $form->{"amount_$i"}), 0.19, $form->{taxincluded},2); + ($tmpnetamount, $form->{"tax_reverse_$i"}) = $form->calculate_tax($form->parse_amount(\%myconfig, $form->{"amount_$i"}), + $taxchart_to_use->rate, $form->{taxincluded}, 2 ); + $form->{"tax_charge_$i"} = $form->{"tax_reverse_$i"} * -1; $form->{"tax_reverse_$i"} = $form->format_amount(\%myconfig, $form->{"tax_reverse_$i"}, 2); $form->{"tax_charge_$i"} = $form->format_amount(\%myconfig, $form->{"tax_charge_$i"}, 2); @@ -807,14 +809,15 @@ sub post { $form->error($locale->text('Cannot post transaction for a closed period!')) if ($form->date_closed($form->{"transdate"}, \%myconfig)); my $zero_amount_posting = 1; - # no taxincluded for 94 - my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => 94 ]); - my $tax_id = ref $tax eq 'SL::DB::Tax' ? $tax->id : undef; for my $i (1 .. $form->{rowcount}) { - # no taxincluded for 94 - if ($tax_id && $form->{"taxchart_$i"} =~ m/^$tax_id--/ && $form->{taxincluded}) { + + # no taxincluded for reverse charge + my ($used_tax_id) = split(/--/, $form->{"taxchart_$i"}); + my $tax = SL::DB::Manager::Tax->find_by(id => $used_tax_id); + if ($tax->reverse_charge_chart_id && $form->{taxincluded}) { $form->error($locale->text('Cannot Post AP transaction with tax included!')); } + if ($form->parse_amount(\%myconfig, $form->{"amount_$i"})) { $zero_amount_posting = 0; }