ReassignStep()
This code sample describes how to create a script that lets workflow participants reassign a step on the Step Detail page.
Function Boolean ReassignStep( \ Object prgCtx, \ Record taskRec, \ Record user, \ Record workData, \ WAPIWORK work ) Assoc userInfo Integer where List cbData Boolean ok = False Object uSession = prgCtx.USession() Object wSession = prgCtx.WSession() String cr = Str.EOL() //Determine whether a manager of a workflow has permission to //reassign the step. if ( $WFMain.WAPIPkg.CheckWFPermissions( prgCtx, workData, \ $WFMain.WFConst.kWFChangeWork ) ) ok = wSession.StartTrans() //If the title of the step was set to the default title, then //update it with the new default title. If the title of the step //was not set to the default title, then don't change it. if ( ok ) userInfo = .GetDisplayInfo( prgCtx, taskRec ) ok = UpdateStepTitle( prgCtx, work, taskRec, userInfo, \ user ) //If the step has been assigned to a group, add a performer //callback script that runs if the workflow loops back during the //reassignment. If the workflow loops back, this callback makes //sure that the step is reassigned to the entire group -- not just to //the group member that originally accepted it. if ( ok ) if ( user.TYPE != UAPI.USER ) cbData = { { $WFMain.WFConst.kCBSetGrpStepPerformer, \ user.ID } } else cbData = Undefined end //Save the callback script in the database. ok = UpdateMapTask( prgCtx, taskRec, cbData ) end //Set the performer ID to the new user ID. if ( ok ) ok = UpdatePerformer( prgCtx, work, taskRec, user ) end if ( !wSession.EndTrans( ok ) ) ok = False end end end return( ok ) end Function Boolean UpdatePerformer( \ Object prgCtx, \ WAPIWORK work, \ Record old, \ Record new ) Boolean success List info //Make the WAPI call that reassigns the step. success = prgCtx.WSession().CheckRetVal( \ WAPI.ReassignTask( \ work, \ old.WORK.SUBWORKTASK_WORKID, \ old.WORK.SUBWORKTASK_SUBWORKID, \ old.WORK.SUBWORKTASK_TASKID, \ new.ID ) ) if ( success ) info = { 1, { Str.String( [WebWork_Message.StepReassignedTo] \ ), new.ID } } $WFMain.WAPIPkg.AddAuditData( prgCtx, work, info ) old.WORK.SUBWORKTASK_PERFORMERID = new.ID end return( success ) end Function Boolean UpdateStepTitle( \ Object prgCtx, \ WAPIWORK work, \ Record step, \ Assoc info, \ Record user ) String name Boolean success = True Object wSession = prgCtx.WSession() //Save the new step title to the database. if ( info.Title == step.WORK._SUBWORKTASK_PERFORMERID_Name ) name = user.NAME success = wSession.CheckRetVal( WAPI.UpdateTaskAttribute( \ work, \ step.WORK.SUBWORKTASK_WORKID, \ step.WORK.SUBWORKTASK_SUBWORKID, \ step.WORK.SUBWORKTASK_TASKID, \ WAPI.SUBWORKTASK_TITLE, \ name ) ) if ( success ) step.WORK.SUBWORKTASK_TITLE = name end end return( success ) end Function Boolean UpdateMapTask( \ Object prgCtx, \ Record taskData, \ List cbData = Undefined ) Boolean success WAPIMAPTASK step Object session = prgCtx.WSession() WAPIMAP map = session.AllocMap() success = session.CheckRetVal( WAPI.LoadMapByID( map, \ taskData.WORKINFO.SUBWORK_MAPID ) ) if ( success ) step = WAPI.AllocNthMapTask( map, \ taskData.WORK.SUBWORKTASK_TASKID ) success = session.CheckRetVal( step ) if ( success ) step.pPerformerCB = cbData WAPI.FreeMapTask( step ) success = session.CheckRetVal( WAPI.ReplaceMap( map ) ) end end WAPI.FreeMap( map ) return( success ) end