AssignmentAppointment.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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.WPF;
  13. namespace PRSDesktop
  14. {
  15. public class AssignmentAppointment : CalendarAppointment<Assignment>, INotifyPropertyChanged
  16. {
  17. public CalendarAssignmentType AssignmentType { get; }
  18. public override TimeSpan StartTime => AssignmentType switch
  19. {
  20. CalendarAssignmentType.Booked => Model.Booked.Start,
  21. CalendarAssignmentType.Actual => Model.Actual.Start,
  22. _ => Model.EffectiveStartTime()
  23. };
  24. public override TimeSpan EndTime => AssignmentType switch
  25. {
  26. CalendarAssignmentType.Booked => Model.Booked.Finish,
  27. CalendarAssignmentType.Actual => Model.Actual.Finish,
  28. _ => Model.EffectiveFinishTime()
  29. };
  30. public override DateTime Date => Model.Date;
  31. public AssignmentAppointment(Assignment model, Employee employee, CalendarAssignmentType type)
  32. : base(model, employee, x => x.ActivityLink.Color)
  33. {
  34. AssignmentType = type;
  35. Notes = Model.Description;
  36. var subject = new List<string>() { model.Number.ToString() };
  37. if (model.JobLink.ID != Guid.Empty)
  38. subject.Add(
  39. model.ITP.ID != Guid.Empty
  40. ? $"{model.JobLink.JobNumber}-{model.ITP.Code}"
  41. : $"{model.JobLink.JobNumber}"
  42. );
  43. if (model.Task.ID != Guid.Empty)
  44. subject.Add($"Task {model.Task.Number}");
  45. if (model.Meeting.Link.ID != Guid.Empty)
  46. subject.Add($"Mtg {model.Meeting.Link.Number}");
  47. subject.Add(model.Title ?? "");
  48. Subject = string.Join(" ", subject);
  49. var images = new List<Bitmap>();
  50. if (!model.Completed.IsEmpty())
  51. images.Add(Resources.tick_sml.Resize(32,32));
  52. if (model.Delivery.ID != Guid.Empty)
  53. images.Add(Resources.box_sml.Resize(32,32));
  54. if (model.Meeting.Link.ID != Guid.Empty)
  55. images.Add(Resources.employees.Resize(32,32));
  56. Image = ImageUtils.MergeBitmaps(images, 10)?.AsBitmapImage();
  57. WeakEventManager<Assignment, PropertyChangedEventArgs>.AddHandler(model, nameof(Assignment.PropertyChanged), Assignment_Changed);
  58. }
  59. private static Column<Assignment>[] StartColumns = [
  60. new(x => x.Booked.Start),
  61. new(x => x.Actual.Start),
  62. ];
  63. private static Column<Assignment>[] FinishColumns = [
  64. new(x => x.Booked.Finish),
  65. new(x => x.Actual.Finish),
  66. ];
  67. private void Assignment_Changed(object? sender, PropertyChangedEventArgs e)
  68. {
  69. if(StartColumns.Any(x => x.Property == e.PropertyName))
  70. {
  71. OnPropertyChanged(nameof(StartTime));
  72. }
  73. else if(FinishColumns.Any(x => x.Property == e.PropertyName))
  74. {
  75. OnPropertyChanged(nameof(EndTime));
  76. }
  77. else if(e.PropertyName == nameof(Assignment.Date))
  78. {
  79. OnPropertyChanged(nameof(Date));
  80. }
  81. }
  82. public event PropertyChangedEventHandler? PropertyChanged;
  83. private void OnPropertyChanged([CallerMemberName] string? propertyName = null)
  84. {
  85. PropertyChanged?.Invoke(this, new(propertyName));
  86. }
  87. }
  88. }