X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=SL%2FController%2FReconciliation.pm;fp=SL%2FController%2FReconciliation.pm;h=9cf25a378ea92a620bcc1647a9e32003d9166cbb;hp=1236c44657b292b4a6e3189d2cc378bd5a3fe398;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/SL/Controller/Reconciliation.pm b/SL/Controller/Reconciliation.pm index 1236c4465..9cf25a378 100644 --- a/SL/Controller/Reconciliation.pm +++ b/SL/Controller/Reconciliation.pm @@ -29,17 +29,22 @@ __PACKAGE__->run_before('_bank_account'); sub action_search { my ($self) = @_; + $self->setup_search_action_bar; $self->render('reconciliation/search'); } sub action_reconciliation { my ($self) = @_; + $self->_get_proposals; + $self->_get_linked_transactions; $self->_get_balances; + $self->setup_reconciliation_action_bar; $self->render('reconciliation/form', + ui_tab => scalar(@{$self->{PROPOSALS}}) > 0?1:0, title => t8('Reconciliation')); } @@ -83,7 +88,7 @@ sub action_update_reconciliation_table { my $output = $self->render('reconciliation/assigning_table', { output => 0 }, bt_sum => $::form->format_amount(\%::myconfig, $self->{bt_sum}, 2), bb_sum => $::form->format_amount(\%::myconfig, -1 * $self->{bb_sum}, 2), - show_button => !@errors + errors => @errors, ); my %result = ( html => $output ); @@ -174,26 +179,28 @@ sub action_reconcile_proposals { my $counter = 0; - foreach my $bt_id ( @{ $::form->{bt_ids} }) { - my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group(); - my $bank_transaction = SL::DB::Manager::BankTransaction->find_by(id => $bt_id); - $bank_transaction->cleared('1'); - if ( $bank_transaction->isa('SL::DB::BankTransaction') ) { - $bank_transaction->invoice_amount($bank_transaction->amount); - } - $bank_transaction->save; - foreach my $acc_trans_id (@{ $::form->{proposal_list}->{$bt_id}->{BB} }) { - SL::DB::ReconciliationLink->new( - rec_group => $rec_group, - bank_transaction_id => $bt_id, - acc_trans_id => $acc_trans_id - )->save; - my $acc_trans = SL::DB::Manager::AccTransaction->find_by(acc_trans_id => $acc_trans_id); - $acc_trans->cleared('1'); - $acc_trans->save; + # reconcile transaction safe + SL::DB->client->with_transaction(sub { + foreach my $bt_id ( @{ $::form->{bt_ids} }) { + my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group(); + my $bank_transaction = SL::DB::Manager::BankTransaction->find_by(id => $bt_id); + $bank_transaction->cleared('1'); + $bank_transaction->save; + foreach my $acc_trans_id (@{ $::form->{proposal_list}->{$bt_id}->{BB} }) { + SL::DB::ReconciliationLink->new( + rec_group => $rec_group, + bank_transaction_id => $bt_id, + acc_trans_id => $acc_trans_id + )->save; + my $acc_trans = SL::DB::Manager::AccTransaction->find_by(acc_trans_id => $acc_trans_id); + $acc_trans->cleared('1'); + $acc_trans->save; + } + $counter++; } - $counter++; - } + + 1; + }) or die t8('Unable to reconcile, database transaction failure'); flash('ok', t8('#1 proposal(s) saved.', $counter)); @@ -339,7 +346,7 @@ sub _get_elements_and_validate { } if ($::form->round_amount($bt_sum + $bb_sum, 2) != 0) { - push @errors, t8('Out of balance!'); + push @errors, t8('Out of balance!'), t8('Sum of bank #1 and sum of bookings #2',$bt_sum, $bb_sum); } $self->{ELEMENTS} = \@elements; @@ -352,33 +359,38 @@ sub _get_elements_and_validate { sub _reconcile { my ($self) = @_; - # 1. step: set AccTrans and BankTransactions to 'cleared' - foreach my $element (@{ $self->{ELEMENTS} }) { - $element->cleared('1'); - $element->invoice_amount($element->amount) if $element->isa('SL::DB::BankTransaction'); - $element->save; - } + # reconcile transaction safe + SL::DB->client->with_transaction(sub { - # 2. step: insert entry in reconciliation_links - my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group(); - #There is either a 1:n relation or a n:1 relation - if (scalar @{ $::form->{bt_ids} } == 1) { - my $bt_id = @{ $::form->{bt_ids} }[0]; - foreach my $bb_id (@{ $::form->{bb_ids} }) { - my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id, - acc_trans_id => $bb_id, - rec_group => $rec_group); - $rec_link->save; + # 1. step: set AccTrans and BankTransactions to 'cleared' + foreach my $element (@{ $self->{ELEMENTS} }) { + $element->cleared('1'); + # veto either invoice_amount is fully assigned or not! No state tricks in later workflow! + $element->save; } - } else { - my $bb_id = @{ $::form->{bb_ids} }[0]; - foreach my $bt_id (@{ $::form->{bt_ids} }) { - my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id, - acc_trans_id => $bb_id, - rec_group => $rec_group); - $rec_link->save; + # 2. step: insert entry in reconciliation_links + my $rec_group = SL::DB::Manager::ReconciliationLink->get_new_rec_group(); + #There is either a 1:n relation or a n:1 relation + if (scalar @{ $::form->{bt_ids} } == 1) { + my $bt_id = @{ $::form->{bt_ids} }[0]; + foreach my $bb_id (@{ $::form->{bb_ids} }) { + my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id, + acc_trans_id => $bb_id, + rec_group => $rec_group); + $rec_link->save; + } + } else { + my $bb_id = @{ $::form->{bb_ids} }[0]; + foreach my $bt_id (@{ $::form->{bt_ids} }) { + my $rec_link = SL::DB::ReconciliationLink->new(bank_transaction_id => $bt_id, + acc_trans_id => $bb_id, + rec_group => $rec_group); + $rec_link->save; + } } - } + + 1; + }) or die t8('Unable to reconcile, database transaction failure'); } sub _filter_to_where { @@ -617,4 +629,32 @@ sub init_BANK_ACCOUNTS { SL::DB::Manager::BankAccount->get_all_sorted( query => [ obsolete => 0 ] ); } +sub setup_search_action_bar { + my ($self, %params) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + action => [ + t8('Show'), + submit => [ '#search_form', { action => 'Reconciliation/reconciliation' } ], + accesskey => 'enter', + ], + ); + } +} + +sub setup_reconciliation_action_bar { + my ($self, %params) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + action => [ + t8('Filter'), + call => [ 'filter_table' ], + accesskey => 'enter', + ], + ); + } +} + 1;