Update_7_52.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. using PRS.Shared.Database_Update_Scripts.Utils;
  5. namespace PRS.Shared;
  6. public class Update_7_52 : DatabaseUpdateScript
  7. {
  8. public override VersionNumber Version => new VersionNumber(7, 52);
  9. private IStore<JobRequisitionItem>? _store;
  10. private IStore<JobRequisitionItem> Store
  11. {
  12. get
  13. {
  14. _store ??= DbFactory.FindStore<JobRequisitionItem>(Guid.Empty, "", Platform.Server, CoreUtils.GetVersion(), Logger.New());
  15. return _store;
  16. }
  17. }
  18. private static void UpdateStockMovements()
  19. {
  20. var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query(
  21. new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null),
  22. Columns.None<JobRequisitionItem>().Add(x => x.ID)
  23. .Add(x => x.PurchaseOrderItem.ID))
  24. .ToObjects<JobRequisitionItem>()
  25. .ToList();
  26. var mvts = DbFactory.NewProvider(Logger.Main).Query(
  27. new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsEqualTo(null)
  28. .And(x => x.OrderItem.ID).IsNotEqualTo(null)
  29. .And(new Filter<StockMovement>(x => x.OrderItem.ID).InQuery<JobRequisitionItemPurchaseOrderItem>(null, x => x.PurchaseOrderItem.ID)
  30. .Or(x => x.OrderItem.ID).InQuery<JobRequisitionItem>(null, x => x.PurchaseOrderItem.ID)),
  31. Columns.None<StockMovement>().Add(x => x.ID)
  32. .Add(x => x.OrderItem.ID))
  33. .ToObjects<StockMovement>()
  34. .ToList();
  35. Logger.Send(LogType.Information, "", $"Updating JobRequisitionItem.ID for {mvts.Count} StockMovements");
  36. var orderItemIDs = mvts.Select(x => x.OrderItem.ID).ToArray();
  37. var jriPois = DbFactory.NewProvider(Logger.Main).Query(
  38. new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ID).InList(orderItemIDs),
  39. Columns.None<JobRequisitionItemPurchaseOrderItem>().Add(x => x.JobRequisitionItem.ID).Add(x => x.PurchaseOrderItem.ID))
  40. .ToObjects<JobRequisitionItemPurchaseOrderItem>();
  41. var jris = DbFactory.NewProvider(Logger.Main).Query(
  42. new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).InList(orderItemIDs),
  43. Columns.None<JobRequisitionItem>().Add(x => x.ID).Add(x => x.PurchaseOrderItem.ID))
  44. .ToObjects<JobRequisitionItem>();
  45. var requiIDs = new Dictionary<Guid, Guid>();
  46. foreach(var jriPoi in jriPois)
  47. {
  48. requiIDs.TryAdd(jriPoi.PurchaseOrderItem.ID, jriPoi.JobRequisitionItem.ID);
  49. }
  50. foreach (var jriPoi in jris)
  51. {
  52. requiIDs.TryAdd(jriPoi.PurchaseOrderItem.ID, jriPoi.ID);
  53. }
  54. foreach(var mvt in mvts)
  55. {
  56. if(requiIDs.TryGetValue(mvt.OrderItem.ID, out var requiItemID))
  57. {
  58. mvt.JobRequisitionItem.ID = requiItemID;
  59. }
  60. else
  61. {
  62. Logger.Send(LogType.Error, "", $"StockMovement which didn't have an associated JobRequisitionItem: {mvt.ID}");
  63. }
  64. }
  65. var changed = mvts.Where(x => x.IsChanged()).ToList();
  66. // Not going through the store otherwise the JobRequisitionItem Status will be updated incorrectly.
  67. DbFactory.NewProvider(Logger.Main).Save(changed);
  68. Logger.Send(LogType.Information, "", $"Updated {changed.Count} StockMovements");
  69. }
  70. private void UpdateOrderStatus()
  71. {
  72. var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query(
  73. new Filter<JobRequisitionItem>(x => x.OrderRequired).IsEqualTo(DateTime.MinValue)
  74. .And(new Filter<JobRequisitionItem>(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OrderRequired)
  75. .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OnOrder)
  76. .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.Received)),
  77. Columns.None<JobRequisitionItem>().Add(x => x.ID)
  78. .Add(x => x.LastUpdate))
  79. .ToObjects<JobRequisitionItem>()
  80. .ToList();
  81. foreach (var jri in jobRequiItems)
  82. {
  83. jri.OrderRequired = jri.LastUpdate;
  84. }
  85. DbFactory.NewProvider(Logger.Main).Save(jobRequiItems);
  86. }
  87. private void CreateJobRequisitionItemPurchaseOrderItems()
  88. {
  89. var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query(
  90. new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null)
  91. .And(x => x.ID).NotInQuery<JobRequisitionItemPurchaseOrderItem>(
  92. null,
  93. x => x.JobRequisitionItem.ID),
  94. Columns.None<JobRequisitionItem>().Add(x => x.ID)
  95. .Add(x => x.PurchaseOrderItem.ID)
  96. .Add(x => x.Status))
  97. .ToObjects<JobRequisitionItem>()
  98. .ToList();
  99. Logger.Send(LogType.Information, "", $"Creating JobRequisitionPurchaseOrderItems for {jobRequiItems.Count} JobRequisitionItems");
  100. var newJRIPois = new List<JobRequisitionItemPurchaseOrderItem>();
  101. foreach (var jri in jobRequiItems)
  102. {
  103. var jriPoi = new JobRequisitionItemPurchaseOrderItem();
  104. jriPoi.JobRequisitionItem.ID = jri.ID;
  105. jriPoi.PurchaseOrderItem.ID = jri.PurchaseOrderItem.ID;
  106. newJRIPois.Add(jriPoi);
  107. }
  108. DbFactory.NewProvider(Logger.Main).Save(newJRIPois);
  109. DbFactory.NewProvider(Logger.Main).Save(jobRequiItems);
  110. }
  111. public override bool Update()
  112. {
  113. UpdateStockMovements();
  114. UpdateOrderStatus();
  115. CreateJobRequisitionItemPurchaseOrderItems();
  116. JobRequisitionItemUtils.RefreshStatuses(Store);
  117. return true;
  118. }
  119. }