| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using InABox.Clients;
- namespace InABox.Core
- {
- /// <summary>
- /// </summary>
- /// <typeparam name="T">
- /// Should always be an EntityForm<,></typeparam>
- public class DigitalFormReportDataModel<T> : AutoDataModel<T>
- 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<T> filter, Guid? formId = null) : base(filter)
- {
- FormId = formId;
- }
- public override string Name => "Digital Form Reports";
- protected override void CheckRequiredTables(List<string> requiredtables)
- {
- base.CheckRequiredTables(requiredtables);
- requiredtables.Add(TableName<T>());
- }
- private void LoadFormDataTable(Guid formID)
- {
- var formDataTable = new CoreTable();
- formDataTable.Columns.Add(new CoreColumn
- {
- ColumnName = "Parent.ID",
- DataType = typeof(Guid)
- });
- var variables = new Client<DigitalFormVariable>().Load(new Filter<DigitalFormVariable>(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<string> requiredtables)
- {
- base.AfterLoad(requiredtables);
- if(FormDataTable == null)
- {
- LoadFormDataTable(FormId ?? ExtractValues<T, Guid>(x => (x as IDigitalFormInstance).Form.ID).FirstOrDefault());
- }
- var idList = ExtractValues<T, Guid>(x => x.ID);
- var jsonLists = ExtractValues<T, string>(x => (x as IDigitalFormInstance).FormData);
- var formDatas = jsonLists.Select(x => Serialization.Deserialize<Dictionary<string, object>>(x));
- foreach (var (i, formData) in formDatas.Select((x, i) => new Tuple<int, Dictionary<string, object>>(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");
- }
- }
- }
|