Bankimport: Rundungsproblem beim Vergleich Rechnungsbetrag - Kontobetrag
authorMartin Helmling martin.helmling@octosoft.eu <martin.helmling@octosoft.eu>
Wed, 31 Jan 2018 07:24:33 +0000 (08:24 +0100)
committerJan Büren <jan@kivitendo-premium.de>
Mon, 16 Jul 2018 10:41:57 +0000 (12:41 +0200)
Durch explizites Runden konnte die perl Floatingpoint Arithmetik nicht überzeugt werden,
deshalb werden nun die Formatierten Strings der Beträge noch zusätzlich verglichen.

Hiermit wird der "exact_match" beim Vergleich von z.B. 3456,28 und 3456,29 nicht mehr gefunden

behebt teilweise Issue #201

SL/DB/BankTransaction.pm

index b416606..eee6e00 100644 (file)
@@ -111,18 +111,27 @@ sub get_agreement_with_invoice {
   $invoice->{datediff} = $datediff;
 
   # compare amount
-  if (abs(abs($invoice->amount) - abs($self->amount)) < 0.01) {
+  if (abs(abs($invoice->amount) - abs($self->amount)) < 0.01 &&
+        $::form->format_amount(\%::myconfig,abs($invoice->amount),2) eq
+        $::form->format_amount(\%::myconfig,abs($self->amount),2)
+      ) {
     $agreement += $points{exact_amount};
     $rule_matches .= 'exact_amount(' . $points{'exact_amount'} . ') ';
   }
 
   # compare open amount, preventing double points when open amount = invoice amount
-  if ( $invoice->amount != $invoice->open_amount && abs(abs($invoice->open_amount) - abs($self->amount)) < 0.01) {
+  if ( $invoice->amount != $invoice->open_amount && abs(abs($invoice->open_amount) - abs($self->amount)) < 0.01 &&
+         $::form->format_amount(\%::myconfig,abs($invoice->amount_less_skonto),2) eq
+         $::form->format_amount(\%::myconfig,abs($self->amount),2)
+       ) {
     $agreement += $points{exact_open_amount};
     $rule_matches .= 'exact_open_amount(' . $points{'exact_open_amount'} . ') ';
   }
 
-  if ( $invoice->skonto_date && abs(abs($invoice->amount_less_skonto) - abs($self->amount)) < 0.01) {
+  if ( $invoice->skonto_date && abs(abs($invoice->amount_less_skonto) - abs($self->amount)) < 0.01 &&
+         $::form->format_amount(\%::myconfig,abs($invoice->amount_less_skonto),2) eq
+         $::form->format_amount(\%::myconfig,abs($self->amount),2)
+       ) {
     $agreement += $points{skonto_exact_amount};
     $rule_matches .= 'skonto_exact_amount(' . $points{'skonto_exact_amount'} . ') ';
     $invoice->{skonto_type} = 'with_skonto_pt';