3 use List::Util qw(first);
 
   4 use List::MoreUtils qw(any);
 
  10 sub retrieve_partunits {
 
  11   $main::lxdebug->enter_sub();
 
  16   Common::check_params(\%params, qw(part_ids));
 
  18   my $myconfig = \%main::myconfig;
 
  19   my $form     = $main::form;
 
  21   my $dbh      = $params{dbh} || $form->get_standard_dbh();
 
  23   my $query    = qq|SELECT id, unit FROM parts WHERE id IN (| . join(', ', map { '?' } @{ $params{part_ids} }) . qq|)|;
 
  24   my %units    = selectall_as_map($form, $dbh, $query, 'id', 'unit', @{ $params{part_ids} });
 
  26   $main::lxdebug->leave_sub();
 
  33   $main::lxdebug->enter_sub();
 
  38   Common::check_params(\%params, qw(id table));
 
  40   my $myconfig = \%main::myconfig;
 
  41   my $form     = $main::form;
 
  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';
 
  47   my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id);
 
  50     SELECT MAX(at.transdate)
 
  52     LEFT JOIN chart c ON (at.chart_id = c.id)
 
  53     WHERE (at.trans_id = ?)
 
  54       AND (c.link LIKE '%paid%')
 
  57   my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id);
 
  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);
 
  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);
 
  72   $dbh->commit() unless $params{dbh};
 
  74   $main::lxdebug->leave_sub();