Versions Compared

Key

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

...

  1. Create a new data object class extending com.crm.dataobject.ViewObject 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. Define the process in modules metadata file.

...

Code Block
themeEclipse
languagejava
titleRewardSettlementRunDefinition.java
linenumberstrue
collapsetrue
public class RewardSettlementRunDefinition extends ViewObject {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private CRMDOProcessRunDefinition processRunDefinition;
	private SchedulerTask schedulerTask;
	//input settings
	private RewardSettlementType rewardSettlementType;
	//criteria
	private Set<RewardSchemeCriterion> schemeCriteria;
	private Integer daysAgo;

	public CRMDOProcessRunDefinition getProcessRunDefinition() {
		return processRunDefinition;
	}
	public void setProcessRunDefinition(CRMDOProcessRunDefinition processRunDefinition) {
		this.processRunDefinition = processRunDefinition;
	}
	public SchedulerTask getSchedulerTask() {
		return schedulerTask;
	}
	public void setSchedulerTask(SchedulerTask schedulerTask) {
		this.schedulerTask = schedulerTask;
	}
	public RewardSettlementType getRewardSettlementType() {
		return rewardSettlementType;
	}
	public void setRewardSettlementType(RewardSettlementType rewardSettlementType) {
		this.rewardSettlementType = rewardSettlementType;
	}
	public Set<RewardSchemeCriterion> getSchemeCriteria() {
		return schemeCriteria;
	}
	public void setSchemeCriteria(Set<RewardSchemeCriterion> schemeCriteria) {
		this.schemeCriteria = schemeCriteria;
	}
	public Integer getDaysAgo() {
		return daysAgo;
	}
	public void setDaysAgo(Integer daysAgo) {
		this.daysAgo = daysAgo;
	}
	
	@Override
	protected LinkedHashMap<String, CRMDO> getAssociatedDataObjects() {
		LinkedHashMap<String, CRMDO> dataObjects=new LinkedHashMap<String, CRMDO>();
		
		dataObjects.put("processRunDefinition", getProcessRunDefinition());
		
		return dataObjects;
	}
	@Override
	public LinkedHashMap<String, String> getViewMandatoryFields() {
		LinkedHashMap<String, String> viewMandatoryFields = new LinkedHashMap<String, String>();
		
		viewMandatoryFields.put( "rewardSettlementType", "key_reward_settlement_type");
		return viewMandatoryFields;
	}

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.

2.a. Process Run Definition Summary Page

The first summary page to create is the process run definition summary page, which is the main summary page that will display all the process run definition records.

title
Ui expand
Rewards Settlements Process Run Definition Summary Page
xmlsettlementProcessRunDefinitionsxml<?xml version="1.0" encoding="UTF-8"?><summary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/summary.xsd"> <title>key_process_run_definitions</title> <sql>FROM PROCESSRUNDEFINITIONS LEFT JOIN USERS CREATEDBY ON CREATEDBY.USERID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDBYUSERID LEFT JOIN USERS UPDATEDBY ON UPDATEDBY.USERID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDBYUSERID LEFT JOIN OUUNITS CREATEDBYUNIT ON CREATEDBYUNIT.OUUID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDBYOUUID LEFT JOIN OUUNITS UPDATEDBYUNIT ON UPDATEDBYUNIT.OUUID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDBYOUUID WHERE PROCESSRUNDEFINITIONS.PROCESSRUNDEFDELETED = 0 AND PROCESSRUNDEFINITIONS.PROCESSID = 'REWARD_SETTLEMENT_PROCESSING' AND PROCESSRUNDEFINITIONS.MODULEID = 'REWARDS' AND PROCESSRUNDEFINITIONS.PROCESSRUNDEFVERSION = ( SELECT MAX(PRD.PROCESSRUNDEFVERSION) FROM PROCESSRUNDEFINITIONS PRD WHERE PRD.PROCESSRUNDEFUNIFIEDCODE = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE ) </sql> <rowsperpage>20</rowsperpage> <primaryfield>PROCESSRUNDEFINITIONS.PROCESSRUNDEFID</primaryfield> <mainlinkfield>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</mainlinkfield> <autosearch>true</autosearch> <allownocriteria>true</allownocriteria> <module>REWARDS</module> <fieldlist> <!-- external filters --> <field> <fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFID</fieldname> <filtertextoption>equal</filtertextoption> </field> <!-- basic search --> <field> <fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</fieldname> <caption>key_unified_code</caption> <filter>true</filter> <filtercaseinsensitive>true</filtercaseinsensitive> <filtersearchonchange>true</filtersearchonchange> </field>
Code Block
language
java
title
RewardSchemeCriterion.
java
linenumberstrue
collapsetrue
public class RewardSchemeCriterion extends CRMDO {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private CRMDORewardScheme scheme;
	private String schemeID;
	
	public CRMDORewardScheme getScheme() {
		return scheme;
	}
	public void setScheme(CRMDORewardScheme scheme) {
		this.scheme = scheme;
	}
	public String getSchemeID() {
		return schemeID;
	}
	public void setSchemeID(String schemeID) {
		this.schemeID = schemeID;
	}
}

 

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.

2.a. Process Run Definition Summary Page

The first summary page to create is the process run definition summary page, which is the main summary page that will display all the process run definition records.

Ui expand
titleRewards Settlements Process Run Definition Summary Page
Code Block
languagexml
titlesettlementProcessRunDefinitions.xml
linenumberstrue
<?xml version="1.0" encoding="UTF-8"?><summary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/summary.xsd">
	<title>key_process_run_definitions</title>
	<sql>FROM PROCESSRUNDEFINITIONS
		LEFT JOIN USERS CREATEDBY ON CREATEDBY.USERID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDBYUSERID
		LEFT JOIN USERS UPDATEDBY ON UPDATEDBY.USERID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDBYUSERID
		LEFT JOIN OUUNITS CREATEDBYUNIT ON CREATEDBYUNIT.OUUID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDBYOUUID
		LEFT JOIN OUUNITS UPDATEDBYUNIT ON UPDATEDBYUNIT.OUUID = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDBYOUUID
		WHERE PROCESSRUNDEFINITIONS.PROCESSRUNDEFDELETED = 0 
		AND PROCESSRUNDEFINITIONS.PROCESSID = 'REWARD_SETTLEMENT_PROCESSING' 
		AND PROCESSRUNDEFINITIONS.MODULEID = 'REWARDS'
		AND PROCESSRUNDEFINITIONS.PROCESSRUNDEFVERSION = (
			SELECT MAX(PRD.PROCESSRUNDEFVERSION) FROM PROCESSRUNDEFINITIONS PRD
			WHERE PRD.PROCESSRUNDEFUNIFIEDCODE = PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE
		)
	</sql>
	<rowsperpage>20</rowsperpage>
	<primaryfield>PROCESSRUNDEFINITIONS.PROCESSRUNDEFID</primaryfield>
	<mainlinkfield>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</mainlinkfield>
	<autosearch>true</autosearch>
	<allownocriteria>true</allownocriteria>
	<module>REWARDS</module>
	<fieldlist>
		<!-- external filters -->
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFNAME<PROCESSRUNDEFID</fieldname>
			<caption>key<filtertextoption>equal</filtertextoption>
		</field>
		<!-- basic search -->
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</fieldname>
			<caption>key_unified_code</caption>
			<filter>true</filter>
			<filtercaseinsensitive>true</filtercaseinsensitive>
			<filtersearchonchange>true</filtersearchonchange>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFNAME</fieldname>
			<caption>key_name</caption>
			<filter>true</filter>
			<filtercaseinsensitive>true</filtercaseinsensitive>
			<filtersearchonchange>true</filtersearchonchange>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFALTCODE</fieldname>
			<caption>key_alternative_code</caption>
			<filter>true</filter>
			<filtercaseinsensitive>true</filtercaseinsensitive>
			<filtersearchonchange>true</filtersearchonchange>
		</field>
		<field>
			<fieldname>PROCESS_RUN_FILTER</fieldname>
			<fieldfunction>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</fieldfunction>
			<caption>key_process_run_number</caption>
			<filter>true</filter>
			<filtercondition> 
			PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE IN (
				SELECT PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE FROM PROCESSRUNDEFINITIONS
				WHERE PROCESSRUNDEFINITIONS.PROCESSRUNDEFID IN (
					SELECT PROCESSRUNLOG.PROCESSRUNDEFID FROM PROCESSRUNLOG
					WHERE PROCESSRUNLOG.PROCESSRUNLOGNUM = '#1' 
					AND PROCESSRUNLOG.PROCESSRUNLOGDELETED = 0
				)
			)
			</filtercondition>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.LIFECYCLESTATE</fieldname>
			<caption>key_life_cycle_state</caption>
			<filter>true</filter>
			<fixedlookup>ejb/CRMUISubscriptionProcessRunDefinition.getLifeCycleStateOptions:key_all</fixedlookup>
		</field>
		<!-- advanced search -->
		<field>
			<fieldname>CREATEDBYUSER_FILTER</fieldname>
			<fieldfunction>CREATEDBY.USERID</fieldfunction>
			<caption>key_created_by_user</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filterlookupname>dataset;users.load;userid;username:name</filterlookupname>
		</field>
		<field>
			<fieldname>CREATEDBYUNIT_FILTER</fieldname>
			<fieldfunction>CREATEDBYUNIT.OUUID</fieldfunction>
			<caption>key_created_by_unit</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filterlookupname>dataset;networkmanagement.loadunits;ouuid;ouuname:ougname:oucname</filterlookupname>
		</field>
		<field>
			<fieldname>PROCRUNDEFCREATEDDATE_FILTER</fieldname>
			<fieldfunction>PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDDATE</fieldfunction>
			<fieldtype>date</fieldtype>
			<caption>key_date_created</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filtertextoption>range</filtertextoption>
		</field>
		<field>
			<fieldname>UPDATEDBYUSER_FILTER</fieldname>
			<fieldfunction>UPDATEDBY.USERID</fieldfunction>
			<caption>key_updated_by_user</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filterlookupname>dataset;users.load;userid;username:name</filterlookupname>
		</field>
		<field>
			<fieldname>UPDATEDBYUNIT_FILTER</fieldname>
			<fieldfunction>UPDATEDBYUNIT.OUUID</fieldfunction>
			<caption>key_updated_by_unit</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filterlookupname>dataset;networkmanagement.loadunits;ouuid;ouuname:ougname:oucname</filterlookupname>
		</field>
		<field>
			<fieldname>PROCRUNDEFUPDATEDDATE_FILTER</fieldname>
			<fieldfunction>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDDATE</fieldfunction>
			<fieldtype>date</fieldtype>
			<caption>key_date_updated</caption>
			<filter>true</filter>
			<filteronexpand>true</filteronexpand>
			<filtertextoption>range</filtertextoption>
		</field>
		<!-- fields -->
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE</fieldname>
			<caption>key_unified_code</caption>
			<summary>true</summary>
			<link>page.do?xml=rewards/settlementProcessRunDefinition&amp;act=itm&amp;jndi=ejb/CRMUIRewardSettlementRunDefinition&amp;fc=loadForm&amp;pv0=((PROCESSRUNDEFINITIONS.PROCESSRUNDEFID))&amp;pvc=1</link>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFNAME</fieldname>
			<caption>key_name</caption>
			<summary>true</summary>
			<link>page.do?xml=rewards/settlementProcessRunDefinition&amp;act=itm&amp;jndi=ejb/CRMUIRewardSettlementRunDefinition&amp;fc=loadForm&amp;pv0=((PROCESSRUNDEFINITIONS.PROCESSRUNDEFID))&amp;pvc=1</link>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFALTCODE</fieldname>
			<caption>key_alternative_code</caption>
			<summary>true</summary>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFDESC</fieldname>
			<caption>key_description</caption>
			<summary>true</summary>
			<mouseover>true</mouseover>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFVERSION</fieldname>
			<caption>key_version</caption>
			<summary>true</summary>
		</field>
		<field>
			<fieldname>CREATEDBYUSERNAME</fieldname>
			<fieldfunction>CREATEDBY.USERNAME</fieldfunction>
			<caption>key_created_by_user</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>UPDATEDBYUSERNAME</fieldname>
			<fieldfunction>UPDATEDBY.USERNAME</fieldfunction>
			<caption>key_updated_by_user</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>CREATEDBYUNITOUUNAME</fieldname>
			<fieldfunction>CREATEDBYUNIT.OUUNAME</fieldfunction>
			<caption>key_created_by_unit</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>UPDATEDBYUNITOUUNAME</fieldname>
			<fieldfunction>UPDATEDBYUNIT.OUUNAME</fieldfunction>
			<caption>key_updated_by_unit</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFCREATEDDATE</fieldname>
			<fieldtype>date</fieldtype>
			<caption>key_date_created</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFUPDATEDDATE</fieldname>
			<fieldtype>date</fieldtype>
			<caption>key_date_updated</caption>
			<expand>true</expand>
		</field>
		<field>
			<fieldname>PROCESSRUNDEFINITIONS.PROCESSRUNDEFSCHEDULEDDATE</fieldname>
			<fieldtype>date</fieldtype>
			<caption>key_scheduled_date</caption>
			<expand>true</expand>
		</field>
		<!-- drilldowns -->
		<field>
			<fieldname>PROCESSRUNS_DD</fieldname>
			<fieldfunction>''</fieldfunction>
			<caption>key_process_runs</caption>
			<summary>true</summary>
			<fieldtype>label</fieldtype>
			<label>key_process_runs</label>
			<link>drilldown:rewards/settlementProcessRuns;hidefilters~true~PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE~((PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE))</link>
		</field>
		<field>
			<fieldname>PREVIOUSVERSION_DD</fieldname>
			<fieldfunction>''</fieldfunction>
			<caption>key_previous_version</caption>
			<summary>true</summary>
			<fieldtype>label</fieldtype>
			<label>key_previous_version</label>
			<link>drilldown:rewards/settlementProcessRunDefinitionsVersions;hidefilters~true~PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE~((PROCESSRUNDEFINITIONS.PROCESSRUNDEFUNIFIEDCODE))~PROCESSRUNDEFINITIONS.PROCESSRUNDEFID~((PROCESSRUNDEFINITIONS.PROCESSRUNDEFID))</link>
		</field>
	</fieldlist>
	<actions>
		<action>
			<caption>key_new</caption>
			<topmenu>true</topmenu>
			<link>page.do?xml=rewards/settlementProcessRunDefinition&amp;act=new&amp;jndi=ejb/CRMUIRewardSettlementRunDefinition&amp;fc=createButton</link>
		</action>
	</actions>
</summary>

 

...

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 notification run definition.
	 * 
	 * @return a notification 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(constructRewardSchemeCriterion());
		
 
		//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;
	}
	private Set<RewardSchemeCriterion> constructRewardSchemeCriterion() throws Exception {
		Set<RewardSchemeCriterion> schemeCriteria = new HashSet<RewardSchemeCriterion>();
		//schemeCriteria.add(new RewardSchemeCriterion());
		return schemeCriteria;
	}
	/**
	 * Saves a reward run definition.
	 * @param rewardSettlementRunDefinition - the reward run definition to save
	 * @return the saved reward 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 process run definition is modified
		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 notification run definition
	 * 
	 * @param notificationRunDefinition - the notification 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 notification run definition
	 * 
	 * @param notificationRunDefinition - the notification run definition to validate the scheduling settings of
	 * @throws Exception
	 */
	protected void validateSchedulingSettings(RewardSettlementRunDefinition rewardSettlementRunDefinition) throws Exception{
	}
	/**
	 * Loads a reward run definition form.
	 * 
	 * @param rewardSettlementRunDefinition - the reward 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 reward run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the reward run definition to amend
	 * @return the amended reward 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 reward run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the reward 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());
		}
		
		CRMDOProcessRunLog processRunLog	= (CRMDOProcessRunLog) processRunLogBean.construct(rewardSettlementRunDefinition.getProcessRunDefinition());
		submit(processRunLog);
		return rewardSettlementRunDefinition;
	}
	
	/**
	 * Validate the action input of the reward settlement run definition
	 * 
	 * @param definition - the reward 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 reward run definition.
	 * 
	 * @param rewardSettlementRunDefinition - the reward 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 reward 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 reward 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 reward settlement type options.
	 * 
	 * @return the reward settlement type options
	 * @throws Exception
	 */
	public LookupBuilder getRewardSettlementTypeOptions() throws Exception {
		return getRewardSettlementTypeOptions(null);
	}
	/**
	 * Loads the reward settlement type options.
	 * 
	 * @param emptyValue - an empty value for a reward settlement type
	 * @return the reward 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;
	}
}

 

In this case, a UI class have to implement as well, extending the CRMUIProcessRunDefinitionBean. Also, module id and process id, must be defined in the UI as they declared in the module.xml file. To implement the basic functionality, we will need to create the following methods: createButton, loadForm, editButton, saveButton, submitButton, deleteButton and amendButton, as demonstrated below:

 

Later on, data entry page must be implemented by giving the ability to the user create, view, modify, delete or apply other operations on a process run record. Below, we can see the detail page of the process run definition and specifically the process runs tab, showing the successful whilst failed runs.

 

...

5. Create XML Utility Class

 The new XML utility class must extend com.crm.businessobject.processrun.ProcessRunDefinitionXMLUtilBean class and will be used to save and load any criteria, action inputs, and scheduling settings.

Code Block
languagejava
titleRewardSettlementProcessRunDefinitionXMLUtilBean.java
linenumberstrue
collapsetrue
/**
 * Session Bean implementation class RewardSettlementProcessRunDefinitionXMLUtilBean
 */
@Stateless
@LocalBean
public class RewardSettlementProcessRunDefinitionXMLUtilBean extends ProcessRunDefinitionXMLUtilBean {
       
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;	
	private final String XML_CRITERIA_NODE 				= "criteria";
	private final String XML_INPUT_SETTINGS_NODE		= "inputsettings";
	private final String XML_SCHEME_CRITERIA_NODE 		= "schemes";
	private final String XML_SCHEME_NODE 				= "scheme";
	private final String XML_SCHEMEID_NODE 				= "schemeid";
	private final String XML_DAYS_AGO_NODE				= "daysago";
	private final String XML_SETTLEMENT_TYPE_NODE		= "settlementtype";

	@EJB private CRMBORewardSchemeBean schemeBean;
	@EJB private CRMBOProductBean productBean;
	@EJB private CRMBOFinancialTransactionTypeBean financialTransactionTypeBean;
	
	/**
     * @see ProcessRunDefinitionXMLUtilBean#ProcessRunDefinitionXMLUtilBean()
     */
    public RewardSettlementProcessRunDefinitionXMLUtilBean() {	
    }
    
	public RewardSettlementRunDefinition initialize(RewardSettlementRunDefinition definition) throws Exception {
        // Initialises the rewards schemes criteria
		definition.setSchemeCriteria(initializeSchemeCriteria(definition.getSchemeCriteria()));
		return definition;
	}

	public Set<RewardSchemeCriterion> initializeSchemeCriteria(Set<RewardSchemeCriterion> schemeCriteria) throws ParserConfigurationException, SAXException, IOException,Exception {
		//Create a set of rewards scheme criteria
		Set<RewardSchemeCriterion> schemes	= new HashSet<RewardSchemeCriterion>();

		if(schemeCriteria!=null && schemeCriteria.size() > 0)
		{
			Iterator<RewardSchemeCriterion> iter = schemeCriteria.iterator();
			while (iter.hasNext())
			{
				RewardSchemeCriterion schemeCriterion = iter.next();
				if (schemeCriterion.getSchemeID()!=null && schemeCriterion.getScheme() == null)
				{
					//Given its ID, load the rewards scheme for the db and set it to the scheme criterion
					schemeCriterion.setScheme((CRMDORewardScheme)schemeBean.load(schemeCriterion.getSchemeID()));
				}
				//Add the initialised scheme criterion to the scheme criteria set
				schemes.add(schemeCriterion);
			}
		}
		return schemes;
	}

	public RewardSettlementRunDefinition loadFromXML(RewardSettlementRunDefinition definition) throws Exception {
		definition = loadCriteriaFromXML(definition);
		definition = loadInputSettingsFromXML(definition);
		definition = loadSchedulingSettingsFromXML(definition);
		return definition;
	}
	
	protected RewardSettlementRunDefinition loadInputSettingsFromXML(RewardSettlementRunDefinition definition) throws Exception {
		//load the rewards settlement type from an XML formatted string field
		definition.setRewardSettlementType(loadRewardSettlementTypeFromXML(definition.getProcessRunDefinition().getActionInputXML()));
		return definition;
	}

	protected RewardSettlementRunDefinition loadCriteriaFromXML(RewardSettlementRunDefinition definition) throws Exception {
		//load the rewards scheme criteria set from an XML formatted string field
		definition.setSchemeCriteria(loadSchemeCriteria(definition.getProcessRunDefinition().getCriteriaXML()));
		//load the days ago integer field from an XML formatted string field
		definition.setDaysAgo(loadNumberFromXML(definition.getProcessRunDefinition().getCriteriaXML()));
		return definition;
	}
	
	public Integer loadNumberFromXML(String xmlString) throws Exception {
		Integer number = null;
		if (xmlString!=null)
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputSource is = new InputSource(new StringReader(xmlString));
			Document doc = (Document) builder.parse(is);
			Element parent = (Element)doc.getFirstChild();
			for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling())
			{
				if (child.getTextContent().length()>0)
				{
					if (child instanceof Element && child.getNodeName().equals(XML_DAYS_AGO_NODE))
					{
						if (child.getTextContent()!=null && child.getTextContent().length()>0)
						{
							number = new Integer(Integer.parseInt(child.getTextContent()));
						}
					}
				}
			}
		}
		return number;
	}
	
	public RewardSettlementType loadRewardSettlementTypeFromXML(String xmlString) throws Exception {
		RewardSettlementType type = null;
		if (xmlString!=null)
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputSource is = new InputSource(new StringReader(xmlString));
			Document doc = (Document) builder.parse(is);
			Element parent = (Element)doc.getFirstChild();
			for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling())
			{
				if (child.getTextContent().length()>0)
				{
					if (child instanceof Element && child.getNodeName().equals(XML_SETTLEMENT_TYPE_NODE))
					{
						if (child.getTextContent()!=null && child.getTextContent().length()>0)
						{
							type=UnitOfTime.valueOf(RewardSettlementType.class,child.getTextContent());
							break;
						}
					}
				}
			}
		}
		return type;
	}

	public Set<RewardSchemeCriterion> loadSchemeCriteria(String xmlString) throws ParserConfigurationException, SAXException, IOException {
		Set<RewardSchemeCriterion> schemeCriteria =new HashSet<RewardSchemeCriterion>();
		if(xmlString!=null)
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputSource is = new InputSource(new StringReader(xmlString));
			Document doc = (Document) builder.parse(is);
			Element parent = (Element)doc.getFirstChild();
			for(Node child = parent.getFirstChild(); child != null; child = child.getNextSibling())
			{
				if(child.getTextContent().length()>0)
				{
					if(child instanceof Element && child.getNodeName().equals(XML_SCHEME_CRITERIA_NODE))
					{
						NodeList schemes = child.getChildNodes();
						if (schemes!=null && schemes.getLength() > 0)
						{
							for (int i=0;i<schemes.getLength();i++)
							{
								Node schemeNode = schemes.item(i);
								if(schemeNode instanceof Element && schemeNode.getNodeName().equals(XML_SCHEME_NODE))
								{
									NodeList schemeValueNodes = schemeNode.getChildNodes();
									RewardSchemeCriterion rewardSchemeCriterion = new RewardSchemeCriterion();
									if (schemeValueNodes!=null && schemeValueNodes.getLength() > 0)
									{
										for (int j=0;j<schemeValueNodes.getLength();j++)
										{
											Node schemeValueNode = schemeValueNodes.item(j);
											if(schemeValueNode instanceof Element && schemeValueNode.getNodeName().equals(XML_SCHEMEID_NODE))
											{
												rewardSchemeCriterion.setSchemeID(schemeValueNode.getTextContent());
											}
										}
									}
									schemeCriteria.add(rewardSchemeCriterion);
								}
							}
						}
					}
				}
			}
		}
		return schemeCriteria;
	}
	
	
	protected RewardSettlementRunDefinition loadSchedulingSettingsFromXML(RewardSettlementRunDefinition definition) throws ParserConfigurationException, SAXException, IOException, ParseException {
		CRMDOProcessRunDefinition processRunDefinition = definition.getProcessRunDefinition();
		if (processRunDefinition!=null)
		{
			//Use an XML formatted string field to load the scheduling settings object and set it to the process run definition
			String xmlString			= processRunDefinition.getSchSettingXML();
			SchedulerTask schedulerTask	= loadScheduleSettings(xmlString);
			definition.setSchedulerTask(schedulerTask);
		}
		return definition;
	}

	public RewardSettlementRunDefinition constructXML(RewardSettlementRunDefinition definition) throws Exception {
		definition = constructCriteriaXML(definition);
		definition = constructInputSettingsXML(definition);
		definition = constructSchedulingSettingsXML(definition);
		return definition;
	}
	
	protected RewardSettlementRunDefinition constructInputSettingsXML(RewardSettlementRunDefinition definition) {
		//Create input settings node
		DOMElement inputSettingsNode			= new DOMElement(XML_INPUT_SETTINGS_NODE);
		//construct the rewards settlement type XML
		DOMElement rewardSettlementTypeElement	= constructRewardSettlementTypeXML(definition.getRewardSettlementType());
		//add the rewards settlement type XML to the input settings node
		inputSettingsNode.add(rewardSettlementTypeElement);

		CRMDOProcessRunDefinition processRunDefinition	= definition.getProcessRunDefinition();
		processRunDefinition.setActionInputXML(inputSettingsNode.asXML());

		return definition;
	}
	
	public DOMElement constructRewardSettlementTypeXML(RewardSettlementType type) {
		//Create a new settlement type node and add the rewards settlement type to it
		DOMElement typeElement = new DOMElement(XML_SETTLEMENT_TYPE_NODE);

		if (type!=null)
		{
			typeElement.setText(type.toString());
		}

		return typeElement;	
	}
	
	protected RewardSettlementRunDefinition constructCriteriaXML(RewardSettlementRunDefinition definition) {
		//Create a new criteria node
		DOMElement criteriaNode			= new DOMElement(XML_CRITERIA_NODE);
 
		//Construct the rewards scheme criteria XML 
		DOMElement schemeCriteriaElement	= constructSchemeCriteriaXML(definition.getSchemeCriteria());
 
		//Construct the days ago XML
		DOMElement daysAgoElement = constructNumber(definition.getDaysAgo());
 
		//Add the two XMLs to the criteria node
		criteriaNode.add(schemeCriteriaElement);
		criteriaNode.add(daysAgoElement);

		CRMDOProcessRunDefinition processRunDefinition	= definition.getProcessRunDefinition();
		processRunDefinition.setCriteriaXML(criteriaNode.asXML() );
		return definition;
	}
	
	public DOMElement constructNumber(Integer number) {
		DOMElement daysAgoElement = new DOMElement(XML_DAYS_AGO_NODE);

		if (number!=null)
		{
			daysAgoElement.setText(number.toString());
		}
		return daysAgoElement;	
	}
	
	public DOMElement constructSchemeCriteriaXML(Set<RewardSchemeCriterion> schemeCriteria) {
    	DOMElement schemeCriteriaElement 	= new DOMElement(XML_SCHEME_CRITERIA_NODE);
		if (schemeCriteria!=null && schemeCriteria.size() > 0)
		{
	    	Iterator<RewardSchemeCriterion> iter = schemeCriteria.iterator();
	    	while (iter.hasNext())
	    	{
	    		RewardSchemeCriterion schemeCriterion 	= iter.next();
	        	DOMElement schemeElement 			= new DOMElement(XML_SCHEME_NODE);
	        	DOMElement schemeValueElement 		= new DOMElement(XML_SCHEMEID_NODE);
	        	
	            if (schemeCriterion.getScheme()!=null)
	            {
	            	schemeValueElement.setText(schemeCriterion.getScheme().getId());
	            }
	            else if(schemeCriterion.getSchemeID()!=null)
	            {
	            	schemeValueElement.setText(schemeCriterion.getSchemeID());
	            }
	        	
	            schemeElement.add(schemeValueElement);
	        	
	            schemeCriteriaElement.add(schemeElement);
	    		
	    	}
		}
       
	   return schemeCriteriaElement;
	}
	
	protected RewardSettlementRunDefinition constructSchedulingSettingsXML(RewardSettlementRunDefinition definition) {
	 	   
		DOMElement schedulerTaskNode =   constructSchedulingSettingsXML(definition.getSchedulerTask() );
		definition.getProcessRunDefinition().setSchSettingXML(schedulerTaskNode.asXML());
    
     	return definition;
    }
}

 

 

On the last step, the CRMProcessRunBean mentioned in the module.xml as additional process need to be implemented whilst the method executeMessageProcess which executes the process runs via threats mechanism like in Implement a Multithreaded Process section. Firstly, process run method saves the action inputs. Then each process run request processed from a thread and if procedure works correctly, the next process run prepares to been processed and the current one saved as completed. On the other hand, if something goes wrong, the current process run is saved as failed and moves to process the next request. This procedure continues until all the process run requests pass from the multi-threading mechanism. As a result, all the successful and failed process runs are illustrated in the summary page image above. Also, below is illustrated the example of the multi-threaded method implemented:

...