logo

Filling in process metrics using scripts

In ELMA you can create metrics/KPIs of a process or a process instance.

This article describes scripts for filling in metric values using process scripts.

For example, the time of processing a request in a business process is specified by a user in the context variable ProcessingTime. This time must be written to the process instance metric RequestProcessingTime.

To do so, add the following script to the business process:

// Get the process instance metric and cast it to the type P_ProcessWithMetrics_IM
var metricValues = context.WorkflowInstance.MetricValues as P_ProcessWithMetrics_IM; 
// Set the value of the ProcessingTime context variable to the process instance metric
metricValues.RequestProcessingTime = Convert.ToInt32(context.ProcessingTime); 
// Save the process instance metric
metricValues.Save();

You can find the type, to which to cast the metric in the business process settings:

Another task that may arise is saving the number of process starts for a personal metric.

In this case, you work with a process metric instead of a process instance metric.

Create a process metric with the following parameters:

The script for filling in the process metric:

var processMetrics = context.WorkflowInstance.Process.ProcessMetrics.EntityProperties.Cast<ProcessMetric>();
if(processMetrics != null){
    //search a process metric by name
    var isp = processMetrics.FirstOrDefault(pm => pm.Name == "NumberOfStarts");
     if (isp != null){     
        //if the process metric is personal, specify the context variable that will store the user who started the process; otherwise, instead of context.Executor use null          
        SaveMetricValue(isp, context.Executor);
    }
}

Also, add the metric value saving method to the process script:

Script with PublicAPI

Note
Documentation on PublicAPI is available here
Attention
The script below is relevant for ELMA up to 3.12.1 inclusive.

Namespaces:

using EleWise.ELMA.Workflow.Models;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Services;
using EleWise.ELMA.KPI.Common.Interfaces;
using EleWise.ELMA.Logging;

Script text:

private void SaveMetricValue(ProcessMetric metric, User responsible)
        {
            var filter = PublicAPI.Processes.Objects.ProcessMetricValue.Filter().Responsible(responsible).ProcessMetricUid(metric.Uid);
                       
            if (metric.UsePeriodicity && metric.PeriodicityUid.HasValue)
            {
                var periodService = Locator.GetServiceNotNull<IPeriodicityService>();
                var periodicity = periodService.Load(metric.PeriodicityUid.Value);
                if (periodicity != null)
                {
                    var period = periodService.GetPeriod(periodicity, DateTime.Now);
                    filter = filter.PeriodStart(period.First).PeriodEnd(period.Second);
                }
            }
                        
            var ispValue = filter.Find().FirstOrDefault();
            if (ispValue != null)
            {
                double doubleValue;
                if (double.TryParse(ispValue.Value.ToString(), out doubleValue))
                {
                    PublicAPI.Processes.Objects.ProcessMetricValue. SetMetricValue(metric,doubleValue + 1,DateTime.Now,responsible);
                } else
                {
                    Logger.Log.Error(String.Format("Error calculating the {0} KPI", metric.DisplayName));
                }
            } else
            {
                PublicAPI.Processes.Objects.ProcessMetricValue. SetMetricValue(metric,1,DateTime.Now,responsible);
            }
        }

Script without PublicAPI

Namespaces:

using EleWise.ELMA.Workflow.Models;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Services;
using EleWise.ELMA.KPI.Common.Interfaces;
using EleWise.ELMA.Workflow.Managers;
using EleWise.ELMA.Logging;
Script text:
private void SaveMetricValue(ProcessMetric metric, IUser responsible){
    var filter = InterfaceActivator.Create<IProcessMetricValueFilter>();     filter.DisableSecurity = true;
     filter.Responsible = responsible;
     filter.ProcessMetricUid = metric.Uid;
                      
     if(metric.UsePeriodicity && metric.PeriodicityUid.HasValue){
         var periodService = Locator.GetServiceNotNull<IPeriodicityService>();
         var periodicity = periodService.Load(metric.PeriodicityUid.Value);
         if (periodicity != null){
             var period = periodService.GetPeriod(periodicity, DateTime.Now);
             filter.PeriodStart = period.First;
             filter.PeriodEnd = period.Second;
         }
     }
                       
     IProcessMetricValue ispValue = ProcessMetricValueManager.Instance.Find(filter, FetchOptions.All).FirstOrDefault();
     if (ispValue != null){
         double doubleValue;
         if (double.TryParse(ispValue.Value.ToString(), out doubleValue)){
             ProcessMetricValueManager.Instance.MetricSave(metric, responsible, doubleValue + 1);
         } else {
             Logger.Log.Error(String.Format("Error calculating the {0} KPI", metric.DisplayName));
         }
     }
     else{
         ProcessMetricValueManager.Instance.MetricSave(metric, responsible, 1);
     }
}