details:   https://code.openbravo.com/erp/devel/pi/rev/167acdfcb2b0
changeset: 20650:167acdfcb2b0
user:      Ioritz Cia <ioritz.cia <at> openbravo.com>
date:      Tue Jun 25 16:34:37 2013 +0200
summary:   Fixes issue 23999: Wrong production cost calculation.

diffstat:

 src-db/database/model/functions/MA_PRODUCTION_COST.xml |  73 +++++++++++------
 1 files changed, 46 insertions(+), 27 deletions(-)

diffs (175 lines):

diff -r febd6dafd083 -r 167acdfcb2b0 
src-db/database/model/functions/MA_PRODUCTION_COST.xml
--- a/src-db/database/model/functions/MA_PRODUCTION_COST.xml    Wed Jun 26 
11:42:39 2013 +0200
+++ b/src-db/database/model/functions/MA_PRODUCTION_COST.xml    Tue Jun 25 
16:34:37 2013 +0200
@@ -41,6 +41,7 @@
   v_count3                              VARCHAR2(32);
   v_productName                         M_Product.Name%TYPE;
   v_ProductionDate                      DATE;
+  v_CostingDate                         DATE;
   v_Result NUMBER:= 1;
   v_ProductionCost                      NUMBER;
   v_ProductionCost_Tmp                  NUMBER;
@@ -100,13 +101,31 @@
                         AND pl.CALCULATED = 'N'
                         AND pl.M_PRODUCT_ID = M_PRODUCTIONLINE.M_PRODUCT_ID);
 
-    SELECT MAX(pr.ad_client_id), MAX(pr.ad_org_id), MAX(movementdate), COUNT 
(*), MAX(pr.DOCUMENTNO)
-    INTO v_Client_ID, v_Org_ID, v_ProductionDate, v_count, v_ProductionNo
-    FROM M_PRODUCTION pr, M_PRODUCTIONLINE pl, M_PRODUCTIONPLAN pp
-    WHERE pr.m_production_id = p_Production_ID
-      AND pr.m_production_id = pp.m_production_id
-      AND pp.m_productionplan_id = pl.m_productionplan_id
-      AND pl.calculated = 'N';
+    SELECT count(1) INTO v_count
+    FROM DUAL WHERE EXISTS (SELECT 1 FROM ad_preference
+                      WHERE attribute = 'Cost_Eng_Ins_Migrated');
+
+    IF (v_count > 0) THEN
+      -- Costing engine migrated
+      SELECT MAX(pr.ad_client_id), MAX(pr.ad_org_id), MAX(pr.movementdate), 
MAX(trxprocessdate), COUNT (*), MAX(pr.DOCUMENTNO)
+      INTO v_Client_ID, v_Org_ID, v_ProductionDate, v_CostingDate, v_count, 
v_ProductionNo
+      FROM M_PRODUCTION pr, M_PRODUCTIONLINE pl
+        LEFT JOIN M_TRANSACTION t ON t.m_productionline_id = 
pl.m_productionline_id
+        , M_PRODUCTIONPLAN pp
+      WHERE pr.m_production_id = p_Production_ID
+        AND pr.m_production_id = pp.m_production_id
+        AND pp.m_productionplan_id = pl.m_productionplan_id
+        AND pl.calculated = 'N';
+    ELSE
+      -- Costing engine not migrated
+      SELECT MAX(pr.ad_client_id), MAX(pr.ad_org_id), MAX(movementdate), 
MAX(movementdate), COUNT (*), MAX(pr.DOCUMENTNO)
+      INTO v_Client_ID, v_Org_ID, v_ProductionDate, v_CostingDate, v_count, 
v_ProductionNo
+      FROM M_PRODUCTION pr, M_PRODUCTIONLINE pl, M_PRODUCTIONPLAN pp
+      WHERE pr.m_production_id = p_Production_ID
+        AND pr.m_production_id = pp.m_production_id
+        AND pp.m_productionplan_id = pl.m_productionplan_id
+        AND pl.calculated = 'N';
+    END IF;
 
     SELECT CASE COUNT(1) WHEN 0 THEN 'N' ELSE 'Y' END INTO v_iscostmigrated
     FROM DUAL
@@ -174,8 +193,8 @@
         FOR Cur_WIP IN (SELECT c.COST*ppl.MOVEMENTQTY AS cost, 
ppl.M_PRODUCTIONLINE_ID
                         FROM M_COSTING c, M_PRODUCTIONLINE ppl
                         WHERE c.M_PRODUCT_ID = ppl.M_PRODUCT_ID
-                          AND TRUNC(c.DATEFROM) <= v_ProductionDate
-                          AND TRUNC(c.DATETO) > v_ProductionDate
+                          AND TRUNC(c.DATEFROM) <= v_CostingDate
+                          AND TRUNC(c.DATETO) > v_CostingDate
                           AND ppl.PRODUCTIONTYPE = '-'
                           AND ppl.M_PRODUCTIONPLAN_ID = 
Cur_ProductionPlan.M_PRODUCTIONPLAN_ID
                           AND c.ISPRODUCTION='Y') LOOP
@@ -191,16 +210,16 @@
         FOR Cur_RawMaterial IN (SELECT c.COST*ppl.MOVEMENTQTY AS cost, 
ppl.M_PRODUCTIONLINE_ID
                                 FROM M_COSTING c, M_PRODUCTIONLINE ppl
                                 WHERE c.M_PRODUCT_ID = ppl.M_PRODUCT_ID
-                                  AND TRUNC(c.DATEFROM) <= v_ProductionDate
-                                  AND TRUNC(c.DATETO) > v_ProductionDate
+                                  AND TRUNC(c.DATEFROM) <= v_CostingDate
+                                  AND TRUNC(c.DATETO) > v_CostingDate
                                   AND ppl.PRODUCTIONTYPE = '-'
                                   AND ppl.M_PRODUCTIONPLAN_ID = 
Cur_ProductionPlan.M_PRODUCTIONPLAN_ID
                                   AND c.ISPRODUCTION='N'
                                   AND NOT EXISTS (SELECT 1
                                                   FROM M_COSTING, 
M_PRODUCTIONLINE
                                                   WHERE M_COSTING.M_PRODUCT_ID 
= M_PRODUCTIONLINE.M_PRODUCT_ID
-                                                    AND 
TRUNC(M_COSTING.DATEFROM) <= v_ProductionDate
-                                                    AND 
TRUNC(M_COSTING.DATETO) > v_ProductionDate
+                                                    AND 
TRUNC(M_COSTING.DATEFROM) <= v_CostingDate
+                                                    AND 
TRUNC(M_COSTING.DATETO) > v_CostingDate
                                                     AND 
M_PRODUCTIONLINE.PRODUCTIONTYPE = '-'
                                                     AND 
M_PRODUCTIONLINE.M_PRODUCT_ID = c.M_Product_ID
                                                     AND 
M_COSTING.ISPRODUCTION='Y')) LOOP
@@ -219,7 +238,7 @@
             AND pl.productiontype = '-'
             AND pl.calccost IS NULL;
           IF (v_count2 > 0) THEN
-            v_message := '@NoAvgCostDefined@ @Product@: ' || v_productname || 
', @Date@:' || v_ProductionDate;
+            v_message := '@NoAvgCostDefined@ @Product@: ' || v_productname || 
', @Date@:' || v_CostingDate;
             RAISE_APPLICATION_ERROR(-20000, v_message);
           END IF;
         END IF;
@@ -366,16 +385,16 @@
           SELECT COUNT(*) INTO v_count2
           FROM M_COSTING
           WHERE M_Product_ID = Cur_ProductionLine.M_PRODUCT_ID
-            AND TRUNC(DATETO) > v_ProductionDate
-            AND TRUNC(DATEFROM) <=v_ProductionDate
+            AND TRUNC(DATETO) > v_CostingDate
+            AND TRUNC(DATEFROM) <=v_CostingDate
             AND ISPRODUCTION='Y';
           v_ResultStr := 'previous costs ' || v_count2 || ' product: ' || 
Cur_ProductionLine.M_Product_ID;
           IF (v_count2 IS NOT NULL AND v_count2 <> 0) THEN
             SELECT COALESCE(COST,0) INTO v_CostOld
             FROM M_COSTING
             WHERE M_Product_ID = Cur_ProductionLine.M_PRODUCT_ID
-              AND TRUNC(DATETO) > v_ProductionDate
-              AND TRUNC(DATEFROM) <=v_ProductionDate
+              AND TRUNC(DATETO) > v_CostingDate
+              AND TRUNC(DATEFROM) <=v_CostingDate
               AND ISPRODUCTION='Y';
           ELSE
             v_CostOld := 0;
@@ -424,7 +443,7 @@
                             PRICE,  CUMQTY,
                             COST, ISPERMANENT, ISPRODUCTION, COSTTYPE)
                      VALUES (v_NextNo,now(), p_User_ID, now(), p_User_ID, 
Cur_ProductionLine.AD_CLIENT_ID,
-                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, TO_DATE('31-12-9999','DD-MM-YYYY'), 
v_ProductionDate, 'N',
+                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, TO_DATE('31-12-9999','DD-MM-YYYY'), 
v_CostingDate, 'N',
                             Cur_ProductionLine.M_PRODUCTIONLINE_ID, 
Cur_ProductionLine.MOVEMENTQTY,
                             ROUND(v_Cost/Cur_ProductionLine.MOVEMENTQTY,4), 
COALESCE(v_Qty,0) + Cur_ProductionLine.MOVEMENTQTY,
                             (CASE (Cur_ProductionLine.MOVEMENTQTY) WHEN 0 THEN 
0 ELSE ROUND(v_Cost/Cur_ProductionLine.MOVEMENTQTY,4) END), 'N', 'Y', 'AV');
@@ -435,8 +454,8 @@
               SELECT COUNT(*) INTO v_count2
               FROM M_COSTING
               WHERE M_Product_ID = Cur_ProductionLine.M_PRODUCT_ID
-                AND DATETO > v_ProductionDate
-                AND DATEFROM <= v_ProductionDate
+                AND DATETO > v_CostingDate
+                AND DATEFROM <= v_CostingDate
                 AND ISPRODUCTION = 'Y';
               IF (v_count2 = 1) THEN
                 --The previous calculated cost of the product must change its
@@ -444,12 +463,12 @@
                 SELECT M_Costing_ID, DATETO INTO v_Costing_ID, v_DateTo
                 FROM M_COSTING
                 WHERE M_Product_ID = Cur_ProductionLine.M_PRODUCT_ID
-                  AND DATETO > v_ProductionDate
-                  AND DATEFROM <=v_ProductionDate
+                  AND DATETO > v_CostingDate
+                  AND DATEFROM <=v_CostingDate
                   AND ISPRODUCTION='Y';
 
                 UPDATE M_COSTING
-                SET DATETO = v_ProductionDate
+                SET DATETO = v_CostingDate
                 WHERE M_Costing_ID = v_Costing_ID
                   AND ISPRODUCTION = 'Y';
 
@@ -482,7 +501,7 @@
                             COST,
                             ISPERMANENT, ISPRODUCTION, COSTTYPE)
                        VALUES (v_NextNo,now(), p_User_ID, now(), p_User_ID, 
Cur_ProductionLine.AD_CLIENT_ID,
-                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, v_DateTo, v_ProductionDate, 'N',
+                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, v_DateTo, v_CostingDate, 'N',
                             Cur_ProductionLine.M_PRODUCTIONLINE_ID, 
Cur_ProductionLine.MOVEMENTQTY,
                             ROUND(v_Cost/Cur_ProductionLine.MOVEMENTQTY,4), 
COALESCE(v_Qty,0) + Cur_ProductionLine.MOVEMENTQTY,
                             (CASE (v_Qty+Cur_ProductionLine.MOVEMENTQTY) WHEN 
0 THEN 0 ELSE 
ROUND(((v_Qty*v_CostOld)+(v_Cost))/(v_Qty+Cur_ProductionLine.MOVEMENTQTY),4)END),
@@ -490,7 +509,7 @@
               ELSIF (v_count2 = 0) THEN
                 SELECT COALESCE(MIN(DATEFROM), 
TO_DATE('31-12-9999','DD-MM-YYYY')) INTO v_DateTo
                 FROM M_COSTING
-                WHERE DATEFROM > v_ProductionDate
+                WHERE DATEFROM > v_CostingDate
                   AND M_PRODUCT_ID = Cur_ProductionLine.M_PRODUCT_ID;
 
                 --Calculate stocked product quantity just before production
@@ -512,7 +531,7 @@
                             COST,
                             ISPERMANENT, ISPRODUCTION, COSTTYPE)
                        VALUES (v_NextNo,now(), p_User_ID, now(), p_User_ID, 
Cur_ProductionLine.AD_CLIENT_ID,
-                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, v_DateTo, v_ProductionDate, 'N',
+                            Cur_ProductionLine.AD_ORG_ID, 
Cur_ProductionLine.M_PRODUCT_ID, v_DateTo, v_CostingDate, 'N',
                             Cur_ProductionLine.M_PRODUCTIONLINE_ID, 
Cur_ProductionLine.MOVEMENTQTY,
                             ROUND(v_Cost/Cur_ProductionLine.MOVEMENTQTY,4), 
COALESCE(v_Qty,0) + Cur_ProductionLine.MOVEMENTQTY,
                             (CASE (v_Qty+Cur_ProductionLine.MOVEMENTQTY) WHEN 
0 THEN 0 ELSE 
ROUND(((v_Qty*v_CostOld)+(v_Cost))/(v_Qty+Cur_ProductionLine.MOVEMENTQTY),4)END),

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to