|
@@ -397,9 +397,21 @@ namespace Comal.Classes
|
|
|
}
|
|
|
base.DoPropertyChanged(name, before, after);
|
|
|
}
|
|
|
+
|
|
|
+ public class JRICostData
|
|
|
+ {
|
|
|
+ public Guid[] ProductIDs { get; set; } = Array.Empty<Guid>();
|
|
|
+
|
|
|
+ public Guid[] SupplierIDs { get; set; } = Array.Empty<Guid>();
|
|
|
+
|
|
|
+ public ProductInstance[] Instances { get; set; } = Array.Empty<ProductInstance>();
|
|
|
+
|
|
|
+ public SupplierProduct[] SupplierProducts { get; set; } = Array.Empty<SupplierProduct>();
|
|
|
+ }
|
|
|
|
|
|
- public static void UpdateCosts(IEnumerable<JobRequisitionItem> items, Dictionary<String,object?> changes)
|
|
|
+ public static void UpdateCosts(IEnumerable<JobRequisitionItem> items, Dictionary<String,object?> changes, JRICostData? data = null)
|
|
|
{
|
|
|
+ var itemList = items.AsIList();
|
|
|
|
|
|
void UpdateValue<TType>(JobRequisitionItem item,Expression<Func<JobRequisitionItem, TType>> property, TType value)
|
|
|
{
|
|
@@ -410,61 +422,105 @@ namespace Comal.Classes
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- var productids = items.Where(x => x.Product.ID != Guid.Empty).Select(x => x.Product.ID).ToArray();
|
|
|
- MultiQuery query = new MultiQuery();
|
|
|
- query.Add(
|
|
|
- new Filter<SupplierProduct>(x=>x.Product.ID).InList(productids),
|
|
|
- Columns.None<SupplierProduct>().Add(x=>x.Product.ID)
|
|
|
- .Add(x=>x.SupplierLink.ID)
|
|
|
- .Add(x=>x.Style.ID)
|
|
|
- .AddDimensionsColumns(x => x.Dimensions, Classes.Dimensions.ColumnsType.Local)
|
|
|
- .Add(x=>x.Job.ID)
|
|
|
- .Add(x=>x.SupplierCode)
|
|
|
- .Add(x=>x.SupplierDescription)
|
|
|
- .Add(x=>x.CostPrice)
|
|
|
- );
|
|
|
- query.Add(
|
|
|
- new Filter<ProductInstance>(x=>x.Product.ID).InList(productids),
|
|
|
- Columns.None<ProductInstance>().Add(x=>x.Product.ID)
|
|
|
- .Add(x => x.Style.ID)
|
|
|
- .AddDimensionsColumns(x => x.Dimensions, Classes.Dimensions.ColumnsType.Local)
|
|
|
- .Add(x => x.NettCost)
|
|
|
- );
|
|
|
- query.Query();
|
|
|
-
|
|
|
- var supplierProducts = query.Get<SupplierProduct>().ToArray<SupplierProduct>();
|
|
|
- var productInstances = query.Get<ProductInstance>().ToArray<ProductInstance>();
|
|
|
-
|
|
|
- foreach (var item in items)
|
|
|
+ var productIDs = items.Where(x => x.Product.ID != Guid.Empty).Select(x => x.Product.ID).ToArray();
|
|
|
+ if(productIDs.Length == 0)
|
|
|
{
|
|
|
- //Check Supplier / Job Specific Pricing
|
|
|
- var supplierProduct = supplierProducts.FirstOrDefault(x =>
|
|
|
- x.Product.ID == item.Product.ID
|
|
|
- && x.SupplierLink.ID == item.Supplier.ID
|
|
|
- && x.Style.ID == item.Style.ID
|
|
|
- && x.Dimensions.Equals(item.Dimensions)
|
|
|
- && x.Job.ID == item.Job.ID);
|
|
|
- if (supplierProduct != null)
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var supplierIDs = items.Where(x => x.Supplier.ID != Guid.Empty).Select(x => x.Supplier.ID).ToArray();
|
|
|
+
|
|
|
+ ProductInstance[] instances;
|
|
|
+ SupplierProduct[] supplierProducts;
|
|
|
+
|
|
|
+ var needProducts = data is null || productIDs.Any(x => !data.ProductIDs.Contains(x));
|
|
|
+ var needSuppliers = data is null || supplierIDs.Any(x => !data!.SupplierIDs.Contains(x));
|
|
|
+
|
|
|
+ if(needProducts || needSuppliers)
|
|
|
+ {
|
|
|
+ MultiQuery query = new MultiQuery();
|
|
|
+ query.Add(
|
|
|
+ new Filter<SupplierProduct>(x=>x.Product.ID).InList(productIDs).And(x => x.SupplierLink.ID).InList(supplierIDs),
|
|
|
+ Columns.None<SupplierProduct>().Add(x=>x.Product.ID)
|
|
|
+ .Add(x=>x.SupplierLink.ID)
|
|
|
+ .Add(x=>x.Style.ID)
|
|
|
+ .AddDimensionsColumns(x => x.Dimensions, Classes.Dimensions.ColumnsType.Local)
|
|
|
+ .Add(x=>x.Job.ID)
|
|
|
+ .Add(x=>x.SupplierCode)
|
|
|
+ .Add(x=>x.SupplierDescription)
|
|
|
+ .Add(x=>x.CostPrice)
|
|
|
+ );
|
|
|
+ if(needProducts)
|
|
|
{
|
|
|
- UpdateValue<double>(item, x => x.UnitCost, supplierProduct.CostPrice);
|
|
|
- continue;
|
|
|
+ query.Add(
|
|
|
+ new Filter<ProductInstance>(x=>x.Product.ID).InList(productIDs),
|
|
|
+ Columns.None<ProductInstance>().Add(x=>x.Product.ID)
|
|
|
+ .Add(x => x.Style.ID)
|
|
|
+ .AddDimensionsColumns(x => x.Dimensions, Classes.Dimensions.ColumnsType.Local)
|
|
|
+ .Add(x => x.NettCost)
|
|
|
+ );
|
|
|
}
|
|
|
-
|
|
|
- // Check Supplier Pricing
|
|
|
- supplierProduct = supplierProducts.FirstOrDefault(x =>
|
|
|
- x.Product.ID == item.Product.ID
|
|
|
- && x.SupplierLink.ID == item.Supplier.ID
|
|
|
- && x.Style.ID == item.Style.ID
|
|
|
- && x.Dimensions.Equals(item.Dimensions)
|
|
|
- && x.Job.ID == Guid.Empty);
|
|
|
- if (supplierProduct != null)
|
|
|
+ query.Query();
|
|
|
+
|
|
|
+ supplierProducts = query.Get<SupplierProduct>().ToArray<SupplierProduct>();
|
|
|
+ if (needProducts)
|
|
|
+ {
|
|
|
+ instances = query.Get<ProductInstance>().ToArray<ProductInstance>();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ instances = data!.Instances;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(data != null)
|
|
|
+ {
|
|
|
+ data.SupplierIDs = supplierIDs;
|
|
|
+ data.SupplierProducts = supplierProducts;
|
|
|
+ if (needProducts)
|
|
|
+ {
|
|
|
+ data.ProductIDs = productIDs;
|
|
|
+ data.Instances = instances;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ supplierProducts = data!.SupplierProducts;
|
|
|
+ instances = data!.Instances;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var item in items)
|
|
|
+ {
|
|
|
+ if(supplierProducts != null)
|
|
|
{
|
|
|
- UpdateValue<double>(item, x => x.UnitCost, supplierProduct.CostPrice);
|
|
|
- continue;
|
|
|
+ //Check Supplier / Job Specific Pricing
|
|
|
+ var supplierProduct = supplierProducts.FirstOrDefault(x =>
|
|
|
+ x.Product.ID == item.Product.ID
|
|
|
+ && x.SupplierLink.ID == item.Supplier.ID
|
|
|
+ && x.Style.ID == item.Style.ID
|
|
|
+ && x.Dimensions.Equals(item.Dimensions)
|
|
|
+ && x.Job.ID == item.Job.ID);
|
|
|
+ if (supplierProduct != null)
|
|
|
+ {
|
|
|
+ UpdateValue<double>(item, x => x.UnitCost, supplierProduct.CostPrice);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check Supplier Pricing
|
|
|
+ supplierProduct = supplierProducts.FirstOrDefault(x =>
|
|
|
+ x.Product.ID == item.Product.ID
|
|
|
+ && x.SupplierLink.ID == item.Supplier.ID
|
|
|
+ && x.Style.ID == item.Style.ID
|
|
|
+ && x.Dimensions.Equals(item.Dimensions)
|
|
|
+ && x.Job.ID == Guid.Empty);
|
|
|
+ if (supplierProduct != null)
|
|
|
+ {
|
|
|
+ UpdateValue<double>(item, x => x.UnitCost, supplierProduct.CostPrice);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Check Specific Product Instance
|
|
|
- var productInstance = productInstances.FirstOrDefault(x =>
|
|
|
+ var productInstance = instances.FirstOrDefault(x =>
|
|
|
x.Product.ID == item.Product.ID
|
|
|
&& x.Style.ID == item.Style.ID
|
|
|
&& x.Dimensions.Equals(item.Dimensions));
|