Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision c25aa13a

Von Sven Schöling vor mehr als 8 Jahren hinzugefügt

  • ID c25aa13a62495c3784ad8476b39b175bff51cdd9
  • Vorgänger d1090a8c
  • Nachfolger 822cdc96

IO: single-dbh

Unterschiede anzeigen:

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