|  | @@ -7,6 +7,7 @@ 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;
 | 
	
	
		
			
				|  | @@ -16,469 +17,507 @@ using Motorola.Snapi.EventArguments;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //using RestSharp;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -namespace PRSDesktop
 | 
	
		
			
				|  |  | +namespace PRSDesktop;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class RequisitionPanelSettings : IUserConfigurationSettings
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    /// <summary>
 | 
	
		
			
				|  |  | -    ///     Interaction logic for RequisitionPanel.xaml
 | 
	
		
			
				|  |  | -    /// </summary>
 | 
	
		
			
				|  |  | -    public partial class RequisitionPanel : UserControl, IPanel<Requisition>
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        private Requisition? _requisition;
 | 
	
		
			
				|  |  | +    public ScreenViewType ViewType { get; set; } = ScreenViewType.Combined;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public List<IMotorolaBarcodeScanner> Scanners = new();
 | 
	
		
			
				|  |  | +    public double RequisitionsWidth { get; set; } = 450;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public RequisitionPanel()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            InitializeComponent();
 | 
	
		
			
				|  |  | -            PickImage.Source = PRSDesktop.Resources.tick.AsBitmapImage(Color.White);
 | 
	
		
			
				|  |  | -            StockImage.Source = PRSDesktop.Resources.forklift.AsBitmapImage(Color.White);
 | 
	
		
			
				|  |  | -            TruckImage.Source = PRSDesktop.Resources.truck.AsBitmapImage();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    public double DetailsWidth { get; set; } = 450;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/// <summary>
 | 
	
		
			
				|  |  | +///     Interaction logic for RequisitionPanel.xaml
 | 
	
		
			
				|  |  | +/// </summary>
 | 
	
		
			
				|  |  | +public partial class RequisitionPanel : UserControl, IPanel<Requisition>
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    private Requisition? _requisition;
 | 
	
		
			
				|  |  | +    private RequisitionPanelSettings Settings;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //DateTime lastselection = DateTime.MaxValue;
 | 
	
		
			
				|  |  | -        //DispatcherTimer timer = new DispatcherTimer();
 | 
	
		
			
				|  |  | +    public List<IMotorolaBarcodeScanner> Scanners = new();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public event DataModelUpdateEvent? OnUpdateDataModel;
 | 
	
		
			
				|  |  | +    public RequisitionPanel()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        InitializeComponent();
 | 
	
		
			
				|  |  | +        PickImage.Source = PRSDesktop.Resources.tick.AsBitmapImage(Color.White);
 | 
	
		
			
				|  |  | +        StockImage.Source = PRSDesktop.Resources.forklift.AsBitmapImage(Color.White);
 | 
	
		
			
				|  |  | +        TruckImage.Source = PRSDesktop.Resources.truck.AsBitmapImage();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public bool IsReady { get; set; }
 | 
	
		
			
				|  |  | +    //DateTime lastselection = DateTime.MaxValue;
 | 
	
		
			
				|  |  | +    //DispatcherTimer timer = new DispatcherTimer();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public Dictionary<string, object[]> Selected()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            return new Dictionary<string, object[]>
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                { typeof(Requisition).EntityName(), Requisitions.SelectedRows },
 | 
	
		
			
				|  |  | -                { typeof(RequisitionItem).EntityName(), Items.SelectedRows }
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    public event DataModelUpdateEvent? OnUpdateDataModel;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public bool IsReady { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public void Setup()
 | 
	
		
			
				|  |  | +    public Dictionary<string, object[]> Selected()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return new Dictionary<string, object[]>
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            //Requisitions.OnSelectItem += Requisitions_OnSelectItem;
 | 
	
		
			
				|  |  | +            { typeof(Requisition).EntityName(), Requisitions.SelectedRows },
 | 
	
		
			
				|  |  | +            { typeof(RequisitionItem).EntityName(), Items.SelectedRows }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void Setup()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        //Requisitions.OnSelectItem += Requisitions_OnSelectItem;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //Requisitions.OnRequisitionFillStateChanged += Requisitions_OnRequisitionFillStateChanged;
 | 
	
		
			
				|  |  | +        //Requisitions.OnRequisitionBoxesChanged += Requisitions_OnRequisitionBoxesChanged;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //Requisitions.OnRequisitionFillStateChanged += Requisitions_OnRequisitionFillStateChanged;
 | 
	
		
			
				|  |  | -            //Requisitions.OnRequisitionBoxesChanged += Requisitions_OnRequisitionBoxesChanged;
 | 
	
		
			
				|  |  | +        LoadSettings();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            SetupScanner();
 | 
	
		
			
				|  |  | +        SetupScanner();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Items.Reconfigure(options =>
 | 
	
		
			
				|  |  | +        Items.Reconfigure(options =>
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            options.BeginUpdate();
 | 
	
		
			
				|  |  | +            if (_requisition != null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                options.BeginUpdate();
 | 
	
		
			
				|  |  | -                if (_requisition != null)
 | 
	
		
			
				|  |  | +                if (_requisition.Filled.IsEmpty())
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    if (_requisition.Filled.IsEmpty())
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        options.Add(DynamicGridOption.AddRows);
 | 
	
		
			
				|  |  | -                        options.Add(DynamicGridOption.DeleteRows);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    else
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        options.Remove(DynamicGridOption.AddRows);
 | 
	
		
			
				|  |  | -                        options.Remove(DynamicGridOption.DeleteRows);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | +                    options.Add(DynamicGridOption.AddRows);
 | 
	
		
			
				|  |  | +                    options.Add(DynamicGridOption.DeleteRows);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    options.Remove(DynamicGridOption.AddRows);
 | 
	
		
			
				|  |  | +                    options.Remove(DynamicGridOption.DeleteRows);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                options.EndUpdate();
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | +            options.EndUpdate();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Requisitions.Refresh(true, false);
 | 
	
		
			
				|  |  | -            Items.Refresh(true, false);
 | 
	
		
			
				|  |  | +        Requisitions.Refresh(true, false);
 | 
	
		
			
				|  |  | +        Items.Refresh(true, false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            UpdateLayout();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        UpdateLayout();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public void Shutdown(CancelEventArgs? cancel)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            ShutdownScanner();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    private void LoadSettings()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Settings = new UserConfiguration<RequisitionPanelSettings>().Load();
 | 
	
		
			
				|  |  | +        MainPanel.View = Settings.ViewType == ScreenViewType.Register ? DynamicSplitPanelView.Master :
 | 
	
		
			
				|  |  | +            Settings.ViewType == ScreenViewType.Details ? DynamicSplitPanelView.Detail : DynamicSplitPanelView.Combined;
 | 
	
		
			
				|  |  | +        MainPanel.AnchorWidth = Settings.RequisitionsWidth;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public void CreateToolbarButtons(IPanelHost host)
 | 
	
		
			
				|  |  | +        DetailsPanel.AnchorWidth = Settings.DetailsWidth;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    private void SaveSettings()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Settings.ViewType = MainPanel.View switch
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            //host.CreatePanelAction(new PanelAction() { Caption = "Archive Requisition", Image = PRSDesktop.Resources.delete, OnExecute = ArchiveRequisition });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            DynamicSplitPanelView.Master => ScreenViewType.Register,
 | 
	
		
			
				|  |  | +            DynamicSplitPanelView.Detail => ScreenViewType.Details,
 | 
	
		
			
				|  |  | +            DynamicSplitPanelView.Combined or _ => ScreenViewType.Combined
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        Settings.RequisitionsWidth = MainPanel.AnchorWidth;
 | 
	
		
			
				|  |  | +        Settings.DetailsWidth = DetailsPanel.AnchorWidth;
 | 
	
		
			
				|  |  | +        new UserConfiguration<RequisitionPanelSettings>().Save(Settings);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public string SectionName => "Requisitions";
 | 
	
		
			
				|  |  | -        public DataModel DataModel(Selection selection)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var ids = Requisitions.ExtractValues(x => x.ID, selection).ToArray();
 | 
	
		
			
				|  |  | -            return new BaseDataModel<Requisition>(new Filter<Requisition>(x => x.ID).InList(ids));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    private void MainPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        SaveSettings();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public void Refresh()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Requisitions.Refresh(false, true);
 | 
	
		
			
				|  |  | -            //lastselection = DateTime.MinValue;
 | 
	
		
			
				|  |  | -            //Items.Refresh(true, false);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    public void Shutdown(CancelEventArgs? cancel)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        ShutdownScanner();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public void Heartbeat(TimeSpan time)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            // Nothing to do here
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    public void CreateToolbarButtons(IPanelHost host)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        //host.CreatePanelAction(new PanelAction() { Caption = "Archive Requisition", Image = PRSDesktop.Resources.delete, OnExecute = ArchiveRequisition });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void ShutdownScanner()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                foreach (var scanner in Scanners) scanner.Actions.ToggleLed(LedMode.GreenOff);
 | 
	
		
			
				|  |  | -                BarcodeScannerManager.Instance.DataReceived -= Instance_DataReceived;
 | 
	
		
			
				|  |  | +    public string SectionName => "Requisitions";
 | 
	
		
			
				|  |  | +    public DataModel DataModel(Selection selection)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        var ids = Requisitions.ExtractValues(x => x.ID, selection).ToArray();
 | 
	
		
			
				|  |  | +        return new BaseDataModel<Requisition>(new Filter<Requisition>(x => x.ID).InList(ids));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                BarcodeScannerManager.Instance.Close();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            catch (Exception e)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                MessageBox.Show("Error Shutting down Scanner!\n\n" + e.Message);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    public void Refresh()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Requisitions.Refresh(false, true);
 | 
	
		
			
				|  |  | +        //lastselection = DateTime.MinValue;
 | 
	
		
			
				|  |  | +        //Items.Refresh(true, false);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void Heartbeat(TimeSpan time)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // Nothing to do here
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void SetupScanner()
 | 
	
		
			
				|  |  | +    private void ShutdownScanner()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        try
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            Scanners.Clear();
 | 
	
		
			
				|  |  | -            BarcodeScannerManager.Instance.Open();
 | 
	
		
			
				|  |  | +            foreach (var scanner in Scanners) scanner.Actions.ToggleLed(LedMode.GreenOff);
 | 
	
		
			
				|  |  | +            BarcodeScannerManager.Instance.DataReceived -= Instance_DataReceived;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            BarcodeScannerManager.Instance.RegisterForEvents(EventType.Barcode, EventType.Pnp, EventType.Image, EventType.Other, EventType.Rmd);
 | 
	
		
			
				|  |  | +            BarcodeScannerManager.Instance.Close();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        catch (Exception e)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MessageBox.Show("Error Shutting down Scanner!\n\n" + e.Message);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            BarcodeScannerManager.Instance.GetDevices();
 | 
	
		
			
				|  |  | -            foreach (var scanner in BarcodeScannerManager.Instance.GetDevices())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Scanners.Add(scanner);
 | 
	
		
			
				|  |  | -                scanner.Actions.ToggleLed(LedMode.RedOn);
 | 
	
		
			
				|  |  | -                scanner.Actions.SoundBeeper(BeepPattern.FastWarble);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +    private void SetupScanner()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Scanners.Clear();
 | 
	
		
			
				|  |  | +        BarcodeScannerManager.Instance.Open();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            BarcodeScannerManager.Instance.DataReceived += Instance_DataReceived;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        BarcodeScannerManager.Instance.RegisterForEvents(EventType.Barcode, EventType.Pnp, EventType.Image, EventType.Other, EventType.Rmd);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void Instance_DataReceived(object? sender, BarcodeScanEventArgs e)
 | 
	
		
			
				|  |  | +        BarcodeScannerManager.Instance.GetDevices();
 | 
	
		
			
				|  |  | +        foreach (var scanner in BarcodeScannerManager.Instance.GetDevices())
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            Dispatcher.Invoke(() => { ProcessCode(Scanners[(int)e.ScannerId], e.Data); });
 | 
	
		
			
				|  |  | +            Scanners.Add(scanner);
 | 
	
		
			
				|  |  | +            scanner.Actions.ToggleLed(LedMode.RedOn);
 | 
	
		
			
				|  |  | +            scanner.Actions.SoundBeeper(BeepPattern.FastWarble);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void ProcessCode(IMotorolaBarcodeScanner scanner, string code)
 | 
	
		
			
				|  |  | +        BarcodeScannerManager.Instance.DataReceived += Instance_DataReceived;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void Instance_DataReceived(object? sender, BarcodeScanEventArgs e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Dispatcher.Invoke(() => { ProcessCode(Scanners[(int)e.ScannerId], e.Data); });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void ProcessCode(IMotorolaBarcodeScanner scanner, string code)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        try
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var iRow = Requisitions.SelectedRows.First().Index;
 | 
	
		
			
				|  |  | -                if (iRow == -1)
 | 
	
		
			
				|  |  | -                    throw new Exception("Please select a Requsition First");
 | 
	
		
			
				|  |  | +            var iRow = Requisitions.SelectedRows.First().Index;
 | 
	
		
			
				|  |  | +            if (iRow == -1)
 | 
	
		
			
				|  |  | +                throw new Exception("Please select a Requsition First");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var row = Requisitions.Data.Rows[iRow];
 | 
	
		
			
				|  |  | -                var filled = row.Get<Requisition, DateTime>(x => x.Filled);
 | 
	
		
			
				|  |  | +            var row = Requisitions.Data.Rows[iRow];
 | 
	
		
			
				|  |  | +            var filled = row.Get<Requisition, DateTime>(x => x.Filled);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (!filled.IsEmpty())
 | 
	
		
			
				|  |  | -                    throw new Exception("Cannot Add Items to a completed Requisition");
 | 
	
		
			
				|  |  | +            if (!filled.IsEmpty())
 | 
	
		
			
				|  |  | +                throw new Exception("Cannot Add Items to a completed Requisition");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var reqid = row.Get<Requisition, Guid>(x => x.ID);
 | 
	
		
			
				|  |  | +            var reqid = row.Get<Requisition, Guid>(x => x.ID);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var boxes = row.Get<Requisition, int>(x => x.Boxes);
 | 
	
		
			
				|  |  | +            var boxes = row.Get<Requisition, int>(x => x.Boxes);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                var sCode = code;
 | 
	
		
			
				|  |  | -                var iQty = 1;
 | 
	
		
			
				|  |  | -                if (sCode.Contains('*'))
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    var comps = sCode.Split('*');
 | 
	
		
			
				|  |  | -                    sCode = comps[0];
 | 
	
		
			
				|  |  | -                    iQty = int.Parse(comps[1].Trim());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +            var sCode = code;
 | 
	
		
			
				|  |  | +            var iQty = 1;
 | 
	
		
			
				|  |  | +            if (sCode.Contains('*'))
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var comps = sCode.Split('*');
 | 
	
		
			
				|  |  | +                sCode = comps[0];
 | 
	
		
			
				|  |  | +                iQty = int.Parse(comps[1].Trim());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                RequisitionItem? item = null;
 | 
	
		
			
				|  |  | -                CoreRow? itemrow = null;
 | 
	
		
			
				|  |  | -                try
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    itemrow = Items.Data.Rows.FirstOrDefault(r => /* r.Get<RequisitionItem, int>(x => x.BoxNumber).Equals(boxes) && */
 | 
	
		
			
				|  |  | -                        r.Get<RequisitionItem, string>(x => x.BarCode).Equals(sCode));
 | 
	
		
			
				|  |  | -                    //itemrow = Items.Data.Rows.FirstOrDefault(r => r.Get<RequisitionItem, String>(x => x.BarCode).Equals(sCode));
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                catch (Exception e)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +            RequisitionItem? item = null;
 | 
	
		
			
				|  |  | +            CoreRow? itemrow = null;
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                itemrow = Items.Data.Rows.FirstOrDefault(r => /* r.Get<RequisitionItem, int>(x => x.BoxNumber).Equals(boxes) && */
 | 
	
		
			
				|  |  | +                    r.Get<RequisitionItem, string>(x => x.BarCode).Equals(sCode));
 | 
	
		
			
				|  |  | +                //itemrow = Items.Data.Rows.FirstOrDefault(r => r.Get<RequisitionItem, String>(x => x.BarCode).Equals(sCode));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (Exception e)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (itemrow != null)
 | 
	
		
			
				|  |  | -                    item = new Client<RequisitionItem>()
 | 
	
		
			
				|  |  | -                        .Load(new Filter<RequisitionItem>(x => x.ID).IsEqualTo(itemrow.Get<RequisitionItem, Guid>(x => x.ID))).FirstOrDefault();
 | 
	
		
			
				|  |  | -                if (item != null)
 | 
	
		
			
				|  |  | +            if (itemrow != null)
 | 
	
		
			
				|  |  | +                item = new Client<RequisitionItem>()
 | 
	
		
			
				|  |  | +                    .Load(new Filter<RequisitionItem>(x => x.ID).IsEqualTo(itemrow.Get<RequisitionItem, Guid>(x => x.ID))).FirstOrDefault();
 | 
	
		
			
				|  |  | +            if (item != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                item.Quantity += iQty;
 | 
	
		
			
				|  |  | +                new Client<RequisitionItem>().Save(item, "Quantity Updated by Barcode Scanner");
 | 
	
		
			
				|  |  | +                scanner?.Actions.SoundBeeper(BeepPattern.LowHigh);
 | 
	
		
			
				|  |  | +                Refresh();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var product = new Client<Product>().Load(new Filter<Product>(x => x.Code).IsEqualTo(sCode)).FirstOrDefault();
 | 
	
		
			
				|  |  | +                if (product != null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    item.Quantity += iQty;
 | 
	
		
			
				|  |  | -                    new Client<RequisitionItem>().Save(item, "Quantity Updated by Barcode Scanner");
 | 
	
		
			
				|  |  | +                    item = new RequisitionItem
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        RequisitionLink = new RequisitionLink { ID = reqid },
 | 
	
		
			
				|  |  | +                        //BoxNumber = boxes,
 | 
	
		
			
				|  |  | +                        Code = product.Code,
 | 
	
		
			
				|  |  | +                        Description = product.Name,
 | 
	
		
			
				|  |  | +                        BarCode = sCode,
 | 
	
		
			
				|  |  | +                        Quantity = iQty
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                    new Client<RequisitionItem>().Save(item, "Scanned by Barcode Reader");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                      scanner?.Actions.SoundBeeper(BeepPattern.LowHigh);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                      Refresh();
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    var product = new Client<Product>().Load(new Filter<Product>(x => x.Code).IsEqualTo(sCode)).FirstOrDefault();
 | 
	
		
			
				|  |  | -                    if (product != null)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        item = new RequisitionItem
 | 
	
		
			
				|  |  | -                        {
 | 
	
		
			
				|  |  | -                            RequisitionLink = new RequisitionLink { ID = reqid },
 | 
	
		
			
				|  |  | -                            //BoxNumber = boxes,
 | 
	
		
			
				|  |  | -                            Code = product.Code,
 | 
	
		
			
				|  |  | -                            Description = product.Name,
 | 
	
		
			
				|  |  | -                            BarCode = sCode,
 | 
	
		
			
				|  |  | -                            Quantity = iQty
 | 
	
		
			
				|  |  | -                        };
 | 
	
		
			
				|  |  | -                        new Client<RequisitionItem>().Save(item, "Scanned by Barcode Reader");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                        scanner?.Actions.SoundBeeper(BeepPattern.LowHigh);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                        Refresh();
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    else
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        scanner?.Actions.SoundBeeper(BeepPattern.FourLowLong);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | +                    scanner?.Actions.SoundBeeper(BeepPattern.FourLowLong);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            catch (Exception)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                scanner?.Actions.SoundBeeper(BeepPattern.FourLowShort);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        catch (Exception)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            scanner?.Actions.SoundBeeper(BeepPattern.FourLowShort);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /*private void ArchiveRequisition(PanelAction obj)
 | 
	
		
			
				|  |  | +    /*private void ArchiveRequisition(PanelAction obj)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        var bClosed = false;
 | 
	
		
			
				|  |  | +        var iRow = Requisitions.SelectedRows.First().Index;
 | 
	
		
			
				|  |  | +        if (iRow > -1)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var bClosed = false;
 | 
	
		
			
				|  |  | -            var iRow = Requisitions.SelectedRows.First().Index;
 | 
	
		
			
				|  |  | -            if (iRow > -1)
 | 
	
		
			
				|  |  | +            var row = Requisitions.Data.Rows[iRow];
 | 
	
		
			
				|  |  | +            var id = row.Get<Requisition, Guid>(x => x.ID);
 | 
	
		
			
				|  |  | +            var filled = row.Get<Requisition, DateTime>(x => x.Filled);
 | 
	
		
			
				|  |  | +            if (filled.IsEmpty())
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var row = Requisitions.Data.Rows[iRow];
 | 
	
		
			
				|  |  | -                var id = row.Get<Requisition, Guid>(x => x.ID);
 | 
	
		
			
				|  |  | -                var filled = row.Get<Requisition, DateTime>(x => x.Filled);
 | 
	
		
			
				|  |  | -                if (filled.IsEmpty())
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    MessageBox.Show("Please complete this requisition before Archiving it!");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    var req = new Client<Requisition>().Load(new Filter<Requisition>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
 | 
	
		
			
				|  |  | -                    if (req != null)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        req.Archived = DateTime.Now;
 | 
	
		
			
				|  |  | -                        new Client<Requisition>().Save(req, "Requisition Archived");
 | 
	
		
			
				|  |  | -                        bClosed = true;
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                MessageBox.Show("Please complete this requisition before Archiving it!");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                MessageBox.Show("Please select a requisition first!");
 | 
	
		
			
				|  |  | +                var req = new Client<Requisition>().Load(new Filter<Requisition>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
 | 
	
		
			
				|  |  | +                if (req != null)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    req.Archived = DateTime.Now;
 | 
	
		
			
				|  |  | +                    new Client<Requisition>().Save(req, "Requisition Archived");
 | 
	
		
			
				|  |  | +                    bClosed = true;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MessageBox.Show("Please select a requisition first!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (bClosed)
 | 
	
		
			
				|  |  | -                Refresh();
 | 
	
		
			
				|  |  | -        }*/
 | 
	
		
			
				|  |  | +        if (bClosed)
 | 
	
		
			
				|  |  | +            Refresh();
 | 
	
		
			
				|  |  | +    }*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public Dictionary<Type, CoreTable> DataEnvironment()
 | 
	
		
			
				|  |  | +    public Dictionary<Type, CoreTable> DataEnvironment()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return new Dictionary<Type, CoreTable>
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return new Dictionary<Type, CoreTable>
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                [typeof(Requisition)] = Requisitions.Data,
 | 
	
		
			
				|  |  | -                [typeof(RequisitionItem)] = Items.Data
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            [typeof(Requisition)] = Requisitions.Data,
 | 
	
		
			
				|  |  | +            [typeof(RequisitionItem)] = Items.Data
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //private void Timer_Tick(object sender, EventArgs e)
 | 
	
		
			
				|  |  | -        //{
 | 
	
		
			
				|  |  | +    //private void Timer_Tick(object sender, EventArgs e)
 | 
	
		
			
				|  |  | +    //{
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //    if (lastselection < DateTime.Now.AddMilliseconds(-500))
 | 
	
		
			
				|  |  | -        //    {
 | 
	
		
			
				|  |  | -        //        lastselection = DateTime.MaxValue;
 | 
	
		
			
				|  |  | +    //    if (lastselection < DateTime.Now.AddMilliseconds(-500))
 | 
	
		
			
				|  |  | +    //    {
 | 
	
		
			
				|  |  | +    //        lastselection = DateTime.MaxValue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //        LoadRequisition();
 | 
	
		
			
				|  |  | +    //        LoadRequisition();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //    }
 | 
	
		
			
				|  |  | +    //    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //}
 | 
	
		
			
				|  |  | +    //}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void LoadRequisition()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            foreach (var scanner in Scanners)
 | 
	
		
			
				|  |  | -                scanner.Actions.ToggleLed(_requisition != null ? LedMode.GreenOn : LedMode.RedOn);
 | 
	
		
			
				|  |  | +    private void LoadRequisition()
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        foreach (var scanner in Scanners)
 | 
	
		
			
				|  |  | +            scanner.Actions.ToggleLed(_requisition != null ? LedMode.GreenOn : LedMode.RedOn);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Title.Text = _requisition != null ? _requisition.Title : "";
 | 
	
		
			
				|  |  | +        Title.Text = _requisition != null ? _requisition.Title : "";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            RequestedBy.Content = _requisition != null ? _requisition.RequestedBy.Name : "";
 | 
	
		
			
				|  |  | +        RequestedBy.Content = _requisition != null ? _requisition.RequestedBy.Name : "";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            DueDate.Content = _requisition != null ? string.Format("{0:dddd, dd MMM yyyy}", _requisition.Due) : "";
 | 
	
		
			
				|  |  | +        DueDate.Content = _requisition != null ? string.Format("{0:dddd, dd MMM yyyy}", _requisition.Due) : "";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var notes = _requisition != null ? _requisition.Notes : Array.Empty<string>();
 | 
	
		
			
				|  |  | -            var request = _requisition != null ? CoreUtils.StripHTML(_requisition.Request) : "";
 | 
	
		
			
				|  |  | -            Request.Text = string.Join("\n===============================\n", Utility.ProcessNotes(notes, request));
 | 
	
		
			
				|  |  | +        var notes = _requisition != null ? _requisition.Notes : Array.Empty<string>();
 | 
	
		
			
				|  |  | +        var request = _requisition != null ? CoreUtils.StripHTML(_requisition.Request) : "";
 | 
	
		
			
				|  |  | +        Request.Text = string.Join("\n===============================\n", Utility.ProcessNotes(notes, request));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            MarkAsFilled.IsEnabled = _requisition != null && _requisition.Archived.IsEmpty() && _requisition.StockUpdated.IsEmpty();
 | 
	
		
			
				|  |  | -            MarkAsFilledDescription.Content = _requisition == null || _requisition.Filled.IsEmpty() ? "Mark As Filled" : "Clear Filled Flag";
 | 
	
		
			
				|  |  | +        MarkAsFilled.IsEnabled = _requisition != null && _requisition.Archived.IsEmpty() && _requisition.StockUpdated.IsEmpty();
 | 
	
		
			
				|  |  | +        MarkAsFilledDescription.Content = _requisition == null || _requisition.Filled.IsEmpty() ? "Mark As Filled" : "Clear Filled Flag";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            UpdateStock.IsEnabled = Security.IsAllowed<CanUpdateRequisitionStockMovements>() && _requisition != null &&
 | 
	
		
			
				|  |  | -                                    !_requisition.Filled.IsEmpty();
 | 
	
		
			
				|  |  | -            UpdateStockDescription.Content =
 | 
	
		
			
				|  |  | -                _requisition == null || _requisition.StockUpdated.IsEmpty() ? "Update Stock Holdings" : "Clear Stock Movements";
 | 
	
		
			
				|  |  | +        UpdateStock.IsEnabled = Security.IsAllowed<CanUpdateRequisitionStockMovements>() && _requisition != null &&
 | 
	
		
			
				|  |  | +                                !_requisition.Filled.IsEmpty();
 | 
	
		
			
				|  |  | +        UpdateStockDescription.Content =
 | 
	
		
			
				|  |  | +            _requisition == null || _requisition.StockUpdated.IsEmpty() ? "Update Stock Holdings" : "Clear Stock Movements";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            TakenBy.IsEnabled = _requisition != null && !_requisition.Filled.IsEmpty() && _requisition.Archived.IsEmpty() &&
 | 
	
		
			
				|  |  | -                                !_requisition.Delivery.IsValid();
 | 
	
		
			
				|  |  | +        TakenBy.IsEnabled = _requisition != null && !_requisition.Filled.IsEmpty() && _requisition.Archived.IsEmpty() &&
 | 
	
		
			
				|  |  | +                            !_requisition.Delivery.IsValid();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            TakenByDescription.Content = _requisition == null
 | 
	
		
			
				|  |  | -                ? "Select Employee"
 | 
	
		
			
				|  |  | -                : _requisition.Delivery.IsValid()
 | 
	
		
			
				|  |  | -                    ? _requisition.Delivery.Completed.IsEmpty()
 | 
	
		
			
				|  |  | -                        ? string.Format("Booked On Delivery #{0}", _requisition.Delivery.Number)
 | 
	
		
			
				|  |  | -                        : string.Format("Delivered on {0:dd MMM yy} (#{1})", _requisition.Delivery.Completed, _requisition.Delivery.Number)
 | 
	
		
			
				|  |  | -                    : _requisition.TakenBy.IsValid()
 | 
	
		
			
				|  |  | -                        ? string.Format("{0} ({1:dd MMM yy})", _requisition.TakenBy.Name, _requisition.Archived)
 | 
	
		
			
				|  |  | -                        : "Select Employee";
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        TakenByDescription.Content = _requisition == null
 | 
	
		
			
				|  |  | +            ? "Select Employee"
 | 
	
		
			
				|  |  | +            : _requisition.Delivery.IsValid()
 | 
	
		
			
				|  |  | +                ? _requisition.Delivery.Completed.IsEmpty()
 | 
	
		
			
				|  |  | +                    ? string.Format("Booked On Delivery #{0}", _requisition.Delivery.Number)
 | 
	
		
			
				|  |  | +                    : string.Format("Delivered on {0:dd MMM yy} (#{1})", _requisition.Delivery.Completed, _requisition.Delivery.Number)
 | 
	
		
			
				|  |  | +                : _requisition.TakenBy.IsValid()
 | 
	
		
			
				|  |  | +                    ? string.Format("{0} ({1:dd MMM yy})", _requisition.TakenBy.Name, _requisition.Archived)
 | 
	
		
			
				|  |  | +                    : "Select Employee";
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void Requisitions_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            _requisition = e.Rows?.FirstOrDefault()?.ToObject<Requisition>();
 | 
	
		
			
				|  |  | -            LoadRequisition();
 | 
	
		
			
				|  |  | -            Items.Requisition = _requisition;
 | 
	
		
			
				|  |  | -            Items.Refresh(false, true);
 | 
	
		
			
				|  |  | -            //lastselection = DateTime.Now;
 | 
	
		
			
				|  |  | -            //Dispatcher.Invoke(() => { LoadRequisition(); });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    private void Requisitions_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        _requisition = e.Rows?.FirstOrDefault()?.ToObject<Requisition>();
 | 
	
		
			
				|  |  | +        LoadRequisition();
 | 
	
		
			
				|  |  | +        Items.Requisition = _requisition;
 | 
	
		
			
				|  |  | +        Items.Refresh(false, true);
 | 
	
		
			
				|  |  | +        //lastselection = DateTime.Now;
 | 
	
		
			
				|  |  | +        //Dispatcher.Invoke(() => { LoadRequisition(); });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void TakenBy_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if (_requisition == null || _requisition.ID == Guid.Empty)
 | 
	
		
			
				|  |  | -                return;
 | 
	
		
			
				|  |  | +    private void TakenBy_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (_requisition == null || _requisition.ID == Guid.Empty)
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        var dlg = new MultiSelectDialog<Employee>(
 | 
	
		
			
				|  |  | +            LookupFactory.DefineFilter<Employee>(),
 | 
	
		
			
				|  |  | +            LookupFactory.DefineColumns<Employee>(),
 | 
	
		
			
				|  |  | +            false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var dlg = new MultiSelectDialog<Employee>(
 | 
	
		
			
				|  |  | -                LookupFactory.DefineFilter<Employee>(),
 | 
	
		
			
				|  |  | -                LookupFactory.DefineColumns<Employee>(),
 | 
	
		
			
				|  |  | -                false);
 | 
	
		
			
				|  |  | +        if (!dlg.ShowDialog())
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (!dlg.ShowDialog())
 | 
	
		
			
				|  |  | +        if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty())
 | 
	
		
			
				|  |  | +            if (MessageBox.Show("This will remove this requisition from this list.\nAre you sure you wish to continue?", "Close Requisition?",
 | 
	
		
			
				|  |  | +                    MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty())
 | 
	
		
			
				|  |  | -                if (MessageBox.Show("This will remove this requisition from this list.\nAre you sure you wish to continue?", "Close Requisition?",
 | 
	
		
			
				|  |  | -                        MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | -                    return;
 | 
	
		
			
				|  |  | +        if (_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | +            _requisition.Archived = DateTime.Now;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | -                _requisition.Archived = DateTime.Now;
 | 
	
		
			
				|  |  | +        var emp = dlg.Data()?.Rows.FirstOrDefault();
 | 
	
		
			
				|  |  | +        _requisition.TakenBy.ID = emp != null ? emp.Get<Employee, Guid>(x => x.ID) : Guid.Empty;
 | 
	
		
			
				|  |  | +        _requisition.TakenBy.Name = emp != null ? emp.Get<Employee, string>(x => x.Name) : "";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var emp = dlg.Data()?.Rows.FirstOrDefault();
 | 
	
		
			
				|  |  | -            _requisition.TakenBy.ID = emp != null ? emp.Get<Employee, Guid>(x => x.ID) : Guid.Empty;
 | 
	
		
			
				|  |  | -            _requisition.TakenBy.Name = emp != null ? emp.Get<Employee, string>(x => x.Name) : "";
 | 
	
		
			
				|  |  | +        Progress.Show("Updating Requisition Delivery Status");
 | 
	
		
			
				|  |  | +        new Client<Requisition>().Save(_requisition, "Updated [TakenBy] Flag");
 | 
	
		
			
				|  |  | +        if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Refresh();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Requisitions.UpdateRow<Requisition, Guid>(Requisitions.SelectedRows.First(), x => x.TakenBy.ID, _requisition.TakenBy.ID, false);
 | 
	
		
			
				|  |  | +            Requisitions.UpdateRow<Requisition, string>(Requisitions.SelectedRows.First(), x => x.TakenBy.Name, _requisition.TakenBy.Name, false);
 | 
	
		
			
				|  |  | +            Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Archived, _requisition.Archived);
 | 
	
		
			
				|  |  | +            LoadRequisition();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Progress.Show("Updating Requisition Delivery Status");
 | 
	
		
			
				|  |  | -            new Client<Requisition>().Save(_requisition, "Updated [TakenBy] Flag");
 | 
	
		
			
				|  |  | -            if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Refresh();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Requisitions.UpdateRow<Requisition, Guid>(Requisitions.SelectedRows.First(), x => x.TakenBy.ID, _requisition.TakenBy.ID, false);
 | 
	
		
			
				|  |  | -                Requisitions.UpdateRow<Requisition, string>(Requisitions.SelectedRows.First(), x => x.TakenBy.Name, _requisition.TakenBy.Name, false);
 | 
	
		
			
				|  |  | -                Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Archived, _requisition.Archived);
 | 
	
		
			
				|  |  | -                LoadRequisition();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +        Progress.Close();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Progress.Close();
 | 
	
		
			
				|  |  | +    private void MarkAsFilled_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (_requisition == null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MessageBox.Show("Please select a Requisition first!");
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void MarkAsFilled_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | +        DateTime filltime = DateTime.Now;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        var unpickeditems = Items.Data.Rows.Where(r =>
 | 
	
		
			
				|  |  | +            _requisition.Filled.IsEmpty()
 | 
	
		
			
				|  |  | +            && (r.Get<RequisitionItem, Guid>(x => x.Product.ID) != Guid.Empty)
 | 
	
		
			
				|  |  | +            && (r.Get<RequisitionItem, bool>(x => x.Product.NonStock) != true)
 | 
	
		
			
				|  |  | +            && (r.Get<RequisitionItem, DateTime>(x => x.Picked).IsEmpty())
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        if (unpickeditems.Any())
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (_requisition == null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                MessageBox.Show("Please select a Requisition first!");
 | 
	
		
			
				|  |  | +            var confirm = MessageBox.Show("Unpicked items exist on this requisition!\n\nDo you want to mark them as picked now?",
 | 
	
		
			
				|  |  | +                "Unpicked Items", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
 | 
	
		
			
				|  |  | +            if (confirm == MessageBoxResult.Cancel)
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            DateTime filltime = DateTime.Now;
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | -            var unpickeditems = Items.Data.Rows.Where(r =>
 | 
	
		
			
				|  |  | -                _requisition.Filled.IsEmpty()
 | 
	
		
			
				|  |  | -                && (r.Get<RequisitionItem, Guid>(x => x.Product.ID) != Guid.Empty)
 | 
	
		
			
				|  |  | -                && (r.Get<RequisitionItem, bool>(x => x.Product.NonStock) != true)
 | 
	
		
			
				|  |  | -                && (r.Get<RequisitionItem, DateTime>(x => x.Picked).IsEmpty())
 | 
	
		
			
				|  |  | -            );
 | 
	
		
			
				|  |  | -            if (unpickeditems.Any())
 | 
	
		
			
				|  |  | +            filltime = DateTime.Now;
 | 
	
		
			
				|  |  | +            if (confirm == MessageBoxResult.Yes)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var confirm = MessageBox.Show("Unpicked items exist on this requisition!\n\nDo you want to mark them as picked now?",
 | 
	
		
			
				|  |  | -                    "Unpicked Items", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
 | 
	
		
			
				|  |  | -                if (confirm == MessageBoxResult.Cancel)
 | 
	
		
			
				|  |  | -                    return;
 | 
	
		
			
				|  |  | -                filltime = DateTime.Now;
 | 
	
		
			
				|  |  | -                if (confirm == MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | +                var updates = new List<RequisitionItem>();
 | 
	
		
			
				|  |  | +                foreach (var row in unpickeditems)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    var updates = new List<RequisitionItem>();
 | 
	
		
			
				|  |  | -                    foreach (var row in unpickeditems)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        var item = row.ToObject<RequisitionItem>();
 | 
	
		
			
				|  |  | -                        item.Picked = filltime;
 | 
	
		
			
				|  |  | -                        updates.Add(item);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    new Client<RequisitionItem>().Save(updates, "Marked as Picked because Requisition was marked as filled");
 | 
	
		
			
				|  |  | +                    var item = row.ToObject<RequisitionItem>();
 | 
	
		
			
				|  |  | +                    item.Picked = filltime;
 | 
	
		
			
				|  |  | +                    updates.Add(item);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                new Client<RequisitionItem>().Save(updates, "Marked as Picked because Requisition was marked as filled");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            _requisition.Filled = _requisition.Filled.IsEmpty() ? filltime : DateTime.MinValue;
 | 
	
		
			
				|  |  | -            Progress.Show(_requisition.Filled.IsEmpty() ? "Clearing Delivery Items" : "Creating Delivery Items");
 | 
	
		
			
				|  |  | -            new Client<Requisition>().Save(_requisition, "Updated Filled Flag");
 | 
	
		
			
				|  |  | -            Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Filled, _requisition.Filled);
 | 
	
		
			
				|  |  | -            LoadRequisition();
 | 
	
		
			
				|  |  | -            Items.Refresh(false, true);
 | 
	
		
			
				|  |  | -            Progress.Close();
 | 
	
		
			
				|  |  | +        _requisition.Filled = _requisition.Filled.IsEmpty() ? filltime : DateTime.MinValue;
 | 
	
		
			
				|  |  | +        Progress.Show(_requisition.Filled.IsEmpty() ? "Clearing Delivery Items" : "Creating Delivery Items");
 | 
	
		
			
				|  |  | +        new Client<Requisition>().Save(_requisition, "Updated Filled Flag");
 | 
	
		
			
				|  |  | +        Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.Filled, _requisition.Filled);
 | 
	
		
			
				|  |  | +        LoadRequisition();
 | 
	
		
			
				|  |  | +        Items.Refresh(false, true);
 | 
	
		
			
				|  |  | +        Progress.Close();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void UpdateStock_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if (_requisition == null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            MessageBox.Show("Please select a Requisition first!");
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void UpdateStock_Click(object sender, RoutedEventArgs e)
 | 
	
		
			
				|  |  | +        if (_requisition.StockUpdated.IsEmpty())
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (_requisition == null)
 | 
	
		
			
				|  |  | +            var emptyrows = Items.Data.Rows.Where(r =>
 | 
	
		
			
				|  |  | +                !Entity.IsEntityLinkValid<RequisitionItem, StockLocationLink>(x => x.Location, r) &&
 | 
	
		
			
				|  |  | +                r.Get<RequisitionItem, bool>(c => c.Product.NonStock).Equals(false));
 | 
	
		
			
				|  |  | +            if (emptyrows.Any())
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                MessageBox.Show("Please select a Requisition first!");
 | 
	
		
			
				|  |  | +                MessageBox.Show("You must select a Holding for each non-stock Item on this Requisition!", "Missing Holdings", MessageBoxButton.OK,
 | 
	
		
			
				|  |  | +                    MessageBoxImage.Error);
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (_requisition.StockUpdated.IsEmpty())
 | 
	
		
			
				|  |  | +            if (!_requisition.Filled.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var emptyrows = Items.Data.Rows.Where(r =>
 | 
	
		
			
				|  |  | -                    !Entity.IsEntityLinkValid<RequisitionItem, StockLocationLink>(x => x.Location, r) &&
 | 
	
		
			
				|  |  | -                    r.Get<RequisitionItem, bool>(c => c.Product.NonStock).Equals(false));
 | 
	
		
			
				|  |  | -                if (emptyrows.Any())
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    MessageBox.Show("You must select a Holding for each non-stock Item on this Requisition!", "Missing Holdings", MessageBoxButton.OK,
 | 
	
		
			
				|  |  | -                        MessageBoxImage.Error);
 | 
	
		
			
				|  |  | +                if (MessageBox.Show("This will remove this requisition from this list.\nAre you sure you wish to continue?", "Close Requisition?",
 | 
	
		
			
				|  |  | +                        MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  |                      return;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (!_requisition.Filled.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    if (MessageBox.Show("This will remove this requisition from this list.\nAre you sure you wish to continue?", "Close Requisition?",
 | 
	
		
			
				|  |  | -                            MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | -                        return;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    if (MessageBox.Show("Update Stock Movements?", "Confirm", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | -                        return;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                _requisition.StockUpdated = DateTime.Now;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                if (MessageBox.Show("Clear Stock Movements?", "Confirm", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | +                if (MessageBox.Show("Update Stock Movements?", "Confirm", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  |                      return;
 | 
	
		
			
				|  |  | -                _requisition.StockUpdated = DateTime.MinValue;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Progress.Show("Updating Stock Holdings");
 | 
	
		
			
				|  |  | -            new Client<Requisition>().Save(_requisition, "Updated Stock Flag");
 | 
	
		
			
				|  |  | -            if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Refresh();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.StockUpdated, _requisition.StockUpdated);
 | 
	
		
			
				|  |  | -                LoadRequisition();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            _requisition.StockUpdated = DateTime.Now;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (MessageBox.Show("Clear Stock Movements?", "Confirm", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            _requisition.StockUpdated = DateTime.MinValue;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Progress.Close();
 | 
	
		
			
				|  |  | +        Progress.Show("Updating Stock Holdings");
 | 
	
		
			
				|  |  | +        new Client<Requisition>().Save(_requisition, "Updated Stock Flag");
 | 
	
		
			
				|  |  | +        if (!_requisition.Filled.IsEmpty() && !_requisition.StockUpdated.IsEmpty() && !_requisition.Archived.IsEmpty())
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Refresh();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Requisitions.UpdateRow<Requisition, DateTime>(Requisitions.SelectedRows.First(), x => x.StockUpdated, _requisition.StockUpdated);
 | 
	
		
			
				|  |  | +            LoadRequisition();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Progress.Close();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |