Maximo Absence Management*

Maximo Absence Management*
August 12, 2019 Comments Off on Maximo Absence Management* Blogs, Business, Maximo, Solutions Amer Seifeddine

It has been challenging and time consuming to manage workflow assignments when users are on vacation or out of office. In this post, we are demonstrating how end-users and Maximo administrators can effectively manage and automate those assignments.

Depending on your organizational needs, you may need to automate workflow assignments to a colleague within a specific period of time, keep original assignments with you and call back all delegated assignments once you are back in office. If this sounds familiar to you and have similar challenges, this article is for you!
For more posts, please visit www.seifware.com

Background:

Maximo Delegation

Maximo support for delegation: Maximo allows users to specify a workflow delegate to act on their behalf while they are out of the office for a specific period of time (workflow delegate). Currently, it is the main responsibility of the Maximo Administrator to update such details on the person’s record.

“Preserve Original Assignment when Delegating?” is another important flag on the workflow design that allows end-users to keep their original assignments while delegating them.

Limitations of Standard Features: Maximo out of the box does not:

1- Automatically delegate existing workflow assignments.
2- Automatically return unprocessed delegated workflow assignments back to owner.


Maximo Absence Management:

This solution depends on keeping original workflow assignments with the owner while delegating them and on some automation scripts that only run outside maintenance window (admin mode is off) . Since every organization has its unique requirements, the below suggested solution is intended for general use only. Please contact our professional services for guaranteed solutions/support.

  • Prerequisites:
    • Enable workflow delegation on user’s start center: As a first step to automate the delegation, it would be more efficient to move updating delegation details’ responsibility to end-users right from their own start center, personal information . Doing so, end-users will be able to update the delegate and delegation period before leaving the office and clear them right after resuming work. Maximo system administrators can follow the technical section for more information on how to add delegation on user’s start centers.

    • Keep Original Assignments: This solution is based on the concept of keeping original assignments with the owner while delegating them. Review your workflow design and ensure related “Preserve Original Assignment when Delegating?” flag is enabled for selected roles.

  • Automatically delegate existing assignments with notifications: This is a new feature allowing users to automatically receive existing assignments once they are delegated while keeping original assignments with the owner. An escalation is required to copy owner’s assignments to delegates as appropriate.
  • Automatically withdraw unprocessed assignments from delegate: Unprocessed assignments by a delegate are automatically withdrawn once the owner is back in office (when the delegate is cleared or delegation period is expired). An escalation is required to delete delegated and unprocessed assignments.

Technical Details:

This solution requires an outage and is compatible with SaaS environments.

Escalations run the actions that are automatically created by related automation action scripts. Please ensure that escalations are running during the minimum activity time period, preferably once daily at night. 

  • Attributes: Add the following attributes: 
    OBJECT ATTRIBUTENAME TYPE
    WFASSIGNMENT DELEGATEDTO same as PERSON.PERSONID
    DELEGATIONDATE DATE
  • Relationship:
OBJECT CHILD NAME SQL
WFASSIGNMENT WFASSIGNMENT SW_ISDELGASSIGNED wfid=:wfid and assignstatus in (select value from synonymdomain where domainid='WFASGNSTATUS' and maxvalue='ACTIVE') and delegatedto is null
SW_OWNERASSINMT wfid=:wfid and keeporigassgn=1 and delegatedto is not null and assignstatus in (select value from synonymdomain where domainid='WFASGNSTATUS' and maxvalue='ACTIVE')
  • Automation Scripts:
    SCRIPT LAUNCH POINT DETAILS SOURCE

    UPDATEASSIGN

    (Update new Assignments)

    Name: UPDATEASSIGN, Type: Object, Object: WFASSIGNMENT, Event: Save, Save (Add, before Save), Object Event Condition:

    :KEEPORIGASSGN=1 and :ASSIGNEE.PERSONID is not null

    Appendix A

    DELEGATEASSIGN

    (Automatically delegating existing assignments through escalation)

    Name: DELEGATEASSIGN, Type: Action, Object: WFASSIGNMENT Appendix B

    DELGDEL

    (Automatically withdraw delegated assignments through escalation)

    Name: DELGDEL, Type: Action, Object: WFASSIGNMENT  Appendix C
  • Escalations:
    Escalation Action Parameters

    DELEGATEASSIGN

    (Automatically delegating existing assignments)

    DELEGATEASSIGN

    Repeat: Yes, Object: WFASSIGNMENT, Frequency: once a day

    Conditionassignstatus in (select value from synonymdomain where domainid='WFASGNSTATUS' and maxvalue='ACTIVE')
    and keeporigassgn=1
    and delegatedto is null and exists (select 1 from person where personid=assigncode and delegate is not null)

    DELGDEL

    (Automatically withdraw delegated assignments )

    DELGDEL

    Repeat: Yes, Object: WFASSIGNMENT, Frequency: once a day

    Conditionassignstatus in (select value from synonymdomain where domainid='WFASGNSTATUS' and maxvalue='ACTIVE')
    and keeporigassgn=1
    and delegatedto is null
    and exists (
    select 1 from wfassignment as wf2
    where wf2.wfid = wfassignment.wfid
    and wf2.wfassignmentid!=wfassignment.wfassignmentid
    and wf2.assignstatus in (select value from synonymdomain where domainid='WFASGNSTATUS' and maxvalue='ACTIVE')
    and wf2.keeporigassgn=1
    and wf2.delegatedto is not null
    and wf2.delegatedto=wfassignment.assigncode
    and wf2.assigncode!=wfassignment.assigncode
    )

  • XML Files: Add the following code in the library.xml for:
    • dialog id=”profilepersonal”: <sectionrow id="myProfilePersonalInfo_1_row5">
      <sectioncol id="myProfilePersonalInfo_1_row5_col1">
      <section id="myProfilePersonalInfo_1_row5_col1_1" label="Delegation">
      <textbox dataattribute="DELEGATE" id="myProfilePersonalSection_12" lookup="person" />
      <textbox dataattribute="DELEGATEFROMDATE" id="myProfilePersonalSection_13" lookup="datelookup" />
      <textbox dataattribute="DELEGATETODATE" id="myProfilePersonalSection_14" lookup="datelookup" />
      </section>
      </sectioncol>
      </sectionrow>
    • dialog id=”assignwf”: <tablecol dataattribute="delegatedto" id="assignwfcol5"/>
      <tablecol dataattribute="delegationdate" id="assignwfcol6"/>
  • Appendixes:
    • A:
#License: 
#For Maximo end-users: Free of use/re-use/modification/re-distribution when License and Source sections are present on header.
#For Solution providers: Restricted (Please contact us for more information).
#Source:   Seifware Inc. (www.seifware.com).
#Date: August 11th 2019.
#Version: 1.0
#Purpose: Update WF active assignments with delegated person when original assignments are kept with owner.

from psdi.mbo import MboConstants
from psdi.server import MXServer

assignee=mbo.getMboSet("ASSIGNEE").getMbo(0)
lastDelegate = assignee.getLastDelegate(assignee, None)
if not lastDelegate is None and lastDelegate.getLong("personuid") != assignee.getLong("personuid"):
 activeSet = mbo.getInstance().getMboSet("ACTIVEASSIGNMENTS")
 activeAssign = activeSet.moveFirst()
 isDelegateAssigned=0
 while (activeAssign):
  if activeAssign.getMboSet("ASSIGNEE").getMbo(0).getLong("personuid")==lastDelegate.getLong("personuid"):
   isDelegateAssigned=1
   break
  activeAssign = activeSet.moveNext()
 if isDelegateAssigned==0:
  mbo.setValue ("delegatedto",lastDelegate.getString("personid"),MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
  mbo.setValue ("delegationdate",MXServer.getMXServer().getDate(),MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
    • B:
#License: 
#For Maximo end-users: Free of use/re-use/modification/re-distribution when License and Source sections are present on header.
#For Solution providers: Restricted (Please contact us for more information).
#Source: Seifware Inc. (www.seifware.com).
#Date: August 11th 2019.
#Version: 1.0
#Purpose: Copy existing workflow assignments to the delegate.#

#Delegating escalated assignments... Ensure that the delegate has no active assignment for the same wfid

from psdi.mbo import MboConstants
from psdi.mbo import SqlFormat
from psdi.workflow import WFInstance 
from psdi.server import MXServer

assignee=mbo.getMboSet("ASSIGNEE").getMbo(0)
if not assignee is None and mbo.getBoolean("KEEPORIGASSGN") and mbo.isNull("delegatedto"):
 lastDelegate = assignee.getLastDelegate(assignee, None)
 if not lastDelegate is None and lastDelegate.getLong("personuid") != assignee.getLong("personuid"):
  delegateAssignSet=  mbo.getMboSet("SW_ISDELGASSIGNED")
  sqlFormat = SqlFormat("assigncode=:1")
  sqlFormat.setObject(1, "PERSON", "PERSONID", lastDelegate.getString("personid"))
  delegateAssignSet.setUserWhere(sqlFormat.format())
  delegateAssignSet.reset()
  if delegateAssignSet.getMbo(0) is None:
   activeSet =mbo.getInstance().getMboSet("ACTIVEASSIGNMENTS")
   activeSet.setMXTransaction(mbo.getThisMboSet().getMXTransaction())
   mbo.activeAssignment(lastDelegate , activeSet)
   mbo.setValue ("delegatedto",lastDelegate.getString("personid"),MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
   mbo.setValue ("delegationdate",MXServer.getMXServer().getDate(),MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
    • C:
#License: 
#For Maximo end-users: Free of use/re-use/modification/re-distribution when License and Source sections are present on header.
#For Solution providers: Restricted (Please contact us for more information).
#Source:   Seifware Inc. (www.seifware.com).
#Date: August 11th 2019.
#Version: 1.0 
#Purpose: Withdraw WF Assignments that have been delegated in the past from a person who is now returned back to work.

# Identify and withdraw delegated active assignments that have associated assignments kept with owner

from psdi.mbo import MboConstants

origAssignmnt =mbo.getMboSet("SW_OWNERASSINMT").getMbo(0)
if not origAssignmnt is None:
 assignmntOwner=origAssignmnt.getMboSet("ASSIGNEE").getMbo(0)
 if not assignmntOwner is None:
  lastDelegate = assignmntOwner.getLastDelegate(assignmntOwner, None)
  if lastDelegate is None or lastDelegate.getLong("personuid")==assignmntOwner.getLong("personuid"):
   origAssignmnt.setValueNull ("delegatedto",MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
   origAssignmnt.setValueNull ("delegationdate",MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION)
   mbo.delete()

* Licensing may apply


Our approach is to keep things simple and keep you informed of all available options. Contact us for more details!

Tags
About The Author