Revision 40c2c37c
Von Moritz Bunkus vor etwa 15 Jahren hinzugefügt
SL/IO.pm | ||
---|---|---|
1 | 1 |
package IO; |
2 | 2 |
|
3 |
use List::Util qw(first); |
|
4 |
use List::MoreUtils qw(any); |
|
5 |
|
|
3 | 6 |
use SL::DBUtils; |
4 | 7 |
|
5 | 8 |
use strict; |
... | ... | |
26 | 29 |
} |
27 | 30 |
|
28 | 31 |
|
32 |
sub set_datepaid { |
|
33 |
$main::lxdebug->enter_sub(); |
|
34 |
|
|
35 |
my $self = shift; |
|
36 |
my %params = @_; |
|
37 |
|
|
38 |
Common::check_params(\%params, qw(id table)); |
|
39 |
|
|
40 |
my $myconfig = \%main::myconfig; |
|
41 |
my $form = $main::form; |
|
42 |
|
|
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'; |
|
46 |
|
|
47 |
my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id); |
|
48 |
|
|
49 |
$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%') |
|
55 |
SQL |
|
56 |
|
|
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}; |
|
73 |
|
|
74 |
$main::lxdebug->leave_sub(); |
|
75 |
} |
|
76 |
|
|
77 |
|
|
29 | 78 |
1; |
Auch abrufbar als: Unified diff
Beim Buchen von Rechnungen/Zahlungen das Feld "datepaid" richtig setzen.
Zusätzlich noch ein Datenbankupgradescript, das die Felder in
bestehenden Einträgen berichtigt.