DigitalFormHostModel.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. // This needs to be set in the provided form, because layout may well be null
  46. //(form as EntityForm<TEntity, TEntityLink>).Form.ID = layout.Form.ID;
  47. var getVariables = Task.Run(() => { variables = QueryVariables(form); });
  48. Task.WaitAll(loadLayout, getVariables);
  49. DFLayout.LoadVariables(variables);
  50. });
  51. var loadDFDataModel = Task.Run(() =>
  52. {
  53. DigitalFormDataModel = new DigitalFormDataModel<TEntity, TEntityLink, TInstance>(parent.ID, form.ID);
  54. DigitalFormDataModel.Load(null);
  55. Entity = DigitalFormDataModel.Entity;
  56. });
  57. Task.WaitAll(getLayout, loadDFDataModel);
  58. DigitalFormDataModel.Instance.Form.ID = DigitalFormLayout.Form.ID;
  59. if (!string.IsNullOrWhiteSpace(DigitalFormDataModel.Instance.FormData))
  60. NewForm = false;
  61. if (DigitalFormDataModel.Instance.FormCompleted != DateTime.MinValue)
  62. ReadOnly = true;
  63. DigitalFormDataModel.BeforeModelSaved += (m) =>
  64. {
  65. OnDigitalFormHostModelBeforeSave?.Invoke();
  66. DigitalFormDataModel.Entity = Entity;
  67. CheckEntity(SaveType.BeforeSave);
  68. };
  69. DigitalFormDataModel.OnModelSaved += (m) =>
  70. {
  71. CheckEntity(SaveType.AfterSave);
  72. OnDigitalFormHostModelSaved?.Invoke();
  73. };
  74. }
  75. public DigitalFormLayout QueryDigitalFormLayout(Entity form)
  76. {
  77. CoreTable layouts = new Client<DigitalFormLayout>().Query
  78. (
  79. new Filter<DigitalFormLayout>(x => x.Form.ID)
  80. .IsEqualTo((form as EntityForm<TEntity, TEntityLink>).Form.ID)
  81. //.And(x => x.Type).IsEqualTo(DFLayoutType.Mobile)
  82. .And(x => x.Active).IsEqualTo(true)
  83. );
  84. DigitalFormLayout layout = layouts.Rows.FirstOrDefault(r=>r.Get<DigitalFormLayout,DFLayoutType>(c=>c.Type) == DFLayoutType.Mobile)?.ToObject<DigitalFormLayout>();
  85. if (layout == null)
  86. layout = layouts.Rows.FirstOrDefault()?.ToObject<DigitalFormLayout>();
  87. return layout;
  88. }
  89. public List<DigitalFormVariable> QueryVariables(Entity form)
  90. {
  91. List<DigitalFormVariable> variables = new List<DigitalFormVariable>();
  92. var table = new Client<DigitalFormVariable>().Query(
  93. new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo((form as EntityForm<TEntity, TEntityLink>).Form.ID),
  94. new Columns<DigitalFormVariable>(x => x.Code, x => x.Parameters, x => x.Description, x => x.VariableType),
  95. null
  96. );
  97. foreach (CoreRow coreRow in table.Rows)
  98. {
  99. var variable = coreRow.ToObject<DigitalFormVariable>();
  100. variables.Add(variable);
  101. }
  102. return variables;
  103. }
  104. public List<DigitalFormVariable> QueryVariables(DigitalFormLayout layout)
  105. {
  106. List<DigitalFormVariable> variables = new List<DigitalFormVariable>();
  107. var table = new Client<DigitalFormVariable>().Query(
  108. new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(layout.Form.ID),
  109. new Columns<DigitalFormVariable>(x => x.Code, x => x.Parameters, x => x.Description, x => x.VariableType),
  110. null
  111. );
  112. foreach (CoreRow coreRow in table.Rows)
  113. {
  114. var variable = coreRow.ToObject<DigitalFormVariable>();
  115. variables.Add(variable);
  116. }
  117. return variables;
  118. }
  119. public void SetPropertyValues(QAFormViewer viewer) //currently does not include Employee Forms
  120. {
  121. try
  122. {
  123. if (DigitalFormLayout.Form.AppliesTo.Equals("Kanban"))
  124. {
  125. foreach (KeyValuePair<string, string> pair in viewer.propertyResults)
  126. {
  127. if (pair.Key.Contains("ID"))
  128. {
  129. //this only sets the entity lookup.ID, not the description or code - is this an issue??
  130. CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value));
  131. }
  132. else if (DateTime.TryParse(pair.Value, out DateTime datetime))
  133. {
  134. string parsedDate = "";
  135. parsedDate = datetime.ToString("yyyy-mm-dd hh:mm:ss.zzz"); ;
  136. CoreUtils.SetPropertyValue(Entity, pair.Key, parsedDate);
  137. }
  138. else
  139. {
  140. CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value);
  141. }
  142. }
  143. }
  144. else if (DigitalFormLayout.Form.AppliesTo.Equals("LeaveRequest"))
  145. {
  146. foreach (KeyValuePair<string, string> pair in viewer.propertyResults)
  147. {
  148. if (pair.Key.Contains("ID"))
  149. {
  150. CoreUtils.SetPropertyValue(Entity, pair.Key, Guid.Parse(pair.Value));
  151. }
  152. else if (pair.Key.Equals("From"))
  153. {
  154. (Entity as LeaveRequest).From = DateTime.Parse(pair.Value);
  155. }
  156. else if (pair.Key.Equals("To"))
  157. {
  158. (Entity as LeaveRequest).To = DateTime.Parse(pair.Value);
  159. }
  160. else if (pair.Key.Equals("FromTime"))
  161. {
  162. (Entity as LeaveRequest).FromTime = TimeSpan.Parse(pair.Value);
  163. }
  164. else if (pair.Key.Equals("ToTime"))
  165. {
  166. (Entity as LeaveRequest).ToTime = TimeSpan.Parse(pair.Value);
  167. }
  168. else if (pair.Key.Equals("Notes"))
  169. {
  170. (Entity as LeaveRequest).Notes = (Entity as LeaveRequest).Notes + System.Environment.NewLine + pair.Value;
  171. }
  172. else
  173. {
  174. CoreUtils.SetPropertyValue(Entity, pair.Key, pair.Value);
  175. }
  176. }
  177. }
  178. }
  179. catch (Exception e)
  180. {
  181. viewer.errors.Add(e.Message);
  182. }
  183. }
  184. private void CheckEntity(SaveType saveType)
  185. {
  186. if (Entity.GetType() == typeof(Kanban))
  187. DoKanbanActions(saveType);
  188. else if (Entity.GetType() == typeof(LeaveRequest))
  189. (Entity as LeaveRequest).EmployeeLink.ID = GlobalVariables.EmpID;
  190. }
  191. private void DoKanbanActions(SaveType saveType)
  192. {
  193. if (saveType == SaveType.BeforeSave)
  194. CheckAndCreateKanban();
  195. else if (saveType == SaveType.AfterSave)
  196. CheckSubscriber();
  197. }
  198. private void CheckAndCreateKanban()
  199. {
  200. if (Entity.ID == Guid.Empty)
  201. {
  202. Kanban kanban = Entity as Kanban;
  203. kanban.EmployeeLink.ID = GlobalVariables.EmpID;
  204. kanban.DueDate = DateTime.Today;
  205. kanban.Title = "Form - " + DigitalFormLayout.Form.Description;
  206. kanban.Notes = new string[] { "Created by Forms App" };
  207. kanban.Category = "In Progress";
  208. Entity = kanban;
  209. }
  210. }
  211. private void CheckSubscriber()
  212. {
  213. var sub = new Client<KanbanSubscriber>().Query(
  214. new Filter<KanbanSubscriber>(x => x.Kanban.ID).IsEqualTo(Entity.ID),
  215. new Columns<KanbanSubscriber>(x => x.ID)
  216. );
  217. if (sub.Rows.Count == 0)
  218. AddSubscriber();
  219. }
  220. private void AddSubscriber()
  221. {
  222. KanbanSubscriber subscriber = new KanbanSubscriber();
  223. subscriber.Kanban.ID = Entity.ID;
  224. subscriber.Assignee = true;
  225. subscriber.Employee.ID = GlobalVariables.EmpID;
  226. new Client<KanbanSubscriber>().Save(subscriber, "Updated From Mobile Device");
  227. }
  228. enum SaveType
  229. {
  230. BeforeSave,
  231. AfterSave,
  232. }
  233. }
  234. }