using System; using System.Collections.Generic; using System.Linq; using InABox.Clients; namespace InABox.Core { /// /// /// /// Should always be an EntityForm<,> public class DigitalFormReportDataModel : AutoDataModel where T : Entity, IRemotable, IPersistent, new() { private Guid? FormId { get; set; } = null; private CoreTable? FormDataTable { get; set; } = null; private DigitalFormVariable[] Variables = null; 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) }); var variables = new Client().Load(new Filter(x => x.Form.ID).IsEqualTo(formID)); foreach (var variable in variables) formDataTable.Columns.Add( new CoreColumn { ColumnName = variable.Code, DataType = DigitalFormVariable.DataType(variable.FieldType()) } ); FormDataTable = formDataTable; Variables = variables; AddTable(typeof(CoreTable), formDataTable, true, "Form_Data"); LinkTable(typeof(T), "ID", typeof(CoreTable), "Parent.ID", childalias: "Form_Data"); } 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); var formDatas = jsonLists.Select(x => Serialization.Deserialize>(x)); foreach (var (i, formData) in formDatas.Select((x, i) => new Tuple>(i, x))) { var formRow = FormDataTable.NewRow(); formRow["Parent.ID"] = idList[i]; if(formData != null) { foreach (var key in formData.Keys) { var variable = Variables.FirstOrDefault(x => string.Equals(x.Code, key)); if (variable != null) formRow[key] = variable.ParseValue(formData[key]); } } FormDataTable.Rows.Add(formRow); } Load(typeof(CoreTable), FormDataTable, requiredtables, "Form_Data"); } } }