Bankauszug: Transaktionsrichtung mit Belegrichtung abgleichen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 16 Aug 2016 08:11:14 +0000 (10:11 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 16 Aug 2016 09:39:00 +0000 (11:39 +0200)
Erhält man eine Zahlung, so darf man diese nur mit Belegen verbuchen
können, die Zahlungen in Empfangsrichtung bedingen: Verkaufsrechnungen
und Gutschriften im Einkauf.

Analog gilt das auch für ausgehende Zahlungen. Hier passen nur
Einkaufsrechnungen sowie Gutschriften von Verkaufsrechnungen.

Alle anderen Zuordnungen werden mit einem Fehler zurückgewiesen.

SL/Controller/BankTransaction.pm
locale/de/all

index 841a472..1ad4d74 100644 (file)
@@ -25,6 +25,8 @@ use SL::DB::Draft;
 use SL::DB::BankAccount;
 use SL::DBUtils qw(like);
 use SL::Presenter;
+
+use List::MoreUtils qw(any);
 use List::Util qw(max);
 
 use Rose::Object::MakeMethods::Generic
@@ -435,8 +437,9 @@ sub save_single_bank_transaction {
     my $bank_transaction      = $data{bank_transaction};
     my $sign                  = $bank_transaction->amount < 0 ? -1 : 1;
     my $amount_of_transaction = $sign * $bank_transaction->amount;
+    my $payment_received      = $bank_transaction->amount > 0;
+    my $payment_sent          = $bank_transaction->amount < 0;
 
-    my @invoices;
     foreach my $invoice_id (@{ $params{invoice_ids} }) {
       my $invoice = SL::DB::Manager::Invoice->find_by(id => $invoice_id) || SL::DB::Manager::PurchaseInvoice->find_by(id => $invoice_id);
       if (!$invoice) {
@@ -447,24 +450,35 @@ sub save_single_bank_transaction {
         };
       }
 
-      push @invoices, $invoice;
+      push @{ $data{invoices} }, $invoice;
     }
 
-    $data{invoices} = \@invoices;
+    if (   $payment_received
+        && any {    ( $_->is_sales && ($_->amount < 0))
+                 || (!$_->is_sales && ($_->amount > 0))
+               } @{ $data{invoices} }) {
+      return {
+        %data,
+        result  => 'error',
+        message => $::locale->text("Received payments can only be posted for sales invoices and purchase credit notes."),
+      };
+    }
 
-    @invoices = sort { return 1 if ( $a->is_sales and $a->amount > 0);
-                       return 1 if (!$a->is_sales and $a->amount < 0);
-                       return -1;
-                     } @invoices if $bank_transaction->amount > 0;
-    @invoices = sort { return -1 if ( $a->is_sales and $a->amount > 0);
-                       return -1 if (!$a->is_sales and $a->amount < 0);
-                       return 1;
-                     } @invoices if $bank_transaction->amount < 0;
+    if (   $payment_sent
+        && any {    ( $_->is_sales && ($_->amount > 0))
+                 || (!$_->is_sales && ($_->amount < 0))
+               } @{ $data{invoices} }) {
+      return {
+        %data,
+        result  => 'error',
+        message => $::locale->text("Sent payments can only be posted for purchase invoices and sales credit notes."),
+      };
+    }
 
-    my $max_invoices = scalar(@invoices);
+    my $max_invoices = scalar(@{ $data{invoices} });
     my $n_invoices   = 0;
 
-    foreach my $invoice (@invoices) {
+    foreach my $invoice (@{ $data{invoices} }) {
 
       $n_invoices++ ;
       # Check if bank_transaction already has a link to the invoice, may only be linked once per invoice
index 5fb3ed5..fef939d 100755 (executable)
@@ -2240,6 +2240,7 @@ $self->{texts} = {
   'Receivables'                 => 'Forderungen',
   'Receivables account'         => 'Forderungskonto',
   'Receivables account (account number)' => 'Forderungskonto (Kontonummer)',
+  'Received payments can only be posted for sales invoices and purchase credit notes.' => 'Erhaltene Zahlungen können nur mit Verkaufsrechnungen und Einkaufsgutschriften verbucht werden.',
   'Recipients'                  => 'Empfänger',
   'Reconcile'                   => 'Abgleichen',
   'Reconciliation'              => 'Kontenabgleich',
@@ -2475,6 +2476,7 @@ $self->{texts} = {
   'Sending E-mail: '            => 'E-Mail versenden: ',
   'Sent emails can be optionally stored in the database with or without their attachments.' => 'Gesendete E-Mails können optional mit oder ohne ihre Anhänge in der Datenbank gespeichert werden.',
   'Sent on'                     => 'Verschickt am',
+  'Sent payments can only be posted for purchase invoices and sales credit notes.' => 'Gesendete Zahlungen können nur mit Einkaufsrechnungen und Verkaufsgutschriften verbucht werden.',
   'Sep'                         => 'Sep',
   'Separator'                   => 'Trennzeichen',
   'Separator chararacter'       => 'Feldtrennzeichen',