using Comal.Classes; using InABox.Clients; using InABox.Core; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using IDigitalFormInstance = InABox.Core.IDigitalFormInstance; namespace PRS.Mobile { public class DigitalFormHostModel : IDigitalFormHostModel where TEntity : Entity, IRemotable, IPersistent, new() where TEntityLink : EntityLink, new() where TInstance : Entity, IRemotable, IPersistent, IDigitalFormInstance, new() { public IDigitalFormDataModel DigitalFormDataModel { get; set; } public DFLayout DFLayout { get; set; } public DigitalFormLayout DigitalFormLayout { get; set; } public Entity Entity { get; set; } public bool ReadOnly { get; set; } public bool NewForm { get; set; } public DigitalFormHostModel() { DFLayout = new DFLayout(); NewForm = true; ReadOnly = false; } public void LoadItems(Entity parent, Guid formid, Guid instanceid, DigitalFormLayout? layout = null) { List variables = new List(); var loadLayout = Task.Run(() => { DigitalFormLayout = layout ?? QueryDigitalFormLayout(formid); }); var loadDFDataModel = Task.Run(() => { variables = QueryVariables(formid); DigitalFormDataModel = new DigitalFormDataModel(parent.ID, instanceid, variables.ToArray()); DigitalFormDataModel.Load(null); Entity = DigitalFormDataModel.Entity; }); Task.WaitAll(loadLayout, loadDFDataModel); DFLayout.LoadLayout(DigitalFormLayout.Layout); DFLayout.LoadVariables(variables); DigitalFormDataModel.Instance.Form.ID = DigitalFormLayout.Form.ID; DigitalFormDataModel.Variables = variables.ToArray(); if (!string.IsNullOrWhiteSpace(DigitalFormDataModel.Instance.FormData)) NewForm = false; if (DigitalFormDataModel.Instance.FormCompleted != DateTime.MinValue) ReadOnly = true; } public void LoadItems(TEntity parent, Guid formid, TInstance instance, DigitalFormLayout? layout = null) { List variables = new List(); var loadLayout = Task.Run(() => { DigitalFormLayout = layout ?? QueryDigitalFormLayout(formid); }); var loadDFDataModel = Task.Run(() => { variables = QueryVariables(formid); DigitalFormDataModel = new DigitalFormDataModel(parent, instance, variables.ToArray()); DigitalFormDataModel.Load(null); Entity = DigitalFormDataModel.Entity; }); Task.WaitAll(loadLayout, loadDFDataModel); DFLayout.LoadLayout(DigitalFormLayout.Layout); DFLayout.LoadVariables(variables); DigitalFormDataModel.Instance.Form.ID = DigitalFormLayout.Form.ID; DigitalFormDataModel.Variables = variables.ToArray(); if (!string.IsNullOrWhiteSpace(DigitalFormDataModel.Instance.FormData)) NewForm = false; if (DigitalFormDataModel.Instance.FormCompleted != DateTime.MinValue) ReadOnly = true; } private IDigitalFormInstance GetInstance(Guid iD) { return new Client().Query( new Filter(x => x.ID).IsEqualTo(iD) ).Rows.FirstOrDefault().ToObject(); } public DigitalFormLayout? QueryDigitalFormLayout(Guid formid) { CoreTable layouts = new Client().Query( new Filter(x => x.Form.ID).IsEqualTo(formid) .And(x => x.Active).IsEqualTo(true), new Columns(ColumnTypeFlags.None).Add(x => x.ID) .Add(x => x.Form.ID) .Add(x => x.Form.AppliesTo) .Add(x => x.Layout) .Add(x => x.Type) ); var row = layouts.Rows.FirstOrDefault(r => r.Get(c => c.Type) == DFLayoutType.Mobile) ?? layouts.Rows.FirstOrDefault(); DigitalFormLayout? layout = row?.ToObject(); return layout; } public List QueryVariables(Guid formid) { List variables = new List(); var table = new Client().Query( new Filter(x => x.Form.ID) .IsEqualTo(formid), new Columns(ColumnTypeFlags.None).Add(x => x.Code) .Add(x => x.Parameters) .Add(x => x.Description) .Add(x => x.VariableType), null ); foreach (CoreRow coreRow in table.Rows) variables.Add(CreateVariable(coreRow)); return variables; } // public List QueryVariables(DigitalFormLayout layout) // { // List variables = new List(); // // var table = new Client().Query( // new Filter(x => x.Form.ID).IsEqualTo(layout.Form.ID), // new Columns(x => x.Code, x => x.Parameters, x => x.Description, x => x.VariableType), // null // ); // foreach (CoreRow coreRow in table.Rows) // variables.Add(CreateVariable(coreRow)); // // return variables; // } private DigitalFormVariable CreateVariable(CoreRow row) { DigitalFormVariable v = new DigitalFormVariable(); v.Code = row.Get(x => x.Code); v.Parameters = row.Get(x => x.Parameters); v.Description = row.Get(x => x.Description); v.VariableType = row.Get(x => x.VariableType); return v; } // public void SetPropertyValues(QAFormViewer viewer) //currently does not include Employee Forms // { // try // { // if (DigitalFormLayout.Form.AppliesTo.Equals("Kanban")) // { // foreach (KeyValuePair pair in viewer.EntityResults) // { // if (pair.Key.Contains("ID")) // { // //this only sets the entity lookup.ID, not the description or code - is this an issue?? // CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value)); // } // else if (DateTime.TryParse(pair.Value, out DateTime datetime)) // { // string parsedDate = ""; // parsedDate = datetime.ToString("yyyy-mm-dd hh:mm:ss.zzz"); ; // CoreUtils.SetPropertyValue(Entity, pair.Key, parsedDate); // } // else // { // CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value); // } // // } // } // else if (DigitalFormLayout.Form.AppliesTo.Equals("LeaveRequest")) // { // foreach (KeyValuePair pair in viewer.EntityResults) // { // if (pair.Key.Contains("ID")) // { // CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value)); // } // else if (pair.Key.Equals("From")) // { // (Entity as LeaveRequest).From = DateTime.Parse(pair.Value); // } // else if (pair.Key.Equals("To")) // { // (Entity as LeaveRequest).To = DateTime.Parse(pair.Value); // } // else if (pair.Key.Equals("FromTime")) // { // (Entity as LeaveRequest).FromTime = TimeSpan.Parse(pair.Value); // } // else if (pair.Key.Equals("ToTime")) // { // (Entity as LeaveRequest).ToTime = TimeSpan.Parse(pair.Value); // if ((Entity as LeaveRequest).ToTime == new TimeSpan(0)) // { // (Entity as LeaveRequest).ToTime = new TimeSpan(23, 59, 59); // } // } // else if (pair.Key.Equals("Notes")) // { // (Entity as LeaveRequest).Notes = (Entity as LeaveRequest).Notes + System.Environment.NewLine + pair.Value; // } // else // { // CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value); // } // } // } // } // catch (Exception e) // { // viewer.errors.Add(e.Message); // } // } private void CheckSubscriber() { var sub = new Client().Query( new Filter(x => x.Kanban.ID).IsEqualTo(Entity.ID), new Columns(ColumnTypeFlags.None).Add(x => x.ID) ); if (sub.Rows.Count == 0) AddSubscriber(); } private void AddSubscriber() { KanbanSubscriber subscriber = new KanbanSubscriber(); subscriber.Kanban.ID = Entity.ID; subscriber.Assignee = true; subscriber.Employee.ID = App.Data.Me.ID; new Client().Save(subscriber, "Updated From Mobile Device"); } enum SaveType { BeforeSave, AfterSave, } } }