Need help with below script

dvelloriy
Kilo Sage

Hello All,

 

I have below script which works great to generate asset tags based on today's Julian date. It also has the logic to check the generate tags in asset table and skip the ones already present.

However there is a potential issue we have identified. It might be a possibility that multiple agents might be using the catalog to generate asset tags. With the current logic it will generate the same asset tags for multiple agents on the same day/same time unless the assets are created with the generated asset tags.

Can we modify the logic to generate unique asset tags per request by checking the RITM's created TODAY and appending a unique number as suffix.

Please advise.

 

    (function execute(inputs, outputs) {

        var today = new Date();

var startOfYear = new Date(today.getFullYear(), 0, 1);

var diff = today - startOfYear;

var dayOfYear = Math.floor(diff / (1000 * 60 * 60 * 24)) + 1;

var julianDate = today.getFullYear().toString().slice(2) + dayOfYear.toString().padStart(3, '0');

var baseNumber = parseInt(julianDate + '0001', 10);

var count = inputs.countasttag;

var uniqueCount = 0; // To keep track of unique numbers

var numberArray = [];

var i = 0;

while (uniqueCount < count) {

var generatedNumber = baseNumber + i;

// Check if this number exists in the alm_asset table

var assetGR = new GlideRecord('alm_asset');

assetGR.addQuery('asset_tag', generatedNumber.toString());

assetGR.query();

if (!assetGR.hasNext()) { // If number is not found, it's unique

numberArray.push(generatedNumber);

uniqueCount++; // Add to unique count

}

i++; // Move to the next number

}

outputs.generated_tags = numberArray.join(', ');

gs.info('Generated numbers: ' + numberArray.join(', '));

       

})(inputs, outputs);

 

9 REPLIES 9

@dvelloriy 

Try this:

 

 

(function execute(inputs, outputs) {
    var today = new Date();
    var startOfYear = new Date(today.getFullYear(), 0, 1);
    var diff = today - startOfYear;
    var dayOfYear = Math.floor(diff / (1000 * 60 * 60 * 24)) + 1;
    var julianDate = today.getFullYear().toString().slice(2) + dayOfYear.toString().padStart(3, '0');
    var baseNumber = parseInt(julianDate + '0001', 10);
    var count = inputs.countasttag; //10
    var uniqueCount = 0; // To keep track of unique numbers
    var numberArray = [];
    // Check if this number exists in the alm_asset table
    var assetGR = new GlideRecord('alm_asset');
    assetGR.addQuery('asset_tag', baseNumber.toString());  //100
    assetGR.query();
    if (!assetGR.hasNext()) { // If number is not found, it's unique
        var ritmAT = [];
        var gr = new GlideRecord("sc_req_item");
        gr.addEncodedQuery("cat_item=4410e34a1b649a101a29eb98b04bcbfe^sys_created_onONToday@javascript&colon;gs.beginningOfToday()@javascript&colon;gs.endOfToday()");
        gr.query(); //101, 102
        while (gr.next()) {
            ritmAT.push(gr.description.toString()); //101, 102
        }
        var maxNum = Math.max.apply(null, ritmAT); //102
        if (maxNum > baseNumber) { // 102 > 100
            var diff = maxNum - baseNumber + 1; //102 - 100 + 1 =  3
            baseNumber = baseNumber + diff; // 100 +3 = 103
        }
    }
    numberArray.push(baseNumber); //103
    uniqueCount++; // Add to unique count  //1
    while (uniqueCount < count) { // 1 < 10
        var baseNumber = baseNumber++; //104
        numberArray.push(baseNumber); //104
        uniqueCount++; // Add to unique count
    }
    outputs.generated_tags = numberArray;
    gs.info('Generated numbers: ' + numberArray.join(', '));

})(inputs, outputs);

 

 

Push the correct asset value into the array. Not tested

I cannot answer untill and unless how the asset tags were creating via RITM's

Thanks,
Murthy

Something went terribly wrong here. i see below asset tags now:

["2.42990001E8","2.42990001E8","2.42990001E8","2.42990001E8","2.42990001E8","2.42990001E8","2.42990001E8"]

  var count = inputs.countasttag;

fails as 'inputs' is not defined anywhere. Test the logic in the function in scripts - background

No, inputs is defined in the input set of flow action.

I generated 3 asset tags, and they are all same.

created a new request and still same.

Logic is not working as expected.

 

242990001, 242990001, 242990001