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.TagFilterToSqlCriteriaHelper("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, (aworkorder.laststatusid is not null AND AWORKORDERSTATUS.COMPLETED = TRUE AND laststate.created < aworkorder.completebydate) Z FROM AWORKORDER LEFT JOIN AWORKORDERSTATUS ON (AWORKORDER.LASTSTATUSID = AWORKORDERSTATUS.ID) LEFT JOIN LATERAL (SELECT created FROM aworkorderstate WHERE aworkorderstate.workorderid = aworkorder.id ORDER BY aworkorderstate.created DESC LIMIT 1) AS laststate ON TRUE where AWORKORDER.COMPLETEBYDATE < NOW() AND {dateWhere} {woTagsWhere} GROUP BY x,z ) select X,Z, ROUND(wocount / sum(wocount) over (partition by X) * 100,2) 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