From c25aa13a62495c3784ad8476b39b175bff51cdd9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sven=20Sch=C3=B6ling?= Date: Tue, 9 Aug 2016 11:02:34 +0200 Subject: [PATCH] IO: single-dbh --- SL/IO.pm | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) 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(); } -- 2.20.1