From b77f2cbcec1f7b3b648940e5d4cb7f6084c341d7 Mon Sep 17 00:00:00 2001 From: hanna-g-sn Date: Mon, 20 Oct 2025 14:26:48 +0100 Subject: [PATCH 1/4] Add README for Auto Tag VTB Business Rule This snippet allows users to create a business rule for updating VTB record tags based on their state or priority, with an example using Agile Story records. --- .../Auto Tag VTB Based on Record States/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/README.md diff --git a/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/README.md b/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/README.md new file mode 100644 index 0000000000..0779877ccf --- /dev/null +++ b/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/README.md @@ -0,0 +1,2 @@ +This code snippet allows users to create a business rule to update the tag/label on a vtb record based on the state/priority of the record. The example included uses Agile Story records as the example. +This extends on a ServiceNow functionality: https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB1117228 From 43894548080b809e36f50aaa732e0b4e6fcc0b07 Mon Sep 17 00:00:00 2001 From: hanna-g-sn Date: Mon, 20 Oct 2025 14:27:41 +0100 Subject: [PATCH 2/4] Add auto-tagging logic for VTB based on record states --- .../code_snippet.js | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/code_snippet.js diff --git a/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/code_snippet.js b/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/code_snippet.js new file mode 100644 index 0000000000..1f410188de --- /dev/null +++ b/Server-Side Components/Business Rules/Auto Tag VTB Based on Record States/code_snippet.js @@ -0,0 +1,110 @@ +(function executeRule(current, previous /*null when async*/) { + + // Retrieve the SysIDs from system properties - holding in system properties to overcome not hardcoding the SysID + var highPriorityLabelSysId = gs.getProperty('label.high_priority'); + var blockedLabelSysId = gs.getProperty('label.blocked'); + var readyForQALabelSysId = gs.getProperty('label.ready_for_qa'); + var qaCompletedLabelSysId = gs.getProperty('label.qa_completed'); + var readyForDeploymentLabelSysId = gs.getProperty('label.ready_for_deployment'); + + // Query the 'vtb_card' table for related task records + var gr = new GlideRecord('vtb_card'); + gr.addQuery('task', current.sys_id); + gr.query(); + + // Loop through all matching vtb_card records + while (gr.next()) { + + // Handle High Priority label + var highPriorityTag = new GlideRecord('label_entry'); + highPriorityTag.addQuery('table', 'vtb_card'); + highPriorityTag.addQuery('table_key', gr.sys_id); + highPriorityTag.addQuery('label', highPriorityLabelSysId); + highPriorityTag.query(); + if (current.priority == 1 && !highPriorityTag.next()) { // Add label if not already present + highPriorityTag = new GlideRecord('label_entry'); + highPriorityTag.label = highPriorityLabelSysId; // High Priority Label SysID + highPriorityTag.table = 'vtb_card'; + highPriorityTag.read = 'yes'; + highPriorityTag.title = "High Priority Tag for " + gr.task.number; + highPriorityTag.table_key = gr.sys_id; + highPriorityTag.insert(); + } else if (current.priority != 1 && highPriorityTag.next()) { // Remove label if priority is not high + highPriorityTag.deleteRecord(); + } + + // Handle Blocked label + var blockedTag = new GlideRecord('label_entry'); + blockedTag.addQuery('table', 'vtb_card'); + blockedTag.addQuery('table_key', gr.sys_id); + blockedTag.addQuery('label', blockedLabelSysId); + blockedTag.query(); + if (current.blocked == true && !blockedTag.next()) { // Add label if not already present + blockedTag = new GlideRecord('label_entry'); + blockedTag.label = blockedLabelSysId; // Blocked Label SysID + blockedTag.table = 'vtb_card'; + blockedTag.read = 'yes'; + blockedTag.title = "Blocked Tag for " + gr.task.number; + blockedTag.table_key = gr.sys_id; + blockedTag.insert(); + } else if (current.blocked == false && blockedTag.next()) { // Remove label if blocked is false + blockedTag.deleteRecord(); + } + + // Handle Ready for QA label + var readyForQATag = new GlideRecord('label_entry'); + readyForQATag.addQuery('table', 'vtb_card'); + readyForQATag.addQuery('table_key', gr.sys_id); + readyForQATag.addQuery('label', readyForQALabelSysId); + readyForQATag.query(); + if (current.u_implementation_stage == 'QA Required' && !readyForQATag.next()) { // Add label if not already present + readyForQATag = new GlideRecord('label_entry'); + readyForQATag.label = readyForQALabelSysId; // Ready for QA Label SysID + readyForQATag.table = 'vtb_card'; + readyForQATag.read = 'yes'; + readyForQATag.title = "Ready for QA Tag for " + gr.task.number; + readyForQATag.table_key = gr.sys_id; + readyForQATag.insert(); + } else if (current.u_implementation_stage != 'QA Required' && readyForQATag.next()) { // Remove label if stage is no longer QA Required + readyForQATag.deleteRecord(); + } + + // Handle QA Completed label + var qaCompletedTag = new GlideRecord('label_entry'); + qaCompletedTag.addQuery('table', 'vtb_card'); + qaCompletedTag.addQuery('table_key', gr.sys_id); + qaCompletedTag.addQuery('label', qaCompletedLabelSysId); + qaCompletedTag.query(); + if (current.u_implementation_stage == 'QA Completed' && !qaCompletedTag.next()) { // Add label if not already present + qaCompletedTag = new GlideRecord('label_entry'); + qaCompletedTag.label = qaCompletedLabelSysId; // QA Completed Label SysID + qaCompletedTag.table = 'vtb_card'; + qaCompletedTag.read = 'yes'; + qaCompletedTag.title = "QA Completed Tag for " + gr.task.number; + qaCompletedTag.table_key = gr.sys_id; + qaCompletedTag.insert(); + } else if (current.u_implementation_stage != 'QA Completed' && qaCompletedTag.next()) { // Remove label if stage is no longer QA Completed + qaCompletedTag.deleteRecord(); + } + + // Handle Ready for Deployment label + var readyForDeploymentTag = new GlideRecord('label_entry'); + readyForDeploymentTag.addQuery('table', 'vtb_card'); + readyForDeploymentTag.addQuery('table_key', gr.sys_id); + readyForDeploymentTag.addQuery('label', readyForDeploymentLabelSysId); + readyForDeploymentTag.query(); + if (current.u_implementation_stage == 'Ready for Deployment' && !readyForDeploymentTag.next()) { // Add label if not already present + readyForDeploymentTag = new GlideRecord('label_entry'); + readyForDeploymentTag.label = readyForDeploymentLabelSysId; // Ready for Deployment Label SysID + readyForDeploymentTag.table = 'vtb_card'; + readyForDeploymentTag.read = 'yes'; + readyForDeploymentTag.title = "Ready for Deployment Tag for " + gr.task.number; + readyForDeploymentTag.table_key = gr.sys_id; + readyForDeploymentTag.insert(); + } else if (current.u_implementation_stage != 'Ready for Deployment' && readyForDeploymentTag.next()) { // Remove label if stage is no longer Ready for Deployment + readyForDeploymentTag.deleteRecord(); + } + + } + +})(current, previous); From fa0ae980052697a15cbcadc8e84b4b45fdd939d7 Mon Sep 17 00:00:00 2001 From: hanna-g-sn Date: Mon, 20 Oct 2025 14:54:46 +0100 Subject: [PATCH 3/4] Create README for onChange Client Script Add README for onChange Client Script to clear MRVS values --- .../onChange Clear Values on MRVS/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/README.md diff --git a/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/README.md b/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/README.md new file mode 100644 index 0000000000..1760b58dfb --- /dev/null +++ b/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/README.md @@ -0,0 +1 @@ +This is an onChange Client Script that will clear values of an MRVS - Multi Row Variable Set From 9da7865c72dbcd4fb324322b1d416c5f11fd4a1b Mon Sep 17 00:00:00 2001 From: hanna-g-sn Date: Mon, 20 Oct 2025 14:55:46 +0100 Subject: [PATCH 4/4] Add onChange function to clear MRVS values --- .../onChange Clear Values on MRVS/code_snippet.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/code_snippet.js diff --git a/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/code_snippet.js b/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/code_snippet.js new file mode 100644 index 0000000000..6c7e5ae9b1 --- /dev/null +++ b/Client-Side Components/Catalog Client Script/onChange Clear Values on MRVS/code_snippet.js @@ -0,0 +1,6 @@ +function onChange(control, oldValue, newValue, isLoading) { + if (isLoading || newValue == '') { + return; + } + g_form.clearValue('IO:sysid'); //pass in the sys_id of your MRVS/multi row variable set +}