Revision b6f37661
Von Martin Helmling martin.helmling@octosoft.eu vor etwa 8 Jahren hinzugefügt
SL/Controller/BankTransaction.pm | ||
---|---|---|
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,
|
t/bank/bank_transactions.t | ||
---|---|---|
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;
|
Auch abrufbar als: Unified diff
BankTransaction: "Kontoauszug verbuchen" überarbeitet für ap_transaction und credit_note
sowie Test erweitert