using Comal.Classes; using Comal.Stores; using InABox.Core; using InABox.Database; using PRS.Shared.Database_Update_Scripts.Utils; using PRSStores; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static ICSharpCode.AvalonEdit.Document.TextDocumentWeakEventManager; namespace PRS.Shared; public class Update_7_52 : DatabaseUpdateScript { private Type jripoiType = null; public Update_7_52() { jripoiType = CoreUtils.GetEntity("Comal.Classes.JobRequisitionItemPurchaseOrderItem"); } public override VersionNumber Version => new VersionNumber(7, 52); private IStore? _store; private IStore Store { get { _store ??= DbFactory.FindStore(Guid.Empty, "", Platform.Server, CoreUtils.GetVersion(), Logger.New()); return _store; } } private void UpdateStockMovements() { var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null), Columns.None().Add(x => x.ID) .Add(x => x.PurchaseOrderItem.ID)) .ToObjects() .ToList(); var _poiIDs = DbFactory.NewProvider(Logger.Main).GetTable(jripoiType).ExtractValues("PurchaseOrderItem.ID").Distinct().ToArray(); var mvts = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.JobRequisitionItem.ID).IsEqualTo(null) .And(x => x.OrderItem.ID).IsNotEqualTo(null) .And(new Filter(x => x.OrderItem.ID).InList(_poiIDs) //(null, x => x.PurchaseOrderItem.ID) .Or(x => x.OrderItem.ID).InQuery(null, x => x.PurchaseOrderItem.ID)), Columns.None().Add(x => x.ID) .Add(x => x.OrderItem.ID)) .ToObjects() .ToList(); Logger.Send(LogType.Information, "", $"Updating JobRequisitionItem.ID for {mvts.Count} StockMovements"); var orderItemIDs = mvts.Select(x => x.OrderItem.ID).ToArray(); var jriPois = DbFactory.NewProvider(Logger.Main).Query( jripoiType, Filter.Create(jripoiType,"PurchaseOrderItem.ID",Operator.InList, orderItemIDs), Columns.None(jripoiType).Add("JobRequisitionItem.ID").Add("PurchaseOrderItem.ID") ); var _jris = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.PurchaseOrderItem.ID).InList(orderItemIDs), Columns.None().Add(x => x.ID).Add(x => x.PurchaseOrderItem.ID)) .ToObjects(); var requiIDs = new Dictionary(); foreach(var _row in jriPois.Rows) { requiIDs.TryAdd(_row.Get("PurchaseOrderItem.ID"), _row.Get("JobRequisitionItem.ID")); } foreach (var _jri in _jris) { requiIDs.TryAdd(_jri.PurchaseOrderItem.ID, _jri.ID); } foreach(var mvt in mvts) { if(requiIDs.TryGetValue(mvt.OrderItem.ID, out var requiItemID)) { mvt.JobRequisitionItem.ID = requiItemID; } else { Logger.Send(LogType.Error, "", $"StockMovement which didn't have an associated JobRequisitionItem: {mvt.ID}"); } } var changed = mvts.Where(x => x.IsChanged()).ToList(); // Not going through the store otherwise the JobRequisitionItem Status will be updated incorrectly. DbFactory.NewProvider(Logger.Main).Save(changed); Logger.Send(LogType.Information, "", $"Updated {changed.Count} StockMovements"); } private void UpdateOrderStatus() { var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.OrderRequired).IsEqualTo(DateTime.MinValue) .And(new Filter(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OrderRequired) .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OnOrder) .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.Received)), Columns.None().Add(x => x.ID) .Add(x => x.LastUpdate)) .ToObjects() .ToList(); foreach (var jri in jobRequiItems) { jri.OrderRequired = jri.LastUpdate; } DbFactory.NewProvider(Logger.Main).Save(jobRequiItems); } private void CreateJobRequisitionItemPurchaseOrderItems() { var _poiIDs = DbFactory.NewProvider(Logger.Main).GetTable(jripoiType).ExtractValues("PurchaseOrderItem.ID").Distinct().ToArray(); var jobRequiItems = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null) .And(x => x.ID).NotInList(_poiIDs), Columns.None().Add(x => x.ID) .Add(x => x.PurchaseOrderItem.ID) .Add(x => x.Status)) .ToObjects() .ToList(); Logger.Send(LogType.Information, "", $"Creating JobRequisitionPurchaseOrderItems for {jobRequiItems.Count} JobRequisitionItems"); var newJRIPois = new List(); foreach (var jri in jobRequiItems) { var jriPoi = Activator.CreateInstance(jripoiType) as Entity; CoreUtils.SetPropertyValue(jriPoi,"JobRequisitionItem.ID",jri.ID); CoreUtils.SetPropertyValue(jriPoi,"PurchaseOrderItem.ID",jri.PurchaseOrderItem.ID); newJRIPois.Add(jriPoi); } DbFactory.NewProvider(Logger.Main).Save(jripoiType,newJRIPois); DbFactory.NewProvider(Logger.Main).Save(jobRequiItems); } public override bool Update() { UpdateStockMovements(); UpdateOrderStatus(); CreateJobRequisitionItemPurchaseOrderItems(); //JobRequisitionItemUtils.RefreshStatuses(Store); return true; } }