From 0d34b38184fdd6a6f1dd1bc7ce509c560e326b4e Mon Sep 17 00:00:00 2001 From: "G. Richardson" Date: Sun, 6 Mar 2016 20:29:40 +0100 Subject: [PATCH] =?utf8?q?Payment=20Helper=20setzt=20$self->transactions?= =?utf8?q?=20zur=C3=BCck?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 40 +++++++----------- SL/DB/Invoice.pm | 2 +- SL/DB/PurchaseInvoice.pm | 1 + t/db_helper/payment.t | 88 ++++++++++++++++++++-------------------- 4 files changed, 61 insertions(+), 70 deletions(-) diff --git a/SL/DB/Helper/Payment.pm b/SL/DB/Helper/Payment.pm index c5add7bd2..93dc1ecf7 100644 --- a/SL/DB/Helper/Payment.pm +++ b/SL/DB/Helper/Payment.pm @@ -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 - -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 Make suggestion for a skonto payment type by returning an HTML blob of the options diff --git a/SL/DB/Invoice.pm b/SL/DB/Invoice.pm index 2d6ab0734..abb3e7c88 100644 --- a/SL/DB/Invoice.pm +++ b/SL/DB/Invoice.pm @@ -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); diff --git a/SL/DB/PurchaseInvoice.pm b/SL/DB/PurchaseInvoice.pm index c63a2ed70..57eecabda 100644 --- a/SL/DB/PurchaseInvoice.pm +++ b/SL/DB/PurchaseInvoice.pm @@ -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; diff --git a/t/db_helper/payment.t b/t/db_helper/payment.t index 718f537db..26880f4a1 100644 --- a/t/db_helper/payment.t +++ b/t/db_helper/payment.t @@ -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'; -- 2.20.1