Update_8_58.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace PRS.Shared.Database_Update_Scripts;
  11. internal class Update_8_58 : DatabaseUpdateScript
  12. {
  13. public override VersionNumber Version => new(8, 58);
  14. private static void UpdateTimeSheets(IProvider provider)
  15. {
  16. Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed -> TimeSheet.Posted");
  17. var timeSheets = provider.Query(
  18. Filter<TimeSheet>.Where(x => x.Processed).IsNotEqualTo(DateTime.MinValue)
  19. .And(x => x.Posted).IsEqualTo(DateTime.MinValue),
  20. Columns.None<TimeSheet>()
  21. .Add(x => x.ID)
  22. .Add(x => x.Processed)
  23. .Add(x => x.Posted))
  24. .ToArray<TimeSheet>();
  25. Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed -> TimeSheet.Posted: {timeSheets.Length} items");
  26. Utils.Utils.ProcessInChunks(
  27. timeSheets,
  28. chunk =>
  29. {
  30. foreach (var timeSheet in chunk)
  31. {
  32. timeSheet.Posted = timeSheet.Processed;
  33. }
  34. provider.Save(chunk);
  35. },
  36. 200,
  37. percentage => Logger.Send(LogType.Information, "", $"Migrating TimeSheet.Processed: {percentage:F2}%");
  38. }
  39. private static void ConvertLink<T, TFromLink, TToLink>(IProvider provider, Expression<Func<T, TFromLink>> fromLink, Expression<Func<T, TToLink>> toLink)
  40. where T : Entity, new()
  41. where TFromLink : IEntityLink
  42. where TToLink : IEntityLink
  43. {
  44. var fromColumn = Column<T>.SubColumn(fromLink, new Column<TFromLink>(x => x.ID));
  45. var toColumn = Column<T>.SubColumn(toLink, new Column<TToLink>(x => x.ID));
  46. Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property} -> {typeof(T).Name}.{toColumn.Property}");
  47. var items = provider.Query(
  48. Filter<T>.Where<Guid>(fromColumn).IsNotEqualTo(Guid.Empty)
  49. .And<Guid>(toColumn).IsEqualTo(Guid.Empty),
  50. Columns.None<T>()
  51. .Add(x => x.ID)
  52. .Add(fromColumn)
  53. .Add(toColumn))
  54. .ToArray<T>();
  55. Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property} -> {typeof(T).Name}.{toColumn.Property}: {items.Length} items");
  56. Utils.Utils.ProcessInChunks(
  57. items,
  58. chunk =>
  59. {
  60. foreach (var item in chunk)
  61. {
  62. toColumn.PropertyDefinition.Setter()(
  63. item,
  64. fromColumn.PropertyDefinition.Getter()(item));
  65. }
  66. provider.Save(chunk);
  67. },
  68. 200,
  69. percentage => Logger.Send(LogType.Information, "", $"Migrating {typeof(T).Name}.{fromColumn.Property}: {percentage:F2}%"));
  70. }
  71. private static void ConvertLink<T, TLink>(IProvider provider, Expression<Func<T, TLink>> fromLink, Expression<Func<T, TLink>> toLink)
  72. where T : Entity, new()
  73. where TLink : IEntityLink
  74. {
  75. ConvertLink<T, TLink, TLink>(provider, fromLink, toLink);
  76. }
  77. public override bool Update()
  78. {
  79. var provider = DbFactory.NewProvider(Logger.Main);
  80. UpdateTimeSheets(provider);
  81. ConvertLink<Assignment, JobLink>(provider, x => x.JobLink, x => x.Job);
  82. ConvertLink<EquipmentAssignment, JobLink>(provider, x => x.JobLink, x => x.Job);
  83. ConvertLink<Kanban, JobLink>(provider, x => x.JobLink, x => x.Job);
  84. ConvertLink<Requisition, JobLink>(provider, x => x.JobLink, x => x.Job);
  85. ConvertLink<RequisitionItem, JobLink>(provider, x => x.JobLink, x => x.Job);
  86. ConvertLink<Setout, JobLink>(provider, x => x.JobLink, x => x.Job);
  87. ConvertLink<JobBillOfMaterialsActivity, JobLink>(provider, x => x.JobLink, x => x.Job);
  88. ConvertLink<ManufacturingSection, QAFormLink, DigitalFormLink>(provider, x => x.QAForm, x => x.DigitalForm);
  89. ConvertLink<ManufacturingTemplateStage, QAFormLink, DigitalFormLink>(provider, x => x.QAForm, x => x.DigitalForm);
  90. return true;
  91. }
  92. }