Update_7_19.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System.Text.RegularExpressions;
  2. using Comal.Classes;
  3. using InABox.Core;
  4. using InABox.Database;
  5. namespace PRS.Shared;
  6. /// <summary>
  7. /// Trigger the calculation of Digital Form Numbers
  8. /// </summary>
  9. /// <returns>true (always)</returns>
  10. public class Update_7_19 : DatabaseUpdateScript
  11. {
  12. public override VersionNumber Version => new VersionNumber(7, 19);
  13. public override bool Update()
  14. {
  15. // Find all classes that derive from EntityForm
  16. var formtypes = CoreUtils.TypeList(
  17. new[]
  18. {
  19. typeof(Setout).Assembly
  20. },
  21. myType =>
  22. myType is { IsClass: true, IsAbstract: false, IsGenericType: false }
  23. && myType.IsSubclassOf(typeof(Entity))
  24. && myType.GetInterfaces().Contains(typeof(IEntityForm))
  25. ).ToArray();
  26. foreach (var formtype in formtypes)
  27. {
  28. var columns = Columns.None(formtype).Add("ID").Add("Number");
  29. var forms = DbFactory.NewProvider(Logger.Main).Query(formtype, null, columns);
  30. var nullforms = forms.Rows
  31. .Where(r => String.IsNullOrWhiteSpace(r.Get<String>("Number")))
  32. .Select(r=>r.ToObject(formtype))
  33. .OfType<Entity>()
  34. .ToArray();
  35. if (!nullforms.Any())
  36. continue;
  37. var maxvalue = forms.Rows.Select(r => Regex.Match(r.Get<String>("Number") ?? "", @"(?<=-)\d+")?.Value ?? "0")
  38. .MaxBy(x => x) ?? "0";
  39. int.TryParse(maxvalue, out int iNumber);
  40. String prefix = null;
  41. String format = null;
  42. foreach (var form in nullforms)
  43. {
  44. prefix ??= (form as IStringAutoIncrement)?.AutoIncrementPrefix() ?? "";
  45. format ??= (form as IStringAutoIncrement)?.AutoIncrementFormat() ?? "{0:D8}";
  46. iNumber++;
  47. CoreUtils.SetPropertyValue(form, "Number", prefix+String.Format(format, iNumber));
  48. }
  49. DbFactory.NewProvider(Logger.Main).Save(formtype, nullforms);
  50. }
  51. return true;
  52. }
  53. }