IDEMPIERE-2405 Implement SaaS support for Setup Wizard

This commit is contained in:
Carlos Ruiz 2015-01-16 18:44:33 -05:00
parent 2e8fce6fde
commit 03fb5cbda7
4 changed files with 92 additions and 46 deletions

View File

@ -0,0 +1,11 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Jan 16, 2015 5:50:47 PM COT
-- IDEMPIERE-2405 Implement SaaS support for Setup Wizard
UPDATE AD_Val_Rule SET Code='AD_Workflow.WorkflowType IN (''G'',''W'')',Updated=TO_DATE('2015-01-16 17:50:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Val_Rule_ID=52006
;
SELECT register_migration_script('201501161751_IDEMPIERE-2405.sql') FROM dual
;

View File

@ -0,0 +1,8 @@
-- Jan 16, 2015 5:50:47 PM COT
-- IDEMPIERE-2405 Implement SaaS support for Setup Wizard
UPDATE AD_Val_Rule SET Code='AD_Workflow.WorkflowType IN (''G'',''W'')',Updated=TO_TIMESTAMP('2015-01-16 17:50:47','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Val_Rule_ID=52006
;
SELECT register_migration_script('201501161751_IDEMPIERE-2405.sql') FROM dual
;

View File

@ -43,6 +43,7 @@ import org.adempiere.webui.util.TreeUtils;
import org.compiere.apps.form.SetupWizard;
import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MRole;
import org.compiere.model.X_AD_CtxHelp;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
@ -68,6 +69,7 @@ import org.zkoss.zul.Treechildren;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Treerow;
import org.zkoss.zul.Vbox;
/**
* View for Setup Wizard
*
@ -88,6 +90,8 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
private Treeitem firstOpenNode = null;
private Treeitem firstOpenWF = null;
private Treeitem firstWF = null;
private int cntNodes = 0;
private int cntSolved = 0;
private Label pretitleLabel = new Label(Msg.getMsg(Env.getCtx(), "SetupTask"));
private Label titleLabel = new Label();
@ -181,6 +185,8 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
* Load Wizard Nodes
*/
private void loadWizardNodes() {
cntNodes = 0;
cntSolved = 0;
nextItems.removeAll(nextItems);
Treechildren treeChildren = wfnodeTree.getTreechildren();
List<MWorkflow> wfwizards = getWfWizards();
@ -200,9 +206,19 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
protected void addWfEntry(MWorkflow wfwizard) {
allFinished = true;
allPending = true;
Treechildren treeChildren = wfnodeTree.getTreechildren();
Treeitem treeitemwf = new Treeitem();
Treechildren treeChildren = wfnodeTree.getTreechildren();
treeChildren.appendChild(treeitemwf);
addNodes(wfwizard, treeitemwf);
if ( treeitemwf.getTreechildren() == null
|| treeitemwf.getTreechildren().getChildren() == null
|| treeitemwf.getTreechildren().getChildren().size() == 0) {
// no nodes
treeChildren.removeChild(treeitemwf);
treeitemwf = null;
return;
}
if (firstWF == null)
firstWF = treeitemwf;
@ -211,7 +227,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
Div div = new Div();
div.setStyle("display:inline;");
div.appendChild(wizardLabel);
Treerow treerow = new Treerow();
treerow.setStyle("vertical-align:top;");
treeitemwf.appendChild(treerow);
@ -222,7 +237,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
nextItems.add(treeitemwf);
if (openNodes.contains(wfwizard.getAD_Workflow_ID()))
treeitemwf.setOpen(true);
addNodes(wfwizard, treeitemwf);
if (firstOpenWF == treeitemwf && allPending) {
firstOpenNode = firstOpenWF;
}
@ -251,6 +265,20 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
}
private void addWfNode(MWFNode node, Treeitem treeitemwf) {
if (MWFNode.ACTION_UserWindow.equals(node.getAction()) && node.getAD_Window_ID() > 0) {
if (MRole.getDefault().getWindowAccess(node.getAD_Window_ID()) == null)
return;
} else if (MWFNode.ACTION_UserForm.equals(node.getAction()) && node.getAD_Form_ID() > 0) {
if (MRole.getDefault().getFormAccess(node.getAD_Form_ID()) == null)
return;
} else if ((MWFNode.ACTION_AppsProcess.equals(node.getAction()) || MWFNode.ACTION_AppsReport.equals(node.getAction())) && node.getAD_Process_ID() > 0) {
if (MRole.getDefault().getProcessAccess(node.getAD_Process_ID()) == null)
return;
} else if (MWFNode.ACTION_AppsTask.equals(node.getAction()) && node.getAD_Task_ID() > 0) {
if (MRole.getDefault().getTaskAccess(node.getAD_Task_ID()) == null)
return;
}
/* Color of node according to wizard status */
Label nodeLabel = new Label(node.getName(true));
MWizardProcess wp = MWizardProcess.get(Env.getCtx(), node.getAD_WF_Node_ID(), Env.getAD_Client_ID(Env.getCtx()));
@ -270,9 +298,11 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
nodeLabel.setZclass("tree-setupwizard-nostatus");
}
}
cntNodes++;
if ( MWizardProcess.WIZARDSTATUS_Finished.equals(status)
|| MWizardProcess.WIZARDSTATUS_Skipped.equals(status)) {
allPending = false;
cntSolved++;
} else {
allFinished = false;
}
@ -465,14 +495,12 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
} // jbInit
private void refreshProgress() {
int nodes = getNodesCnt();
int solved = getWizardCnt();
int percent = solved * 100;
if (nodes > 0)
percent = percent / nodes;
int percent = cntSolved * 100;
if (cntNodes > 0)
percent = percent / cntNodes;
else
percent = 0;
Object[] args = new Object[] {solved, nodes, percent};
Object[] args = new Object[] {cntSolved, cntNodes, percent};
String msg = Msg.getMsg(Env.getCtx(), "SetupWizardProgress", args);
progressLabel.setText(msg);
progressbar.setValue(percent);
@ -496,7 +524,7 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
if (e.getTarget() == wfnodeTree) {
onTreeSelection(e);
} else if (e.getTarget() == bRefresh) {
showInRightPanel(0, m_node.getAD_WF_Node_ID());
repaintTree();
} else if (e.getTarget() == bOK) {
int userid = 0;
allFinished=true;
@ -672,7 +700,6 @@ public class WSetupWizard extends SetupWizard implements IFormController, EventL
private void setNotesPanelVisible(boolean visible) {
notesLabel.setVisible(visible);
notesField.setVisible(visible);
bRefresh.setVisible(visible);
bOK.setVisible(visible);
statusLabel.setVisible(visible);
statusField.setVisible(visible);

View File

@ -18,9 +18,9 @@ package org.compiere.apps.form;
import java.util.List;
import org.adempiere.model.MWizardProcess;
import org.compiere.model.MClient;
import org.compiere.model.Query;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.wf.MWFNode;
import org.compiere.wf.MWorkflow;
@ -39,41 +39,41 @@ public class SetupWizard
public MWFNode m_node;
/**
* Get the number of workflow wizard nodes
*/
public int getNodesCnt() {
/* TODO: SaaS filter */
final String sql = "SELECT COUNT(1) " +
"FROM AD_Workflow w " +
"JOIN AD_WF_Node n ON (n.AD_Workflow_ID=w.AD_Workflow_ID) " +
"WHERE w.WorkflowType='W' " + // Wizard
"AND w.IsActive='Y' " +
"AND n.IsActive='Y'";
return DB.getSQLValue(null, sql);
}
/**
* Get the number of wizard nodes that has been finished or skipped by user
*/
public int getWizardCnt() {
/* TODO: SaaS filter */
final String sql = "SELECT COUNT(DISTINCT z.AD_WF_Node_ID) " +
"FROM AD_Workflow w " +
"JOIN AD_WF_Node n ON (n.AD_Workflow_ID=w.AD_Workflow_ID) " +
"JOIN AD_WizardProcess z ON (n.AD_WF_Node_ID=z.AD_WF_Node_ID) " +
"WHERE w.WorkflowType='W' " + // Wizard
"AND w.IsActive='Y' " +
"AND n.IsActive='Y' " +
"AND z.AD_Client_ID=" + Env.getAD_Client_ID(Env.getCtx()) +
" AND z.IsActive='Y' " +
"AND z.WizardStatus IN ('F','S')"; // Finished/Skipped
return DB.getSQLValue(null, sql);
}
public List<MWorkflow> getWfWizards() {
/* TODO: SaaS filter */
return new Query(Env.getCtx(), MWorkflow.Table_Name, "WorkflowType=? AND IsActive='Y' AND AD_Client_ID IN (0, ?)", null)
MClient client = MClient.get(Env.getCtx());
String ASPFilter = "";
if (client.isUseASP())
ASPFilter =
" AND ( AD_Workflow.AD_Workflow_ID IN ( "
// Just ASP subscribed workflows for client "
+ " SELECT w.AD_Workflow_ID "
+ " FROM ASP_Workflow w, ASP_Level l, ASP_ClientLevel cl "
+ " WHERE w.ASP_Level_ID = l.ASP_Level_ID "
+ " AND cl.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND cl.ASP_Level_ID = l.ASP_Level_ID "
+ " AND w.IsActive = 'Y' "
+ " AND l.IsActive = 'Y' "
+ " AND cl.IsActive = 'Y' "
+ " AND w.ASP_Status = 'S') " // Show
+ " OR AD_Workflow.AD_Workflow_ID IN ( "
// + show ASP exceptions for client
+ " SELECT AD_Workflow_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Workflow_ID IS NOT NULL "
+ " AND ce.ASP_Status = 'S') " // Show
+ " ) "
+ " AND AD_Workflow.AD_Workflow_ID NOT IN ( "
// minus hide ASP exceptions for client
+ " SELECT AD_Workflow_ID "
+ " FROM ASP_ClientException ce "
+ " WHERE ce.AD_Client_ID = " + client.getAD_Client_ID()
+ " AND ce.IsActive = 'Y' "
+ " AND ce.AD_Workflow_ID IS NOT NULL "
+ " AND ce.ASP_Status = 'H')"; // Hide
String where = "WorkflowType=? AND IsActive='Y' AND AD_Client_ID IN (0, ?)" + ASPFilter;
return new Query(Env.getCtx(), MWorkflow.Table_Name, where, null)
.setParameters(MWorkflow.WORKFLOWTYPE_Wizard, Env.getAD_Client_ID(Env.getCtx()))
.setOnlyActiveRecords(true)
.setOrderBy(MWorkflow.COLUMNNAME_Priority)