epic-s6ts
[kivitendo-erp.git] / SL / ARAP.pm
index 6b75114..a2d7864 100644 (file)
@@ -4,6 +4,7 @@ use SL::AM;
 use SL::Common;
 use SL::DBUtils;
 use SL::MoreCommon;
+use SL::DB;
 use Data::Dumper;
 
 use strict;
@@ -19,7 +20,7 @@ sub close_orders_if_billed {
   my $myconfig  = \%main::myconfig;
   my $form      = $main::form;
 
-  my $dbh       = $params{dbh} || $form->get_standard_dbh($myconfig);
+  my $dbh       = $params{dbh} || SL::DB->client->dbh;
 
   # First, find all order IDs from which this invoice has been
   # created. Either directly by a conversion from an order to this invoice
@@ -51,24 +52,23 @@ sub close_orders_if_billed {
 
   my @oe_ids = keys %oe_id_map;
 
-#   $main::lxdebug->dump(0, "oe_ids", \@oe_ids);
-
   # No orders found? Nothing to do then, so let's return.
-  return $main::lxdebug->leave_sub() if (!scalar @oe_ids);
+  return $main::lxdebug->leave_sub unless @oe_ids;
 
-  my $all_units = AM->retrieve_all_units();
+  my $all_units = AM->retrieve_all_units;
 
   my $qtyfactor = $params{table} eq 'ap' ? '* -1' : '';
   my $q_billed  = qq|SELECT i.parts_id, i.qty ${qtyfactor} AS qty, i.unit, p.unit AS partunit
                      FROM invoice i
                      LEFT JOIN parts p ON (i.parts_id = p.id)
-                     WHERE i.trans_id = ?|;
+                     WHERE i.trans_id = ? AND i.assemblyitem is false|;
   my $h_billed  = prepare_query($form, $dbh, $q_billed);
 
   my $q_ordered = qq|SELECT oi.parts_id, oi.qty, oi.unit, p.unit AS partunit
                       FROM orderitems oi
                       LEFT JOIN parts p ON (oi.parts_id = p.id)
-                      WHERE oi.trans_id = ?|;
+                      WHERE oi.trans_id = ?
+                      AND not oi.optional|;
   my $h_ordered = prepare_query($form, $dbh, $q_ordered);
 
   my @close_oe_ids;
@@ -77,6 +77,10 @@ sub close_orders_if_billed {
   # said order. Again consider both direct conversions and indirect
   # conversions via delivery orders.
   foreach my $oe_id (@oe_ids) {
+
+    # Dont close orders with periodic invoice
+    next if SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $oe_id);
+
     # Direct conversions "order -> invoice":
     @links          = RecordLinks->get_links('dbh'        => $dbh,
                                              'from_table' => 'oe',
@@ -101,8 +105,6 @@ sub close_orders_if_billed {
 
     my @arap_ids = keys %arap_id_map;
 
-#     $main::lxdebug->dump(0, "for $oe_id arap_ids", \@arap_ids);
-
     next if (!scalar @arap_ids);
 
     # Retrieve all positions for this order. Calculate the ordered quantity for each position.
@@ -111,7 +113,7 @@ sub close_orders_if_billed {
     do_statement($form, $h_ordered, $q_ordered, $oe_id);
 
     while (my $ref = $h_ordered->fetchrow_hashref()) {
-      $ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor};
+      $ref->{baseqty} = $ref->{qty} * AM->convert_unit($ref->{unit}, $ref->{partunit}, $all_units);
 
       if ($ordered{$ref->{parts_id}}) {
         $ordered{$ref->{parts_id}}->{baseqty} += $ref->{baseqty};
@@ -127,7 +129,7 @@ sub close_orders_if_billed {
       do_statement($form, $h_billed, $q_billed, $arap_id);
 
       while (my $ref = $h_billed->fetchrow_hashref()) {
-        $ref->{baseqty} = $ref->{qty} * $all_units->{$ref->{unit}}->{factor} / $all_units->{$ref->{partunit}}->{factor};
+        $ref->{baseqty} = $ref->{qty} * AM->convert_unit($ref->{unit}, $ref->{partunit}, $all_units);
 
         if ($billed{$ref->{parts_id}}) {
           $billed{$ref->{parts_id}}->{baseqty} += $ref->{baseqty};
@@ -146,22 +148,19 @@ sub close_orders_if_billed {
       }
     }
 
-#     $main::lxdebug->message(0, "all_billed $all_billed");
-#     $main::lxdebug->dump(0, "ordered", \%ordered);
-#     $main::lxdebug->dump(0, "billed", \%billed);
-
     push @close_oe_ids, $oe_id if ($all_billed);
   }
 
-  $h_billed->finish();
-  $h_ordered->finish();
+  $h_billed->finish;
+  $h_ordered->finish;
 
   # Close orders that have been billed fully.
   if (scalar @close_oe_ids) {
-    my $query = qq|UPDATE oe SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar @close_oe_ids) . qq|)|;
-    do_query($form, $dbh, $query, @close_oe_ids);
-
-    $dbh->commit() unless ($params{dbh});
+    SL::DB->client->with_transaction(sub {
+      my $query = qq|UPDATE oe SET closed = TRUE WHERE id IN (| . join(', ', ('?') x scalar @close_oe_ids) . qq|)|;
+      do_query($form, $dbh, $query, @close_oe_ids);
+      1;
+    }) or do { die SL::DB->client->error };
   }
 
   $main::lxdebug->leave_sub();