source => $source,
memo => $memo,
transdate => $bank_transaction->transdate->to_kivitendo);
- } elsif (( $invoice->is_sales && $invoice->invoice_type eq 'credit_note' ) ||
- (!$invoice->is_sales && $invoice->invoice_type eq 'ap_transaction' )) {
- # no check for overpayment/multiple payments
-
- # 1. $invoice->open_amount is arap.amount - ararp.paid (always positive!)
- # 2. $bank_transaction->amount is negative for outgoing transactions and positive for
- # incoming transactions.
- # 1. and 2. => we have to turn the sign for invoice_amount in bank_transactions
- # for verifying expected data, check t/bank/bank_transactions.t
- $bank_transaction->invoice_amount($invoice->open_amount * -1);
+ } else {
+ # use the whole amount of the bank transaction for the invoice, overpay the invoice if necessary
+
+ if ( $invoice->is_sales && $invoice->invoice_type eq 'credit_note' ) {
+ # $invoice->open_amount is negative for credit_notes
+ # $bank_transaction->amount is negative for outgoing transactions
+ # so $amount_of_transaction is negative but needs positive
+ $amount_of_transaction *= -1;
+
+ } elsif (!$invoice->is_sales && $invoice->invoice_type eq 'ap_transaction' ) {
+ # $invoice->open_amount may be negative for ap_transaction but may be positiv for negativ ap_transaction
+ # if $invoice->open_amount is negative $bank_transaction->amount is positve
+ # if $invoice->open_amount is positive $bank_transaction->amount is negative
+ # but amount of transaction is for both positive
+ $amount_of_transaction *= -1 if $invoice->open_amount == - $amount_of_transaction;
+ }
- $invoice->pay_invoice(chart_id => $bank_transaction->local_bank_account->chart_id,
- trans_id => $invoice->id,
- amount => $invoice->open_amount,
- payment_type => $payment_type,
- source => $source,
- memo => $memo,
- transdate => $bank_transaction->transdate->to_kivitendo);
- } else { # use the whole amount of the bank transaction for the invoice, overpay the invoice if necessary
my $overpaid_amount = $amount_of_transaction - $invoice->open_amount;
$invoice->pay_invoice(chart_id => $bank_transaction->local_bank_account->chart_id,
trans_id => $invoice->id,
-use Test::More tests => 88;
+use Test::More tests => 100;
use strict;
reset_state(); # initialise customers/vendors/bank/currency/...
test1();
+
test_overpayment_with_partialpayment();
test_overpayment();
test_skonto_exact();
test_two_invoices();
test_partial_payment();
test_credit_note();
-test_neg_ap_transaction();
test_ap_transaction();
+test_neg_ap_transaction();
test_ap_payment_transaction();
+test_ap_payment_part_transaction();
+
# remove all created data at end of test
clear_up();
bank => 'Geizkasse',
bank_code => 'G1235',
depositor => 'Test Customer',
+ customernumber => 'CUST1704',
)->save;
$payment_terms = SL::Dev::Payment::create_payment_terms;
bank => 'Geizkasse',
bank_code => 'G1235',
depositor => 'Test Vendor',
+ vendornumber => 'VEND1704',
)->save;
$ar_chart = SL::DB::Manager::Chart->find_by( accno => '1400' ); # Forderungen
sub test_ap_transaction {
my (%params) = @_;
+ my $testname = 'test_ap_transaction';
+
my $netamount = 100;
my $amount = $::form->round_amount($netamount * 1.19,2);
my $invoice = SL::DB::PurchaseInvoice->new(
invoice => 0,
- invnumber => $params{invnumber} || 'test_ap_transaction',
+ invnumber => $params{invnumber} || $testname,
amount => $amount,
netamount => $netamount,
transdate => $transdate1,
$invoice->create_ap_row(chart => $ap_chart);
$invoice->save;
- is($invoice->currency_id , $currency_id , 'currency_id has been saved');
- is($invoice->netamount , 100 , 'ap amount has been converted');
- is($invoice->amount , 119 , 'ap amount has been converted');
- is($invoice->taxincluded , 0 , 'ap transaction doesn\'t have taxincluded');
+ is($invoice->currency_id , $currency_id , "$testname: currency_id has been saved");
+ is($invoice->netamount , 100 , "$testname: ap amount has been converted");
+ is($invoice->amount , 119 , "$testname: ap amount has been converted");
+ is($invoice->taxincluded , 0 , "$testname: ap transaction doesn\'t have taxincluded");
is(SL::DB::Manager::AccTransaction->find_by(chart_id => $ap_amount_chart->id , trans_id => $invoice->id)->amount , '-100.00000' , $ap_amount_chart->accno . ': has been converted for currency');
is(SL::DB::Manager::AccTransaction->find_by(chart_id => $ap_chart->id , trans_id => $invoice->id)->amount , '119.00000' , $ap_chart->accno . ': has been converted for currency');
sub test_ap_payment_transaction {
my (%params) = @_;
- my $testname = 'test_ap_two_transaction';
+ my $testname = 'test_ap_payment_transaction';
my $netamount = 115;
my $amount = $::form->round_amount($netamount * 1.19,2);
my $invoice = SL::DB::PurchaseInvoice->new(
invoice => 0,
- invnumber => $params{invnumber} || 'test_ap_two_transaction',
+ invnumber => $params{invnumber} || $testname,
amount => $amount,
netamount => $netamount,
transdate => $transdate1,
taxzone_id => $vendor->taxzone_id,
currency_id => $currency_id,
transactions => [],
- notes => 'test_ap_transaction',
+ notes => $testname,
);
$invoice->add_ap_amount_row(
amount => $invoice->netamount,
return $invoice;
};
+
+sub test_ap_payment_part_transaction {
+ my (%params) = @_;
+ my $testname = 'test_ap_payment_p_transaction';
+ my $netamount = 115;
+ my $amount = $::form->round_amount($netamount * 1.19,2);
+ my $invoice = SL::DB::PurchaseInvoice->new(
+ invoice => 0,
+ invnumber => $params{invnumber} || $testname,
+ amount => $amount,
+ netamount => $netamount,
+ transdate => $transdate1,
+ taxincluded => 0,
+ vendor_id => $vendor->id,
+ taxzone_id => $vendor->taxzone_id,
+ currency_id => $currency_id,
+ transactions => [],
+ notes => $testname,
+ );
+ $invoice->add_ap_amount_row(
+ amount => $invoice->netamount,
+ chart => $ap_amount_chart,
+ tax_id => $tax_9->id,
+ );
+
+ $invoice->create_ap_row(chart => $ap_chart);
+ $invoice->save;
+
+ is($invoice->netamount, 115 , "$testname: netamount ok");
+ is($invoice->amount , 136.85, "$testname: amount ok");
+
+ my $bt = SL::Dev::Payment::create_bank_transaction(record => $invoice,
+ amount => $invoice->amount-100,
+ bank_chart_id => $bank->id,
+ transdate => DateTime->today->add(days => 10),
+ );
+ $::form->{invoice_ids} = {
+ $bt->id => [ $invoice->id ]
+ };
+
+ save_btcontroller_to_string();
+
+ $invoice->load;
+ $bt->load;
+
+ is($invoice->amount , '136.85000', "$testname: amount ok");
+ is($invoice->netamount, '115.00000', "$testname: netamount ok");
+ is($bt->amount, '-36.85000', "$testname: bt amount ok");
+ is($invoice->paid , '36.85000', "$testname: paid ok");
+ is($bt->invoice_amount, '-36.85000', "$testname: bt invoice amount for ap was assigned");
+
+ my $bt2 = SL::Dev::Payment::create_bank_transaction(record => $invoice,
+ amount => 100,
+ bank_chart_id => $bank->id,
+ transdate => DateTime->today->add(days => 10),
+ );
+ $::form->{invoice_ids} = {
+ $bt2->id => [ $invoice->id ]
+ };
+
+ save_btcontroller_to_string();
+ $invoice->load;
+ $bt2->load;
+
+ is($invoice->amount , '136.85000', "$testname: amount ok");
+ is($invoice->netamount, '115.00000', "$testname: netamount ok");
+ is($bt2->amount, '-100.00000',"$testname: bt amount ok");
+ is($invoice->paid , '136.85000', "$testname: paid ok");
+ is($bt2->invoice_amount,'-100.00000', "$testname: bt invoice amount for ap was assigned");
+
+ return $invoice;
+};
+
1;