Browse Source

Actually commiting update 7.52 script

Kenric Nugteren 1 year ago
parent
commit
b0052ce420
1 changed files with 199 additions and 0 deletions
  1. 199 0
      prs.shared/Database Update Scripts/Update_7_52.cs

+ 199 - 0
prs.shared/Database Update Scripts/Update_7_52.cs

@@ -0,0 +1,199 @@
+using Comal.Classes;
+using Comal.Stores;
+using InABox.Core;
+using InABox.Database;
+using PRSStores;
+using System;
+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
+{
+    public override VersionNumber Version => new VersionNumber(7, 52);
+
+    private IStore<JobRequisitionItem>? _store;
+
+    private IStore<JobRequisitionItem> Store
+    {
+        get
+        {
+            _store ??= DbFactory.FindStore<JobRequisitionItem>(Guid.Empty, "", Platform.Server, CoreUtils.GetVersion());
+            return _store;
+        }
+    }
+
+    private static void UpdateStockMovements()
+    {
+        var jobRequiItems = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null),
+            new Columns<JobRequisitionItem>(x => x.ID)
+                .Add(x => x.PurchaseOrderItem.ID))
+            .ToObjects<JobRequisitionItem>()
+            .ToList();
+
+        var mvts = DbFactory.Provider.Query(
+            new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsEqualTo(null)
+                .And(x => x.OrderItem.ID).IsNotEqualTo(null)
+                .And(new Filter<StockMovement>(x => x.OrderItem.ID).InQuery<JobRequisitionItemPurchaseOrderItem>(null, x => x.PurchaseOrderItem.ID)
+                    .Or(x => x.OrderItem.ID).InQuery<JobRequisitionItem>(null, x => x.PurchaseOrderItem.ID)),
+            new Columns<StockMovement>(x => x.ID)
+                .Add(x => x.OrderItem.ID))
+            .ToObjects<StockMovement>()
+            .ToList();
+
+        Logger.Send(LogType.Information, "", $"Updating JobRequisitionItem.ID for {mvts.Count} StockMovements");
+
+        var orderItemIDs = mvts.Select(x => x.OrderItem.ID).ToArray();
+
+        var jriPois = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ID).InList(orderItemIDs),
+            new Columns<JobRequisitionItemPurchaseOrderItem>(x => x.JobRequisitionItem.ID).Add(x => x.PurchaseOrderItem.ID))
+            .ToObjects<JobRequisitionItemPurchaseOrderItem>();
+
+        var jris = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).InList(orderItemIDs),
+            new Columns<JobRequisitionItem>(x => x.ID).Add(x => x.PurchaseOrderItem.ID))
+            .ToObjects<JobRequisitionItem>();
+
+        var requiIDs = new Dictionary<Guid, Guid>();
+        foreach(var jriPoi in jriPois)
+        {
+            requiIDs.TryAdd(jriPoi.PurchaseOrderItem.ID, jriPoi.JobRequisitionItem.ID);
+        }
+        foreach (var jriPoi in jris)
+        {
+            requiIDs.TryAdd(jriPoi.PurchaseOrderItem.ID, jriPoi.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.Provider.Save(changed);
+
+        Logger.Send(LogType.Information, "", $"Updated {changed.Count} StockMovements");
+    }
+
+    private void UpdateOrderStatus()
+    {
+        var jobRequiItems = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItem>(x => x.OrderRequired).IsEqualTo(DateTime.MinValue)
+                .And(new Filter<JobRequisitionItem>(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OrderRequired)
+                    .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.OnOrder)
+                    .Or(x => x.Status).IsEqualTo(JobRequisitionItemStatus.Received)),
+            new Columns<JobRequisitionItem>(x => x.ID)
+                .Add(x => x.LastUpdate))
+            .ToObjects<JobRequisitionItem>()
+            .ToList();
+
+        foreach (var jri in jobRequiItems)
+        {
+            jri.OrderRequired = jri.LastUpdate;
+        }
+
+        DbFactory.Provider.Save(jobRequiItems);
+    }
+
+    private void CreateJobRequisitionItemPurchaseOrderItems()
+    {
+        var jobRequiItems = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItem>(x => x.PurchaseOrderItem.ID).IsNotEqualTo(null)
+                .And(x => x.ID).NotInQuery<JobRequisitionItemPurchaseOrderItem>(
+                    null,
+                    x => x.JobRequisitionItem.ID),
+            new Columns<JobRequisitionItem>(x => x.ID)
+                .Add(x => x.PurchaseOrderItem.ID)
+                .Add(x => x.Status))
+            .ToObjects<JobRequisitionItem>()
+            .ToList();
+        Logger.Send(LogType.Information, "", $"Creating JobRequisitionPurchaseOrderItems for {jobRequiItems.Count} JobRequisitionItems");
+
+        var newJRIPois = new List<JobRequisitionItemPurchaseOrderItem>();
+        foreach (var jri in jobRequiItems)
+        {
+            var jriPoi = new JobRequisitionItemPurchaseOrderItem();
+            jriPoi.JobRequisitionItem.ID = jri.ID;
+            jriPoi.PurchaseOrderItem.ID = jri.PurchaseOrderItem.ID;
+            newJRIPois.Add(jriPoi);
+        }
+        DbFactory.Provider.Save(newJRIPois);
+        DbFactory.Provider.Save(jobRequiItems);
+    }
+
+    private void RefreshStatuses()
+    {
+        Logger.Send(LogType.Information, "", $"Refreshing JobRequisitionItem statuses");
+        var jobRequiItems = DbFactory.Provider.Query(
+            null,
+            JobRequisitionItemStore.StatusRequiredColumns().Add(x => x.Status))
+            .ToObjects<JobRequisitionItem>()
+            .ToList();
+
+        var statusUpdates = new Dictionary<Tuple<JobRequisitionItemStatus, JobRequisitionItemStatus>, List<Guid>>();
+
+        var i = 0;
+        foreach(var item in jobRequiItems)
+        {
+            if(i % 50 == 0)
+            {
+                Logger.Send(LogType.Information, "", $"Refreshing statuses: {(((double)i) / (double)jobRequiItems.Count * 100):F0}%");
+            }
+            var newStatus = JobRequisitionItemStore.CalculateStatus(Store, item);
+            if (newStatus.HasValue && item.Status != newStatus.Value)
+            {
+                var key = new Tuple<JobRequisitionItemStatus, JobRequisitionItemStatus>(item.Status, newStatus.Value);
+                if(!statusUpdates.TryGetValue(key, out var list))
+                {
+                    list = new List<Guid>();
+                    statusUpdates.Add(key, list);
+                }
+                list.Add(item.ID);
+
+                item.Issues += $"Updated status from {item.Status} to {newStatus.Value}";
+                item.Status = newStatus.Value;
+
+            }
+            ++i;
+        }
+
+        foreach(var ((from, to), list) in statusUpdates)
+        {
+            Logger.Send(LogType.Information, "", $"{from} -> {to}: {list.Count} entries");
+        }
+
+        new BaseStore<JobRequisitionItem>
+        {
+            UserGuid = Guid.Empty,
+            UserID = "",
+            Platform = Platform.Server,
+            Version = CoreUtils.GetVersion(),
+            Provider = DbFactory.Provider
+        }.Save(jobRequiItems, "");
+    }
+
+    public override bool Update()
+    {
+        UpdateStockMovements();
+        UpdateOrderStatus();
+        CreateJobRequisitionItemPurchaseOrderItems();
+        RefreshStatuses();
+
+        return true;
+    }
+}