using Comal.Classes; using InABox.Core; using InABox.Database; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PRS.Shared.Database_Update_Scripts; public class Update_8_02 : DatabaseUpdateScript { public override VersionNumber Version => new(8, 2); private static void PopulateDone() { var requiItems = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.Done).IsEqualTo(false).And(x => x.Picked).IsNotEqualTo(DateTime.MinValue), Columns.None().Add(x => x.ID).Add(x => x.Picked).Add(x => x.Done)) .ToList(); Logger.Send(LogType.Information, "", $"Populating Done flag for {requiItems.Count} RequisitionItems"); foreach(var item in requiItems) { item.Done = item.Picked != DateTime.MinValue; } Logger.Send(LogType.Information, "", $"Done populating Done flag!"); DbFactory.NewProvider(Logger.Main).Save(requiItems); } private static void UpdateUndeliveredItems() { var requisitions = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.TakenBy.ID).IsNotEqualTo(Guid.Empty), Columns.None().Add(x => x.ID).Add(x => x.Filled)) .ToObjects() .ToDictionary(x => x.ID, x => x); var requiIDs = requisitions.Keys.ToArray(); var deliveryItems = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.DeliveredDate).IsEqualTo(DateTime.MinValue) .And(x => x.RequisitionLink.ID).InList(requiIDs), Columns.None().Add(x => x.ID) .Add(x => x.RequisitionLink.ID)) .ToArray(); Logger.Send(LogType.Information, "", $"Found {deliveryItems.Length} undelivered DeliveryItems linked to Taken requisitions."); foreach(var item in deliveryItems) { if(requisitions.TryGetValue(item.RequisitionLink.ID, out var requi)) { item.DeliveredDate = requi.Filled; } } DbFactory.NewProvider(Logger.Main).Save(deliveryItems); Logger.Send(LogType.Information, "", $"Updated DeliveryItem.DeliveredDate = Requisition.Filled"); } private static void PopulateManufacturingPacketStageDescription() { var table = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.Description).IsEqualTo(null), Columns.None().Add(x => x.ID) .Add(x => x.Form.Description)); Logger.Send(LogType.Information, "", $"Populating Description for {table.Rows.Count} ManufacturingPacketStages"); for(int i = 0; i < table.Rows.Count; i += 1000) { Logger.Send(LogType.Information, "", $"{(double)i / (double)table.Rows.Count * 100.0:F2}%"); var mpStages = new List(1000); for(int j = i; j < Math.Min(i + 1000, table.Rows.Count); j++) { mpStages.Add(table.Rows[j].ToObject()); } foreach(var stage in mpStages) { stage.Description = stage.Form.Description; } DbFactory.NewProvider(Logger.Main).Save(mpStages); } Logger.Send(LogType.Information, "", $"Done populating Description!"); } public override bool Update() { PopulateDone(); UpdateUndeliveredItems(); PopulateManufacturingPacketStageDescription(); return true; } }