using Comal.Classes; using InABox.Core; using InABox.Database; namespace PRS.Shared; public class Update_7_37 : DatabaseUpdateScript { public override VersionNumber Version => new VersionNumber(7, 37); public override bool Update() { UpdateDigitalFormFlags(); UpdateJobLeads(); return true; } private void UpdateDigitalFormFlags() { // Find all classes that derive from EntityForm var formtypes = CoreUtils.TypeList( new[] { typeof(Setout).Assembly }, myType => myType is { IsClass: true, IsAbstract: false, IsGenericType: false } && myType.IsSubclassOf(typeof(Entity)) && myType.GetInterfaces().Contains(typeof(IEntityForm)) ).ToArray(); foreach (var formtype in formtypes) { var filter = Filter.Create(formtype, "Processed").IsEqualTo(true) .And("FormProcessed").IsEqualTo(DateTime.MinValue); var columns = Columns.None(formtype) .Add("ID") .Add("Processed") .Add("FormProcessed") .Add("LastUpdate"); var forms = DbFactory.NewProvider(Logger.Main).Query(formtype, filter, columns) .Rows .Select(r => r.ToObject(formtype)) .OfType() .ToArray(); if (!forms.Any()) continue; foreach (var form in forms) { var lastupdate = CoreUtils.GetPropertyValue(form, "LastUpdate"); CoreUtils.SetPropertyValue(form,"FormProcessed", lastupdate); CoreUtils.SetPropertyValue(form,"Processed", false); } DbFactory.NewProvider(Logger.Main).Save(formtype, forms); Logger.Send(LogType.Information, "", $"{forms.Length} {formtype.Name}s processed"); } } private static void UpdateJobLeads() { List jobs; IColumns columns = Columns.None().Add(x => x.ID) .Add(x => x.ProjectLead.ID) .Add(x => x.SiteLead.ID) .Add("ManagerLink.ID") .Add("EmployeeLink.ID"); jobs = DbFactory.NewProvider(Logger.Main).Query( typeof(Job), null, columns ).ToObjects().ToList(); foreach (var item in jobs) { item.ProjectLead.ID = CoreUtils.GetPropertyValue(item, "ManagerLink.ID") is Guid _mgr ? _mgr : Guid.Empty; CoreUtils.SetPropertyValue(jobs, "ManagerLink.ID", Guid.Empty); item.SiteLead.ID = CoreUtils.GetPropertyValue(item, "EmployeeLink.ID") is Guid _emp ? _emp : Guid.Empty; CoreUtils.SetPropertyValue(jobs, "EmployeeLink.ID", Guid.Empty); } var updates = jobs.Where(x => x.IsChanged()).ToArray(); if (updates.Any()) DbFactory.NewProvider(Logger.Main).Save(updates); Logger.Send(LogType.Information, "", $"{jobs.Count} {typeof(Job).Name}s processed"); } }