AssignmentAppointment.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 => Model.Date;
  67. public event Action? OnUpdate;
  68. public AssignmentAppointment(Assignment model, Employee employee, CalendarAssignmentType type)
  69. : base(model, employee, x => x.ActivityLink.Color)
  70. {
  71. AssignmentType = type;
  72. Notes = Model.Description;
  73. Subject = GetSubject();
  74. Image = GetImage();
  75. WeakEventManager<Assignment, PropertyChangedEventArgs>.AddHandler(model, nameof(Assignment.PropertyChanged), Assignment_Changed);
  76. }
  77. private static Column<Assignment>[] SubjectColumns = [
  78. new(x => x.Number),
  79. new(x => x.JobLink.JobNumber),
  80. new(x => x.ITP.Code),
  81. new(x => x.Task.Number),
  82. new(x => x.Meeting.Link.Number),
  83. new(x => x.Title),
  84. ];
  85. private string GetSubject()
  86. {
  87. var subject = new List<string>() { Model.Number.ToString() };
  88. if (Model.JobLink.ID != Guid.Empty)
  89. subject.Add(
  90. Model.ITP.ID != Guid.Empty
  91. ? $"{Model.JobLink.JobNumber}-{Model.ITP.Code}"
  92. : $"{Model.JobLink.JobNumber}"
  93. );
  94. if (Model.Task.ID != Guid.Empty)
  95. subject.Add($"Task {Model.Task.Number}");
  96. if (Model.Meeting.Link.ID != Guid.Empty)
  97. subject.Add($"Mtg {Model.Meeting.Link.Number}");
  98. subject.Add(Model.Title ?? "");
  99. return string.Join(" ", subject);
  100. }
  101. private static Column<Assignment>[] ImageColumns = [
  102. new(x => x.Completed),
  103. new(x => x.Delivery.ID),
  104. new(x => x.Meeting.Link.ID),
  105. ];
  106. private BitmapImage? GetImage()
  107. {
  108. var images = new List<Bitmap>();
  109. if (!Model.Completed.IsEmpty())
  110. images.Add(Resources.tick_sml.Resize(32,32));
  111. if (Model.Delivery.ID != Guid.Empty)
  112. images.Add(Resources.box_sml.Resize(32,32));
  113. if (Model.Meeting.Link.ID != Guid.Empty)
  114. images.Add(Resources.employees.Resize(32,32));
  115. return ImageUtils.MergeBitmaps(images, 10)?.AsBitmapImage();
  116. }
  117. private static Column<Assignment>[] StartColumns = [
  118. new(x => x.Booked.Start),
  119. new(x => x.Actual.Start),
  120. ];
  121. private static Column<Assignment>[] FinishColumns = [
  122. new(x => x.Booked.Finish),
  123. new(x => x.Actual.Finish),
  124. ];
  125. private void Assignment_Changed(object? sender, PropertyChangedEventArgs e)
  126. {
  127. if(StartColumns.Any(x => x.Property == e.PropertyName))
  128. {
  129. OnPropertyChanged(nameof(StartTime));
  130. }
  131. else if(FinishColumns.Any(x => x.Property == e.PropertyName))
  132. {
  133. OnPropertyChanged(nameof(EndTime));
  134. }
  135. else if(e.PropertyName == nameof(Assignment.Date))
  136. {
  137. OnPropertyChanged(nameof(Date));
  138. }
  139. else if(e.PropertyName == $"{nameof(Assignment.EmployeeLink)}.{nameof(Employee.ID)}")
  140. {
  141. EmployeeChanged?.Invoke(this, new());
  142. }
  143. if(SubjectColumns.Any(x => x.Property == e.PropertyName))
  144. {
  145. Subject = GetSubject();
  146. OnPropertyChanged(nameof(Subject));
  147. }
  148. else if(e.PropertyName == nameof(Assignment.Description))
  149. {
  150. Notes = Model.Description;
  151. OnPropertyChanged(nameof(Notes));
  152. }
  153. else if(e.PropertyName == $"{nameof(Assignment.ActivityLink)}.{nameof(Assignment.ActivityLink.Color)}")
  154. {
  155. UpdateColour();
  156. OnPropertyChanged(nameof(Background));
  157. OnPropertyChanged(nameof(Foreground));
  158. }
  159. if(ImageColumns.Any(x => x.Property == e.PropertyName))
  160. {
  161. Image = GetImage();
  162. OnPropertyChanged(nameof(Image));
  163. }
  164. }
  165. public event EventHandler<EventArgs>? EmployeeChanged;
  166. }
  167. }