X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/cd887de4f6f50b3f49d9805f7a64a798d1db104f..0f214df54e:/SL/Controller/BankTransaction.pm diff --git a/SL/Controller/BankTransaction.pm b/SL/Controller/BankTransaction.pm index bbe4edf2c..a9a944087 100644 --- a/SL/Controller/BankTransaction.pm +++ b/SL/Controller/BankTransaction.pm @@ -23,6 +23,7 @@ use SL::DB::AccTransaction; use SL::DB::Tax; use SL::DB::Draft; use SL::DB::BankAccount; +use SL::DBUtils qw(like); use SL::Presenter; use List::Util qw(max); @@ -78,9 +79,10 @@ sub action_list { push @where, (transdate => { lt => $todate }) if ($todate); my $bank_account = SL::DB::Manager::BankAccount->find_by( id => $::form->{filter}{bank_account} ); # 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 => { gt => $bank_account->reconciliation_starting_date }); + push @where, (transdate => { ge => $bank_account->reconciliation_starting_date }); }; my $bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => [ amount => {ne => \'invoice_amount'}, @@ -176,6 +178,8 @@ sub action_create_invoice { $self->{transaction} = SL::DB::Manager::BankTransaction->find_by(id => $::form->{bt_id}); my $vendor_of_transaction = SL::DB::Manager::Vendor->find_by(account_number => $self->{transaction}->{remote_account_number}); + my $use_vendor_filter = $self->{transaction}->{remote_account_number} && $vendor_of_transaction; + my $drafts = SL::DB::Manager::Draft->get_all(where => [ module => 'ap'] , with_objects => 'employee'); my @filtered_drafts; @@ -189,15 +193,15 @@ sub action_create_invoice { } #Filter drafts - @filtered_drafts = grep { $_->{vendor_id} == $vendor_of_transaction->id } @filtered_drafts if $vendor_of_transaction; + @filtered_drafts = grep { $_->{vendor_id} == $vendor_of_transaction->id } @filtered_drafts if $use_vendor_filter; my $all_vendors = SL::DB::Manager::Vendor->get_all(); $self->render('bank_transactions/create_invoice', { layout => 0 }, title => t8('Create invoice'), DRAFTS => \@filtered_drafts, - vendor_id => $vendor_of_transaction ? $vendor_of_transaction->id : undef, - vendor_name => $vendor_of_transaction ? $vendor_of_transaction->name : undef, + vendor_id => $use_vendor_filter ? $vendor_of_transaction->id : undef, + vendor_name => $use_vendor_filter ? $vendor_of_transaction->name : undef, ALL_VENDORS => $all_vendors, limit => $myconfig{vclimit}, callback => $self->url_for(action => 'list', @@ -224,7 +228,9 @@ sub action_ajax_payment_suggestion { my $html; $html .= SL::Presenter->input_tag('invoice_ids.' . $::form->{bt_id} . '[]', $::form->{prop_id} , type => 'hidden'); - $html .= SL::Presenter->escape( $invoice->invnumber ); + # better in template code - but how to ajax this + $html .= SL::Presenter->escape(t8('Invno.') . ': ' . $invoice->invnumber . ' '); + $html .= SL::Presenter->escape(t8('Amount') . ': ' . $::form->format_amount(\%::myconfig, $invoice->open_amount, 2) . ' '); $html .= SL::Presenter->select_tag('invoice_skontos.' . $::form->{bt_id} . '[]', \@select_options, value_key => 'payment_type', title_key => 'display' ) if @select_options; @@ -246,6 +252,7 @@ sub action_filter_drafts { foreach my $draft ( @{ $drafts } ) { my $draft_as_object = YAML::Load($draft->form); + next unless $draft_as_object->{vendor_id}; # we cannot filter for vendor name, if this is a gl draft my $vendor = SL::DB::Manager::Vendor->find_by(id => $draft_as_object->{vendor_id}); $draft->{vendor} = $vendor->name; $draft->{vendor_id} = $vendor->id; @@ -277,8 +284,8 @@ sub action_ajax_add_list { my @where_purchase = (amount => { ne => \'paid' }); if ($::form->{invnumber}) { - push @where_sale, (invnumber => { ilike => '%' . $::form->{invnumber} . '%'}); - push @where_purchase, (invnumber => { ilike => '%' . $::form->{invnumber} . '%'}); + push @where_sale, (invnumber => { ilike => like($::form->{invnumber})}); + push @where_purchase, (invnumber => { ilike => like($::form->{invnumber})}); } if ($::form->{amount}) { @@ -287,13 +294,13 @@ sub action_ajax_add_list { } if ($::form->{vcnumber}) { - push @where_sale, ('customer.customernumber' => { ilike => '%' . $::form->{vcnumber} . '%'}); - push @where_purchase, ('vendor.vendornumber' => { ilike => '%' . $::form->{vcnumber} . '%'}); + push @where_sale, ('customer.customernumber' => { ilike => like($::form->{vcnumber})}); + push @where_purchase, ('vendor.vendornumber' => { ilike => like($::form->{vcnumber})}); } if ($::form->{vcname}) { - push @where_sale, ('customer.name' => { ilike => '%' . $::form->{vcname} . '%'}); - push @where_purchase, ('vendor.name' => { ilike => '%' . $::form->{vcname} . '%'}); + push @where_sale, ('customer.name' => { ilike => like($::form->{vcname})}); + push @where_purchase, ('vendor.name' => { ilike => like($::form->{vcname})}); } if ($::form->{transdatefrom}) { @@ -395,27 +402,28 @@ sub action_save_invoices { last; } # pay invoice or go to the next bank transaction if the amount is not sufficiently high - if ($invoice->amount <= $amount_of_transaction) { + if ($invoice->open_amount <= $amount_of_transaction) { + # first calculate new bank transaction amount ... + if ($invoice->is_sales) { + $amount_of_transaction -= $sign * $invoice->open_amount; + $bank_transaction->invoice_amount($bank_transaction->invoice_amount + $invoice->open_amount); + } else { + $amount_of_transaction += $sign * $invoice->open_amount; + $bank_transaction->invoice_amount($bank_transaction->invoice_amount - $invoice->open_amount); + } + # ... and then pay the invoice $invoice->pay_invoice(chart_id => $bank_transaction->local_bank_account->chart_id, trans_id => $invoice->id, - amount => $invoice->amount, + amount => $invoice->open_amount, payment_type => $payment_type, transdate => $bank_transaction->transdate->to_kivitendo); - if ($invoice->is_sales) { - $amount_of_transaction -= $sign * $invoice->amount; - $bank_transaction->invoice_amount($bank_transaction->invoice_amount + $invoice->amount); - } else { - $amount_of_transaction += $sign * $invoice->amount if (!$invoice->is_sales); - $bank_transaction->invoice_amount($bank_transaction->invoice_amount - $invoice->amount); - } } else { $invoice->pay_invoice(chart_id => $bank_transaction->local_bank_account->chart_id, trans_id => $invoice->id, amount => $amount_of_transaction, payment_type => $payment_type, transdate => $bank_transaction->transdate->to_kivitendo); - $bank_transaction->invoice_amount($bank_transaction->amount) if $invoice->is_sales; - $bank_transaction->invoice_amount($bank_transaction->amount) if !$invoice->is_sales; + $bank_transaction->invoice_amount($bank_transaction->amount); $amount_of_transaction = 0; } @@ -428,6 +436,17 @@ sub action_save_invoices { ); SL::DB::RecordLink->new(@props)->save; + + # "close" a sepa_export_item if it exists + # currently only works, if there is only exactly one open sepa_export_item + if ( my $seis = $invoice->find_sepa_export_items({ executed => 0 }) ) { + if ( scalar @$seis == 1 ) { + # moved the execution and the check for sepa_export into a method, + # this isn't part of a transaction, though + $seis->[0]->set_executed if $invoice->id == $seis->[0]->arap_id; + }; + }; + } $bank_transaction->save; }