Payment Helper setzt $self->transactions zurück
authorG. Richardson <information@kivitendo-premium.de>
Sun, 6 Mar 2016 19:29:40 +0000 (20:29 +0100)
committerG. Richardson <information@kivitendo-premium.de>
Sun, 6 Mar 2016 19:38:56 +0000 (20:38 +0100)
Als es noch eine Methode transactions in SL::DB::Helper::Payment gab
wurden die acc_trans-Einträge bei Zugriff per $self->transactions jedes
Mal aus der Datenbank ausgelesen:
(SL::DB::Manager::AccTransaction->get_all(query => [ trans_id => $self->id ]);

Seit Commit 01b298ec3 wird stattdessen der aktuelle relationship Array
verwendet, wenn die transactions noch nicht ausgelesen wurden werden sie
wie oben geladen, wenn sie aber schon existieren dann werden die
Transaktionen im Speicher benutzt.

Bei den Tests gab es aber das Problem, daß in pay_invoice die
acc_trans-Einträge der Zahlungen als AccTrans-Objekte unabhängig vom
Rechnungsobjekt gespeichert wurden, und der transaction Array daher
nicht aktualisiert wurde. Am Ende von pay_invoice wird nun per
forget_related der transaction-Array zurückgesetzt, damit bei der
nächsten Verwendung die aktuell gespeicherten Transaktionen nachgeladen
werden.

SL/DB/Helper/Payment.pm
SL/DB/Invoice.pm
SL/DB/PurchaseInvoice.pm
t/db_helper/payment.t

index c5add7b..93dc1ec 100644 (file)
@@ -154,6 +154,8 @@ sub pay_invoice {
                                                      source     => $params{source},
                                                      taxkey     => 0,
                                                      tax_id     => SL::DB::Manager::Tax->find_by(taxkey => 0)->id);
+
+        # the acc_trans entries are saved individually, not added to $self and then saved all at once
         $new_acc_trans->save;
 
         $reference_amount -= abs($amount);
@@ -193,6 +195,11 @@ sub pay_invoice {
     $self->datepaid($transdate_obj);
     $self->save;
 
+    # make sure transactions will be reloaded the next time $self->transactions
+    # is called, as pay_invoice saves the acc_trans objects individually rather
+    # than adding them to the transaction relation array.
+    $self->forget_related('transactions');
+
   my $datev_check = 0;
   if ( $is_sales )  {
     if ( (  $self->invoice && $::instance_conf->get_datev_check_on_sales_invoice  ) ||
@@ -374,8 +381,8 @@ sub check_skonto_configuration {
 
   my $skonto_configured = 1; # default is assume skonto works
 
-  my $transactions = $self->transactions;
-  foreach my $transaction (@{ $transactions }) {
+  my $transactions = $self->transactions;
+  foreach my $transaction (@{ $self->transactions }) {
     # find all transactions with an AR_amount or AP_amount link
     my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => $transaction->{taxkey}]);
     croak "no tax for taxkey " . $transaction->{taxkey} unless ref $tax;
@@ -448,8 +455,8 @@ sub skonto_charts {
 
   my $reference_ARAP_amount = 0;
 
-  my $transactions = $self->transactions;
-  foreach my $transaction (@{ $transactions }) {
+  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
@@ -659,8 +666,8 @@ Example:
   $ap->pay_invoice(chart_id      => $bank->chart_id,
                    amount        => $ap->open_amount,
                    transdate     => DateTime->now->to_kivitendo,
-                   memo          => 'foobar;
-                   source        => 'barfoo;
+                   memo          => 'foobar',
+                   source        => 'barfoo',
                    payment_type  => 'without_skonto',  # default if not specified
                   );
 
@@ -668,8 +675,8 @@ or with skonto:
   $ap->pay_invoice(chart_id      => $bank->chart_id,
                    amount        => $ap->amount,       # doesn't need to be specified
                    transdate     => DateTime->now->to_kivitendo,
-                   memo          => 'foobar;
-                   source        => 'barfoo;
+                   memo          => 'foobar',
+                   source        => 'barfoo',
                    payment_type  => 'with_skonto',
                   );
 
@@ -933,23 +940,6 @@ defaults. E.g. when creating a SEPA bank transfer for vendor invoices a company
 might always want to pay quickly making use of skonto, while another company
 might always want to pay as late as possible.
 
-=item C<transactions>
-
-Returns all acc_trans Objects of an ar/ap object.
-
-Example in console to print account numbers and booked amounts of an invoice:
-  my $invoice = invoice(invnumber => '144');
-  foreach my $acc_trans ( @{ $invoice->transactions } ) {
-    print $acc_trans->chart->accno . " : " . $acc_trans->amount_as_number . "\n"
-  };
-  # 1200 : 226,00000
-  # 1800 : -226,00000
-  # 4300 : 100,00000
-  # 3801 : 7,00000
-  # 3806 : 19,00000
-  # 4400 : 100,00000
-  # 1200 : -226,00000
-
 =item C<get_payment_select_options_for_bank_transaction $banktransaction_id %params>
 
 Make suggestion for a skonto payment type by returning an HTML blob of the options
index 2d6ab07..abb3e7c 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use Carp;
 use List::Util qw(first sum);
 
-use Rose::DB::Object::Helpers qw(has_loaded_related);
+use Rose::DB::Object::Helpers qw(has_loaded_related forget_related);
 use SL::DB::MetaSetup::Invoice;
 use SL::DB::Manager::Invoice;
 use SL::DB::Helper::Payment qw(:ALL);
index c63a2ed..57eecab 100644 (file)
@@ -11,6 +11,7 @@ use SL::DB::Helper::AttrSorted;
 use SL::DB::Helper::LinkedRecords;
 use SL::DB::Helper::Payment qw(:ALL);
 use SL::Locale::String qw(t8);
+use Rose::DB::Object::Helpers qw(has_loaded_related forget_related);
 
 # The calculator hasn't been adjusted for purchase invoices yet.
 # use SL::DB::Helper::PriceTaxCalculator;
index 718f537..26880f4 100644 (file)
@@ -257,11 +257,11 @@ sub new_item {
 }
 
 sub number_of_payments {
-  my $transactions = shift;
+  my $invoice = shift;
 
   my $number_of_payments;
   my $paid_amount;
-  foreach my $transaction ( @$transactions ) {
+  foreach my $transaction ( @{ $invoice->transactions } ) {
     if ( $transaction->chart_link =~ /(AR_paid|AP_paid)/ ) {
       $paid_amount += $transaction->amount ;
       $number_of_payments++;
@@ -271,9 +271,9 @@ sub number_of_payments {
 };
 
 sub total_amount {
-  my $transactions = shift;
+  my $invoice = shift;
 
-  my $total = sum map { $_->amount } @$transactions;
+  my $total = sum map { $_->amount } @{ $invoice->transactions };
 
   return $::form->round_amount($total, 5);
 
@@ -305,8 +305,8 @@ sub test_default_invoice_one_item_19_without_skonto() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, one item, 19% tax, without_skonto';
 
@@ -345,8 +345,8 @@ sub test_default_invoice_one_item_19_without_skonto_overpaid() {
   $params{amount} = '-10.00';
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, one item, 19% tax, without_skonto';
 
@@ -383,8 +383,8 @@ sub test_default_invoice_two_items_19_7_tax_with_skonto() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
 
@@ -418,8 +418,8 @@ sub test_default_invoice_two_items_19_7_tax_with_skonto_tax_included() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax with_skonto_pt';
 
@@ -456,8 +456,8 @@ sub test_default_invoice_two_items_19_7_without_skonto() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax without skonto';
 
@@ -488,8 +488,8 @@ sub test_default_invoice_two_items_19_7_without_skonto_incomplete_payment() {
                          transdate    => DateTime->today_local->to_kivitendo,
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax without skonto incomplete payment';
 
@@ -524,8 +524,8 @@ sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments() {
                          transdate    => DateTime->today_local->to_kivitendo
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax not included';
 
@@ -567,8 +567,8 @@ sub test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_fin
                          transdate    => DateTime->today_local->to_kivitendo
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax not included';
 
@@ -609,8 +609,8 @@ sub  test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_fi
                          transdate    => DateTime->today_local->to_kivitendo
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax not included';
 
@@ -647,8 +647,8 @@ sub  test_default_invoice_two_items_19_7_tax_without_skonto_multiple_payments_fi
                          transdate    => DateTime->today_local->to_kivitendo
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax not included';
 
@@ -689,8 +689,8 @@ sub test_default_invoice_one_item_19_multiple_payment_final_difference_as_skonto
   $params{payment_type} = 'difference_as_skonto';
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, one item, 19% tax, without_skonto';
 
@@ -727,8 +727,8 @@ sub test_default_invoice_one_item_19_multiple_payment_final_difference_as_skonto
   $params{payment_type} = 'difference_as_skonto';
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, one item, 19% tax, without_skonto';
 
@@ -756,8 +756,8 @@ sub test_default_purchase_invoice_two_charts_19_7_without_skonto() {
 
   $purchase_invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice->transactions);
-  my $total = total_amount($purchase_invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
+  my $total = total_amount($purchase_invoice);
 
   my $title = 'default invoice, two items, 19/7% tax without skonto';
 
@@ -781,8 +781,8 @@ sub test_default_purchase_invoice_two_charts_19_7_with_skonto() {
 
   $purchase_invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice->transactions);
-  my $total = total_amount($purchase_invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
+  my $total = total_amount($purchase_invoice);
 
   my $title = 'default invoice, two items, 19/7% tax without skonto';
 
@@ -802,8 +802,8 @@ sub test_default_purchase_invoice_two_charts_19_7_tax_partial_unrounded_payment_
                           chart_id     => $bank_account->chart_id,
                           transdate    => DateTime->today_local->to_kivitendo
                          );
-  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice->transactions);
-  my $total = total_amount($purchase_invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
+  my $total = total_amount($purchase_invoice);
 
   my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
 
@@ -837,8 +837,8 @@ sub test_default_purchase_invoice_two_charts_19_7_tax_without_skonto_multiple_pa
                           transdate    => DateTime->today_local->to_kivitendo
                          );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice->transactions);
-  my $total = total_amount($purchase_invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($purchase_invoice);
+  my $total = total_amount($purchase_invoice);
 
   my $title = 'default purchase_invoice, two charts, 19/7% tax multiple payments with final difference as skonto';
 
@@ -871,8 +871,8 @@ sub test_default_invoice_two_items_19_7_tax_with_skonto_50_50() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, two items, 19/7% tax with_skonto_pt 50/50';
 
@@ -909,8 +909,8 @@ sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
 
@@ -946,8 +946,8 @@ sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25_tax_included() {
 
   $invoice->pay_invoice( %params );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';
 
@@ -985,8 +985,8 @@ sub test_default_invoice_four_items_19_7_tax_with_skonto_4x_25_multiple() {
                          transdate    => DateTime->today_local->to_kivitendo
                        );
 
-  my ($number_of_payments, $paid_amount) = number_of_payments($invoice->transactions);
-  my $total = total_amount($invoice->transactions);
+  my ($number_of_payments, $paid_amount) = number_of_payments($invoice);
+  my $total = total_amount($invoice);
 
   my $title = 'default invoice, four items, 19/7% tax with_skonto_pt 4x25';