| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 | using System;using System.Collections.Generic;using System.Linq;using System.Windows;using System.Windows.Media;using Comal.Classes;using InABox.Clients;using InABox.Core;using InABox.DynamicGrid;using InABox.Reports;using InABox.Core.Reports;using InABox.Wpf;using InABox.Wpf.Reports;using InABox.WPF;using Motorola.Snapi;using Motorola.Snapi.Constants.Enums;using Motorola.Snapi.EventArguments;namespace PRSDesktop{    /// <summary>    ///     Interaction logic for DeliveryBuilder.xaml    /// </summary>    public partial class DeliveryBuilder : ThemableWindow    {        private Guid _deliveryid = Guid.Empty;        private Guid _orderid = Guid.Empty;        private readonly Dictionary<CodeStatus, BeepPattern> BeepList = new()        {            { CodeStatus.Initialized, BeepPattern.FastWarble },            { CodeStatus.Opened, BeepPattern.ThreeHighShort },            { CodeStatus.Closed, BeepPattern.ThreeLowShort },            { CodeStatus.Added, BeepPattern.LowHigh },            { CodeStatus.Removed, BeepPattern.HighLow },            { CodeStatus.NotFound, BeepPattern.FourLowLong },            { CodeStatus.Error, BeepPattern.FourLowShort }        };        private readonly CoreTable Deliveries;        private CoreTable Order;        private CoreTable OrderItems = null;        public List<IMotorolaBarcodeScanner> Scanners = new();        private DynamicGridRowStyle _rowStyle;        public DeliveryBuilder(Guid deliveryid, Guid orderid)        {            InitializeComponent();            Deliveries = new Client<Delivery>().Query(                new Filter<Delivery>(x => x.Completed).IsEqualTo(DateTime.MinValue)            );            _deliveryid = deliveryid;            _orderid = orderid;            Items.OnChanged += ItemsChanged;            Items.OnGetRowStyle += Items_GetStyle;        }        private DynamicGridStyle Items_GetStyle(CoreRow row, DynamicGridStyle defaultstyle)        {            if (_rowStyle == null)                _rowStyle = new DynamicGridRowStyle(defaultstyle) { Background = new SolidColorBrush(Colors.LightYellow) };            return _rowStyle;        }        private void ItemsChanged(object sender, EventArgs args)        {            PrintButton.IsEnabled = Items.DeliveryDocketReady();        }        private void Window_Loaded(object sender, RoutedEventArgs e)        {            BarcodeScannerManager.Instance.Open();            BarcodeScannerManager.Instance.RegisterForEvents(EventType.Barcode, EventType.Pnp, EventType.Image, EventType.Other, EventType.Rmd);            BarcodeScannerManager.Instance.GetDevices();            foreach (var scanner in BarcodeScannerManager.Instance.GetDevices())            {                Scanners.Add(scanner);                scanner.Actions.ToggleLed(LedMode.RedOn);            }            Beep(CodeStatus.Initialized);            BarcodeScannerManager.Instance.DataReceived += Instance_DataReceived;            if (_deliveryid != Guid.Empty && _orderid != Guid.Empty)            {                CheckCode(null, string.Format("Delivery{0}Order{1}", _deliveryid, _orderid));                PrintButton.IsEnabled = Items.DeliveryDocketReady();            }        }        private void Window_Unloaded(object sender, RoutedEventArgs e)        {            foreach (var scanner in Scanners) scanner.Actions.ToggleLed(LedMode.GreenOff);            BarcodeScannerManager.Instance.DataReceived -= Instance_DataReceived;            BarcodeScannerManager.Instance.Close();        }        private void Beep(CodeStatus status)        {            foreach (var scanner in BarcodeScannerManager.Instance.GetDevices())            {                if (status == CodeStatus.Opened)                    scanner.Actions.ToggleLed(LedMode.GreenOn);                else if (status == CodeStatus.Closed)                    scanner.Actions.ToggleLed(LedMode.RedOn);                scanner.Actions.SoundBeeper(BeepList[status]);            }        }        private void WaitBeep()        {            foreach (var scanner in BarcodeScannerManager.Instance.GetDevices())            {                scanner.Actions.ToggleLed(LedMode.YellowOn);                scanner.Actions.SoundBeeper(BeepPattern.OneHighShort);            }        }        private void Instance_DataReceived(object? sender, BarcodeScanEventArgs e)        {            Dispatcher.Invoke(() => { CheckCode(Scanners[(int)e.ScannerId], e.Data); });        }        private void CheckCode(IMotorolaBarcodeScanner scanner, string code)        {            if (code.Contains("Delivery") && code.Contains("Order"))            {                var barcodes = code.Split(new[] { "Delivery", "Order" }, StringSplitOptions.RemoveEmptyEntries);                if (barcodes.Length != 2)                {                    MessageBox.Show(string.Format("Bad Delivery Barcode: {0} -> {1}", code, string.Join(" / ", barcodes)));                    return;                }                if (!Guid.TryParse(barcodes[0], out var deliveryid))                {                    MessageBox.Show(string.Format("Bad Delivery Guid: {0}", barcodes[0]));                    return;                }                _deliveryid = deliveryid;                if (!Guid.TryParse(barcodes[1], out var orderid))                {                    MessageBox.Show(string.Format("Bad Order Guid: {0}", barcodes[1]));                    return;                }                _orderid = orderid;                var delrow = Deliveries.Rows.FirstOrDefault(row => row.Get<Delivery, Guid>(x => x.ID).Equals(deliveryid));                if (delrow == null)                {                    MessageBox.Show(string.Format("Cannot Find Delivery: {0}", deliveryid));                    return;                }                DeliveryNumber.Text = delrow.Get<Delivery, int>(x => x.Number).ToString();                DeliveryNotes.Text = delrow.Get<Delivery, string>(x => x.Notes);                Items.DeliveryID = delrow.Get<Delivery, Guid>(x => x.ID);                Items.OrderID = orderid;                new Client<PurchaseOrder>().Query(                    new Filter<PurchaseOrder>(x => x.ID).IsEqualTo(orderid),                    null,                    null,                    CoreRange.All,                    (o, e) =>                    {                        Dispatcher.Invoke(() =>                        {                            Order = o;                            var ordrow = o.Rows.FirstOrDefault();                            OrderNumber.Text = ordrow != null ? ordrow.Get<PurchaseOrder, string>(x => x.PONumber) : "";                            Supplier.Text = ordrow != null ? ordrow.Get<PurchaseOrder, string>(x => x.SupplierLink.Name) : "";                        });                    }                );                PrintButton.IsEnabled = Items.DeliveryDocketReady();            }            else if (code.Contains("OrderItem"))            {                var barcodes = code.Split(new[] { "OrderItem" }, StringSplitOptions.RemoveEmptyEntries);                try                {                    Items.CheckCode(Guid.Parse(barcodes.First()));                    Items.Refresh(false, true);                }                catch (Exception e)                {                    MessageBox.Show(e.Message);                }                PrintButton.IsEnabled = Items.DeliveryDocketReady();            }            else            {                MessageBox.Show("Bad Code: " + code);            }        }        private void PrintButton_Click(object sender, RoutedEventArgs e)        {            var model = new DeliveryDataModel(new Filter<Delivery>(x => x.ID).IsEqualTo(_deliveryid));            var templatename = "Print Treatment Delivery Docket";            var sectionName = "Factory Floor - Treatment PO";            var template = new Client<ReportTemplate>()                .Load(                    new Filter<ReportTemplate>(x => x.Name).IsEqualTo(templatename)                        .And(x => x.DataModel).IsEqualTo(model.Name)                        .And(x => x.Section).IsEqualTo(sectionName)                ).FirstOrDefault();            if (template == null)            {                template = new ReportTemplate                {                    DataModel = model.Name,                    Section = sectionName,                    Name = templatename                };                new Client<ReportTemplate>().Save(template, "Auto Created Report Template");            }            var delrow = Deliveries.Rows.FirstOrDefault(r => r.Get<Delivery, Guid>(c => c.ID).Equals(_deliveryid));            if (delrow == null)            {                Progress.Close();                MessageBox.Show("Cannot Find Delivery!");                return;            }            ReportUtils.PreviewReport(template, model, !Security.IsAllowed<CanDesignReports>(), Security.IsAllowed<CanDesignReports>());            SendDeliveryNotification(delrow.Get<Delivery, int>(x => x.Number));        }        private void SendDeliveryNotification(int DeliveryNumber)        {            var updates = new List<Notification>();            var roles = new Client<EmployeeRole>().Query(new Filter<EmployeeRole>(x => x.RoleLink.Code).IsEqualTo("DELIVERIES"));            foreach (var role in roles.Rows)            {                var notification = new Notification                {                    Title = string.Format("Treatment Delivery #{0} has been raised", DeliveryNumber),                    Description = "The above Delivery has been created, and is ready to be shipped to the relevant supplier."                };                notification.Sender.ID = App.EmployeeID;                notification.Employee.ID = role.Get<EmployeeRole, Guid>(x => x.EmployeeLink.ID);                updates.Add(notification);            }            new Client<Notification>().Save(updates, "Sent Notification");        }        private enum CodeStatus        {            Initialized,            Opened,            Closed,            Added,            Removed,            Error,            NotFound        }    }}
 |