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.