Name

sn_gd_guidance.GuidedDecisionsGuidanceModelSNC

Description

No description available

Script

var GuidedDecisionsGuidanceModelSNC = Class.create();
GuidedDecisionsGuidanceModelSNC.prototype = {
      initialize: function() {
          this.constantUtil = new sn_gd_guidance.GuidanceConstantsSNC;
          this.GUIDANCE_TABLE = 'ga_guidance';
          this.GUIDANCE_HISTORY_TABLE = 'ga_guidance_history';
          this.GUIDANCE_INSTANCE_EXECUTION_TABLE = 'ga_guidance_instance_execution';
          this.GUIDANCE_INPUT_TABLE = 'ga_guidance_input';
          this.GUIDANCE_OUTPUT_TABLE = 'ga_guidance_output';
          this.GUIDANCE_COMPONENT_TABLE = 'ga_guidance_component';
          this.GUIDANCE_ACTION_TABLE = 'ga_guidance_action';
          this.COL_COMPLETION_MESSAGE = 'completion_message';
          this.COL_ACTION_TAKEN = 'action_taken';
          this.COL_ACTION_BEHAVIOUR = 'action_behaviour';
          this.COL_GUIDANCE_INSTANCE_EXECUTION = 'guidance_instance_execution';
          this.DEFAULT_GUIDANCE_COMPONENT = 'sn-guidance-card-default';
          this.DEFAULT_NOCODE_GUIDANCE_COMPONENT = 'sn-guidance-default-nocode-experience';
          this.NEW_VERSION = "new";
          this.OLD_VERSION = "old";
          this.VAR__M_GA_GUIDANCE_INPUT_ = 'var__m_ga_guidance_input_';
          this.VAR__M_GA_GUIDANCE_OUTPUT_ = 'var__m_ga_guidance_output_';
          this.ResultEnum = {
              "Success": 1,
              "InvalidArguments": 2
          };
          this.guidanceUtils = new sn_gd_guidance.GuidedDecisionsGuidanceUtil();
          this.CONTEXTUAL_SIDE_PANEL = 'contextual_side_panel';
          this.COL_RECOMMENDER = 'recommender';
          this.COL_RECOMMENDED_BY = 'recommended_by';
          this.DEFAULT_NOCODE_GUIDANCE_MACROPONENT = "e592281169ff66772cbf3f64170fb133";
          this.INPUTS = 'INPUTS';
          this.OUTPUTS = 'OUTPUTS';
      },

      createGuidanceInstanceExecutionRecord: function(guidanceProvided, guidanceInputs) {
          var guidanceInstanceExecutionGr = new GlideRecord(this.GUIDANCE_INSTANCE_EXECUTION_TABLE);
          guidanceInstanceExecutionGr.guidance = guidanceProvided;
          guidanceInstanceExecutionGr.insert();

          for (var inputName in guidanceInputs) {
              guidanceInstanceExecutionGr.guidance_inputs[inputName] = guidanceInputs[inputName];
          }

          return guidanceInstanceExecutionGr.update();
      },

      guidanceHistoryExists: function(recommendedBy, recommender, guidanceProvided, guidanceInputs) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.addQuery('recommended_by', recommendedBy);
          guidanceHistoryGr.addQuery('recommender', recommender);
          guidanceHistoryGr.query();
          if (guidanceHistoryGr.next()) {
              return guidanceHistoryGr.sys_id;
          }
          return false;
      },

      createGuidanceHistoryRecord: function(recommendedBy, recommender, guidanceProvided, guidanceInputs) {
          var guidanceInstanceExecutionId = this.createGuidanceInstanceExecutionRecord(guidanceProvided, guidanceInputs);
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.recommended_by = recommendedBy;
          guidanceHistoryGr.recommender = recommender;
          guidanceHistoryGr.guidance_provided = guidanceProvided;
          guidanceHistoryGr.guidance_instance_execution = guidanceInstanceExecutionId;
          guidanceHistoryGr.insert();

          for (var inputName in guidanceInputs) {
              guidanceHistoryGr.guidance_inputs[inputName] = guidanceInputs[inputName];
          }

          return guidanceHistoryGr.update();
      },

      getParsedMessage: function(parameterizedGuidanceMsg, inputObject) {
          if (parameterizedGuidanceMsg) {
              var pattern = /\$\{([a-z0-9_.-?]*)\}/gi; //${?};
              var results = parameterizedGuidanceMsg.match(pattern);
              var fieldProps;
              if (results) {
                  for (var index = 0; index < results.length; index++) {
                      var displayValue, result = results[index];
                      var variable = result.substring(result.lastIndexOf("{") + 1, result.lastIndexOf("}"));
                      fieldProps = this.getFieldProps(variable, inputObject);
                      if (fieldProps.displayValue)
                          parameterizedGuidanceMsg = parameterizedGuidanceMsg.replace(result, fieldProps.displayValue);
                      else
                          parameterizedGuidanceMsg = parameterizedGuidanceMsg.replace(result, "");
                  }
              }
          }
          return parameterizedGuidanceMsg;
      },

      getFieldProps: function(variable, inputObject) {
          var displayValue, labelValue, fieldType, fieldProps = {},
              refProps;
          var firstDotIndex = variable.indexOf(".");
          if (firstDotIndex != -1) {
              var inputName = variable.substring(0, firstDotIndex);
              var dotwalkPath = variable.substring(firstDotIndex + 1, variable.length);
              displayValue = inputObject[inputName].getDisplayValue(dotwalkPath);
              labelValue = inputObject[inputName].getElement(dotwalkPath).getLabel();
              fieldType = inputObject[inputName].getElement(dotwalkPath).getED().getInternalType();
              if (fieldType === 'reference') {
                  refProps = {
                      table: inputObject[inputName].getElement(dotwalkPath).getReferenceTable(),
                      sys_id: inputObject[inputName].getElement(dotwalkPath)
                  };
              }
          } else {
              if (gs.nil(inputObject[variable].sys_id)) {
                  displayValue = inputObject[variable];
                  labelValue = inputObject['inputLabelMap'][variable];
              } else {
                  inputName = variable;
                  displayValue = inputObject[inputName].getDisplayValue();
                  labelValue = inputObject['inputLabelMap'][variable];
                  fieldType = 'reference';
                  refProps = {
                      table: inputObject[inputName].getTableName(),
                      sys_id: inputObject[inputName].sys_id
                  };
              }
          }
          fieldProps['displayValue'] = displayValue;
          fieldProps['labelValue'] = labelValue;
          fieldProps['fieldType'] = fieldType;
          fieldProps['refProps'] = refProps;
          return fieldProps;
      },

      getformDetails: function(sys_id, type) {
          var guidanceFormGr;
          if (type == this.INPUTS)
              guidanceFormGr = new GlideRecord(this.GUIDANCE_INPUT_TABLE);
          else if (type == this.OUTPUTS)
              guidanceFormGr = new GlideRecord(this.GUIDANCE_OUTPUT_TABLE);

          guidanceFormGr.addQuery('model_id', sys_id);
          guidanceFormGr.orderBy('order');
          guidanceFormGr.query();
          var guidanceFormFields = {};
          while (guidanceFormGr.next()) {
              var guidanceFieldName = guidanceFormGr.element;
              guidanceFormFields[guidanceFieldName] = this.getGuidanceFormFields(guidanceFormGr, type);
          }
          return guidanceFormFields;
      },
      getGuidanceFormFields: function(formGr, type, defvalues) {
          var formLabel;
          if (type == this.INPUTS)
              formLabel = this.getTranslatedFieldValue(formGr, this.VAR__M_GA_GUIDANCE_INPUT_);
          else if (type == this.OUTPUTS)
              formLabel = this.getTranslatedFieldValue(formGr, this.VAR__M_GA_GUIDANCE_OUTPUT_);

          var fieldMetaData = {
              id: formGr.sys_id + '',
              label: formLabel + '',
              maxLength: formGr.max_length + '',
              hint: formGr.hint + '',
              name: formGr.element + '',
              isFormField: formGr.is_form_field == true ? true : false,
              recordValue: {
              displayValue: defvalues? defvalues.displayValue  : '',
              value: defvalues? defvalues.value : ''
              },
              dictionary: {
                  type: formGr.internal_type + '',
                  typeLabel: formGr.getDisplayValue('internal_type'),
                  dependentField: null,
                  dependentTable: null,
                  name: formGr.element + '',
                  label: formLabel + '',
                  canWrite: true,
                  canRead: true,
                  internalType: formGr.internal_type + '',
                  isMandatory: formGr.mandatory == true ? true : false,
                  isReadonly: formGr.read_only == true ? true : false,

                  attributes: [{
                      name: "edge_encryption_enabled",
                      value: true
                  }]
              }
          };

          if (formGr.internal_type == "choice")
              this.addChoiceFields(formGr, fieldMetaData);
          if (formGr.internal_type == "reference") {
              this.addReferencFields(formGr, fieldMetaData);
              this.setDeclarativeActions(fieldMetaData);
          }
          return fieldMetaData;
      },

      // parsing preview fields of guidance which use data pill picker
      getParsedMessageFromGuidanceInputs: function(parameterizedMessage, inputObject) {
          if (parameterizedMessage) {
              var pattern = /(\{{[a-z0-9_.-?]*}})/gi; //{{?}}
              var pattern1 = /(\{{gi[a-z0-9_.-?]*)/gi; //{{gi
              var results = parameterizedMessage.match(pattern);
              var expr_start = "{{gi";
              var expr_end = "}}";
              if (results) {
                  for (var index = 0; index < results.length; index++) {
                      var displayValue, result = results[index];
                      var variable = result.substring(expr_start.length + 1, result.lastIndexOf(expr_end));
                      fieldProps = this.getFieldProps(variable, inputObject);
                      if (fieldProps.displayValue)
                          parameterizedMessage = parameterizedMessage.replace(result, fieldProps.displayValue);
                      else
                          parameterizedMessage = parameterizedMessage.replace(result, "");
                  }
              }

              var incompleteParsedInput = parameterizedMessage.match(pattern1);
              if (incompleteParsedInput) {
                  parameterizedMessage = parameterizedMessage.replace(incompleteParsedInput, "");
              }
          }
          return parameterizedMessage;
      },

      getGuidanceMessage: function(guidanceHistoryGr) {
          var parameterizedGuidanceMsg = guidanceHistoryGr.guidance_provided.guidance_message;
          var inputObject = {};

          try {
              if (guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION && guidanceHistoryGr.guidance_instance_execution)
                  inputObject = this.guidanceUtils.createGuidanceInputObject(guidanceHistoryGr.guidance_instance_execution.guidance_inputs);
              else
                  inputObject = this.guidanceUtils.createGuidanceInputObject(guidanceHistoryGr.guidance_inputs);

              return this.getParsedMessage(parameterizedGuidanceMsg, inputObject);
          } catch (err) {
              gs.error("Error parsing guidance message: " + JSON.stringify(err));
              return "";
          }
      },

      createGuidanceFromHistory: function(guidanceHistoryGr) {
          if (!this.guidanceUtils.userHasReadAccess(guidanceHistoryGr[this.constantUtil.COL_GUIDANCE_INSTANCE_EXECUTION], this.constantUtil.COL_GUIDANCE_INPUTS))
              return false;
  		var guidanceComponentGr = new GlideRecord(this.GUIDANCE_COMPONENT_TABLE);
          guidanceComponentGr.get('guidance', guidanceHistoryGr.guidance_provided);
          var guidanceProps = this.getGuidanceProps(guidanceHistoryGr, guidanceComponentGr);
          var guidanceActions = this.getGuidanceActions(guidanceHistoryGr);
          var actionTakenData = this.getActionTakenData(guidanceHistoryGr);
          var guidanceOutput = this.getGuidanceOutputs(guidanceHistoryGr);
          var guidanceMessage = this.getGuidanceMessage(guidanceHistoryGr);
          var errorMessage = this.getGuidanceErrorMessage(guidanceHistoryGr.recommender, guidanceHistoryGr.recommended_by);
          var guidance = {
              value: guidanceHistoryGr.guidance_provided.sys_id + '',
              uniqueId: guidanceHistoryGr.getUniqueValue(),
              displayValue: guidanceHistoryGr.getDisplayValue('guidance_provided.title') + '',
              state: guidanceHistoryGr.state + '',
              renderTag: this.getRenderTag(guidanceHistoryGr, guidanceComponentGr),
              experienceMacroponent: this.getExperienceMacroponent(guidanceHistoryGr, guidanceComponentGr),
              guidanceMessage: guidanceMessage ? guidanceMessage : '',
              guidanceProperties: guidanceProps,
              guidanceActions: guidanceActions,
              actionData: actionTakenData,
              guidanceOutputs: guidanceOutput,
              createDate: guidanceHistoryGr.sys_created_on + '',
              version: guidanceHistoryGr.guidance_provided.version + '',
              recommender: guidanceHistoryGr.recommender + '',
              recommendedBy: guidanceHistoryGr.recommended_by + '',
              errorMessage: errorMessage + ''
          };
          this.applyFixForOldInprogressGuidance(guidanceHistoryGr, guidance);
          return guidance;
      },

      getRenderTag: function(guidanceHistoryGr, guidanceComponentGr) {
          // if there is an experience macroponent available then renderTag is not needed.
          if (guidanceComponentGr.getValue('experience_macroponent'))
              return null;	
          if (guidanceComponentGr.getValue('component'))
              return guidanceComponentGr.component.tag + '';
          if (guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION)
              return this.DEFAULT_NOCODE_GUIDANCE_COMPONENT;

          return this.DEFAULT_GUIDANCE_COMPONENT;
      },

      applyFixForOldInprogressGuidance: function(guidanceHistoryGr, guidance) {
          if (guidanceHistoryGr.related_record) //Need to change this condition based on version field in future
          {
              var guidanceComponentGr = new GlideRecord(this.GUIDANCE_COMPONENT_TABLE);
              guidanceComponentGr.get('guidance', guidanceHistoryGr.guidance_provided);
              guidance.version = this.OLD_VERSION;
              if (guidance.value == "636ecca277530010d7159b71a9106192") //Handle propose resolution custom experience in preview guidance framework.
                  guidance.renderTag = "sn-guidance-resolution-card";
              else if (gs.nil(guidanceComponentGr.component))
                  guidance.renderTag = this.DEFAULT_GUIDANCE_COMPONENT;
          }
      },
      getExecutedGuidanceAction: function(guidanceInstanceExecution) {
          var guidanceInstanceExecutionGr = new GlideRecord('ga_guidance_instance_execution');
          guidanceInstanceExecutionGr.get(guidanceInstanceExecution);
          return guidanceInstanceExecutionGr.getValue('action_taken');
      },
      getGuidanceActions: function(guidanceHistoryGr) {
          var executedAction = this.getExecutedGuidanceAction(guidanceHistoryGr.getValue('guidance_instance_execution'));
          var guidanceActionGr = new GlideRecord('ga_guidance_action');
          guidanceActionGr.addQuery('guidance', guidanceHistoryGr.guidance_provided);
          guidanceActionGr.query();
          var guidanceActions = {};
          while (guidanceActionGr.next()) {
              var guidanceActionName = guidanceActionGr.getValue('action_name') + '';
              guidanceActions[guidanceActionName] = this.getGuidanceActionObj(guidanceActionGr, executedAction);
          }
          return guidanceActions;
      },

      getGuidanceActionObj: function(guidanceActionGr, executedAction) {
          var guidanceAction = {
              action_label: guidanceActionGr.getDisplayValue('action_label') + '',
              action_name: guidanceActionGr.getValue('action_name') + '',
              display_position: guidanceActionGr.getValue('display_position') + '',
              action_sys_id: guidanceActionGr.getUniqueValue() + '',
              is_executed: executedAction == guidanceActionGr.getUniqueValue(),
              completion_message: guidanceActionGr.getDisplayValue('completion_message') + '',
              primary: guidanceActionGr.getDisplayValue('primary') === "true",
              action_behaviour: guidanceActionGr.getDisplayValue('action_behaviour'),
          };
          return guidanceAction;
      },

      getCallToActions: function(guidanceRecord) {
          var guidanceActionGr = new GlideRecord('ga_guidance_action');
          guidanceActionGr.addQuery('guidance', guidanceRecord.getUniqueValue());
          guidanceActionGr.orderBy('order');
          guidanceActionGr.orderBy('sys_created_on');

          var guidanceActions = [];
          var primaryPresent = false;
          guidanceActionGr.query();
          while (guidanceActionGr.next()) {
              guidanceActions.push(this.getCallToActionsObj(guidanceActionGr));
              if (!primaryPresent)
                  primaryPresent = (guidanceActionGr.primary == true);
          }

          if (guidanceActions.length && !primaryPresent) {
              guidanceActions[0].primary = "true";
          }
          return guidanceActions;
      },

      getCallToActionsObj: function(guidanceActionGr) {
          var action_behavior = !guidanceActionGr.getValue('action_behaviour') ? this.CONTEXTUAL_SIDE_PANEL :
              guidanceActionGr.getValue('action_behaviour');
          var order = !guidanceActionGr.getValue('order') ? 100 :
              guidanceActionGr.getValue('order');
          var callToAction = {
              label: gs.nil(guidanceActionGr.getDisplayValue('preview_label')) ? guidanceActionGr.getDisplayValue('action_label') + '' : guidanceActionGr.getDisplayValue('preview_label') + '',
              name: guidanceActionGr.getValue('action_name') + '',
              id: guidanceActionGr.getUniqueValue() + '',
              actionBehavior: action_behavior + '',
              primary: guidanceActionGr.getDisplayValue('primary') + '',
              order: order + '',
              completionMessage: guidanceActionGr.getDisplayValue('completion_message') + ''
          };
          return callToAction;
      },

      getGuidanceObject: function(recommendedBy, recommender) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.addQuery("recommended_by", recommendedBy);
          guidanceHistoryGr.addQuery("recommender", recommender);
          if (recommender == 'ga_decision_tree_execution')
              guidanceHistoryGr.addQuery("state", "IN", "waiting,in_progress,in_error,error_skipped");
          guidanceHistoryGr.orderByDesc('sys_created_on');
          guidanceHistoryGr.setLimit(1);
          guidanceHistoryGr.query();
          if (guidanceHistoryGr.next()) {
              return this.createGuidanceFromHistory(guidanceHistoryGr);
          }
          return {};
      },

      getGuidanceObjectBySysId: function(historyId) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          if (guidanceHistoryGr.get(historyId)) {
              return this.createGuidanceFromHistory(guidanceHistoryGr);
          }
          return {};
      },

      getGuidanceOutputs: function(guidanceHistoryGr) {
          var outputs = guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION ? guidanceHistoryGr.guidance_instance_execution.guidance_outputs : guidanceHistoryGr.guidance_outputs;
          var ret = {};
          for (var variable in outputs) {
              if (variable != "sys_meta" && variable != "sys_id") {
                  var tempOutputValue = gs.nil(outputs[variable]) ? '' : outputs[variable].getRefRecord();
                  if (this.isValidRecord(tempOutputValue) && !tempOutputValue.canRead()) {
                      ret[variable] = '';
                  } else
                      ret[variable] = outputs[variable];
              }
          }
          ret.meta = this.getGuidanceOutputVarsForHistory(guidanceHistoryGr, outputs);
          return ret;
      },
      getGuidanceOutputVarsForHistory: function(guidanceHistoryGr, guidanceOutputObj) {
          var grGuidanceOutputsGr = new GlideRecord('ga_guidance_output');
          grGuidanceOutputsGr.addQuery('model_id', guidanceHistoryGr.guidance_provided);
          grGuidanceOutputsGr.orderBy('order');
          grGuidanceOutputsGr.query();
          var guidanceOutputMetaArr = [];
          while (grGuidanceOutputsGr.next()) {
              var tableName = grGuidanceOutputsGr.reference + '';
              var variableName = grGuidanceOutputsGr.element + '';
              var guidanceOutputLabel = this.getTranslatedFieldValue(grGuidanceOutputsGr, this.VAR__M_GA_GUIDANCE_OUTPUT_);

              var defValue = grGuidanceOutputsGr.default_value;
              var tempDefaultValue = gs.nil(defValue) ? '' : defValue.getRefRecord();
              if (this.isValidRecord(tempDefaultValue) && !tempDefaultValue.canRead())
                  defValue = '';

              var guidanceOutputMeta = {
                  varName: variableName,
                  varType: grGuidanceOutputsGr.internal_type + '',
                  varTableName: tableName,
                  varlabel: guidanceOutputLabel + '',
                  varDefaultValue: defValue + '',
                  varOrder: grGuidanceOutputsGr.order + '',
                  varActive: grGuidanceOutputsGr.active + '',
                  varDisplayValue: this.getDisplayNameForReference(tableName, guidanceOutputObj[variableName] + '')
              };
              guidanceOutputMetaArr.push(guidanceOutputMeta);
          }
          return guidanceOutputMetaArr;
      },
      getDisplayNameForReference: function(tableName, sysId) {
          if (gs.nil(tableName) || gs.nil(sysId))
              return '';
          var gr = new GlideRecord(tableName);
          var displayNameColumnName = gr.getDisplayName();
          gr.get(sysId);
          if (!gr.canRead())
              return '';
          var displayNameValue = gr[displayNameColumnName] + '';
          return displayNameValue;
      },
      getAllExecutions: function(executionId, decisionTreeExecutionTable) {
          var executions = [];
          var decisionTreeGr = new GlideRecord(decisionTreeExecutionTable);
          decisionTreeGr.get(executionId);
          var parent;
          if (gs.nil(decisionTreeGr.parent)) {
              parent = executionId;
              executions.push(executionId);
          } else {
              parent = decisionTreeGr.parent;
              executions.push(parent);
          }
          var executionsGr = new GlideRecord(decisionTreeExecutionTable);
          executionsGr.addQuery("parent", parent);
          executionsGr.query();
          while (executionsGr.next()) {
              executions.push(executionsGr.sys_id + '');
          }
          return executions.join(',');
      },

      getAllGuidanceObjects: function(recommendedBy, recommender) {
          //recommendedBy for this function takes a string of comma seperated sysIds of recommending table
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.addQuery("recommended_by", "IN", this.getAllExecutions(recommendedBy, recommender) + '');
          guidanceHistoryGr.addQuery('recommender', recommender);
          guidanceHistoryGr.addQuery('state', 'IN', 'completed, skipped');
          guidanceHistoryGr.orderBy('sys_created_on');
          guidanceHistoryGr.query();
          var guidances = {};

          while (guidanceHistoryGr.next()) {
              var currentRecommendedBy = guidanceHistoryGr.recommended_by + '';
              var guidanceHistoryRecords = guidances[currentRecommendedBy] ? guidances[currentRecommendedBy] : [];
              guidanceHistoryRecords.push({
                  recommender: recommender,
                  guidanceObj: this.createGuidanceFromHistory(guidanceHistoryGr)
              });

              guidances[currentRecommendedBy] = guidanceHistoryRecords;

          }
          return guidances;
      },

      getGuidanceProps: function(guidanceHistoryGr, guidanceComponentGr) {
          var guidanceProps = {};
          var guidanceInputGr = new GlideRecord(this.GUIDANCE_INPUT_TABLE);
          guidanceInputGr.addQuery('model', guidanceHistoryGr.guidance_provided);
          guidanceInputGr.orderBy('order');
          guidanceInputGr.query();
          guidanceProps['associated_table'] = this.getCurrentPropObj('associated_table', guidanceHistoryGr.guidance_provided.related_table);

          guidanceProps['associated_record'] = this.getCurrentPropObj('associated_record', guidanceHistoryGr.related_record);
          guidanceProps['form_fields'] = this.getCurrentPropObj('form_fields', guidanceHistoryGr.guidance_provided.fields);

          var guidanceInputFormFields = {};
          while (guidanceInputGr.next()) {
              var guidanceInputName = guidanceInputGr.element;
              this.updateParentRecord(guidanceHistoryGr, guidanceInputName, guidanceProps);

              if (!gs.nil(guidanceInputGr.is_form_field) && guidanceInputGr.is_form_field && guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION && guidanceHistoryGr.guidance_instance_execution) {
                  guidanceInputFormFields[guidanceInputName] = this.getGuidanceInputFormFieldsMetaData(guidanceInputGr, guidanceHistoryGr);
              } else {
                  var guidanceInputValue = guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION && guidanceHistoryGr.guidance_instance_execution ? (guidanceHistoryGr.guidance_instance_execution.guidance_inputs[guidanceInputName] || '') : (guidanceHistoryGr.guidance_inputs[guidanceInputName] || '');

                  var tempGuidanceInputValue = gs.nil(guidanceInputValue) ? '' : guidanceInputValue.getRefRecord();
                  if (this.isValidRecord(tempGuidanceInputValue) && !tempGuidanceInputValue.canRead()) {
                      guidanceInputValue = '';
                  }

                  guidanceProps[guidanceInputName] = this.getCurrentPropObj(guidanceInputName, guidanceInputValue);

              }
          }

          guidanceProps['guidance_input_form_fields'] = guidanceInputFormFields;
          for (var propName in guidanceComponentGr.component_properties) {
              if (propName != "sys_meta" && propName != "sys_id") {
                  guidanceProps[guidanceInputName] = this.getCurrentPropObj(propName,
                      guidanceComponentGr.component_properties[propName]);
              }
          }
          return guidanceProps;
      },

      updateParentRecord: function(guidanceHistoryGr, guidanceInputName, guidanceProps) {
          var isTask = (guidanceInputName == 'task' || guidanceInputName == 'Task' || guidanceInputName == 'u_task');
          if (isTask && guidanceHistoryGr.related_record) {
              var inputValue = guidanceHistoryGr.guidance_inputs[guidanceInputName];
              guidanceProps['parent_table'] = this.getCurrentPropObj('parent_table', inputValue.sys_class_name);
              guidanceProps['parent_record'] = this.getCurrentPropObj('parent_record', inputValue);
          }
      },
      getTranslatedFieldValue: function(inputGr, prefix) {
          var sessionLanguage = gs.getSession().getLanguage();
          if (sessionLanguage != "en") {
              var documentationGr = new GlideRecord("sys_documentation");
              documentationGr.addQuery('name', prefix + inputGr.model);
              documentationGr.addQuery('element', inputGr.element + '');
              documentationGr.addQuery('language', sessionLanguage);
              documentationGr.query();
              if (documentationGr.next())
                  return documentationGr.label + '';
          }
          return inputGr.label + '';
      },

      isValidRecord: function(record) {
          return record && typeof record.isValidRecord === 'function' && record.isValidRecord();
      },

      getGuidanceInputFormFieldsMetaData: function(inputGr, guidanceHistoryGr) {

          var value = guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION && guidanceHistoryGr.guidance_instance_execution ? (guidanceHistoryGr.guidance_instance_execution.guidance_inputs[inputGr.element] || '') : (guidanceHistoryGr.guidance_inputs[inputGr.element] || '');

          var displayValue;
          if (guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION && guidanceHistoryGr.guidance_instance_execution)
              displayValue = guidanceHistoryGr.guidance_instance_execution.guidance_inputs[inputGr.element].getDisplayValue();
          else
              displayValue = guidanceHistoryGr.guidance_inputs[inputGr.element].getDisplayValue() || '';
          var tempValue = gs.nil(value) ? '' : value.getRefRecord();
          var isAccessible = true;
          if (this.isValidRecord(tempValue) && !tempValue.canRead()) {
              value = '';
              displayValue = '';
              isAccessible = false;
          }

          var defvalues = {
              displayValue: displayValue + '',
              value: value + ''
      }
  	var inputMetaData = this.getGuidanceFormFields(inputGr,this.INPUTS,defvalues);
          return inputMetaData;
      },
      setDeclarativeActions: function(inputMetaData) {
          inputMetaData['declarativeUiActions'] = [{
              name: 'reference_search',
              icon: 'search',
              label: 'Search for record',
              dependency: '',
              requiresValue: false,
              order: 0,
              actionComponent: 'sn-declarative-reference-search',
              actionAttributes: null,
              actionDispatch: null,
              actionPayload: null,
              actionType: 'action_component',
              tooltip: '',
              conditions: ''
          }];
      },
      addChoiceFields: function(inputGr, inputMetaData) {
          var choiceTable = inputGr.choice_table + '';
  		var choiceField = inputGr.choice_field + '';
  		var useExistingChoices = choiceTable != '' && choiceField != '';
  		var name = (useExistingChoices) ? choiceTable : this.VAR__M_GA_GUIDANCE_INPUT_ + inputGr.model;
  		var element = (useExistingChoices) ? choiceField : inputGr.element + '';
  		var choiceGr = new GlideRecord('sys_choice');
  		choiceGr.addQuery('name', name);
  		choiceGr.addQuery('element', element);
  		choiceGr.addQuery('inactive', false);
  		choiceGr.addQuery('language', gs.getSession().getLanguage());
  		choiceGr.orderBy('sequence');
  		choiceGr.query();
  		var choices = [];
  		//Add 'None' choice when 'Dropdown with none' selected
  		if (inputGr.getValue('choice') == 1) {
  			var choice = {
  				displayValue: gs.getMessage("-- None --"),
  				value: " "
  			};
  			choices.push(choice);
  		}
          while (choiceGr.next()) {
              var coice = {
                  displayValue: choiceGr.label + '',
                  value: choiceGr.value + ''
              };
              choices.push(coice);
          }

          inputMetaData['choices'] = choices;
      },

      addReferencFields: function(inputGr, inputMetaData) {
          inputMetaData['reference'] = inputGr.reference + '';
          inputMetaData['referenceQualifier'] = inputGr.reference_qual + '';
          inputMetaData['referenceKey'] = inputGr.reference_key + '';
          inputMetaData['useReferenceQualifier'] = inputGr.use_reference_qualifier + '';
          inputMetaData['dependent'] = inputGr.dependent + '';
          inputMetaData['dependentOnField'] = inputGr.dependent_on_field + '';
          inputMetaData['refAutoCompleter'] = null;
          inputMetaData['refAcOrderBy'] = null;
          inputMetaData['refAcColumns'] = null;
          inputMetaData['refAcColumnsSearch'] = false;
          inputMetaData['refAcDisplayValue'] = inputGr.display + '';
          inputMetaData['refQualElements'] = null;
          inputMetaData['refContributions'] = null;
          inputMetaData['isDynamicCreate'] = inputGr.dynamic_creation + '';
          inputMetaData['isReferenceScriptableTable'] = false;
          inputMetaData['inputTable'] = this.VAR__M_GA_GUIDANCE_INPUT_.concat(inputGr.model + '');
      },

      getCurrentPropObj: function(propName, propValue) {
          var prop = {
              name: propName + '',
              value: propValue + ''
          };
          return prop;
      },

      getActionTakenData: function(guidanceHistoryGr) {
          var resultData = {
              table: guidanceHistoryGr.result_object,
              id: guidanceHistoryGr.result_object_id
          };
          var actionTakenData = {
              resultData: resultData
          };
          return actionTakenData;
      },

      updateGHStateUsingRecommender: function(recommendedBy, recommender, state) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          if (recommender == 'ga_decision_tree_execution')
              guidanceHistoryGr.addQuery("recommended_by", "IN", this.getAllExecutions(recommendedBy, recommender) + '');
          else
              guidanceHistoryGr.addQuery('recommended_by', recommendedBy);
          guidanceHistoryGr.addQuery('recommender', recommender);
          guidanceHistoryGr.orderByDesc('sys_created_on');
          guidanceHistoryGr.setLimit(1);
          guidanceHistoryGr.query();
          if (guidanceHistoryGr.next()) {
              guidanceHistoryGr.state = state;
              guidanceHistoryGr.update();
          }
      },

      updateGuidanceHistoryState: function(guidanceHistoryGr, state, errorMsg) {
          guidanceHistoryGr.setValue('state', state);
          if (errorMsg) {
              guidanceHistoryGr.setValue('error_message', errorMsg);
          }
          guidanceHistoryGr.update();
      },

      updateRelatedRecord: function(sysId, currentTask) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.get(sysId);
          guidanceHistoryGr.setValue('related_record', currentTask);
          guidanceHistoryGr.update();
      },

      updateResultObject: function(sysId, resultObject, resultObjectId) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.get(sysId);
          guidanceHistoryGr.setValue('result_object', resultObject);
          guidanceHistoryGr.setValue('result_object_id', resultObjectId);
          guidanceHistoryGr.update();
      },
      getGuidanceOutputByName: function(guidanceHistoryGr, output_name) {
          return guidanceHistoryGr.guidance_provided.version == this.NEW_VERSION ? guidanceHistoryGr.guidance_instance_execution.guidance_outputs[output_name] : guidanceHistoryGr.guidance_outputs[output_name];
      },
      getGuidanceInstanceExecutionSysId: function(recommender, recommendedBy) {
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.addQuery('recommended_by', recommendedBy);
          guidanceHistoryGr.addQuery('recommender', recommender);
          guidanceHistoryGr.orderByDesc('sys_created_on');
          guidanceHistoryGr.setLimit(1);
          guidanceHistoryGr.query();
          if (guidanceHistoryGr.next()) {
              if (guidanceHistoryGr.state == "waiting") {
                  guidanceHistoryGr.state = "in_progress";
                  guidanceHistoryGr.update();
              }
              return guidanceHistoryGr.guidance_instance_execution;
          } else
              return "";
      },
      updateGuidanceInstanceExecution: function(recommender, recommendedBy, action_sys_id, inputData) {
          //Triggers Guidance Automation Flow Executor.
          var guidanceUtil = new sn_gd_guidance.GuidedDecisionsGuidanceUtilSNC();
          var recommenderhandler = guidanceUtil.getRecommenderHandler(recommender);

          if (!recommenderhandler.isGuidanceActionAllowed(recommendedBy)) {
              return {
                  actionStatus: this.constantUtil.ERROR,
                  statusCode: this.constantUtil.ERROR_405,
                  errorMessage: this.constantUtil.ERROR_405_MESSAGE
              };
          }
          var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
          guidanceHistoryGr.addQuery("recommended_by", recommendedBy);
          guidanceHistoryGr.addQuery("recommender", recommender);
          if (recommender == 'ga_decision_tree_execution')
              guidanceHistoryGr.addQuery("state", "IN", "waiting,in_progress");
          guidanceHistoryGr.orderByDesc('sys_created_on');
          guidanceHistoryGr.setLimit(1);
          guidanceHistoryGr.query();
          if (guidanceHistoryGr.next()) {

              if (guidanceHistoryGr.state == "waiting") {
                  guidanceHistoryGr.state = "in_progress";
                  guidanceHistoryGr.update();
              }
          }

          var sysId = this.getGuidanceInstanceExecutionSysId(recommender, recommendedBy);
          var glideRecord = new GlideRecord(this.GUIDANCE_INSTANCE_EXECUTION_TABLE);
          glideRecord.get(sysId);
          if (glideRecord.isValidRecord()) {
              if (inputData) {
                  Object.keys(inputData).forEach(function(f) {
                      glideRecord.guidance_inputs[f] = inputData[f];
                  });
              }
              glideRecord.action_taken = action_sys_id;
              glideRecord.update();
              var ghr = this.getGuidanceHistoryRecord(recommender, recommendedBy);
              if (ghr.state == 'in_error') {
                  return {
                      guidanceDetails: {
                          state: 'in_error',
                          errorMessage: ghr.error_message
                      }
                  }
              }
          return this.ResultEnum.Success;
      } else {
          return this.ResultEnum.InvalidArguments;
      }

  },

  getGuidanceHistoryRecord: function(recommender, recommendedBy) {
      var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
      guidanceHistoryGr.addQuery(this.COL_RECOMMENDED_BY, recommendedBy);
      guidanceHistoryGr.addQuery(this.COL_RECOMMENDER, recommender);
      guidanceHistoryGr.orderByDesc('sys_created_on');
      guidanceHistoryGr.setLimit(1);
      guidanceHistoryGr.query();
      if (guidanceHistoryGr.next()) {
          return guidanceHistoryGr;
      }
      return '';
  },

  executeGuidanceActionSubAutomationPlan: function(guidanceInstanceExecutionGr) {
      var guidanceInputs = new Object();
      for (var input in guidanceInstanceExecutionGr.guidance_inputs) {
          if (input != "sys_meta" && input != "sys_id") {
              var inputValue = guidanceInstanceExecutionGr.guidance_inputs[input];
              if (gs.nil(inputValue) || gs.nil(inputValue.sys_id))
                  guidanceInputs[input] = inputValue + '';
              else {
                  guidanceInputs[input] = gs.nil(inputValue) ? '' : inputValue.getRefRecord();
              }
          }
      }
      var flowInputsGlideVar = guidanceInstanceExecutionGr.action_taken.flow_input_value;
      var parsedFlowInputs = new sn_gd_guidance.GuidanceVariablesPillParser().parseGuidanceActionFlowInputsPill(flowInputsGlideVar, guidanceInputs);
      var flowName = guidanceInstanceExecutionGr.action_taken.sub_automation_plan.sys_scope.scope + "." + guidanceInstanceExecutionGr.action_taken.sub_automation_plan.internal_name;

      var guidanceOutputs = sn_fd.FlowAPI.executeSubflowQuick(flowName, parsedFlowInputs);
      return guidanceOutputs;
      //this.updateGuidanceInstanceExecGuidanceOutputs(guidanceOutputs,guidanceInstanceExecutionGr);
  },

  updateGuidanceInstanceExecGuidanceOutputs: function(guidanceOutputs, guidanceInstanceExecutionGr) {

      var guidanceOutputsGlideVar = guidanceInstanceExecutionGr.action_taken.guidance_output_value;
      var parsedGuidanceOutputs = new sn_gd_guidance.GuidanceVariablesPillParser().parseGuidanceActionVarsPill(guidanceOutputsGlideVar, guidanceOutputs);
      for (var output in guidanceInstanceExecutionGr.guidance_outputs) {
          if (output != "sys_meta" && output != "sys_id")
              guidanceInstanceExecutionGr.guidance_outputs[output] = parsedGuidanceOutputs[output];
      }
      guidanceInstanceExecutionGr.update();
  },

  updateGuidanceHistoryOutputsFromGuidanceInstanceExec: function(guidanceHistoryGr) {
      for (var output in guidanceHistoryGr.guidance_instance_execution.guidance_outputs) {
          if (output != "sys_meta" && output != "sys_id")
              guidanceHistoryGr.guidance_outputs[output] = guidanceHistoryGr.guidance_instance_execution.guidance_outputs[output];
      }
      guidanceHistoryGr.update();
  },

  getGuidanceOutputsForCardView: function(guidanceHistoryGr) {
      var grGuidanceOutputsGr = new GlideRecord('ga_guidance_output');
      grGuidanceOutputsGr.addQuery('model_id', guidanceHistoryGr.guidance_provided);
      grGuidanceOutputsGr.query();
      var guidanceOutputOrders = {};
      while (grGuidanceOutputsGr.next()) {
          var variableName = grGuidanceOutputsGr.element + '';
          guidanceOutputOrders[variableName] = grGuidanceOutputsGr.order + '';
      }
      var guidanceOutputArr = [];
      for (var key in guidanceHistoryGr.guidance_outputs) {
          if (key == 'sys_meta' || key == 'sys_id')
              continue;
          var guidanceOutput = {};
          guidanceOutput['label'] = guidanceHistoryGr.guidance_outputs[key].getLabel();
          var value = guidanceHistoryGr.guidance_outputs[key].getRefRecord();
          if (gs.nil(value)) {
              var fieldType = guidanceHistoryGr.guidance_outputs[key].getED().getInternalType();
              guidanceOutput['value'] = {
                  'type': fieldType != 'html' ? 'string' : fieldType,
                  'value': guidanceHistoryGr.guidance_outputs[key].getDisplayValue()
              };
          } else {
              var refProps = {
                  table: guidanceHistoryGr.guidance_outputs[key].getReferenceTable(),
                  sys_id: guidanceHistoryGr.guidance_outputs[key] + ''
              };
              guidanceOutput['value'] = {
                  "type": "text-link",
                  "label": guidanceHistoryGr.guidance_outputs[key].getDisplayValue(),
                  "href": "javascript:void(0)",
                  "underlined": "true",
                  "opensWindow": "false",
                  "append-to-payload": refProps
              };
          }
          guidanceOutput['order'] = guidanceOutputOrders[key];
          guidanceOutputArr.push(guidanceOutput);
      }
      guidanceOutputArr.sort(function(a, b) {
          return a.order - b.order;
      });
      return guidanceOutputArr;
  },

  getGuidanceActionDetails: function(guidanceHistoryGr) {
      var guidanceInstanceExecutionGr = new GlideRecord(this.GUIDANCE_INSTANCE_EXECUTION_TABLE);
      guidanceInstanceExecutionGr.get(guidanceHistoryGr.getValue(this.COL_GUIDANCE_INSTANCE_EXECUTION));
      var guidanceActionGr = new GlideRecord(this.GUIDANCE_ACTION_TABLE);
      guidanceActionGr.get(guidanceInstanceExecutionGr.getValue(this.COL_ACTION_TAKEN));
      var completionMessage = guidanceActionGr.getDisplayValue(this.COL_COMPLETION_MESSAGE);
      var actionBehaviour = guidanceActionGr.getValue(this.COL_ACTION_BEHAVIOUR);
      var actionDetails = {
          completionMessage: completionMessage,
          actionBehaviour: actionBehaviour
      };
      return actionDetails;
  },

  getGuidanceDetails: function(recommender, recommendedBy) {
      var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
      guidanceHistoryGr.addQuery('recommended_by', recommendedBy);
      guidanceHistoryGr.addQuery('recommender', recommender);
      guidanceHistoryGr.query();
      var actionDetails = {};
      if (guidanceHistoryGr.next()) {
          var guidanceOutputs = this.getGuidanceOutputsForCardView(guidanceHistoryGr);
          actionDetails['actionOutputs'] = guidanceOutputs;
      }
      return actionDetails;
  },

  getGuidanceErrorMessage: function(recommender, recommendedBy) {
      var guidanceHistoryGr = new GlideRecord(this.GUIDANCE_HISTORY_TABLE);
      guidanceHistoryGr.addQuery('recommended_by', recommendedBy);
      guidanceHistoryGr.addQuery('recommender', recommender);
      guidanceHistoryGr.query();
      if (guidanceHistoryGr.next()) {
          return guidanceHistoryGr.error_message;
      }
      return "";
  },
  getExperienceMacroponent: function(guidanceHistoryGr, guidanceComponentGr) {
      if (!gs.nil(guidanceComponentGr.experience_macroponent))
          return guidanceComponentGr.experience_macroponent + '';

      return null;
  },
  getPreviewExperience: function(guidanceRecord) {
      var guidanceComponentGr = new GlideRecord(this.GUIDANCE_COMPONENT_TABLE);
      guidanceComponentGr.addQuery('guidance', guidanceRecord.getUniqueValue());
      guidanceComponentGr.setLimit(1);
      guidanceComponentGr.query();
      if (guidanceComponentGr.next()) {
          return guidanceComponentGr.getValue('preview_macroponent');
      }

      return '';
  },
  getGuidanceComponentById: function(guidanceComponentId){
  	var guidanceGr = new GlideRecordSecure('ga_guidance_component');
  	guidanceGr.addQuery('guidance', guidanceComponentId);
  	guidanceGr.setLimit(1);
  	guidanceGr.query();
  	
  	if(guidanceGr.next()) {
  		return guidanceGr;
  	}
  	
  	return false;
  },

  createGuidanceComponent: function(guidanceId){
  	var guidanceGr = this.getGuidanceComponentById(guidanceId)
  	if(!guidanceGr){
  		guidanceGr = new GlideRecordSecure('ga_guidance_component');
  		guidanceGr.initialize();
  	}
  	return guidanceGr;
  },

  guidanceHasComponent: function (guidance) {
  	var gr = new GlideRecord('ga_guidance_component');
  	gr.addQuery('guidance', guidance.getUniqueValue());
  	gr.addNotNullQuery('preview_macroponent');
  	gr.setLimit(1);
  	gr.query();
  	return gr.next();
  },
  guidanceHasExperienceComponent: function(guidance){
  	var gr = new GlideRecord('ga_guidance_component');
  	gr.addQuery('guidance', guidance.getUniqueValue());
  	gr.addNotNullQuery('experience_macroponent');
  	gr.setLimit(1);
  	gr.query();
  	return gr.next();
  },

  createDetailExperience: function(guidance, macroponent, screen){
  	var newExperience = this.createGuidanceComponent(guidance.getUniqueValue());
  	newExperience.setValue('experience_screen', screen);
  	newExperience.setValue('experience_macroponent', macroponent);
  	newExperience.setValue('guidance', guidance.getUniqueValue());
  	var guidanceComponent = newExperience.update();
  },

  createPreviewExperience: function(guidance, macroponent, screen){
  	var newPreviewExperience = this.createGuidanceComponent(guidance.getUniqueValue());
  	newPreviewExperience.setValue('preview_screen', screen);
  	newPreviewExperience.setValue('preview_macroponent', macroponent);
  	newPreviewExperience.setValue('guidance', guidance.getUniqueValue());
  	var guidanceComponent = newPreviewExperience.update();
  },


  type: 'GuidedDecisionsGuidanceModelSNC'
};

Sys ID

c90a97d053330010df5dddeeff7b12df

Offical Documentation

Official Docs: