|
|
@@ -0,0 +1,105 @@
|
|
|
+using Comal.Classes;
|
|
|
+using InABox.Core;
|
|
|
+using InABox.Database;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Linq.Expressions;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+namespace PRS.Shared.Database_Update_Scripts;
|
|
|
+
|
|
|
+internal class Update_8_58 : DatabaseUpdateScript
|
|
|
+{
|
|
|
+ public override VersionNumber Version => new(8, 58);
|
|
|
+
|
|
|
+ private static void UpdateTimeSheets(IProvider provider)
|
|
|
+ {
|
|
|
+ Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed -> TimeSheet.Posted");
|
|
|
+
|
|
|
+ var timeSheets = provider.Query(
|
|
|
+ Filter<TimeSheet>.Where(x => x.Processed).IsNotEqualTo(DateTime.MinValue)
|
|
|
+ .And(x => x.Posted).IsEqualTo(DateTime.MinValue),
|
|
|
+ Columns.None<TimeSheet>()
|
|
|
+ .Add(x => x.ID)
|
|
|
+ .Add(x => x.Processed)
|
|
|
+ .Add(x => x.Posted))
|
|
|
+ .ToArray<TimeSheet>();
|
|
|
+ Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed -> TimeSheet.Posted: {timeSheets.Length} items");
|
|
|
+ Utils.Utils.ProcessInChunks(
|
|
|
+ timeSheets,
|
|
|
+ chunk =>
|
|
|
+ {
|
|
|
+ foreach (var timeSheet in chunk)
|
|
|
+ {
|
|
|
+ timeSheet.Posted = timeSheet.Processed;
|
|
|
+ }
|
|
|
+ provider.Save(chunk);
|
|
|
+ },
|
|
|
+ 200,
|
|
|
+ percentage => Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed: {percentage:F2}%");
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ConvertLink<T, TFromLink, TToLink>(IProvider provider, Expression<Func<T, TFromLink>> fromLink, Expression<Func<T, TToLink>> toLink)
|
|
|
+ where T : Entity, new()
|
|
|
+ where TFromLink : IEntityLink
|
|
|
+ where TToLink : IEntityLink
|
|
|
+ {
|
|
|
+ var fromColumn = Column<T>.SubColumn(fromLink, new Column<TFromLink>(x => x.ID));
|
|
|
+ var toColumn = Column<T>.SubColumn(toLink, new Column<TToLink>(x => x.ID));
|
|
|
+
|
|
|
+ Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property} -> {typeof(T).Name}.{toColumn.Property}");
|
|
|
+
|
|
|
+ var items = provider.Query(
|
|
|
+ Filter<T>.Where<Guid>(fromColumn).IsNotEqualTo(Guid.Empty)
|
|
|
+ .And<Guid>(toColumn).IsEqualTo(Guid.Empty),
|
|
|
+ Columns.None<T>()
|
|
|
+ .Add(x => x.ID)
|
|
|
+ .Add(fromColumn)
|
|
|
+ .Add(toColumn))
|
|
|
+ .ToArray<T>();
|
|
|
+ Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property} -> {typeof(T).Name}.{toColumn.Property}: {items.Length} items");
|
|
|
+
|
|
|
+ Utils.Utils.ProcessInChunks(
|
|
|
+ items,
|
|
|
+ chunk =>
|
|
|
+ {
|
|
|
+ foreach (var item in chunk)
|
|
|
+ {
|
|
|
+ toColumn.PropertyDefinition.Setter()(
|
|
|
+ item,
|
|
|
+ fromColumn.PropertyDefinition.Getter()(item));
|
|
|
+ }
|
|
|
+ provider.Save(chunk);
|
|
|
+ },
|
|
|
+ 200,
|
|
|
+ percentage => Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property}: {percentage:F2}%"));
|
|
|
+ }
|
|
|
+ private static void ConvertLink<T, TLink>(IProvider provider, Expression<Func<T, TLink>> fromLink, Expression<Func<T, TLink>> toLink)
|
|
|
+ where T : Entity, new()
|
|
|
+ where TLink : IEntityLink
|
|
|
+ {
|
|
|
+ ConvertLink<T, TLink, TLink>(provider, fromLink, toLink);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override bool Update()
|
|
|
+ {
|
|
|
+ var provider = DbFactory.NewProvider(Logger.Main);
|
|
|
+
|
|
|
+ UpdateTimeSheets(provider);
|
|
|
+
|
|
|
+ ConvertLink<Assignment, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<EquipmentAssignment, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<Kanban, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<Requisition, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<RequisitionItem, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<Setout, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+ ConvertLink<JobBillOfMaterialsActivity, JobLink>(provider, x => x.JobLink, x => x.Job);
|
|
|
+
|
|
|
+ ConvertLink<ManufacturingSection, QAFormLink, DigitalFormLink>(provider, x => x.QAForm, x => x.DigitalForm);
|
|
|
+ ConvertLink<ManufacturingTemplateStage, QAFormLink, DigitalFormLink>(provider, x => x.QAForm, x => x.DigitalForm);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|