using System; using System.Collections.Generic; 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 { /// /// Interaction logic for DeliveryPanel.xaml /// public partial class DeliveryPanel : UserControl, IPanel, IJobControl { private DeliveryScreenSettings settings; public DeliveryPanel() { InitializeComponent(); Deliveries.OnSelectItem += Deliveries_OnSelectItem; Requis.OnChanged += OnChanged; Racks.OnChanged += OnChanged; Bookings.LoadSettings += (sender) => new UserConfiguration("Deliveries").Load(); Bookings.SaveSettings += (sender, properties) => new UserConfiguration("Deliveries").Save(properties); } public Guid ParentID { get => Deliveries.ParentID; set { Deliveries.ParentID = value; Items.JobID = value; Racks.JobID = value; Requis.JobID = value; } } public JobPanelSettings Settings { get; set; } public bool IsReady { get; set; } public event DataModelUpdateEvent OnUpdateDataModel; private CalendarSettings Bookings_OnLoadSettings(object sender) => new UserConfiguration("Deliveries").Load(); private void Bookings_OnSaveSettings(object sender, CalendarSettings properties) => new UserConfiguration("Deliveries").Save(properties); public void Setup() { settings = new UserConfiguration().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() { } public void CreateToolbarButtons(IPanelHost host) { if (Security.IsAllowed()) host.CreatePanelAction(new PanelAction { Caption = "Mark As Delivered", Image = PRSDesktop.Resources.barcode, OnExecute = MarkAsDelivered }); if (Security.IsAllowed()) 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(x => x.ID).InList(ids)); } public void Refresh() { Racks.Refresh(false, true); Requis.Refresh(false, true); Deliveries.Refresh(false, true); Bookings.Refresh(); } public Dictionary Selected() { return new Dictionary { { typeof(Delivery).EntityName(), Deliveries.SelectedRows } }; } public void Heartbeat(TimeSpan time) { } private void OnChanged(IDynamicGrid sender) { 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(x => x.Completed); if (!completed.IsEmpty()) { MessageBox.Show("Delivery has already been completed!"); return; } var delivered = Deliveries.SelectedRows.First().Get(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(x => x.ID); new Client().Save(notification, "Manual Delivery Notification"); var delivery = new Delivery { ID = Deliveries.SelectedRows.First().Get(x => x.ID), Number = Deliveries.SelectedRows.First().Get(x => x.Number), Completed = DateTime.Now }; new Client().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(x => x.Completed); if (!completed.IsEmpty()) { MessageBox.Show("Delivery has already been completed!"); return; } var docs = Deliveries.SelectedRows.First().Get(x => x.Documents); if (docs == 0 && !Security.IsAllowed()) { 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(x => x.ID), Number = Deliveries.SelectedRows.First().Get(x => x.Number), Delivered = DateTime.Now }; delivery.Job.ID = Deliveries.SelectedRows.First().Get(x => x.Job.ID); new Client().Save(delivery, "Marked as Delivered"); } finally { Progress.Close(); } MessageBox.Show("Delivery Completed"); Deliveries.Refresh(false, true); } private void Deliveries_OnSelectItem(object sender, DynamicGridSelectionEventArgs e) { var row = e.Rows?.FirstOrDefault(); var jobid = row == null ? CoreUtils.FullGuid : row.Get(x => x.Job.ID); var deliveryid = row == null ? CoreUtils.FullGuid : row.Get(x => x.ID); var completed = row == null ? DateTime.MinValue : row.Get(x => x.Completed); var notes = row == null ? "" : row.Get(x => x.Notes); Notes.Text = notes; Items.JobID = jobid; Items.DeliveryID = deliveryid; Items.Completed = completed; Items.Refresh(false, true); Racks.JobID = jobid; Racks.DeliveryID = deliveryid; Racks.Completed = completed; Racks.Refresh(false, true); Requis.JobID = jobid; Requis.DeliveryID = deliveryid; Requis.Completed = completed; Requis.Refresh(false, true); } 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().Save(settings); } private void Bookings_OnCustomiseContextMenu(object sender, ICalendarDataEventArgs args) { if (sender is not ContextMenu menu) return; if (args is CalendarDataEventArgs 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(x => x.Assignment.Date).IsEmpty()) { bDeliveries = true; MenuItem item = new MenuItem(); String description = String.Format("{0}: ", row.Get(x => x.Number)); if (row.IsEntityLinkValid(x => x.Job)) { description = String.Format("{0} {1} ({2})", description, row.Get(x => x.Job.Name), row.Get(x => x.Job.JobNumber) ); } else if (row.IsEntityLinkValid(x => x.Contact)) { description = String.Format("{0} {1}", description, row.Get(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); } } } }