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);
 
   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'},
   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}) {
   }
 
   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}) {
         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 if (!$invoice->is_sales);
+          $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,