details: https://code.openbravo.com/erp/devel/pi/rev/60e449f25f23 changeset: 17445:60e449f25f23 user: David Miguelez <david.miguelez <at> openbravo.com> date: Wed Jul 11 13:59:11 2012 +0200 summary: Fixes issue 20652: Bill of Materials validation results in a false positive
details: https://code.openbravo.com/erp/devel/pi/rev/a53efff1a3c8 changeset: 17446:a53efff1a3c8 user: David Miguelez <david.miguelez <at> openbravo.com> date: Wed Jul 11 16:10:29 2012 +0200 summary: Related to issue 20652: Remove M_PRODUCT_BOM_CHECK diffstat: src-db/database/model/functions/M_PRODUCT_BOM_CHECK.xml | 172 ---------------- src-db/database/sourcedata/AD_MODEL_OBJECT.xml | 12 + src-db/database/sourcedata/AD_PROCESS.xml | 2 +- src/org/openbravo/erpCommon/ad_process/VerifyBOM.java | 100 +++++++++ 4 files changed, 113 insertions(+), 173 deletions(-) diffs (truncated from 318 to 300 lines): diff -r c250255214e2 -r a53efff1a3c8 src-db/database/model/functions/M_PRODUCT_BOM_CHECK.xml --- a/src-db/database/model/functions/M_PRODUCT_BOM_CHECK.xml Thu Jul 05 10:35:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,172 +0,0 @@ -<?xml version="1.0"?> - <database name="FUNCTION M_PRODUCT_BOM_CHECK"> - <function name="M_PRODUCT_BOM_CHECK" type="NULL"> - <parameter name="pinstance_id" type="VARCHAR" mode="in"> - <default/> - </parameter> - <body><![CDATA[/************************************************************************* - * The contents of this file are subject to the Compiere Public - * License 1.1 ("License"); You may not use this file except in - * compliance with the License. You may obtain a copy of the License in - * the legal folder of your Openbravo installation. - * Software distributed under the License is distributed on an - * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing rights - * and limitations under the License. - * The Original Code is Compiere ERP & Business Solution - * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc. - * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, - * parts created by ComPiere are Copyright (C) ComPiere, Inc.; - * All Rights Reserved. - * Contributor(s): Openbravo SLU - * Contributions are Copyright (C) 2001-2012 Openbravo, S.L.U. - * - * Specifically, this derivative work is based upon the following Compiere - * file and version. - ************************************************************************* - * $Id: M_Product_BOM_Check.sql,v 1.2 2002/05/22 02:48:28 jjanke Exp $ - *** - * Title: Check BOM Structure (free of cycles) - * Description: - * Tree cannot contain BOMs which are already referenced - ************************************************************************/ - -- Logistice - v_ResultStr VARCHAR2(2000):=''; - v_Message VARCHAR2(2000):=''; - v_Record_ID VARCHAR2(32); - v_temp VARCHAR2(32); - -- Parameter - TYPE RECORD IS REF CURSOR; - Cur_Parameter RECORD; - -- Variables - v_Verified CHAR(1):='Y'; - v_IsBOM CHAR(1) ; - v_CountNo NUMBER; - FINISH_PROCESS BOOLEAN:=false; - BEGIN - -- Update AD_PInstance - DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID) ; - v_ResultStr:='PInstanceNotFound'; - AD_UPDATE_PINSTANCE(PInstance_ID, NULL, 'Y', NULL, NULL) ; - BEGIN --BODY - -- Get Parameters - v_ResultStr:='ReadingParameters'; - FOR Cur_Parameter IN - (SELECT i.Record_ID, - p.ParameterName, - p.P_String, - p.P_Number, - p.P_Date - FROM AD_PInstance i - LEFT JOIN AD_PInstance_Para p - ON i.AD_PInstance_ID=p.AD_PInstance_ID - WHERE i.AD_PInstance_ID=PInstance_ID - ORDER BY p.SeqNo - ) - LOOP - v_Record_ID:=Cur_Parameter.Record_ID; - END LOOP; -- Get Parameter - DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID) ; - v_temp:=C_CREATE_TEMPORARY_TABLES(); - -- Record ID is M_Product_ID of product to be tested - SELECT IsBOM INTO v_IsBOM FROM M_Product WHERE M_Product_ID=v_Record_ID; - -- No BOM - should not happen, but no problem - IF(v_IsBOM='N') THEN - FINISH_PROCESS:=true; - -- Did not find product - ELSIF(v_IsBOM<>'Y') THEN - RETURN; - END IF; - IF(NOT FINISH_PROCESS) THEN - -- Checking BOM Structure - v_ResultStr:='InsertingRoot'; - -- Table to put all BOMs - duplicate will cause exception - DELETE FROM C_TEMP_Selection2 WHERE Query_ID='0'; - INSERT INTO C_TEMP_Selection2(Query_ID, C_TEMP_Selection_ID) VALUES('0', v_Record_ID) ; - -- Table of root modes - DELETE FROM C_TEMP_Selection; - INSERT INTO C_TEMP_Selection(C_TEMP_Selection_ID) VALUES(v_Record_ID) ; - LOOP - -- How many do we have:1 - SELECT COUNT(*) INTO v_CountNo FROM C_TEMP_Selection; - -- Nothing to do - EXIT WHEN(v_CountNo=0) ; - -- Insert BOM Nodes into "All" table - BEGIN - INSERT - INTO C_TEMP_Selection2 - ( - Query_ID, - C_TEMP_Selection_ID - ) - SELECT '0', - p.M_Product_ID - FROM M_Product p - WHERE v_IsBOM='Y' - AND EXISTS - (SELECT * - FROM M_Product_BOM b - WHERE p.M_Product_ID=b.M_ProductBOM_ID - AND b.isactive='Y' - AND b.M_Product_ID IN - (SELECT C_TEMP_Selection_ID FROM C_TEMP_Selection) - ) - ; - EXCEPTION - WHEN others THEN - RAISE_APPLICATION_ERROR(-20000,'@LOOP_IN_BOM@'); - END; - - -- Insert BOM Nodes into temporary table - DELETE FROM C_TEMP_Selection2 WHERE Query_ID='1'; - INSERT - INTO C_TEMP_Selection2 - ( - Query_ID, - C_TEMP_Selection_ID - ) - SELECT '1', - p.M_Product_ID - FROM M_Product p - WHERE v_IsBOM='Y' - AND EXISTS - (SELECT * - FROM M_Product_BOM b - WHERE p.M_Product_ID=b.M_ProductBOM_ID - AND b.isactive='Y' - AND b.M_Product_ID IN - (SELECT C_TEMP_Selection_ID FROM C_TEMP_Selection) - ) - ; - -- Copy into root table - DELETE FROM C_TEMP_Selection; - INSERT - INTO C_TEMP_Selection - ( - C_TEMP_Selection_ID - ) - SELECT C_TEMP_Selection_ID FROM C_TEMP_Selection2 WHERE Query_ID='1'; - END LOOP; - END IF; --FINISH_PROCESS - --<<FINISH_PROCESS>> - -- Update AD_PInstance - UPDATE M_Product SET IsVerified='Y' WHERE M_Product_ID=v_Record_ID; - -- Update AD_PInstance - DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ; - AD_UPDATE_PINSTANCE(PInstance_ID, NULL, 'N', 1, v_Message) ; - RETURN; - END; --BODY -EXCEPTION -WHEN OTHERS THEN - v_ResultStr:= '@ERROR=' || SQLERRM; - DBMS_OUTPUT.PUT_LINE(v_ResultStr) ; - AD_UPDATE_PINSTANCE(PInstance_ID, NULL, 'N', 0, v_ResultStr) ; - -- - UPDATE M_Product SET IsVerified='N' WHERE M_Product_ID=v_Record_ID; - -- Commented by cromero 19102006 COMMIT; - -- - RETURN; -END M_PRODUCT_BOM_CHECK -]]></body> - </function> - </database> diff -r c250255214e2 -r a53efff1a3c8 src-db/database/sourcedata/AD_MODEL_OBJECT.xml --- a/src-db/database/sourcedata/AD_MODEL_OBJECT.xml Thu Jul 05 10:35:27 2012 +0200 +++ b/src-db/database/sourcedata/AD_MODEL_OBJECT.xml Wed Jul 11 16:10:29 2012 +0200 @@ -3906,6 +3906,18 @@ <!--9EDAD41A950B4A2A9CFB20151E1D4FA1--> <OBJECT_TYPE><![CDATA[S]]></OBJECT_TYPE> <!--9EDAD41A950B4A2A9CFB20151E1D4FA1--></AD_MODEL_OBJECT> +<!--A0DC35D75E03464E98927A7AFA384705--><AD_MODEL_OBJECT> +<!--A0DC35D75E03464E98927A7AFA384705--> <AD_MODEL_OBJECT_ID><![CDATA[A0DC35D75E03464E98927A7AFA384705]]></AD_MODEL_OBJECT_ID> +<!--A0DC35D75E03464E98927A7AFA384705--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--A0DC35D75E03464E98927A7AFA384705--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--A0DC35D75E03464E98927A7AFA384705--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--A0DC35D75E03464E98927A7AFA384705--> <ACTION><![CDATA[P]]></ACTION> +<!--A0DC35D75E03464E98927A7AFA384705--> <CLASSNAME><![CDATA[org.openbravo.erpCommon.ad_process.VerifyBOM]]></CLASSNAME> +<!--A0DC35D75E03464E98927A7AFA384705--> <ISDEFAULT><![CDATA[Y]]></ISDEFAULT> +<!--A0DC35D75E03464E98927A7AFA384705--> <AD_PROCESS_ID><![CDATA[136]]></AD_PROCESS_ID> +<!--A0DC35D75E03464E98927A7AFA384705--> <OBJECT_TYPE><![CDATA[S]]></OBJECT_TYPE> +<!--A0DC35D75E03464E98927A7AFA384705--></AD_MODEL_OBJECT> + <!--A843E8A63F05427B8A204810E7E7511B--><AD_MODEL_OBJECT> <!--A843E8A63F05427B8A204810E7E7511B--> <AD_MODEL_OBJECT_ID><![CDATA[A843E8A63F05427B8A204810E7E7511B]]></AD_MODEL_OBJECT_ID> <!--A843E8A63F05427B8A204810E7E7511B--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> diff -r c250255214e2 -r a53efff1a3c8 src-db/database/sourcedata/AD_PROCESS.xml --- a/src-db/database/sourcedata/AD_PROCESS.xml Thu Jul 05 10:35:27 2012 +0200 +++ b/src-db/database/sourcedata/AD_PROCESS.xml Wed Jul 11 16:10:29 2012 +0200 @@ -670,11 +670,11 @@ <!--136--> <HELP><![CDATA[The Verify BOM Structure checks the elements and steps which comprise a Bill of Materials.]]></HELP> <!--136--> <ACCESSLEVEL><![CDATA[3]]></ACCESSLEVEL> <!--136--> <ISUSERSTARTABLE><![CDATA[N]]></ISUSERSTARTABLE> -<!--136--> <PROCEDURENAME><![CDATA[M_Product_BOM_Check]]></PROCEDURENAME> <!--136--> <ISREPORT><![CDATA[N]]></ISREPORT> <!--136--> <ISDIRECTPRINT><![CDATA[N]]></ISDIRECTPRINT> <!--136--> <ISBACKGROUND><![CDATA[N]]></ISBACKGROUND> <!--136--> <ISJASPER><![CDATA[N]]></ISJASPER> +<!--136--> <ISEXTERNALSERVICE><![CDATA[N]]></ISEXTERNALSERVICE> <!--136--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID> <!--136--> <UIPATTERN><![CDATA[S]]></UIPATTERN> <!--136--> <ISADVANCEDFEATURE><![CDATA[N]]></ISADVANCEDFEATURE> diff -r c250255214e2 -r a53efff1a3c8 src/org/openbravo/erpCommon/ad_process/VerifyBOM.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/openbravo/erpCommon/ad_process/VerifyBOM.java Wed Jul 11 16:10:29 2012 +0200 @@ -0,0 +1,100 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.1 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo SLU + * All portions are Copyright (C) 2012 Openbravo SLU + * All Rights Reserved. + * Contributor(s): ______________________________________. + ************************************************************************ + */ + +package org.openbravo.erpCommon.ad_process; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.openbravo.dal.service.OBDal; +import org.openbravo.erpCommon.utility.OBError; +import org.openbravo.erpCommon.utility.OBMessageUtils; +import org.openbravo.model.common.plm.Product; +import org.openbravo.model.common.plm.ProductBOM; +import org.openbravo.scheduling.ProcessBundle; +import org.openbravo.service.db.DalBaseProcess; + +public class VerifyBOM extends DalBaseProcess { + + static Logger log4j = Logger.getLogger(VerifyBOM.class); + + public void doExecute(ProcessBundle bundle) throws Exception { + OBError msg = new OBError(); + msg.setType("Success"); + msg.setTitle(OBMessageUtils.messageBD("Success")); + + try { + final String strProduct = (String) bundle.getParams().get("M_Product_ID"); + Product product = OBDal.getInstance().get(Product.class, strProduct); + + List<Product> productList = new ArrayList<Product>(); + productList.add(product); + List<ProductBOM> productBOMList = product.getProductBOMList(); + + boolean cycle = checkForcycles(productList, productBOMList); + + if (cycle) { + msg.setType("Error"); + msg.setTitle(OBMessageUtils.messageBD("Error")); + msg.setMessage("@LOOP_IN_BOM@"); + } else { + product.setBOMVerified(true); + OBDal.getInstance().save(product); + } + + } catch (final Exception e) { + log4j.error("Exception found in VerifyBOM: ", e); + msg.setType("Error"); + msg.setTitle(OBMessageUtils.messageBD("Error")); + msg.setMessage(e.getMessage()); + + } finally { + bundle.setResult(msg); + } + } + + /** + * This method checks recursively if there is a cycle in the lists + */ + private boolean checkForcycles(List<Product> productList, List<ProductBOM> productBOMList) { + // Checks if some element of the first list appears in the second + for (Product product : productList) { + for (ProductBOM productBOM : productBOMList) { + if (product.equals(productBOM.getBOMProduct())) { + return true; + } ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Openbravo-commits mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbravo-commits
