Update_7_52.cs 6.2 KB

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