]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/BankTransaction.pm
BUG-Fix: Funktion "Erzeugnis fertigen" sucht Bestandteile im falschen Lager.
[mfinanz.git] / SL / Controller / BankTransaction.pm
index bbe4edf2c58bd7e5913e51036fabe96368d6193a..a9a944087b616129cd536d1436ac0bd401daebda 100644 (file)
@@ -23,6 +23,7 @@ use SL::DB::AccTransaction;
 use SL::DB::Tax;
 use SL::DB::Draft;
 use SL::DB::BankAccount;
 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);
 
 use SL::Presenter;
 use List::Util qw(max);
 
@@ -78,9 +79,10 @@ sub action_list {
   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,
   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 ) {
   # 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 $bank_transactions = SL::DB::Manager::BankTransaction->get_all(where => [ amount => {ne => \'invoice_amount'},
@@ -176,6 +178,8 @@ sub action_create_invoice {
   $self->{transaction} = SL::DB::Manager::BankTransaction->find_by(id => $::form->{bt_id});
   my $vendor_of_transaction = SL::DB::Manager::Vendor->find_by(account_number => $self->{transaction}->{remote_account_number});
 
   $self->{transaction} = SL::DB::Manager::BankTransaction->find_by(id => $::form->{bt_id});
   my $vendor_of_transaction = SL::DB::Manager::Vendor->find_by(account_number => $self->{transaction}->{remote_account_number});
 
+  my $use_vendor_filter = $self->{transaction}->{remote_account_number} && $vendor_of_transaction;
+
   my $drafts = SL::DB::Manager::Draft->get_all(where => [ module => 'ap'] , with_objects => 'employee');
 
   my @filtered_drafts;
   my $drafts = SL::DB::Manager::Draft->get_all(where => [ module => 'ap'] , with_objects => 'employee');
 
   my @filtered_drafts;
@@ -189,15 +193,15 @@ sub action_create_invoice {
   }
 
   #Filter drafts
   }
 
   #Filter drafts
-  @filtered_drafts = grep { $_->{vendor_id} == $vendor_of_transaction->id } @filtered_drafts if $vendor_of_transaction;
+  @filtered_drafts = grep { $_->{vendor_id} == $vendor_of_transaction->id } @filtered_drafts if $use_vendor_filter;
 
   my $all_vendors = SL::DB::Manager::Vendor->get_all();
 
   $self->render('bank_transactions/create_invoice', { layout  => 0 },
       title      => t8('Create invoice'),
       DRAFTS     => \@filtered_drafts,
 
   my $all_vendors = SL::DB::Manager::Vendor->get_all();
 
   $self->render('bank_transactions/create_invoice', { layout  => 0 },
       title      => t8('Create invoice'),
       DRAFTS     => \@filtered_drafts,
-      vendor_id  => $vendor_of_transaction ? $vendor_of_transaction->id : undef,
-      vendor_name => $vendor_of_transaction ? $vendor_of_transaction->name : undef,
+      vendor_id  => $use_vendor_filter ? $vendor_of_transaction->id : undef,
+      vendor_name => $use_vendor_filter ? $vendor_of_transaction->name : undef,
       ALL_VENDORS => $all_vendors,
       limit      => $myconfig{vclimit},
       callback   => $self->url_for(action                => 'list',
       ALL_VENDORS => $all_vendors,
       limit      => $myconfig{vclimit},
       callback   => $self->url_for(action                => 'list',
@@ -224,7 +228,9 @@ sub action_ajax_payment_suggestion {
 
   my $html;
   $html .= SL::Presenter->input_tag('invoice_ids.' . $::form->{bt_id} . '[]', $::form->{prop_id} , type => 'hidden');
 
   my $html;
   $html .= SL::Presenter->input_tag('invoice_ids.' . $::form->{bt_id} . '[]', $::form->{prop_id} , type => 'hidden');
-  $html .= SL::Presenter->escape( $invoice->invnumber );
+  # better in template code - but how to ajax this
+  $html .= SL::Presenter->escape(t8('Invno.') . ': ' . $invoice->invnumber . ' ');
+  $html .= SL::Presenter->escape(t8('Amount') . ': ' . $::form->format_amount(\%::myconfig, $invoice->open_amount, 2) . ' ');
   $html .= SL::Presenter->select_tag('invoice_skontos.' . $::form->{bt_id} . '[]', \@select_options,
                                               value_key => 'payment_type',
                                               title_key => 'display' ) if @select_options;
   $html .= SL::Presenter->select_tag('invoice_skontos.' . $::form->{bt_id} . '[]', \@select_options,
                                               value_key => 'payment_type',
                                               title_key => 'display' ) if @select_options;
@@ -246,6 +252,7 @@ sub action_filter_drafts {
 
   foreach my $draft ( @{ $drafts } ) {
     my $draft_as_object = YAML::Load($draft->form);
 
   foreach my $draft ( @{ $drafts } ) {
     my $draft_as_object = YAML::Load($draft->form);
+    next unless $draft_as_object->{vendor_id};  # we cannot filter for vendor name, if this is a gl draft
     my $vendor = SL::DB::Manager::Vendor->find_by(id => $draft_as_object->{vendor_id});
     $draft->{vendor} = $vendor->name;
     $draft->{vendor_id} = $vendor->id;
     my $vendor = SL::DB::Manager::Vendor->find_by(id => $draft_as_object->{vendor_id});
     $draft->{vendor} = $vendor->name;
     $draft->{vendor_id} = $vendor->id;
@@ -277,8 +284,8 @@ sub action_ajax_add_list {
   my @where_purchase = (amount => { ne => \'paid' });
 
   if ($::form->{invnumber}) {
   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->{amount}) {
@@ -287,13 +294,13 @@ sub action_ajax_add_list {
   }
 
   if ($::form->{vcnumber}) {
   }
 
   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}) {
   }
 
   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}) {
   }
 
   if ($::form->{transdatefrom}) {
@@ -395,27 +402,28 @@ sub action_save_invoices {
         last;
       }
       # pay invoice or go to the next bank transaction if the amount is not sufficiently high
         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;
+          $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,
         $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);
                               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,
                               amount       => $amount_of_transaction,
                               payment_type => $payment_type,
                               transdate    => $bank_transaction->transdate->to_kivitendo);
       } else {
         $invoice->pay_invoice(chart_id     => $bank_transaction->local_bank_account->chart_id,
                               trans_id     => $invoice->id,
                               amount       => $amount_of_transaction,
                               payment_type => $payment_type,
                               transdate    => $bank_transaction->transdate->to_kivitendo);
-        $bank_transaction->invoice_amount($bank_transaction->amount) if $invoice->is_sales;
-        $bank_transaction->invoice_amount($bank_transaction->amount) if !$invoice->is_sales;
+        $bank_transaction->invoice_amount($bank_transaction->amount);
         $amount_of_transaction = 0;
       }
 
         $amount_of_transaction = 0;
       }
 
@@ -428,6 +436,17 @@ sub action_save_invoices {
           );
 
       SL::DB::RecordLink->new(@props)->save;
           );
 
       SL::DB::RecordLink->new(@props)->save;
+
+      # "close" a sepa_export_item if it exists
+      # currently only works, if there is only exactly one open sepa_export_item
+      if ( my $seis = $invoice->find_sepa_export_items({ executed => 0 }) ) {
+        if ( scalar @$seis == 1 ) {
+          # moved the execution and the check for sepa_export into a method,
+          # this isn't part of a transaction, though
+          $seis->[0]->set_executed if $invoice->id == $seis->[0]->arap_id;
+        };
+      };
+
     }
     $bank_transaction->save;
   }
     }
     $bank_transaction->save;
   }