using System; using System.Collections.Generic; using System.Linq; using InABox.Clients; using JetBrains.Annotations; namespace InABox.Core { public interface IDigitalFormReportDataModel { public DigitalFormVariable[]? Variables { get; set; } } /// /// /// /// Should always be an EntityForm<,> public class DigitalFormReportDataModel : AutoDataModel, IDigitalFormReportDataModel where T : Entity, IRemotable, IPersistent, IEntityForm, new() { private Guid? FormId { get; set; } = null; private CoreTable? FormDataTable { get; set; } = null; //private DigitalFormVariable[]? _variables = null; public DigitalFormVariable[]? Variables { get; set; } public DigitalFormReportDataModel(Filter filter, Guid? formId = null) : base(filter) { FormId = formId; } public override string Name => "Digital Form Reports"; protected override void CheckRequiredTables(List requiredtables) { base.CheckRequiredTables(requiredtables); requiredtables.Add(TableName()); } private void LoadFormDataTable(Guid formID) { var formDataTable = new CoreTable(); formDataTable.Columns.Add(new CoreColumn { ColumnName = "Parent.ID", DataType = typeof(Guid) }); if(Variables is null) Variables = new Client().Load(new Filter(x => x.Form.ID).IsEqualTo(formID)); foreach (var variable in Variables) foreach (var column in variable.GetVariableColumns()) formDataTable.Columns.Add(column); FormDataTable = formDataTable; AddTable("Form_Data", formDataTable, true); LinkTable(typeof(T), "ID", "Form_Data", "Parent.ID"); } private void LoadFormDataIntoRow(CoreRow row, Dictionary data) { foreach (var key in data.Keys) { if (key.Contains('.')) { row[key] = data[key]; } else { var variable = Variables.FirstOrDefault(x => string.Equals(x.Code, key)); if (variable != null) row[key] = variable.ParseValue(data[key]); } } } protected override void AfterLoad(IEnumerable requiredtables) { base.AfterLoad(requiredtables); if(FormDataTable == null) { LoadFormDataTable(FormId ?? ExtractValues(x => (x as IDigitalFormInstance)!.Form.ID).FirstOrDefault()); } var idList = ExtractValues(x => x.ID); var jsonLists = ExtractValues(x => (x as IDigitalFormInstance)!.FormData, false).ToList(); var blobLists = ExtractValues(x => (x as IDigitalFormInstance)!.BlobData, false).ToList(); for(var i = 0; i < jsonLists.Count; ++i) { var json = jsonLists[i]; var blobJSON = blobLists[i]; var formData = DigitalForm.DeserializeFormData(json, blobJSON); var formRow = FormDataTable!.NewRow(); formRow["Parent.ID"] = idList[i]; if (formData != null) LoadFormDataIntoRow(formRow, formData); FormDataTable.Rows.Add(formRow); } Load(typeof(CoreTable), FormDataTable!, requiredtables, "Form_Data"); } } }