]> wagnertech.de Git - mfinanz.git/blobdiff - SL/DB/Helper/Payment.pm
Payment-Helper _skonto_charts... debugs und kommentare aufgerÀumt
[mfinanz.git] / SL / DB / Helper / Payment.pm
index 05de1637720f566bd953fb2a3226a10f8cd3ff16..6db8951c911f7b3b114553306b26250a40159a1e 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 
 use parent qw(Exporter);
 our @EXPORT = qw(pay_invoice);
-our @EXPORT_OK = qw(skonto_date skonto_charts amount_less_skonto within_skonto_period percent_skonto reference_account reference_amount open_amount open_percent remaining_skonto_days skonto_amount check_skonto_configuration valid_skonto_amount get_payment_suggestions validate_payment_type open_sepa_transfer_amount get_payment_select_options_for_bank_transaction exchangerate forex _skonto_charts_and_tax_correction);
+our @EXPORT_OK = qw(skonto_date amount_less_skonto within_skonto_period percent_skonto reference_account reference_amount open_amount open_percent remaining_skonto_days skonto_amount check_skonto_configuration valid_skonto_amount get_payment_suggestions validate_payment_type open_sepa_transfer_amount get_payment_select_options_for_bank_transaction exchangerate forex _skonto_charts_and_tax_correction);
 our %EXPORT_TAGS = (
   "ALL" => [@EXPORT, @EXPORT_OK],
 );
@@ -581,33 +581,34 @@ sub _skonto_charts_and_tax_correction {
   croak "no amount passed to skonto_charts"                    unless abs(_round($amount)) >= 0.01;
   croak "no banktransaction.id passed to skonto_charts"        unless $params{bt_id};
   croak "no banktransaction.transdate passed to skonto_charts" unless ref $params{transdate_obj} eq 'DateTime';
-  #$main::lxdebug->message(0, 'id der transaktion' . $params{bt_id});
-  #$main::lxdebug->message(0, 'wert des skontos:' . $amount);
+
   my $is_sales = $self->is_sales;
   my (@skonto_charts, $inv_calc, $total_skonto_rounded);
+
   $inv_calc = $self->get_tax_and_amount_by_tax_chart_id();
-  #$main::lxdebug->message(0, 'lulu' . Dumper($inv_calc));
-  while (my ($tax_chart_id, $entry) = each %{ $inv_calc } ) {  # foreach tax key = tax.id
-    #$main::lxdebug->message(0, 'was hier:' . $tax_chart_id);
+
+  # foreach tax.chart_id || $entry->{ta..id}
+  while (my ($tax_chart_id, $entry) = each %{ $inv_calc } ) {
     my $tax = SL::DB::Manager::Tax->find_by(id => $entry->{tax_id}) || die "Can't find tax with id " . $tax_chart_id;
     die t8('no skonto_chart configured for taxkey #1 : #2 : #3', $tax->taxkey, $tax->taxdescription , $tax->rate * 100)
       unless $is_sales ? ref $tax->skonto_sales_chart : ref $tax->skonto_purchase_chart;
-    #$main::lxdebug->message(0, 'was dort:' . $tax->id);
+
+    # percent net amount
     my $transaction_net_skonto_percent = abs($entry->{netamount} / $self->amount);
     my $skonto_netamount_unrounded     = abs($amount * $transaction_net_skonto_percent);
-    #$main::lxdebug->message(0, 'ungerundet netto:' . $skonto_netamount_unrounded);
-    # divide for tax
+
+    # percent tax amount
     my $transaction_tax_skonto_percent = abs($entry->{tax} / $self->amount);
     my $skonto_taxamount_unrounded     = abs($amount * $transaction_tax_skonto_percent);
-    #$main::lxdebug->message(0, 'ungerundet steuer:' . $skonto_taxamount_unrounded);
+
     my $skonto_taxamount_rounded   = _round($skonto_taxamount_unrounded);
     my $skonto_netamount_rounded   = _round($skonto_netamount_unrounded);
     my $chart_id                   = $is_sales ? $tax->skonto_sales_chart->id : $tax->skonto_purchase_chart->id;
 
+    # entry net + tax for caller
     my $rec_net = {
       chart_id               => $chart_id,
       skonto_amount          => _round($skonto_netamount_unrounded + $skonto_taxamount_unrounded),
-      # skonto_amount          => _round($skonto_netamount_unrounded) + _round($skonto_taxamount_unrounded),
     };
     push @skonto_charts, $rec_net;
     $total_skonto_rounded += $rec_net->{skonto_amount};
@@ -645,24 +646,7 @@ sub _skonto_charts_and_tax_correction {
          tax_id => 0,
       )->post;
 
-    ## add a stable link from ap to gl
-    # not needed, BankTransactionAccTrans is already stable
-    # furthermore the origin of the booking is the bank_transaction
-    #my $arap = $self->is_sales ? 'ar' : 'ap';
-    #my %props_gl = (
-    #  $arap . _id => $self->id,
-    #  gl_id => $current_transaction->id,
-    #  datev_export => 1,
-    #);
-    #if ($arap eq 'ap') {
-    #  require SL::DB::ApGl;
-    #  SL::DB::ApGl->new(%props_gl)->save;
-    #} elsif ($arap eq 'ar') {
-    #  require SL::DB::ArGl;
-    #  SL::DB::ArGl->new(%props_gl)->save;
-    #} else { die "Invalid state"; }
-    #push @new_acc_ids, map { $_->acc_trans_id } @{ $current_transaction->transactions };
-
+    # add a stable link acc_trans_id to bank_transactions.id
     foreach my $transaction (@{ $current_transaction->transactions }) {
       my %props_acc = (
            acc_trans_id        => $transaction->acc_trans_id,
@@ -672,7 +656,6 @@ sub _skonto_charts_and_tax_correction {
       SL::DB::BankTransactionAccTrans->new(%props_acc)->save;
     }
     # Record a record link from banktransactions to gl
-    # caller has to assign param bt_id
     my %props_rl = (
          from_table => 'bank_transactions',
          from_id    => $params{bt_id},
@@ -693,126 +676,22 @@ sub _skonto_charts_and_tax_correction {
 
   }
   # check for rounding errors, at least for the payment chart
-  # we ignore tax rounding errors as long as the user or calculated
-  # amount of skonto is fully assigned
+  # we ignore tax rounding errors as long as the amount (user input or calculated)
+  # is fully assigned.
   # we simply alter one cent for the first skonto booking entry
   # should be correct for most of the cases (no invoices with mixed taxes)
   if ($total_skonto_rounded - $amount > 0.01) {
     # add one cent
-    $main::lxdebug->message(0, 'Una mas!' . $total_skonto_rounded);
     $skonto_charts[0]->{skonto_amount} -= 0.01;
   } elsif ($amount - $total_skonto_rounded > 0.01) {
     # subtract one cent
-    $main::lxdebug->message(0, 'Una menos!' . $total_skonto_rounded);
     $skonto_charts[0]->{skonto_amount} += 0.01;
-  } else { $main::lxdebug->message(0, 'No rounding error');  }
+  }
 
   # return same array of skonto charts as sub skonto_charts
   return @skonto_charts;
 }
 
-sub skonto_charts {
-  my $self = shift;
-
-  # TODO: use param for amount, may also want to calculate skonto_amounts by
-  # passing percentage in the future
-
-  my $amount = shift || $self->skonto_amount;
-
-  croak "no amount passed to skonto_charts" unless abs(_round($amount)) >= 0.01;
-
-  # TODO: check whether there are negative values in invoice / acc_trans ... credited items
-
-  # don't check whether skonto applies, because user may want to override this
-  # return undef unless $self->percent_skonto;
-
-  my $is_sales = ref($self) eq 'SL::DB::Invoice';
-
-  my $mult = $is_sales ? 1 : -1;  # multiplier for getting the right sign
-
-  my @skonto_charts;  # resulting array with all income/expense accounts that have to be corrected
-
-  # calculate effective skonto (percentage) in difference_as_skonto mode
-  # only works if there are no negative acc_trans values
-  my $effective_skonto_rate = $amount ? $amount / $self->amount : 0;
-
-  # checks:
-  my $total_skonto_amount  = 0;
-  my $total_rounding_error = 0;
-
-  my $reference_ARAP_amount = 0;
-
-  # my $transactions = $self->transactions;
-  foreach my $transaction (@{ $self->transactions }) {
-    # find all transactions with an AR_amount or AP_amount link
-    $transaction->{chartlinks} = { map { $_ => 1 } split(m/:/, $transaction->{chart_link}) };
-    # second condition is that we can determine an automatic Skonto account for each AR_amount entry
-
-    if ( ( $is_sales && $transaction->{chartlinks}->{AR_amount} ) or ( !$is_sales && $transaction->{chartlinks}->{AP_amount}) ) {
-        # $reference_ARAP_amount += $transaction->{amount} * $mult;
-
-        # quick hack that works around problem of non-unique tax keys in SKR04
-        # ? use tax_id in acc_trans
-        my $tax = SL::DB::Manager::Tax->get_first( where => [id => $transaction->{tax_id}]);
-        croak "no tax for taxkey " . $transaction->{taxkey} unless ref $tax;
-
-        if ( $is_sales ) {
-          die t8('no skonto_chart configured for taxkey #1 : #2 : #3', $transaction->{taxkey} , $tax->taxdescription , $tax->rate*100) unless ref $tax->skonto_sales_chart;
-        } else {
-          die t8('no skonto_chart configured for taxkey #1 : #2 : #3', $transaction->{taxkey} , $tax->taxdescription , $tax->rate*100) unless ref $tax->skonto_purchase_chart;
-        };
-
-        my $skonto_amount_unrounded;
-
-        my $skonto_percent_abs = $self->amount ? abs($transaction->amount * (1 + $tax->rate) * 100 / $self->amount) : 0;
-
-        my $transaction_amount = abs($transaction->{amount} * (1 + $tax->rate));
-        my $transaction_skonto_percent = abs($transaction_amount/$self->amount); # abs($transaction->{amount} * (1 + $tax->rate));
-
-
-        $skonto_amount_unrounded   = abs($amount * $transaction_skonto_percent);
-        my $skonto_amount_rounded  = _round($skonto_amount_unrounded);
-        my $rounding_error         = $skonto_amount_unrounded - $skonto_amount_rounded;
-        my $rounded_rounding_error = _round($rounding_error);
-
-        $total_rounding_error += $rounding_error;
-        $total_skonto_amount  += $skonto_amount_rounded;
-
-        my $rec = {
-          # skonto_percent_abs: relative part of amount + tax to the total invoice amount
-          'skonto_percent_abs'     => $skonto_percent_abs,
-          'chart_id'               => $is_sales ? $tax->skonto_sales_chart->id : $tax->skonto_purchase_chart->id,
-          'skonto_amount'          => $skonto_amount_rounded,
-          # 'rounding_error'         => $rounding_error,
-          # 'rounded_rounding_error' => $rounded_rounding_error,
-        };
-
-        push @skonto_charts, $rec;
-      }
-  }
-
-  # if the rounded sum of all rounding_errors reaches 0.01 this sum is
-  # subtracted from the largest skonto_amount
-  my $rounded_total_rounding_error = abs(_round($total_rounding_error));
-
-  if ( $rounded_total_rounding_error > 0 ) {
-    my $highest_amount_pos = 0;
-    my $highest_amount = 0;
-    my $i = -1;
-    foreach my $ref ( @skonto_charts ) {
-      $i++;
-      if ( $ref->{skonto_amount} > $highest_amount ) {
-        $highest_amount     = $ref->{skonto_amount};
-        $highest_amount_pos = $i;
-      };
-    };
-    $skonto_charts[$i]->{skonto_amount} -= $rounded_total_rounding_error;
-  };
-
-  return @skonto_charts;
-};
-
-
 sub within_skonto_period {
   my $self = shift;
   my $dateref = shift || DateTime->now->truncate( to => 'day' );