Hi,
I have written a custom workflow for forms. In that we are trying to send Reminder and escalation but we are getting exception. Please refer below screenshot:
Anybody can please help to resolve this issue:
Please find below code and please suggest how we can make it working.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Workflow PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Workflow explicitTransitions="true" libraries="Identity" name="Workflow_CreateUser" taskType="LCM" type="LCMIdentity">
<Variable initializer="true" name="transient"/>
<Variable initializer="InfoSecIDAMApproval" input="true" name="workGroupName"/>
<Variable input="true" name="approvingIdentities"/>
<Variable input="true" name="quickLinkIdentityId"/>
<Variable input="true" name="approverName"/>
<Variable initializer="ref:manager" input="true" name="manager"/>
<Variable initializer="InfoSecIDAMApproval" input="true" name="fallbackApprover"/>
<Variable name="identityRequestId" output="true"/>
<Variable initializer="LCM" input="true" name="source">
<Description>String version of sailpoint.object.Source to indicate
where the request originated. Defaults to LCM.</Description>
</Variable>
<Variable input="true" name="plan"/>
<Variable input="true" name="identityModel"/>
<Variable name="launcher"/>
<Variable input="true" name="identityName" type="string"/>
<Variable name="newIdentityUserName" type="string"/>
<Variable name="newIdentityDisplayName" type="string"/>
<Variable name="middlename"/>
<Variable name="managerWorkItemName"/>
<Variable initializer="string:true" name="transient"/>
<Variable initializer="true" name="trace"/>
<Variable initializer="true" name="foregroundProvisioning"/>
<RuleLibraries>
<Reference class="sailpoint.object.Rule" name="RuleLibrary-CreateUserUtil"/>
<Reference class="sailpoint.object.Rule" name="RuleLibrary-GenerateShortMyID"/>
<Reference class="sailpoint.object.Rule" name="RuleLibrary-EmployeeJoiner"/>
</RuleLibraries>
<Step icon="Start" name="Start" posX="47" posY="17">
<Transition to="Send Email To Manager"/>
</Step>
<Step icon="Email" name="Send Email To Manager" posX="148" posY="10">
<Arg name="identityRequestId" value="ref:identityRequestId"/>
<Description>Send the email to newly joined user's manager with password, PIN and User Login.</Description>
<Script>
<Source>
import java.util.Map;
import java.util.HashMap;
import sailpoint.object.Identity;
import org.apache.log4j.Logger;
import sailpoint.object.EmailOptions;
import sailpoint.object.EmailTemplate;
Logger omegaLog = Logger.getLogger("OmegaLogger");
omegaLog.debug("Sending contractor email");
Identity requesterObj = context.getObject(Identity.class, launcher);
String email = requesterObj.getEmail();
Map attributeMap=new HashMap();
attributeMap.put("firstName",identityModel.get("firstname"));
attributeMap.put("lastName",identityModel.get("lastname"));
EmailOptions emailOptionsGroup = new EmailOptions();
emailOptionsGroup.setTo(email);
emailOptionsGroup.setVariables(attributeMap);
EmailTemplate templates = context.getObject(EmailTemplate.class, "EmailTemplate-CreateContractorSubmitRequest");
context.sendEmailNotification(templates, emailOptionsGroup);
</Source>
</Script>
<Transition to="Manager Approval"/>
</Step>
<Step icon="Approval" name="Manager Approval" posX="929" posY="20">
<Approval mode="any" name="Approve new user creation" owner="script:return identityModel.get("managerLogin");" return="identityModel,deleteRequest,confirmRequest,backToRequester, item" send="launcher,identityModel,identityName,isEmployee">
<AfterScript>
<Source>
import sailpoint.object.Workflow;
if (method.equals(Workflow.INTERCEPTOR_PRE_ASSIMILATION)){
log.error("item in after 1" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_START_APPROVAL)){
log.error("item in after 2" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_POST_ASSIMILATION)){
log.error("item in after 3" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_ARCHIVE)){
log.error("item in after 4" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_END_APPROVAL)){
log.error("item in after 5" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_CANCEL_APPROVAL)){
log.error("item in after 6" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_OPEN_WORK_ITEM)){
log.error("item in after 7" +approval.toXml());
}
</Source>
</AfterScript>
<Arg name="workItemType" value="Form"/>
<Arg name="workItemDescription" value="script: return "Omega User Creation Manager Approval - " + identityModel.get("lastname");"/>
<Arg name="workItemForm" value="OMEGA_FORM_CreateUser Manager Approval"/>
<Arg name="workItemFormBasePath" value="identityModel"/>
<Arg name="approvalSet" value="ref:approvalSet"/>
<Arg name="workItemEscalationRule" value="ref:workItemEscalationRule"/>
<Arg name="workItemEscalationTemplate" value="ref:workItemEscalationTemplate"/>
<Arg name="workItemHoursTillEscalation" value="ref:workItemHoursTillEscalation"/>
<Arg name="workItemMaxReminders" value="ref:workItemMaxReminders"/>
<Arg name="workItemEscalationFrequency" value="ref:workItemEscalationFrequency"/>
<Arg name="workItemHoursBetweenReminders" value="ref:workItemHoursBetweenReminders"/>
<Arg name="workItemIdentityRequestId" value="ref:identityRequestId"/>
<Arg name="workItemNotificationTemplate" value="ref:approvalEmailTemplate"/>
<Arg name="workItemPriority" value="ref:workItemPriority"/>
<Arg name="approvalMode" value="ref:approvalMode"/>
<Arg name="approvalScheme" value="ref:approvalScheme"/>
<Arg name="approvalSplitPoint" value="ref:approvalSplitPoint"/>
<Arg name="clearApprovalDecisions" value="ref:clearApprovalDecisions"/>
<Arg name="workItemReminderTemplate" value="ref:workItemReminderTemplate"/>
<Arg name="workItemRequester" value="$(launcher)"/>
<Arg name="plan" value="ref:plan"/>
<Arg name="requesterdisplayname">
<Script>
<Source>
import sailpoint.object.Identity;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
Logger omegaLog = Logger.getLogger("OmegaLogger");
omegaLog.debug("identityModel mgrrrr"+identityModel);
Identity requesterObj = context.getObject(Identity.class, launcher);
omegaLog.debug("identityModel mgrrrr2 "+requesterObj.getDisplayName());
return requesterObj.getDisplayName();
</Source>
</Script>
</Arg>
<Arg name="managerName">
<Script>
<Source>
import sailpoint.object.Identity;
Identity managerObj = context.getObject(Identity.class, identityModel.get("managerLogin"));
omegaLog.debug("identityModel mgrrrr 3"+managerObj.getDisplayName());
if (managerObj.isWorkgroup() != true) {
return managerObj.getFirstname() + " " + managerObj.getLastname();
} else {
return managerObj.getDisplayName();
}
</Source>
</Script>
</Arg>
<Arg name="launcherDisplayName">
<Script>
<Source>
import sailpoint.object.Identity;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
Logger omegaLog = Logger.getLogger("OmegaLogger");
omegaLog.debug("identityModel 2"+identityModel);
Identity requesterObj = context.getObject(Identity.class, launcher);
return requesterObj.getDisplayName();
</Source>
</Script>
</Arg>
<InterceptorScript>
<Source>
import sailpoint.object.Workflow;
import sailpoint.object.ApprovalItem;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.WorkItem;
if (method.equals(Workflow.INTERCEPTOR_PRE_ASSIMILATION)){
log.error("item in after 8 " +approval.getWorkItemId());
WorkItem workItemObj = context.getObjectById(WorkItem.class, approval.getWorkItemId());
log.error("workItemObj in after 8 " +workItemObj.getName());
workflow.put("managerWorkItemName", workItemObj.getName());
}
if (method.equals(Workflow.INTERCEPTOR_START_APPROVAL)){
log.error("item in after 9" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_POST_ASSIMILATION)){
log.error("item in after 13" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_ARCHIVE)){
log.error("item in after 14" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_END_APPROVAL)){
log.error("item in after 15" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_CANCEL_APPROVAL)){
log.error("item in after 16" +approval.toXml());
}
if (method.equals(Workflow.INTERCEPTOR_OPEN_WORK_ITEM)){
log.error("item in after 17" +approval.toXml());
}
</Source>
</InterceptorScript>
<WorkItemConfig escalationStyle="both" hoursBetweenReminders="72" hoursTillEscalation="336" maxReminders="1">
<EscalationEmailTemplateRef>
<Reference class="sailpoint.object.EmailTemplate" name="EmailTemplate-CreateContractorEscalatedNotification7thDay"/>
</EscalationEmailTemplateRef>
<ReminderEmailTemplateRef>
<Reference class="sailpoint.object.EmailTemplate" name="EmailTemplate-CreateContractorReminderNotification"/>
</ReminderEmailTemplateRef>
</WorkItemConfig>
</Approval>
<Description>
Display the Identity Creation Form to the process owner.
</Description>
<Transition to="Update identityModel Changes" when="confirmRequest"/>
<Transition to="Manager Rejection Notification" when="deleteRequest"/>
</Step>
<Step icon="Email" name="Manager Rejection Notification" posX="148" posY="10">
<Arg name="identityModel" value="ref:identityModel"/>
<Arg name="managerWorkItemName" value="ref:managerWorkItemName"/>
<Arg name="launcher" value="ref:launcher"/>
<Description>Send the email to newly joined user's manager with password, PIN and User Login.</Description>
<Script>
<Source>
import java.util.Map;
import java.util.HashMap;
import sailpoint.object.Identity;
import org.apache.log4j.Logger;
import sailpoint.object.EmailOptions;
import sailpoint.object.EmailTemplate;
Logger omegaLog = Logger.getLogger("OmegaLogger");
omegaLog.debug("Sending contractor email");
log.error("Sending contractor email");
Identity requesterObj = context.getObject(Identity.class, launcher);
String requester = requesterObj.getName();
String email = requesterObj.getEmail();
Map attributeMap=new HashMap();
attributeMap.put("firstName",identityModel.get("firstname"));
attributeMap.put("lastName",identityModel.get("lastname"));
attributeMap.put("requestId",managerWorkItemName);
EmailOptions emailOptionsGroup = new EmailOptions();
emailOptionsGroup.setTo(email);
emailOptionsGroup.setVariables(attributeMap);
EmailTemplate templates = context.getObject(EmailTemplate.class, "EmailTemplate-CreateContractorManagerRejectEmail");
context.sendEmailNotification(templates, emailOptionsGroup);
</Source>
</Script>
<Transition to="Stop"/>
</Step>
<Step icon="Default" name="Update identityModel Changes" posX="1094" posY="16" resultVariable="newContractor">
<Arg name="identityModel" value="ref:identityModel"/>
<Return name="identityRequestId" to="identityRequestId"/>
<Script>
<Source>
import sailpoint.object.Identity;
import java.util.Map;
import java.util.HashMap;
import sailpoint.object.Custom;
import java.text.SimpleDateFormat;
import java.lang.StringBuilder;
import java.util.Random;
String userLoginVal = "";
if(identityModel != null){
String custObjName = "Custom-ContractorUIMapping";
Custom customObj = context.getObjectByName(Custom.class,custObjName);
List formFieldList = customObj.get("SwissCreateForm");
Identity newIdentityObject = new Identity();
if(formFieldList != null){
for(String formField: formFieldList){
newIdentityObject.setAttribute(formField, identityModel.get(formField));
}
}
//setting user login
Map userLoginMap = new HashMap();
userLoginMap.put("First Name",identityModel.get("firstname"));
userLoginMap.put("Last Name",identityModel.get("lastname"));
userLoginMap.put("Middle Name",identityModel.get("middleName"));
userLoginMap.put("PREF_FIRST_NAME",identityModel.get("preferredFirstName"));
userLoginMap.put("PREF_LAST_NAME",identityModel.get("preferredLastName"));
userLoginMap.put("Role",identityModel.get("userType"));
userLoginVal = getUserNameFromPolicy(userLoginMap);
log.error("user login created: " + userLoginVal);
identityModel.put("name", userLoginVal);
newIdentityObject.setName(userLoginVal);
newIdentityObject.setAttribute("globalLoginId", userLoginVal);
newIdentityObject.setAttribute("isMigrated","true");
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
newIdentityObject.setAttribute("startDate", dateFormat.format(identityModel.get("startDate")));
newIdentityObject.setAttribute("endDate", dateFormat.format(identityModel.get("endDate")));
//setting DisplayName
String displayNameVal = GADRName(identityModel.get("firstname"),identityModel.get("lastname"),identityModel.get("preferredFirstName"),identityModel.get("preferredLastName"),identityModel.get("userType"),identityModel.get("countryName"),null);
if(null != displayNameVal)
newIdentityObject.setDisplayName(displayNameVal);
//setting usrPIN
StringBuilder number = new StringBuilder();
Random random = new Random();
int previousDigit = -1;
int i=4;
while (i>0) {
int digit;
do {
digit = random.nextInt(9);
} while (digit == previousDigit);
if(digit != previousDigit+1 @and digit != previousDigit-1 @and !number.toString().contains(digit+"")){
number.append(digit);
previousDigit = digit;
i--;
}
}
newIdentityObject.setAttribute("usrPIN",number.toString());
//setting password
identityModel.put("initialPassword",generateOmegaPassword("OMEGA-PasswordPolicy-GlobalPolicy"));
newIdentityObject.setAttribute("initialPassword", identityModel.get("initialPassword"));
//setting shortMyID
String shortMyIdVal = generateShortMyID(userLoginVal, identityModel.get("firstname"), identityModel.get("lastname"), identityModel.get("middlename"));
newIdentityObject.setAttribute("shortMyID", shortMyIdVal);
//setting manager Employee number
Identity managerObj = context.getObject(Identity.class, identityModel.get("managerLogin"));
newIdentityObject.setManager(managerObj);
newIdentityObject.setAttribute("managerEmail", managerObj.getEmail());
newIdentityObject.setAttribute("managerGADID", managerObj.getAttribute("globalLoginId"));
//setting type
newIdentityObject.setType("Contractor");
//setting appID
String appId = generateAPUID(identityModel.get("userType"));
newIdentityObject.setAttribute("apuID", appId);
//Setting CreatedBy
newIdentityObject.setAttribute("createdBy",launcher);
//Set Needs Create Processing
newIdentityObject.setNeedsCreateProcessing(true,Identity.CreateProcessingStep.Trigger);
//Set Needs Refresh to True
newIdentityObject.isNeedsRefresh();
newIdentityObject.setNeedsRefresh(true);
context.saveObject(newIdentityObject);
context.commitTransaction();
}
return userLoginVal;
</Source>
</Script>
<Transition to="Manager Approval Notification"/>
</Step>
<Step icon="Email" name="Manager Approval Notification" posX="148" posY="10">
<Arg name="identityModel" value="ref:identityModel"/>
<Arg name="launcher" value="ref:launcher"/>
<Arg name="managerWorkItemName" value="ref:managerWorkItemName"/>
<Arg name="newIdentityUserName" value="ref:newIdentityUserName"/>
<Arg name="newIdentityDisplayName" value="ref:newIdentityDisplayName"/>
<Description>Send the email to newly joined user's manager with password, PIN and User Login.</Description>
<Script>
<Source>
import java.util.Map;
import java.util.HashMap;
import sailpoint.object.Identity;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
Logger omegaLog = Logger.getLogger("OmegaLogger");
omegaLog.debug("Sending contractor email");
Identity requesterObj = context.getObject(Identity.class, launcher);
String requester = requesterObj.getName();
String email = requesterObj.getEmail();
Map attributeMap=new HashMap();
attributeMap.put("firstName",identityModel.get("firstname"));
attributeMap.put("lastName",identityModel.get("lastname"));
attributeMap.put("requestId",managerWorkItemName);
EmailOptions emailOptionsGroup = new EmailOptions();
emailOptionsGroup.setTo(email);
emailOptionsGroup.setVariables(attributeMap);
EmailTemplate templates = context.getObject(EmailTemplate.class, "EmailTemplate-CreateContractorManagerAppprovalEmail");
context.sendEmailNotification(templates, emailOptionsGroup);
</Source>
</Script>
<Transition to="Stop"/>
</Step>
<Step icon="Stop" name="Stop" posX="791" posY="453"/>
</Workflow>
Thanks,
Pooja Singh
