DeliveryPanel.xaml.cs 12 KB

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