diff --git a/org.adempiere.base/src/org/compiere/wf/MWFProcess.java b/org.adempiere.base/src/org/compiere/wf/MWFProcess.java index 0752aa5b9f..b343120d18 100644 --- a/org.adempiere.base/src/org/compiere/wf/MWFProcess.java +++ b/org.adempiere.base/src/org/compiere/wf/MWFProcess.java @@ -369,9 +369,23 @@ public class MWFProcess extends X_AD_WF_Process // Start new Activity... MWFActivity activity = new MWFActivity (this, transitions[i].getAD_WF_Next_ID(), lastPO); + /** + * IDEMPIERE-3942 + * Implement JoinElement AND Status + */ + if(MWFNode.JOINELEMENT_AND.equals(activity.getNode().getJoinElement())) + { + if(!isJoinElementANDProcessed(activity)) + { + activity.delete(true, get_TrxName()); + continue; + } + } + activity.set_TrxName(trxName); activity.run(); + // only the first valid if XOR if (MWFNode.SPLITELEMENT_XOR.equals(split)) return true; @@ -379,7 +393,35 @@ public class MWFProcess extends X_AD_WF_Process return true; } // startNext - + /* + * IDEMPIERE-3942 + * Implement JoinElement AND Status + */ + private boolean isJoinElementANDProcessed(MWFActivity activity) { + + + Query queryNodeNextTest = new Query(Env.getCtx(), MWFNodeNext.Table_Name, "AD_WF_Next_ID = ?", get_TrxName()); + queryNodeNextTest.setParameters(activity.getAD_WF_Node_ID()); + List NodeNexts = queryNodeNextTest.list(); + for (MWFNodeNext nodeNext : NodeNexts) { + + Query queryMWFActivity = new Query(Env.getCtx(), MWFActivity.Table_Name, + "AD_WF_Process_ID = ? AND AD_WF_Node_ID = ? ", get_TrxName()); + + Object params[] = { activity.getAD_WF_Process_ID(), nodeNext.getAD_WF_Node_ID() }; + + queryMWFActivity.setParameters(params); + List parentActivitys = queryMWFActivity.list(); + for (MWFActivity parentActivity : parentActivitys) { + if(!parentActivity.isProcessed()) + return false; + } + + } + + return true; + } + /************************************************************************** * Set Workflow Responsible. * Searches for a Invoker.