123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Windows;
- using System.Windows.Controls;
- using Comal.Classes;
- using InABox.Clients;
- using InABox.Configuration;
- using InABox.Core;
- using InABox.DynamicGrid;
- using InABox.WPF;
- namespace PRSDesktop
- {
- /// <summary>
- /// Interaction logic for DeliveryPanel.xaml
- /// </summary>
- public partial class DeliveryPanel : UserControl, IPanel<Delivery>, IJobControl
- {
- private Delivery _delivery = new Delivery();
- private DeliveryScreenSettings settings;
- public DeliveryPanel()
- {
- InitializeComponent();
- Deliveries.OnSelectItem += Deliveries_OnSelectItem;
- Requis.OnChanged += OnChanged;
- Racks.OnChanged += OnChanged;
- Bookings.LoadSettings += (sender) => new UserConfiguration<CalendarSettings>("Deliveries").Load();
- Bookings.SaveSettings += (sender, properties) => new UserConfiguration<CalendarSettings>("Deliveries").Save(properties);
- Bookings.HeaderVisibility = Visibility.Visible;
- }
-
- public Job Job
- {
- get => Deliveries.Job;
- set => Deliveries.Job = value;
- }
-
- public JobPanelSettings Settings { get; set; }
- public bool IsReady { get; set; }
- public event DataModelUpdateEvent? OnUpdateDataModel;
-
- private CalendarSettings Bookings_OnLoadSettings(object sender) =>
- new UserConfiguration<CalendarSettings>("Deliveries").Load();
-
- private void Bookings_OnSaveSettings(object sender, CalendarSettings properties) =>
- new UserConfiguration<CalendarSettings>("Deliveries").Save(properties);
-
- public void Setup()
- {
- settings = new UserConfiguration<DeliveryScreenSettings>().Load();
- SplitPanel.View = settings.ViewType == ScreenViewType.Register ? DynamicSplitPanelView.Master :
- settings.ViewType == ScreenViewType.Details ? DynamicSplitPanelView.Detail : DynamicSplitPanelView.Combined;
- SplitPanel.AnchorWidth = settings.AnchorWidth;
- Bookings.Setup();
-
- Deliveries.ColumnsTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
- Deliveries.Refresh(true, false);
- Items.Refresh(true, false);
- Racks.Refresh(true, false);
- Requis.Refresh(true, false);
- }
- public void Shutdown(CancelEventArgs? cancel)
- {
- }
- public void CreateToolbarButtons(IPanelHost host)
- {
-
- if (Security.CanView<DeliveryType>())
- {
- host.CreateSetupAction(new PanelAction
- {
- Caption = "Delivery Types",
- Image = PRSDesktop.Resources.truck,
- OnExecute = (action) =>
- {
- var list = new MasterList(typeof(DeliveryType));
- list.ShowDialog();
- }
- });
- }
-
- if (Security.IsAllowed<CanCompleteDeliveries>())
- host.CreatePanelAction(new PanelAction
- { Caption = "Mark As Delivered", Image = PRSDesktop.Resources.barcode, OnExecute = MarkAsDelivered });
- if (Security.IsAllowed<CanArchiveDeliveries>())
- host.CreatePanelAction(
- new PanelAction { Caption = "Archive Delivery", Image = PRSDesktop.Resources.archive, OnExecute = ArchiveDelivery });
- }
- public string SectionName => "Deliveries";
- public DataModel DataModel(Selection selection)
- {
- var ids = Deliveries.ExtractValues(x => x.ID, selection).ToArray();
- return new DeliveryDataModel(new Filter<Delivery>(x => x.ID).InList(ids));
- }
- public void Refresh()
- {
- Deliveries.Refresh(false,true);
- }
- public Dictionary<string, object[]> Selected()
- {
- return new Dictionary<string, object[]> { { typeof(Delivery).EntityName(), Deliveries.SelectedRows } };
- }
- public void Heartbeat(TimeSpan time)
- {
- }
- private void OnChanged(object sender, EventArgs args)
- {
- Deliveries.Refresh(false, false);
- }
- private void ArchiveDelivery(PanelAction obj)
- {
- if (!Deliveries.SelectedRows.Any())
- {
- MessageBox.Show("Please select a Delivery first!");
- return;
- }
- var completed = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Completed);
- if (!completed.IsEmpty())
- {
- MessageBox.Show("Delivery has already been completed!");
- return;
- }
- var delivered = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Delivered);
- if (delivered.IsEmpty())
- {
- MessageBox.Show("This Delivery must be marked as delivered before it can be Archived.");
- return;
- }
- if (MessageBox.Show("This will archive this delivery, and remove it from the active deliveries list.\n\nDo you wish to continue?",
- "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
- return;
- Progress.Show("Archiving Delivery");
- try
- {
- var notification = new DeliveryNotification();
- notification.Delivery.ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID);
- new Client<DeliveryNotification>().Save(notification, "Manual Delivery Notification");
- var delivery = new Delivery
- {
- ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID),
- Number = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Number),
- Completed = DateTime.Now
- };
- new Client<Delivery>().Save(delivery, "Marked as Completed");
- }
- finally
- {
- Progress.Close();
- }
- MessageBox.Show("Delivery Archived");
- Deliveries.Refresh(false, true);
- }
- private void MarkAsDelivered(PanelAction obj)
- {
- if (!Deliveries.SelectedRows.Any())
- {
- MessageBox.Show("Please select a Delivery first!");
- return;
- }
- var completed = Deliveries.SelectedRows.First().Get<Delivery, DateTime>(x => x.Completed);
- if (!completed.IsEmpty())
- {
- MessageBox.Show("Delivery has already been completed!");
- return;
- }
- var docs = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Documents);
- if (docs == 0 && !Security.IsAllowed<CanSkipDeliveryPhotos>())
- {
- MessageBox.Show("Please photograph these items before completing this delivery");
- return;
- }
- if (MessageBox.Show("Are you sure you wish to mark this Delivery as delivered?", "Confirmation", MessageBoxButton.YesNo) !=
- MessageBoxResult.Yes)
- return;
- Progress.Show("Completing Delivery");
- try
- {
- var delivery = new Delivery
- {
- ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.ID),
- Number = Deliveries.SelectedRows.First().Get<Delivery, int>(x => x.Number),
- Delivered = DateTime.Now
- };
- delivery.Job.ID = Deliveries.SelectedRows.First().Get<Delivery, Guid>(x => x.Job.ID);
- new Client<Delivery>().Save(delivery, "Marked as Delivered");
- }
- finally
- {
- Progress.Close();
- }
- MessageBox.Show("Delivery Completed");
- Deliveries.Refresh(false, true);
- }
- private void Deliveries_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
- {
- _delivery = e.Rows?.FirstOrDefault()?.ToObject<Delivery>() ?? new Delivery();
-
- Notes.Text = _delivery.Notes;
-
- Items.Delivery = _delivery;
- Items.Refresh(false, true);
- Racks.Delivery = _delivery;
- Racks.Refresh(false, true);
- Requis.Delivery = _delivery;
- Requis.Refresh(false, true);
-
- Bookings.Refresh();
- }
-
- private void Deliveries_DeliveryChanged(object sender)
- {
- Bookings.Refresh();
- }
- private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
- {
- settings.ViewType = SplitPanel.View == DynamicSplitPanelView.Master ? ScreenViewType.Register :
- SplitPanel.View == DynamicSplitPanelView.Detail ? ScreenViewType.Details : ScreenViewType.Combined;
- settings.AnchorWidth = SplitPanel.AnchorWidth;
- var newTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
- if (Deliveries.ColumnsTag != newTag)
- {
- Deliveries.ColumnsTag = newTag;
- Deliveries.Refresh(true, true);
- }
- new UserConfiguration<DeliveryScreenSettings>().Save(settings);
- }
-
- private void Bookings_OnCustomiseContextMenu(object sender, ICalendarDataEventArgs args)
- {
-
- if (sender is not ContextMenu menu)
- return;
-
- if (args is CalendarDataEventArgs<CalendarTimeSlot> slot)
- {
- menu.Items.Insert(0, new Separator());
- bool bDeliveries = false;
- var CreateBooking = new MenuItem { Header = "Book Delivery" };
- foreach (var row in Deliveries.Data.Rows)
- {
- if (row.Get<Delivery, DateTime>(x => x.Assignment.Date).IsEmpty())
- {
- bDeliveries = true;
- MenuItem item = new MenuItem();
- String description = String.Format("{0}: ", row.Get<Delivery, int>(x => x.Number));
- if (row.IsEntityLinkValid<Delivery, JobLink>(x => x.Job))
- {
- description = String.Format("{0} {1} ({2})",
- description,
- row.Get<Delivery, String>(x => x.Job.Name),
- row.Get<Delivery, String>(x => x.Job.JobNumber)
- );
- }
- else if (row.IsEntityLinkValid<Delivery, ContactLink>(x => x.Contact))
- {
- description = String.Format("{0} {1}",
- description,
- row.Get<Delivery, String>(x => x.Contact.Name)
- );
- }
- item.Header = description;
- item.Click += (o,e) =>
- {
- if (Deliveries.CreateBooking(row, slot.Item.EmployeeID, slot.Item.Time))
- Refresh();
- };
- CreateBooking.Items.Add(item);
- }
- }
- menu.Items.Insert(0,CreateBooking);
-
- }
- }
- }
- }
|