Error when I try to create multi-level approval for Access Request

Which IIQ version are you inquiring about?

8.2

Please share any images or screenshots, if relevant.

<?xml version='1.0' encoding='UTF-8'?> import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.object.ManagedAttribute; import sailpoint.object.QueryOptions; import sailpoint.object.Filter; import sailpoint.object.Workflow.Approval; import sailpoint.object.Workflow.ApprovalItem; import sailpoint.object.ApprovalSet; import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import org.apache.log4j.Logger;

// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
if (owner == null) return null;

Approval a = new Approval();
a.setOwner(owner);
a.setMode("Serial"); 
a.setDescription(desc);
a.setApprovalSet(set);
return a;

}

// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
if (empNo == null || empNo.isEmpty()) return null;
// Using context from the global namespace (passed automatically when referenced)
return context.getUniqueObject(Identity.class, Filter.eq(“employeeNumber”, empNo));
}

Logger logger = Logger.getLogger(“NBE.EIAM.ApprovalRule”);
List approvals = new ArrayList();
Set addedApprovers = new HashSet();

try {
Identity requester = context.getObjectByName(Identity.class, identityName);
if (requester == null) return approvals;

String description = "Access Request Approval for: " + identityName;
String empType = (String) requester.getAttribute("emptype");

// 1. Direct Manager
Identity manager = requester.getManager(); 
if (manager != null &amp;&amp; !addedApprovers.contains(manager.getName())) {
    // Now calling createApproval directly from the Library
    Approval app = createApproval(manager, description, approvalSet);
    if (app != null) {
        approvals.add(app);
        addedApprovers.add(manager.getName());
    }
}

// 2. Hierarchy Logic (Branches vs. HQ)
if ("Branches".equalsIgnoreCase(empType)) {
    
    Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
    if (branchMgr != null &amp;&amp; !addedApprovers.contains(branchMgr.getName())) {
        Approval app = createApproval(branchMgr, description, approvalSet);
        approvals.add(app);
        addedApprovers.add(branchMgr.getName());
    }
    
    String areaName = (String) requester.getAttribute("regionName");
    Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
    if (areaMgr != null &amp;&amp; !addedApprovers.contains(areaMgr.getName())) {
        Approval app = createApproval(areaMgr, description, approvalSet);
        approvals.add(app);
        addedApprovers.add(areaMgr.getName());
    }

} else if ("Head Office".equalsIgnoreCase(empType)) {
    
    Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
    if (gmApprover != null &amp;&amp; !addedApprovers.contains(gmApprover.getName())) {
        Approval app = createApproval(gmApprover, description, approvalSet);
        approvals.add(app);
        addedApprovers.add(gmApprover.getName());
    }
    
    Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
    if (groupHead != null &amp;&amp; !addedApprovers.contains(groupHead.getName())) {
        Approval app = createApproval(groupHead, description, approvalSet);
        approvals.add(app);
        addedApprovers.add(groupHead.getName());
    }
}

// 3. Optional Workgroup Levels
for (ApprovalItem item : approvalSet.getItems()) {
    
    QueryOptions maQo = new QueryOptions();
    maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
    maQo.addFilter(Filter.eq("value", item.getValue()));
    
    Iterator it = context.search(ManagedAttribute.class, maQo);
    ManagedAttribute ma = null;
    if (it.hasNext()) {
        ma = (ManagedAttribute) it.next();
    }
    sailpoint.tools.Util.flushIterator(it); 

    if (ma != null) {
        for (int i = 1; i &lt;= 4; i++) {
            String wgName = (String) ma.getAttribute("workgroupLevel" + i);
            if (wgName != null &amp;&amp; !wgName.isEmpty()) {
                Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
                if (workgroup != null &amp;&amp; !addedApprovers.contains(workgroup.getName())) {
                    Approval app = createApproval(workgroup, description, approvalSet);
                    approvals.add(app);
                    addedApprovers.add(workgroup.getName());
                }
            }
        }
    }
}

} catch (Exception e) {
logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}

return approvals;

Share all details about your problem, including any error messages you may have received.

An unexpected error occurred: BeanShell script error: bsh.EvalError: Sourced file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : Typed variable declaration : Error in method invocation: Method setOwner(sailpoint.object.Identity$HibernateProxy$YPxDfpk3) not found in class’sailpoint.object.Workflow$Approval’ : at Line: 22 : in file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : a .setOwner ( owner ) Called from method: createApproval : at Line: 51 : in file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : createApproval ( manager , description , approvalSet ) BSF info: NBE_EIAM_Approval_Rule at line: 0 column: columnNo

An unexpected error occurred: BeanShell script error: bsh.EvalError: Sourced file: inline evaluation of: ``import sailpoint.object.Identity; import sailpoint.object.Filter; import sailpoi . . . ‘’ : Class: Approval not found in namespace : at Line: 9 : in file: inline evaluation of: ``import sailpoint.object.Identity; import sailpoint.object.Filter; import sailpoi . . . ‘’ : Approval BSF info: NBE_EIAM_Library at line: 0 column: columnNo

need help in this PlS

@ismaelmoreno1 can you pls help me with this

NBE_EIAM_Library missing

import sailpoint.object.Workflow.Approval;

i did that still get same error

can you share the both xml here for better visibility?

Please share all xmls

You are trying to use the setOwner method, but this method is not available in the Approval class. Please check the error message, it clearly indicates that this method does not exist in that class.

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
  
  

  <Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;


// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
    if (owner == null) return null;
    
    Approval a = new Approval();
    a.setOwner(owner);
    a.setMode("Serial"); 
    a.setDescription(desc);
    a.setApprovalSet(set);
    return a;
}

// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
    if (empNo == null || empNo.isEmpty()) return null;
    // Using context from the global namespace (passed automatically when referenced)
    return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}

Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet(); 

try {
    Identity requester = context.getObjectByName(Identity.class, identityName);
    if (requester == null) return approvals;

    String description = "Access Request Approval for: " + identityName;
    String empType = (String) requester.getAttribute("emptype");

    // 1. Direct Manager
    Identity manager = requester.getManager(); 
    if (manager != null &amp;&amp; !addedApprovers.contains(manager.getName())) {
        // Now calling createApproval directly from the Library
        Approval app = createApproval(manager, description, approvalSet);
        if (app != null) {
            approvals.add(app);
            addedApprovers.add(manager.getName());
        }
    }

    // 2. Hierarchy Logic (Branches vs. HQ)
    if ("Branches".equalsIgnoreCase(empType)) {
        
        Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (branchMgr != null &amp;&amp; !addedApprovers.contains(branchMgr.getName())) {
            Approval app = createApproval(branchMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(branchMgr.getName());
        }
        
        String areaName = (String) requester.getAttribute("regionName");
        Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
        if (areaMgr != null &amp;&amp; !addedApprovers.contains(areaMgr.getName())) {
            Approval app = createApproval(areaMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(areaMgr.getName());
        }

    } else if ("Head Office".equalsIgnoreCase(empType)) {
        
        Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (gmApprover != null &amp;&amp; !addedApprovers.contains(gmApprover.getName())) {
            Approval app = createApproval(gmApprover, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(gmApprover.getName());
        }
        
        Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
        if (groupHead != null &amp;&amp; !addedApprovers.contains(groupHead.getName())) {
            Approval app = createApproval(groupHead, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(groupHead.getName());
        }
    }

    // 3. Optional Workgroup Levels
    for (ApprovalItem item : approvalSet.getItems()) {
        
        QueryOptions maQo = new QueryOptions();
        maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
        maQo.addFilter(Filter.eq("value", item.getValue()));
        
        Iterator it = context.search(ManagedAttribute.class, maQo);
        ManagedAttribute ma = null;
        if (it.hasNext()) {
            ma = (ManagedAttribute) it.next();
        }
        sailpoint.tools.Util.flushIterator(it); 

        if (ma != null) {
            for (int i = 1; i &lt;= 4; i++) {
                String wgName = (String) ma.getAttribute("workgroupLevel" + i);
                if (wgName != null &amp;&amp; !wgName.isEmpty()) {
                    Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
                    if (workgroup != null &amp;&amp; !addedApprovers.contains(workgroup.getName())) {
                        Approval app = createApproval(workgroup, description, approvalSet);
                        approvals.add(app);
                        addedApprovers.add(workgroup.getName());
                    }
                }
            }
        }
    }

} catch (Exception e) {
    logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}

return approvals;
  </Source>
</Rule>

what should i use instead of it

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
  
  

  <Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;


// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
    if (owner == null) return null;
    
    Approval a = new Approval();
    a.setOwner(owner);
    a.setMode("Serial"); 
    a.setDescription(desc);
    a.setApprovalSet(set);
    return a;
}

// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
    if (empNo == null || empNo.isEmpty()) return null;
    // Using context from the global namespace (passed automatically when referenced)
    return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}

Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet(); 

try {
    Identity requester = context.getObjectByName(Identity.class, identityName);
    if (requester == null) return approvals;

    String description = "Access Request Approval for: " + identityName;
    String empType = (String) requester.getAttribute("emptype");

    // 1. Direct Manager
    Identity manager = requester.getManager(); 
    if (manager != null &amp;&amp; !addedApprovers.contains(manager.getName())) {
        // Now calling createApproval directly from the Library
        Approval app = createApproval(manager, description, approvalSet);
        if (app != null) {
            approvals.add(app);
            addedApprovers.add(manager.getName());
        }
    }

    // 2. Hierarchy Logic (Branches vs. HQ)
    if ("Branches".equalsIgnoreCase(empType)) {
        
        Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (branchMgr != null &amp;&amp; !addedApprovers.contains(branchMgr.getName())) {
            Approval app = createApproval(branchMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(branchMgr.getName());
        }
        
        String areaName = (String) requester.getAttribute("regionName");
        Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
        if (areaMgr != null &amp;&amp; !addedApprovers.contains(areaMgr.getName())) {
            Approval app = createApproval(areaMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(areaMgr.getName());
        }

    } else if ("Head Office".equalsIgnoreCase(empType)) {
        
        Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (gmApprover != null &amp;&amp; !addedApprovers.contains(gmApprover.getName())) {
            Approval app = createApproval(gmApprover, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(gmApprover.getName());
        }
        
        Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
        if (groupHead != null &amp;&amp; !addedApprovers.contains(groupHead.getName())) {
            Approval app = createApproval(groupHead, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(groupHead.getName());
        }
    }

    // 3. Optional Workgroup Levels
    for (ApprovalItem item : approvalSet.getItems()) {
        
        QueryOptions maQo = new QueryOptions();
        maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
        maQo.addFilter(Filter.eq("value", item.getValue()));
        
        Iterator it = context.search(ManagedAttribute.class, maQo);
        ManagedAttribute ma = null;
        if (it.hasNext()) {
            ma = (ManagedAttribute) it.next();
        }
        sailpoint.tools.Util.flushIterator(it); 

        if (ma != null) {
            for (int i = 1; i &lt;= 4; i++) {
                String wgName = (String) ma.getAttribute("workgroupLevel" + i);
                if (wgName != null &amp;&amp; !wgName.isEmpty()) {
                    Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
                    if (workgroup != null &amp;&amp; !addedApprovers.contains(workgroup.getName())) {
                        Approval app = createApproval(workgroup, description, approvalSet);
                        approvals.add(app);
                        addedApprovers.add(workgroup.getName());
                    }
                }
            }
        }
    }

} catch (Exception e) {
    logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}

return approvals;
  </Source>
</Rule>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
  
  

  <Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;


// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
    if (owner == null) return null;
    
    Approval a = new Approval();
    a.setOwner(owner);
    a.setMode("Serial"); 
    a.setDescription(desc);
    a.setApprovalSet(set);
    return a;
}

// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
    if (empNo == null || empNo.isEmpty()) return null;
    // Using context from the global namespace (passed automatically when referenced)
    return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}

Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet(); 

try {
    Identity requester = context.getObjectByName(Identity.class, identityName);
    if (requester == null) return approvals;

    String description = "Access Request Approval for: " + identityName;
    String empType = (String) requester.getAttribute("emptype");

    // 1. Direct Manager
    Identity manager = requester.getManager(); 
    if (manager != null &amp;&amp; !addedApprovers.contains(manager.getName())) {
        // Now calling createApproval directly from the Library
        Approval app = createApproval(manager, description, approvalSet);
        if (app != null) {
            approvals.add(app);
            addedApprovers.add(manager.getName());
        }
    }

    // 2. Hierarchy Logic (Branches vs. HQ)
    if ("Branches".equalsIgnoreCase(empType)) {
        
        Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (branchMgr != null &amp;&amp; !addedApprovers.contains(branchMgr.getName())) {
            Approval app = createApproval(branchMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(branchMgr.getName());
        }
        
        String areaName = (String) requester.getAttribute("regionName");
        Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
        if (areaMgr != null &amp;&amp; !addedApprovers.contains(areaMgr.getName())) {
            Approval app = createApproval(areaMgr, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(areaMgr.getName());
        }

    } else if ("Head Office".equalsIgnoreCase(empType)) {
        
        Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
        if (gmApprover != null &amp;&amp; !addedApprovers.contains(gmApprover.getName())) {
            Approval app = createApproval(gmApprover, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(gmApprover.getName());
        }
        
        Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
        if (groupHead != null &amp;&amp; !addedApprovers.contains(groupHead.getName())) {
            Approval app = createApproval(groupHead, description, approvalSet);
            approvals.add(app);
            addedApprovers.add(groupHead.getName());
        }
    }

    // 3. Optional Workgroup Levels
    for (ApprovalItem item : approvalSet.getItems()) {
        
        QueryOptions maQo = new QueryOptions();
        maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
        maQo.addFilter(Filter.eq("value", item.getValue()));
        
        Iterator it = context.search(ManagedAttribute.class, maQo);
        ManagedAttribute ma = null;
        if (it.hasNext()) {
            ma = (ManagedAttribute) it.next();
        }
        sailpoint.tools.Util.flushIterator(it); 

        if (ma != null) {
            for (int i = 1; i &lt;= 4; i++) {
                String wgName = (String) ma.getAttribute("workgroupLevel" + i);
                if (wgName != null &amp;&amp; !wgName.isEmpty()) {
                    Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
                    if (workgroup != null &amp;&amp; !addedApprovers.contains(workgroup.getName())) {
                        Approval app = createApproval(workgroup, description, approvalSet);
                        approvals.add(app);
                        addedApprovers.add(workgroup.getName());
                    }
                }
            }
        }
    }

} catch (Exception e) {
    logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}

return approvals;
  </Source>
</Rule>

use the below one

a.setOwner(owner.getName());

This method expect the string object but you are trying to push the identity object.

Regards
Ankush

how can i solve this issus ?

Hi, @Aniso13Cyber,

Are you still seeing the same error?

Workflow.Approval objects are only processed by IdentityIQ when they are returned from an ApprovalAssignment rule. When the same logic runs inside a Workflow rule, IIQ does not honor Workflow.Approval, which results in the runtime errors you’re encountering (including setOwner errors).

I recommend moving the approval-creation logic to an ApprovalAssignment rule, returning the Workflow.Approval objects from there, and then referencing that rule in your workflow.

Hope this helps.

Hi @Aniso13Cyber ,

Use approvalAssignment rule to set multi approvers.

Example:

import java.util.List;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.ApprovalSet;
import sailpoint.object.ApprovalItem;
import sailpoint.object.Custom;
import sailpoint.object.Identity;

log.warn(“Enter into the Approval Assignment Rule******”);
log.warn("Identity name is : " + identityName);

Identity idn = context.getObjectByName(Identity.class,identityName);
String displayName = idn.getDisplayName();
log.warn("Display Name is : "+ displayName);

for(Approval approval : approvals){
log.warn("Approval in list : " + approval.toString());
}

log.warn("Approval set is : "+ approvalSet.toString());

List newApprovals = new ArrayList();
if( Approvals != null) {
newApprovals.addAll(approvals);
}

if(approvalSet != null){

String secondLevelApprover = “xyz“;
Approval secondLevel = new Approval();
secondLevel .setOwner(secondLevelApprover );
secondLevel .setDescription("Identity Approval - Account Changes for User: " + displayName);
newApprovals.add(secondLevel );

log.warn("New approval are : " + newApprovals);

return newApprovals;

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