The CreatorCon Call for Content is officially open! Get started here.

Calculation using business rule

akin9
Tera Contributor

Hello Experts,

 

We need to calculate the incident state how much minutes  "In progress" and store in "u_state_calc" field

for below code is working fine.

but whenever any other field is updated its capturing that time duration instead of WIP.

Requirement

1.How much minutes state was inprogress.

 

After - insert

Condition - stage changesfrom WIP

Field name  - "u_state_calc"

Field type - "Integer"

 

(function executeRule(current, previous /*null when async*/) {
   
    if (previous.stage == '2' && current.stage != '2') {
               
        var wipStart = previous.sys_updated_on;
        var wipEnd = new GlideDateTime();      
        var durationMillis = wipEnd.getNumericValue() - new GlideDateTime(wipStart).getNumericValue();
        var durationMins = Math.floor(durationMillis / (1000 * 60));
 
        current.u_state_calc = durationMins;
    }
})(current, previous);
 
Please support!
1 ACCEPTED SOLUTION

Hi @akin9,


Try with following BR.

 

Type : After -> Update
condition : state -> changes from -> in progess

code :

(function executeRule(current, previous /*null when async*/) {
var wipStateCode = '2';
var sum = 0;
var startAuditGR = new GlideRecord('sys_audit');
startAuditGR.addQuery('fieldname', 'state');
startAuditGR.addQuery('documentkey',current.sys_id);
startAuditGR.addQuery('newvalue', wipStateCode);
startAuditGR.orderBy('sys_created_on');
startAuditGR.query();
while (startAuditGR.next()) {
    var startTime = new GlideDateTime(startAuditGR.sys_created_on);
    var endAuditGR = new GlideRecord('sys_audit');
    endAuditGR.addQuery('fieldname', 'state');
    endAuditGR.addQuery('documentkey',current.sys_id);
    endAuditGR.addQuery('sys_created_on', '>', startTime);
    endAuditGR.addQuery('oldvalue', wipStateCode);
    endAuditGR.orderBy('sys_created_on');
    endAuditGR.query();
    gs.print(endAuditGR.getRowCount());
    if (endAuditGR.next()) {
        var endTime = new GlideDateTime(endAuditGR.sys_created_on);
        gs.print(endTime);
        var durationMillis = endTime.getNumericValue() - startTime.getNumericValue();
        gs.print(durationMillis);

        if (!isNaN(durationMillis) && durationMillis >= 0) {
            var durationMins = Math.floor(durationMillis / (1000 * 60));
            sum = sum + durationMins;
            gs.info("hello +"+ durationMins);
            gs.info("test  "+sum);
        }

    }
}
var incidentGR = new GlideRecord('incident');
if (incidentGR.get(current.sys_id))
{
incidentGR.u_state_calc = sum;
incidentGR.update();
gs.addInfoMessage(sum);
}


})(current, previous);
 
Rohit99_0-1726139511146.png


on incident form store field type is integer.

 

Rohit99_2-1726139628855.png

 

 

Please mark my response as correct and helpful if it helped solved your question.

 

Thanks,

Rohit Suryawanshi

 

View solution in original post

6 REPLIES 6

Hi @akin9,


Try with following BR.

 

Type : After -> Update
condition : state -> changes from -> in progess

code :

(function executeRule(current, previous /*null when async*/) {
var wipStateCode = '2';
var sum = 0;
var startAuditGR = new GlideRecord('sys_audit');
startAuditGR.addQuery('fieldname', 'state');
startAuditGR.addQuery('documentkey',current.sys_id);
startAuditGR.addQuery('newvalue', wipStateCode);
startAuditGR.orderBy('sys_created_on');
startAuditGR.query();
while (startAuditGR.next()) {
    var startTime = new GlideDateTime(startAuditGR.sys_created_on);
    var endAuditGR = new GlideRecord('sys_audit');
    endAuditGR.addQuery('fieldname', 'state');
    endAuditGR.addQuery('documentkey',current.sys_id);
    endAuditGR.addQuery('sys_created_on', '>', startTime);
    endAuditGR.addQuery('oldvalue', wipStateCode);
    endAuditGR.orderBy('sys_created_on');
    endAuditGR.query();
    gs.print(endAuditGR.getRowCount());
    if (endAuditGR.next()) {
        var endTime = new GlideDateTime(endAuditGR.sys_created_on);
        gs.print(endTime);
        var durationMillis = endTime.getNumericValue() - startTime.getNumericValue();
        gs.print(durationMillis);

        if (!isNaN(durationMillis) && durationMillis >= 0) {
            var durationMins = Math.floor(durationMillis / (1000 * 60));
            sum = sum + durationMins;
            gs.info("hello +"+ durationMins);
            gs.info("test  "+sum);
        }

    }
}
var incidentGR = new GlideRecord('incident');
if (incidentGR.get(current.sys_id))
{
incidentGR.u_state_calc = sum;
incidentGR.update();
gs.addInfoMessage(sum);
}


})(current, previous);
 
Rohit99_0-1726139511146.png


on incident form store field type is integer.

 

Rohit99_2-1726139628855.png

 

 

Please mark my response as correct and helpful if it helped solved your question.

 

Thanks,

Rohit Suryawanshi

 

akin9
Tera Contributor

Hi @Rohit99 

 

Thank you very much for your special effort.

Script is working fine.