X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FBankTransaction.pm;h=d154667d5b82fc862bc0520e28b101e9f429fe12;hb=067d87c880d086f3f431e5f4e6599c37d5771905;hp=8b0c9216abfcae962b2446f37747a3b3a6f2a0b9;hpb=af131a4635b49e0615dec59c9b7423f0c828e027;p=kivitendo-erp.git diff --git a/SL/Controller/BankTransaction.pm b/SL/Controller/BankTransaction.pm index 8b0c9216a..d154667d5 100644 --- a/SL/Controller/BankTransaction.pm +++ b/SL/Controller/BankTransaction.pm @@ -21,8 +21,8 @@ use SL::JSON; use SL::DB::Chart; use SL::DB::AccTransaction; use SL::DB::Tax; -use SL::DB::Draft; use SL::DB::BankAccount; +use SL::DB::RecordTemplate; use SL::DB::SepaExportItem; use SL::DBUtils qw(like); use SL::Presenter; @@ -32,6 +32,7 @@ use List::Util qw(max); use Rose::Object::MakeMethods::Generic ( + scalar => [ qw(callback transaction) ], 'scalar --get_set_init' => [ qw(models problems) ], ); @@ -47,6 +48,7 @@ sub action_search { my $bank_accounts = SL::DB::Manager::BankAccount->get_all_sorted( query => [ obsolete => 0 ] ); + $self->setup_search_action_bar; $self->render('bank_transactions/search', BANK_ACCOUNTS => $bank_accounts); } @@ -57,6 +59,7 @@ sub action_list_all { $self->make_filter_summary; $self->prepare_report; + $self->setup_list_all_action_bar; $self->report_generator_list_objects(report => $self->{report}, objects => $self->models->get); } @@ -284,41 +287,33 @@ sub action_create_invoice { my ($self) = @_; my %myconfig = %main::myconfig; - $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'); + $self->transaction(SL::DB::Manager::BankTransaction->find_by(id => $::form->{bt_id})); - my @filtered_drafts; + 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; - foreach my $draft ( @{ $drafts } ) { - my $draft_as_object = YAML::Load($draft->form); - my $vendor = SL::DB::Manager::Vendor->find_by(id => $draft_as_object->{vendor_id}); - $draft->{vendor} = $vendor->name; - $draft->{vendor_id} = $vendor->id; - push @filtered_drafts, $draft; - } + my $templates = SL::DB::Manager::RecordTemplate->get_all( + where => [ template_type => 'ap_transaction' ], + with_objects => [ qw(employee vendor) ], + ); - #Filter drafts - @filtered_drafts = grep { $_->{vendor_id} == $vendor_of_transaction->id } @filtered_drafts if $use_vendor_filter; + #Filter templates + $templates = [ grep { $_->vendor_id == $vendor_of_transaction->id } @{ $templates } ] if $use_vendor_filter; - my $all_vendors = SL::DB::Manager::Vendor->get_all(); - my $callback = $self->url_for(action => 'list', - 'filter.bank_account' => $::form->{filter}->{bank_account}, - 'filter.todate' => $::form->{filter}->{todate}, - 'filter.fromdate' => $::form->{filter}->{fromdate}); + $self->callback($self->url_for( + action => 'list', + 'filter.bank_account' => $::form->{filter}->{bank_account}, + 'filter.todate' => $::form->{filter}->{todate}, + 'filter.fromdate' => $::form->{filter}->{fromdate}, + )); $self->render( 'bank_transactions/create_invoice', { layout => 0 }, title => t8('Create invoice'), - DRAFTS => \@filtered_drafts, + TEMPLATES => $templates, vendor_id => $use_vendor_filter ? $vendor_of_transaction->id : undef, vendor_name => $use_vendor_filter ? $vendor_of_transaction->name : undef, - ALL_VENDORS => $all_vendors, - callback => $callback, ); } @@ -337,57 +332,48 @@ sub action_ajax_payment_suggestion { my @select_options = $invoice->get_payment_select_options_for_bank_transaction($::form->{bt_id}); my $html; - $html .= SL::Presenter->input_tag('invoice_ids.' . $::form->{bt_id} . '[]', $::form->{prop_id} , type => 'hidden'); - $html .= SL::Presenter->escape(t8('Invno.') . ': ' . $invoice->invnumber . ' '); - $html .= SL::Presenter->escape(t8('Open 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; - $html .= SL::Presenter->html_tag('a', 'x', href => '#', onclick => "kivi.BankTransaction.delete_invoice(" . $::form->{bt_id} . ',' . $::form->{prop_id} . ")"); - $html = SL::Presenter->html_tag('div', $html, id => $::form->{bt_id} . '.' . $::form->{prop_id}, 'data-invoice-amount' => $invoice->open_amount * 1); - - $self->render(\ SL::JSON::to_json( { 'html' => $html } ), { layout => 0, type => 'json', process => 0 }); + $html = $self->render( + 'bank_transactions/_payment_suggestion', { output => 0 }, + bt_id => $::form->{bt_id}, + prop_id => $::form->{prop_id}, + invoice => $invoice, + SELECT_OPTIONS => \@select_options, + ); + + $self->render(\ SL::JSON::to_json( { 'html' => "$html" } ), { layout => 0, type => 'json', process => 0 }); }; -sub action_filter_drafts { +sub action_filter_templates { my ($self) = @_; $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 $drafts = SL::DB::Manager::Draft->get_all(with_objects => 'employee'); + my @filter; + push @filter, ('vendor.id' => $::form->{vendor_id}) if $::form->{vendor_id}; + push @filter, ('vendor.name' => { ilike => '%' . $::form->{vendor} . '%' }) if $::form->{vendor}; - my @filtered_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; - - push @filtered_drafts, $draft; - } + my $templates = SL::DB::Manager::RecordTemplate->get_all( + where => [ template_type => 'ap_transaction', (or => \@filter) x !!@filter ], + with_objects => [ qw(employee vendor) ], + ); - my $vendor_name = $::form->{vendor}; - my $vendor_id = $::form->{vendor_id}; + $::form->{filter} //= {}; - #Filter drafts - @filtered_drafts = grep { $_->{vendor_id} == $vendor_id } @filtered_drafts if $vendor_id; - @filtered_drafts = grep { $_->{vendor} =~ /$vendor_name/i } @filtered_drafts if $vendor_name; + $self->callback($self->url_for( + action => 'list', + 'filter.bank_account' => $::form->{filter}->{bank_account}, + 'filter.todate' => $::form->{filter}->{todate}, + 'filter.fromdate' => $::form->{filter}->{fromdate}, + )); my $output = $self->render( - 'bank_transactions/filter_drafts', + 'bank_transactions/_template_list', { output => 0 }, - DRAFTS => \@filtered_drafts, + TEMPLATES => $templates, ); - my %result = ( count => 0, html => $output ); - - $self->render(\to_json(\%result), { type => 'json', process => 0 }); + $self->render(\to_json({ html => $output }), { type => 'json', process => 0 }); } sub action_ajax_add_list { @@ -511,6 +497,8 @@ sub save_invoices { push @{ $self->problems }, $self->save_single_bank_transaction( bank_transaction_id => $bank_transaction_id, invoice_ids => $invoice_ids, + sources => ($::form->{sources} // {})->{$_}, + memos => ($::form->{memos} // {})->{$_}, ); $count += scalar( @{$invoice_ids} ); } @@ -519,10 +507,15 @@ sub save_invoices { push @{ $self->problems }, $self->save_single_bank_transaction( bank_transaction_id => $bank_transaction_id, invoice_ids => $invoice_ids, + sources => [ map { $::form->{"sources_${bank_transaction_id}_${_}"} } @{ $invoice_ids } ], + memos => [ map { $::form->{"memos_${bank_transaction_id}_${_}"} } @{ $invoice_ids } ], ); $count += scalar( @{$invoice_ids} ); } } + foreach (@{ $self->problems }) { + $count-- if $_->{result} eq 'error'; + } return $count; } @@ -537,6 +530,7 @@ sub action_save_invoices { sub action_save_proposals { my ($self) = @_; + if ( $::form->{proposal_ids} ) { my $propcount = scalar(@{ $::form->{proposal_ids} }); if ( $propcount > 0 ) { @@ -607,7 +601,7 @@ sub save_single_bank_transaction { if ( $payment_sent && any { ( $_->is_sales && ($_->amount > 0)) - || (!$_->is_sales && ($_->amount < 0)) + || (!$_->is_sales && ($_->amount < 0) && ($_->invoice_type eq 'purchase_invoice')) } @{ $data{invoices} }) { return { %data, @@ -620,6 +614,8 @@ sub save_single_bank_transaction { my $n_invoices = 0; foreach my $invoice (@{ $data{invoices} }) { + my $source = ($data{sources} // [])->[$n_invoices]; + my $memo = ($data{memos} // [])->[$n_invoices]; $n_invoices++ ; @@ -665,13 +661,18 @@ sub save_single_bank_transaction { trans_id => $invoice->id, amount => $open_amount, payment_type => $payment_type, + source => $source, + memo => $memo, transdate => $bank_transaction->transdate->to_kivitendo); - } elsif ( $invoice->is_sales && $invoice->type eq 'credit_note' ) { + } 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 $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; @@ -679,6 +680,8 @@ sub save_single_bank_transaction { trans_id => $invoice->id, amount => $amount_of_transaction, payment_type => $payment_type, + source => $source, + memo => $memo, transdate => $bank_transaction->transdate->to_kivitendo); $bank_transaction->invoice_amount($bank_transaction->amount); $amount_of_transaction = 0; @@ -733,7 +736,8 @@ sub save_single_bank_transaction { }; }; - die if $error; + # Rollback Fehler nicht weiterreichen + # die if $error; }); return grep { $_ } ($error, @warnings); @@ -873,6 +877,52 @@ sub init_models { ); } +sub load_ap_record_template_url { + my ($self, $template) = @_; + + return $self->url_for( + controller => 'ap.pl', + action => 'load_record_template', + id => $template->id, + 'form_defaults.amount_1' => $::form->format_amount(\%::myconfig, -1 * $self->transaction->amount, 2), + 'form_defaults.transdate' => $self->transaction->transdate_as_date, + 'form_defaults.duedate' => $self->transaction->transdate_as_date, + 'form_defaults.datepaid_1' => $self->transaction->transdate_as_date, + 'form_defaults.paid_1' => $::form->format_amount(\%::myconfig, -1 * $self->transaction->amount, 2), + 'form_defaults.currency' => $self->transaction->currency->name, + 'form_defaults.AP_paid_1' => $self->transaction->local_bank_account->chart->accno, + 'form_defaults.callback' => $self->callback, + ); +} + +sub setup_search_action_bar { + my ($self, %params) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + action => [ + t8('Filter'), + submit => [ '#search_form', { action => 'BankTransaction/list' } ], + accesskey => 'enter', + ], + ); + } +} + +sub setup_list_all_action_bar { + my ($self, %params) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + action => [ + t8('Filter'), + submit => [ '#filter_form', { action => 'BankTransaction/list_all' } ], + accesskey => 'enter', + ], + ); + } +} + 1; __END__