Approvals : Configuration Examples

This page provides examples of the Default Approval Mappers for specific Integrations which are able to Mirror the Approvals from the External System.
View as Markdown

Pre-requisite

Before leveraging any of these Default Mappers, we need to understand how Approvals are configured. You can follow this guide to learn How to Configure Approvals.

Service Now

The below Mappers can be leveraged based on the Ticket type you are trying to configure for Mirroring, in this integration since they all have the same Attributes in the API response which Moveworks.

INCIDENT / RITM / TASK / KNOWLEDGE

1{
2 "requested_for.user_id": "requested_for.user_id.$TRIM() OR $[\"b@nner_augmenting_data\"].ticket.requested_for.record_id.$TRIM() OR NULL",
3 "requested_for.type": {
4 "COALESCE()": {
5 "items": [
6 {
7 "CONDITIONAL()": {
8 "condition": "val",
9 "context": {
10 "val": "requested_for.user_id"
11 },
12 "on_fail": "NULL",
13 "on_pass": "\"ITSM_USER_ID\""
14 }
15 },
16 "\"RECORD_ID\""
17 ]
18 }
19 },
20 "requester.user_id": "requester.user_id.$TRIM() OR $[\"b@nner_augmenting_data\"].ticket.created_by.record_id.$TRIM() OR NULL",
21 "requester.type": {
22 "COALESCE()": {
23 "items": [
24 {
25 "CONDITIONAL()": {
26 "condition": "val",
27 "context": {
28 "val": "requester.user_id"
29 },
30 "on_fail": "NULL",
31 "on_pass": "\"ITSM_USER_ID\""
32 }
33 },
34 "\"RECORD_ID\""
35 ]
36 }
37 },
38 "short_description": "$[\"b@nner_augmenting_data\"].ticket.short_description",
39 "display_pairs": [
40 {
41 "value": "display_pairs"
42 },
43 {
44 "value": {
45 "MAP()": {
46 "converter": {
47 "CONDITIONAL()": {
48 "condition": "item.display_value != \"false\"",
49 "on_pass": {
50 "key": "item.label",
51 "value": "item.display_value"
52 }
53 }
54 },
55 "items": {
56 "SORT()": {
57 "items": "$[\"b@nner_augmenting_data\"].ticket.ticket_vars",
58 "key": "item.order or 0"
59 }
60 }
61 }
62 }
63 }
64 ]
65}

SERVICE REQUEST

1{
2 "short_description": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].short_description THEN $[\"b@nner_augmenting_data\"].req_table_data[0].short_description.display_value OR \"\" ELSE NULL)))",
3 "display_pairs": [
4 {
5 "value": "display_pairs"
6 },
7 {
8 "value": {
9 "MAP()": {
10 "converter": {
11 "CONDITIONAL()": {
12 "condition": "item.display_value != \"false\"",
13 "on_pass": {
14 "key": "item.label",
15 "value": "item.display_value"
16 }
17 }
18 },
19 "items": {
20 "SORT()": {
21 "items": "$[\"b@nner_augmenting_data\"].ticket.ticket_vars",
22 "key": "item.order or 0"
23 }
24 }
25 }
26 }
27 },
28 {
29 "key": "\"Opened by\"",
30 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].opened_by THEN $[\"b@nner_augmenting_data\"].req_table_data[0].opened_by.display_value OR \"\" ELSE NULL)))"
31 },
32 {
33 "key": "\"Opened\"",
34 "value": "$TIMECONV($TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].opened_at THEN $[\"b@nner_augmenting_data\"].req_table_data[0].opened_at.display_value OR \"\" ELSE NULL))), NULL, \"%b. %d, %Y - %I:%M %p %Z\", NULL, \"UTC\")"
35 },
36 {
37 "key": "\"Request State\"",
38 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].request_state THEN $[\"b@nner_augmenting_data\"].req_table_data[0].request_state.display_value OR \"\" ELSE NULL)))"
39 },
40 {
41 "key": "\"Description\"",
42 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].description THEN $[\"b@nner_augmenting_data\"].req_table_data[0].description.display_value OR \"\" ELSE NULL)))"
43 },
44 {
45 "key": "\"Total Price\"",
46 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].req_table_data[0].price THEN $[\"b@nner_augmenting_data\"].req_table_data[0].price.display_value OR \"\" ELSE NULL)))"
47 },
48 {
49 "key": "\"List of RITMs\"",
50 "value": {
51 "MAP()": {
52 "converter": {
53 "value": [
54 {
55 "key": "\"----\"",
56 "value": "\"----\""
57 },
58 {
59 "key": "item.number.display_value",
60 "value": "$TRIM($TEXT($TRIM(IF item.short_description THEN item.short_description.display_value OR \"\" ELSE NULL)))"
61 },
62 {
63 "key": "\"Item\"",
64 "value": "$TRIM($TEXT($TRIM(IF item.cat_item THEN item.cat_item.display_value OR \"\" ELSE NULL)))"
65 },
66 {
67 "key": "\"Quantity\"",
68 "value": "$TRIM($TEXT($TRIM(IF item.quantity THEN item.quantity.display_value OR \"\" ELSE NULL)))"
69 },
70 {
71 "key": "\"Price\"",
72 "value": "$TRIM($TEXT($TRIM(IF item.price THEN item.price.display_value OR \"\" ELSE NULL)))"
73 }
74 ]
75 },
76 "items": {
77 "SORT()": {
78 "items": "$[\"b@nner_augmenting_data\"].req_item_table_data",
79 "key": "item.number.display_value"
80 }
81 }
82 }
83 }
84 }
85 ]
86}

CHANGE REQUEST

1{
2 "short_description": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].short_description THEN $[\"b@nner_augmenting_data\"].ticket_data[0].short_description.display_value OR \"\" ELSE NULL)))",
3 "display_pairs": [
4 {
5 "value": "display_pairs"
6 },
7 {
8 "key": "\"Priority\"",
9 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].priority THEN $[\"b@nner_augmenting_data\"].ticket_data[0].priority.display_value OR \"\" ELSE NULL)))"
10 },
11 {
12 "key": "\"Change Type\"",
13 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].type THEN $[\"b@nner_augmenting_data\"].ticket_data[0].type.display_value OR \"\" ELSE NULL)))"
14 },
15 {
16 "key": "\"Assignment Group\"",
17 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0][\"assignment_group.name\"] THEN $[\"b@nner_augmenting_data\"].ticket_data[0][\"assignment_group.name\"].display_value OR \"\" ELSE NULL)))"
18 },
19 {
20 "key": "\"Configuration Item\"",
21 "value": "$CONCAT([$[\"b@nner_augmenting_data\"].ticket_data[0].cmdb_ci.display_value, $[\"b@nner_augmenting_data\"].ticket_data[0][\"cmdb_ci.install_status\"].display_value], \" - \", TRUE)"
22 },
23 {
24 "key": "\"Business Justification\"",
25 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].justification THEN $[\"b@nner_augmenting_data\"].ticket_data[0].justification.display_value OR \"\" ELSE NULL)))"
26 },
27 {
28 "key": "\"Change scheduled from\"",
29 "value": "$TIMECONV($TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].start_date THEN $[\"b@nner_augmenting_data\"].ticket_data[0].start_date.display_value OR \"\" ELSE NULL))), NULL, \"%b. %d, %Y - %I:%M %p %Z\", NULL, \"UTC\")"
30 },
31 {
32 "key": "\"Change scheduled until\"",
33 "value": "$TIMECONV($TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].end_date THEN $[\"b@nner_augmenting_data\"].ticket_data[0].end_date.display_value OR \"\" ELSE NULL))), NULL, \"%b. %d, %Y - %I:%M %p %Z\", NULL, \"UTC\")"
34 },
35 {
36 "key": "\"Approver(s) List\"",
37 "value": {
38 "CONDITIONAL()": {
39 "condition": "$LENGTH(items) <= 5",
40 "context": {
41 "items": {
42 "FILTER()": {
43 "items": {
44 "MAP()": {
45 "converter": "item[\"approver.name\"].display_value.$TRIM()",
46 "items": "$[\"b@nner_augmenting_data\"].additional_approvers"
47 }
48 }
49 }
50 }
51 },
52 "on_fail": {
53 "RENDER()": {
54 "args": {
55 "items": "$CONCAT(items[:5], \", \")",
56 "num_extra": "$LENGTH(items) - 5"
57 },
58 "template": "{{ items }} (+{{ num_extra }})"
59 }
60 },
61 "on_pass": "$CONCAT(items, \", \")"
62 }
63 }
64 }
65 ]
66}

HR CASE

1{
2 "short_description": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].short_description THEN $[\"b@nner_augmenting_data\"].ticket_data[0].short_description.display_value OR \"\" ELSE NULL)))",
3 "display_pairs": [
4 {
5 "value": "display_pairs"
6 },
7 {
8 "key": "\"Priority\"",
9 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0].priority THEN $[\"b@nner_augmenting_data\"].ticket_data[0].priority.display_value OR \"\" ELSE NULL)))"
10 },
11 {
12 "key": "\"Assignment Group\"",
13 "value": "$TRIM($TEXT($TRIM(IF $[\"b@nner_augmenting_data\"].ticket_data[0][\"assignment_group.name\"] THEN $[\"b@nner_augmenting_data\"].ticket_data[0][\"assignment_group.name\"].display_value OR \"\" ELSE NULL)))"
14 },
15 {
16 "key": "\"Configuration Item\"",
17 "value": "NULL"
18 }
19 ]
20}

POLICY EXCEPTION

1[
2 {
3 "value": "display_pairs"
4 },
5 {
6 "value": {
7 "CONDITIONAL()": {
8 "condition": "$LENGTH(items) <= 5",
9 "context": {
10 "items": {
11 "FILTER()": {
12 "items": {
13 "MAP()": {
14 "converter": "item[\"approver.name\"].display_value.$TRIM()",
15 "items": "$[\"b@nner_augmenting_data\"].additional_approvers"
16 }
17 }
18 }
19 }
20 },
21 "on_fail": {
22 "RENDER()": {
23 "args": {
24 "items": "$CONCAT(items[:5], \", \")",
25 "num_extra": "$LENGTH(items) - 5"
26 },
27 "template": "{{ items }} (+{{ num_extra }})"
28 }
29 },
30 "on_pass": "$CONCAT(items, \", \")"
31 }
32 }
33 }
34]

Workday

Leave of Absence

1{
2 "display_pairs": [
3 {
4 "value": "display_pairs"
5 },
6 {
7 "key": "\"Person taking leave\"",
8 "value": "$[\"b@nner_augmenting_data\"].workday_absence_management.worker_descriptor"
9 },
10 {
11 "key": "\"Last day of work\"",
12 "value": "$TIMECONV($[\"b@nner_augmenting_data\"].workday_absence_management.last_day_of_work, \"%Y-%m-%d\", \"%b. %d, %Y\")"
13 },
14 {
15 "key": "\"Leave type\"",
16 "value": "($SPLIT($[\"b@nner_augmenting_data\"].workday_absence_management.leave_type, \" > \"))[-1]"
17 },
18 {
19 "key": "\"Time requested\"",
20 "value": {
21 "CONDITIONAL()": {
22 "condition": "start AND end",
23 "context": {
24 "end": "$TIMECONV($[\"b@nner_augmenting_data\"].workday_absence_management.estimated_last_day_of_leave, \"%Y-%m-%d\", \"%A %b. %d, %Y\", NULL, NULL, FALSE)",
25 "start": "$TIMECONV($[\"b@nner_augmenting_data\"].workday_absence_management.first_day_of_leave, \"%Y-%m-%d\", \"%A %b. %d, %Y\", NULL, NULL, FALSE)"
26 },
27 "on_fail": "\"\"",
28 "on_pass": {
29 "RENDER()": {
30 "template": "{{ start }} :arrow_right: {{ end }}"
31 }
32 }
33 }
34 }
35 },
36 {
37 "key": "\"Note\"",
38 "value": "$[\"b@nner_augmenting_data\"].workday_absence_management.latest_leave_comment"
39 }
40 ]
41}

Expense

1{
2 "display_pairs": [
3 {
4 "value": "display_pairs"
5 },
6 {
7 "key": "\"Transaction date\"",
8 "value": "$TIMECONV($[\"b@nner_augmenting_data\"].expense_details.Transaction_Date, \"%Y-%m-%d\", \"%b. %d, %Y\")"
9 },
10 {
11 "key": "\"Total cost\"",
12 "value": "$CURRENCY_FORMAT($DECIMAL($[\"b@nner_augmenting_data\"].expense_details.Transaction_Amount_Signed) * 100, \"USD\")"
13 },
14 {
15 "value": {
16 "CONDITIONAL()": {
17 "condition": "$[\"b@nner_augmenting_data\"].expense_details.Expense_Report_Lines_group",
18 "on_pass": {
19 "FILTER()": {
20 "items": {
21 "FLATTEN()": [
22 {
23 "key": {
24 "RENDER()": {
25 "args": "$LENGTH($[\"b@nner_augmenting_data\"].expense_details.Expense_Report_Lines_group)",
26 "template": "Line items ({{ . }})"
27 }
28 },
29 "value": "\":point_down: ----------\""
30 },
31 {
32 "FLATTEN()": {
33 "MAP()": {
34 "converter": [
35 {
36 "key": {
37 "RENDER()": {
38 "template": ":book: Item {{ loop.index1 }}"
39 }
40 },
41 "value": "item.Transaction_Description OR \" N/A \""
42 },
43 {
44 "CONDITIONAL()": {
45 "condition": "item.Expense_Report_Line_Memo",
46 "on_pass": {
47 "key": "\"Description\"",
48 "value": "item.Expense_Report_Line_Memo"
49 }
50 }
51 },
52 {
53 "key": "\"Cost\"",
54 "value": "$CURRENCY_FORMAT($DECIMAL(item.Transaction_Amount) * 100, \"USD\")"
55 }
56 ],
57 "items": "$[\"b@nner_augmenting_data\"].expense_details.Expense_Report_Lines_group"
58 }
59 }
60 }
61 ]
62 }
63 }
64 }
65 }
66 }
67 }
68 ]
69}

Sailpoint

ACCESS REVIEW

1{
2 "identifier": {
3 "id": "$[\"@id\"]",
4 "domain": "\"IT_DOMAIN\""
5 },
6 "requested_for.user_id": "$[\"@targetId\"]",
7 "requested_for.type": "\"IDM_USER_ID\"",
8 "approver.user_id": "$[\"@WorkItem__owner__id\"]",
9 "approver.type": "\"IDM_USER_ID\"",
10 "status": {
11 "COALESCE()": {
12 "items": [
13 {
14 "LOOKUP()": {
15 "key": "$[\"@summaryStatus\"]",
16 "mapping": {
17 "Challenged": "\"DENIED\"",
18 "Complete": "\"APPROVED\"",
19 "Delegated": "\"NO_ANSWER\"",
20 "Open": "\"PENDING\"",
21 "Returned": "\"NO_ANSWER\"",
22 "WaitingReview": "\"PENDING\""
23 }
24 }
25 },
26 "\"UNKNOWN\""
27 ]
28 }
29 },
30 "created_at": "$TIMECONV($[\"@created\"], \"MILLIS\")",
31 "updated_at": "$TIMECONV($[\"@modified\"].$TRIM() OR $[\"@created\"].$TRIM() OR NULL, \"MILLIS\")",
32 "display_pairs": [
33 {
34 "key": "\"Need action by\"",
35 "value": "$TIMECONV($TIMECONV($[\"@WorkItem__expiration\"], \"MILLIS\"), NULL, \"%b. %d, %Y - %I:%M %p %Z\", NULL, \"UTC\")"
36 },
37 {
38 "key": "\"Type\"",
39 "value": "\"Access Review\""
40 },
41 {
42 "value": {
43 "MAP()": {
44 "converter": {
45 "key": {
46 "RENDER()": {
47 "args": {
48 "loop": "loop",
49 "type": "item[\"@type\"].$REPLACE(\"([a-z])([A-Z])\", \"\\1 \\2\")"
50 },
51 "template": "{{& type }} ({{ loop.index1 }}/{{ loop.length }})"
52 }
53 },
54 "value": {
55 "LOOKUP()": {
56 "default": "item[\"@targetDisplayName\"] OR \"<Unknown>\"",
57 "key": "item[\"@type\"]",
58 "mapping": {
59 "Account": {
60 "RENDER()": {
61 "args": {
62 "account": "item.ExceptionEntitlements.EntitlementSnapshot[\"@displayName\"]",
63 "application": "item[\"@exceptionApplication\"] OR \"<Unknown Application>\""
64 },
65 "template": "Account {{& account }} on {{& application }}"
66 }
67 },
68 "AccountGroupMembership": {
69 "RENDER()": {
70 "args": {
71 "account": "item[\"@targetDisplayName\"] OR \"<Unknown Account>\"",
72 "application": "item[\"@exceptionApplication\"] OR \"<Unknown Application>\""
73 },
74 "template": "Account {{& account }} on {{& application }}"
75 }
76 },
77 "Bundle": "item[\"@bundle\"]",
78 "BusinessRoleProfile": {
79 "CONCAT()": {
80 "items": {
81 "MAP()": {
82 "converter": "item",
83 "items": "item.ApplicationNames"
84 }
85 },
86 "separator": "\", \""
87 }
88 },
89 "DataOwner": {
90 "RENDER()": {
91 "args": {
92 "application": "item[\"@exceptionApplication\"] OR \"<Unknown Application>\"",
93 "target": "item[\"@targetName\"] OR \"<Unknown Account>\""
94 },
95 "template": "Account {{& target }} on {{& application }}"
96 }
97 },
98 "Exception": {
99 "RENDER()": {
100 "args": {
101 "application": "item[\"@exceptionApplication\"] OR \"<Unknown Application>\"",
102 "relationship": "item[\"@exceptionAttributeName\"] OR \"<Unknown Relationship>\"",
103 "value": "item[\"@exceptionAttributeValue\"] OR \"<Unknown>\""
104 },
105 "template": "{{& relationship }} for application {{& application }} ({{& value }})"
106 }
107 },
108 "PolicyViolation": "item[\"@violationSummary\"] OR \"<Unknown Violation>\""
109 }
110 }
111 }
112 },
113 "items": "$[\"CertificationItem/..\"]"
114 }
115 }
116 }
117 ],
118 "short_description": "IF $[\"@type\"] THEN $CONCAT([$[\"@type\"], \" Access Review\"]) ELSE NULL",
119 "domain": "\"IT_DOMAIN\"",
120 "parent_id": "$[\"@certification__id\"]"
121}

REQUEST_ITEM

1{
2 "identifier": {
3 "id": "$[\"@id\"].$TRIM() OR $[\"@workItemId\"].$TRIM() OR NULL",
4 "display_value": "$[\"@name\"]",
5 "domain": "\"IT_DOMAIN\""
6 },
7 "requester.user_id": "$[\"Requester/Reference\"][\"@id\"]",
8 "requester.type": "\"IDM_USER_ID\"",
9 "requested_for.user_id": "$[\"@targetId\"].$TRIM() OR $[\"@targetName\"].$TRIM() OR NULL",
10 "requested_for.type": "\"IDM_USER_ID\"",
11 "approver.user_id": "$[\"Owner/Reference\"][\"@id\"].$TRIM() OR $[\"@owner\"].$TRIM() OR NULL",
12 "approver.type": "\"IDM_USER_ID\"",
13 "status": {
14 "COALESCE()": {
15 "items": [
16 {
17 "LOOKUP()": {
18 "key": "$[\"@state\"]",
19 "mapping": {
20 "Canceled": "\"NO_ANSWER\"",
21 "Expired": "\"NO_ANSWER\"",
22 "Finished": "\"APPROVED\"",
23 "Pending": "\"PENDING\"",
24 "Rejected": "\"DENIED\"",
25 "Returned": "\"NO_ANSWER\""
26 }
27 }
28 },
29 "\"PENDING\""
30 ]
31 }
32 },
33 "created_at": "$TIMECONV($[\"@created\"].$TRIM() OR $[\"@startDate\"].$TRIM() OR NULL, \"MILLIS\")",
34 "updated_at": "$TIMECONV($[\"@modified\"].$TRIM() OR $[\"@endDate\"].$TRIM() OR $[\"@created\"].$TRIM() OR $[\"@startDate\"].$TRIM() OR NULL, \"MILLIS\")",
35 "display_pairs": [
36 {
37 "value": {
38 "MAP()": {
39 "converter": {
40 "key": {
41 "RENDER()": {
42 "template": "Request Item - {{ loop.index1 }}/{{ loop.length }}"
43 }
44 },
45 "value": {
46 "CONCAT()": {
47 "items": [
48 {
49 "CONDITIONAL()": {
50 "condition": "item[\"@\"].operation",
51 "on_pass": {
52 "RENDER()": {
53 "template": "\\n\\tOperation: {{& item.@.operation }}"
54 }
55 }
56 }
57 },
58 {
59 "CONDITIONAL()": {
60 "condition": "item[\"@\"].displayname OR item[\"@\"].name",
61 "on_pass": {
62 "CONDITIONAL()": {
63 "condition": "item[\"@\"].displayname",
64 "on_fail": {
65 "RENDER()": {
66 "template": "Role Type: {{& item.@.name }}"
67 }
68 },
69 "on_pass": {
70 "RENDER()": {
71 "template": "Role Type: {{& item.@.displayname }}"
72 }
73 }
74 }
75 }
76 }
77 },
78 {
79 "CONDITIONAL()": {
80 "condition": "item[\"@\"].displayValue or item[\"@\"].value",
81 "on_pass": {
82 "CONDITIONAL()": {
83 "condition": "item[\"@\"].displayValue",
84 "on_fail": {
85 "RENDER()": {
86 "template": "Role Name: {{& item.@.value }}"
87 }
88 },
89 "on_pass": {
90 "RENDER()": {
91 "template": "Role Name: {{& item.@.displayValue }}"
92 }
93 }
94 }
95 }
96 }
97 },
98 {
99 "CONDITIONAL()": {
100 "condition": "item[\"@\"].application",
101 "on_pass": {
102 "RENDER()": {
103 "template": "Application: {{& item.@.application }}"
104 }
105 }
106 }
107 }
108 ],
109 "separator": "\"\\n\\t\""
110 }
111 }
112 },
113 "items": "$[\"Attributes/Map/entry[@key='approvalSet']/value/ApprovalSet\"] OR ApprovalSet"
114 }
115 }
116 },
117 {
118 "key": "\"Priority\"",
119 "value": "$[\"@level\"]"
120 },
121 {
122 "key": "\"Type\"",
123 "value": "\"Access Request\""
124 }
125 ],
126 "short_description": {
127 "COALESCE()": {
128 "items": [
129 {
130 "RENDER()": {
131 "template": "{{& Description }}"
132 }
133 },
134 "$[\"@request\"]"
135 ]
136 }
137 },
138 "domain": "\"IT_DOMAIN\"",
139 "parent_id": "$[\"@identityRequestId\"]",
140 "metadata": {
141 "record_id": "$[\"@id\"].$TRIM() OR $[\"@workItemId\"].$TRIM() OR NULL"
142 }
143}