Browse Source

Fix to StockForecastOrdering screen

Kenric Nugteren 5 days ago
parent
commit
bd4d86f71e

+ 4 - 0
prs.desktop/Panels/Reservation Management/ReservationManagementItemGrid.cs

@@ -519,7 +519,9 @@ public class ReservationManagementItemGrid : DynamicDataGrid<JobRequisitionItem>
                     double unitCost = _pljri.UnitCost;
                     var dimensions = _pljri.Dimensions.Copy();
                     if (!String.IsNullOrWhiteSpace(_pljri.Dimensions.Unit.Conversion))
+                    {
                         DimensionUtils.ConvertDimensions(dimensions, ref qtyrequired, ref unitCost, Client<ProductDimensionUnit>.Provider);
+                    }
                     
                     var _locations = _movementquery.Result.Where(x => x.JobRequisitionItem.ID == _pljri.ID)
                         .GroupBy(x => x.Location.ID);
@@ -721,7 +723,9 @@ public class ReservationManagementItemGrid : DynamicDataGrid<JobRequisitionItem>
             Progress.ShowModal("Standardising Dimensions", progress =>
             {
                 if (jri.ConvertDimensions(x => x.Dimensions, x => x.Qty, x => x.UnitCost, Client<ProductDimensionUnit>.Provider))
+                {
                     Client.Save(jri, "Converted Dimensions in Reservation Management Screen");
+                }
             });
             Refresh(false,true);
 

+ 9 - 6
prs.desktop/Panels/Stock Forecast/OrderScreen/StockForecastOrderingGrid.cs

@@ -726,10 +726,9 @@ public class StockForecastOrderingGrid : DynamicItemsListGrid<StockOrderingItem>
 
         var d = new StockDimensions();
         d.CopyFrom(supplierProduct.Dimensions);
-        var qtyreq = 1.0;
-        var cost = -.0;
-        DimensionUtils.ConvertDimensions(d, ref qtyreq, ref cost, (f,c) => Client.Query(f,c));
-        return qtyreq * req;
+        var (result, _) = DimensionUtils.ConvertDimensions(d, 1.0, 0, (f,c) => Client.Query(f,c));
+        req /= result;
+        return req;
     }
 
     private SupplierProduct? SelectSupplierProduct(IEnumerable<SupplierProduct> supplierProducts, StockOrderingItem item)
@@ -745,10 +744,14 @@ public class StockForecastOrderingGrid : DynamicItemsListGrid<StockOrderingItem>
                 return supplierProducts.MinBy(x => x.CostPrice * Math.Ceiling(CalculateSupplierProductRequiredQuantity(item, x, true)));
 
             case SupplierProductOrderStrategy.LowestUnitPrice:
-                return supplierProducts.MinBy(x => x.CostPrice / x.Dimensions.Value);
+                return supplierProducts
+                    .OrderBy(x => x.Dimensions.Value * Math.Ceiling(CalculateSupplierProductRequiredQuantity(item, x, true))) // Pick the least overstock if multiple SP have the same unit price.
+                    .MinBy(x => x.CostPrice / x.Dimensions.Value);
             
             case SupplierProductOrderStrategy.LowestOverstock:
-                return supplierProducts.MinBy(x => x.Dimensions.Value * Math.Ceiling(CalculateSupplierProductRequiredQuantity(item, x, true)));
+                return supplierProducts
+                    .OrderBy(x => x.CostPrice / x.Dimensions.Value) // Ensure we pick the cheapest if multiple SP have the same overstock
+                    .MinBy(x => x.Dimensions.Value * Math.Ceiling(CalculateSupplierProductRequiredQuantity(item, x, true)));
                 
             default:
                 return null;

+ 2 - 10
prs.desktop/Panels/Stock Forecast/StockForecastGrid.cs

@@ -15,8 +15,6 @@ using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using PRSDimensionUtils;
 using StockMovement = Comal.Classes.StockMovement;
-using Org.BouncyCastle.Asn1.Mozilla;
-using jdk.nashorn.@internal.ir;
 
 namespace PRSDesktop;
 
@@ -1015,7 +1013,6 @@ public class StockForecastGrid : DynamicItemsListGrid<StockForecastItem>, IDataM
                     var holding = holdingrow.ToObject<StockHolding>();
                     holding.ConvertDimensions(x => x.Dimensions, x => x.Units, x => x.AverageValue,
                         Client<ProductDimensionUnit>.Provider);
-                    //holding.Units = DimensionUtils.ConvertDimensions(holding.Dimensions, holding.Units, (f,c) => Client.Query(f,c));
 
                     var item = GetItem(GetKey(holding.Product.ID, holding.Style.ID, holding.Dimensions));
                     if(holding.Job.ID == Guid.Empty)
@@ -1035,18 +1032,15 @@ public class StockForecastGrid : DynamicItemsListGrid<StockForecastItem>, IDataM
                 {
                     poi.ConvertDimensions(x => x.Dimensions, x => x.Qty, x => x.Cost,
                         Client<ProductDimensionUnit>.Provider);
-                    //poi.Qty = DimensionUtils.ConvertDimensions(poi.Dimensions, poi.Qty, (f,c) => Client.Query(f,c));
                 }
                 
                 var allocations = results.Get<PurchaseOrderItemAllocation>();
                 foreach(var allocationrow in allocations.Rows)
                 {
                     var allocation  = allocationrow.ToObject<PurchaseOrderItemAllocation>();
-                    var d = allocation.Item.Dimensions.Copy();
-                    var q = allocation.Quantity;
-                    var c = allocation.Item.Cost;
-                    DimensionUtils.ConvertDimensions(d, ref q, ref c, Client<ProductDimensionUnit>.Provider);
+
                     // POIAs are already converted where necessary, so we don't have to update the quantities again, just update the dimensions
+                    DimensionUtils.ConvertDimensions(allocation.Item.Dimensions, allocation.Quantity, allocation.Item.Cost, Client<ProductDimensionUnit>.Provider);
                     
                     var key = new ItemKey(
                         allocation.Item.Product.ID,
@@ -1092,7 +1086,6 @@ public class StockForecastGrid : DynamicItemsListGrid<StockForecastItem>, IDataM
                 {
                     var bomItem = bomItemRow.ToObject<JobBillOfMaterialsItem>();
                     bomItem.ConvertDimensions(x => x.Dimensions, x => x.Quantity, x => x.UnitCost, Client<ProductDimensionUnit>.Provider);
-                    //bomItem.Quantity = DimensionUtils.ConvertDimensions(bomItem.Dimensions, bomItem.Quantity, (f,c) => Client.Query(f,c));
                     var key = GetKey(bomItem.Product.ID, bomItem.Style.ID, bomItem.Dimensions);
                     var item = GetItem(key);
 
@@ -1105,7 +1098,6 @@ public class StockForecastGrid : DynamicItemsListGrid<StockForecastItem>, IDataM
                     var movement = mvtrow.ToObject<StockMovement>();
                     movement.ConvertDimensions(x => x.Dimensions, x => x.Units, x => x.Cost,
                         Client<ProductDimensionUnit>.Provider);
-                    //movement.Units = DimensionUtils.ConvertDimensions(movement.Dimensions, movement.Units, (f,c) => Client.Query(f,c));
 
                     var item = GetItem(GetKey(movement.Product.ID, movement.Style.ID, movement.Dimensions));
                     if (movement.Job.ID == Guid.Empty)

+ 21 - 8
prs.stores/Utilities/DimensionUtils.cs

@@ -83,6 +83,17 @@ public static class DimensionUtils
         return DoConvertDimensions(dimensions, ref quantity, ref cost, query);
     }
 
+    public static (double quantity, double cost) ConvertDimensions(IDimensions dimensions, double quantity, double cost, Func<Filter<ProductDimensionUnit>?, Columns<ProductDimensionUnit>, CoreTable> reload)
+    {
+        DoConvertDimensions(dimensions, ref quantity, ref cost, reload);
+        return (quantity, cost);
+    }
+    public static (double quantity, double cost) ConvertDimensions(IDimensions dimensions, double quantity, double cost, IQueryProvider<ProductDimensionUnit> query)
+    {
+        DoConvertDimensions(dimensions, ref quantity, ref cost, query);
+        return (quantity, cost);
+    }
+
     /// <summary>
     /// Convert the dimensions on a <see cref="PurchaseOrderItem"/>, and adjust
     /// its <see cref="PurchaseOrderItem.Cost"/> and <see
@@ -111,15 +122,17 @@ public static class DimensionUtils
         IQueryProvider<ProductDimensionUnit> reload)
     where T : BaseObject
     {
-        var _dimprop = CoreUtils.GetPropertyValue(sender, CoreUtils.GetFullPropertyName(dimensions, ".")) as IDimensions;
-        var _qtyprop = CoreUtils.GetFullPropertyName(quantity, ".");
-        var _qtyval = Convert.ToDouble(CoreUtils.GetPropertyValue(sender, _qtyprop));
-        var _costprop = CoreUtils.GetFullPropertyName(cost, ".");
-        var _costval = Convert.ToDouble(CoreUtils.GetPropertyValue(sender, _costprop));
-        if (DoConvertDimensions(_dimprop, ref _qtyval, ref _costval, reload))
+        var dimensionsProp = DatabaseSchema.PropertyStrict(dimensions);
+        var qtyProp = DatabaseSchema.PropertyStrict(quantity);
+        var costProp = DatabaseSchema.PropertyStrict(cost);
+
+        var dimVal = (IDimensions)dimensionsProp.Getter()(sender);
+        var qtyVal = Convert.ToDouble(qtyProp.Getter()(sender));
+        var costVal = Convert.ToDouble(costProp.Getter()(sender));
+        if (DoConvertDimensions(dimVal, ref qtyVal, ref costVal, reload))
         {
-            CoreUtils.SetPropertyValue(sender, _qtyprop, _qtyval);
-            CoreUtils.SetPropertyValue(sender, _costprop, _costval);
+            qtyProp.Setter()(sender, qtyVal);
+            costProp.Setter()(sender, costVal);
             return true;
         }
         return false;