DigitalFormReportDataModel.cs 3.5 KB

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