Einkaufsrechnung -> Zahlung buchen: sinnlosen Quark gefixt.
[kivitendo-erp.git] / SL / CP.pm
index 9b37bd7..dec4323 100644 (file)
--- a/SL/CP.pm
+++ b/SL/CP.pm
 package CP;
 use SL::DBUtils;
 
+use strict;
+
 sub new {
   $main::lxdebug->enter_sub();
 
   my ($type, $countrycode) = @_;
 
-  $self = {};
+  my $self = {};
 
   if ($countrycode) {
     if (-f "locale/$countrycode/Num2text") {
@@ -74,13 +76,12 @@ sub paymentaccounts {
     qq|FROM chart | .
     qq|WHERE link LIKE ? |.
     qq|ORDER BY accno|;
-  my $sth = prepare_execute_query($form, $dbh, $query,
-                                  $form->{ARAP} eq "AR" ? "AR" : "AP" );
+  my $sth = prepare_execute_query($form, $dbh, $query, '%' . $ARAP . '%');
 
   $form->{PR}{ $form->{ARAP} } = ();
   $form->{PR}{"$form->{ARAP}_paid"} = ();
 
-  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
+  while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
     foreach my $item (split(/:/, $ref->{link})) {
       if ($item eq $form->{ARAP}) {
         push(@{ $form->{PR}{ $form->{ARAP} } }, $ref);
@@ -159,17 +160,19 @@ sub get_openinvoices {
   my $buysell = $form->{vc} eq 'customer' ? "buy" : "sell";
   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
 
+  my $curr_null = $form->{curreny} ? '' : ' OR a.curr IS NULL'; # fix: after sql-injection fix, curr is inserted as NULL, before that as ''
+
   my $query =
      qq|SELECT a.id, a.invnumber, a.transdate, a.amount, a.paid, a.curr | .
           qq|FROM $arap a | .
-     qq|WHERE (a.${vc}_id = ?) AND (a.curr = ?) AND NOT (a.amount = paid)|;
+     qq|WHERE (a.${vc}_id = ?) AND (a.curr = ? $curr_null) AND NOT (a.amount = paid)| .
                 qq|ORDER BY a.id|;
   my $sth = prepare_execute_query($form, $dbh, $query,
                                   conv_i($form->{"${vc}_id"}),
                                   $form->{currency});
 
   $form->{PR} = [];
-  while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
+  while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
 
     # if this is a foreign currency transaction get exchangerate
     $ref->{exchangerate} =
@@ -188,6 +191,7 @@ sub process_payment {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $form) = @_;
+  my $amount;
 
   # connect to database, turn AutoCommit off
   my $dbh = $form->dbconnect_noauto($myconfig);
@@ -200,20 +204,16 @@ sub process_payment {
       $form->parse_amount($myconfig, $form->{exchangerate});
 
     if ($form->{vc} eq 'customer') {
-      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid},
-                                 $form->{exchangerate}, 0);
+      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, $form->{exchangerate}, 0);
     } else {
-      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, 0,
-                                 $form->{exchangerate});
+      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, 0, $form->{exchangerate});
     }
   } else {
     $form->{exchangerate} = 1;
   }
 
-  my $query =
-    qq|SELECT fxgain_accno_id, fxloss_accno_id FROM defaults|;
-  my ($fxgain_accno_id, $fxloss_accno_id) =
-    selectrow_query($form, $dbh, $query);
+  my $query = qq|SELECT fxgain_accno_id, fxloss_accno_id FROM defaults|;
+  my ($fxgain_accno_id, $fxloss_accno_id) = selectrow_query($form, $dbh, $query);
 
   my $buysell = $form->{vc} eq "customer" ? "buy" : "sell";
   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
@@ -232,9 +232,8 @@ sub process_payment {
       qq|  (c.link LIKE '%:AP:%')) |;
   }
 
-  $paymentamount = $form->{amount};
+  my $paymentamount = $form->{amount};
 
-  #  $paymentamount = $form->{amount};
   my $null;
   ($null, $form->{department_id}) = split(/--/, $form->{department});
   $form->{department_id} *= 1;
@@ -253,8 +252,7 @@ sub process_payment {
     $form->{"due_$i"}  = $form->parse_amount($myconfig, $form->{"due_$i"});
 
     if ($form->{"checked_$i"} && $form->{"paid_$i"}) {
-      $paymentamount =
-        (($paymentamount * 1000) - ($form->{"paid_$i"} * 1000)) / 1000;
+      $paymentamount = (($paymentamount * 1000) - ($form->{"paid_$i"} * 1000)) / 1000;
 
       # get exchangerate for original
       $query =
@@ -297,8 +295,7 @@ sub process_payment {
       do_query($form, $dbh, $query, @values);
 
       # add exchangerate difference if currency ne defaultcurrency
-      $amount =
-        $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - 1),
+      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - 1),
                             2);
       if ($amount != 0) {
 
@@ -332,13 +329,13 @@ sub process_payment {
 
       $form->{"paid_$i"} =
         $form->round_amount($form->{"paid_$i"} * $exchangerate, 2);
-
       $pth->execute($form->{"id_$i"}) || $form->dberror;
       ($amount) = $pth->fetchrow_array;
       $pth->finish;
 
       $amount += $form->{"paid_$i"};
 
+      my $paid;
       # BUG 324
       if ($form->{arap} eq 'ap') {
         $paid = "paid = paid + $amount";
@@ -350,6 +347,14 @@ sub process_payment {
       $query = qq|UPDATE $arap SET $paid, datepaid = ? WHERE id = ?|;
                  @values = (conv_date($form->{datepaid}), conv_i($form->{"id_$i"}));
       do_query($form, $dbh, $query, @values);
+      # saving the history
+      $form->{id} = $form->{"id_$i"};
+      if(!exists $form->{addition}) {
+        $form->{snumbers} = qq|invnumber_| . $form->{"invnumber_$i"};
+        $form->{addition} = "POSTED";
+        $form->save_history($form->dbconnect($myconfig));
+      }
+      # /saving the history
     }
   }
 
@@ -359,6 +364,7 @@ sub process_payment {
     OP::overpayment("", $myconfig, $form, $dbh, $paymentamount, $ml, 1);
   }
 
+  my $rc;
   if ($form->round_amount($paymentamount, 2) < 0) {
     $dbh->rollback;
     $rc = 0;