Руководство пользователя RR Tech Service Management

Операторы правил автоматизации

Для использования в выражениях в правилах автоматизации доступно множество операторов. Они сгруппированы по типам и приведены ниже вместе с примерами использования. Для удобства администраторов и разработчиков информация дается на английском языке.

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) 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.
‘4me’.upcase ‘4ME’ All capitals.
‘4ME’.downcase ‘4me’ 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.md and onwards.
‘break-me-up’.slice(-5) ‘me-up’ Take the string from the given index.md and onwards.
‘break-me-up’.slice(3,2) ‘ea’ Take a fixed amount of characters from the given index.md.
‘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
duration(created_at, now) Number of minutes between creation and now
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.