1 package SL::Controller::Reconciliation;
 
   5 use parent qw(SL::Controller::Base);
 
   7 use SL::Locale::String;
 
   9 use SL::Controller::Helper::ParseFilter;
 
  10 use SL::Helper::Flash;
 
  12 use SL::DB::BankTransaction;
 
  13 use SL::DB::Manager::BankAccount;
 
  14 use SL::DB::AccTransaction;
 
  15 use SL::DB::ReconciliationLink;
 
  16 use List::Util qw(sum);
 
  18 use Rose::Object::MakeMethods::Generic (
 
  19   'scalar --get_set_init' => [ qw(cleared BANK_ACCOUNTS) ],
 
  22 __PACKAGE__->run_before('check_auth');
 
  23 __PACKAGE__->run_before('_bank_account');
 
  32   $self->setup_search_action_bar;
 
  33   $self->render('reconciliation/search');
 
  36 sub action_reconciliation {
 
  39   $self->_get_proposals;
 
  41   $self->_get_linked_transactions;
 
  45   $self->setup_reconciliation_action_bar;
 
  46   $self->render('reconciliation/form',
 
  47                 ui_tab => scalar(@{$self->{PROPOSALS}}) > 0?1:0,
 
  48                 title => t8('Reconciliation'));
 
  51 sub action_load_overview {
 
  54   $self->_get_proposals;
 
  56   $self->_get_linked_transactions;
 
  60   my $output = $self->render('reconciliation/tabs/overview', { output => 0 });
 
  61   my %result = ( html => $output );
 
  63   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
  66 sub action_filter_overview {
 
  69   $self->_get_linked_transactions;
 
  72   my $output = $self->render('reconciliation/_linked_transactions', { output => 0 });
 
  73   my %result = ( html               => $output,
 
  74                  absolut_bt_balance => $::form->format_amount(\%::myconfig,      $self->{absolut_bt_balance}, 2),
 
  75                  absolut_bb_balance => $::form->format_amount(\%::myconfig, -1 * $self->{absolut_bb_balance}, 2),
 
  76                  bt_balance         => $::form->format_amount(\%::myconfig,      $self->{bt_balance}, 2),
 
  77                  bb_balance         => $::form->format_amount(\%::myconfig, -1 * $self->{bb_balance}, 2)
 
  80   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
  83 sub action_update_reconciliation_table {
 
  86   my @errors = $self->_get_elements_and_validate();
 
  88   my $output = $self->render('reconciliation/assigning_table', { output => 0 },
 
  89                  bt_sum => $::form->format_amount(\%::myconfig, $self->{bt_sum}, 2),
 
  90                  bb_sum => $::form->format_amount(\%::myconfig, -1 * $self->{bb_sum}, 2),
 
  94   my %result = ( html => $output );
 
  96   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
  99 sub action_reconcile {
 
 103   my @errors = $self->_get_elements_and_validate;
 
 106     unshift(@errors, (t8('Could not reconcile chosen elements!')));
 
 107     flash('error', @errors);
 
 108     $self->action_reconciliation;
 
 114   $self->action_reconciliation;
 
 117 sub action_delete_reconciliation {
 
 120   my $rec_links = SL::DB::Manager::ReconciliationLink->get_all(where => [ rec_group => $::form->{rec_group} ]);
 
 122   foreach my $rec_link (@{ $rec_links }) {
 
 123     my $bank_transaction = SL::DB::Manager::BankTransaction->find_by( id           => $rec_link->bank_transaction_id );
 
 124     my $acc_transaction  = SL::DB::Manager::AccTransaction ->find_by( acc_trans_id => $rec_link->acc_trans_id        );
 
 126     $bank_transaction->cleared('0');
 
 127     $acc_transaction->cleared('0');
 
 129     $bank_transaction->save;
 
 130     $acc_transaction->save;
 
 135   $self->_get_linked_transactions;
 
 136   $self->_get_balances;
 
 138   my $output = $self->render('reconciliation/_linked_transactions', { output => 0 });
 
 139   my %result = ( html               => $output,
 
 140                  absolut_bt_balance => $::form->format_amount(\%::myconfig,      $self ->{absolut_bt_balance}, 2),
 
 141                  absolut_bb_balance => $::form->format_amount(\%::myconfig, -1 * $self ->{absolut_bb_balance}, 2),
 
 142                  bt_balance         => $::form->format_amount(\%::myconfig,      $self ->{bt_balance}, 2),
 
 143                  bb_balance         => $::form->format_amount(\%::myconfig, -1 * $self ->{bb_balance}, 2)
 
 146   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
 149 sub action_load_proposals {
 
 152   $self->_get_proposals;
 
 154   my $output = $self->render('reconciliation/tabs/automatic', { output => 0 });
 
 155   my %result = ( html => $output );
 
 157   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
 160 sub action_filter_proposals {
 
 163   $self->_get_balances;
 
 164   $self->_get_proposals;
 
 166   my $output = $self->render('reconciliation/proposals', { output => 0 });
 
 167   my %result = ( html               => $output,
 
 168                  absolut_bt_balance => $::form->format_amount(\%::myconfig,      $self ->{absolut_bt_balance}, 2),
 
 169                  absolut_bb_balance => $::form->format_amount(\%::myconfig, -1 * $self ->{absolut_bb_balance}, 2),
 
 170                  bt_balance         => $::form->format_amount(\%::myconfig,      $self ->{bt_balance}, 2),
 
 171                  bb_balance         => $::form->format_amount(\%::myconfig, -1 * $self ->{bb_balance}, 2)
 
 174   $self->render(\to_json(\%result), { type => 'json', process => 0 });
 
 177 sub action_reconcile_proposals {
 
 182   # reconcile transaction safe
 
 183   SL::DB->client->with_transaction(sub {
 
 184     foreach my $bt_id ( @{ $::form->{bt_ids} }) {
 
 185       my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group();
 
 186       my $bank_transaction = SL::DB::Manager::BankTransaction->find_by(id => $bt_id);
 
 187       $bank_transaction->cleared('1');
 
 188       $bank_transaction->save;
 
 189       foreach my $acc_trans_id (@{ $::form->{proposal_list}->{$bt_id}->{BB} }) {
 
 190         SL::DB::ReconciliationLink->new(
 
 191           rec_group => $rec_group,
 
 192           bank_transaction_id => $bt_id,
 
 193           acc_trans_id => $acc_trans_id
 
 195         my $acc_trans = SL::DB::Manager::AccTransaction->find_by(acc_trans_id => $acc_trans_id);
 
 196         $acc_trans->cleared('1');
 
 203   }) or die t8('Unable to reconcile, database transaction failure');
 
 205   flash('ok', t8('#1 proposal(s) saved.', $counter));
 
 207   $self->action_reconciliation;
 
 215   $::auth->assert('bank_transaction');
 
 220   $self->{bank_account} = SL::DB::Manager::BankAccount->find_by(id => $::form->{filter}->{"local_bank_account_id:number"});
 
 230   # reconciliation suggestion is based on:
 
 231   # * record_link exists (was paid by bank transaction)
 
 232   # or acc_trans entry exists where
 
 233   # * amount is exactly the same
 
 235   # * IBAN or account number have to match exactly (cv details, no spaces)
 
 237   # * there is exactly one match for all conditions
 
 239   $self->_filter_to_where;
 
 241   my $bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => [ @{ $self->{bt_where} }, cleared => '0' ]);
 
 247   foreach my $bt (@{ $bank_transactions }) {
 
 248     $check_sum = $bt->amount;
 
 250     $proposal->{BT} = $bt;
 
 251     $proposal->{BB} = [];
 
 253     # first of all check if any of the bank_transactions are already linked (i.e. were paid via bank transactions)
 
 254     my $linked_records = SL::DB::Manager::RecordLink->get_all(where => [ from_table => 'bank_transactions', from_id => $bt->id ]);
 
 255     foreach my $linked_record (@{ $linked_records }) {
 
 257       if ($linked_record->to_table eq 'ar') {
 
 258         $invoice = SL::DB::Manager::Invoice->find_by(id => $linked_record->to_id);
 
 260         my $payments = SL::DB::Manager::AccTransaction->get_all(where => [ trans_id => $invoice->id, chart_link => { like => '%AR_paid%' }, transdate => $bt->transdate ]);
 
 261         foreach my $payment (@{ $payments }) {
 
 262           $check_sum += $payment->amount;
 
 263           push @{ $proposal->{BB} }, $payment;
 
 266       if ($linked_record->to_table eq 'ap') {
 
 267         $invoice = SL::DB::Manager::PurchaseInvoice->find_by(id => $linked_record->to_id);
 
 269         my $payments = SL::DB::Manager::AccTransaction->get_all(where => [ trans_id => $invoice->id, chart_link => { like => '%AP_paid%' }, transdate => $bt->transdate ]);
 
 270         foreach my $payment (@{ $payments }) {
 
 271           $check_sum += $payment->amount;
 
 272           push @{ $proposal->{BB} }, $payment;
 
 277     #add proposal if something in acc_trans was found
 
 278     #otherwise try to find another entry in acc_trans and add it
 
 279     # for linked_records we allow a slight difference / imprecision, for acc_trans search we don't
 
 280     if (scalar @{ $proposal->{BB} } and abs($check_sum) <= 0.01 ) {
 
 281       push @proposals, $proposal;
 
 282     } elsif (!scalar @{ $proposal->{BB} }) {
 
 283       # use account_number and iban for matching remote account number
 
 284       # don't suggest gl stornos (ar and ap stornos shouldn't have any payments)
 
 286       my @account_number_match = (
 
 287         ( 'ar.customer.iban'           => $bt->remote_account_number ),
 
 288         ( 'ar.customer.account_number' => $bt->remote_account_number ),
 
 289         ( 'ap.vendor.iban'             => $bt->remote_account_number ),
 
 290         ( 'ap.vendor.account_number'   => $bt->remote_account_number ),
 
 291         ( 'gl.storno'                  => '0' ),
 
 294       my $acc_transactions = SL::DB::Manager::AccTransaction->get_all(where => [ @{ $self->{bb_where} },
 
 295                                                                                  amount => -1 * $bt->amount,
 
 297                                                                                  'transdate' => $bt->transdate,
 
 298                                                                                  or => [ @account_number_match ]
 
 300                                                                        with_objects => [ 'ar', 'ap', 'ar.customer', 'ap.vendor', 'gl' ]);
 
 301       if (scalar @{ $acc_transactions } == 1) {
 
 302         push @{ $proposal->{BB} }, @{ $acc_transactions }[0];
 
 303         push @proposals, $proposal;
 
 308   $self->{PROPOSALS} = \@proposals;
 
 311 sub _get_elements_and_validate {
 
 316   if ( not defined $::form->{bt_ids} ) {
 
 317     push @errors, t8('No bank account chosen!');
 
 320   if ( not defined $::form->{bb_ids} ) {
 
 321     push @errors, t8('No transaction on chart bank chosen!');
 
 325     if (scalar @{ $::form->{bt_ids} } > 1 and scalar @{ $::form->{bb_ids} } > 1) {
 
 326       push @errors, t8('No 1:n or n:1 relation');
 
 331   my ($bt_sum, $bb_sum) = (0,0);
 
 333   foreach my $bt_id (@{ $::form->{bt_ids} }) {
 
 334     my $bt = SL::DB::Manager::BankTransaction->find_by(id => $bt_id);
 
 336     $bt_sum += $bt->amount;
 
 340   foreach my $bb_id (@{ $::form->{bb_ids} }) {
 
 341     my $bb = SL::DB::Manager::AccTransaction->find_by(acc_trans_id => $bb_id);
 
 343     $bb->{id} = $bb->acc_trans_id;
 
 344     $bb_sum += $bb->amount;
 
 348   if ($::form->round_amount($bt_sum + $bb_sum, 2) != 0) {
 
 349     push @errors, t8('Out of balance!'), t8('Sum of bank #1 and sum of bookings #2',$bt_sum, $bb_sum);
 
 352   $self->{ELEMENTS} = \@elements;
 
 353   $self->{bt_sum} = $bt_sum;
 
 354   $self->{bb_sum} = $bb_sum;
 
 362   # reconcile transaction safe
 
 363   SL::DB->client->with_transaction(sub {
 
 365     # 1. step: set AccTrans and BankTransactions to 'cleared'
 
 366     foreach my $element (@{ $self->{ELEMENTS} }) {
 
 367       $element->cleared('1');
 
 368       # veto either invoice_amount is fully assigned or not! No state tricks in later workflow!
 
 371     # 2. step: insert entry in reconciliation_links
 
 372     my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group();
 
 373     #There is either a 1:n relation or a n:1 relation
 
 374     if (scalar @{ $::form->{bt_ids} } == 1) {
 
 375       my $bt_id = @{ $::form->{bt_ids} }[0];
 
 376       foreach my $bb_id (@{ $::form->{bb_ids} }) {
 
 377         my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id,
 
 378                                                        acc_trans_id        => $bb_id,
 
 379                                                        rec_group           => $rec_group);
 
 383       my $bb_id = @{ $::form->{bb_ids} }[0];
 
 384       foreach my $bt_id (@{ $::form->{bt_ids} }) {
 
 385         my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id,
 
 386                                                        acc_trans_id        => $bb_id,
 
 387                                                        rec_group           => $rec_group);
 
 393   }) or die t8('Unable to reconcile, database transaction failure');
 
 396 sub _filter_to_where {
 
 399   my %parse_filter = parse_filter($::form->{filter});
 
 400   my %filter = @{ $parse_filter{query} };
 
 402   my (@rl_where, @bt_where, @bb_where);
 
 403   @rl_where = ('bank_transaction.local_bank_account_id' => $filter{local_bank_account_id});
 
 404   @bt_where = (local_bank_account_id => $filter{local_bank_account_id});
 
 405   @bb_where = (chart_id              => $self->{bank_account}->chart_id);
 
 407   if ($filter{fromdate} and $filter{todate}) {
 
 409     push @rl_where, (or => [ and => [ 'acc_trans.transdate'        => $filter{fromdate},
 
 410                                       'acc_trans.transdate'        => $filter{todate}   ],
 
 411                              and => [ 'bank_transaction.transdate' => $filter{fromdate},
 
 412                                       'bank_transaction.transdate' => $filter{todate}   ] ] );
 
 414     push @bt_where, (transdate => $filter{todate} );
 
 415     push @bt_where, (transdate => $filter{fromdate} );
 
 416     push @bb_where, (transdate => $filter{todate} );
 
 417     push @bb_where, (transdate => $filter{fromdate} );
 
 420   if ( $self->{bank_account}->reconciliation_starting_date ) {
 
 421     push @bt_where, (transdate => { ge => $self->{bank_account}->reconciliation_starting_date });
 
 422     push @bb_where, (transdate => { ge => $self->{bank_account}->reconciliation_starting_date });
 
 425   # don't try to reconcile opening and closing balance transactions
 
 426   push @bb_where, ('acc_trans.ob_transaction' => 0);
 
 427   push @bb_where, ('acc_trans.cb_transaction' => 0);
 
 429   if ($filter{fromdate} and not $filter{todate}) {
 
 430     push @rl_where, (or => [ 'acc_trans.transdate'        => $filter{fromdate},
 
 431                              'bank_transaction.transdate' => $filter{fromdate} ] );
 
 432     push @bt_where, (transdate                    => $filter{fromdate} );
 
 433     push @bb_where, (transdate                    => $filter{fromdate} );
 
 436   if ($filter{todate} and not $filter{fromdate}) {
 
 437     push @rl_where, ( or => [ 'acc_trans.transdate'        => $filter{todate} ,
 
 438                               'bank_transaction.transdate' => $filter{todate} ] );
 
 439     push @bt_where, (transdate                    => $filter{todate} );
 
 440     push @bb_where, (transdate                    => $filter{todate} );
 
 443   if ($filter{cleared}) {
 
 444     $filter{cleared} = $filter{cleared} eq 'FALSE' ? '0' : '1';
 
 445     push @rl_where, ('acc_trans.cleared'        => $filter{cleared} );
 
 447     push @bt_where, (cleared                    => $filter{cleared} );
 
 448     push @bb_where, (cleared                    => $filter{cleared} );
 
 451   $self->{rl_where} = \@rl_where;
 
 452   $self->{bt_where} = \@bt_where;
 
 453   $self->{bb_where} = \@bb_where;
 
 456 sub _get_linked_transactions {
 
 459   $self->_filter_to_where;
 
 461   my (@where, @bt_where, @bb_where);
 
 462   # don't try to reconcile opening and closing balances
 
 463   # instead use an offset in configuration
 
 465   @where    = (@{ $self->{rl_where} });
 
 466   @bt_where = (@{ $self->{bt_where} }, cleared => '0');
 
 467   @bb_where = (@{ $self->{bb_where} }, cleared => '0');
 
 471   my $reconciliation_groups = SL::DB::Manager::ReconciliationLink->get_all(distinct => 1,
 
 472                                                                            select => ['rec_group'],
 
 474                                                                            with_objects => ['bank_transaction', 'acc_trans']);
 
 476   my $fromdate = $::locale->parse_date_to_object($::form->{filter}->{fromdate_date__ge});
 
 477   my $todate   = $::locale->parse_date_to_object($::form->{filter}->{todate_date__le});
 
 479   foreach my $rec_group (@{ $reconciliation_groups }) {
 
 480     my $linked_transactions = SL::DB::Manager::ReconciliationLink->get_all(where => [rec_group => $rec_group->rec_group], with_objects => ['bank_transaction', 'acc_trans']);
 
 482     my $first_transaction = shift @{ $linked_transactions };
 
 483     my $first_bt = $first_transaction->bank_transaction;
 
 484     my $first_bb = $first_transaction->acc_trans;
 
 486     if (defined $fromdate) {
 
 487       $first_bt->{class} = 'out_of_balance' if ( $first_bt->transdate lt $fromdate );
 
 488       $first_bb->{class} = 'out_of_balance' if ( $first_bb->transdate lt $fromdate );
 
 490     if (defined $todate) {
 
 491       $first_bt->{class} = 'out_of_balance' if ( $first_bt->transdate gt $todate );
 
 492       $first_bb->{class} = 'out_of_balance' if ( $first_bb->transdate gt $todate );
 
 494     $line->{BT} = [ $first_bt ];
 
 495     $line->{BB} = [ $first_bb ];
 
 496     $line->{rec_group} = $first_transaction->rec_group;
 
 497     $line->{type} = 'Link';
 
 499     #add the rest of transaction of this group
 
 500     my ($previous_bt_id, $previous_acc_trans_id) = ($first_transaction->bank_transaction_id, $first_transaction->acc_trans_id);
 
 501     foreach my $linked_transaction (@{ $linked_transactions }) {
 
 502       my $bank_transaction = $linked_transaction->bank_transaction;
 
 503       my $acc_transaction  = $linked_transaction->acc_trans;
 
 504       if (defined $fromdate) {
 
 505         $bank_transaction->{class} = 'out_of_balance' if ( $bank_transaction->transdate lt $fromdate );
 
 506         $acc_transaction->{class}  = 'out_of_balance' if ( $acc_transaction->transdate  lt $fromdate );
 
 508       if (defined $todate) {
 
 509         $bank_transaction->{class} = 'out_of_balance' if ( $bank_transaction->transdate gt $todate );
 
 510         $acc_transaction->{class}  = 'out_of_balance' if ( $acc_transaction->transdate  gt $todate );
 
 512       if ($bank_transaction->id != $previous_bt_id) {
 
 513         push @{ $line->{BT} }, $bank_transaction;
 
 515       if ($acc_transaction->acc_trans_id != $previous_acc_trans_id) {
 
 516         push @{ $line->{BB} }, $acc_transaction;
 
 522   # add non-cleared bank transactions
 
 523   my $bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => \@bt_where);
 
 524   foreach my $bt (@{ $bank_transactions }) {
 
 526     $line->{BT} = [ $bt ];
 
 527     $line->{type} = 'BT';
 
 528     $line->{id} = $bt->id;
 
 532   # add non-cleared bookings on bank
 
 533   my $bookings_on_bank = SL::DB::Manager::AccTransaction->get_all(where => \@bb_where);
 
 534   foreach my $bb (@{ $bookings_on_bank }) {
 
 535     if ($::form->{filter}->{show_stornos} or !$bb->record->storno) {
 
 537       $line->{BB} = [ $bb ];
 
 538       $line->{type} = 'BB';
 
 539       $line->{id} = $bb->acc_trans_id;
 
 545   @rows = sort sort_by_transdate @rows;
 
 547   $self->{LINKED_TRANSACTIONS} = \@rows;
 
 550 sub sort_by_transdate {
 
 551   if ($a->{BT} and $b->{BT}) {
 
 552     return $a->{BT}[0]->amount <=> $b->{BT}[0]->amount if $a->{BT}[0]->transdate eq $b->{BT}[0]->transdate;
 
 553     return $a->{BT}[0]->transdate cmp $b->{BT}[0]->transdate;
 
 556     return $a->{BT}[0]->amount <=> (-1 * $b->{BB}[0]->amount) if $a->{BT}[0]->transdate eq $b->{BB}[0]->transdate;
 
 557     return $a->{BT}[0]->transdate cmp $b->{BB}[0]->transdate;
 
 560     return (-1 * $a->{BB}[0]->amount) <=> $b->{BT}[0]->amount if $a->{BB}[0]->transdate eq $b->{BT}[0]->transdate;
 
 561     return $a->{BB}[0]->transdate cmp $b->{BT}[0]->transdate;
 
 563   return (-1 * $a->{BB}[0]->amount) <=> (-1 * $b->{BB}[0]->amount) if $a->{BB}[0]->transdate eq $b->{BB}[0]->transdate;
 
 564   return $a->{BB}[0]->transdate cmp $b->{BB}[0]->transdate;
 
 570   $self->_filter_to_where;
 
 572   my (@bt_where, @bb_where);
 
 573   @bt_where = @{ $self->{bt_where} };
 
 574   @bb_where = @{ $self->{bb_where} };
 
 576   my @all_bt_where = (local_bank_account_id => $self->{bank_account}->id);
 
 577   my @all_bb_where = (chart_id              => $self->{bank_account}->chart_id);
 
 579   my ($bt_balance, $bb_balance) = (0,0);
 
 580   my ($absolut_bt_balance, $absolut_bb_balance) = (0,0);
 
 582   if ( $self->{bank_account}->reconciliation_starting_date ) {
 
 583     $bt_balance         = $self->{bank_account}->reconciliation_starting_balance;
 
 584     $bb_balance         = $self->{bank_account}->reconciliation_starting_balance * -1;
 
 585     $absolut_bt_balance = $self->{bank_account}->reconciliation_starting_balance;
 
 586     $absolut_bb_balance = $self->{bank_account}->reconciliation_starting_balance * -1;
 
 588     push @all_bt_where, ( transdate => { gt => $self->{bank_account}->reconciliation_starting_date });
 
 589     push @all_bb_where, ( transdate => { gt => $self->{bank_account}->reconciliation_starting_date });
 
 592   my $bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => \@bt_where );
 
 593   my $payments          = SL::DB::Manager::AccTransaction ->get_all(where => \@bb_where );
 
 595   # for absolute balance get all bookings until todate
 
 596   my $todate   = $::locale->parse_date_to_object($::form->{filter}->{todate_date__le});
 
 597   my $fromdate = $::locale->parse_date_to_object($::form->{filter}->{fromdate_date__le});
 
 600     push @all_bt_where, (transdate => { le => $todate });
 
 601     push @all_bb_where, (transdate => { le => $todate });
 
 604   my $all_bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => \@all_bt_where);
 
 605   my $all_payments          = SL::DB::Manager::AccTransaction ->get_all(where => \@all_bb_where);
 
 607   $bt_balance += sum map { $_->amount } @{ $bank_transactions };
 
 608   $bb_balance += sum map { $_->amount if ($::form->{filter}->{show_stornos} or !$_->record->storno) } @{ $payments };
 
 610   $absolut_bt_balance += sum map { $_->amount } @{ $all_bank_transactions };
 
 611   $absolut_bb_balance += sum map { $_->amount } @{ $all_payments };
 
 614   $self->{bt_balance}         = $bt_balance || 0;
 
 615   $self->{bb_balance}         = $bb_balance || 0;
 
 616   $self->{absolut_bt_balance} = $absolut_bt_balance || 0;
 
 617   $self->{absolut_bb_balance} = $absolut_bb_balance || 0;
 
 619   $self->{difference} = $bt_balance + $bb_balance;
 
 623   [ { title => t8("all"),       value => ''           },
 
 624     { title => t8("cleared"),   value => 'TRUE'       },
 
 625     { title => t8("uncleared"), value => 'FALSE'      }, ]
 
 628 sub init_BANK_ACCOUNTS {
 
 629   SL::DB::Manager::BankAccount->get_all_sorted( query => [ obsolete => 0 ] );
 
 632 sub setup_search_action_bar {
 
 633   my ($self, %params) = @_;
 
 635   for my $bar ($::request->layout->get('actionbar')) {
 
 639         submit    => [ '#search_form', { action => 'Reconciliation/reconciliation' } ],
 
 640         accesskey => 'enter',
 
 646 sub setup_reconciliation_action_bar {
 
 647   my ($self, %params) = @_;
 
 649   for my $bar ($::request->layout->get('actionbar')) {
 
 653         call      => [ 'filter_table' ],
 
 654         accesskey => 'enter',