Browse Source

Added update script for PRS 8.04

Kenric Nugteren 1 year ago
parent
commit
65600052db

+ 1 - 0
prs.shared/Database Update Scripts/DatabaseUpdateScripts.cs

@@ -48,5 +48,6 @@ public static class DatabaseUpdateScripts
         DataUpdater.RegisterUpdateScript<Update_7_66>();
         DataUpdater.RegisterUpdateScript<Update_7_77>();
         DataUpdater.RegisterUpdateScript<Update_8_02>();
+        DataUpdater.RegisterUpdateScript<Update_8_04>();
     }
 }

+ 2 - 49
prs.shared/Database Update Scripts/Update_7_52.cs

@@ -2,6 +2,7 @@
 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;
@@ -135,60 +136,12 @@ public class Update_7_52 : DatabaseUpdateScript
         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}%");
-            }
-            if (JobRequisitionItemStore.CalculateStatus(Store, item))
-            {
-                var key = new Tuple<JobRequisitionItemStatus, JobRequisitionItemStatus>(item.GetOriginalValue(x=>x.Status), item.Status);
-                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.GetOriginalValue(x=>x.Status)} to {item.Status}";
-                
-            }
-            ++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();
+        JobRequisitionItemUtils.RefreshStatuses(Store);
 
         return true;
     }

+ 40 - 0
prs.shared/Database Update Scripts/Update_8_04.cs

@@ -0,0 +1,40 @@
+using Comal.Classes;
+using InABox.Core;
+using InABox.Database;
+using PRS.Shared.Database_Update_Scripts.Utils;
+using PRSStores;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PRS.Shared.Database_Update_Scripts;
+
+internal class Update_8_04 : DatabaseUpdateScript
+{
+    public override VersionNumber Version => new(8, 4);
+
+    private static void UpdateJobField()
+    {
+        Logger.Send(LogType.Information, "", $"Correcting empty job field.");
+        var jobRequiItems = DbFactory.Provider.Query(
+            new Filter<JobRequisitionItem>(x => x.Job.ID).IsEqualTo(Guid.Empty),
+            Columns.None<JobRequisitionItem>().Add(x => x.ID).Add(x => x.Job.ID).Add(x => x.Requisition.Job.ID))
+            .ToObjects<JobRequisitionItem>()
+            .ToList();
+        foreach(var jri in jobRequiItems)
+        {
+            jri.Job.ID = jri.Requisition.Job.ID;
+        }
+        DbFactory.Provider.Save(jobRequiItems);
+        Logger.Send(LogType.Information, "", $"Corrected empty job field for {jobRequiItems.Count} job requisition items.");
+    }
+
+    public override bool Update()
+    {
+        UpdateJobField();
+        JobRequisitionItemUtils.RefreshStatuses(DbFactory.FindStore<JobRequisitionItem>(Guid.Empty, "", Platform.Server, CoreUtils.GetVersion()));
+        return true;
+    }
+}

+ 63 - 0
prs.shared/Database Update Scripts/Utils/JobRequisitionItemUtils.cs

@@ -0,0 +1,63 @@
+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;
+
+namespace PRS.Shared.Database_Update_Scripts.Utils;
+
+public static class JobRequisitionItemUtils
+{
+    public static void RefreshStatuses(IStore store)
+    {
+        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}%");
+            }
+            if (JobRequisitionItemStore.CalculateStatus(store, item))
+            {
+                var key = new Tuple<JobRequisitionItemStatus, JobRequisitionItemStatus>(item.GetOriginalValue(x=>x.Status), item.Status);
+                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.GetOriginalValue(x=>x.Status)} to {item.Status}";
+                
+            }
+            ++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, "");
+    }
+}

+ 25 - 0
prs.shared/Database Update Scripts/Utils/Utils.cs

@@ -0,0 +1,25 @@
+using InABox.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PRS.Shared.Database_Update_Scripts.Utils;
+internal static class Utils
+{
+    public static void ProcessInChunks<T>(IList<T> items, Action<IList<T>> processChunk, int stepBy, Action<double> reportPercentage)
+    {
+        for(int i = 0; i < items.Count; i += 1000)
+        {
+            reportPercentage((double)i / (double)items.Count * 100.0);
+            var mpStages = new List<T>(1000);
+            for(int j = i; j < Math.Min(i + 1000, items.Count); j++)
+            {
+                mpStages.Add(items[j]);
+            }
+
+            processChunk(mpStages);
+        }
+    }
+}