StockHoldingStore.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. using System.Linq;
  5. using System;
  6. using MathNet.Numerics;
  7. namespace Comal.Stores;
  8. // using HoldingDictionary = Dictionary<(Guid product, Guid style, Guid location, Guid job, StockDimensions dimensions), StockHolding>;
  9. public class StockHoldingStore : BaseStore<StockHolding>
  10. {
  11. // public enum Action
  12. // {
  13. // Increase,
  14. // Decrease
  15. // }
  16. //
  17. // public static StockMovement[] LoadMovementData(IStore store, Guid[] ids)
  18. // {
  19. // return store.Provider.Query(
  20. // new Filter<StockMovement>(x => x.ID).InList(ids),
  21. // Columns.None<StockMovement>().Add(x => x.ID)
  22. // .Add(x => x.Location.ID)
  23. // .Add(x => x.Product.ID)
  24. // .Add(x => x.Style.ID)
  25. // .Add(x => x.Job.ID)
  26. // .Add(x => x.Dimensions.Unit.ID)
  27. // .Add(x => x.Dimensions.Quantity)
  28. // .Add(x => x.Dimensions.Height)
  29. // .Add(x => x.Dimensions.Width)
  30. // .Add(x => x.Dimensions.Length)
  31. // .Add(x => x.Dimensions.Weight)
  32. // .Add(x => x.Dimensions.UnitSize)
  33. // .Add(x => x.Dimensions.Value)
  34. // .Add(x => x.JobRequisitionItem.ID)
  35. // .Add(x => x.Units)
  36. // .Add(x => x.Cost)
  37. // ).ToArray<StockMovement>();
  38. // }
  39. //
  40. // public static HoldingDictionary LoadStockHoldings(IStore store, StockMovement[] mvts, HoldingDictionary? holdings = null)
  41. // {
  42. // return StockHoldingExtensions.LoadStockHoldings(
  43. // mvts,
  44. // Columns.None<StockHolding>()
  45. // .Add(x => x.Units)
  46. // .Add(x => x.Qty)
  47. // .Add(x => x.Value)
  48. // .Add(x => x.Available)
  49. // .Add(x => x.Weight)
  50. // .Add(x => x.AverageValue),
  51. // holdings, store.QueryProvider<StockHolding>());
  52. // }
  53. // public static void ModifyHoldings(StockMovement[] mvts, HoldingDictionary holdings, Action action)
  54. // {
  55. // foreach(var mvt in mvts)
  56. // {
  57. // var key = (mvt.Product.ID, mvt.Style.ID, mvt.Location.ID, mvt.Job.ID, mvt.Dimensions);
  58. // if(!holdings.TryGetValue(key, out var holding))
  59. // {
  60. // holding = new();
  61. // holding.Location.ID = mvt.Location.ID;
  62. // holding.Product.ID = mvt.Product.ID;
  63. // holding.Style.ID = mvt.Style.ID;
  64. // holding.Job.ID = mvt.Job.ID;
  65. // holding.Dimensions.CopyFrom(mvt.Dimensions);
  66. // holdings[key] = holding;
  67. // }
  68. //
  69. // var multiplier = action == Action.Increase ? 1F : -1F;
  70. // holding.Units += (multiplier * mvt.Units);
  71. // holding.Qty += (multiplier * mvt.Units * mvt.Dimensions.Value);
  72. // holding.Value += (multiplier * mvt.Units * mvt.Cost);
  73. // holding.Available += (multiplier * (mvt.JobRequisitionItem.ID == Guid.Empty ? mvt.Units : 0.0));
  74. //
  75. // holding.Weight = holding.Qty * holding.Dimensions.Weight;
  76. // holding.AverageValue = holding.Units != 0 ? holding.Value / holding.Units : 0.0F;
  77. // }
  78. // }
  79. // public static void SaveHoldings(IStore store, HoldingDictionary holdings)
  80. // {
  81. // var holdingStore = store.FindSubStore<StockHolding>();
  82. // holdingStore.Delete(
  83. // holdings.Values.Where(x => x.ID != Guid.Empty && x.Units.IsEffectivelyEqual(0.0) && x.Available.IsEffectivelyEqual(0.0)), "");
  84. // holdingStore.Save(
  85. // holdings.Values.Where(x => x.IsChanged() && (!x.Units.IsEffectivelyEqual(0.0) || !x.Available.IsEffectivelyEqual(0.0))), "");
  86. // }
  87. //
  88. // public static void UpdateStockHoldings(IStore store, Guid[] ids, Action action)
  89. // {
  90. // var movements = LoadMovementData(store, ids);
  91. // var holdings = LoadStockHoldings(store, movements);
  92. // ModifyHoldings(movements, holdings, action);
  93. // SaveHoldings(store, holdings);
  94. // }
  95. // /// <summary>
  96. // /// Maintains the Stock Holding Table when manipulating Stock Movements
  97. // /// We only accept an ID, because the rest of the movement is pulled from the database
  98. // /// (slower, but more reliable)
  99. // /// </summary>
  100. // /// <param name="id">The id of the Stock Movement to query</param>
  101. // /// <param name="action">The action to perform (increase / decrease)</param>
  102. // public static void UpdateStockHolding(IStore store, Guid id, Action action)
  103. // {
  104. // var movement = store.Provider.Query(
  105. // new Filter<StockMovement>(x => x.ID).IsEqualTo(id),
  106. // Columns.None<StockMovement>().Add(x => x.ID)
  107. // .Add(x => x.Location.ID)
  108. // .Add(x => x.Product.ID)
  109. // .Add(x => x.Style.ID)
  110. // .Add(x => x.Job.ID)
  111. // .Add(x => x.Dimensions.Unit.ID)
  112. // .Add(x => x.Dimensions.Quantity)
  113. // .Add(x => x.Dimensions.Height)
  114. // .Add(x => x.Dimensions.Width)
  115. // .Add(x => x.Dimensions.Length)
  116. // .Add(x => x.Dimensions.Weight)
  117. // .Add(x => x.Dimensions.UnitSize)
  118. // .Add(x => x.Dimensions.Value)
  119. // .Add(x => x.JobRequisitionItem.ID)
  120. // .Add(x => x.Units)
  121. // .Add(x => x.Cost)
  122. // ).Rows
  123. // .FirstOrDefault()?
  124. // .ToObject<StockMovement>();
  125. // if (movement == null)
  126. // return;
  127. //
  128. // var holding = store.Provider.Query(new Filter<StockHolding>(x => x.Product.ID).IsEqualTo(movement.Product.ID)
  129. // .And(x => x.Location.ID).IsEqualTo(movement.Location.ID)
  130. // .And(x => x.Style.ID).IsEqualTo(movement.Style.ID)
  131. // .And(x => x.Job.ID).IsEqualTo(movement.Job.ID)
  132. // .And(x => x.Dimensions).DimensionEquals(movement.Dimensions),
  133. // Columns.None<StockHolding>().Add(x => x.ID)
  134. // .Add(x => x.Units)
  135. // .Add(x => x.Qty)
  136. // .Add(x => x.Value)
  137. // .Add(x => x.Available)
  138. // ).Rows
  139. // .FirstOrDefault()?
  140. // .ToObject<StockHolding>();
  141. // if (holding == null)
  142. // {
  143. // holding = new();
  144. // holding.Location.ID = movement.Location.ID;
  145. // holding.Product.ID = movement.Product.ID;
  146. // holding.Style.ID = movement.Style.ID;
  147. // holding.Job.ID = movement.Job.ID;
  148. // holding.Dimensions.CopyFrom(movement.Dimensions);
  149. // }
  150. //
  151. // double multiplier = action == Action.Increase ? 1F : -1F;
  152. // holding.Units += (multiplier * movement.Units);
  153. // holding.Qty += (multiplier * movement.Units * movement.Dimensions.Value);
  154. // holding.Value += (multiplier * movement.Units * movement.Cost);
  155. // holding.Available += (multiplier * (movement.JobRequisitionItem.ID == Guid.Empty ? movement.Units : 0.0));
  156. //
  157. // holding.Weight = holding.Qty * holding.Dimensions.Weight;
  158. // holding.AverageValue = holding.Units != 0 ? holding.Value / holding.Units : 0.0F;
  159. //
  160. // // Automagically clean up empty holdings
  161. // if (holding.Units.IsEffectivelyEqual(0.0) && holding.Available.IsEffectivelyEqual(0.0))
  162. // {
  163. // if (holding.ID != Guid.Empty)
  164. // DbFactory.NewProvider(Logger.Main).Delete(holding, "");
  165. // }
  166. // else
  167. // DbFactory.NewProvider(Logger.Main).Save(holding);
  168. // }
  169. }