DigitalFormHostModel.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using comal.timesheets.QAForms;
  2. using Comal.Classes;
  3. using InABox.Clients;
  4. using InABox.Core;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using XF.Material.Forms.UI.Dialogs;
  11. namespace comal.timesheets
  12. {
  13. public class DigitalFormHostModel<TEntity, TEntityLink, TInstance> : IDigitalFormHostModel
  14. where TEntity : Entity, IRemotable, IPersistent, new()
  15. where TEntityLink : EntityLink<TEntity>, new()
  16. where TInstance : Entity, IRemotable, IPersistent, IDigitalFormInstance<TEntityLink>, new()
  17. {
  18. public IDigitalFormDataModel DigitalFormDataModel { get; set; }
  19. public DFLayout DFLayout { get; set; }
  20. public DigitalFormLayout DigitalFormLayout { get; set; }
  21. public Entity Entity { get; set; }
  22. public bool ReadOnly { get; set; }
  23. public bool NewForm { get; set; }
  24. public event OnDigitalFormHostModelSaved OnDigitalFormHostModelSaved;
  25. public event OnDigitalFormHostModelBeforeSave OnDigitalFormHostModelBeforeSave;
  26. public DigitalFormHostModel()
  27. {
  28. DFLayout = new DFLayout();
  29. NewForm = true;
  30. ReadOnly = false;
  31. }
  32. public void LoadItems(Entity parent, Entity form, DigitalFormLayout layout = null)
  33. {
  34. List<DigitalFormVariable> variables = new List<DigitalFormVariable>();
  35. var getLayout = Task.Run(() =>
  36. {
  37. var loadLayout = Task.Run(() =>
  38. {
  39. if (layout == null)
  40. DigitalFormLayout = QueryDigitalFormLayout(form);
  41. else
  42. DigitalFormLayout = layout;
  43. DFLayout.LoadLayout(DigitalFormLayout.Layout);
  44. });
  45. (form as EntityForm<TEntity, TEntityLink>).Form.ID = layout.Form.ID;
  46. var getVariables = Task.Run(() => { variables = QueryVariables(form); });
  47. Task.WaitAll(loadLayout, getVariables);
  48. DFLayout.LoadVariables(variables);
  49. });
  50. var loadDFDataModel = Task.Run(() =>
  51. {
  52. DigitalFormDataModel = new DigitalFormDataModel<TEntity, TEntityLink, TInstance>(parent.ID, form.ID);
  53. DigitalFormDataModel.Load(null);
  54. Entity = DigitalFormDataModel.Entity;
  55. });
  56. Task.WaitAll(getLayout, loadDFDataModel);
  57. DigitalFormDataModel.Instance.Form.ID = DigitalFormLayout.Form.ID;
  58. if (!string.IsNullOrWhiteSpace(DigitalFormDataModel.Instance.FormData))
  59. NewForm = false;
  60. if (DigitalFormDataModel.Instance.FormCompleted != DateTime.MinValue)
  61. ReadOnly = true;
  62. DigitalFormDataModel.BeforeModelSaved += (m) =>
  63. {
  64. OnDigitalFormHostModelBeforeSave?.Invoke();
  65. DigitalFormDataModel.Entity = Entity;
  66. CheckEntity(SaveType.BeforeSave);
  67. };
  68. DigitalFormDataModel.OnModelSaved += (m) =>
  69. {
  70. CheckEntity(SaveType.AfterSave);
  71. OnDigitalFormHostModelSaved?.Invoke();
  72. };
  73. }
  74. public DigitalFormLayout QueryDigitalFormLayout(Entity form)
  75. {
  76. DigitalFormLayout layout = new Client<DigitalFormLayout>().Query
  77. (
  78. new Filter<DigitalFormLayout>(x => x.Form.ID).IsEqualTo((form as EntityForm<TEntity, TEntityLink>).Form.ID)
  79. .And(x => x.Type).IsEqualTo(DFLayoutType.Mobile)
  80. .And(x => x.Active).IsEqualTo(true)
  81. )
  82. .Rows.FirstOrDefault().ToObject<DigitalFormLayout>();
  83. return layout;
  84. }
  85. public List<DigitalFormVariable> QueryVariables(Entity form)
  86. {
  87. List<DigitalFormVariable> variables = new List<DigitalFormVariable>();
  88. var table = new Client<DigitalFormVariable>().Query(
  89. new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo((form as EntityForm<TEntity, TEntityLink>).Form.ID),
  90. new Columns<DigitalFormVariable>(x => x.Code, x => x.Parameters, x => x.Description, x => x.VariableType),
  91. null
  92. );
  93. foreach (CoreRow coreRow in table.Rows)
  94. {
  95. var variable = coreRow.ToObject<DigitalFormVariable>();
  96. variables.Add(variable);
  97. }
  98. return variables;
  99. }
  100. public List<DigitalFormVariable> QueryVariables(DigitalFormLayout layout)
  101. {
  102. List<DigitalFormVariable> variables = new List<DigitalFormVariable>();
  103. var table = new Client<DigitalFormVariable>().Query(
  104. new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(layout.Form.ID),
  105. new Columns<DigitalFormVariable>(x => x.Code, x => x.Parameters, x => x.Description, x => x.VariableType),
  106. null
  107. );
  108. foreach (CoreRow coreRow in table.Rows)
  109. {
  110. var variable = coreRow.ToObject<DigitalFormVariable>();
  111. variables.Add(variable);
  112. }
  113. return variables;
  114. }
  115. public void SetPropertyValues(QAFormViewer viewer) //currently does not include Employee Forms
  116. {
  117. try
  118. {
  119. if (DigitalFormLayout.Form.AppliesTo.Equals("Kanban"))
  120. {
  121. foreach (KeyValuePair<string, string> pair in viewer.propertyResults)
  122. {
  123. if (pair.Key.Contains("ID"))
  124. {
  125. //this only sets the entity lookup.ID, not the description or code - is this an issue??
  126. CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value));
  127. }
  128. else if (DateTime.TryParse(pair.Value, out DateTime datetime))
  129. {
  130. string parsedDate = "";
  131. parsedDate = datetime.ToString("yyyy-mm-dd hh:mm:ss.zzz"); ;
  132. CoreUtils.SetPropertyValue(Entity, pair.Key, parsedDate);
  133. }
  134. else
  135. {
  136. CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value);
  137. }
  138. }
  139. }
  140. else if (DigitalFormLayout.Form.AppliesTo.Equals("LeaveRequest"))
  141. {
  142. foreach (KeyValuePair<string, string> pair in viewer.propertyResults)
  143. {
  144. if (pair.Key.Contains("ID"))
  145. {
  146. CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value));
  147. }
  148. else if (pair.Key.Equals("From"))
  149. {
  150. (Entity as LeaveRequest).From = DateTime.Parse(pair.Value);
  151. }
  152. else if (pair.Key.Equals("To"))
  153. {
  154. (Entity as LeaveRequest).To = DateTime.Parse(pair.Value);
  155. }
  156. else if (pair.Key.Equals("FromTime"))
  157. {
  158. (Entity as LeaveRequest).FromTime = TimeSpan.Parse(pair.Value);
  159. }
  160. else if (pair.Key.Equals("ToTime"))
  161. {
  162. (Entity as LeaveRequest).ToTime = TimeSpan.Parse(pair.Value);
  163. }
  164. else if (pair.Key.Equals("Notes"))
  165. {
  166. (Entity as LeaveRequest).Notes = (Entity as LeaveRequest).Notes + System.Environment.NewLine + pair.Value;
  167. }
  168. else
  169. {
  170. CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value);
  171. }
  172. }
  173. }
  174. }
  175. catch (Exception e)
  176. {
  177. viewer.errors.Add(e.Message);
  178. }
  179. }
  180. private void CheckEntity(SaveType saveType)
  181. {
  182. if (Entity.GetType() == typeof(Kanban))
  183. DoKanbanActions(saveType);
  184. else if (Entity.GetType() == typeof(LeaveRequest))
  185. (Entity as LeaveRequest).EmployeeLink.ID = GlobalVariables.EmpID;
  186. }
  187. private void DoKanbanActions(SaveType saveType)
  188. {
  189. if (saveType == SaveType.BeforeSave)
  190. CheckAndCreateKanban();
  191. else if (saveType == SaveType.AfterSave)
  192. CheckSubscriber();
  193. }
  194. private void CheckAndCreateKanban()
  195. {
  196. if (Entity.ID == Guid.Empty)
  197. {
  198. Kanban kanban = Entity as Kanban;
  199. kanban.EmployeeLink.ID = GlobalVariables.EmpID;
  200. kanban.DueDate = DateTime.Today;
  201. kanban.Title = "Form - " + DigitalFormLayout.Description;
  202. kanban.Notes = new string[] { "Created by Forms App" };
  203. kanban.Category = "In Progress";
  204. Entity = kanban;
  205. }
  206. }
  207. private void CheckSubscriber()
  208. {
  209. var sub = new Client<KanbanSubscriber>().Query(
  210. new Filter<KanbanSubscriber>(x => x.Kanban.ID).IsEqualTo(Entity.ID),
  211. new Columns<KanbanSubscriber>(x => x.ID)
  212. );
  213. if (sub.Rows.Count == 0)
  214. AddSubscriber();
  215. }
  216. private void AddSubscriber()
  217. {
  218. KanbanSubscriber subscriber = new KanbanSubscriber();
  219. subscriber.Kanban.ID = Entity.ID;
  220. subscriber.Assignee = true;
  221. subscriber.Employee.ID = GlobalVariables.EmpID;
  222. new Client<KanbanSubscriber>().Save(subscriber, "Updated From Mobile Device");
  223. }
  224. enum SaveType
  225. {
  226. BeforeSave,
  227. AfterSave,
  228. }
  229. }
  230. }