AssignmentAppointment.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using System.Windows;
  8. using System.Windows.Media.Imaging;
  9. using Comal.Classes;
  10. using Geocoding;
  11. using InABox.Core;
  12. using InABox.DynamicGrid;
  13. using InABox.WPF;
  14. namespace PRSDesktop
  15. {
  16. public class AssignmentAppointment : CalendarAppointment<Assignment>
  17. {
  18. public CalendarAssignmentType AssignmentType { get; }
  19. public override TimeSpan StartTime
  20. {
  21. get => AssignmentType switch
  22. {
  23. CalendarAssignmentType.Booked => Model.Booked.Start,
  24. CalendarAssignmentType.Actual => Model.Actual.Start,
  25. _ => Model.EffectiveStartTime()
  26. };
  27. set
  28. {
  29. switch (AssignmentType)
  30. {
  31. case CalendarAssignmentType.Automatic:
  32. case CalendarAssignmentType.Actual:
  33. Model.Actual.Start = value;
  34. break;
  35. case CalendarAssignmentType.Booked:
  36. Model.Booked.Start = value;
  37. break;
  38. }
  39. OnUpdate?.Invoke();
  40. }
  41. }
  42. public override TimeSpan EndTime
  43. {
  44. get => AssignmentType switch
  45. {
  46. CalendarAssignmentType.Booked => Model.Booked.Finish,
  47. CalendarAssignmentType.Actual => Model.Actual.Finish,
  48. _ => Model.EffectiveFinishTime()
  49. };
  50. set
  51. {
  52. switch (AssignmentType)
  53. {
  54. case CalendarAssignmentType.Automatic:
  55. case CalendarAssignmentType.Actual:
  56. Model.Actual.Finish = value;
  57. break;
  58. case CalendarAssignmentType.Booked:
  59. Model.Booked.Finish = value;
  60. break;
  61. }
  62. OnUpdate?.Invoke();
  63. }
  64. }
  65. public override bool CanAdjust => true;
  66. public override DateTime Date
  67. {
  68. get => Model.Date;
  69. set
  70. {
  71. Model.Date = value;
  72. OnUpdate?.Invoke();
  73. }
  74. }
  75. public override Employee? Employee
  76. {
  77. get => base.Employee;
  78. set
  79. {
  80. base.Employee = value;
  81. Model.EmployeeLink.ID = value?.ID ?? Guid.Empty;
  82. OnUpdate?.Invoke();
  83. }
  84. }
  85. public event Action? OnUpdate;
  86. public AssignmentAppointment(Assignment model, Employee employee, CalendarAssignmentType type)
  87. : base(model, employee, x => x.ActivityLink.Color)
  88. {
  89. AssignmentType = type;
  90. Notes = Model.Description;
  91. Subject = GetSubject();
  92. Image = GetImage();
  93. WeakEventManager<Assignment, PropertyChangedEventArgs>.AddHandler(model, nameof(Assignment.PropertyChanged), Assignment_Changed);
  94. }
  95. private static Column<Assignment>[] SubjectColumns = [
  96. new(x => x.Number),
  97. new(x => x.JobLink.JobNumber),
  98. new(x => x.ITP.Code),
  99. new(x => x.Task.Number),
  100. new(x => x.Meeting.Link.Number),
  101. new(x => x.Title),
  102. ];
  103. private string GetSubject()
  104. {
  105. var subject = new List<string>() { Model.Number.ToString() };
  106. if (Model.JobLink.ID != Guid.Empty)
  107. subject.Add(
  108. Model.ITP.ID != Guid.Empty
  109. ? $"{Model.JobLink.JobNumber}-{Model.ITP.Code}"
  110. : $"{Model.JobLink.JobNumber}"
  111. );
  112. if (Model.Task.ID != Guid.Empty)
  113. subject.Add($"Task {Model.Task.Number}");
  114. if (Model.Meeting.Link.ID != Guid.Empty)
  115. subject.Add($"Mtg {Model.Meeting.Link.Number}");
  116. subject.Add(Model.Title ?? "");
  117. return string.Join(" ", subject);
  118. }
  119. private static Column<Assignment>[] ImageColumns = [
  120. new(x => x.Completed),
  121. new(x => x.Delivery.ID),
  122. new(x => x.Meeting.Link.ID),
  123. ];
  124. private BitmapImage? GetImage()
  125. {
  126. var images = new List<Bitmap>();
  127. if (!Model.Completed.IsEmpty())
  128. images.Add(Resources.tick_sml.Resize(32,32));
  129. if (Model.Delivery.ID != Guid.Empty)
  130. images.Add(Resources.box_sml.Resize(32,32));
  131. if (Model.Meeting.Link.ID != Guid.Empty)
  132. images.Add(Resources.employees.Resize(32,32));
  133. return ImageUtils.MergeBitmaps(images, 10)?.AsBitmapImage();
  134. }
  135. private static Column<Assignment>[] StartColumns = [
  136. new(x => x.Booked.Start),
  137. new(x => x.Actual.Start),
  138. ];
  139. private static Column<Assignment>[] FinishColumns = [
  140. new(x => x.Booked.Finish),
  141. new(x => x.Actual.Finish),
  142. ];
  143. private void Assignment_Changed(object? sender, PropertyChangedEventArgs e)
  144. {
  145. if(StartColumns.Any(x => x.Property == e.PropertyName))
  146. {
  147. OnPropertyChanged(nameof(StartTime));
  148. }
  149. else if(FinishColumns.Any(x => x.Property == e.PropertyName))
  150. {
  151. OnPropertyChanged(nameof(EndTime));
  152. }
  153. else if(e.PropertyName == nameof(Assignment.Date))
  154. {
  155. OnPropertyChanged(nameof(Date));
  156. }
  157. else if(e.PropertyName == $"{nameof(Assignment.EmployeeLink)}.{nameof(Employee.ID)}")
  158. {
  159. EmployeeChanged?.Invoke(this, new());
  160. }
  161. if(SubjectColumns.Any(x => x.Property == e.PropertyName))
  162. {
  163. Subject = GetSubject();
  164. OnPropertyChanged(nameof(Subject));
  165. }
  166. else if(e.PropertyName == nameof(Assignment.Description))
  167. {
  168. Notes = Model.Description;
  169. OnPropertyChanged(nameof(Notes));
  170. }
  171. else if(e.PropertyName == $"{nameof(Assignment.ActivityLink)}.{nameof(Assignment.ActivityLink.Color)}")
  172. {
  173. UpdateColour();
  174. OnPropertyChanged(nameof(Background));
  175. OnPropertyChanged(nameof(Foreground));
  176. }
  177. if(ImageColumns.Any(x => x.Property == e.PropertyName))
  178. {
  179. Image = GetImage();
  180. OnPropertyChanged(nameof(Image));
  181. }
  182. }
  183. public event EventHandler<EventArgs>? EmployeeChanged;
  184. }
  185. }