Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

In order to implement a process run definition, you need to:

  1. Create a new data object class extending com.crm.process.ProcessRunDefinition class.
  2. Create five new summary pages.
  3. Create a new data entry page.
  4. Create a new user interface class extending com.crm.process.processrun.CRMUIProcessRunDefinitionBean class.
  5. Create a new XML utility class extending com.crm.businessobject.processrun.ProcessRunDefinitionXMLUtilBean class, to save and load any criteria, action inputs and/or scheduling settings.
  6. Create the process class needed to execute the process run definition. 
  7. Define the process in modules metadata file.

In the example below, we will implement a Rewards Settlements Run Definition which is used to evaluate customer events and spend transactions in order to debit or credit the related Organizational Unit's Accounts Receivable. The accounts receivable to be debited and/or credited are retrieved based on a set of criteria defined by the user. Rewards Settlements Run Definition, just like any other process run definition, can be executed ad hoc or on a recurring basis, based on the scheduling settings.

1. Create Data Object Class

The new data object class must extend com.crm.process.ProcessRunDefinition class and must override both getViewMandatoryFields() and getAssociatedObjects() methods. The associated objects will be used by setMandatoryFields() method of com.crm.dataobject.ViewObject for mandatory field calculation. This method calculates the associated objects' mandatory fields and along with the ones defined in getViewMandatoryFields() method it constructs the new data object's defaultMandatoryFields linked hash map.

...

2. Create Summary Pages

Five new summary pages need to be implemented in order to give the user all the necessary information about the process run definition, its runs, and their results.

...

3. Create Data Entry Page

A new data entry page must be implemented to give the user to create, view, modify, delete or apply other operations on a process run definition. 

...

4. Create User Interface Class

The new user interface class must extend com.crm.process.processrun.CRMUIProcessRunDefinitionBean class.

...

  1. When creating a new process run definition, the process and module attributes to set on the new data objects must be the same as the ones defined in modules metadata file.
  2. setMandatoryFields() method calculates the associated objects' mandatory fields and along with the ones defined in getViewMandatoryFields() method it constructs the new data object's defaultMandatoryFields linked hash map.
  3. To submit the process run definition to the scheduler for execution, use submit(CRMDOProcessRunLog processRunLog) method of com.crm.process.processrun.CRMUIProcessRunDefinitionBean class. This method uses process run definition's module and process attributes to retrieve the EJB and method name to call, from modules metadata file. For more information on how to schedule a process run, go to Schedule a Process Run.
Code Block
titleCRMUIRewardSettlementRunDefinitionBean.java
linenumberstrue
collapsetrue
@Stateless
@LocalBean
public class CRMUIRewardSettlementRunDefinitionBean extends CRMUIProcessRunDefinitionBean {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final String PROCESS_RUN_LOG_ENTRIES_EXIST	= "PROCESS_RUN_LOG_ENTRIES_EXIST";
	private static final String IS_PROCESS_RUN_DEF_LATEST_VERSION = "IS_PROCESS_RUN_DEF_LATEST_VERSION";
	private static final String LATEST_PROCESS_RUN_DEF_ID = "LATEST_PROCESS_RUN_DEF_ID";
	private static final String PROCESS	="REWARD_SETTLEMENT_PROCESSING";
	private static final String MODULE	="REWARDS";
	@EJB private CRMBOProcessRunDefinitionBean processRunDefinitionBean;
	@EJB private RewardSettlementProcessRunDefinitionXMLUtilBean rewardSettlementProcessRunDefinitionXMLUtilBean;
	@EJB private CRMBOProcessRunLogBean processRunLogBean;
	@EJB private CRMBORewardSchemeBean rewardSchemeBean;
	@EJB private CRMValidatorBean validatorBean;
	@EJB private CRMBORewardDefinitionBean rewardDefinitionBean;
	@EJB private RewardDefinitionXMLUtilBean rewardDefinitionXMLUtilBean;
	/**
	 * @see CRMUIProcessRunDefinitionBean#CRMUIProcessRunDefinitionBean()
	 */
	public CRMUIRewardSettlementRunDefinitionBean() {
		//do nothing
	}
	/**
	 * Loads a reward settlement run definition form.
	 * 
	 * @param id - the reward settlement run definition id to load
	 * @return the loaded form
	 * @throws Exception
	 */
	public RewardSettlementRunDefinition loadForm(String id) throws Exception {
		//Load the process run definition from db
		CRMDOProcessRunDefinition definition = (CRMDOProcessRunDefinition)processRunDefinitionBean.load(id);
		
		//Set process run definition additional information
		definition	 = processRunDefinitionBean.loadAdditionalInformation(definition);
 
		//Create new RewardSettlementRunDefinition instance and set process run definition object
		RewardSettlementRunDefinition rewardSettlementRunDefinition = new RewardSettlementRunDefinition();
		rewardSettlementRunDefinition.setProcessRunDefinition(definition);
 
		//Load criteria input and scheduling settings from XML 
		rewardSettlementRunDefinition = rewardSettlementProcessRunDefinitionXMLUtilBean.loadFromXML(rewardSettlementRunDefinition);
		//Initialise criteria
		rewardSettlementRunDefinition = rewardSettlementProcessRunDefinitionXMLUtilBean.initialize(rewardSettlementRunDefinition);
		
		//Set aliases
		if (processRunLogBean.exists(rewardSettlementRunDefinition.getProcessRunDefinition()))
		{
			rewardSettlementRunDefinition.setAlias(PROCESS_RUN_LOG_ENTRIES_EXIST, "1");
		}
		else
		{
			rewardSettlementRunDefinition.setAlias(PROCESS_RUN_LOG_ENTRIES_EXIST, "0");
		}
		String latestVersionID = getLatestVersionID(rewardSettlementRunDefinition.getProcessRunDefinition());
		if (latestVersionID==null || ( latestVersionID!=null && latestVersionID.equals(id)))
		{
			rewardSettlementRunDefinition.setAlias(IS_PROCESS_RUN_DEF_LATEST_VERSION, "1");
			rewardSettlementRunDefinition.setAlias(LATEST_PROCESS_RUN_DEF_ID, latestVersionID);
		}
		else
		{
			rewardSettlementRunDefinition.setAlias(IS_PROCESS_RUN_DEF_LATEST_VERSION, "0");
			rewardSettlementRunDefinition.setAlias(LATEST_PROCESS_RUN_DEF_ID, latestVersionID);
		}
	
		//Set mandatory fields
		rewardSettlementRunDefinition.setMandatoryFields();

		return rewardSettlementRunDefinition;
	}
	/**
	 * Creates a rewards settlement run definition.
	 * 
	 * @return a rewards settlement run definition
	 * @throws Exception
	 */
	public RewardSettlementRunDefinition createButton() throws Exception {
		RewardSettlementRunDefinition rewardSettlementRunDefinition = new RewardSettlementRunDefinition();
		
		//Initialise attributes
		rewardSettlementRunDefinition.setProcessRunDefinition((CRMDOProcessRunDefinition)processRunDefinitionBean.construct());
		rewardSettlementRunDefinition.setSchedulerTask(new SchedulerTask());
		rewardSettlementRunDefinition.setSchemeCriteria(new HashSet<RewardSchemeCriterion>());
		
 
		//Set process = process id as defined in modules metadata file
		rewardSettlementRunDefinition.getProcessRunDefinition().setProcess(PROCESS);
 
		//Set module = module id as defined in modules metadata file
		rewardSettlementRunDefinition.getProcessRunDefinition().setModule(MODULE);
 
		//Set type default value
		rewardSettlementRunDefinition.setRewardSettlementType(RewardSettlementType.BOTH);
 
		//Set the definition's mandatory fields
		rewardSettlementRunDefinition.setMandatoryFields();

		return rewardSettlementRunDefinition;
	}
	/**
	 * Saves a rewards settlement run definition.
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to save
	 * @return the saved rewards settlement run definition
	 * @throws Exception
	 */
	public RewardSettlementRunDefinition saveButton(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception {
		//Set and validate the definition's mandatory fields
		rewardSettlementRunDefinition.setMandatoryFields();
		validateMandatoryFields(rewardSettlementRunDefinition);
		
		//Convert criteria, input settings and scheduling settings to XML and set them to process run definition data object. 
		rewardSettlementRunDefinition			= rewardSettlementProcessRunDefinitionXMLUtilBean.constructXML(rewardSettlementRunDefinition);

		CRMDOProcessRunDefinition processRunDefinition	= rewardSettlementRunDefinition.getProcessRunDefinition();
 
		//Validate process run definition
		if(processRunDefinition.getCode()==null)
		{
			processRunDefinition.setCode(processRunDefinitionBean.getNextSequenceNumber(SequenceNumber.PROCESSRUNDEFINITIONCODES));
		}
		validateCriteria(rewardSettlementRunDefinition);
		validateActionInput(rewardSettlementRunDefinition);
		validateSchedulingSettings(rewardSettlementRunDefinition);
		
		CRMDORewardDefinition rewardDefinition= (CRMDORewardDefinition)rewardDefinitionBean.loadActiveDefinition();
		rewardDefinition = rewardDefinitionXMLUtilBean.initialize(rewardDefinition);
		if(rewardDefinition.getSettlementAutomation()==null || rewardDefinition.getSettlementAutomation().getInvoiceType()==null || rewardDefinition.getSettlementAutomation().getInvoiceProduct() == null)
		{
			throw new CannotExecuteSettlementNoConfigurationInRewardDefinitionException(getCRMSession());
		}
		
		processRunDefinitionBean.validateAndSave( rewardSettlementRunDefinition.getProcessRunDefinition() );
		String latestVersionID = getLatestVersionID(rewardSettlementRunDefinition.getProcessRunDefinition());
		if (latestVersionID==null || ( latestVersionID!=null && latestVersionID.equals(rewardSettlementRunDefinition.getProcessRunDefinition().getId())))
		{
			rewardSettlementRunDefinition.setAlias(IS_PROCESS_RUN_DEF_LATEST_VERSION, "1");
		}
		else
		{
			rewardSettlementRunDefinition.setAlias(IS_PROCESS_RUN_DEF_LATEST_VERSION, "0");
		}
		return rewardSettlementRunDefinition;
	}
	/**
	 * Validate the criteria of the rewards settlement run definition
	 * 
	 * @param notificationRunDefinition - the rewards settlement run definition to validate the criteria of
	 * @throws Exception
	 */
	protected void validateCriteria(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception{
		if (ServiceUtil.isInitialized(rewardSettlementRunDefinition.getSchemeCriteria()) )
		{
			validatorBean.validateUniqueRecord(
					"Scheme", 
					new ArrayList<CRMDO>(rewardSettlementRunDefinition.getSchemeCriteria()), 
					new String[]{"scheme.name"}, 
					new String[]{"Name"});
		}
	}
	/**
	 * Validate the scheduling settings of the rewards settlement run definition
	 * 
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to validate the scheduling settings of
	 * @throws Exception
	 */
	protected void validateSchedulingSettings(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception{
	}
	/**
	 * Loads a rewardrewards settlement run definition form.
	 * 
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to load
	 * @return the loaded form
	 * @throws Exception
	 * @throws CannotModifyException
	 */
	public RewardSettlementRunDefinition editButton(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception, CannotModifyException {
		CRMDOProcessRunDefinition definition = (CRMDOProcessRunDefinition)processRunDefinitionBean.load(rewardSettlementRunDefinition.getProcessRunDefinition().getId());
		if(definition==null)
		{
			definition = processRunDefinitionBean.loadLatest(rewardSettlementRunDefinition.getProcessRunDefinition().getCode());
		}
		rewardSettlementRunDefinition = loadForm(definition.getId());
		if(rewardSettlementRunDefinition.getAlias(PROCESS_RUN_LOG_ENTRIES_EXIST).equals("1"))
		{
			rewardSettlementRunDefinition =  amendButton(rewardSettlementRunDefinition);
		}
		return rewardSettlementRunDefinition;
	}
	/**
	 * Amend a rewardrewards settlement run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to amend
	 * @return the amended rewards settlement run definition
	 * @throws Exception
	 * @throws CannotModifyException
	 */
	public RewardSettlementRunDefinition amendButton(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception {
		CRMDOProcessRunDefinition processRunDefinition		= rewardSettlementRunDefinition.getProcessRunDefinition();
		CRMDOProcessRunDefinition newProcessRunDefinition	= (CRMDOProcessRunDefinition) processRunDefinition.clone();
		newProcessRunDefinition.setVersion(new Integer(processRunDefinition.getVersion().intValue()+1));
		rewardSettlementRunDefinition.setProcessRunDefinition(newProcessRunDefinition);
		rewardSettlementRunDefinition.setAlias(PROCESS_RUN_LOG_ENTRIES_EXIST, "0" );
		rewardSettlementRunDefinition.setAlias(IS_PROCESS_RUN_DEF_LATEST_VERSION, "1");
		return rewardSettlementRunDefinition;
	}
	/**
	 * Submit a rewardrewards settlement run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to submit
	 * @return the submitted form
	 * @throws Exception
	 * @throws CannotModifyException
	 */
	public RewardSettlementRunDefinition submitButton(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception {
		CRMDORewardDefinition rewardDefinition= (CRMDORewardDefinition)rewardDefinitionBean.loadActiveDefinition();
		rewardDefinition = rewardDefinitionXMLUtilBean.initialize(rewardDefinition);
		if(rewardDefinition.getSettlementAutomation()==null || rewardDefinition.getSettlementAutomation().getInvoiceType()==null || rewardDefinition.getSettlementAutomation().getInvoiceProduct() == null)
		{
			throw new CannotExecuteSettlementNoConfigurationInRewardDefinitionException(getCRMSession());
		}
		
		//Create a process run log object and set the process run definition
		CRMDOProcessRunLog processRunLog	= (CRMDOProcessRunLog) processRunLogBean.construct(rewardSettlementRunDefinition.getProcessRunDefinition());
		//submit the process run log for execution
		submit(processRunLog);
		return rewardSettlementRunDefinition;
	}
	
	/**
	 * Validate the action input of the rewards settlement run definition
	 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/*DEPRECATED FROM CRM.COM R11*/
		//Create a process run log object and set the process run definition - up to Release 10 
		CRMDOProcessRunLog processRunLog	= (CRMDOProcessRunLog) processRunLogBean.construct(rewardSettlementRunDefinition.getProcessRunDefinition());
		//submit the process run log for execution - up to Release 10
		submit(processRunLog);
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/* AVAILABLE FROM CRM.COM R11 */
		//Submit the process run definition for execution - Release 11+
		submit(rewardSettlementRunDefinition.getProcessRunDefinition());
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
		return rewardSettlementRunDefinition;
	}
	
	/**
	 * Validate the action input of the rewards settlement run definition
	 * 
	 * @param definition - the rewards settlement run definition to validate the action input of
	 * @throws Exception
	 */
	protected void validateActionInput(RewardSettlementRunDefinition definition) throws Exception{
		if (definition.getRewardSettlementType()==null)
		{
			throw new MandatoryFieldException(getCRMSession(),"key_reward_settlement_type");
		}
	}
	
	/**
	 * Delete a rewards settlement run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the rewards settlement run definition to delete
	 * @return the deleted form
	 * @throws Exception
	 * @throws CannotModifyException
	 */
	public RewardSettlementRunDefinition deleteButton(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception {
		processRunDefinitionBean.validateAndDelete(rewardSettlementRunDefinition.getProcessRunDefinition());
		return rewardSettlementRunDefinition;
	}
	/**
	 * Adds a list of reward schemes to the rewards settlement definition run.
	 *  
	 * @param entityIDs - the ids of the reward schemes
	 * @return the list of reward schemes
	 * @throws Exception
	 */
	public ArrayList<CRMDO> addRewardSchemeCriterionButton(ArrayList<String> entityIDs) throws Exception {
		ArrayList<CRMDO> dtos = new ArrayList<CRMDO>();
		if (entityIDs!=null && entityIDs.size() > 0)
		{
			for (int i=0; i<entityIDs.size(); i++)
			{
				CRMDORewardScheme scheme = (CRMDORewardScheme)rewardSchemeBean.load(entityIDs.get(i));	
				RewardSchemeCriterion schemeCriterion=new RewardSchemeCriterion();
				schemeCriterion.setScheme(scheme);
				dtos.add(schemeCriterion);
			}
		}
		return dtos;
	}
	/**
	 * Removes a list of reward scheme criteria from a rewards settlement run definition.
	 * 
	 * @param dtoList - a list of reward scheme criteria to delete
	 * @return the updated list
	 * @throws Exception
	 */
	public ArrayList<CRMDO> removeRewardSchemeCriterionButton(ArrayList<CRMDO> dtoList) throws Exception {
		return setDeleted(dtoList);
	}
	/**
	 * Loads the rewards settlement type options.
	 * 
	 * @return the rewards settlement type options
	 * @throws Exception
	 */
	public LookupBuilder getRewardSettlementTypeOptions() throws Exception {
		return getRewardSettlementTypeOptions(null);
	}
	/**
	 * Loads the rewards settlement type options.
	 * 
	 * @param emptyValue - an empty value for a rewards settlement type
	 * @return the rewards settlement type options
	 * @throws Exception
	 */
	public LookupBuilder getRewardSettlementTypeOptions(String emptyValue) throws Exception {
		LookupBuilder builder = new LookupBuilder();
		if (emptyValue!=null)
		{
			builder.build("", emptyValue);
		}
		RewardSettlementType[] rewardSettlementTypes = RewardSettlementType.values();
		for (int i=0; i<rewardSettlementTypes.length; i++)
		{
			RewardSettlementType rewardSettlementType = rewardSettlementTypes[i];
			builder.build(rewardSettlementType.toString(), rewardSettlementType.getLabel());
		}
		return builder;
	}
}

...

6. Create Process Class

The new process class must extend com.crm.process.CRMProcessRunBean class. 

...