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