Xurrent Help Center
Welcome to Xurrent Help. This is your online reference that describes the functionality offered by the Xurrent service. To get started, select a topic that you want to know more about from the navigation pane on the left.
There are many operators that can be used to define expressions for an automation rule. Below these operators are grouped by type and for each operator an example is provided.
Boolean Operators
- a or b
- a and b
Expression Example
Result
a or b (e.g. a is true, b is either true or false)
true
a or b (e.g. b is true, a is either true or false)
true
a or b (e.g. a is false, and b is false)
false
a and b (e.g. a is true, and b is true)
true
a and b (e.g. a is false and/or b is false)
false
Comparison – Equality
- value-a = value-b
- value-a != value-b
Expression Example Result 'text' = 'text'
true
'text' != 'text'
false
'' = 'text'
false
'text' = ""
false
'' = ""
true
"a\"b" = 'a"b'
true
'a\'b' = "a'b"
true
status = in_progress
true
status = assigned
false
team = 'Database Administration'
true
team = 9
false
team.id = 9
true
team.id = 12
false
Comparison – Less than, Greater than
- value-a < value-b
- value-a <= value-b
- value-a > value-b
- value-a >= value-b
Expression Example
Result
‘a’ < ‘a’
false
‘a’ <= ‘a’
true
‘a’ > ‘a’
false
‘a’ >= ‘a’
true
‘a’ < ‘b’
true
‘b’ > ‘a’
true
‘a’ > ‘b’
false
‘’ < ’text’
true
‘text’ > ’’
true
status < completed
true
status < registered
false
completed < status
false
registered < status
true
team < ‘Application Development’
false
team < ‘Service Desk’
true
‘Application Development’ < team
true
‘Service Desk’ < team
false
team.id < 100
true
team.id < 1
false
100 < team.id
false
1 < team.id
true
Comparison – Contains
- value in array
- value not_in array
Expression Example
Result
a in [a,b]
true
a not_in [a,b]
false
b in [a,b]
true
c in [a,b]
false
ab in [a,b]
false
ab in []
false
’’ in []
true
’’ in [a,b]
false
’’ in [a,,b]
true
a in [ a , b ]
true
status in [in_progress]
true
status in [assigned, accepted, in_progress, waiting_for_customer]
true
status in [assigned,completed]
false
team in [Application Development,Database Administration,Service Desk]
true
team in [Application Development,Service Desk]
false
team.id in [8,9,10]
true
team.id in [11,12,13]
false
11.0 in [11,12,13]
true
11 in [11.0,12.0,13.0]
true
team.id in [8.0,9.0,10.0]
true
team.id in [8.1,9.1,10.1]
false
Comparison – Similar to
- * is the ‘contains’ operator
- ^ is the ‘starts_with’ operator
- $ is the ‘ends_with’ operator
Expression Example
Result
‘john.smith@widget.com’ *= ‘smith’
true
‘john.smith@widget.com’ ^= ‘smith’
false
‘john.smith@widget.com’ *= ‘john’
true
‘john.smith@widget.com’ ^= ‘john’
true
‘john.smith@widget.com’ $= ‘john’
false
‘john.smith@widget.com’ $= ‘widget’
false
‘john.smith@widget.com’ $= ‘widget.com’
true
Comparison – Presence
- value is_blank
- value is_present
Expression Example
Result
team.name is_blank
false (as the team name is required as must contain a value)
request.custom_fields.my_date is_present
true, when the UI extension field “my_date” is defined and contains a non-empty value, false otherwise
Formulas
- + is the ‘add’ or ‘concatenate’ operator
- - is the ‘subtract’ operator
- * is the ‘multiply’ operator
- / is the ‘divide’ operator
- % is the ‘modulo’ operator
Note that + acts as the ‘concatenate’ operator when the value to its left is a text string. Otherwise, it acts as the ‘add’ operator.
Expression Example
Result
1 + 1
2.0
2 – 1
1.0
2 * 5
10.0
6 / 3
2.0
15 % 6
3.0
1 1 1 + 1
4.0
1 + 2 * 6 % 4
5.0
‘start’ + ‘_at’ + ’ field’
start_at field
1 + team.name
1.0
1 + team.id
8.0
2.0 + team
9.0
team + 3.0
10.0
created_at + 3.days
3 days after the creation date
team.id + ’ – ’ + team.name
7.0
’’ + team.id + ’ – ’ + team.name
7 – Service Desk
‘{{team_id}} – {{team_name}}’
7 – Service Desk
created_at – 4.hours
4 hours before the creation date
5 / 5
1.0
5 / 0
nil
Path for Retrieving a Variable
An expression that retrieves a variable always starts from the record for which the automation rule is defined.
Expression Example
Result
status
approved
workflow.status
progress_halted
created_at
2017-09-12T14:00:00Z
planned_duration
8
workflow.tasks[first]
1st task of the workflow
workflow.tasks[1]
1st task of the workflow
workflow.tasks[last]
last task of the workflow
workflow.tasks[-1]
last task of the workflow
workflow.tasks[#20122]
task with ID 20122 of the workflow
workflow.tasks[1].custom_fields.name
the value of the UI extension field with ID ‘name’ from the workflow’s task
workflow.tasks[1].custom_fields.你好,世界
the value of the UI extension field with ID ‘你好,世界’ from the workflow’s task
workflow.tasks[#20122].subject
Change controller approval
workflow.tasks[“Change controller approval”].id
20122.0
workflow.tasks[‘Change controller approval’]
20122.0
workflow.tasks[first].notes[first].text
the text from the first note of the first task of the workflow
workflow.tasks[first].notes[first].person.name
the name of the person who added the first note of the first task of the workflow
Path for Retrieving a Collection
An expression that retrieves a collection always starts from the record for which the automation rule is defined, or makes use of the `find_all` operation.
Expression Example
Result
cis
All cis related to the current task
workflow.requests[first].cis
All cis related to the first request of the workflow
cis.size
The number of CIs related to the current task
cis.count
The number of CIs related to the current task
workflow.tasks.select(status = registered)
The workflow’s tasks that have the registered status
workflow.tasks.reject(status = registered)
The workflow’s tasks that do not have the registered status
workflow.tasks.select(status = failed) + workflow.tasks.select(status = rejected)
The workflow’s tasks that have the failed status combined with the workflow’s tasks that have the rejected status
cis.empty?
true
if there are no CIs linked to the current task, false
otherwise
cis.any?
true
if there is at least one CIs linked to the current task, false
otherwise
cis.any?(status = in_production)
true
if there are any CIs linked to the current task with an in_production status, false
otherwise. Returns false
when there are no CIs linked to the task.
cis.all?(status = in_production)
true
if all CIs linked to the current task have an in_production status, false
otherwise. Returns true
when there are no CIs linked to the task.
cis.none?(status = in_production)
true
if there are no CIs linked to the current task with an in_production status, false
otherwise. Returns true
when there are no CIs linked to the task.
workflow.tasks.select(category = approval).reject(finished_at != nil)
All approval tasks linked to the workflow that are not yet completed.
workflow.tasks.select(category = implementation).map(member)
All members of implementation tasks linked to the workflow.
person.permissions.detect(account = ‘wdc’).workflow_manager
Is the person a workflow manager in the widget data center account?
Retrieving unrelated records
The following lookup functions are available to retrieve records that are unrelated to the record for which the automation rule is defined.
Expression Example
Result
find(person, ‘beatrice.baldwin@widget.com’)
Beatrice Baldwin
find(person, ‘beatrice.baldwin@widget.com’).job_title
The job title of Beatrice Baldwin
find(person, workflow.requests[first].custom_fields.email)
A person record based on the email address provided in the email field of the UI Extension of the first request related to the workflow
find(service_instance, 2334)
The service instance with id 2334
find(service_instance, ‘Chicago Network’)
The Chicago Network service instance
find(ci, predecessors[first].custom_fields.ci_id)
Find the CI based on the ci_id that was chosen in a UI Extension of the predecessor task
find(ci, ‘unknown’)
nil
find_all(person, ‘Beatrice Baldwin’)
An array of all people with the name Beatrice Baldwin
find_all(ci, custom_fields.impacted_assets)
An array of all CIs chosen in a multi-suggest UI Extension field
search(ci, ‘ SPARCS ’).detect(status = in_production)
The first record of an array of all CIs that are in production, from a list of at most 50 cis that are retrieved using global search with keyword ’SPARCS".
String Manipulation
Expression Example
Result
’ hello’.lstrip
‘hello’
Removes leading whitespace.
’hello ’.rstrip
‘hello’
Removes trailing whitespace.
‘hello’.start_with?(‘hell’)
true
True if string starts with one of the suffixes given.
‘hello’.end_with?(‘lo’)
true
True if string ends with one of the suffixes given.
‘table’.match?(‘bl’)
true
True if pattern is matched in string.
s=‘foo’, s.include?(‘f’)
true
True if self contains other string.
s=‘foo’, s.exclude?(‘t’)
true
True if self does not contain other string.
‘hello’.ljust(10)
’hello ’
If integer is greater than length of string, returns padded string, left justified.
‘hello’.rjust(10, ‘oh’)
‘ohohohello’
If integer is greater than length of string, returns padded string, right justified.
subject.size
28
Number of characters.
subject.length
28
Number of characters.
’ spacey string ’.strip
‘spacey string’
Remove leading and trailing white spaces.
’ spacey string ’.squish
‘spacey string’
Replace multiple spaces with a single space and removes leading and trailing white spaces.
’ spaceeeey ssstring ’.squeeze
’ spacey string ’
Replace runs of the same character by a single character.
‘desserts’.reverse
‘stressed’
Flip the characters around.
‘ SERVICE management’.capitalize
‘Service management’
Downcases the whole string and then capitalizes the first character only.
‘ SERVICE management’.titleize
‘Service Management’
All characters are downcased and the first a-z characters after each word boundary are capitalized.
‘Xurrent’.upcase
‘ XURRENT ’
All capitals.
‘ XURRENT ’.downcase
‘xurrent’
All lower case.
‘hI tHERE’.swapcase
‘Hi There’
Lower case to capitals and vice versa.
’ ’.empty?
true
True when string is empty or only contains white spaces.
’ ’.blank?
true
True when string is empty or only contains white spaces.
’ ’.present?
false
True if string contains characters other than white spaces.
‘break-me-up’.split(‘-’)
[‘break’, ‘me’, ‘up’]
Split the string into an array of strings on the separator.
‘break-me-up’.split(/[eau]+/)
[‘br’, ‘k-m’, ‘-’, ‘p’]
Split the string into an array of strings on a regular expression separator.
‘break-me-up’.slice(3)
‘eak-me-up’
Take the string from the given index and onwards.
‘break-me-up’.slice(-5)
‘me-up’
Take the string from the given index and onwards.
‘break-me-up’.slice(3,2)
‘ea’
Take a fixed amount of characters from the given index.
‘break-me-up’.replace(‘-’, ’ ’)
‘break me up’
Replace all occurrences with another string.
‘break-me-up’.replace(/[eau]+/, ‘*’)
‘br*k-m*-*p’
Replace all occurrences of the regular expression with another string.
‘break-me-up’.replace(/([eau]+)/, ‘*\1*’)
‘br*ea*k-m*e*-*u*p’
Replace all occurrences of the regular expression with another string using capture groups.
[‘break’,‘me’,‘up’].join(’ and ’)
‘break and me and up’
Concatenate the elements in an array with the provided separator.
‘10.428571428571429’.to_number
10.428571428571429
Convert the string to a number.
Number Manipulation
Expression Example
Result
10.428571428571429.to_string
‘10.428571428571429’
Convert the number to a string.
10.428571428571429.round
10
Round to a whole number.
10.428571428571429.round(2)
10.43
Round to the given number of decimals.
Date & Time Manipulation
Expression Example
Result
now
>1.seconds.ago
<1.seconds.from_now
today
>1.day.ago
<1.day.from_now
1.second.ago
>2.seconds.ago
<0.seconds.from_now
2.seconds.ago
>3.seconds.ago
<1.second.ago
1.minute.ago
>61.seconds.ago
<59.seconds.ago
2.minutes.ago
>121.seconds.ago
<119.seconds.ago
1.hour.ago
>61.minutes.ago
<59.minutes.ago
2.hours.ago
>121.minutes.ago
<119.minutes.ago
1.day.ago
>25.hours.ago
<23.hours.ago
2.days.ago
>49.hours.ago
<47.hours.ago
1.week.ago
>8.days.ago
<6.days.ago
2.weeks.ago
>15.days.ago
<13.days.ago
1.month.ago
>32.days.ago
<27.days.ago
2.months.ago
>63.days.ago
<56.days.ago
1.year.ago
>366.days.ago
<364.days.ago
2.years.ago
>732.days.ago
<729.days.ago
1.second.from_now
>0.seconds.from_now
<2.seconds.from_now
2.seconds.from_now
>1.seconds.from_now
<3.second.from_now
1.minute.from_now
>59.seconds.from_now
<61.seconds.from_now
2.minutes.from_now
>119.seconds.from_now
<121.seconds.from_now
1.hour.from_now
>59.minutes.from_now
<61.minutes.from_now
2.hours.from_now
>119.minutes.from_now
<121.minutes.from_now
1.day.from_now
>23.hours.from_now
<25.hours.from_now
2.days.from_now
>47.hours.from_now
<49.hours.from_now
1.week.from_now
>6.days.from_now
<8.days.from_now
2.weeks.from_now
>13.days.from_now
<15.days.from_now
1.month.from_now
>27.days.from_now
<32.days.from_now
2.months.from_now
>56.days.from_now
<63.days.from_now
1.year.from_now
>364.days.from_now
<366.days.from_now
2.years.from_now
>729.days.from_now
<732.days.from_now
planned_duration.hours.from_now
>79.hours.from_now
<81.hours.from_now
now.year
Year, e.g. 2019
now.month
Month of year, e.g. 3 (March)
now.day
Day of month, e.g. 21
now.hour
Hour of day, e.g. 19
now.minute
Minute of hour, e.g. 45
now.second
Second of minute, e.g. 12
now.day_of_year
Day of year, e.g. 80
now.day_of_week
Day of week, e.g. 4 (Thursday)
now.is_monday
Day is a Monday, e.g. false
now.is_tuesday
Day is a Tuesday, e.g. false
now.is_wednesday
Day is a Wednesday, e.g. false
now.is_thursday
Day is a Thursday, e.g. true
now.is_friday
Day is a Friday, e.g. false
now.is_saturday
Day is a Saturday, e.g. false
now.is_sunday
Day is a Sunday, e.g. false
now.utc
Same date time in UTC timezone
custom_fields.my_date_time.to_date_time
Convert string value of date time captured in a custom fields to a date time
now.in_time_zone(person.time_zone)
Same date time in timezone of person
now.in_time_zone(rule_account.time_zone)
Same date time in timezone of account in which the rule is created
now.in_time_zone(‘Amsterdam’)
Same date time in given timezone
now.iso8601
Same date time in iso8601 format
template.support_hours.duration(created_at, now)
The number of minutes between the creation time and the current time that fall within the support hours of a request template
template.support_hours.target_at(now, 8.hours, ‘Amsterdam’)
A target time using the support hours of a request template, a start time and a duration, for the Amsterdam time zone
Predefined Values
Expression Example
Result
updated_by
The person who triggered the execution of the automation rule by updating the record to which the automation rule belongs.
rule_account
The account in which the automation rule is defined.
related_note
The note created at the moment the automation rule was triggered. If no note was created the value is empty. When the “On note added” trigger is used, this value is always present given the automation user has permissions to read the note.
related_internal_note
The internal note created at the moment the automation rule was triggered. If no note was created the value is empty.
true
true
false
false
empty
nil
nil
nil
null
nil
Ternary Statements
Expression
Result
true then ‘yes’ else ‘no’
‘yes’
!true then ‘yes’ else ‘no’
‘no’
is_assigned then teamA.id else teamB.id
teamA.id if is_assigned is true
true ? ‘yes’ : ‘no’
‘yes’
!true ? ‘yes’ : ‘no’
‘no’
is_assigned ? teamA.id : teamB.id
teamA.id if is_assigned is true
New records (only for tasks)
Expression
Result
new(task)
New empty task in rule account
new(task, ‘Finalize the change plan’)
New task based on the given template
Previous Field Values
A field identifier can be used to look up the value of this field. For example, to retrieve the current value of a workflow’s Subject field, the following expression can be used:
- workflow.subject
It is also possible, however, to look up a record’s previous field value, i.e. the value that the field had before the record was saved and the automation rule was triggered. This is done by adding _was
after the field identifier. To do this for the Subject field of a workflow, for example, the expression becomes:
- workflow.subject_was
String Interpolation
It is possible to use expressions within expressions. However, an expression can only be used if it is already defined, so the order of the expressions is important. The example below works, because the expression ‘note’ is defined before it is used in the expression ‘hello_note’.
- note: notes[last]
- hello_note: “hello {{note}}”
It is possible to reorder expressions by dragging them up or down to ensure that each expression is defined before it is used in another expression.