Name

sn_ex_sp.ActivityConfigurationUtilSNC

Description

No description available

Script

var ActivityConfigurationUtilSNC = Class.create();
ActivityConfigurationUtilSNC.prototype = {
  initialize: function() {
      this.ITEM_SUMMARY_COUNT_LIMIT = 10;
      this.recordLimit = 0;
  },
  isActivityConfigDetailPresent: function(sysID) {
      var itemGr = new GlideRecord("sn_ex_sp_activity_config_detail");
      itemGr.addQuery("activity_configuration", sysID);
      itemGr.setLimit(1);
      itemGr.query();
      return itemGr.hasNext();
  },
  /*
   * To get activities data for building the widget.
   * @output: Object with detailed and summary sections as per configuration.
   */
  getActivityData: function(recordLimit) {
      this.recordLimit = recordLimit;
      var activityData = {
          primaryCountData: [],
          showViewAll: "",
          summaryCountData: [],
          listViewData: []
      };
      var gr = new GlideRecord('sn_ex_sp_activity_configuration');
      gr.addActiveQuery();
      gr.orderBy('order');
      gr.orderBy('activity_name');
      gr.query();
      while (gr.next()) {
          var itemData = {
              totalItemCount: 0,
              itemCount: 0,
              itemName: "",
              itemUrl: "",
              target: ""
          };

          // Validate User Criteria
          if (!(this._validateUserCriteria(gs.getUserID(), gr)))
              continue;

          itemData.itemName = gr.getDisplayValue('activity_name');
          var isInternal = gr.getValue('target_page') === 'INTERNAL';
          if (isInternal) {
              itemData.itemUrl = '?id=' + gr.internal_link.getDisplayValue().toString();
          } else {
              itemData.itemUrl = gr.getValue('external_link');
              itemData.target = '_blank';
          }
          var sortBy = gr.getValue('sort_by');
          var sortOrder = gr.getValue('sort_order');
          if (!sortBy)
              sortBy = 'sys_created_on';
          itemData.itemCount = gr.advanced ? this._getAdvancedData(gr) : this._getNonAdvancedData(gr);
          itemData.totalItemCount = itemData.itemCount;
          if (itemData.itemCount > 9)
              itemData.itemCount = '9+';
          if (gr.primary) {
              activityData.primaryCountData.push(itemData);
              activityData.showViewAll = itemData.totalItemCount > this.recordLimit ? true : false;
              if (itemData.totalItemCount > 0) {
                  try {
                      activityData.listViewData = this._getListViewData(gr, itemData, sortBy, sortOrder);
                  } catch (err) {
                      gs.addErrorMessage(gs.getMessage('Error while fetching List View'));
                  }
              }
          } else {
              activityData.summaryCountData.push(itemData);
          }
      }
      return activityData;
  },
  _validateUserCriteria: function(user, activityRecord) {
      if (!activityRecord.active) {
          return false;
      }
      var userCriteriaGR = new GlideRecord('sn_ex_sp_activity_user_criteria_mtom');
      userCriteriaGR.addQuery('activity', activityRecord.getValue("sys_id"));
      userCriteriaGR.query();
      var userCriteriaExists = false;
      while (userCriteriaGR.next()) {
          if (userCriteriaGR.user_criteria.active) {
              userCriteriaExists = true;
              var criteriaList = [];
              criteriaList.push(userCriteriaGR.user_criteria.sys_id);
              if (sn_uc.UserCriteriaLoader.userMatches(user, criteriaList)) {
                  return true;
              }
          }
      }
      if (!userCriteriaExists) {
          return true;
      }
      return false;
  },
  _getListViewData: function(gr, itemData, sortBy, sortOrder) {
      if (gr.advanced) {
          return this._getAdvanvedListViewData(gr);
      } else {
          return this._getNonAdvancedListViewData(gr, itemData, sortBy, sortOrder);
      }
  },
  /**
   * @input: glideRecord of sn_ex_sp_my_item_configuration.
   * @output: List view array.
   **/
  _getAdvanvedListViewData: function(gr) {
      var listViewData = [];
      if (gr.getValue('list_view_script')) {
          var vars = {
              'recordsLimit': this.recordLimit
          };
          var evaluator = new GlideScopedEvaluator();
          var listData = evaluator.evaluateScript(gr, 'list_view_script', vars);
          var index = 0;
          if (listData && (listData.length > 0)) {
              while (index < listData.length && index < this.recordLimit) {
                  if (this._isValidActivityObject(listData[index])) {
                      listViewData.push(listData[index]);
                      index = index + 1;
                  }
              }
          }
      }
      return listViewData;
  },
  /**
   * To get the List view data for activity center widget
   * @output: returns list view data
   **/
  _getNonAdvancedListViewData: function(gr, itemData, sortBy, sortOrder) {
      var listViewDataForSortBy = [];
      var listViewDataForCreatedOn = [];
      var listViewAdvancedData = [];
      var configDataGr = new GlideRecord('sn_ex_sp_activity_config_detail');
      configDataGr.addActiveQuery();
      configDataGr.addQuery('activity_configuration', gr.getValue('sys_id'));
      configDataGr.orderBy('order');
      configDataGr.query();
      while (configDataGr.next()) {
          var configType = configDataGr.getValue('list_view_mapping');
          if (configType === 'BASIC') {
              this._getPrimaryActivityBasicData(configDataGr, listViewDataForSortBy, listViewDataForCreatedOn, itemData, sortBy, sortOrder);
          } else {
              var tempListViewAdvancedData = this._getPrimaryActivityAdvancedData(configDataGr, sortBy, sortOrder);
              if (!tempListViewAdvancedData)
                  continue;
              if (!tempListViewAdvancedData[0].sortFieldValue)
                  listViewAdvancedData = listViewAdvancedData.concat(tempListViewAdvancedData);
              else
                  listViewDataForSortBy = listViewDataForSortBy.concat(tempListViewAdvancedData);

          }
      }
      listViewDataForSortBy.sort(this._customSort);
      listViewDataForCreatedOn.sort(this._customSort);
      return listViewDataForSortBy.concat(listViewDataForCreatedOn).concat(listViewAdvancedData).slice(0, this.recordLimit);
  },
  /**
   * @input: glideRecord of sn_ex_sp_my_item_configuration.
   * @output: returns item count
   **/
  _getAdvancedData: function(gr) {
      var evaluator = new GlideScopedEvaluator();
      var itemCount = evaluator.evaluateScript(gr, 'items_count_script');
      return itemCount;
  },
  /**
   * @input: glideRecord of sn_ex_sp_my_item_configuration.
   * @output: returns item count
   **/
  _getNonAdvancedData: function(gr) {
      var itemSummaryCount = 0;
      var configDataGr = new GlideRecord('sn_ex_sp_activity_config_detail');
      configDataGr.addActiveQuery();
      configDataGr.addQuery('activity_configuration', gr.getValue('sys_id'));
      configDataGr.orderBy('order');
      configDataGr.query();
      while (configDataGr.next() && itemSummaryCount < this.ITEM_SUMMARY_COUNT_LIMIT) {
          itemSummaryCount = itemSummaryCount + this._getItemRecordsCount(configDataGr);
      }
      return itemSummaryCount;
  },
  /**
   * to fetch the primary activity list view data
   * @input: glide record of activity details
   * @input: Summary View activity Json
   * @input: listViewData Json
   **/
  _getPrimaryActivityBasicData: function(configDataGr, listViewDataForSortBy, listViewDataForCreatedOn, itemData, sortBy, sortOrder) {
      var table = configDataGr.getValue('table');
      var tableName = table ? table.toString() : "";
      var condition = configDataGr.getValue('conditions');
      var conditions = condition ? condition.toString() : "";
      var badge = configDataGr.getValue('badge');
      var badgeColor = configDataGr.getValue('badge_color');
      var image = configDataGr.getValue('image');
      var title = configDataGr.getValue('title');
      var description = configDataGr.getValue('description');
      var field1 = configDataGr.getValue('field_1');
      var field2 = configDataGr.getValue('field_2');
      var targetPage = configDataGr.getValue('target_page');
      var gr = new GlideRecord(tableName);
      var isValidSortByField = gr.isValidField(sortBy);
      if (!isValidSortByField) {
          sortBy = 'sys_created_on';
          sortOrder = 'asc';
      }
      var sortByType = this._getFieldType(gr.getElement(sortBy).getED().getInternalType());
      if (sortOrder === 'asc') {
          gr.orderBy(sortBy);
      } else {
          gr.orderByDesc(sortBy);
      }
      gr.addEncodedQuery(conditions);
      gr.setLimit(this.recordLimit);
      gr.query();
      while (gr.next()) {
          var itemDetail = {
              badge: badge ? this._getFormattedFieldValue(gr, badge) : "",
              badgeColor: badgeColor ? badgeColor : "",
              image: image ? this._getFormattedFieldValue(gr, image) : "",
              title: this._getFormattedFieldValue(gr, title),
              description: description ? this._getFormattedFieldValue(gr, description) : "",
              field1Label: field1 ? gr.getElement(field1).getLabel() : "",
              field1Value: field1 ? this._getFormattedFieldValue(gr, field1) : "",
              field2Label: field2 ? gr.getElement(field2).getLabel() : "",
              field2Value: field2 ? this._getFormattedFieldValue(gr, field2) : "",
              itemUrl: "",
              target: "",
              sortFieldValue: gr.getValue(sortBy),
              sortByType: sortByType,
              sortOrder: sortOrder
          };
          if (targetPage && targetPage === 'INTERNAL') {
              itemDetail.itemUrl = '?id=' + configDataGr.internal_link.getDisplayValue().toString();
          } else if (targetPage && targetPage === 'EXTERNAL') {
              itemDetail.itemUrl = configDataGr.getValue('external_link');
              itemDetail.target = '_blank';
          } else {
              itemDetail.itemUrl = itemData.itemUrl;
              itemDetail.target = itemData.target;
          }
          if (isValidSortByField)
              listViewDataForSortBy.push(itemDetail);
          else
              listViewDataForCreatedOn.push(itemDetail);
      }
  },
  _getFieldType: function(type) {
      var glideObjectGr = new GlideRecord('sys_glide_object');
      glideObjectGr.addQuery('name', type);
      glideObjectGr.query();
      if (glideObjectGr.next())
          return glideObjectGr.getValue('scalar_type');
      return '';
  },
  _customSort: function(a, b) {
      var numberTypes = ['decimal', 'float', 'integer', 'longint'];
      var dateTypes = ['date', 'datetime', 'time'];
      if (a.sortOrder === 'desc') {
          var temp = a;
          a = b;
          b = temp;
      }
      if (!a.sortFieldValue)
          return -1;
      if (!b.sortFieldValue)
          return 1;
      if (dateTypes.indexOf(a.sortByType) > -1) {
          var date1, date2;
          try {
              date1 = new GlideDateTime(a.sortFieldValue);
          } catch (exception) {
              return -1;
          }
          try {
              date2 = new GlideDateTime(b.sortFieldValue);
          } catch (exception) {
              return 1;
          }
          return date1.compareTo(date2);
      } else if (numberTypes.indexOf(a.sortByType) > -1) {
          try {
              a.sortFieldValue = Number(a.sortFieldValue);
          } catch (exception) {
              return -1;
          }
          try {
              b.sortFieldValue = Number(b.sortFieldValue);
          } catch (exception) {
              return 1;
          }
      } else {
          a.sortFieldValue = a.sortFieldValue.toLowerCase();
          b.sortFieldValue = b.sortFieldValue.toLowerCase();
      }
      if (a.sortFieldValue < b.sortFieldValue) {
          return -1;
      }
      if (a.sortFieldValue > b.sortFieldValue) {
          return 1;
      }
      return 0;
  },
  /**
   * to fetch the primary activity list view data
   * @input: glide record of activity details
   * @input: listViewData Json
   **/
  _getPrimaryActivityAdvancedData: function(configDataGr, sortBy, sortOrder) {
      var listViewAdvancedData = [];
      if (configDataGr.getValue('card_mapping_script')) {
          var vars = {
              'recordsLimit': this.recordLimit
          };
          var evaluator = new GlideScopedEvaluator();
          evaluator.withEnforcedSecurity(true);
          var data = evaluator.evaluateScript(configDataGr, 'card_mapping_script', vars);
          if (!data || (data.length === 0))
              return;
          var gr = new GlideRecord(configDataGr.getValue('table'));
          var sortByType = gr.isValidField(sortBy) ? this._getFieldType(gr.getElement(sortBy).getED().getInternalType()) : 'string';
          var index = 0;
          while (index < data.length && index < this.recordLimit) {
              var activityObj = data[index];
              if (this._isValidActivityObject(activityObj)) {
                  if (activityObj.sortFieldValue) {
                      activityObj.sortOrder = sortOrder;
                      activityObj.sortByType = sortByType;
                  }
                  listViewAdvancedData.push(activityObj);
                  index = index + 1;
              }
          }
      }
      return listViewAdvancedData;
  },
  /*
   * Validate json coming from Advanced configuration
   */
  _isValidActivityObject: function(activityObj) {
      if (activityObj.hasOwnProperty('badge') || activityObj.hasOwnProperty('badgeColor') || activityObj.hasOwnProperty('image') || activityObj.hasOwnProperty('title') || activityObj.hasOwnProperty('description') || activityObj.hasOwnProperty('field1Label') || activityObj.hasOwnProperty('field1Value') || activityObj.hasOwnProperty('field2Label') || activityObj.hasOwnProperty('field2Value')) {
          return true;
      }
      return false;
  },
  /*
   * Counts total records for the given table and conditions.
   * @input: table for which the records needs to be fetched.
   * @input: conditions that need to be appplied on the table.
   * @output: returns the total count of records.
   */
  _getItemRecordsCount: function(configDataGr) {
      var table = configDataGr.getValue('table');
      var conditions = configDataGr.getValue('conditions');
      var dataGr = new GlideAggregate(table);
      dataGr.addEncodedQuery(conditions);
      dataGr.addAggregate('COUNT');
      dataGr.query();
      if (dataGr.next()) {
          return parseInt(dataGr.getAggregate('COUNT'));
      }
      return 0;
  },
  /*
   * Gets the open tasks count.
   * @output: returns the count of total open tasks .
   */
  getTasksCount: function() {
      var taskCount = new sn_hr_sp.todoPageUtils().getOpenTodoCount(this.ITEM_SUMMARY_COUNT_LIMIT);
      return taskCount;
  },
  /*
   * Gets the list view for Tasks
   * @input: limit, how many records to fetch
   */
  getMyTodos: function(limit) {
      var listViewData = new sn_hr_sp.todoPageUtils().getMyOpenTodos(limit);
      return listViewData;
  },
  /*
   * Gets the open requests count.
   * @output: returns the count of total open requests .
   */
  getRequestsCount: function() {
      var reqCount = 0;
      var ids = [];
      var taskGr;
      var myReqConfigList = this._getMyRequestQueryInfo();
      /* Fixed as part of defect # DEF0279027
  	for (var i = 0; i < myReqConfigList.length; i++) {
          var myReqConfigRecord = myReqConfigList[i];

          var reqIds = this._getMyReqRecQuery(myReqConfigRecord, false);
          ids = reqIds.length > 0 ? ids.concat(reqIds) : ids;
          if (ids.length >= this.ITEM_SUMMARY_COUNT_LIMIT) {
              taskGr = new GlideRecordSecure('task');
              taskGr.addActiveQuery();
              taskGr.addQuery('sys_id', ids);
              taskGr.query();
              reqCount = taskGr.getRowCount();
          }
          if (reqCount >= this.ITEM_SUMMARY_COUNT_LIMIT) {
              break;
          }
      }
      if (reqCount === 0 && ids.length > 0) {
          taskGr = new GlideRecordSecure('task');
          taskGr.addActiveQuery();
          taskGr.addQuery('sys_id', ids);
          taskGr.query();
          reqCount = taskGr.getRowCount();
      }*/
      for (var i = 0; i < myReqConfigList.length && reqCount <= this.ITEM_SUMMARY_COUNT_LIMIT; i++) {
          var myReqConfigRecord = myReqConfigList[i];
          var reqQuery = this._getMyReqRecQuery(myReqConfigRecord, true);
          reqQuery.query();
          if (reqQuery.next())
              reqCount += Number(reqQuery.getAggregate('COUNT'));

      }
      return reqCount;
  },
  /*
   * Gets request filter query details
   * @output: returns the dictionary of requests with details.
   */
  _getMyRequestQueryInfo: function() {
      var myReqConfigList = [];
      var rq_filter = new GlideRecord('request_filter');
      rq_filter.addActiveQuery();
      if (rq_filter.isValidField('applies_to'))
          rq_filter.addQuery('applies_to', 1).addOrCondition('applies_to', 10);
      rq_filter.query();
      while (rq_filter.next()) {
          var myReqConfigRecord = {};
          myReqConfigRecord.table = rq_filter.table_name.toString();
          if (rq_filter.isValidField('table')) {
              myReqConfigRecord.table = rq_filter.table.toString();
          }
          myReqConfigRecord.filter = rq_filter.filter.toString();
          myReqConfigList.push(myReqConfigRecord);
      }
      return myReqConfigList;
  },
  /*
   * Gets request filter record's detail
   * @output: returns request record's sysids and details.
   */
  _getMyReqRecQuery: function(reqConfigRecord, isAggregate) {
      var ids = [];
      var gr;
      var tableName = reqConfigRecord.table;
      if (isAggregate) {
          gr = new GlideAggregate(tableName);
          gr.addAggregate('COUNT');
      } else {
          gr = new GlideRecord(tableName);
      }
      gr.addQuery(reqConfigRecord.filter);
      gr.addQuery('active','=',true);
      if (isAggregate)
          return gr;
      gr.query();
      while (gr.next()) {
          ids.push(gr.sys_id + '');
      }
      return ids;
  },
  /*
   * Gets the sysid's for all the requests
   */
  _getMyRequestSysIds: function() {
      var ids = {};
      var rq_filter = new GlideRecord('request_filter');
      rq_filter.addActiveQuery();
      if (rq_filter.isValidField('applies_to'))
          rq_filter.addEncodedQuery('applies_to=1^ORapplies_to=10');
      rq_filter.query();
      while (rq_filter.next()) {
          var tableName = rq_filter.table_name;
          if (rq_filter.isValidField('table'))
              tableName = rq_filter.table;
          var gr = new GlideRecord(tableName);
          gr.addQuery(rq_filter.filter);
          gr.query();
          while (gr.next()) {
              var portalSettings = {};
              portalSettings.page = rq_filter.portal_page.nil() ? '' : rq_filter.portal_page.getDisplayValue() + '';
              portalSettings.primary_display = rq_filter.primary_display.nil() ? '' : rq_filter.primary_display + '';
              portalSettings.secondary_displays = rq_filter.secondary_display.nil() ? '' : rq_filter.secondary_display + '';
              ids[gr.sys_id + ''] = portalSettings;
          }
      }
      return ids;
  },
  /* Gets the display value for the given field
   * @input: glide record
   * @input: field name
   * @output: display value
   */
  getFieldDisplayValue: function(gr, name) {
      var id = gr.getUniqueValue();
      gr = new GlideRecord(gr.getRecordClassName());
      if (gr.get(id))
          return gr.getDisplayValue(name);
      else
          return "";
  },
  /* Gets the label for the given field
   * @input: glide record
   * @input: field name
   * @output: label
   */
  getFieldLabel: function(gr, name) {
      gr = new GlideRecord(gr.getRecordClassName());
      return gr.getElement(name).getLabel();
  },
  /*
   * Gets the list view data
   * @input: glide record for requests
   * @input: JSON containing card mapping field labels
   * @input: @input: limit, how many records to fetch
   * @output JSON cantaining card mapping values
   */
  _getRequestListViewData: function(gr, myRequestMap, limit) {
      var ids = [];
      var recordIdx = 0;
      while (gr.next() && recordIdx < limit) {
          var requestBadgeColor = "#CBE9FC";
          var reqConfigRecord = myRequestMap[gr.sys_id];
          var portalSettings = {};
          var page = reqConfigRecord.page;
          var primary_display = reqConfigRecord.primary_display;
          var secondary_display = reqConfigRecord.secondary_displays;
          if (gr.getRecordClassName() == 'sc_request') {
              var ritm = new GlideRecord("sc_req_item");
              ritm.addQuery("request", gr.getUniqueValue());
              ritm.query();
              if (ritm.getRowCount() == 0)
                  continue;
              if (ritm.getRowCount() > 1)
                  portalSettings.title = (gs.getMessage("{0} requested items", ritm.getRowCount()));
              else {
                  ritm.next();
                  portalSettings.title = (ritm.cat_item.getDisplayValue() || ritm.getDisplayValue("short_description"));
              }
              page = page ? page : 'sc_request';
              portalSettings.itemUrl = "?id=" + page + "&table=sc_request&sys_id=" + gr.getUniqueValue();
          } else {
              portalSettings.title = (primary_display ? this.getFieldDisplayValue(gr, primary_display) : this.getFieldDisplayValue(gr, 'number'));
              page = page ? page : 'ticket';
              portalSettings.itemUrl = "?id=" + page + "&table=" + gr.getRecordClassName() + "&sys_id=" + gr.getUniqueValue();
          }
          if (secondary_display) {
              var secondaryFields = secondary_display.split(",");
              portalSettings.description = secondaryFields[0] ? this.getFieldDisplayValue(gr, secondaryFields[0]) : "";
              portalSettings.field1Label = secondaryFields[1] ? this.getFieldLabel(gr, secondaryFields[1]) : "";
              portalSettings.field1Value = secondaryFields[1] ? this.getFieldDisplayValue(gr, secondaryFields[1]) : "";
              portalSettings.field2Label = secondaryFields[2] ? this.getFieldLabel(gr, secondaryFields[2]) : "";
              portalSettings.field2Value = secondaryFields[2] ? this.getFieldDisplayValue(gr, secondaryFields[2]) : "";
          } else
              portalSettings.description = (this.getFieldDisplayValue(gr, 'short_description'));
          portalSettings.badge = this.getFieldDisplayValue(gr, 'state');
          portalSettings.badgeTextColor = "#181A1F";
          portalSettings.badgeColor = requestBadgeColor;
          portalSettings.target = "";
          if (this._isValidActivityObject(portalSettings)) {
              ids.push(portalSettings);
              recordIdx++;
          }
      }
      return ids;
  },
  /*
   * Gets the list view for Requests
   * @input: limit, how many records to fetch
   */
  getRequestsData: function(limit) {
      var myRequestMap = this._getMyRequestSysIds();
      var taskIDs = Object.keys(myRequestMap);
      var gr = new GlideRecordSecure('task');
      gr.addQuery('sys_id', taskIDs);
      gr.addActiveQuery();
      gr.orderByDesc('sys_updated_on');
      gr.query();
      return this._getRequestListViewData(gr, myRequestMap, limit);
  },
  /*
   * validates whether activity can be primary or not
   * @input: sys_id, activity configuration
   * @output boolean
   */
  isValidPrimaryActivity: function(recordSysID) {
      var gr = new GlideRecord("sn_ex_sp_activity_config_detail");
      gr.addQuery("activity_configuration", recordSysID);
      gr.addEncodedQuery('activity_configuration=' + recordSysID + '^list_view_mapping=BASIC');
      gr.query();
      while (gr.next()) {
          if (!gr.title)
              return false;
      }
      return true;

  },
  // returns the field display value
  _getFormattedFieldValue: function(gr, column) {
      var colElement = gr.getElement(column);
      var colType = colElement.getED().getInternalType();
      var displayValue = colElement.getDisplayValue();
      if ((colType === 'currency' || colType === 'price') && displayValue) {
          return this._getFormattedData(displayValue, colElement);
      } else if (colType === 'translated_html' && displayValue) {
          return $sp.stripHTML(displayValue);
      }
      return displayValue;
  },
  //returns formatted value up to two decimal places for currency and Price data type
  _getFormattedData: function(value, element) {
      var formattedValue = "";
      var valueLong = parseFloat(element).toFixed(2);
      var firstDigitIndex = value.search(/\d+/);
      if (firstDigitIndex > 0) {
          var currencyCode = value.substr(0, firstDigitIndex);
          formattedValue = '' + currencyCode + valueLong;
      } else {
          var currencyIndex = value.search((/\D*$/));
          currencyCode = value.substr(currencyIndex, value.length - 1);
          formattedValue = '' + valueLong + currencyCode;
      }
      return formattedValue;
  },
  type: 'ActivityConfigurationUtilSNC'
};

Sys ID

1dc8fe7253b03010067cddeeff7b1243

Offical Documentation

Official Docs: