+ my $currency_id = SL::DB::Default->get->currency_id;
+
+ $self->transactions([ sort { $a->{transdate} cmp $b->{transdate} } SL::MT940->parse($self->file_name, charset => $self->charset) ]);
+
+ foreach my $transaction (@{ $self->transactions }) {
+ $transaction->{bank_account} = $self->bank_accounts->{ make_bank_account_idx($transaction->{local_bank_code}, $transaction->{local_account_number}) };
+ $transaction->{bank_account} //= $self->bank_accounts->{ make_bank_account_idx('IBAN', $transaction->{local_account_number}) };
+
+ if (!$transaction->{bank_account}) {
+ $transaction->{error} = $::locale->text('No bank account configured for bank code/BIC #1, account number/IBAN #2.', $transaction->{local_bank_code}, $transaction->{local_account_number});
+ $errors++;
+ next;
+ }
+
+ $transaction->{local_bank_account_id} = $transaction->{bank_account}->id;
+ $transaction->{currency_id} = $currency_id;
+
+ $min_date = min($min_date // $transaction->{transdate}, $transaction->{transdate});
+ $max_date = max($max_date // $transaction->{transdate}, $transaction->{transdate});
+ }
+
+ my %existing_bank_transactions;
+
+ if ((scalar(@{ $self->transactions }) - $errors) > 0) {
+ my @entries =
+ @{ SL::DB::Manager::BankTransaction->get_all(
+ where => [
+ transdate => { ge => $min_date },
+ transdate => { lt => $max_date->clone->add(days => 1) },
+ ],
+ inject_results => 1) };
+
+ %existing_bank_transactions = map { (make_transaction_idx($_) => 1) } @entries;
+ }
+
+ foreach my $transaction (@{ $self->transactions }) {
+ next if $transaction->{error};
+
+ if ($existing_bank_transactions{make_transaction_idx($transaction)}) {
+ $transaction->{duplicate} = 1;
+ $duplicates++;
+ next;
+ }