Es werden beim Storno jetzt nur noch die urspruenglichen acc_trans Eintraege storniert,
nachtraegliche Zahlungseingaenge bleiben unberuehrt.
do_query($form, $dbh, $query, $id);
# now copy acc_trans entries
- $query = qq|SELECT * FROM acc_trans WHERE trans_id = ?|;
- for my $row (@{ selectall_hashref_query($form, $dbh, $query, $id) }) {
- delete @$row{qw(itime mtime)};
+ $query = qq|SELECT a.*, c.link FROM acc_trans a LEFT JOIN chart c ON a.chart_id = c.id WHERE a.trans_id = ?|;
+ my $rowref = selectall_hashref_query($form, $dbh, $query, $id);
+
+ # kill all entries containing payments, which are the last 2n rows, of which the last has link =~ /paid/
+ while ($rowref->[-1]{link} =~ /paid/) {
+ splice(@$rowref, -2);
+ }
+
+ for my $row (@$rowref) {
+ delete @$row{qw(itime mtime link)};
$query = sprintf 'INSERT INTO acc_trans (%s) VALUES (%s)', join(', ', keys %$row), join(', ', map '?', values %$row);
$row->{trans_id} = $new_id;
$row->{amount} *= -1;
do_query($form, $dbh, $query, $id);
# now copy acc_trans entries
- $query = qq|SELECT * FROM acc_trans WHERE trans_id = ?|;
- for my $row (@{ selectall_hashref_query($form, $dbh, $query, $id) }) {
- delete @$row{qw(itime mtime)};
+ $query = qq|SELECT a.*, c.link FROM acc_trans a LEFT JOIN chart c ON a.chart_id = c.id WHERE a.trans_id = ?|;
+ my $rowref = selectall_hashref_query($form, $dbh, $query, $id);
+
+ # kill all entries containing payments, which are the last 2n rows, of which the last has link =~ /paid/
+ while ($rowref->[-1]{link} =~ /paid/) {
+ splice(@$rowref, -2);
+ }
+
+ for my $row (@$rowref) {
+ delete @$row{qw(itime mtime link)};
$query = sprintf 'INSERT INTO acc_trans (%s) VALUES (%s)', join(', ', keys %$row), join(', ', map '?', values %$row);
$row->{trans_id} = $new_id;
$row->{amount} *= -1;