ソースを参照

Added stockholding recalculate method based on stock movements; added stock holding equals method. Fixed recalculate method to include available number.

Kenric Nugteren 1 年間 前
コミット
4b2977418c

+ 29 - 0
prs.classes/Entities/Stock/StockHolding.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Linq.Expressions;
 using InABox.Core;
 using PRSClasses;
@@ -302,5 +303,33 @@ namespace Comal.Classes
             return filter.Combine();
         }
     }
+
+    public static class StockHoldingExtensions
+    {
+        public static bool IsEqualTo(this IStockHolding h1, IStockHolding h2)
+        {
+            return h1.Product.ID == h2.Product.ID
+                && h1.Location.ID == h2.Location.ID
+                && h1.Job.ID == h2.Job.ID
+                && h1.Style.ID == h2.Style.ID
+                && h1.Dimensions.Unit.ID == h2.Dimensions.Unit.ID
+                && h1.Dimensions.Length.IsEffectivelyEqual(h2.Dimensions.Length)
+                && h1.Dimensions.Width.IsEffectivelyEqual(h2.Dimensions.Width)
+                && h1.Dimensions.Height.IsEffectivelyEqual(h2.Dimensions.Height)
+                && h1.Dimensions.Quantity.IsEffectivelyEqual(h2.Dimensions.Quantity)
+                && h1.Dimensions.Weight.IsEffectivelyEqual(h2.Dimensions.Weight);
+        }
+
+        public static void Recalculate(this StockHolding holding, IEnumerable<StockMovement> movements)
+        {
+            movements = movements.AsIList();
+            var units = movements.Sum(x => x.Units);
+            var cost = movements.Select(x => x.Units * x.Cost).Sum();
+            var available = movements.Where(x => x.JobRequisitionItem.ID == Guid.Empty).Sum(x => x.Units);
+            holding.Units = units;
+            holding.AverageValue = units.IsEffectivelyEqual(0.0F) ? 0.0d : cost / units;
+            holding.Available = available;
+        }
+    }
     
 }

+ 25 - 58
prs.desktop/Panels/Products/Locations/StockHoldingGrid.cs

@@ -117,15 +117,10 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
                     .Add(x => x.Product.ID)
                     .Add(x => x.Job.ID)
                     .Add(x => x.Style.ID)
-                    .Add(x => x.Dimensions.Unit.ID)
-                    .Add(x => x.Dimensions.Length)
-                    .Add(x => x.Dimensions.Width)
-                    .Add(x => x.Dimensions.Height)
-                    .Add(x => x.Dimensions.Quantity)
-                    .Add(x => x.Dimensions.Value)
-                    .Add(x => x.Dimensions.UnitSize)
+                    .AddDimensionsColumns(x => x.Dimensions, Dimensions.ColumnsType.Local)
                     .Add(x => x.Units)
                     .Add(x => x.AverageValue)            
+                    .Add(x => x.Available)            
             );
             
             query.Add(
@@ -134,18 +129,14 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
                     .Add(x => x.Product.ID)
                     .Add(x => x.Job.ID)
                     .Add(x => x.Style.ID)
-                    .Add(x => x.Dimensions.Unit.ID)
-                    .Add(x => x.Dimensions.Length)
-                    .Add(x => x.Dimensions.Width)
-                    .Add(x => x.Dimensions.Height)
-                    .Add(x => x.Dimensions.Quantity)
-                    .Add(x => x.Dimensions.Value)
-                    .Add(x => x.Dimensions.UnitSize)
+                    .AddDimensionsColumns(x => x.Dimensions, Dimensions.ColumnsType.Local)
                     .Add(x => x.Units)
                     .Add(x => x.Cost)
+                    .Add(x => x.JobRequisitionItem.ID)
             );
             query.Query();
             var holdings = query.Get<StockHolding>().ToObjects<StockHolding>().ToList();
+            var toDelete = new List<StockHolding>();
             var movements = query.Get<StockMovement>().ToObjects<StockMovement>().ToList();
 
             progress.Report("Processing");
@@ -154,35 +145,9 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
             while (movements.Any())
             {
                 var first = movements.First();
-                var selected = movements.Where(x =>
-                    x.Product.ID == first.Product.ID
-                    && x.Job.ID == first.Job.ID
-                    && x.Style.ID == first.Style.ID
-                    && x.Dimensions.Unit.ID == first.Dimensions.Unit.ID
-                    && x.Dimensions.Length.IsEffectivelyEqual(first.Dimensions.Length)
-                    && x.Dimensions.Width.IsEffectivelyEqual(first.Dimensions.Width)
-                    && x.Dimensions.Height.IsEffectivelyEqual(first.Dimensions.Height)
-                    && x.Dimensions.Quantity.IsEffectivelyEqual(first.Dimensions.Quantity)
-                    && x.Dimensions.Weight.IsEffectivelyEqual(first.Dimensions.Weight)
-                    && x.Dimensions.Value.IsEffectivelyEqual(first.Dimensions.Value)
-                    && String.Equals(x.Dimensions.UnitSize, first.Dimensions.UnitSize)
-                );
-                var units = selected.Aggregate(0.0d, (t, s) => t += s.Units);
-                var cost = selected.Aggregate(0.0d, (t, s) => t += (s.Units * s.Cost));
-                
-                var holding = holdings.FirstOrDefault(x =>
-                    x.Product.ID == first.Product.ID
-                    && x.Job.ID == first.Job.ID
-                    && x.Style.ID == first.Style.ID
-                    && x.Dimensions.Unit.ID == first.Dimensions.Unit.ID
-                    && x.Dimensions.Length.IsEffectivelyEqual(first.Dimensions.Length)
-                    && x.Dimensions.Width.IsEffectivelyEqual(first.Dimensions.Width)
-                    && x.Dimensions.Height.IsEffectivelyEqual(first.Dimensions.Height)
-                    && x.Dimensions.Quantity.IsEffectivelyEqual(first.Dimensions.Quantity)
-                    && x.Dimensions.Weight.IsEffectivelyEqual(first.Dimensions.Weight)
-                    && x.Dimensions.Length.IsEffectivelyEqual(first.Dimensions.Length)
-                    && String.Equals(x.Dimensions.UnitSize, first.Dimensions.UnitSize)
-                );
+                var selected = movements.Where(x => x.IsEqualTo(first)).ToList();
+
+                var holding = holdings.FirstOrDefault(x => x.IsEqualTo(first));
                 if (holding == null)
                 {
                     holding = new StockHolding();
@@ -190,22 +155,22 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
                     holding.Product.ID = first.Product.ID;
                     holding.Style.ID = first.Style.ID;
                     holding.Job.ID = first.Job.ID;
-                    holding.Dimensions.Unit.ID = first.Dimensions.Unit.ID;
-                    holding.Dimensions.Length = first.Dimensions.Length;
-                    holding.Dimensions.Width = first.Dimensions.Width;
-                    holding.Dimensions.Height = first.Dimensions.Height;
-                    holding.Dimensions.Quantity = first.Dimensions.Quantity;
-                    holding.Dimensions.Weight = first.Dimensions.Weight;
-                    holding.Dimensions.Value = first.Dimensions.Value;
-                    holding.Dimensions.UnitSize = first.Dimensions.UnitSize;
+                    holding.Dimensions.CopyFrom(first.Dimensions);
                 }
-                holding.Units = units;
-                holding.AverageValue = units.IsEffectivelyEqual(0.0F) ? 0.0d : cost / units;
+                holding.Recalculate(selected);
 
+                // Removing from the list so that it is not deleted.
                 if (holdings.Contains(holding))
                     holdings.Remove(holding);
 
-                if (holding.IsChanged() && !holding.Units.IsEffectivelyEqual(0.0f))
+                if (holding.Units.IsEffectivelyEqual(0.0f))
+                {
+                    if(holding.ID != Guid.Empty)
+                    {
+                        toDelete.Add(holding);
+                    }
+                }
+                else if (holding.IsChanged())
                 {
                     AddMessage(holding.ID != Guid.Empty ? "updated" : "added");
                     updates.Add(holding);
@@ -213,7 +178,9 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
 
                 movements.RemoveAll(x => selected.Any(s => s.ID == x.ID));
             }
-            foreach (var holding in holdings)
+
+            toDelete.AddRange(holdings);
+            foreach (var holding in toDelete)
                 AddMessage("deleted");
 
             if (updates.Any())
@@ -222,10 +189,10 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
                 new Client<StockHolding>().Save(updates.Where(x => x.IsChanged()), "Updated by Recalculation");
             }
 
-            if (holdings.Any())
+            if (toDelete.Any())
             {
-                progress.Report($"Deleting {holdings.Count} Holdings");
-                new Client<StockHolding>().Delete(holdings, "Removed by Recalculation");
+                progress.Report($"Deleting {toDelete.Count} Holdings");
+                new Client<StockHolding>().Delete(toDelete, "Removed by Recalculation");
             }
 
         });