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 { /// /// Interaction logic for DeliveryBuilder.xaml /// public partial class DeliveryBuilder : ThemableWindow { private Guid _deliveryid = Guid.Empty; private Guid _orderid = Guid.Empty; private readonly Dictionary 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 Scanners = new(); private DynamicGridRowStyle _rowStyle; public DeliveryBuilder(Guid deliveryid, Guid orderid) { InitializeComponent(); Deliveries = new Client().Query( new Filter(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(x => x.ID).Equals(deliveryid)); if (delrow == null) { MessageBox.Show(string.Format("Cannot Find Delivery: {0}", deliveryid)); return; } DeliveryNumber.Text = delrow.Get(x => x.Number).ToString(); DeliveryNotes.Text = delrow.Get(x => x.Notes); Items.DeliveryID = delrow.Get(x => x.ID); Items.OrderID = orderid; new Client().Query( new Filter(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(x => x.PONumber) : ""; Supplier.Text = ordrow != null ? ordrow.Get(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(x => x.ID).IsEqualTo(_deliveryid)); var templatename = "Print Treatment Delivery Docket"; var sectionName = "Factory Floor - Treatment PO"; var template = new Client() .Load( new Filter(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().Save(template, "Auto Created Report Template"); } var delrow = Deliveries.Rows.FirstOrDefault(r => r.Get(c => c.ID).Equals(_deliveryid)); if (delrow == null) { Progress.Close(); MessageBox.Show("Cannot Find Delivery!"); return; } ReportUtils.PreviewReport(template, model, !Security.IsAllowed(), Security.IsAllowed()); SendDeliveryNotification(delrow.Get(x => x.Number)); } private void SendDeliveryNotification(int DeliveryNumber) { var updates = new List(); var roles = new Client().Query(new Filter(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(x => x.EmployeeLink.ID); updates.Add(notification); } new Client().Save(updates, "Sent Notification"); } private enum CodeStatus { Initialized, Opened, Closed, Added, Removed, Error, NotFound } } }