This commit is contained in:
2021-03-07 23:00:18 +00:00
parent 99f81fb8a2
commit d936ff6f7c
2 changed files with 79 additions and 4 deletions

View File

@@ -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" });

View File

@@ -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