{"revision":"c10276e953456835cdbb1f3a60d58ae1980be353","document":{"id":954,"path":"api-reference/server-api-reference/c_ActivityHistoryRecordAPI.md","title":"ActivityHistoryRecord - Global","bundle":null,"doc_type":null,"release":"australia","body":"\n# ActivityHistoryRecord- Global\n\nThe ActivityHistoryRecord API provides methods that facilitate interacting with a WorkflowModelManager object. It is a data object that is a member of the WorkflowModelManager class.\n\nThis API is basically a copy of the data from a glide record on the table Activity History \\[wf\\_history\\]. There are some helper methods defined for this class as well. There are no accessors or mutator to the simple data elements of this class.\n\n**Parent Topic:**[Server API reference](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/australia/api-reference/server-api-reference/api-server.md)\n\n## ActivityHistoryRecord - addArrivedActivityToJoin\\(String Array activityIds\\)\n\nChanges the **arrivedState** of already known ids to **true**.\n\nAs soon as this method changes the **arrivedState** of known ids to **true**, it tests to see if the join is satisfied. if it is, the model walk can continue; if not, it should continue to next appropriate transition. This is called during playback, as expected wf\\_activities flow to the join.\n\n|Name|Type|Description|\n|----|----|-----------|\n|activityIds|String Array|Array of wf\\_activity.sys\\_ids that are headed towards join.|\n\n|Type|Description|\n|----|-----------|\n|void| |\n\n## ActivityHistoryRecord - addJoinFromActivityIds\\(String Array activityIds\\)\n\nSeeds all the expected wf\\_activity sys\\_ids that are expected to pass through this join and sets their arriveState = false.\n\nThis state is flipped to **true** as each expected activity transitions to this instance of the Join. This method is called as part of building the cached model in memory, and is not called during playback.\n\n|Name|Type|Description|\n|----|----|-----------|\n|activityIds|String Array|Array of wf\\_activity.sys\\_ids that are headed towards join.|\n\n|Type|Description|\n|----|-----------|\n|void| |\n\n## ActivityHistoryRecord - addTransition\\(Object InTransition\\)\n\nAs model is cached by \\_getExecutedTransitions\\(\\), this method adds transitions that have gone FROM this activity towards the .to activity.\n\n|Name|Type|Description|\n|----|----|-----------|\n|InTransition|Object|ExecutedTransition Javascript object to add to this activity.|\n\n|Type|Description|\n|----|-----------|\n|void| |\n\n## ActivityHistoryRecord - debugDump\\( \\)\n\nPrints debug information.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|void| |\n\nThe following code example shows how to use this method. It uses the oldest workflow history records of a base instance.\n\n```\n// These are associated with the Change Request - Normal workflow for CHG0000037.\nvar wfhGR = new GlideRecord ('wf_history');\nwfhGR.addQuery('context.id', '41cdb152db252200a6a2b31be0b8f527');\nwfhGR.addQuery('context.table', 'change_request');\nwfhGR.orderBy ('activity_index');\nwfhGR.query();\nwhile (wfhGR.next())  {\n  var script_name = 'AHR';\n  //\n  //  Acquire the execution history of the workflow's activities.\n  //  Do this just once while processing the first activity.\n\n  if(wfhGR.activity_index == 0) {\n    var model = new WorkflowModelManager( wfhGR.context );\n    model.getExecutedHistory();\n  }\n\n//\n// Access a hash of ActivityHistoryRecord javascript objects,\n// hashed by the sys_id of the wf_history record.\n// There will be one ActivityHistoryRecord for each activity.\n\n  var ActivityHistoryRecord = model.getActivityHistoryRecordById(wfhGR.sys_id);\n\n//\n// Use ActivityHistoryRecord methods to display selected values\n\n  gs.log('Log String [' + ActivityHistoryRecord.getLogString() + ']', script_name);\n  gs.log('debugDump START', script_name);\n  ActivityHistoryRecord.debugDump();\n  gs.log('debugDump END', script_name);\n  gs.log('Turnstile?[' + ActivityHistoryRecord.isTurnstile() + ']', script_name);\n  gs.log('Transition Count[' + ActivityHistoryRecord.getTransitionCount() + ']\\n', script_name );\n}\n```\n\nOutput:\n\n```\n[0:00:00.133] Script completed in scope global: script\nScript execution history and recovery available here\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57a  History INDEX:0  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:e233b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Begin  WF Activity DEF ID:c7a5e32c0a0a0b3a002377c24ed8ea76  WF Activity DEF NAME:Begin  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57a\n*** Script:        History INDEX: 0\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 0\n*** Script:       WF Activity ID: e233b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Begin\n*** Script:   WF Activity DEF ID: c7a5e32c0a0a0b3a002377c24ed8ea76\n*** Script: WF Activity DEF NAME: Begin\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57d  History INDEX:1  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:2e33b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Change moves to Assess  WF Activity DEF ID:d93a02ae0a0a0aa30077abad3fdac035  WF Activity DEF NAME:Wait for condition  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57d\n*** Script:        History INDEX: 1\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 1\n*** Script:       WF Activity ID: 2e33b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Change moves to Assess\n*** Script:   WF Activity DEF ID: d93a02ae0a0a0aa30077abad3fdac035\n*** Script: WF Activity DEF NAME: Wait for condition\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:3e28c4b6dba52200a6a2b31be0b8f57e  History INDEX:2  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:6e33b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Requested  WF Activity DEF ID:50a78fa50a6a803f66d064255f7201a5  WF Activity DEF NAME:Approval Action  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 3e28c4b6dba52200a6a2b31be0b8f57e\n*** Script:        History INDEX: 2\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 2\n*** Script:       WF Activity ID: 6e33b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Requested\n*** Script:   WF Activity DEF ID: 50a78fa50a6a803f66d064255f7201a5\n*** Script: WF Activity DEF NAME: Approval Action\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:0d38c4b6dba52200a6a2b31be0b8f5cc  History INDEX:3  History START TIME:1585659881000  History END TIME:1585659891000  WF Activity ID:2a33b949cb020200d71cb9c0c24c9c26  WF Activity NAME:Technical approvals  WF Activity DEF ID:354e911f0a0a029a00e6a0e6ad74206f  WF Activity DEF NAME:Approval - Group  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 0d38c4b6dba52200a6a2b31be0b8f5cc\n*** Script:        History INDEX: 3\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 3\n*** Script:       WF Activity ID: 2a33b949cb020200d71cb9c0c24c9c26\n*** Script:     WF Activity NAME: Technical approvals\n*** Script:   WF Activity DEF ID: 354e911f0a0a029a00e6a0e6ad74206f\n*** Script: WF Activity DEF NAME: Approval - Group\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:c538c4b6dba52200a6a2b31be0b8f5ce  History INDEX:4  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:6233b949cb020200d71cb9c0c24c9c5b  WF Activity NAME:Check if Change is \"On hold\"  WF Activity DEF ID:98f621ca0a0a0b5900f7c291f5e45a0e  WF Activity DEF NAME:If  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: c538c4b6dba52200a6a2b31be0b8f5ce\n*** Script:        History INDEX: 4\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 4\n*** Script:       WF Activity ID: 6233b949cb020200d71cb9c0c24c9c5b\n*** Script:     WF Activity NAME: Check if Change is \"On hold\"\n*** Script:   WF Activity DEF ID: 98f621ca0a0a0b5900f7c291f5e45a0e\n*** Script: WF Activity DEF NAME: If\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:cd3808b6dba52200a6a2b31be0b8f501  History INDEX:5  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:e633b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Move to Authorize  WF Activity DEF ID:1ca8d7cf0a0a0b265e9a000c2c08248c  WF Activity DEF NAME:Set Values  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: cd3808b6dba52200a6a2b31be0b8f501\n*** Script:        History INDEX: 5\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 5\n*** Script:       WF Activity ID: e633b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Move to Authorize\n*** Script:   WF Activity DEF ID: 1ca8d7cf0a0a0b265e9a000c2c08248c\n*** Script: WF Activity DEF NAME: Set Values\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n```\n\n## ActivityHistoryRecord - doesJoinContainActivity\\( \\)\n\nTests the incoming wf\\_activity sys\\_id, presumed to be seeded in this history record. If it is, it is tested to see if it is an activity that would come through this join.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if it is an activity that would come through this join.|\n\n## ActivityHistoryRecord - getLogString\\( \\)\n\nReturns the log string from the history record.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|String|The log string.|\n\nThe following code example shows how to use this method. It uses the oldest workflow history records of a base instance.\n\n```\n// These are associated with the Change Request - Normal workflow for CHG0000037.\nvar wfhGR = new GlideRecord ('wf_history');\nwfhGR.addQuery('context.id', '41cdb152db252200a6a2b31be0b8f527');\nwfhGR.addQuery('context.table', 'change_request');\nwfhGR.orderBy ('activity_index');\nwfhGR.query();\nwhile (wfhGR.next())  {\n  var script_name = 'AHR';\n  //\n  //  Acquire the execution history of the workflow's activities.\n  //  Do this just once while processing the first activity.\n\n  if(wfhGR.activity_index == 0) {\n    var model = new WorkflowModelManager( wfhGR.context );\n    model.getExecutedHistory();\n  }\n\n//\n// Access a hash of ActivityHistoryRecord javascript objects,\n// hashed by the sys_id of the wf_history record.\n// There will be one ActivityHistoryRecord for each activity.\n\n  var ActivityHistoryRecord = model.getActivityHistoryRecordById(wfhGR.sys_id);\n\n//\n// Use ActivityHistoryRecord methods to display selected values\n\n  gs.log('Log String [' + ActivityHistoryRecord.getLogString() + ']', script_name);\n  gs.log('debugDump START', script_name);\n  ActivityHistoryRecord.debugDump();\n  gs.log('debugDump END', script_name);\n  gs.log('Turnstile?[' + ActivityHistoryRecord.isTurnstile() + ']', script_name);\n  gs.log('Transition Count[' + ActivityHistoryRecord.getTransitionCount() + ']\\n', script_name );\n}\n```\n\nOutput:\n\n```\n[0:00:00.133] Script completed in scope global: script\nScript execution history and recovery available here\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57a  History INDEX:0  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:e233b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Begin  WF Activity DEF ID:c7a5e32c0a0a0b3a002377c24ed8ea76  WF Activity DEF NAME:Begin  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57a\n*** Script:        History INDEX: 0\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 0\n*** Script:       WF Activity ID: e233b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Begin\n*** Script:   WF Activity DEF ID: c7a5e32c0a0a0b3a002377c24ed8ea76\n*** Script: WF Activity DEF NAME: Begin\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57d  History INDEX:1  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:2e33b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Change moves to Assess  WF Activity DEF ID:d93a02ae0a0a0aa30077abad3fdac035  WF Activity DEF NAME:Wait for condition  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57d\n*** Script:        History INDEX: 1\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 1\n*** Script:       WF Activity ID: 2e33b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Change moves to Assess\n*** Script:   WF Activity DEF ID: d93a02ae0a0a0aa30077abad3fdac035\n*** Script: WF Activity DEF NAME: Wait for condition\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:3e28c4b6dba52200a6a2b31be0b8f57e  History INDEX:2  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:6e33b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Requested  WF Activity DEF ID:50a78fa50a6a803f66d064255f7201a5  WF Activity DEF NAME:Approval Action  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 3e28c4b6dba52200a6a2b31be0b8f57e\n*** Script:        History INDEX: 2\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 2\n*** Script:       WF Activity ID: 6e33b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Requested\n*** Script:   WF Activity DEF ID: 50a78fa50a6a803f66d064255f7201a5\n*** Script: WF Activity DEF NAME: Approval Action\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:0d38c4b6dba52200a6a2b31be0b8f5cc  History INDEX:3  History START TIME:1585659881000  History END TIME:1585659891000  WF Activity ID:2a33b949cb020200d71cb9c0c24c9c26  WF Activity NAME:Technical approvals  WF Activity DEF ID:354e911f0a0a029a00e6a0e6ad74206f  WF Activity DEF NAME:Approval - Group  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 0d38c4b6dba52200a6a2b31be0b8f5cc\n*** Script:        History INDEX: 3\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 3\n*** Script:       WF Activity ID: 2a33b949cb020200d71cb9c0c24c9c26\n*** Script:     WF Activity NAME: Technical approvals\n*** Script:   WF Activity DEF ID: 354e911f0a0a029a00e6a0e6ad74206f\n*** Script: WF Activity DEF NAME: Approval - Group\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:c538c4b6dba52200a6a2b31be0b8f5ce  History INDEX:4  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:6233b949cb020200d71cb9c0c24c9c5b  WF Activity NAME:Check if Change is \"On hold\"  WF Activity DEF ID:98f621ca0a0a0b5900f7c291f5e45a0e  WF Activity DEF NAME:If  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: c538c4b6dba52200a6a2b31be0b8f5ce\n*** Script:        History INDEX: 4\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 4\n*** Script:       WF Activity ID: 6233b949cb020200d71cb9c0c24c9c5b\n*** Script:     WF Activity NAME: Check if Change is \"On hold\"\n*** Script:   WF Activity DEF ID: 98f621ca0a0a0b5900f7c291f5e45a0e\n*** Script: WF Activity DEF NAME: If\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:cd3808b6dba52200a6a2b31be0b8f501  History INDEX:5  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:e633b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Move to Authorize  WF Activity DEF ID:1ca8d7cf0a0a0b265e9a000c2c08248c  WF Activity DEF NAME:Set Values  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: cd3808b6dba52200a6a2b31be0b8f501\n*** Script:        History INDEX: 5\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 5\n*** Script:       WF Activity ID: e633b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Move to Authorize\n*** Script:   WF Activity DEF ID: 1ca8d7cf0a0a0b265e9a000c2c08248c\n*** Script: WF Activity DEF NAME: Set Values\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n```\n\n## ActivityHistoryRecord - getSatisfiedJoinActivities\\( \\)\n\nReturns the sys\\_ids of the history records that transition to this Join activity that have already come through.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|String Array|Array of sys\\_ids of the history records that transition to this Join activity.|\n\n## ActivityHistoryRecord - getTransitionCount\\( \\)\n\nReturns the transition count for this activity.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|Number|Number of transitions from this activity.|\n\nThe following code example shows how to use this method. It uses the oldest workflow history records of a base instance.\n\n```\n// These are associated with the Change Request - Normal workflow for CHG0000037.\nvar wfhGR = new GlideRecord ('wf_history');\nwfhGR.addQuery('context.id', '41cdb152db252200a6a2b31be0b8f527');\nwfhGR.addQuery('context.table', 'change_request');\nwfhGR.orderBy ('activity_index');\nwfhGR.query();\nwhile (wfhGR.next())  {\n  var script_name = 'AHR';\n  //\n  //  Acquire the execution history of the workflow's activities.\n  //  Do this just once while processing the first activity.\n\n  if(wfhGR.activity_index == 0) {\n    var model = new WorkflowModelManager( wfhGR.context );\n    model.getExecutedHistory();\n  }\n\n//\n// Access a hash of ActivityHistoryRecord javascript objects,\n// hashed by the sys_id of the wf_history record.\n// There will be one ActivityHistoryRecord for each activity.\n\n  var ActivityHistoryRecord = model.getActivityHistoryRecordById(wfhGR.sys_id);\n\n//\n// Use ActivityHistoryRecord methods to display selected values\n\n  gs.log('Log String [' + ActivityHistoryRecord.getLogString() + ']', script_name);\n  gs.log('debugDump START', script_name);\n  ActivityHistoryRecord.debugDump();\n  gs.log('debugDump END', script_name);\n  gs.log('Turnstile?[' + ActivityHistoryRecord.isTurnstile() + ']', script_name);\n  gs.log('Transition Count[' + ActivityHistoryRecord.getTransitionCount() + ']\\n', script_name );\n}\n```\n\nOutput:\n\n```\n[0:00:00.133] Script completed in scope global: script\nScript execution history and recovery available here\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57a  History INDEX:0  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:e233b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Begin  WF Activity DEF ID:c7a5e32c0a0a0b3a002377c24ed8ea76  WF Activity DEF NAME:Begin  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57a\n*** Script:        History INDEX: 0\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 0\n*** Script:       WF Activity ID: e233b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Begin\n*** Script:   WF Activity DEF ID: c7a5e32c0a0a0b3a002377c24ed8ea76\n*** Script: WF Activity DEF NAME: Begin\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:a228c4b6dba52200a6a2b31be0b8f57d  History INDEX:1  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:2e33b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Change moves to Assess  WF Activity DEF ID:d93a02ae0a0a0aa30077abad3fdac035  WF Activity DEF NAME:Wait for condition  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: a228c4b6dba52200a6a2b31be0b8f57d\n*** Script:        History INDEX: 1\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 1\n*** Script:       WF Activity ID: 2e33b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Change moves to Assess\n*** Script:   WF Activity DEF ID: d93a02ae0a0a0aa30077abad3fdac035\n*** Script: WF Activity DEF NAME: Wait for condition\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:3e28c4b6dba52200a6a2b31be0b8f57e  History INDEX:2  History START TIME:1585659881000  History END TIME:1585659881000  WF Activity ID:6e33b949cb020200d71cb9c0c24c9c1f  WF Activity NAME:Requested  WF Activity DEF ID:50a78fa50a6a803f66d064255f7201a5  WF Activity DEF NAME:Approval Action  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 3e28c4b6dba52200a6a2b31be0b8f57e\n*** Script:        History INDEX: 2\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659881000\n*** Script:        History INDEX: 2\n*** Script:       WF Activity ID: 6e33b949cb020200d71cb9c0c24c9c1f\n*** Script:     WF Activity NAME: Requested\n*** Script:   WF Activity DEF ID: 50a78fa50a6a803f66d064255f7201a5\n*** Script: WF Activity DEF NAME: Approval Action\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:0d38c4b6dba52200a6a2b31be0b8f5cc  History INDEX:3  History START TIME:1585659881000  History END TIME:1585659891000  WF Activity ID:2a33b949cb020200d71cb9c0c24c9c26  WF Activity NAME:Technical approvals  WF Activity DEF ID:354e911f0a0a029a00e6a0e6ad74206f  WF Activity DEF NAME:Approval - Group  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: 0d38c4b6dba52200a6a2b31be0b8f5cc\n*** Script:        History INDEX: 3\n*** Script:   History START TIME: 1585659881000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 3\n*** Script:       WF Activity ID: 2a33b949cb020200d71cb9c0c24c9c26\n*** Script:     WF Activity NAME: Technical approvals\n*** Script:   WF Activity DEF ID: 354e911f0a0a029a00e6a0e6ad74206f\n*** Script: WF Activity DEF NAME: Approval - Group\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:c538c4b6dba52200a6a2b31be0b8f5ce  History INDEX:4  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:6233b949cb020200d71cb9c0c24c9c5b  WF Activity NAME:Check if Change is \"On hold\"  WF Activity DEF ID:98f621ca0a0a0b5900f7c291f5e45a0e  WF Activity DEF NAME:If  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: c538c4b6dba52200a6a2b31be0b8f5ce\n*** Script:        History INDEX: 4\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 4\n*** Script:       WF Activity ID: 6233b949cb020200d71cb9c0c24c9c5b\n*** Script:     WF Activity NAME: Check if Change is \"On hold\"\n*** Script:   WF Activity DEF ID: 98f621ca0a0a0b5900f7c291f5e45a0e\n*** Script: WF Activity DEF NAME: If\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n\nAHR: Log String [HISTORY RECORD:  History ID:cd3808b6dba52200a6a2b31be0b8f501  History INDEX:5  History START TIME:1585659891000  History END TIME:1585659891000  WF Activity ID:e633b949cb020200d71cb9c0c24c9c20  WF Activity NAME:Move to Authorize  WF Activity DEF ID:1ca8d7cf0a0a0b265e9a000c2c08248c  WF Activity DEF NAME:Set Values  Transition Count: 1  Is Turnstile (loop) : false  Is Join: false]\nAHR: debugDump START\n*** Script: \n*** Script: WF HISTORY RECORD:\n*** Script:           History ID: cd3808b6dba52200a6a2b31be0b8f501\n*** Script:        History INDEX: 5\n*** Script:   History START TIME: 1585659891000\n*** Script:     History END TIME: 1585659891000\n*** Script:        History INDEX: 5\n*** Script:       WF Activity ID: e633b949cb020200d71cb9c0c24c9c20\n*** Script:     WF Activity NAME: Move to Authorize\n*** Script:   WF Activity DEF ID: 1ca8d7cf0a0a0b265e9a000c2c08248c\n*** Script: WF Activity DEF NAME: Set Values\n*** Script:     Transition Count: 1\n*** Script: Roll Back Originator: \n*** Script:  Is Turnstile (loop): false\n*** Script:              Is Join: false\nAHR: debugDump END\nAHR: Turnstile? [false]\nAHR: Transition Count [1]\n\n```\n\n## ActivityHistoryRecord - getUnSatisfiedJoinActivities\\( \\)\n\nReturns the sys\\_ids of the history records that transition to this Join activity that the join is still waiting for.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|String Array|Array of sys\\_ids of the history records that transition to this Join activity.|\n\n## ActivityHistoryRecord - isARollback\\( \\)\n\nDetermines if this activity is one of the rollback activities.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n<table id=\"table_osx_ttx_rt\" class=\"returns\"><thead><tr><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead><tbody><tr><td>\n\nBoolean\n\n</td><td>\n\nFlag that indicates whether the activity is one of the rollback activities.\n\n Valid values:\n\n-   true: Activity is a rollback.\n-   false: Activity is not a rollback.\n\n</td></tr></tbody>\n</table>## ActivityHistoryRecord - isIdADestination\\(String ahrSys\\_id\\)\n\nDetermines if the sys\\_id passed in is a destination of any of the transitions associated with this instance of an ActivityHistoryRecord.\n\n|Name|Type|Description|\n|----|----|-----------|\n|ahrSys\\_id|String|Activity history sys\\_id from table wf\\_history.|\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if the sys\\_id passed in is a destination of any of the transitions.|\n\n## ActivityHistoryRecord - isJoin\\( \\)\n\nDetermines if this activity is a join.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if the activity is \"Join\".|\n\n## ActivityHistoryRecord - isJoinSatisfied\\( \\)\n\nExamines the value of the arriveState.\n\nCalled during playback when the transition to sys\\_id of a transition points to an activity that is a join.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if the join is satisfied.|\n\n## ActivityHistoryRecord - isJoinWaitingForActivity\\(String Array activityIds\\)\n\nTests the incoming wf\\_activity sys\\_id, presumed to be seeded in this history record.\n\nIf it is, it is tested to see if it has already been through; if it has, then this join is not waiting on this activity and it should look further downstream for the one that is waiting. This test is called in sequence as the model is walked, so it does presume in the instances of rollbacks and loops. If the sys\\_id is in here and the flag is **true**, this waiting Join is further up the sequence. This sort of check is required as the history records of Joins are removed from the history table, and so it is possible for a record to be in the transition table with no match in the corresponding history table, but is still an appropriate match for an earlier executed instance of the same Join.\n\n|Name|Type|Description|\n|----|----|-----------|\n|activityIds|String Array|Array of wf\\_activity.sys\\_ids that are headed towards join.|\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if the activity has already been through.|\n\n## ActivityHistoryRecord - isRolledBack\\( \\)\n\nDetermines if this workflow was rolled back.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n|Type|Description|\n|----|-----------|\n|Boolean|True, if this workflow was rolled back.|\n\n## ActivityHistoryRecord - isTurnstile\\( \\)\n\nDetermines if the current activity is a turnstile.\n\n|Name|Type|Description|\n|----|----|-----------|\n|None| | |\n\n<table id=\"table_msx_ttx_rt\" class=\"returns\"><thead><tr><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead><tbody><tr><td>\n\nBoolean\n\n</td><td>\n\nFlag that indicates whether the activity is a [turnstile](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/build-workflows/r_TurnstileActivity.md).\n\n Valid values:\n\n-   true: Activity is a turnstile.\n-   false: Activity is not a turnstile.\n\n</td></tr></tbody>\n</table>The following code example shows how to use this method to detect a turnstile. It is based on the workflow found in [Rollback To workflow activity](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/build-workflows/r_RollbackTo.md). You can confirm the output of this script by examining the **Workflow Activity History** tab when you **Show Workflow** on the requested items \\(RITM\\) form.\n\n```\nvar wfhGR = new GlideRecord ('wf_history');\nwfhGR.addQuery ('context.id','cc45480d2f9b8110b99eb2e72799b6f9'); // sys_id of the RITM\nwfhGR.addQuery ('context.table','sc_req_item'); // Table for the RITM\nwfhGR.orderBy  ('activity_index');\nwfhGR.query();\nvar turnstile_count = 0;\nwhile (wfhGR.next())  {\n  var script_name = 'AHR';\n  //\n  // Acquire the execution history of the workflow's activities.\n  // Do this just once while processing the first activity.\n\n  if(wfhGR.activity_index == 0) {\n    var model = new WorkflowModelManager(wfhGR.context);\n    model.getExecutedHistory();\n  }\n\n  //\n  // Access a hash of ActivityHistoryRecord javascript objects,\n  // hashed by the sys_id of the wf_history record.\n  // There will be one ActivityHistoryRecord for each activity.\n\n  var ActivityHistoryRecord = model.getActivityHistoryRecordById(wfhGR.sys_id);\n\n  //\n  // Use ActivityHistoryRecord methods to display turnstile activities.\n\n  if(ActivityHistoryRecord.isTurnstile()) {\n    var log_string = ActivityHistoryRecord.getLogString();\n    var name_start = log_string.indexOf('WF Activity NAME:');\n    var name_end = log_string.indexOf('WF Activity DEF ID:');\n    var name = log_string.substring(name_start, name_end).trim();\n    gs.log(name + ' Activity ' + wfhGR.activity_index + ' is a turnstile.', script_name);\n    turnstile_count++;\n  } \n} \ngs.log ('Turnstile activities detected: ' + turnstile_count, script_name);\n```\n\nOutput:\n\n```\nAHR: WF Activity NAME:Prevent infinite loops Activity 8 is a turnstile.\nAHR: WF Activity NAME:Prevent infinite loops Activity 13 is a turnstile.\nAHR: WF Activity NAME:Prevent infinite loops Activity 18 is a turnstile.\nAHR: WF Activity NAME:Prevent infinite loops Activity 23 is a turnstile.\nAHR: Turnstile activities detected: 4\n```\n\n"}}