DigitalFormReportDataModel.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using InABox.Clients;
  5. using System.Diagnostics.CodeAnalysis;
  6. namespace InABox.Core
  7. {
  8. public interface IDigitalFormReportDataModel
  9. {
  10. public DigitalFormVariable[]? Variables { get; set; }
  11. }
  12. /// <summary>
  13. /// </summary>
  14. /// <typeparam name="T">
  15. /// Should always be an EntityForm<,></typeparam>
  16. public class DigitalFormReportDataModel<T> : AutoDataModel<T>, IDigitalFormReportDataModel
  17. where T : Entity, IRemotable, IPersistent, IDigitalFormInstance, new()
  18. {
  19. private Guid? FormId { get; set; } = null;
  20. private CoreTable? FormDataTable { get; set; } = null;
  21. //private DigitalFormVariable[]? _variables = null;
  22. public DigitalFormVariable[]? Variables { get; set; }
  23. public DigitalFormReportDataModel(Filter<T> filter, Guid? formId = null) : base(filter)
  24. {
  25. FormId = formId;
  26. }
  27. public override string Name => "Digital Form Reports";
  28. protected override void CheckRequiredTables(List<string> requiredtables)
  29. {
  30. base.CheckRequiredTables(requiredtables);
  31. requiredtables.Add(TableName<T>());
  32. }
  33. private void LoadFormDataTable(Guid formID)
  34. {
  35. var formDataTable = new CoreTable();
  36. formDataTable.Columns.Add(new CoreColumn
  37. {
  38. ColumnName = "Parent.ID",
  39. DataType = typeof(Guid)
  40. });
  41. Variables ??= new Client<DigitalFormVariable>().Load(new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(formID));
  42. foreach (var variable in Variables)
  43. foreach (var column in variable.GetDisplayColumns())
  44. formDataTable.Columns.Add(column);
  45. FormDataTable = formDataTable;
  46. AddTable("Form_Data", formDataTable, true);
  47. LinkTable(typeof(T), "ID", "Form_Data", "Parent.ID");
  48. }
  49. private void LoadFormDataIntoRow(CoreRow row, DFLoadStorage data)
  50. {
  51. foreach(var variable in Variables!)
  52. {
  53. var value = variable.Deserialize(data.GetEntry(variable.Code));
  54. foreach(var (k, v) in variable.GetDisplayValues(value))
  55. {
  56. row[k] = v;
  57. }
  58. }
  59. }
  60. protected override void AfterLoad(IEnumerable<string> requiredtables)
  61. {
  62. base.AfterLoad(requiredtables);
  63. if(FormDataTable == null)
  64. {
  65. LoadFormDataTable(FormId ?? ExtractValues<T, Guid>(x => x.Form.ID).FirstOrDefault());
  66. }
  67. var idList = ExtractValues<T, Guid>(x => x.ID);
  68. var jsonLists = ExtractValues<T, string>(x => x.FormData, false).ToList();
  69. var blobLists = ExtractValues<T, string?>(x => x.BlobData, false).ToList();
  70. for(var i = 0; i < jsonLists.Count; ++i)
  71. {
  72. var json = jsonLists[i];
  73. var blobJSON = blobLists[i];
  74. var formData = DigitalForm.DeserializeFormData(json, blobJSON);
  75. var formRow = FormDataTable!.NewRow();
  76. formRow["Parent.ID"] = idList[i];
  77. if (formData != null) LoadFormDataIntoRow(formRow, formData);
  78. FormDataTable.Rows.Add(formRow);
  79. }
  80. Load(typeof(CoreTable), FormDataTable!, requiredtables, "Form_Data");
  81. }
  82. }
  83. }