Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Time calculations help

Lucky1
Tera Guru

Hi all,

 

I have created a field on a catalog task table, "Total worked time" which is of Duration field type.

So, once the catalog task state is changed from Open to In Progress and until Closed complete, I want to calculate the time duration worked on it and auto-populate in that field once the task is closed complete.

Please note: The calculated time should not consider the pending state time duration.

 

Please guide.

 

Regards,

Lucky

1 ACCEPTED SOLUTION

Riya Verma
Kilo Sage

Hi @Lucky1 ,

Hope you are doing great.

1. Create a new Business Rule with the appropriate conditions to trigger when the task state is changed from Open to In Progress.

(function executeRule(current, previous /*null when async*/) {
    // Check if the task state has changed from Open to In Progress
    if (current.state == 2 && previous.state == 1) {
        // Set the current date and time as the start time of the task
        current.work_start = new GlideDateTime();
    }
})(current, previous);

Create a Workflow:.

  • Create a new workflow or modify an existing one to include the following stages:
    • Stage 1: In Progress
    • Stage 2: Pending (optional if you have a specific pending state)
    • Stage 3: Closed Complete
  • In the workflow, add a script to calculate the time duration worked and populate the "Total worked time" field when the task transitions from In Progress to Closed Complete.
// Check if the task is transitioning from In Progress to Closed Complete
if (current.state == 3 && previous.state == 2) {
    // Calculate the duration worked by subtracting the work start time from the current date and time
    var workStart = new GlideDateTime(current.work_start);
    var duration = new GlideDuration(workStart.getNumericValue(), new GlideDateTime().getNumericValue());

    // Set the calculated duration as the value of the "Total worked time" field
    current.total_worked_time = duration.getDisplayValue();
}

 

Please mark the appropriate response as correct answer and helpful, This may help other community users to follow correct solution.
Regards,
Riya Verma

View solution in original post

2 REPLIES 2

Rahul Kumar17
Tera Guru

Hi,

To calculate the time duration worked on a catalog task and auto-populate it in the "Total worked time" field, excluding the pending state time, you can use a combination of business rules and script calculations in ServiceNow. Here's how you can approach this:

  1. Create a Business Rule:

    • Create a business rule on the catalog task table (e.g., sc_task) to trigger when the state changes.
    • Set the condition for the business rule to trigger when the state changes from "In Progress" to "Closed Complete".
  2. Implement the Business Rule Script:

    • In the business rule script, you can calculate the time duration worked on the catalog task.
    • Use the GlideDateTime API to retrieve the start time (when the state changed to "In Progress") and end time (when the state changed to "Closed Complete").
    • Calculate the duration between the start and end time, excluding any pending state time.
    • Set the calculated duration value in the "Total worked time" field.

Here's an example of the business rule script:

(function() {
  // Get the current catalog task record
  var currentTask = current;

  // Check if the state changed from 'In Progress' to 'Closed Complete'
  if (currentTask.state == 3 && previous.state == 2) {
    // Calculate the time duration worked
    var startTime = currentTask.sys_created_on.getGlideObject();
    var endTime = currentTask.sys_updated_on.getGlideObject();
    var duration = new GlideDuration(endTime.subtract(startTime));

    // Exclude any pending state time
    if (currentTask.active.changes() && currentTask.active == false) {
      var pendingTime = currentTask.sys_updated_on.getGlideObject();
      var stateChangeTime = previous.sys_updated_on.getGlideObject();
      var pendingDuration = new GlideDuration(pendingTime.subtract(stateChangeTime));
      duration.subtract(pendingDuration);
    }

    // Set the calculated duration in the 'Total worked time' field
    currentTask.total_worked_time = duration.getDisplayValue();
  }
})();

 

Thanks,

Rahul Kumar

If my response helped please mark it correct and close the thread.

Thanks,
Rahul Kumar

Riya Verma
Kilo Sage

Hi @Lucky1 ,

Hope you are doing great.

1. Create a new Business Rule with the appropriate conditions to trigger when the task state is changed from Open to In Progress.

(function executeRule(current, previous /*null when async*/) {
    // Check if the task state has changed from Open to In Progress
    if (current.state == 2 && previous.state == 1) {
        // Set the current date and time as the start time of the task
        current.work_start = new GlideDateTime();
    }
})(current, previous);

Create a Workflow:.

  • Create a new workflow or modify an existing one to include the following stages:
    • Stage 1: In Progress
    • Stage 2: Pending (optional if you have a specific pending state)
    • Stage 3: Closed Complete
  • In the workflow, add a script to calculate the time duration worked and populate the "Total worked time" field when the task transitions from In Progress to Closed Complete.
// Check if the task is transitioning from In Progress to Closed Complete
if (current.state == 3 && previous.state == 2) {
    // Calculate the duration worked by subtracting the work start time from the current date and time
    var workStart = new GlideDateTime(current.work_start);
    var duration = new GlideDuration(workStart.getNumericValue(), new GlideDateTime().getNumericValue());

    // Set the calculated duration as the value of the "Total worked time" field
    current.total_worked_time = duration.getDisplayValue();
}

 

Please mark the appropriate response as correct answer and helpful, This may help other community users to follow correct solution.
Regards,
Riya Verma