Name

global.ContractManagementUtils

Description

Contract Management API

Script

var ContractManagementUtils = Class.create();
ContractManagementUtils.prototype = {
  initialize: function() {
  },
  
  renewUIActionBaseCondition: function(current) {
  	var state = current.getValue('state');
  	var process = current.getValue('process');
  	var substate = current.getValue('substate');

  	var hasEndDate = !!(current.getValue('ends'));
  	var isContractActiveOrExpired = ((state === 'active' || state === 'expired') && (gs.nil(substate)));
  	var isContractUnderRenewal = (process === 'renewal'
  		&& (substate === 'renewal_rejected' || substate === 'awaiting_review'));

  	return hasEndDate && (isContractActiveOrExpired || isContractUnderRenewal);
  },

  isRenewAllowed: function (current) {
  	var HAMConditionsAllow = true;
  	if (global.AssetUtils.IS_HAMP_ACTIVE && sn_hamp.HAMContractManagementUtils && sn_hamp.HAMContractManagementUtils.prototype.isRenewAllowed) {
  		var response = new sn_hamp.HAMContractManagementUtils().isRenewAllowed(current);
  		HAMConditionsAllow = response.isRenewAllowed;
  		if (!response.continueProcessing) {
  			return HAMConditionsAllow;
  		}
  	}

  	var isPartOfRenewalProcess = false;
      var canUseNewRenewalWorkflow = false;
  	if (global.AssetUtils.IS_ITAM_COMMON_ACTIVE && sn_itam_common.ContractRenewalUtils && sn_itam_common.ContractRenewalUtils.prototype.isRenewAllowed) {
          var contractRenewalUtil = new sn_itam_common.ContractRenewalUtils();
  		response = contractRenewalUtil.isRenewAllowed(current);
  		canUseNewRenewalWorkflow = response.isRenewAllowed;
  		if (!response.continueProcessing) {
  			return !canUseNewRenewalWorkflow;
  		}
          isPartOfRenewalProcess = contractRenewalUtil.newRenewalRequestActive(current);
  	}

  	return !canUseNewRenewalWorkflow && !isPartOfRenewalProcess && HAMConditionsAllow && this.renewUIActionBaseCondition(current);
  },
  isAdjustAllowed: function(current) {
  	var adjustAllowed = true;
  	var response;
  	if (global.AssetUtils.IS_ITAM_COMMON_ACTIVE && sn_itam_common.ContractRenewalUtils && sn_itam_common.ContractRenewalUtils.prototype.isAdjustAllowed) {
  		response = new sn_itam_common.ContractRenewalUtils().isAdjustAllowed(current);
  		adjustAllowed = response.isAdjustAllowed;
  	}
  	return adjustAllowed;
  },
  isSubmitForReviewAllowed: function(current) {
  	var sbmtForReviewAllowed = true;
  	var response;
  	if (global.AssetUtils.IS_ITAM_COMMON_ACTIVE && sn_itam_common.ContractRenewalUtils && sn_itam_common.ContractRenewalUtils.prototype.isSubmitForReviewAllowed) {
  		response = new sn_itam_common.ContractRenewalUtils().isSubmitForReviewAllowed(current);
  		sbmtForReviewAllowed = response.isSumbitAllowed;
  	}
  	return sbmtForReviewAllowed;
  },
  isCancelAllowed: function(current) {
  	var isCancelAllowed = true;
  	if (global.AssetUtils.IS_ITAM_COMMON_ACTIVE && sn_itam_common.ContractRenewalUtils && sn_itam_common.ContractRenewalUtils.prototype.isCancelAllowed) {
  		isCancelAllowed = !new sn_itam_common.ContractRenewalUtils().isCancelAllowed(current);

  		if (global.AssetUtils.IS_EAM_ACTIVE && String(current.asset_types) === "enterprise" && sn_itam_common.ContractRenewalUtils.prototype.isEAMContractExpiring) {
  			isCancelAllowed = isCancelAllowed && !new sn_itam_common.ContractRenewalUtils().isEAMContractExpiring(current);
  		}
  	}
  	return isCancelAllowed;	
  },
  renewContract: function(contractRecord){
      if ((contractRecord.state == 'active') && (contractRecord.substate == 'renewal_active')) {
          this._updateContractDates(contractRecord, 'renewal');
          if(contractRecord.ratecard)
              this._updateRateCards(contractRecord, 'renewal');
          else
              this._updateContract(contractRecord, 'renewal');
      }
      return;
  },
  
  extendContract: function(contractRecord){
      if ((contractRecord.state == 'active') && (contractRecord.substate == 'extension_active')) {
          this._updateContractDates(contractRecord, 'extension');
          if(contractRecord.ratecard)
              this._updateRateCards(contractRecord, 'extension');
          else
              this._updateContract(contractRecord, 'extension');
      }
      return;
  },
  
  activateRateCards: function(contractRecord, activate) {
      if (!SNC.AssetMgmtUtil.isPluginRegistered('com.snc.cost_management')) 
          return;
      
      var rateCardRecord = new GlideRecord('fm_contract_rate_card');
      rateCardRecord.addQuery('contract', contractRecord.sys_id);
      rateCardRecord.query();
      while(rateCardRecord.next() && rateCardRecord.canWrite()){
          rateCardRecord.setValue('active', activate);
          rateCardRecord.update();
      }
  },
  
updateTermsAndConditions: function(sysId) {
      var english_terms = "";
     
      var contractterms = new GlideRecord('clm_m2m_contract_and_terms');
      contractterms.addQuery('contract', sysId);
      contractterms.orderBy('order');
      contractterms.query();

      while (contractterms.next()) {
          var terms = new GlideRecord('clm_terms_and_conditions');
          terms.get(contractterms.terms_and_conditions);
          english_terms += '<b><u>' + terms.getValue('name') + '</u></b><br />' +  terms.getValue('description') + '<p></p>';
      }
      contract = new GlideRecord('ast_contract');
      contract.get(sysId);
      contract.setValue('terms_and_conditions', english_terms);
      contract.update();
      //to build T&C in all active languages on the instance other than english
       this._updateContractTermsAndConditionsForLanguagesOtherThanEnglish(sysId, english_terms);

  },
  
  _updateContractTermsAndConditionsForLanguagesOtherThanEnglish: function(sysId, english_terms) {
      var active_languages = {};
      var language_terms = {};
      var terms_available = {}; // flag to check all the terms are in specific language
      var language_display_name = {};

      var lang = new GlideRecord('sys_language');
      if(lang.isValid()){
      lang.addQuery('active','true');
      lang.query();
      }
      //for all the languages active on the instance
      var numberofactivelanguages=-1;
      while(lang.next()){
       var lang_id = lang.getValue('id');
       active_languages[++numberofactivelanguages] = lang_id; 
       terms_available[lang_id] = true;
       language_terms[lang_id] = "";
       language_display_name[lang_id] = lang.getValue('name');
      }
      if(numberofactivelanguages == -1){
          return;
      }
      contractterms = new GlideRecord('clm_m2m_contract_and_terms');
      contractterms.addQuery('contract', sysId);
      contractterms.orderBy('order');
      contractterms.query();

      while (contractterms.next()) {
          var k = 0;
          terms = new GlideRecord('clm_terms_and_conditions');
          terms.get(contractterms.terms_and_conditions);
          var termsandconditions = terms.getValue('sys_id');
          while(k <= numberofactivelanguages){
              language_id = active_languages[k];
              if(terms_available[language_id]){
                  var traslatedtextavailable = new GlideRecord('sys_translated_text');
                  traslatedtextavailable.addQuery('tablename','clm_terms_and_conditions');
                  traslatedtextavailable.addQuery('documentkey',termsandconditions);
                  traslatedtextavailable.addQuery('fieldname','description');
                  traslatedtextavailable.addQuery('language',language_id);
                  traslatedtextavailable.query();
              
                  if(traslatedtextavailable.next()){
                      language_terms[language_id] +=  '<b><u>' +terms.getValue('name') + '</u></b><br />' + traslatedtextavailable.getValue('value') + '<p></p>';
                      }
                  else{
                      language_terms[language_id] = english_terms;
                      terms_available[language_id] = false;
                      }
              }
              k++;
          }
      }

      var j=0;
      var k =-1;
      var tokensArray = [];
      while(j <= numberofactivelanguages){
          language_id = active_languages[j];
          //create or update contract's T&C in sys_translated_text for all active languages 
          var traslatedtext = new GlideRecord('sys_translated_text');
          traslatedtext.addQuery('documentkey',sysId);
          traslatedtext.addQuery('fieldname','terms_and_conditions');
          traslatedtext.addQuery('language',language_id);
          traslatedtext.addQuery('tablename','ast_contract');
          traslatedtext.query();
          if (!traslatedtext.next()){
              traslatedtext.initialize();
              traslatedtext.setValue('documentkey',sysId);
              traslatedtext.setValue('fieldname','terms_and_conditions');
              traslatedtext.setValue('language',language_id);
              traslatedtext.setValue('tablename','ast_contract');
              traslatedtext.setValue('value',language_terms[language_id]);
              traslatedtext.insert();
          }
          else {
              traslatedtext.setValue('value',language_terms[language_id]);
              traslatedtext.update();
          }

          if(terms_available[language_id]){
              tokensArray += " " + gs.getMessage(language_display_name[language_id]);
          }

          j++;
      }

  	if(tokensArray.length === 0){
  		tokensArray.push('English');
  	}

      var message = gs.getMessage("Terms and Conditions are Built/Rebuilt in {0}", tokensArray);
      gs.addInfoMessage(message);

  },
      
  appendContractHistory: function(prev_contract, oldStartDate, oldEndDate) {
      var terms = prev_contract.getValue('terms_and_conditions');
      var history = new GlideRecord('clm_contract_history');
      history.initialize();
      history.setValue('contract_id', prev_contract.sys_id);
      if (!gs.nil(oldStartDate) || !gs.nil(oldEndDate)) {
          if (!gs.nil(oldStartDate)) {
              history.starts = oldStartDate;
              oldStartDate = '';
          }
          if (!gs.nil(oldEndDate)) {
              history.ends = oldEndDate;
              oldEndDate = '';
          }
      } else {
          if (!prev_contract.starts.nil())
              history.starts = prev_contract.starts;
          if (!prev_contract.ends.nil())
              history.ends = prev_contract.ends;
      }
      if (!prev_contract.terms_and_conditions.nil())
          history.setValue('terms_and_conditions', terms);
      history.insert();
  },
  
  getContractModels : function() {
      var cm = new GlideRecord('cmdb_model');
      cm.addQuery('cmdb_model_categoryLIKE996b568ec3102000b959fd251eba8f19');
      cm.query();

      var strQuery = 'sys_idIN';
      while (cm.next())
          strQuery += ',' + cm.sys_id;

      return strQuery;
  },

  filterAssetToContract : function(m2m) {
      if (m2m.contract.application_model != '')
          return 'quantity=1^sys_class_name!=alm_consumable^model_category=35bf2d4137101000deeabfc8bcbe5dbd^model.ref_cmdb_software_product_model.application_model=' + m2m.contract.application_model;
      else if (m2m.contract.contract_model.name == 'Software License')
          return 'quantity=1^sys_class_name!=alm_consumable^model_category=35bf2d4137101000deeabfc8bcbe5dbd';
      return 'quantity=1^sys_class_name!=alm_consumable^';
  },
  
  _isCostManagementActive: function(){
      if (SNC.AssetMgmtUtil.isPluginRegistered('com.snc.cost_management'))
          return true;
      return false;
  },
  
  _updateRateCards: function(contractRecord, process){
      if (!SNC.AssetMgmtUtil.isPluginRegistered('com.snc.cost_management')) 
          return;
      var rateCardRecord = new GlideRecord('fm_contract_rate_card');
      rateCardRecord.addQuery('contract', contractRecord.sys_id);
      rateCardRecord.query();
      while(rateCardRecord.next()){
          if(rateCardRecord.active){
              var base = rateCardRecord.base_cost;
              if(process == 'renewal')
                  rateCardRecord.start_date = contractRecord.renewal_date;
              rateCardRecord.end_date = contractRecord.renewal_end_date;
              if(contractRecord.cost_adjustment != '0')
                  base = parseFloat(rateCardRecord.getValue('base_cost'))+parseFloat(contractRecord.cost_adjustment);
              
              if (contractRecord.cost_adjustment_percentage != '0')
                  base = base * (1 + parseFloat(contractRecord.cost_adjustment_percentage)/100);
              
              rateCardRecord.setValue('base_cost', base);
              rateCardRecord.update();
          }
      }
      return;
  },
  
  _updateContractDates:function(contractRecord, process){
      if(process=='renewal')
          contractRecord.starts = contractRecord.renewal_date;
      gs.log('Updated date to: ' + contractRecord.renewal_end_date);
      contractRecord.ends = contractRecord.renewal_end_date;
      contractRecord.update();
      return;
  },
  
  _updateContract:function(contractRecord, process){
  	var currencyCode = contractRecord.payment_amount.getCurrencyCode();
  	var paymentAmount = contractRecord.payment_amount.getCurrencyValue();
      if (contractRecord.cost_adjustment != "0") 
  		contractRecord.payment_amount.setValue(currencyCode + ";" + (parseFloat(paymentAmount) + parseFloat(contractRecord.cost_adjustment)));
      if (contractRecord.cost_adjustment_percentage != "0")
          contractRecord.payment_amount.setValue(currencyCode + ";" + (parseFloat(paymentAmount) * (1 + parseFloat(contractRecord.cost_adjustment_percentage)/100))); 
      return;
  },
  
  getContractNumberOnInsert: function (contractNumber) {
  	return gs.getMessage('COPY_{0}', [contractNumber]);
  },
  canAddTermsAndCondtions: function(contract) {
  	//checking if parent table is ast_contract
  	if(contract.getTableName() === 'ast_contract') {
  		var validSubstates = [
  		'awaiting_review',
  		'extension_rejected',
  		'rejected',
  		'renewal_rejected'
          ];
          if(validSubstates.indexOf(String(contract.substate)) !== -1) {
              return true;
          }
          return false;
      }
      return true;
  },
  assetsCoveredCondition: function(parent) {
  	return this.isContract(parent) && 
  (!global.AssetUtils.IS_HAMP_ACTIVE || (global.AssetUtils.IS_HAMP_ACTIVE && 
  !new sn_hamp.HAMContractManagementUtils().isContractExpirationActivated(parent)));
  },
  isContract: function(parent) {
  	var contractTables = [];
  	var isContractTable = false;
  	contractTables = ContractManagementUtils.getTableExtensions(ContractManagementUtils.CONTRACT_TABLE);
  	if(contractTables.indexOf(parent.getTableName()) !== -1) {
  		isContractTable = true;
  	}
  	return isContractTable;
  },
  
  type: 'ContractManagementUtils',
};
ContractManagementUtils.PURCHASE_ORDER="0c81e836c3102000b959fd251eba8f5d";
ContractManagementUtils.NDA="1513c0a0dcba11e2a28f0800200c9a66";
ContractManagementUtils.LEASE="1881a836c3102000b959fd251eba8fc9";
ContractManagementUtils.PURCHASE_AGREEMENT="3c967c55dfa1010068c37a0d3df26350";
ContractManagementUtils.SUBSCRIPTION="84941ac0ef60300035c61ab995c0fbc4";
ContractManagementUtils.SERVICE_CONTRACT="8881e836c3102000b959fd251eba8f29";
ContractManagementUtils.MAINTENANCE="a581e836c3102000b959fd251eba8fba";
ContractManagementUtils.WARRANTY="a781e836c3102000b959fd251eba8f80";
ContractManagementUtils.INSURANCE="bc81e072c3102000b959fd251eba8f86";
ContractManagementUtils.SOFTWARE_LICENSE="d781e836c3102000b959fd251eba8f89";
ContractManagementUtils.CONTRACT_TABLE = "ast_contract";
ContractManagementUtils.getTableExtensions = function (table) {
  var gth = new TableUtils(table);
  return gth.getAllExtensions();
};

ContractManagementUtils.deleteRecords = function (current) {
  if (current.canDelete()) {
  	current.deleteRecord();
  }
};
ContractManagementUtils.calculateTotals = function (salesTaxEnabled, paymentAmount, taxRate) {
  return new global.ExpenseManagementUtils().getTaxAmount(salesTaxEnabled, paymentAmount, taxRate);
};

Sys ID

779ff99fbf0030007a6d257b3f0739e2

Offical Documentation

Official Docs: