Revision 1c98ac62
Von Moritz Bunkus vor mehr als 5 Jahren hinzugefügt
SL/Controller/BankTransaction.pm | ||
---|---|---|
$self->report_generator_list_objects(report => $self->{report}, objects => $self->models->get);
|
||
}
|
||
|
||
sub action_list {
|
||
my ($self) = @_;
|
||
|
||
if (!$::form->{filter}{bank_account}) {
|
||
flash('error', t8('No bank account chosen!'));
|
||
$self->action_search;
|
||
return;
|
||
}
|
||
sub gather_bank_transactions_and_proposals {
|
||
my ($self, %params) = @_;
|
||
|
||
my $sort_by = $::form->{sort_by} || 'transdate';
|
||
my $sort_by = $params{sort_by} || 'transdate';
|
||
$sort_by = 'transdate' if $sort_by eq 'proposal';
|
||
$sort_by .= $::form->{sort_dir} ? ' DESC' : ' ASC';
|
||
|
||
my $fromdate = $::locale->parse_date_to_object($::form->{filter}->{fromdate});
|
||
my $todate = $::locale->parse_date_to_object($::form->{filter}->{todate});
|
||
$todate->add( days => 1 ) if $todate;
|
||
$sort_by .= $params{sort_dir} ? ' DESC' : ' ASC';
|
||
|
||
my @where = ();
|
||
push @where, (transdate => { ge => $fromdate }) if ($fromdate);
|
||
push @where, (transdate => { lt => $todate }) if ($todate);
|
||
my $bank_account = SL::DB::Manager::BankAccount->find_by( id => $::form->{filter}{bank_account} );
|
||
push @where, (transdate => { ge => $params{fromdate} }) if $params{fromdate};
|
||
push @where, (transdate => { lt => $params{todate} }) if $params{todate};
|
||
# bank_transactions no younger than starting date,
|
||
# including starting date (same search behaviour as fromdate)
|
||
# but OPEN invoices to be matched may be from before
|
||
if ( $bank_account->reconciliation_starting_date ) {
|
||
push @where, (transdate => { ge => $bank_account->reconciliation_starting_date });
|
||
if ( $params{bank_account}->reconciliation_starting_date ) {
|
||
push @where, (transdate => { ge => $params{bank_account}->reconciliation_starting_date });
|
||
};
|
||
|
||
my $bank_transactions = SL::DB::Manager::BankTransaction->get_all(
|
||
... | ... | |
limit => 10000,
|
||
where => [
|
||
amount => {ne => \'invoice_amount'},
|
||
local_bank_account_id => $::form->{filter}{bank_account},
|
||
local_bank_account_id => $params{bank_account}->id,
|
||
cleared => 0,
|
||
@where
|
||
],
|
||
... | ... | |
with_objects => ['customer','payment_terms']);
|
||
|
||
my $all_open_ap_invoices = SL::DB::Manager::PurchaseInvoice->get_all(where => [amount => { ne => \'paid' }], with_objects => ['vendor' ,'payment_terms']);
|
||
my $all_open_sepa_export_items = SL::DB::Manager::SepaExportItem->get_all(where => [chart_id => $bank_account->chart_id ,
|
||
my $all_open_sepa_export_items = SL::DB::Manager::SepaExportItem->get_all(where => [chart_id => $params{bank_account}->chart_id ,
|
||
'sepa_export.executed' => 0, 'sepa_export.closed' => 0 ], with_objects => ['sepa_export']);
|
||
|
||
my @all_open_invoices;
|
||
... | ... | |
push @proposals, @otherproposals;
|
||
|
||
# sort bank transaction proposals by quality (score) of proposal
|
||
if ($::form->{sort_by} && $::form->{sort_by} eq 'proposal') {
|
||
my $dir = $::form->{sort_dir} ? 1 : -1;
|
||
if ($params{sort_by} && $params{sort_by} eq 'proposal') {
|
||
my $dir = $params{sort_dir} ? 1 : -1;
|
||
$bank_transactions = [ sort { ($a->{agreement} <=> $b->{agreement}) * $dir } @{ $bank_transactions } ];
|
||
}
|
||
|
||
# for testing with t/bank/banktransaction.t :
|
||
if ( $::form->{dont_render_for_test} ) {
|
||
return ( $bank_transactions , \@proposals );
|
||
return ( $bank_transactions , \@proposals );
|
||
}
|
||
|
||
sub action_list {
|
||
my ($self) = @_;
|
||
|
||
if (!$::form->{filter}{bank_account}) {
|
||
flash('error', t8('No bank account chosen!'));
|
||
$self->action_search;
|
||
return;
|
||
}
|
||
|
||
my $bank_account = SL::DB::BankAccount->load_cached($::form->{filter}->{bank_account});
|
||
my $fromdate = $::locale->parse_date_to_object($::form->{filter}->{fromdate});
|
||
my $todate = $::locale->parse_date_to_object($::form->{filter}->{todate});
|
||
$todate->add( days => 1 ) if $todate;
|
||
|
||
my ($bank_transactions, $proposals) = $self->gather_bank_transactions_and_proposals(
|
||
bank_account => $bank_account,
|
||
fromdate => $fromdate,
|
||
todate => $todate,
|
||
sort_by => $::form->{sort_by},
|
||
sort_dir => $::form->{sort_dir},
|
||
);
|
||
|
||
$::request->layout->add_javascripts("kivi.BankTransaction.js");
|
||
$self->render('bank_transactions/list',
|
||
title => t8('Bank transactions MT940'),
|
||
BANK_TRANSACTIONS => $bank_transactions,
|
||
PROPOSALS => \@proposals,
|
||
PROPOSALS => $proposals,
|
||
bank_account => $bank_account,
|
||
ui_tab => scalar(@proposals) > 0?1:0,
|
||
ui_tab => scalar(@{ $proposals }) > 0 ? 1 : 0,
|
||
);
|
||
}
|
||
|
t/bank/bank_transactions.t | ||
---|---|---|
is($bt->invoice_amount , '0.00000' , "$testname: bt invoice amount was not assigned");
|
||
|
||
my $bt_controller = SL::Controller::BankTransaction->new;
|
||
$::form->{dont_render_for_test} = 1;
|
||
$::form->{filter}{bank_account} = $bank_account->id;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->action_list;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->gather_bank_transactions_and_proposals(bank_account => $bank_account);
|
||
|
||
is(scalar(@$bt_transactions) , 1 , "$testname: one bank_transaction");
|
||
is($bt_transactions->[0]->{agreement}, 20 , "$testname: agreement == 20");
|
||
... | ... | |
is($sei->amount , '119.00000' , "$testname: sepa export amount ok");
|
||
|
||
my $bt_controller = SL::Controller::BankTransaction->new;
|
||
$::form->{dont_render_for_test} = 1;
|
||
$::form->{filter}{bank_account} = $bank_account->id;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->action_list;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->gather_bank_transactions_and_proposals(bank_account => $bank_account);
|
||
|
||
is(scalar(@$bt_transactions) , 1 , "$testname: one bank_transaction");
|
||
is($bt_transactions->[0]->{agreement}, 25 , "$testname: agreement == 25");
|
||
... | ... | |
#nun sollten zwei gleichwertige Rechnungen $ar_transaction_1 und $ar_transaction_3 für $bt1 gefunden werden
|
||
#aber es darf keine Proposals geben mit mehreren Rechnungen
|
||
my $bt_controller = SL::Controller::BankTransaction->new;
|
||
$::form->{dont_render_for_test} = 1;
|
||
$::form->{filter}{bank_account} = $bank_account->id;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->action_list;
|
||
my ( $bt_transactions, $proposals ) = $bt_controller->gather_bank_transactions_and_proposals(bank_account => $bank_account);
|
||
|
||
is(scalar(@$bt_transactions) , 2 , "$testname: two bank_transaction");
|
||
is(scalar(@$proposals) , 0 , "$testname: no proposals");
|
||
... | ... | |
# Jetzt gibt es zwei Kontobewegungen mit gleichen Punkten für eine Rechnung.
|
||
# hier darf es auch keine Proposals geben
|
||
|
||
( $bt_transactions, $proposals ) = $bt_controller->action_list;
|
||
( $bt_transactions, $proposals ) = $bt_controller->gather_bank_transactions_and_proposals(bank_account => $bank_account);
|
||
|
||
is(scalar(@$bt_transactions) , 2 , "$testname: two bank_transaction");
|
||
# odyn testfall - anforderungen so (noch) nicht in kivi
|
||
... | ... | |
# hier darf es auch keine Proposals geben
|
||
$bt3->update_attributes( purpose => "fuer Rechnung salesinv10000");
|
||
|
||
( $bt_transactions, $proposals ) = $bt_controller->action_list;
|
||
( $bt_transactions, $proposals ) = $bt_controller->gather_bank_transactions_and_proposals(bank_account => $bank_account);
|
||
|
||
is(scalar(@$bt_transactions) , 2 , "$testname: two bank_transaction");
|
||
# odyn testfall - anforderungen so (noch) nicht in kivi
|
Auch abrufbar als: Unified diff
BankTransaction: Vorschlagslistencode aus action_list eigene Funktion verlagert