Reminder and Escalation

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(&quot;managerLogin&quot;);" 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 &quot;Omega User Creation Manager Approval - &quot; + identityModel.get(&quot;lastname&quot;);"/>
<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

Hi @PoojaSingh03,

from the error that you are getting it seems a workflow is trying to process a workitem that does not have a associated task result. Are there any associated task failures ?

if you can add more loggers to detail the the approval.toXml() in case of any errors, this will help.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.