IDEMPIERE-3446 Define the workflow approver dynamically - java

This commit is contained in:
Guilherme Chaddad 2017-08-10 17:15:39 -03:00
parent 1b8d9b038e
commit 99839476c3
7 changed files with 387 additions and 13 deletions

View File

@ -0,0 +1,157 @@
/******************************************************************************
* Product: iDempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2012 ComPiere, Inc. All Rights Reserved. *
* This program is free software, you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program, if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.model;
import java.math.BigDecimal;
import java.sql.Timestamp;
import org.compiere.util.KeyNamePair;
/** Generated Interface for AD_WF_ActivityApprover
* @author iDempiere (generated)
* @version Release 4.1
*/
public interface I_AD_WF_ActivityApprover
{
/** TableName=AD_WF_ActivityApprover */
public static final String Table_Name = "AD_WF_ActivityApprover";
/** AD_Table_ID=200226 */
public static final int Table_ID = 200226;
KeyNamePair Model = new KeyNamePair(Table_ID, Table_Name);
/** AccessLevel = 7 - System - Client - Org
*/
BigDecimal accessLevel = BigDecimal.valueOf(7);
/** Load Meta Data */
/** Column name AD_Client_ID */
public static final String COLUMNNAME_AD_Client_ID = "AD_Client_ID";
/** Get Client.
* Client/Tenant for this installation.
*/
public int getAD_Client_ID();
/** Column name AD_Org_ID */
public static final String COLUMNNAME_AD_Org_ID = "AD_Org_ID";
/** Set Organization.
* Organizational entity within client
*/
public void setAD_Org_ID (int AD_Org_ID);
/** Get Organization.
* Organizational entity within client
*/
public int getAD_Org_ID();
/** Column name AD_User_ID */
public static final String COLUMNNAME_AD_User_ID = "AD_User_ID";
/** Set User/Contact.
* User within the system - Internal or Business Partner Contact
*/
public void setAD_User_ID (int AD_User_ID);
/** Get User/Contact.
* User within the system - Internal or Business Partner Contact
*/
public int getAD_User_ID();
public org.compiere.model.I_AD_User getAD_User() throws RuntimeException;
/** Column name AD_WF_ActivityApprover_ID */
public static final String COLUMNNAME_AD_WF_ActivityApprover_ID = "AD_WF_ActivityApprover_ID";
/** Set Workflow Activity Approver */
public void setAD_WF_ActivityApprover_ID (int AD_WF_ActivityApprover_ID);
/** Get Workflow Activity Approver */
public int getAD_WF_ActivityApprover_ID();
/** Column name AD_WF_ActivityApprover_UU */
public static final String COLUMNNAME_AD_WF_ActivityApprover_UU = "AD_WF_ActivityApprover_UU";
/** Set AD_WF_ActivityApprover_UU */
public void setAD_WF_ActivityApprover_UU (String AD_WF_ActivityApprover_UU);
/** Get AD_WF_ActivityApprover_UU */
public String getAD_WF_ActivityApprover_UU();
/** Column name AD_WF_Activity_ID */
public static final String COLUMNNAME_AD_WF_Activity_ID = "AD_WF_Activity_ID";
/** Set Workflow Activity.
* Workflow Activity
*/
public void setAD_WF_Activity_ID (int AD_WF_Activity_ID);
/** Get Workflow Activity.
* Workflow Activity
*/
public int getAD_WF_Activity_ID();
public org.compiere.model.I_AD_WF_Activity getAD_WF_Activity() throws RuntimeException;
/** Column name Created */
public static final String COLUMNNAME_Created = "Created";
/** Get Created.
* Date this record was created
*/
public Timestamp getCreated();
/** Column name CreatedBy */
public static final String COLUMNNAME_CreatedBy = "CreatedBy";
/** Get Created By.
* User who created this records
*/
public int getCreatedBy();
/** Column name IsActive */
public static final String COLUMNNAME_IsActive = "IsActive";
/** Set Active.
* The record is active in the system
*/
public void setIsActive (boolean IsActive);
/** Get Active.
* The record is active in the system
*/
public boolean isActive();
/** Column name Updated */
public static final String COLUMNNAME_Updated = "Updated";
/** Get Updated.
* Date this record was updated
*/
public Timestamp getUpdated();
/** Column name UpdatedBy */
public static final String COLUMNNAME_UpdatedBy = "UpdatedBy";
/** Get Updated By.
* User who updated this records
*/
public int getUpdatedBy();
}

View File

@ -0,0 +1,28 @@
package org.compiere.model;
import java.sql.ResultSet;
import java.util.List;
import java.util.Properties;
public class MWFActivityApprover extends X_AD_WF_ActivityApprover {
private static final long serialVersionUID = -7135169624317070006L;
public MWFActivityApprover(Properties ctx, int AD_WF_ActivityApprover_ID, String trxName) {
super(ctx, AD_WF_ActivityApprover_ID, trxName);
}
public MWFActivityApprover(Properties ctx, ResultSet rs, String trxName) {
super(ctx, rs, trxName);
}
public static MWFActivityApprover[] getOfActivity(Properties ctx, int ad_WF_Activity_ID, String trxName) {
final String whereClause = I_AD_WF_ActivityApprover.COLUMNNAME_AD_WF_Activity_ID+"=?";
List<MWFActivityApprover> list = new Query(ctx,I_AD_WF_ActivityApprover.Table_Name,whereClause,trxName)
.setParameters(ad_WF_Activity_ID)
.list();
MWFActivityApprover[] retValue = new MWFActivityApprover[list.size ()];
list.toArray (retValue);
return retValue;
}
}

View File

@ -0,0 +1,163 @@
/******************************************************************************
* Product: iDempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2012 ComPiere, Inc. All Rights Reserved. *
* This program is free software, you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program, if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
/** Generated Model - DO NOT CHANGE */
package org.compiere.model;
import java.sql.ResultSet;
import java.util.Properties;
/** Generated Model for AD_WF_ActivityApprover
* @author iDempiere (generated)
* @version Release 4.1 - $Id$ */
public class X_AD_WF_ActivityApprover extends PO implements I_AD_WF_ActivityApprover, I_Persistent
{
/**
*
*/
private static final long serialVersionUID = 20170809L;
/** Standard Constructor */
public X_AD_WF_ActivityApprover (Properties ctx, int AD_WF_ActivityApprover_ID, String trxName)
{
super (ctx, AD_WF_ActivityApprover_ID, trxName);
/** if (AD_WF_ActivityApprover_ID == 0)
{
setAD_User_ID (0);
setAD_WF_ActivityApprover_ID (0);
setAD_WF_Activity_ID (0);
} */
}
/** Load Constructor */
public X_AD_WF_ActivityApprover (Properties ctx, ResultSet rs, String trxName)
{
super (ctx, rs, trxName);
}
/** AccessLevel
* @return 7 - System - Client - Org
*/
protected int get_AccessLevel()
{
return accessLevel.intValue();
}
/** Load Meta Data */
protected POInfo initPO (Properties ctx)
{
POInfo poi = POInfo.getPOInfo (ctx, Table_ID, get_TrxName());
return poi;
}
public String toString()
{
StringBuffer sb = new StringBuffer ("X_AD_WF_ActivityApprover[")
.append(get_ID()).append("]");
return sb.toString();
}
public org.compiere.model.I_AD_User getAD_User() throws RuntimeException
{
return (org.compiere.model.I_AD_User)MTable.get(getCtx(), org.compiere.model.I_AD_User.Table_Name)
.getPO(getAD_User_ID(), get_TrxName()); }
/** Set User/Contact.
@param AD_User_ID
User within the system - Internal or Business Partner Contact
*/
public void setAD_User_ID (int AD_User_ID)
{
if (AD_User_ID < 1)
set_Value (COLUMNNAME_AD_User_ID, null);
else
set_Value (COLUMNNAME_AD_User_ID, Integer.valueOf(AD_User_ID));
}
/** Get User/Contact.
@return User within the system - Internal or Business Partner Contact
*/
public int getAD_User_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_AD_User_ID);
if (ii == null)
return 0;
return ii.intValue();
}
/** Set Workflow Activity Approver.
@param AD_WF_ActivityApprover_ID Workflow Activity Approver */
public void setAD_WF_ActivityApprover_ID (int AD_WF_ActivityApprover_ID)
{
if (AD_WF_ActivityApprover_ID < 1)
set_ValueNoCheck (COLUMNNAME_AD_WF_ActivityApprover_ID, null);
else
set_ValueNoCheck (COLUMNNAME_AD_WF_ActivityApprover_ID, Integer.valueOf(AD_WF_ActivityApprover_ID));
}
/** Get Workflow Activity Approver.
@return Workflow Activity Approver */
public int getAD_WF_ActivityApprover_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_AD_WF_ActivityApprover_ID);
if (ii == null)
return 0;
return ii.intValue();
}
/** Set AD_WF_ActivityApprover_UU.
@param AD_WF_ActivityApprover_UU AD_WF_ActivityApprover_UU */
public void setAD_WF_ActivityApprover_UU (String AD_WF_ActivityApprover_UU)
{
set_Value (COLUMNNAME_AD_WF_ActivityApprover_UU, AD_WF_ActivityApprover_UU);
}
/** Get AD_WF_ActivityApprover_UU.
@return AD_WF_ActivityApprover_UU */
public String getAD_WF_ActivityApprover_UU ()
{
return (String)get_Value(COLUMNNAME_AD_WF_ActivityApprover_UU);
}
public org.compiere.model.I_AD_WF_Activity getAD_WF_Activity() throws RuntimeException
{
return (org.compiere.model.I_AD_WF_Activity)MTable.get(getCtx(), org.compiere.model.I_AD_WF_Activity.Table_Name)
.getPO(getAD_WF_Activity_ID(), get_TrxName()); }
/** Set Workflow Activity.
@param AD_WF_Activity_ID
Workflow Activity
*/
public void setAD_WF_Activity_ID (int AD_WF_Activity_ID)
{
if (AD_WF_Activity_ID < 1)
set_ValueNoCheck (COLUMNNAME_AD_WF_Activity_ID, null);
else
set_ValueNoCheck (COLUMNNAME_AD_WF_Activity_ID, Integer.valueOf(AD_WF_Activity_ID));
}
/** Get Workflow Activity.
@return Workflow Activity
*/
public int getAD_WF_Activity_ID ()
{
Integer ii = (Integer)get_Value(COLUMNNAME_AD_WF_Activity_ID);
if (ii == null)
return 0;
return ii.intValue();
}
}

View File

@ -30,7 +30,7 @@ public class X_AD_WF_Responsible extends PO implements I_AD_WF_Responsible, I_Pe
/**
*
*/
private static final long serialVersionUID = 20161030L;
private static final long serialVersionUID = 20170809L;
/** Standard Constructor */
public X_AD_WF_Responsible (Properties ctx, int AD_WF_Responsible_ID, String trxName)
@ -41,7 +41,7 @@ public class X_AD_WF_Responsible extends PO implements I_AD_WF_Responsible, I_Pe
setAD_Role_ID (0);
setAD_WF_Responsible_ID (0);
setEntityType (null);
// U
// @SQL=select get_sysconfig('DEFAULT_ENTITYTYPE','U',0,0) from dual
setName (null);
setResponsibleType (null);
} */
@ -240,6 +240,8 @@ public class X_AD_WF_Responsible extends PO implements I_AD_WF_Responsible, I_Pe
public static final String RESPONSIBLETYPE_Role = "R";
/** System Resource = S */
public static final String RESPONSIBLETYPE_SystemResource = "S";
/** Manual = M */
public static final String RESPONSIBLETYPE_Manual = "M";
/** Set Responsible Type.
@param ResponsibleType
Type of the Responsibility for a workflow

View File

@ -49,6 +49,7 @@ import org.compiere.model.MRole;
import org.compiere.model.MTable;
import org.compiere.model.MUser;
import org.compiere.model.MUserRoles;
import org.compiere.model.MWFActivityApprover;
import org.compiere.model.PO;
import org.compiere.model.Query;
import static org.compiere.model.SystemIDs.*;
@ -1218,6 +1219,17 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable
}
}
}
else if(resp.isManual()) {
MWFActivityApprover[] approvers = MWFActivityApprover.getOfActivity(getCtx(), getAD_WF_Activity_ID(), get_TrxName());
for (int i = 0; i < approvers.length; i++)
{
if(approvers[i].getAD_User_ID() == Env.getAD_User_ID(getCtx()))
{
autoApproval = true;
break;
}
}
}
else if(resp.isOrganization())
{
throw new AdempiereException("Support not implemented for "+resp);

View File

@ -34,12 +34,11 @@ import org.compiere.util.Msg;
public class MWFResponsible extends X_AD_WF_Responsible
{
/**
*
*/
private static final long serialVersionUID = 8662580480797818563L;
* long - serialVersionUID.
*/
private static final long serialVersionUID = 4167967243996935999L;
/**
/**
* Get WF Responsible from Cache
* @param ctx context
* @param AD_WF_Responsible_ID id
@ -89,7 +88,7 @@ public class MWFResponsible extends X_AD_WF_Responsible
*/
public boolean isInvoker()
{
return getAD_User_ID() == 0 && getAD_Role_ID() == 0;
return getAD_User_ID() == 0 && getAD_Role_ID() == 0 && !isManual();
} // isInvoker
/**
@ -157,6 +156,10 @@ public class MWFResponsible extends X_AD_WF_Responsible
if (!RESPONSIBLETYPE_Role.equals(getResponsibleType()) && getAD_Role_ID() > 0)
setAD_Role_ID(0);
if (RESPONSIBLETYPE_Manual.equals(getResponsibleType())) {
setAD_User_ID(0);
setAD_Role_ID(0);
}
return true;
} // beforeSave
@ -178,4 +181,8 @@ public class MWFResponsible extends X_AD_WF_Responsible
return sb.toString ();
} // toString
public boolean isManual() {
return RESPONSIBLETYPE_Manual.equals(getResponsibleType());
}
} // MWFResponsible

View File

@ -329,7 +329,8 @@ public class WWFActivity extends ADForm implements EventListener<Event>
pstmt.setInt (2, AD_User_ID);
pstmt.setInt (3, AD_User_ID);
pstmt.setInt (4, AD_User_ID);
pstmt.setInt (5, AD_Client_ID);
pstmt.setInt (5, AD_User_ID);
pstmt.setInt (6, AD_Client_ID);
rs = pstmt.executeQuery ();
if (rs.next ()) {
count = rs.getInt(1);
@ -378,8 +379,10 @@ public class WWFActivity extends ADForm implements EventListener<Event>
pstmt.setInt (2, AD_User_ID);
pstmt.setInt (3, AD_User_ID);
pstmt.setInt (4, AD_User_ID);
pstmt.setInt (5, AD_Client_ID);
rs = pstmt.executeQuery ();
pstmt.setInt (5, AD_User_ID);
pstmt.setInt (6, AD_Client_ID);
rs = pstmt.executeQuery();
while (rs.next ())
{
MWFActivity activity = new MWFActivity(Env.getCtx(), rs, null);
@ -449,8 +452,10 @@ public class WWFActivity extends ADForm implements EventListener<Event>
+ " AND r.ResponsibleType='H' AND r.AD_User_ID=?)" // #3
// Responsible Role
+ " OR EXISTS (SELECT * FROM AD_WF_Responsible r INNER JOIN AD_User_Roles ur ON (r.AD_Role_ID=ur.AD_Role_ID)"
+ " WHERE a.AD_WF_Responsible_ID=r.AD_WF_Responsible_ID AND r.ResponsibleType='R' AND ur.AD_User_ID=?)" // #4
//
+ " WHERE a.AD_WF_Responsible_ID=r.AD_WF_Responsible_ID AND r.ResponsibleType='R' AND ur.AD_User_ID=? AND ur.isActive = 'Y')" // #4
///* Manual Responsible */
+ " OR EXISTS (SELECT * FROM AD_WF_ActivityApprover r "
+ " WHERE a.AD_WF_Activity_ID=r.AD_WF_Activity_ID AND r.AD_User_ID=? AND r.isActive = 'Y')"
+ ") AND a.AD_Client_ID=?"; // #5
return where;
}