Update_7_56.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Comal.Classes;
  2. using Comal.Stores;
  3. using InABox.Core;
  4. using InABox.Database;
  5. namespace PRS.Shared.Database_Update_Scripts;
  6. internal class Update_7_56 : DatabaseUpdateScript
  7. {
  8. public override VersionNumber Version => new(7, 56);
  9. public override bool Update()
  10. {
  11. List<StockHolding> allholdings = new List<StockHolding>();
  12. Logger.Send(LogType.Information, "", $"- Loading Stock Movements");
  13. var movements = DbFactory.NewProvider(Logger.Main).Query(
  14. null,
  15. Columns.None<StockMovement>().Add(x => x.ID)
  16. .Add(x => x.Location.ID)
  17. .Add(x => x.Product.ID)
  18. .Add(x => x.Style.ID)
  19. .Add(x => x.Job.ID)
  20. .Add(x => x.Dimensions.Unit.ID)
  21. .Add(x => x.Dimensions.Quantity)
  22. .Add(x => x.Dimensions.Height)
  23. .Add(x => x.Dimensions.Width)
  24. .Add(x => x.Dimensions.Length)
  25. .Add(x => x.Dimensions.Weight)
  26. .Add(x => x.Dimensions.UnitSize)
  27. .Add(x => x.Dimensions.Value)
  28. .Add(x => x.JobRequisitionItem.ID)
  29. .Add(x => x.Units)
  30. .Add(x => x.Cost)
  31. );
  32. Logger.Send(LogType.Information, "", $"Processing {movements.Rows.Count} Stock Movements");
  33. foreach (var row in movements.Rows)
  34. {
  35. var movement = row.ToObject<StockMovement>();
  36. var holding = allholdings.FirstOrDefault(x =>
  37. (x.Product.ID == movement.Product.ID)
  38. && (x.Location.ID == movement.Location.ID)
  39. && (x.Style.ID == movement.Style.ID)
  40. && (x.Job.ID == movement.Job.ID)
  41. && (x.Dimensions.Unit.ID == movement.Dimensions.Unit.ID)
  42. && (x.Dimensions.UnitSize == movement.Dimensions.UnitSize)
  43. );
  44. if (holding == null)
  45. {
  46. holding = new();
  47. holding.Location.ID = movement.Location.ID;
  48. holding.Product.ID = movement.Product.ID;
  49. holding.Style.ID = movement.Style.ID;
  50. holding.Job.ID = movement.Job.ID;
  51. holding.Dimensions.CopyFrom(movement.Dimensions);
  52. allholdings.Add(holding);
  53. }
  54. holding.Units += movement.Units;
  55. holding.Qty += movement.Units * movement.Dimensions.Value;
  56. holding.Value += movement.Units * movement.Cost;
  57. holding.Available += (movement.JobRequisitionItem.ID == Guid.Empty ? movement.Units : 0.0);
  58. holding.Weight = holding.Qty * holding.Dimensions.Weight;
  59. holding.AverageValue = holding.Units != 0 ? holding.Value / holding.Units : 0.0F;
  60. if ((row.Index > 0) && (row.Index % 1000 == 0))
  61. Logger.Send(LogType.Information, "", $"Processed {row.Index} movements / {allholdings.Count} holdings");
  62. }
  63. if (movements.Rows.Count % 1000 != 0)
  64. Logger.Send(LogType.Information, "", $"Processed {movements.Rows.Count} movements / {allholdings.Count} holdings");
  65. var nonempty = allholdings.Where(x => Math.Abs(x.Units) >= 0.000001F).ToList();
  66. Logger.Send(LogType.Information, "", $"Saving {nonempty.Count} non-empty Stock Holdings");
  67. var updates = new List<StockHolding>();
  68. int i = 0;
  69. while (i < nonempty.Count)
  70. {
  71. updates.Add(nonempty[i]);
  72. if (updates.Count == 1000)
  73. {
  74. DbFactory.NewProvider(Logger.Main).Save(updates);
  75. Logger.Send(LogType.Information, "", $"Saved {i+1}/{nonempty.Count} Stock Holdings");
  76. updates.Clear();
  77. }
  78. i++;
  79. }
  80. if (updates.Any())
  81. {
  82. DbFactory.NewProvider(Logger.Main).Save(updates);
  83. Logger.Send(LogType.Information, "", $"Saved {nonempty.Count}/{nonempty.Count} Stock Holdings");
  84. }
  85. return true;
  86. }
  87. }