Bladeren bron

Improvements to JRI costing functionality.

Kenric Nugteren 9 maanden geleden
bovenliggende
commit
168d780e02

+ 105 - 49
prs.classes/Entities/Job/Requisitions/JobRequisitionItem.cs

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

+ 5 - 1
prs.desktop/Panels/Jobs/Requisitions/JobRequisitionItemGrid.cs

@@ -339,15 +339,19 @@ internal class JobRequisitionItemGrid : DynamicDataGrid<JobRequisitionItem>, IMa
         result.Qty = 1;
         return result;
     }
+
+    private JobRequisitionItem.JRICostData? _jriCostData;
     
     protected override void OnAfterEditorValueChanged(DynamicEditorGrid? grid, JobRequisitionItem[] items, AfterEditorValueChangedArgs args, Dictionary<string, object?> changes)
     {
         base.OnAfterEditorValueChanged(grid, items, args, changes);
         if (args.ColumnName.Equals("Product.ID") || args.ColumnName.Equals("Dimensions") || args.ColumnName.StartsWith("Dimensions.") || args.ColumnName.Equals("Style.ID") || args.ColumnName.Equals("Supplier.ID"))
         {
+            _jriCostData ??= new();
             JobRequisitionItem.UpdateCosts(
                 items, 
-                changes
+                changes,
+                data: _jriCostData
             );
         }
     }