From: Sven Schöling Date: Tue, 9 Aug 2016 09:02:34 +0000 (+0200) Subject: IO: single-dbh X-Git-Tag: release-3.5.4~2086 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=c25aa13a62495c3784ad8476b39b175bff51cdd9;p=kivitendo-erp.git IO: single-dbh --- diff --git a/SL/IO.pm b/SL/IO.pm index b840e458c..7e638b5ee 100644 --- 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,36 @@ 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 = <commit() unless $params{dbh}; + 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); + + } 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); + } + }) or do { die SL::DB->client->error }; $main::lxdebug->leave_sub(); }