DeliveryPanel.xaml.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using Comal.Classes;
  8. using InABox.Clients;
  9. using InABox.Configuration;
  10. using InABox.Core;
  11. using InABox.DynamicGrid;
  12. using InABox.WPF;
  13. namespace PRSDesktop
  14. {
  15. /// <summary>
  16. /// Interaction logic for DeliveryPanel.xaml
  17. /// </summary>
  18. public partial class DeliveryPanel : UserControl, IPanel<Delivery>, IJobControl
  19. {
  20. private Delivery _delivery = new Delivery();
  21. private DeliveryScreenSettings settings;
  22. public DeliveryPanel()
  23. {
  24. InitializeComponent();
  25. Deliveries.OnSelectItem += Deliveries_OnSelectItem;
  26. Requis.OnChanged += OnChanged;
  27. Racks.OnChanged += OnChanged;
  28. Bookings.LoadSettings += (sender) => new UserConfiguration<CalendarSettings>("Deliveries").Load();
  29. Bookings.SaveSettings += (sender, properties) => new UserConfiguration<CalendarSettings>("Deliveries").Save(properties);
  30. }
  31. public Job Job
  32. {
  33. get => Deliveries.Job;
  34. set => Deliveries.Job = value;
  35. }
  36. public JobPanelSettings Settings { get; set; }
  37. public bool IsReady { get; set; }
  38. public event DataModelUpdateEvent? OnUpdateDataModel;
  39. private CalendarSettings Bookings_OnLoadSettings(object sender) =>
  40. new UserConfiguration<CalendarSettings>("Deliveries").Load();
  41. private void Bookings_OnSaveSettings(object sender, CalendarSettings properties) =>
  42. new UserConfiguration<CalendarSettings>("Deliveries").Save(properties);
  43. public void Setup()
  44. {
  45. settings = new UserConfiguration<DeliveryScreenSettings>().Load();
  46. SplitPanel.View = settings.ViewType == ScreenViewType.Register ? DynamicSplitPanelView.Master :
  47. settings.ViewType == ScreenViewType.Details ? DynamicSplitPanelView.Detail : DynamicSplitPanelView.Combined;
  48. SplitPanel.AnchorWidth = settings.AnchorWidth;
  49. Bookings.Setup();
  50. Deliveries.ColumnsTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
  51. Deliveries.Refresh(true, false);
  52. Items.Refresh(true, false);
  53. Racks.Refresh(true, false);
  54. Requis.Refresh(true, false);
  55. }
  56. public void Shutdown(CancelEventArgs? cancel)
  57. {
  58. }
  59. public void CreateToolbarButtons(IPanelHost host)
  60. {
  61. if (Security.IsAllowed<CanCompleteDeliveries>())
  62. host.CreatePanelAction(new PanelAction
  63. { Caption = "Mark As Delivered", Image = PRSDesktop.Resources.barcode, OnExecute = MarkAsDelivered });
  64. if (Security.IsAllowed<CanArchiveDeliveries>())
  65. host.CreatePanelAction(
  66. new PanelAction { Caption = "Archive Delivery", Image = PRSDesktop.Resources.archive, OnExecute = ArchiveDelivery });
  67. }
  68. public string SectionName => "Deliveries";
  69. public DataModel DataModel(Selection selection)
  70. {
  71. var ids = Deliveries.ExtractValues(x => x.ID, selection).ToArray();
  72. return new DeliveryDataModel(new Filter<Delivery>(x => x.ID).InList(ids));
  73. }
  74. public void Refresh()
  75. {
  76. Deliveries.Refresh(false,true);
  77. }
  78. public Dictionary<string, object[]> Selected()
  79. {
  80. return new Dictionary<string, object[]> { { typeof(Delivery).EntityName(), Deliveries.SelectedRows } };
  81. }
  82. public void Heartbeat(TimeSpan time)
  83. {
  84. }
  85. private void OnChanged(object sender, EventArgs args)
  86. {
  87. Deliveries.Refresh(false, false);
  88. }
  89. private void ArchiveDelivery(PanelAction obj)
  90. {
  91. if (!Deliveries.SelectedRows.Any())
  92. {
  93. MessageBox.Show("Please select a Delivery first!");
  94. return;
  95. }
  96. var completed = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Completed);
  97. if (!completed.IsEmpty())
  98. {
  99. MessageBox.Show("Delivery has already been completed!");
  100. return;
  101. }
  102. var delivered = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Delivered);
  103. if (delivered.IsEmpty())
  104. {
  105. MessageBox.Show("This Delivery must be marked as delivered before it can be Archived.");
  106. return;
  107. }
  108. if (MessageBox.Show("This will archive this delivery, and remove it from the active deliveries list.\n\nDo you wish to continue?",
  109. "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
  110. return;
  111. Progress.Show("Archiving Delivery");
  112. try
  113. {
  114. var notification = new DeliveryNotification();
  115. notification.Delivery.ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID);
  116. new Client<DeliveryNotification>().Save(notification, "Manual Delivery Notification");
  117. var delivery = new Delivery
  118. {
  119. ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID),
  120. Number = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Number),
  121. Completed = DateTime.Now
  122. };
  123. new Client<Delivery>().Save(delivery, "Marked as Completed");
  124. }
  125. finally
  126. {
  127. Progress.Close();
  128. }
  129. MessageBox.Show("Delivery Archived");
  130. Deliveries.Refresh(false, true);
  131. }
  132. private void MarkAsDelivered(PanelAction obj)
  133. {
  134. if (!Deliveries.SelectedRows.Any())
  135. {
  136. MessageBox.Show("Please select a Delivery first!");
  137. return;
  138. }
  139. var completed = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Completed);
  140. if (!completed.IsEmpty())
  141. {
  142. MessageBox.Show("Delivery has already been completed!");
  143. return;
  144. }
  145. var docs = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Documents);
  146. if (docs == 0 && !Security.IsAllowed<CanSkipDeliveryPhotos>())
  147. {
  148. MessageBox.Show("Please photograph these items before completing this delivery");
  149. return;
  150. }
  151. if (MessageBox.Show("Are you sure you wish to mark this Delivery as delivered?", "Confirmation", MessageBoxButton.YesNo) !=
  152. MessageBoxResult.Yes)
  153. return;
  154. Progress.Show("Completing Delivery");
  155. try
  156. {
  157. var delivery = new Delivery
  158. {
  159. ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID),
  160. Number = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Number),
  161. Delivered = DateTime.Now
  162. };
  163. delivery.Job.ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.Job.ID);
  164. new Client<Delivery>().Save(delivery, "Marked as Delivered");
  165. }
  166. finally
  167. {
  168. Progress.Close();
  169. }
  170. MessageBox.Show("Delivery Completed");
  171. Deliveries.Refresh(false, true);
  172. }
  173. private void Deliveries_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
  174. {
  175. _delivery = e.Rows?.FirstOrDefault()?.ToObject<Delivery>() ?? new Delivery();
  176. Notes.Text = _delivery.Notes;
  177. Items.Delivery = _delivery;
  178. Items.Refresh(false, true);
  179. Racks.Delivery = _delivery;
  180. Racks.Refresh(false, true);
  181. Requis.Delivery = _delivery;
  182. Requis.Refresh(false, true);
  183. Bookings.Refresh();
  184. }
  185. private void Deliveries_DeliveryChanged(object sender)
  186. {
  187. Bookings.Refresh();
  188. }
  189. private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
  190. {
  191. settings.ViewType = SplitPanel.View == DynamicSplitPanelView.Master ? ScreenViewType.Register :
  192. SplitPanel.View == DynamicSplitPanelView.Detail ? ScreenViewType.Details : ScreenViewType.Combined;
  193. settings.AnchorWidth = SplitPanel.AnchorWidth;
  194. var newTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
  195. if (Deliveries.ColumnsTag != newTag)
  196. {
  197. Deliveries.ColumnsTag = newTag;
  198. Deliveries.Refresh(true, true);
  199. }
  200. new UserConfiguration<DeliveryScreenSettings>().Save(settings);
  201. }
  202. private void Bookings_OnCustomiseContextMenu(object sender, ICalendarDataEventArgs args)
  203. {
  204. if (sender is not ContextMenu menu)
  205. return;
  206. if (args is CalendarDataEventArgs<CalendarTimeSlot> slot)
  207. {
  208. menu.Items.Insert(0, new Separator());
  209. bool bDeliveries = false;
  210. var CreateBooking = new MenuItem { Header = "Book Delivery" };
  211. foreach (var row in Deliveries.Data.Rows)
  212. {
  213. if (row.Get<Delivery, DateTime>(x => x.Assignment.Date).IsEmpty())
  214. {
  215. bDeliveries = true;
  216. MenuItem item = new MenuItem();
  217. String description = String.Format("{0}: ", row.Get<Delivery, int>(x => x.Number));
  218. if (row.IsEntityLinkValid<Delivery, JobLink>(x => x.Job))
  219. {
  220. description = String.Format("{0} {1} ({2})",
  221. description,
  222. row.Get<Delivery, String>(x => x.Job.Name),
  223. row.Get<Delivery, String>(x => x.Job.JobNumber)
  224. );
  225. }
  226. else if (row.IsEntityLinkValid<Delivery, ContactLink>(x => x.Contact))
  227. {
  228. description = String.Format("{0} {1}",
  229. description,
  230. row.Get<Delivery, String>(x => x.Contact.Name)
  231. );
  232. }
  233. item.Header = description;
  234. item.Click += (o,e) =>
  235. {
  236. if (Deliveries.CreateBooking(row, slot.Item.EmployeeID, slot.Item.Time))
  237. Refresh();
  238. };
  239. CreateBooking.Items.Add(item);
  240. }
  241. }
  242. menu.Items.Insert(0,CreateBooking);
  243. }
  244. }
  245. }
  246. }