Update_8_24.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. namespace PRS.Shared.Database_Update_Scripts;
  5. internal class Update_8_24 : DatabaseUpdateScript
  6. {
  7. private static readonly int CHUNK_SIZE = 500;
  8. private static readonly bool DESTRUCTIVE = false;
  9. public override VersionNumber Version => new(8, 24);
  10. public override bool Update()
  11. {
  12. var _provider = DbFactory.NewProvider(Logger.Main);
  13. Clear_POIAs(_provider);
  14. Migrate_JRIPOIs(_provider);
  15. Update_POIs(_provider);
  16. return true;
  17. }
  18. private void Clear_POIAs(IProvider provider)
  19. {
  20. Logger.Send(LogType.Information, "", "Clearing Existing POIAs");
  21. var sql = $"delete from PurchaseOrderItemAllocation";
  22. var deleted = provider.Update(sql);
  23. Logger.Send(LogType.Information,"",$"Cleared {deleted} POIAs");
  24. }
  25. private void Migrate_JRIPOIs(IProvider provider)
  26. {
  27. if (provider.TableExists("JobRequisitionItemPurchaseOrderItem"))
  28. {
  29. Logger.Send(LogType.Information,"","Migrating JRIPOIs");
  30. var _pois = provider.Query(
  31. null,
  32. Columns.None<PurchaseOrderItem>().Add(x => x.ID).Add(x => x.Qty)
  33. ).ToDictionary<PurchaseOrderItem,Guid,double>(x=>x.ID, x=>x.Qty);
  34. var _sql =
  35. $"select jripoi.[purchaseorderitem.id], jripoi.[jobrequisitionitem.id], jri.[job.id], cast(poi.[qty] as double) as [qty] " +
  36. $"from jobrequisitionitempurchaseorderitem jripoi " +
  37. $"left outer join jobrequisitionitem jri on jripoi.[jobrequisitionitem.id] = jri.[id] " +
  38. $"left outer join purchaseorderitem poi on jripoi.[purchaseorderitem.id] = poi.[id]";
  39. var _queue = provider.Query(_sql)
  40. .Rows.ToQueue();
  41. List<Guid> _ids = new();
  42. while (_queue.Any())
  43. {
  44. List<PurchaseOrderItemAllocation> _poias = new();
  45. var _jripois = _queue.Dequeue(CHUNK_SIZE).ToList();
  46. foreach (var _jripoi in _jripois)
  47. {
  48. Guid poi_id = Guid.TryParse(_jripoi.Get<string>("purchaseorderitem.id"), out var pid) ? pid : Guid.Empty;
  49. var _poia = new PurchaseOrderItemAllocation();
  50. _poia.Item.ID = poi_id;
  51. _poia.Job.ID = Guid.TryParse(_jripoi.Get<string>("job.id"), out var jid) ? jid : Guid.Empty;
  52. _poia.JobRequisitionItem.ID = Guid.TryParse(_jripoi.Get<string>("jobrequisitionitem.id"), out var rid) ? rid : Guid.Empty;
  53. _poia.Quantity = _jripoi.Get<double>("qty");
  54. _poia.Nominated = !_ids.Contains(poi_id);
  55. _poias.Add(_poia);
  56. _ids.Add(poi_id);
  57. }
  58. provider.Save(_poias);
  59. Logger.Send(LogType.Information, "",
  60. $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  61. }
  62. }
  63. if (DESTRUCTIVE)
  64. provider.DropTable("JobRequisitionItemPurchaseOrderItem");
  65. }
  66. private void Update_POIs(IProvider provider)
  67. {
  68. Logger.Send(LogType.Information,"","Migrating PurchaseOrderItems");
  69. var _ids = provider.Query(
  70. null,
  71. Columns.None<PurchaseOrderItemAllocation>()
  72. .Add(x=>x.Item.ID)
  73. ).ExtractValues<PurchaseOrderItemAllocation,Guid>(x => x.Item.ID,true);
  74. var _queue = provider.Query(
  75. new Filter<PurchaseOrderItem>("Job.ID").IsNotEqualTo(Guid.Empty),
  76. Columns.Required<PurchaseOrderItem>().Add("Job.ID")
  77. ).Rows.ToQueue();
  78. while (_queue.Any())
  79. {
  80. List<PurchaseOrderItemAllocation> _poias = new();
  81. var _pois = _queue.Dequeue(CHUNK_SIZE)
  82. .Select(x=>x.ToObject<PurchaseOrderItem>())
  83. .ToList();
  84. foreach (var _poi in _pois)
  85. {
  86. if (!_ids.Contains(_poi.ID))
  87. {
  88. var _poia = new PurchaseOrderItemAllocation();
  89. _poia.Item.ID = _poi.ID;
  90. _poia.Job.ID = (Guid)(CoreUtils.GetPropertyValue(_poi, "Job.ID") ?? Guid.Empty);
  91. _poia.Quantity = _poi.Qty;
  92. _poia.Nominated = true;
  93. _poias.Add(_poia);
  94. }
  95. CoreUtils.SetPropertyValue(_poi,"Job.ID",Guid.Empty);
  96. }
  97. provider.Save(_poias);
  98. if(DESTRUCTIVE)
  99. provider.Save(_pois.Where(x=>x.IsChanged()));
  100. Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  101. }
  102. }
  103. }