Update_8_14.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. namespace PRS.Shared.Database_Update_Scripts;
  5. internal class Update_8_14 : DatabaseUpdateScript
  6. {
  7. private static readonly int CHUNK_SIZE = 500;
  8. private static readonly bool DESTRUCTIVE = false;
  9. public override VersionNumber Version => new(8, 14);
  10. public override bool Update()
  11. {
  12. var _provider = DbFactory.NewProvider(Logger.Main);
  13. Clear_POIAs(_provider);
  14. var _poias = Migrate_JRIPOIs(_provider);
  15. Migrate_POIs(_provider, _poias);
  16. return true;
  17. }
  18. private void Clear_POIAs(IProvider provider)
  19. {
  20. Logger.Send(LogType.Information, "", "Clearing Existing Allocations");
  21. var _queue = provider.Query(
  22. new Filter<PurchaseOrderItemAllocation>().All(),
  23. Columns.None<PurchaseOrderItemAllocation>().Add(x => x.ID)
  24. ).Rows.ToQueue();
  25. while (_queue.Any())
  26. {
  27. List<PurchaseOrderItemAllocation> _poias = _queue
  28. .Dequeue(CHUNK_SIZE)
  29. .Select(x => x.ToObject<PurchaseOrderItemAllocation>())
  30. .ToList();
  31. provider.Delete(_poias, "");
  32. Logger.Send(LogType.Information, "", $"- Deleted {_poias.Count} Allocations ({_queue.Count} remaining)");
  33. }
  34. }
  35. private List<PurchaseOrderItemAllocation> Migrate_JRIPOIs(IProvider provider)
  36. {
  37. var _result = new List<PurchaseOrderItemAllocation>();
  38. Logger.Send(LogType.Information,"","Migrating JobRequisitionItems");
  39. var _queue = provider.Query(
  40. new Filter<JobRequisitionItemPurchaseOrderItem>().All(),
  41. Columns.None<JobRequisitionItemPurchaseOrderItem>()
  42. .Add(x=>x.PurchaseOrderItem.ID)
  43. .Add(x=>x.PurchaseOrderItem.Qty)
  44. .Add(x=>x.JobRequisitionItem.ID)
  45. .Add(x=>x.JobRequisitionItem.Job.ID)
  46. ).Rows.ToQueue();
  47. while (_queue.Any())
  48. {
  49. List<PurchaseOrderItemAllocation> _poias = new();
  50. var _jripois = _queue.Dequeue(CHUNK_SIZE).Select(x=>x.ToObject<JobRequisitionItemPurchaseOrderItem>()).ToList();
  51. foreach (var _jripoi in _jripois)
  52. {
  53. var _poia = new PurchaseOrderItemAllocation();
  54. _poia.Item.ID = _jripoi.ID;
  55. _poia.Job.ID = _jripoi.JobRequisitionItem.Job.ID;
  56. _poia.JobRequisitionItem.ID = _jripoi.JobRequisitionItem.ID;
  57. _poia.Quantity = _jripoi.PurchaseOrderItem.Qty;
  58. _poias.Add(_poia);
  59. CoreUtils.SetPropertyValue(_jripoi,"Job.ID",Guid.Empty);
  60. }
  61. provider.Save(_poias);
  62. if (DESTRUCTIVE)
  63. provider.Delete(_jripois,"");
  64. Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  65. _result.AddRange(_poias);
  66. }
  67. return _result;
  68. }
  69. private void Migrate_POIs(IProvider provider, List<PurchaseOrderItemAllocation> poias)
  70. {
  71. Logger.Send(LogType.Information,"","Migrating PurchaseOrderItems");
  72. var _ids = poias.Select(x => x.Item.ID).Distinct().ToArray();
  73. var _queue = provider.Query(
  74. new Filter<PurchaseOrderItem>("Job.ID").IsNotEqualTo(Guid.Empty),
  75. Columns.Required<PurchaseOrderItem>().Add("Job.ID")
  76. ).Rows.ToQueue();
  77. while (_queue.Any())
  78. {
  79. List<PurchaseOrderItemAllocation> _poias = new();
  80. var _pois = _queue.Dequeue(CHUNK_SIZE)
  81. .Where(r => !_ids.Contains(r.Get<PurchaseOrderItemAllocation,Guid>(c=>c.ID)))
  82. .Select(x=>x.ToObject<PurchaseOrderItem>())
  83. .ToList();
  84. foreach (var _poi in _pois)
  85. {
  86. var _poia = new PurchaseOrderItemAllocation();
  87. _poia.Item.ID = _poi.ID;
  88. _poia.Job.ID = (Guid)(CoreUtils.GetPropertyValue(_poi, "Job.ID") ?? Guid.Empty);
  89. _poia.Quantity = _poi.Qty;
  90. _poias.Add(_poia);
  91. CoreUtils.SetPropertyValue(_poi,"Job.ID",Guid.Empty);
  92. }
  93. provider.Save(_poias);
  94. if(DESTRUCTIVE)
  95. provider.Save(_pois);
  96. Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  97. }
  98. }
  99. }