]> wagnertech.de Git - mfinanz.git/blobdiff - SL/DB/Manager/Part.pm
kivitendo 3.9.2-0.2
[mfinanz.git] / SL / DB / Manager / Part.pm
index b46f851cf2166cc142d6d17e082a88bbda47d740..b101d1a140a1ef95133faf6b6502dad3cac91617 100644 (file)
@@ -78,10 +78,9 @@ sub get_ordered_qty {
     FROM orderitems oi
     LEFT JOIN oe ON (oi.trans_id = oe.id)
     WHERE (oi.parts_id IN ($placeholders))
-      AND (NOT COALESCE(oe.quotation, FALSE))
+      AND oe.record_type = 'purchase_order'
       AND (NOT COALESCE(oe.closed,    FALSE))
       AND (NOT COALESCE(oe.delivered, FALSE))
-      AND (COALESCE(oe.vendor_id, 0) <> 0)
     GROUP BY oi.parts_id
 SQL
 
@@ -91,6 +90,75 @@ SQL
   return %qty_by_id;
 }
 
+sub get_open_ordered_qty {
+  my $class    = shift;
+  my $part_id  = shift;
+  return () unless $part_id;
+
+  my $query = <<SQL;
+WITH
+open_qty AS (
+  SELECT parts_id, sum(oi.qty) as sum
+  FROM orderitems oi
+  LEFT OUTER JOIN oe o ON (oi.trans_id = o.id)
+  WHERE
+    oi.parts_id = ?
+    AND (o.record_type = 'purchase_order')
+    AND (NOT COALESCE(o.closed,    FALSE))
+    AND (NOT COALESCE(o.delivered, FALSE))
+    AND (COALESCE(o.vendor_id, 0) <> 0)
+  GROUP BY oi.parts_id
+),
+
+open_orderitems_ids AS (
+  SELECT oi.id, parts_id
+  FROM orderitems oi
+  LEFT OUTER JOIN oe o ON (oi.trans_id = o.id)
+  WHERE
+    oi.parts_id = ?
+    AND (o.record_type = 'purchase_order')
+    AND (NOT COALESCE(o.closed,    FALSE))
+    AND (NOT COALESCE(o.delivered, FALSE))
+    AND (o.vendor_id is not null)
+),
+
+delivered_qty AS (
+  SELECT parts_id, sum(qty) AS sum
+  FROM delivery_order_items
+  WHERE id IN (
+    SELECT to_id from record_links
+    WHERE
+      from_id IN ( SELECT id FROM open_orderitems_ids)
+      AND from_table = 'orderitems'
+      AND to_table = 'delivery_order_items'
+  ) AND parts_id = ?
+  GROUP BY parts_id
+),
+
+open_ordered_qty AS (
+  SELECT
+    oq.parts_id,
+    oq.sum AS ordered_sum,
+    COALESCE(dq.sum,0.00) AS sum,
+    sum(COALESCE(oq.sum,0.00) - COALESCE(dq.sum,0.00)) AS open_qty
+  FROM open_qty oq
+  LEFT JOIN delivered_qty dq ON dq.parts_id = oq.parts_id
+  GROUP BY oq.parts_id, oq.sum, dq.sum
+)
+
+SELECT open_qty FROM open_ordered_qty
+
+SQL
+
+  my ($open_qty) = selectfirst_array_query(
+    $::form, $class->object_class->init_db->dbh,
+    $query, $part_id, $part_id, $part_id
+  );
+
+  $open_qty ||= 0;
+  return $open_qty
+}
+
 sub _sort_spec {
   (
     default  => [ 'partnumber', 1 ],