Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / IO.pm
index b840e45..c0d6987 100644 (file)
--- a/SL/IO.pm
+++ b/SL/IO.pm
@@ -4,6 +4,7 @@ use List::Util qw(first);
 use List::MoreUtils qw(any);
 
 use SL::DBUtils;
+use SL::DB;
 
 use strict;
 
@@ -40,36 +41,38 @@ sub set_datepaid {
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
 
-  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
-  my $id       = conv_i($params{id});
-  my $table    = (any { $_ eq $params{table} } qw(ar ap gl)) ? $params{table} : 'ar';
+  SL::DB->client->with_transaction(sub {
+    my $dbh      = $params{dbh} || SL::DB->client->dbh;
+    my $id       = conv_i($params{id});
+    my $table    = (any { $_ eq $params{table} } qw(ar ap gl)) ? $params{table} : 'ar';
 
-  my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id);
+    my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id);
 
-  my $query    = <<SQL;
-    SELECT MAX(at.transdate)
-    FROM acc_trans at
-    LEFT JOIN chart c ON (at.chart_id = c.id)
-    WHERE (at.trans_id = ?)
-      AND (c.link LIKE '%paid%')
+    my $query    = <<SQL;
+      SELECT MAX(at.transdate)
+      FROM acc_trans at
+      LEFT JOIN chart c ON (at.chart_id = c.id)
+      WHERE (at.trans_id = ?)
+        AND (c.link LIKE '%paid%')
 SQL
 
-  my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id);
+    my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id);
 
-  if ($max_acc_trans_date && ($max_acc_trans_date ne $curr_datepaid)) {
-    # 1. Fall: Es gab mindestens eine Zahlung, und das Datum der Zahlung entspricht nicht
-    # dem vermerkten Zahlungsdatum.
-    do_query($form, $dbh, qq|UPDATE $table SET datepaid = ? WHERE id = ?|, $max_acc_trans_date, $id);
+    if ($max_acc_trans_date && ($max_acc_trans_date ne $curr_datepaid)) {
+      # 1. Fall: Es gab mindestens eine Zahlung, und das Datum der Zahlung entspricht nicht
+      # dem vermerkten Zahlungsdatum.
+      do_query($form, $dbh, qq|UPDATE $table SET datepaid = ? WHERE id = ?|, $max_acc_trans_date, $id);
 
-  } elsif (!$max_acc_trans_date && ($curr_paid * 1)) {
-    # 2. Fall: Es gab keine Zahlung, aber paid ist nicht 0. Das ist z.B. der Fall, wenn
-    # die Funktion "als bezahlt buchen" verwendet oder wenn ein Beleg storniert wird.
-    # In diesem Fall das letzte Modifikationsdatum als Bezahldatum nehmen, oder aber das
-    # Erstelldatum, wenn keine Modifikation erfolgt ist (bei Stornos z.B.).
-    do_query($form, $dbh, qq|UPDATE $table SET datepaid = COALESCE(mtime::date, itime::date) WHERE id = ?|, $id);
-  }
+    } elsif (!$max_acc_trans_date && ($curr_paid * 1)) {
+      # 2. Fall: Es gab keine Zahlung, aber paid ist nicht 0. Das ist z.B. der Fall, wenn
+      # die Funktion "als bezahlt buchen" verwendet oder wenn ein Beleg storniert wird.
+      # In diesem Fall das letzte Modifikationsdatum als Bezahldatum nehmen, oder aber das
+      # Erstelldatum, wenn keine Modifikation erfolgt ist (bei Stornos z.B.).
+      do_query($form, $dbh, qq|UPDATE $table SET datepaid = COALESCE(mtime::date, itime::date) WHERE id = ?|, $id);
+    }
 
-  $dbh->commit() unless $params{dbh};
+    1;
+  }) or do { die SL::DB->client->error };
 
   $main::lxdebug->leave_sub();
 }