diff --git a/server/AyaNova/kpi/KPIFactory.cs b/server/AyaNova/kpi/KPIFactory.cs index 7f9d206b..71b73997 100644 --- a/server/AyaNova/kpi/KPIFactory.cs +++ b/server/AyaNova/kpi/KPIFactory.cs @@ -11,7 +11,6 @@ namespace AyaNova.KPI { switch (name) { - case "WorkOrderItemLaborQuantitySummary": return new WorkOrderItemLaborQuantitySummary() as IAyaKPI; case "WorkOrderUnscheduledOpenList": @@ -24,6 +23,8 @@ namespace AyaNova.KPI return new WorkOrderOverduePersonalList() as IAyaKPI; case "WorkOrderOverdueAllList": return new WorkOrderOverdueAllList() as IAyaKPI; + case "WorkOrderCreatedCount": + return new WorkOrderCreatedCount() as IAyaKPI; default: throw new System.NotImplementedException($"KPI {name} NOT IMPLEMENTED"); diff --git a/server/AyaNova/kpi/WorkOrderCreatedCount.cs b/server/AyaNova/kpi/WorkOrderCreatedCount.cs new file mode 100644 index 00000000..1eaa7e44 --- /dev/null +++ b/server/AyaNova/kpi/WorkOrderCreatedCount.cs @@ -0,0 +1,69 @@ +using AyaNova.Biz; +using AyaNova.DataList; +using System.Collections.Generic; + +namespace AyaNova.KPI +{ + internal class WorkOrderCreatedCount : 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(); + var woitemtags = options.Criteria["woitemtags"].ToObject>(); + bool woitemtagsany = options.Criteria["woitemtagsany"].ToObject(); + string woTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorder.tags", wotags, wotagsany); + string woItemTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorderitem.tags", woitemtags, woitemtagsany); ; + + _dataQuery = @$"SELECT row_to_json(t) as res from ( + SELECT COUNT(AWORKORDER.ID) Y, + DATE_TRUNC('{interval}',AWORKORDER.createddate) X + FROM AWORKORDER + WHERE {dateWhere} {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 diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 8ac77a75..cb8d8a15 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -232,7 +232,8 @@ "DashboardReminders": "Reminders", "DashboardScheduled": "Scheduled", "DashboardServiceRateQuantityAllUsers":"Servicemenge - alle", - "DashboardOpenCSR":"Open service requests", + "DashboardOpenCSR":"Offene Serviceanfragen", + "DashboardCountWorkOrdersCreated": "Anzahl der erstellten Arbeitsaufträge", "Database": "Datenbank", "DatabaseID": "Datenbank-ID", "DataListSavedFilter": "Listenfilter", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index d3e55055..24e70389 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -231,8 +231,9 @@ "DashboardOverdueAll": "Overdue - all", "DashboardReminders": "Reminders", "DashboardScheduled": "Scheduled", - "DashboardServiceRateQuantityAllUsers":"Service quantity - all", - "DashboardOpenCSR":"Open service requests", + "DashboardServiceRateQuantityAllUsers": "Service quantity - all", + "DashboardOpenCSR": "Open service requests", + "DashboardCountWorkOrdersCreated": "Count of Work orders created", "Database": "Database", "DatabaseID": "Database ID", "DataListSavedFilter": "List filter", @@ -746,16 +747,16 @@ "PickListTemplate": "Autocomplete list template", "PickListTemplates": "Autocomplete list templates", "PM": "Preventive maintenance", - "PMItem": "P.M. item", + "PMItem": "P.M. item", "PMItemExpense": "P.M. item - expense", "PMItemLabor": "P.M. item - labor", "PMItemLoan": "P.M. item - loan unit", - "PMItemOutsideService":"P.M. item - outside service", - "PMItemPart":"P.M. item - part", - "PMItemScheduledUser":"P.M. item - scheduled user", - "PMItemTravel":"P.M. item - travel", - "PMItemTask":"P.M. item - task", - "PMItemUnit":"P.M. item - unit", + "PMItemOutsideService": "P.M. item - outside service", + "PMItemPart": "P.M. item - part", + "PMItemScheduledUser": "P.M. item - scheduled user", + "PMItemTravel": "P.M. item - travel", + "PMItemTask": "P.M. item - task", + "PMItemUnit": "P.M. item - unit", "PMList": "Preventive maintenance", "PMNextServiceDate": "Next service date", "PMNextWoGenerateDate": "Next generate event", @@ -847,16 +848,16 @@ "QuoteDateApproved": "Approved", "QuoteDateSubmitted": "Submitted", "QuoteIntroduction": "Introductory Text", - "QuoteItem": "QuoteItem", + "QuoteItem": "QuoteItem", "QuoteItemExpense": "Quote item - expense", "QuoteItemLabor": "Quote item - labor", "QuoteItemLoan": "Quote item - loan unit", - "QuoteItemOutsideService":"Quote item - outside service", - "QuoteItemPart":"Quote item - part", - "QuoteItemScheduledUser":"Quote item - scheduled user", - "QuoteItemTravel":"Quote item - travel", - "QuoteItemTask":"Quote item - task", - "QuoteItemUnit":"Quote item - unit", + "QuoteItemOutsideService": "Quote item - outside service", + "QuoteItemPart": "Quote item - part", + "QuoteItemScheduledUser": "Quote item - scheduled user", + "QuoteItemTravel": "Quote item - travel", + "QuoteItemTask": "Quote item - task", + "QuoteItemUnit": "Quote item - unit", "QuoteList": "Quotes", "QuotePreparedByID": "Prepared by User", "QuoteQuoteRequestDate": "Requested", @@ -1025,7 +1026,7 @@ "ServiceRateList": "Service rates", "ServiceRateNotes": "Notes", "SetLoginPassword": "Set Login Password", - "Settings":"Settings", + "Settings": "Settings", "ShutDownServer": "Shut down server", "SmallLogo": "Small sized logo", "SmtpAccount": "SMTP server account", @@ -1096,7 +1097,7 @@ "TestToAddress": "Send test to", "ThankYouForEvaluating": "Use the following links to get started exploring AyaNova", "TimedOut": "Timed out", - "TimeSpan":"Time span", + "TimeSpan": "Time span", "TimeSpanDays": "days", "TimeSpanHours": "hours", "TimeSpanMinutes": "minutes", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 591aa444..a3507bb7 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -232,7 +232,8 @@ "DashboardReminders": "Reminders", "DashboardScheduled": "Scheduled", "DashboardServiceRateQuantityAllUsers":"Cantidad de servicio - todo", - "DashboardOpenCSR":"Open service requests", + "DashboardOpenCSR":"Solicitudes de servicio abiertas", + "DashboardCountWorkOrdersCreated": "Recuento de órdenes de trabajo creadas", "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 92dbd2c0..d420fab1 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -232,7 +232,8 @@ "DashboardReminders": "Reminders", "DashboardScheduled": "Scheduled", "DashboardServiceRateQuantityAllUsers":"Quantité de service - tout", - "DashboardOpenCSR":"Open service requests", + "DashboardOpenCSR":"Demandes de service - ouvertes", + "DashboardCountWorkOrdersCreated": "Nombre de bons de travail créés", "Database": "Base de données", "DatabaseID": "ID base de données", "DataListSavedFilter": "Filtre de liste", diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 3057138b..48267874 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -2811,7 +2811,7 @@ namespace AyaNova.Util //public async Task SeedWorkOrderAsync(ILogger log, int count, Level.SeedLevel seedLevel) public async Task SeedWorkOrderAsync(ILogger log, Level.SeedLevel seedLevel) { - //Goal is 5 workorders per day for each level and window + //Goal is 3-6 workorders per day for each level and window //accepting that some days will have way more and some none, it's ok //need a very large window for huge level seeding @@ -2845,11 +2845,12 @@ namespace AyaNova.Util int totalDays = (int)(seedEndWindow - seedStartWindow).TotalDays; - //generate 5 per day starting with oldest seed start window up to seed end window + //generate 3-6 per day starting with oldest seed start window up to seed end window for (int x = 0; x < totalDays; x++) { - for (int perDay = 0; perDay < 4; perDay++) + int thisDayGenerateThisMany=Fake.Random.Int(0,3)+3; + for (int perDay = 0; perDay < thisDayGenerateThisMany; perDay++) { WorkOrder o = new WorkOrder(); o.Notes = Fake.Lorem.Sentence(null, 6);