+ $self->render(
+ 'bank_transactions/invoices',
+ { layout => 0 },
+ INVOICES => \@selected_invoices,
+ bt_id => $::form->{bt_id},
+ );
+}
+
+sub save_invoices {
+ my ($self) = @_;
+
+ return 0 if !$::form->{invoice_ids};
+
+ my %invoice_hash = %{ delete $::form->{invoice_ids} }; # each key (the bt line with a bt_id) contains an array of invoice_ids
+
+ # e.g. three partial payments with bt_ids 54, 55 and 56 for invoice with id 74:
+ # $invoice_hash = {
+ # '55' => [
+ # '74'
+ # ],
+ # '54' => [
+ # '74'
+ # ],
+ # '56' => [
+ # '74'
+ # ]
+ # };
+ #
+ # or if the payment with bt_id 44 is used to pay invoices with ids 50, 51 and 52
+ # $invoice_hash = {
+ # '44' => [ '50', '51', 52' ]
+ # };
+
+ $::form->{invoice_skontos} ||= {}; # hash of arrays containing the payment types, could be empty
+
+ # a bank_transaction may be assigned to several invoices, i.e. a customer
+ # might pay several open invoices with one transaction
+
+ $self->problems([]);
+
+ my $count = 0;
+
+ if ( $::form->{proposal_ids} ) {
+ foreach (@{ $::form->{proposal_ids} }) {
+ my $bank_transaction_id = $_;
+ my $invoice_ids = $invoice_hash{$_};
+ 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} );
+ }
+ } else {
+ while ( my ($bank_transaction_id, $invoice_ids) = each(%invoice_hash) ) {
+ 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;