diff --git a/server/AyaNova/kpi/WorkOrderCompletedOnTimePct.cs b/server/AyaNova/kpi/WorkOrderCompletedOnTimePct.cs new file mode 100644 index 00000000..4598e84b --- /dev/null +++ b/server/AyaNova/kpi/WorkOrderCompletedOnTimePct.cs @@ -0,0 +1,73 @@ +using AyaNova.Biz; +using AyaNova.DataList; +using System.Collections.Generic; + +namespace AyaNova.KPI +{ + internal class WorkOrderCompletedOnTimePct : IAyaKPI + { + private string _metaQuery = null; + private string _dataQuery = null; + private string _errorMessage = null; + + public AuthorizationRoles AllowedRoles + { + get => AuthorizationRoles.BizAdmin | +AuthorizationRoles.BizAdminRestricted | +AuthorizationRoles.ServiceRestricted | +AuthorizationRoles.Service | +AuthorizationRoles.Accounting; + } + + public string MetaQuery => _metaQuery; + public string DataQuery => _dataQuery; + public string ErrorMessage => _errorMessage; + + public void BuildQuery(KPIRequestOptions options, long userId) + { + //build data and meta queries + + //validate criteria exists + if (!options.Criteria.ContainsKey("timeSpan")) + { + _errorMessage = "Missing 'timeSpan' criteria"; + return; + } + + if (!options.Criteria.ContainsKey("interval")) + { + _errorMessage = "Missing 'interval' criteria"; + return; + } + + var timeSpan = (string)options.Criteria["timeSpan"]; + var interval = (string)options.Criteria["interval"]; + var dateWhere = DataListSqlFilterCriteriaBuilder.DataFilterToColumnCriteria("aworkorder.createddate", UiFieldDataType.DateTime, "no-operator", timeSpan, options.ClientTimeStamp); + var wotags = options.Criteria["wotags"].ToObject>(); + bool wotagsany = options.Criteria["wotagsany"].ToObject(); + string woTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorder.tags", wotags, wotagsany); + + _dataQuery = @$"SELECT row_to_json(t) as res from ( + with subq as ( + SELECT COUNT(AWORKORDER.ID) wocount, + DATE_TRUNC('{interval}',AWORKORDER.createddate) x, + (LASTSTATUSID IS NULL OR AWORKORDERSTATUS.COMPLETED = FALSE) z + FROM AWORKORDER + LEFT JOIN AWORKORDERSTATUS ON (AWORKORDER.LASTSTATUSID = AWORKORDERSTATUS.ID) + where AWORKORDER.COMPLETEBYDATE < NOW() AND {dateWhere} {woTagsWhere} + GROUP BY x,z + ) + select X,Z, + wocount / sum(wocount) over (partition by X) * 100 as Y + from subq + order by x ASC + ) t"; + _metaQuery = string.Empty; + // @"SELECT row_to_json(t) as res from ( + // select name from auser where id = 10 + // ) t"; + } + + + }//eoc +}//eons \ No newline at end of file diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index cb8d8a15..7497b83d 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -234,6 +234,7 @@ "DashboardServiceRateQuantityAllUsers":"Servicemenge - alle", "DashboardOpenCSR":"Offene Serviceanfragen", "DashboardCountWorkOrdersCreated": "Anzahl der erstellten Arbeitsaufträge", + "DashboardPctWorkOrderCompletedOnTime": "% Arbeitsaufträge pünktlich abgeschlossen", "Database": "Datenbank", "DatabaseID": "Datenbank-ID", "DataListSavedFilter": "Listenfilter", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 24e70389..d3715ab3 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -234,6 +234,7 @@ "DashboardServiceRateQuantityAllUsers": "Service quantity - all", "DashboardOpenCSR": "Open service requests", "DashboardCountWorkOrdersCreated": "Count of Work orders created", + "DashboardPctWorkOrderCompletedOnTime": "% Work orders completed on time", "Database": "Database", "DatabaseID": "Database ID", "DataListSavedFilter": "List filter", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index a3507bb7..81f59452 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -234,6 +234,7 @@ "DashboardServiceRateQuantityAllUsers":"Cantidad de servicio - todo", "DashboardOpenCSR":"Solicitudes de servicio abiertas", "DashboardCountWorkOrdersCreated": "Recuento de órdenes de trabajo creadas", + "DashboardPctWorkOrderCompletedOnTime": "% de órdenes de trabajo completadas a tiempo", "Database": "Base de datos", "DatabaseID": "Id. de base de datos", "DataListSavedFilter": "Filtro de lista", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index d420fab1..83068797 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -234,6 +234,7 @@ "DashboardServiceRateQuantityAllUsers":"Quantité de service - tout", "DashboardOpenCSR":"Demandes de service - ouvertes", "DashboardCountWorkOrdersCreated": "Nombre de bons de travail créés", + "DashboardPctWorkOrderCompletedOnTime": "% des ordres de travail terminés à temps", "Database": "Base de données", "DatabaseID": "ID base de données", "DataListSavedFilter": "Filtre de liste",