AssignmentDetailModel.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Runtime.CompilerServices;
  6. using Comal.Classes;
  7. using InABox.Core;
  8. using JetBrains.Annotations;
  9. using Syncfusion.Drawing;
  10. namespace comal.timesheets
  11. {
  12. public class AssignmentFormInstance : INotifyPropertyChanged
  13. {
  14. private Guid _id = Guid.Empty;
  15. public Guid ID
  16. {
  17. get => _id;
  18. set => SetField(ref _id, value);
  19. }
  20. private String _description = "";
  21. public String Description
  22. {
  23. get => _description;
  24. set => SetField(ref _description, value);
  25. }
  26. private bool _completed = false;
  27. public bool Completed
  28. {
  29. get => _completed;
  30. set => SetField(ref _completed, value);
  31. }
  32. public event PropertyChangedEventHandler PropertyChanged;
  33. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  34. {
  35. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  36. }
  37. protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
  38. {
  39. if (EqualityComparer<T>.Default.Equals(field, value)) return false;
  40. field = value;
  41. OnPropertyChanged(propertyName);
  42. return true;
  43. }
  44. }
  45. public class AssignmentDetailModel : DetailDataModel<AssignmentDetailModel, AssignmentDetailShell, Assignment>
  46. {
  47. public AssignmentDetailModel(ICoreDataModelHost host, bool transient = false) : base(host, transient)
  48. {
  49. Reset();
  50. }
  51. public AssignmentDetailModel(ICoreDataModelHost host, [NotNull] String filename) : base(host, filename)
  52. {
  53. Reset();
  54. }
  55. private void Reset()
  56. {
  57. JobID = Guid.Empty;
  58. EmployeeID = Guid.Empty;
  59. Activities = new List<KeyValuePair<Guid, String>>();
  60. Forms = new List<AssignmentFormInstance>();
  61. Coordinates = new PointF();
  62. }
  63. public Guid JobID { get; set; }
  64. public Guid EmployeeID { get; set; }
  65. public List<KeyValuePair<Guid, String>> Activities { get; private set; }
  66. public List<AssignmentFormInstance> Forms { get; private set; }
  67. public PointF Coordinates { get; set; }
  68. public override Columns<Assignment> Columns => new Columns<Assignment>(x => x.ID)
  69. .Add(x=>x.Number)
  70. .Add(x => x.Title)
  71. .Add(x => x.Description)
  72. .Add(x => x.Date)
  73. .Add(x => x.Actual.Start)
  74. .Add(x => x.Actual.Duration)
  75. .Add(x => x.Actual.Finish)
  76. .Add(x => x.Booked.Start)
  77. .Add(x => x.Booked.Duration)
  78. .Add(x => x.Booked.Finish)
  79. .Add(c => c.JobLink.ID)
  80. .Add(c => c.JobLink.JobNumber)
  81. .Add(c => c.JobLink.Name)
  82. .Add(c => c.ActivityLink.ID)
  83. .Add(c => c.ActivityLink.Code)
  84. .Add(c => c.ActivityLink.Description)
  85. .Add(c => c.EmployeeLink.ID)
  86. .Add(c => c.ActivityLink.Color)
  87. .Add(c => c.Task.ID)
  88. .Add(c => c.Task.Number)
  89. .Add(c => c.Task.Title)
  90. .Add(c => c.Completed);
  91. public override void BeforeLoad(MultiQuery query, Guid id)
  92. {
  93. base.BeforeLoad(query, id);
  94. query.Add<EmployeeActivity>(
  95. new Filter<EmployeeActivity>(x => x.ID).IsEqualTo(EmployeeID),
  96. new Columns<EmployeeActivity>(x=>x.Activity.ID).Add(x=>x.Activity.Code).Add(x=>x.Activity.Description)
  97. );
  98. if (JobID != Guid.Empty)
  99. {
  100. query.Add<Job>(
  101. new Filter<Job>(x => x.ID).IsEqualTo(JobID),
  102. new Columns<Job>(x => x.SiteAddress.Location.Latitude)
  103. .Add(x => x.SiteAddress.Location.Longitude)
  104. );
  105. }
  106. query.Add<AssignmentForm>(
  107. new Filter<AssignmentForm>(x => x.Parent.ID).IsEqualTo(id),
  108. new Columns<AssignmentForm>(x => x.ID)
  109. .Add(x => x.Form.Code)
  110. .Add(x => x.Form.Description)
  111. .Add(x => x.FormCompleted)
  112. );
  113. }
  114. public override void AfterLoad(MultiQuery query, Guid id)
  115. {
  116. base.AfterLoad(query, id);
  117. JobID = Item.JobID;
  118. EmployeeID = Item.EmployeeID;
  119. Activities = query.Get<EmployeeActivity>().ToDictionary<EmployeeActivity, Guid, String>(
  120. x => x.Activity.ID,
  121. (row) => String.Format("{0}: {1}", row.Get<EmployeeActivity, String>(c => c.Activity.Code),
  122. row.Get<EmployeeActivity, String>(c => c.Activity.Description)),
  123. x => x.Activity.Code
  124. ).ToList();
  125. if (JobID != Guid.Empty)
  126. {
  127. Coordinates = query.Get<Job>().Rows.Select(r => new PointF(
  128. (float)r.Get<Job, double>(c => c.SiteAddress.Location.Longitude),
  129. (float)r.Get<Job, double>(c => c.SiteAddress.Location.Latitude)
  130. )).FirstOrDefault();
  131. }
  132. else
  133. Coordinates = PointF.Empty;
  134. Forms = query.Get<AssignmentForm>()
  135. .Rows
  136. .Select(row => new AssignmentFormInstance()
  137. {
  138. ID = row.Get<AssignmentForm,Guid>(c=>c.ID),
  139. Description = row.Get<AssignmentForm, String>(c => c.Form.Description),
  140. Completed = !row.Get<AssignmentForm,DateTime>(c=>c.FormCompleted).IsEmpty()
  141. }).ToList();
  142. //.ToDictionary<AssignmentForm, Guid, String>(
  143. //x => x.ID,
  144. //(row) => String.Format("{0}: {1}", row.Get<AssignmentForm, String>(c => c.Form.Code),
  145. //
  146. //x => x.Form.Code
  147. //).ToList();
  148. }
  149. protected override void DoUnload()
  150. {
  151. base.DoUnload();
  152. Reset();
  153. }
  154. }
  155. }