using Comal.Classes; using InABox.Core; using InABox.Database; namespace PRS.Shared.Database_Update_Scripts; internal class Update_8_14 : DatabaseUpdateScript { private static readonly int CHUNK_SIZE = 500; private static readonly bool DESTRUCTIVE = false; public override VersionNumber Version => new(8, 14); public override bool Update() { var _provider = DbFactory.NewProvider(Logger.Main); Clear_POIAs(_provider); var _poias = Migrate_JRIPOIs(_provider); Migrate_POIs(_provider, _poias); return true; } private void Clear_POIAs(IProvider provider) { return; Logger.Send(LogType.Information, "", "Clearing Existing Allocations"); var _queue = provider.Query( new Filter().All(), Columns.None().Add(x => x.ID) ).Rows.ToQueue(); while (_queue.Any()) { List _poias = _queue .Dequeue(CHUNK_SIZE) .Select(x => x.ToObject()) .ToList(); provider.Delete(_poias, ""); Logger.Send(LogType.Information, "", $"- Deleted {_poias.Count} Allocations ({_queue.Count} remaining)"); } } private List Migrate_JRIPOIs(IProvider provider) { var _result = new List(); return _result; Logger.Send(LogType.Information,"","Migrating JobRequisitionItems"); var _queue = provider.Query( new Filter().All(), Columns.None() .Add(x=>x.PurchaseOrderItem.ID) .Add(x=>x.PurchaseOrderItem.Qty) .Add(x=>x.JobRequisitionItem.ID) .Add(x=>x.JobRequisitionItem.Job.ID) ).Rows.ToQueue(); while (_queue.Any()) { List _poias = new(); var _jripois = _queue.Dequeue(CHUNK_SIZE).Select(x=>x.ToObject()).ToList(); foreach (var _jripoi in _jripois) { var _poia = new PurchaseOrderItemAllocation(); _poia.Item.ID = _jripoi.ID; _poia.Job.ID = _jripoi.JobRequisitionItem.Job.ID; _poia.JobRequisitionItem.ID = _jripoi.JobRequisitionItem.ID; _poia.Quantity = _jripoi.PurchaseOrderItem.Qty; _poias.Add(_poia); CoreUtils.SetPropertyValue(_jripoi,"Job.ID",Guid.Empty); } provider.Save(_poias); if (DESTRUCTIVE) provider.Delete(_jripois,""); Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)"); _result.AddRange(_poias); } return _result; } private void Migrate_POIs(IProvider provider, List poias) { Logger.Send(LogType.Information,"","Migrating PurchaseOrderItems"); var _ids = poias.Select(x => x.Item.ID).Distinct().ToArray(); var _queue = provider.Query( new Filter("Job.ID").IsNotEqualTo(Guid.Empty), Columns.Required().Add("Job.ID") ).Rows.ToQueue(); while (_queue.Any()) { List _poias = new(); var _pois = _queue.Dequeue(CHUNK_SIZE) .Where(r => !_ids.Contains(r.Get(c=>c.ID))) .Select(x=>x.ToObject()) .ToList(); foreach (var _poi in _pois) { var _poia = new PurchaseOrderItemAllocation(); _poia.Item.ID = _poi.ID; _poia.Job.ID = (Guid)(CoreUtils.GetPropertyValue(_poi, "Job.ID") ?? Guid.Empty); _poia.Quantity = _poi.Qty; _poias.Add(_poia); CoreUtils.SetPropertyValue(_poi,"Job.ID",Guid.Empty); } provider.Save(_poias); if(DESTRUCTIVE) provider.Save(_pois); Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)"); } } }