details:   https://code.openbravo.com/erp/devel/pi/rev/a3731e13318b
changeset: 32907:a3731e13318b
user:      David Miguelez <david.miguelez <at> openbravo.com>
date:      Thu Nov 02 11:43:07 2017 +0100
summary:   Fixes Issue 37168, 37201. Fixes problem when checking negative
Stock in the system.

* Function m_check_stock filters records by the natural tree of the selected
  Organization instead of the Organization itself. This is done due to the
  fact that the Organization of the Storage Detail might not be the
  same as the Organization of the Bin
* Function m_check_stock has an additional optional parameter, locator_id
  This is done to filter the records just by the selected bin
* All PL's of Core that calls the m_check_stock has been adapted to support
  the extra parameter

details:   https://code.openbravo.com/erp/devel/pi/rev/e0ae38b3f82b
changeset: 32908:e0ae38b3f82b
user:      David Miguelez <david.miguelez <at> openbravo.com>
date:      Thu Nov 02 13:02:26 2017 +0100
summary:   Related to Issue 37168, 37201.

* Fixes check stock method in InventoryCountProcess
* When completing a Goods Movement, do not check stock for Bin To
  - It has been checked that only negative stock can be moved to that bin
    if the Inventory Status allows over issue
  - If it has already negative stock previously, do not check it here

diffstat:

 src-db/database/model/functions/MA_WORKEFFORT_VALIDATE.xml       |   2 +-
 src-db/database/model/functions/M_CHECK_STOCK.xml                |   8 ++-
 src-db/database/model/functions/M_INOUT_POST.xml                 |   2 +-
 src-db/database/model/functions/M_INTERNAL_CONSUMPTION_POST1.xml |   2 +-
 src-db/database/model/functions/M_INVENTORY_POST.xml             |   2 +-
 src-db/database/model/functions/M_MOVEMENT_POST.xml              |  14 +++-
 src-db/database/model/functions/M_PRODUCTION_RUN.xml             |   2 +-
 src/org/openbravo/materialmgmt/InventoryCountProcess.java        |  29 
++++-----
 8 files changed, 33 insertions(+), 28 deletions(-)

diffs (170 lines):

diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/MA_WORKEFFORT_VALIDATE.xml
--- a/src-db/database/model/functions/MA_WORKEFFORT_VALIDATE.xml        Thu Nov 
02 08:54:07 2017 +0100
+++ b/src-db/database/model/functions/MA_WORKEFFORT_VALIDATE.xml        Thu Nov 
02 13:02:26 2017 +0100
@@ -401,7 +401,7 @@
             ;
           END IF;
         IF(CUR_PL_Post.IsStocked<>'N') THEN
-          M_Check_Stock(CUR_PL_Post.M_Product_ID, v_Client_ID, v_AD_Org_ID, 
v_Result, v_Message) ;
+          M_Check_Stock(CUR_PL_Post.M_Product_ID, v_Client_ID, v_AD_Org_ID, 
v_Result, v_Message, CUR_PL_Post.M_Locator_ID) ;
           IF (v_Result=0) THEN
             v_Message:=v_Message || ' @Inline@ ' || CUR_PL_Post.line;
             RAISE_APPLICATION_ERROR(-20000, v_Message);
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_CHECK_STOCK.xml
--- a/src-db/database/model/functions/M_CHECK_STOCK.xml Thu Nov 02 08:54:07 
2017 +0100
+++ b/src-db/database/model/functions/M_CHECK_STOCK.xml Thu Nov 02 13:02:26 
2017 +0100
@@ -16,6 +16,9 @@
       <parameter name="p_message" type="VARCHAR" mode="out">
         <default/>
       </parameter>
+      <parameter name="p_m_locator_id" type="VARCHAR" mode="in">
+        <default><![CDATA[NULL]]></default>
+      </parameter>
       
<body><![CDATA[/*************************************************************************
 * The contents of this file are subject to the Openbravo  Public  License
 * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
@@ -47,9 +50,10 @@
       JOIN M_INVENTORYSTATUS INVS ON (INVS.M_INVENTORYSTATUS_ID = 
L.M_INVENTORYSTATUS_ID)
       WHERE M_PRODUCT_ID=p_M_Product_ID
       AND SD.AD_CLIENT_ID=p_AD_Client_ID
-      AND SD.AD_ORG_ID=p_AD_Org_ID
+      AND AD_ORG_ISINNATURALTREE(SD.AD_ORG_ID, p_AD_Org_ID, p_AD_Client_ID) = 
'Y'
       AND (QTYONHAND<0 OR COALESCE(QTYORDERONHAND,0)<0)
-      AND INVS.OVERISSUE='N');    
+      AND INVS.OVERISSUE='N'
+      AND L.M_LOCATOR_ID = COALESCE(p_m_locator_id, L.M_LOCATOR_ID));
   IF(v_ExistsNegativeStock <> 0) THEN
     p_Result:=0;
     p_Message:='@NotEnoughStocked@';
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_INOUT_POST.xml
--- a/src-db/database/model/functions/M_INOUT_POST.xml  Thu Nov 02 08:54:07 
2017 +0100
+++ b/src-db/database/model/functions/M_INOUT_POST.xml  Thu Nov 02 13:02:26 
2017 +0100
@@ -829,7 +829,7 @@
               END IF;
             END IF;
             IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
-              M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, 
Cur_InOutLine.AD_Org_ID, v_Result, v_Message) ;
+              M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, 
Cur_InOutLine.AD_Org_ID, v_Result, v_Message, Cur_InOutLine.M_Locator_ID) ;
               IF v_Result=0 THEN
                 SELECT name INTO v_ProductName FROM M_Product WHERE 
M_Product_id = Cur_InOutLine.M_Product_ID;
                            RAISE_APPLICATION_ERROR(-20000, v_Message||' 
'||'@line@'||' '||Cur_InOutLine.line||', '||'@Product@'||' '||v_ProductName) ;
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_INTERNAL_CONSUMPTION_POST1.xml
--- a/src-db/database/model/functions/M_INTERNAL_CONSUMPTION_POST1.xml  Thu Nov 
02 08:54:07 2017 +0100
+++ b/src-db/database/model/functions/M_INTERNAL_CONSUMPTION_POST1.xml  Thu Nov 
02 13:02:26 2017 +0100
@@ -161,7 +161,7 @@
             v_MoveDate, (Cur_MoveLine.MovementQty * -1), 
Cur_MoveLine.M_Internal_ConsumptionLine_ID, Cur_MoveLine.M_Product_UOM_ID,
             (Cur_MoveLine.QuantityOrder * -1), Cur_MoveLine.C_UOM_ID
         );
-        M_Check_Stock(Cur_MoveLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message) ;
+        M_Check_Stock(Cur_MoveLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message, Cur_MoveLine.M_Locator_ID) ;
         IF (v_Result = 0) THEN
           RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' 
'||Cur_MoveLine.line) ;
         END IF;
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_INVENTORY_POST.xml
--- a/src-db/database/model/functions/M_INVENTORY_POST.xml      Thu Nov 02 
08:54:07 2017 +0100
+++ b/src-db/database/model/functions/M_INVENTORY_POST.xml      Thu Nov 02 
13:02:26 2017 +0100
@@ -255,7 +255,7 @@
             Cur_InvLine.QuantityOrder-COALESCE(Cur_InvLine.QuantityOrderBook, 
0), Cur_InvLine.C_UOM_ID
           )
           ;
-        M_Check_Stock(Cur_InvLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message) ;
+        M_Check_Stock(Cur_InvLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message, Cur_InvLine.M_Locator_ID) ;
         IF v_Result=0 THEN
           RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' 
'||Cur_InvLine.line) ;
         END IF;
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_MOVEMENT_POST.xml
--- a/src-db/database/model/functions/M_MOVEMENT_POST.xml       Thu Nov 02 
08:54:07 2017 +0100
+++ b/src-db/database/model/functions/M_MOVEMENT_POST.xml       Thu Nov 02 
13:02:26 2017 +0100
@@ -280,6 +280,12 @@
               (Cur_MoveLine.QuantityOrder * -1), Cur_MoveLine.C_UOM_ID
             )
             ;
+          --Check Stock for Locator from which the Stock is going to be picked
+          M_Check_Stock(Cur_MoveLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message, Cur_MoveLine.M_Locator_ID) ;
+          IF (v_Result = 0) THEN
+            RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' 
'||Cur_MoveLine.line) ;
+          END IF;
+          
           -- TO
           INSERT
           INTO M_Transaction
@@ -299,11 +305,9 @@
               Cur_MoveLine.QuantityOrder, Cur_MoveLine.C_UOM_ID
             )
             ;
-          M_Check_Stock(Cur_MoveLine.M_Product_ID, v_Client_ID, v_Org_ID, 
v_Result, v_Message) ;
-          
-          IF (v_Result = 0) THEN
-            RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' 
'||Cur_MoveLine.line) ;
-          END IF;
+          --No need to check the Stock for the Locator to which the Stock is 
gointg to be moved
+          --It has been validated before that the quantity to be moved is 
positive or that the locator to allows negative stock
+          --If the Locator to has already negative stock before this 
transaction, the goods movement should not be stopped
         END LOOP;
       END; -- FOR COMMIT
     END IF;--END_PROCESS
diff -r ae1e2a462004 -r e0ae38b3f82b 
src-db/database/model/functions/M_PRODUCTION_RUN.xml
--- a/src-db/database/model/functions/M_PRODUCTION_RUN.xml      Thu Nov 02 
08:54:07 2017 +0100
+++ b/src-db/database/model/functions/M_PRODUCTION_RUN.xml      Thu Nov 02 
13:02:26 2017 +0100
@@ -659,7 +659,7 @@
           CUR_PL_Post.MovementDate, CUR_PL_Post.MovementQty, 
CUR_PL_Post.M_Product_UOM_ID, CUR_PL_Post.QuantityOrder,
           CUR_PL_Post.C_UOM_ID
       );
-      M_Check_Stock(CUR_PL_Post.M_Product_ID, v_Client_ID, v_Org_ID, v_Result, 
v_Message) ;
+      M_Check_Stock(CUR_PL_Post.M_Product_ID, v_Client_ID, v_Org_ID, v_Result, 
v_Message, CUR_PL_Post.M_Locator_ID) ;
       IF (v_Result = 0) THEN
         v_Message:=v_Message || ' @Inline@ ' || CUR_PL_Post.line;
         RAISE_APPLICATION_ERROR(-20000, v_Message);
diff -r ae1e2a462004 -r e0ae38b3f82b 
src/org/openbravo/materialmgmt/InventoryCountProcess.java
--- a/src/org/openbravo/materialmgmt/InventoryCountProcess.java Thu Nov 02 
08:54:07 2017 +0100
+++ b/src/org/openbravo/materialmgmt/InventoryCountProcess.java Thu Nov 02 
13:02:26 2017 +0100
@@ -56,14 +56,12 @@
 import org.openbravo.materialmgmt.hook.InventoryCountCheckHook;
 import org.openbravo.materialmgmt.hook.InventoryCountProcessHook;
 import org.openbravo.model.ad.access.User;
-import org.openbravo.model.common.enterprise.Locator;
 import org.openbravo.model.common.enterprise.Organization;
 import org.openbravo.model.common.plm.AttributeSet;
 import org.openbravo.model.common.plm.AttributeSetInstance;
 import org.openbravo.model.common.plm.Product;
 import org.openbravo.model.financialmgmt.calendar.Period;
 import org.openbravo.model.financialmgmt.calendar.PeriodControl;
-import org.openbravo.model.materialmgmt.onhandquantity.InventoryStatus;
 import org.openbravo.model.materialmgmt.onhandquantity.StorageDetail;
 import org.openbravo.model.materialmgmt.transaction.InventoryCount;
 import org.openbravo.model.materialmgmt.transaction.InventoryCountLine;
@@ -419,21 +417,20 @@
     final StringBuilder hqlString = new StringBuilder();
     hqlString.append("select sd.id ");
     hqlString.append(" from MaterialMgmtInventoryCountLine as icl");
-    hqlString.append(" , " + StorageDetail.ENTITY_NAME + " as sd");
-    hqlString.append(" , " + Locator.ENTITY_NAME + " as l");
-    hqlString.append(" , " + InventoryStatus.ENTITY_NAME + " as invs");
-    hqlString.append(" where icl." + InventoryCountLine.PROPERTY_PHYSINVENTORY 
+ ".id = ?");
-    hqlString.append("   and sd." + StorageDetail.PROPERTY_PRODUCT + " = icl."
-        + InventoryCountLine.PROPERTY_PRODUCT);
-    hqlString.append("   and sd." + StorageDetail.PROPERTY_ORGANIZATION + " = 
icl."
-        + InventoryCountLine.PROPERTY_ORGANIZATION);
-    hqlString.append("   and (sd." + StorageDetail.PROPERTY_QUANTITYONHAND + " 
< 0");
-    hqlString.append("     or sd." + StorageDetail.PROPERTY_ONHANDORDERQUANITY 
+ " < 0");
+    hqlString.append(" , MaterialMgmtStorageDetail as sd");
+    hqlString.append(" , Locator as l");
+    hqlString.append(" , MaterialMgmtInventoryStatus as invs");
+    hqlString.append(" where icl.physInventory.id = ?");
+    hqlString.append("   and sd.product = icl.product");
+    hqlString.append("   and (sd.quantityOnHand < 0");
+    hqlString.append("     or sd.onHandOrderQuanity < 0");
     hqlString.append("     )");
-    hqlString.append("   and sd." + StorageDetail.PROPERTY_STORAGEBIN + ".id = 
l.id");
-    hqlString.append("   and l." + Locator.PROPERTY_INVENTORYSTATUS + ".id = 
invs.id");
-    hqlString.append("   and invs." + InventoryStatus.PROPERTY_OVERISSUE + " = 
false");
-    hqlString.append(" order by icl." + InventoryCountLine.PROPERTY_LINENO);
+    // Check only negative Stock for the Bins of the Lines of the Physical 
Inventory
+    hqlString.append("   and sd.storageBin.id = icl.storageBin.id");
+    hqlString.append("   and l.id = icl.storageBin.id");
+    hqlString.append("   and l.inventoryStatus.id = invs.id");
+    hqlString.append("   and invs.overissue = false");
+    hqlString.append(" order by icl.lineNo");
 
     final Session session = OBDal.getInstance().getSession();
     final Query query = session.createQuery(hqlString.toString());

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to