Update_8_23.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using System.Linq.Expressions;
  2. using Comal.Classes;
  3. using InABox.Configuration;
  4. using InABox.Core;
  5. using InABox.Database;
  6. using NPOI.SS.Formula.Functions;
  7. using Columns = InABox.Core.Columns;
  8. namespace PRS.Shared.Database_Update_Scripts;
  9. internal class Update_8_23 : DatabaseUpdateScript
  10. {
  11. public override VersionNumber Version => new(8, 23);
  12. public override bool Update()
  13. {
  14. var _provider = DbFactory.NewProvider(Logger.Main);
  15. CheckDimensions<RequisitionItem>(_provider);
  16. CheckDimensions<StockMovement>(_provider);
  17. // var holdings = _provider.Query(
  18. // null,
  19. // Columns.None<StockHolding>()
  20. // .Add(x => x.Location.ID)
  21. // .Add(x => x.Product.ID)
  22. // .Add(x => x.Job.ID)
  23. // .Add(x => x.Style.ID)
  24. // .Add(x => x.Dimensions.Unit.ID)
  25. // .Add(x => x.Dimensions.Length)
  26. // .Add(x => x.Dimensions.Width)
  27. // .Add(x => x.Dimensions.Height)
  28. // .Add(x => x.Dimensions.Quantity)
  29. // .Add(x => x.Dimensions.Width)
  30. // .Add(x => x.AverageValue)
  31. // ).Rows.ToObjects<StockHolding>().ToArray();
  32. //
  33. // var instances = _provider.Query(
  34. // null,
  35. // Columns.None<ProductInstance>()
  36. // .Add(x => x.Product.ID)
  37. // .Add(x => x.Style.ID)
  38. // .Add(x => x.Dimensions.Unit.ID)
  39. // .Add(x => x.Dimensions.Length)
  40. // .Add(x => x.Dimensions.Width)
  41. // .Add(x => x.Dimensions.Height)
  42. // .Add(x => x.Dimensions.Quantity)
  43. // .Add(x => x.Dimensions.Width)
  44. // .Add("AverageCost")
  45. // ).Rows.ToObjects<ProductInstance>().ToArray();
  46. //CheckStockMovementCosts(_provider, holdings, instances);
  47. //RecalculateHoldings(_provider, holdings);
  48. return true;
  49. }
  50. // private void RecalculateHoldings(IProvider provider, StockHolding[] holdings)
  51. // {
  52. // foreach (var holding in holdings)
  53. // {
  54. // var movements = provider.Query(
  55. // new Filter<StockMovement>(x=>x.Product.ID))
  56. // }
  57. // }
  58. // private void CheckStockMovementCosts(IProvider provider, StockHolding[] holdings, ProductInstance[] instances)
  59. // {
  60. //
  61. // var items = provider.Query(
  62. // new Filter<StockMovement>(x=>x.Product.ID).IsNotEqualTo(Guid.Empty).And(x=>x.Cost).IsEqualTo(0.0),
  63. // Columns.None<StockMovement>()
  64. // .Add(x => x.ID)
  65. // .Add(x => x.Location.ID)
  66. // .Add(x => x.Product.ID)
  67. // .Add(x => x.Job.ID)
  68. // .Add(x => x.Style.ID)
  69. // .Add(x => x.Dimensions.Unit.ID)
  70. // .Add(x => x.Dimensions.Length)
  71. // .Add(x => x.Dimensions.Width)
  72. // .Add(x => x.Dimensions.Height)
  73. // .Add(x => x.Dimensions.Quantity)
  74. // .Add(x => x.Dimensions.Width)
  75. // .Add(x => x.Cost)
  76. // ).Rows.ToQueue();
  77. //
  78. // while (items.Any())
  79. // {
  80. // Logger.Send(LogType.Information,"",$"Updating {nameof(StockMovement)} Costs ({items.Count} remaining)..");
  81. // var updates = items.Dequeue(100).ToObjects<StockMovement>().ToArray();
  82. // foreach (var item in updates)
  83. // {
  84. // var holding = holdings.FirstOrDefault(x =>
  85. // Guid.Equals(x.Product.ID, item.Product.ID)
  86. // && Guid.Equals(x.Location.ID, item.Location.ID)
  87. // && Guid.Equals(x.Style.ID, item.Style.ID)
  88. // && Guid.Equals(x.Dimensions.Unit.ID, item.Dimensions.Unit.ID)
  89. // && x.Dimensions.Length.IsEffectivelyEqual(item.Dimensions.Length)
  90. // && x.Dimensions.Width.IsEffectivelyEqual(item.Dimensions.Width)
  91. // && x.Dimensions.Height.IsEffectivelyEqual(item.Dimensions.Height)
  92. // && x.Dimensions.Weight.IsEffectivelyEqual(item.Dimensions.Weight)
  93. // && x.Dimensions.Quantity.IsEffectivelyEqual(item.Dimensions.Quantity)
  94. // );
  95. // if (holding != null)
  96. // item.Cost = holding.AverageValue;
  97. // else
  98. // {
  99. // var instance = instances.FirstOrDefault(x =>
  100. // Guid.Equals(x.Product.ID, item.Product.ID)
  101. // && Guid.Equals(x.Style.ID, item.Style.ID)
  102. // && Guid.Equals(x.Dimensions.Unit.ID, item.Dimensions.Unit.ID)
  103. // && x.Dimensions.Length.IsEffectivelyEqual(item.Dimensions.Length)
  104. // && x.Dimensions.Width.IsEffectivelyEqual(item.Dimensions.Width)
  105. // && x.Dimensions.Height.IsEffectivelyEqual(item.Dimensions.Height)
  106. // && x.Dimensions.Weight.IsEffectivelyEqual(item.Dimensions.Weight)
  107. // && x.Dimensions.Quantity.IsEffectivelyEqual(item.Dimensions.Quantity)
  108. // );
  109. // if (instance != null)
  110. // item.Cost = (double)(CoreUtils.GetPropertyValue(instance,"AverageCost") ?? 0.0);
  111. // }
  112. // }
  113. // provider.Save(updates.Where(x=>x.IsChanged()));
  114. // }
  115. // }
  116. //
  117. // private void CheckRequisitionItemCosts(IProvider provider, StockHolding[] holdings, ProductInstance[] instances)
  118. // {
  119. //
  120. // var items = provider.Query(
  121. // new Filter<RequisitionItem>(x=>x.Product.ID).IsNotEqualTo(Guid.Empty).And(x=>x.Cost).IsEqualTo(0.0),
  122. // Columns.None<RequisitionItem>()
  123. // .Add(x => x.ID)
  124. // .Add(x => x.Location.ID)
  125. // .Add(x => x.Product.ID)
  126. // .Add(x => x.RequisitionLink.JobLink.ID)
  127. // .Add(x => x.Style.ID)
  128. // .Add(x => x.Dimensions.Unit.ID)
  129. // .Add(x => x.Dimensions.Length)
  130. // .Add(x => x.Dimensions.Width)
  131. // .Add(x => x.Dimensions.Height)
  132. // .Add(x => x.Dimensions.Quantity)
  133. // .Add(x => x.Dimensions.Width)
  134. // .Add(x => x.Cost)
  135. // ).Rows.ToObjects<RequisitionItem>().ToQueue();
  136. //
  137. // while (items.Any())
  138. // {
  139. // Logger.Send(LogType.Information,"",$"Updating {nameof(RequisitionItem)} Costs ({items.Count} remaining)..");
  140. // var updates = items.Dequeue(100).ToArray();
  141. // foreach (var item in updates)
  142. // {
  143. // var holding = holdings.FirstOrDefault(x =>
  144. // Guid.Equals(x.Product.ID, item.Product.ID)
  145. // && Guid.Equals(x.Location.ID, item.Location.ID)
  146. // && Guid.Equals(x.Style.ID, item.Style.ID)
  147. // && Guid.Equals(x.Dimensions.Unit.ID, item.Dimensions.Unit.ID)
  148. // && x.Dimensions.Length.IsEffectivelyEqual(item.Dimensions.Length)
  149. // && x.Dimensions.Width.IsEffectivelyEqual(item.Dimensions.Width)
  150. // && x.Dimensions.Height.IsEffectivelyEqual(item.Dimensions.Height)
  151. // && x.Dimensions.Weight.IsEffectivelyEqual(item.Dimensions.Weight)
  152. // && x.Dimensions.Quantity.IsEffectivelyEqual(item.Dimensions.Quantity)
  153. // );
  154. // if (holding != null)
  155. // item.Cost = holding.AverageValue;
  156. // else
  157. // {
  158. // var instance = instances.FirstOrDefault(x =>
  159. // Guid.Equals(x.Product.ID, item.Product.ID)
  160. // && Guid.Equals(x.Style.ID, item.Style.ID)
  161. // && Guid.Equals(x.Dimensions.Unit.ID, item.Dimensions.Unit.ID)
  162. // && x.Dimensions.Length.IsEffectivelyEqual(item.Dimensions.Length)
  163. // && x.Dimensions.Width.IsEffectivelyEqual(item.Dimensions.Width)
  164. // && x.Dimensions.Height.IsEffectivelyEqual(item.Dimensions.Height)
  165. // && x.Dimensions.Weight.IsEffectivelyEqual(item.Dimensions.Weight)
  166. // && x.Dimensions.Quantity.IsEffectivelyEqual(item.Dimensions.Quantity)
  167. // );
  168. // if (instance != null)
  169. // item.Cost = (double)(CoreUtils.GetPropertyValue(instance,"AverageCost") ?? 0.0);
  170. // }
  171. // }
  172. // provider.Save(updates.Where(x=>x.IsChanged()));
  173. // }
  174. // }
  175. private void CheckDimensions<T>(IProvider provider) where T : StockEntity, new()
  176. {
  177. var items = provider.Query(
  178. new Filter<T>(x => x.Dimensions.Unit.ID).IsNotEqualTo(Guid.Empty).And(x=>x.Dimensions.Value).IsEqualTo(0.0),
  179. Columns.Required<T>()
  180. ).Rows.ToObjects<T>().ToQueue();
  181. while (items.Any())
  182. {
  183. Logger.Send(LogType.Information,"",$"Updating {typeof(T).Name.Split('.').Last()} Dimensions ({items.Count} remaining)..");
  184. var updates = items.Dequeue(100).ToArray();
  185. foreach (var item in updates)
  186. item.Dimensions.CalculateValueAndUnitSize();
  187. provider.Save(updates);
  188. }
  189. }
  190. }