Revision c25aa13a
Von Sven Schöling vor mehr als 8 Jahren hinzugefügt
SL/IO.pm | ||
---|---|---|
4 | 4 |
use List::MoreUtils qw(any); |
5 | 5 |
|
6 | 6 |
use SL::DBUtils; |
7 |
use SL::DB; |
|
7 | 8 |
|
8 | 9 |
use strict; |
9 | 10 |
|
... | ... | |
40 | 41 |
my $myconfig = \%main::myconfig; |
41 | 42 |
my $form = $main::form; |
42 | 43 |
|
43 |
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); |
|
44 |
my $id = conv_i($params{id}); |
|
45 |
my $table = (any { $_ eq $params{table} } qw(ar ap gl)) ? $params{table} : 'ar'; |
|
44 |
SL::DB->client->with_transaction(sub { |
|
45 |
my $dbh = $params{dbh} || SL::DB->client->dbh; |
|
46 |
my $id = conv_i($params{id}); |
|
47 |
my $table = (any { $_ eq $params{table} } qw(ar ap gl)) ? $params{table} : 'ar'; |
|
46 | 48 |
|
47 |
my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id); |
|
49 |
my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id);
|
|
48 | 50 |
|
49 |
my $query = <<SQL; |
|
50 |
SELECT MAX(at.transdate) |
|
51 |
FROM acc_trans at |
|
52 |
LEFT JOIN chart c ON (at.chart_id = c.id) |
|
53 |
WHERE (at.trans_id = ?) |
|
54 |
AND (c.link LIKE '%paid%') |
|
51 |
my $query = <<SQL;
|
|
52 |
SELECT MAX(at.transdate)
|
|
53 |
FROM acc_trans at
|
|
54 |
LEFT JOIN chart c ON (at.chart_id = c.id)
|
|
55 |
WHERE (at.trans_id = ?)
|
|
56 |
AND (c.link LIKE '%paid%')
|
|
55 | 57 |
SQL |
56 | 58 |
|
57 |
my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id); |
|
58 |
|
|
59 |
if ($max_acc_trans_date && ($max_acc_trans_date ne $curr_datepaid)) { |
|
60 |
# 1. Fall: Es gab mindestens eine Zahlung, und das Datum der Zahlung entspricht nicht |
|
61 |
# dem vermerkten Zahlungsdatum. |
|
62 |
do_query($form, $dbh, qq|UPDATE $table SET datepaid = ? WHERE id = ?|, $max_acc_trans_date, $id); |
|
63 |
|
|
64 |
} elsif (!$max_acc_trans_date && ($curr_paid * 1)) { |
|
65 |
# 2. Fall: Es gab keine Zahlung, aber paid ist nicht 0. Das ist z.B. der Fall, wenn |
|
66 |
# die Funktion "als bezahlt buchen" verwendet oder wenn ein Beleg storniert wird. |
|
67 |
# In diesem Fall das letzte Modifikationsdatum als Bezahldatum nehmen, oder aber das |
|
68 |
# Erstelldatum, wenn keine Modifikation erfolgt ist (bei Stornos z.B.). |
|
69 |
do_query($form, $dbh, qq|UPDATE $table SET datepaid = COALESCE(mtime::date, itime::date) WHERE id = ?|, $id); |
|
70 |
} |
|
71 |
|
|
72 |
$dbh->commit() unless $params{dbh}; |
|
59 |
my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id); |
|
60 |
|
|
61 |
if ($max_acc_trans_date && ($max_acc_trans_date ne $curr_datepaid)) { |
|
62 |
# 1. Fall: Es gab mindestens eine Zahlung, und das Datum der Zahlung entspricht nicht |
|
63 |
# dem vermerkten Zahlungsdatum. |
|
64 |
do_query($form, $dbh, qq|UPDATE $table SET datepaid = ? WHERE id = ?|, $max_acc_trans_date, $id); |
|
65 |
|
|
66 |
} elsif (!$max_acc_trans_date && ($curr_paid * 1)) { |
|
67 |
# 2. Fall: Es gab keine Zahlung, aber paid ist nicht 0. Das ist z.B. der Fall, wenn |
|
68 |
# die Funktion "als bezahlt buchen" verwendet oder wenn ein Beleg storniert wird. |
|
69 |
# In diesem Fall das letzte Modifikationsdatum als Bezahldatum nehmen, oder aber das |
|
70 |
# Erstelldatum, wenn keine Modifikation erfolgt ist (bei Stornos z.B.). |
|
71 |
do_query($form, $dbh, qq|UPDATE $table SET datepaid = COALESCE(mtime::date, itime::date) WHERE id = ?|, $id); |
|
72 |
} |
|
73 |
}) or do { die SL::DB->client->error }; |
|
73 | 74 |
|
74 | 75 |
$main::lxdebug->leave_sub(); |
75 | 76 |
} |
Auch abrufbar als: Unified diff
IO: single-dbh