Name

global.SoftwarePackage

Description

Manage software package related operations.

Script

/**
* Software package related calculations.
* 
* Aleck Lin aleck.lin@service-now.com
*/

var SoftwarePackage = Class.create();

SoftwarePackage.prototype = {
initialize : function() {
    this.spkgCache = {};
    this.licenseCount = 0;
},

/*
 * Calculates the total install count of each software package (cmdb_ci_spkg).
 */
calcInstallCount: function() {
    var gr = new GlideRecord('cmdb_ci_spkg');
    gr.query();
    while (gr.next())
        this._calcInstallCount(gr);
},

_calcInstallCount: function(gr) {
    var ga = new GlideAggregate('cmdb_software_instance');
    ga.addQuery('software', gr.sys_id);
    ga.addAggregate('COUNT');
    ga.query();
    var count = 0;
    if (ga.next()) 
        count = ga.getAggregate('COUNT');
      
    if (gr.install_count == count) 
       return;

    gr.install_count = count;
    gr.update();   
},

calcLicenseCount: function() {
    var gr = new GlideRecord('cmdb_ci_spkg');
    gr.query();
    while (gr.next())
        this._calcLicenseCount(gr);
},

_calcLicenseCount: function(gr) {
    if (this.spkgCache[gr.sys_id])
        return;

    var spkgArr = this.findAllSpkgs([gr.sys_id]);

    var count = 0;
    var gr = new GlideRecord("cmdb_ci_spkg");
    gr.addQuery("sys_id", spkgArr);
    gr.orderBy("sys_created_on");
    gr.query();
    while (gr.next()) {
        this.spkgCache[gr.sys_id] = true;
        count++;
        
        // If this is the last spkg, then give it all the rest of the license_count
        if (count == spkgArr.length) {
            gr.license_count = this.licenseCount;
            this.licenseCount = 0;
        } else {
            if (this.licenseCount >= gr.install_count)
                gr.license_count = gr.install_count;
            else
                gr.license_count = this.licenseCount;

            this.licenseCount -= gr.license_count;
        }
        gr.update();
    }
},


findAllSpkgs: function(spkgArr) {
    var licenseArr = this.getASTLicenses(spkgArr);      
    var license = new ASTLicense();
    var spkgArr2 = license.getSoftwarePackages(licenseArr);   

    if (spkgArr2.length == spkgArr.length)
        return spkgArr2;
    else
        return this.findAllSpkgs(spkgArr2);
},


/*
 *  Get an array list of licenses based on software packages.
 */ 
getASTLicenses: function(list) {
    this.licenseCount = 0;
    var licenses = [];
    var cache = {};
    var gr = new GlideRecord('ast_license_package_instance');
    gr.addQuery("ci_item", list);
    gr.query();
    while (gr.next()) {
        var licenseSysId = gr.ast_license.sys_id;
        if (cache[licenseSysId])
            continue;
        cache[licenseSysId] = true;

        licenses.push(licenseSysId);
        this.licenseCount += gr.ast_license.license_count;
    }
        
    return licenses;
}

}

Sys ID

809d062ec0a8026c1e98d20fda3b95e7

Offical Documentation

Official Docs: