From f806544112657ad07aa702825e3c9706fc288f81 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Sun, 7 Mar 2021 22:32:46 +0000 Subject: [PATCH] --- .../AyaNova/Controllers/ContractController.cs | 2 +- .../AyaNova/PickList/ServiceRatePickList.cs | 82 ++++++++++++++++++- server/AyaNova/biz/ContractBiz.cs | 1 + 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/server/AyaNova/Controllers/ContractController.cs b/server/AyaNova/Controllers/ContractController.cs index 4d3e3d56..1a5ae74f 100644 --- a/server/AyaNova/Controllers/ContractController.cs +++ b/server/AyaNova/Controllers/ContractController.cs @@ -125,7 +125,7 @@ namespace AyaNova.Api.Controllers else return BadRequest(new ApiErrorResponse(biz.Errors)); } - return Ok(ApiOkResponse.Response(new { Concurrency = o.Concurrency })); ; + return Ok(ApiOkResponse.Response(o));//Here return entire object since it's updated by the server in ways the client needs to see } /// diff --git a/server/AyaNova/PickList/ServiceRatePickList.cs b/server/AyaNova/PickList/ServiceRatePickList.cs index 8e765fa4..aab2e273 100644 --- a/server/AyaNova/PickList/ServiceRatePickList.cs +++ b/server/AyaNova/PickList/ServiceRatePickList.cs @@ -1,9 +1,13 @@ using System.Collections.Generic; using Newtonsoft.Json.Linq; using AyaNova.Biz; +using Microsoft.EntityFrameworkCore; +using AyaNova.Models; +using AyaNova.Util; +using System.Linq; namespace AyaNova.PickList { - internal class ServiceRatePickList : AyaPickList + internal class ServiceRatePickList : AyaPickList, IAyaPickListVariant { public ServiceRatePickList() { @@ -43,14 +47,86 @@ namespace AyaNova.PickList IsRowId = true }); - ColumnDefinitions.Add(new AyaPickListFieldDefinition + ColumnDefinitions.Add(new AyaPickListFieldDefinition { TKey = "Tags", FieldKey = "Tags", ColumnDataType = UiFieldDataType.Tags, SqlValueColumnName = "aservicerate.tags" }); - + + } + + public string GetVariantCriteria(string variant) + { + /* + Need variant that shows only rates with contractonly=true (for selection in contract) + Need variant that shows only rates for a specific contract (limit to contract rates contract in effect on workorder) + Need variant that shows all rates *without* any contract rates (no contract workorder) + Need variant that shows all regular rates and also specific contract rates + Perhaps all of these will work with the addition of just the contract id? + can join in the contract table and items and only show if present or whatever the query needs to be + return results are same just the where criteria or server criteria and FROM part of query + As non contract scenario is just all items minus any contract only rates + Contract may or may not be all items plus contract or just contract (different queries) + But it all needs to go through same picklist code for client simplicity + */ + + //No variant = all items + //"contractrates" variant = all items defined as contract only = true + //"contractid:[id]" variant = whatever the contract allows, could be only limited items or all items plus special contract or just all items nothing special + + string defaultNoContractRatesCriteria = "aservicerate.contractonly=false"; + + //variant empty, return all that are not contract rates + if (string.IsNullOrWhiteSpace(variant)) + return defaultNoContractRatesCriteria; + + if (variant == "contractrates") + return "aservicerate.contractonly=true"; + + if (!variant.Contains(":")) + throw new System.ArgumentOutOfRangeException($"ServiceRatePickList variant specified \"{variant}\" not valid"); + + var v = variant.Split(":"); + switch (v[0]) + { + case "contractid": + { + if (string.IsNullOrWhiteSpace(v[1])) + return defaultNoContractRatesCriteria; + long contractId = 0; + if (!long.TryParse(v[1], out contractId)) + return defaultNoContractRatesCriteria; + if (contractId == 0) + return defaultNoContractRatesCriteria; + + //have a contract id, let's pull it and build the rate id's needed + using (AyContext ct = ServiceProviderProvider.DBContext) + { + var c = ct.Contract + .AsNoTracking() + .Where(z => z.Id == contractId) + .FirstOrDefault(); + if (c == null) + return defaultNoContractRatesCriteria; + + //only fetch items that are in the contract rates + if (c.ContractServiceRatesOnly) + return $"aservicerate.id in ({string.Join(",", c.ServiceRateItems.Select(z => z.ServiceRateId).ToArray())})"; + + //contract allows any items plus contract items if exist + //If no service rate items in contract then short circuit to regular list + if (c.ServiceRateItems.Count == 0) + return defaultNoContractRatesCriteria; + + //Ok, a bit more complex then, all non contract rates plus a select few contract rates + return $"(aservicerate.contractonly=false) or (aservicerate.id in ({string.Join(",", c.ServiceRateItems.Select(z => z.ServiceRateId).ToArray())}))"; + + } + } + } + return defaultNoContractRatesCriteria; } }//eoc }//eons \ No newline at end of file diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index 1a4978d8..1b875ad1 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -604,6 +604,7 @@ namespace AyaNova.Biz + ///////////////////////////////////////////////////////////////////// }//eoc