diff --git a/server/AyaNova/kpi/KPIFactory.cs b/server/AyaNova/kpi/KPIFactory.cs index 591848b0..8775e6eb 100644 --- a/server/AyaNova/kpi/KPIFactory.cs +++ b/server/AyaNova/kpi/KPIFactory.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using AyaNova.Biz; -using AyaNova.Models; namespace AyaNova.KPI @@ -18,6 +16,8 @@ namespace AyaNova.KPI return new WorkOrderItemLaborQuantitySummary() as IAyaKPI; case "WorkOrderUnscheduledOpenList": return new WorkOrderUnscheduledOpenList() as IAyaKPI; + case "WorkOrderItemLaborQuantityEveryoneSummary": + return new WorkOrderItemLaborQuantityEveryoneSummary() as IAyaKPI; case "CSROpenList": return new CSROpenList() as IAyaKPI; diff --git a/server/AyaNova/kpi/WorkOrderItemLaborQuantityEveryoneSummary.cs b/server/AyaNova/kpi/WorkOrderItemLaborQuantityEveryoneSummary.cs new file mode 100644 index 00000000..24b25b05 --- /dev/null +++ b/server/AyaNova/kpi/WorkOrderItemLaborQuantityEveryoneSummary.cs @@ -0,0 +1,81 @@ +using AyaNova.Biz; +using AyaNova.DataList; +using System.Collections.Generic; + +namespace AyaNova.KPI +{ + internal class WorkOrderItemLaborQuantityEveryoneSummary : IAyaKPI + { + private string _metaQuery = null; + private string _dataQuery = null; + private string _errorMessage = null; + + public AuthorizationRoles AllowedRoles { get => AuthorizationRoles.Tech | AuthorizationRoles.TechRestricted; } + + 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 userid = (int?)options.Criteria["userid"]; + var timeSpan = (string)options.Criteria["timeSpan"]; + var interval = (string)options.Criteria["interval"]; + var techtags = options.Criteria["techtags"].ToObject>(); + var wotags = options.Criteria["wotags"].ToObject>(); + var woitemtags = options.Criteria["woitemtags"].ToObject>(); + + var dateWhere = DataListSqlFilterCriteriaBuilder.DataFilterToColumnCriteria("aworkorderitemlabor.servicestopdate", UiFieldDataType.DateTime, "no-operator", timeSpan, options.ClientTimeStamp); + + string techTagsWhere = null; + if (techtags.Count > 0) + techTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("auser.tags", DataListFilterComparisonOperator.Contains, string.Join(",", techtags)); + + string woTagsWhere = null; + if (wotags.Count > 0) + woTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorder.tags", DataListFilterComparisonOperator.Contains, string.Join(",", wotags)); + + string woItemTagsWhere = null; + if (woitemtags.Count > 0) + woItemTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorderitem.tags", DataListFilterComparisonOperator.Contains, string.Join(",", woitemtags)); + + string userWhere = string.Empty; + if (userid != null) + { + userWhere = $"AND LASTSTATUSID = {userid}"; + } + + + _dataQuery = @$"SELECT row_to_json(t) as res from ( + select SUM(AWORKORDERITEMLABOR.serviceratequantity) y, date_trunc('{interval}',AWORKORDERITEMLABOR.servicestopdate) x + FROM AWORKORDER + LEFT JOIN AWORKORDERITEM ON AWORKORDER.ID = AWORKORDERITEM.WORKORDERID + LEFT JOIN AWORKORDERITEMLABOR ON AWORKORDERITEM.ID = AWORKORDERITEMLABOR.WORKORDERITEMID + WHERE AWORKORDERITEMLABOR.userid = {userId} AND {dateWhere} {techTagsWhere} {woTagsWhere} {woItemTagsWhere} + GROUP BY x + 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