diff --git a/server/AyaNova/DataList/TravelRateDataList.cs b/server/AyaNova/DataList/TravelRateDataList.cs index 10ba77db..fc828b6d 100644 --- a/server/AyaNova/DataList/TravelRateDataList.cs +++ b/server/AyaNova/DataList/TravelRateDataList.cs @@ -86,7 +86,7 @@ namespace AyaNova.DataList TKey = "RateContractRate", FieldKey = "ContractOnly", UiFieldDataType = (int)UiFieldDataType.Bool, - SqlValueColumnName = "aservicerate.contractonly" + SqlValueColumnName = "atravelrate.contractonly" }); FieldDefinitions.Add(new DataListFieldDefinition { TKey = "TravelRateCustom1", FieldKey = "TravelRatecustom1", IsCustomField = true, IsFilterable = false, IsSortable = false, SqlValueColumnName = "atravelrate.customfields" }); diff --git a/server/AyaNova/PickList/TravelRatePickList.cs b/server/AyaNova/PickList/TravelRatePickList.cs index 36aef62d..14c47b8c 100644 --- a/server/AyaNova/PickList/TravelRatePickList.cs +++ b/server/AyaNova/PickList/TravelRatePickList.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 TravelRatePickList : AyaPickList + internal class TravelRatePickList : AyaPickList, IAyaPickListVariant { public TravelRatePickList() { @@ -49,8 +53,79 @@ namespace AyaNova.PickList FieldKey = "Tags", ColumnDataType = UiFieldDataType.Tags, SqlValueColumnName = "atravelrate.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 = "atravelrate.contractonly=false"; + + //variant empty, return all that are not contract rates + if (string.IsNullOrWhiteSpace(variant)) + return defaultNoContractRatesCriteria; + + if (variant == "contractrates") + return "atravelrate.contractonly=true"; + + if (!variant.Contains(":")) + throw new System.ArgumentOutOfRangeException($"TravelRatePickList 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 $"atravelrate.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 $"(atravelrate.contractonly=false) or (atravelrate.id in ({string.Join(",", c.ServiceRateItems.Select(z => z.ServiceRateId).ToArray())}))"; + + } + } + } + return defaultNoContractRatesCriteria; } }//eoc }//eons \ No newline at end of file