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);
}
}
}
}