using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Reactive.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using InABox.WPF; using Syncfusion.Windows.Controls.RichTextBoxAdv; namespace PRSDesktop; internal class JobRequisitionItemGrid : DynamicDataGrid, IMasterDetailControl, ISpecificGrid { public Job? Job { get; set; } private JobRequisition? _master; public JobRequisition? Master { get => _master; set { _master = value; // CheckVisibility(); Reconfigure(); } } public Filter MasterDetailFilter => Master != null ? Master.ID != Guid.Empty ? new Filter(x => x.Requisition.ID).IsEqualTo(Master.ID) : new Filter().None() : Job is not null && Job.ID != Guid.Empty ? new Filter(x => x.Requisition.Job.ID).IsEqualTo(Job.ID) : new Filter().None(); private Button CreatePickingList; private Button CreateOrder; public JobRequisitionItemGrid() { HiddenColumns.Add(x=>x.Product.ID); HiddenColumns.Add(x=>x.Style.ID); HiddenColumns.Add(x=>x.Dimensions.Unit.ID); HiddenColumns.Add(x=>x.Dimensions.Unit.HasHeight); HiddenColumns.Add(x=>x.Dimensions.Unit.HasLength); HiddenColumns.Add(x=>x.Dimensions.Unit.HasWidth); HiddenColumns.Add(x=>x.Dimensions.Unit.HasQuantity); HiddenColumns.Add(x=>x.Dimensions.Unit.HasWeight); HiddenColumns.Add(x=>x.Dimensions.Unit.Formula); HiddenColumns.Add(x=>x.Dimensions.Unit.Format); HiddenColumns.Add(x=>x.Dimensions.Height); HiddenColumns.Add(x=>x.Dimensions.Length); HiddenColumns.Add(x=>x.Dimensions.Width); HiddenColumns.Add(x=>x.Dimensions.Quantity); HiddenColumns.Add(x=>x.Dimensions.Weight); HiddenColumns.Add(x=>x.Dimensions.Value); HiddenColumns.Add(x=>x.Dimensions.UnitSize); HiddenColumns.Add(x=>x.PickRequested); CreateOrder = AddButton("Create Order", PRSDesktop.Resources.purchase.AsBitmapImage(), DoCreatePurchaseOrder); CreatePickingList = AddButton("Create Picking List", PRSDesktop.Resources.trolley.AsBitmapImage(), DoCreatePickingList); } protected override void SelectItems(CoreRow[]? rows) { base.SelectItems(rows); CreatePickingList.IsEnabled = rows?.Any() == true; } #region CreatePurchaseOrder private bool DoCreatePurchaseOrder(Button button, CoreRow[]? rows) { if (rows?.Any() != true) return false; MultiSelectDialog dlg = new MultiSelectDialog( LookupFactory.DefineFilter(), Columns.None() .Add(x => x.ID) .Add(x => x.Code) .Add(x => x.Name), false ); var _po = new PurchaseOrder(); if (dlg.ShowDialog()) { Progress.ShowModal("Creating Purchase Order", progress => { _po.Description = "Created from Job Requisition Screen" + System.Environment.NewLine; _po.RaisedBy.ID = App.EmployeeID; _po.SupplierLink.ID = dlg.IDs().First(); Client.Save(_po, "Created From Requisition Screen"); progress.Report("Creating Order Items"); Dictionary _pois = new Dictionary(); foreach (CoreRow row in SelectedRows) { JobRequisitionItem _jri = row.ToObject(); PurchaseOrderItem _poi = new PurchaseOrderItem(); _poi.PurchaseOrderLink.ID = _po.ID; _poi.Product.ID = _jri.Product.ID; _poi.Product.Code = _jri.Product.Code; _poi.Product.Name = _jri.Product.Name; _poi.Qty = _jri.Qty; _poi.Dimensions.CopyFrom(_jri.Dimensions); _poi.Dimensions.Value = _jri.Dimensions.Value; _poi.Style.ID = _jri.Style.ID; _poi.Style.Code = _jri.Style.Code; _poi.Style.Description = _jri.Style.Description; _poi.Job.ID = _jri.Job.ID; _poi.Dimensions.UnitSize = _jri.Dimensions.UnitSize; _poi.Description = _jri.Product.Name + " (" + _jri.Dimensions.ToString() + ")"; _pois[_jri.ID] = _poi; } Client.Save(_pois.Values, "Created From Requisition Screen"); List _jripois = new(); foreach (var _poi in _pois) { var _jripoi = new JobRequisitionItemPurchaseOrderItem(); _jripoi.JobRequisitionItem.ID = _poi.Key; _jripoi.PurchaseOrderItem.ID = _poi.Value.ID; _jripois.Add(_jripoi); } Client.Save(_jripois, "Created From Requisition Screen"); }); } new SupplierPurchaseOrders().EditItems(new[] { _po }); return true; } #endregion #region CreatePickingList private bool DoCreatePickingList(Button button, CoreRow[]? rows) { if (rows?.Any() != true) return false; if (rows.All(r => r.Get(x => x.PickRequested) .IsEffectivelyEqual(r.Get(x => x.Qty)))) { MessageWindow.ShowMessage("All Items have been picked!","Error"); return false; } var picklist = new Requisition(); if (Job != null) picklist.JobLink.CopyFrom(Job); else picklist.JobLink.CopyFrom(Master?.Job ?? new JobLink()); if (new RequisitionGrid().EditItems(new Requisition[] { picklist })) { Progress.ShowModal("Creating Picking List", (progress) => { List pickitems = new(); foreach (var item in rows.Select(x => x.ToObject())) { if (!item.PickRequested.IsEffectivelyEqual(item.Qty)) { var pickitem = new RequisitionItem(); pickitem.RequisitionLink.ID = picklist.ID; pickitem.RequisitionLink.Synchronise(picklist); pickitem.SourceJRI.ID = item.ID; pickitem.SourceJRI.Synchronise(item); pickitem.Product.ID = item.Product.ID; pickitem.Product.Synchronise(item.Product); pickitem.Style.ID = item.Style.ID; pickitem.Style.Synchronise(item.Style); pickitem.Dimensions.CopyFrom(item.Dimensions); pickitem.Quantity = item.Qty - item.PickRequested; pickitems.Add(pickitem); } } Client.Save(pickitems, "Created from Job Requisition"); }); } return true; } #endregion // private void CheckVisibility() // { // CancelItemsButton.Visibility = Master is not null && Security.CanEdit() && Security.CanEdit() // ? System.Windows.Visibility.Visible // : System.Windows.Visibility.Hidden; // } // protected override void SelectItems(CoreRow[]? rows) // { // base.SelectItems(rows); // CancelItemsButton.IsEnabled = rows is not null && rows.Length > 0; // } //private bool CancelItems(Button button, CoreRow[] rows) //{ // if (Master is null) return false; // if(rows.Length == 0) // { // MessageWindow.ShowMessage("Please select at least one item to cancel.", "Select items"); // return false; // } // // Reloading so I can ensure the correct columns without having to add hidden columns to JobRequisitionGrid. // var oldRequi = Client.Query( // new Filter(x => x.ID).IsEqualTo(Master?.ID ?? Guid.Empty), // Columns.None().Add(x => x.Description) // .Add(x => x.Number) // .Add(x => x.DueDate)) // .ToObjects() // .First(); // var oldRequiItems = Client.Query( // new Filter(x => x.ID).InList(rows.Select(x => x.Get(x => x.ID)).ToArray()), // Columns.None().Add(x => x.Qty) // .Add(x => x.Sequence) // .Add(x => x.Job.ID) // .Add(x => x.Product.ID) // .Add(x => x.Product.Code) // .Add(x => x.Style.ID) // .Add(x => x.Style.Code) // .Add(x => x.Style.Description) // .Add(x => x.Dimensions.Unit.ID) // .Add(x => x.Dimensions.Quantity) // .Add(x => x.Dimensions.Length) // .Add(x => x.Dimensions.Width) // .Add(x => x.Dimensions.Height) // .Add(x => x.Dimensions.Weight) // .Add(x => x.Dimensions.UnitSize) // .Add(x => x.Supplier.ID)); // var requisition = new JobRequisition // { // Description = $"Adjustment Requisition for Requisition {oldRequi.Number}", // DueDate = oldRequi.DueDate // }; // requisition.Job.ID = Master.Job.ID; // requisition.Job.Synchronise(Master.Job); // var requiItems = new List(); // foreach(var oldItem in oldRequiItems.ToObjects()) // { // var newItem = new JobRequisitionItem // { // Notes = "Adjustment Requisition item", // Qty = -oldItem.Qty, // Sequence = oldItem.Sequence // }; // newItem.Job.ID = requisition.Job.ID; // newItem.Product.ID = oldItem.Product.ID; // newItem.Style.ID = oldItem.Style.ID; // newItem.Supplier.ID = oldItem.Supplier.ID; // requiItems.Add(newItem); // } // var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicGrid<>), typeof(JobRequisition)); // if (grid.EditItems(new JobRequisition[] { requisition }, t => // { // if (t == typeof(JobRequisitionItem)) // { // var table = new CoreTable(); // table.LoadColumns(new Columns(ColumnTypeFlags.Local | ColumnTypeFlags.IncludeAggregates | ColumnTypeFlags.IncludeFormulae | ColumnTypeFlags.Required)); // table.LoadRows(requiItems); // return table; // } // return null; // })) // { // MessageWindow.ShowMessage($"Created requisition {requisition.Number}", "Created Requisition"); // return true; // } // else // { // return false; // } //} protected override void DoReconfigure(DynamicGridOptions options) { base.DoReconfigure(options); options.RecordCount = true; options.SelectColumns = true; options.FilterRows = true; options.MultiSelect = true; if(Master is not null) { options.AddRows = true; } else { options.AddRows = false; } } protected override void Reload( Filters criteria, Columns columns, ref SortOrder? sort, CancellationToken token, Action action) { criteria.Add(MasterDetailFilter); base.Reload(criteria, columns, ref sort, token, action); } protected override bool CanCreateItems() { return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty; } public override JobRequisitionItem CreateItem() { var result = base.CreateItem(); if(Master is not null) { result.Requisition.ID = Master.ID; result.Requisition.Synchronise(Master); result.Job.ID = Master.Job.ID; result.Job.Synchronise(Master.Job); } result.Qty = 1; return result; } protected override void OnAfterEditorValueChanged(DynamicEditorGrid? grid, JobRequisitionItem[] items, AfterEditorValueChangedArgs args, Dictionary changes) { base.OnAfterEditorValueChanged(grid, items, args, changes); if (args.ColumnName.Equals("Product.ID") || args.ColumnName.Equals("Dimensions") || args.ColumnName.StartsWith("Dimensions.") || args.ColumnName.Equals("Style.ID") || args.ColumnName.Equals("Supplier.ID")) { JobRequisitionItem.UpdateCosts( items, changes ); } } public override DynamicGridColumns GenerateColumns() { var columns = new DynamicGridColumns(); columns.Add(x => x.Created, 80, "Date", "", Alignment.MiddleLeft); columns.Add(x => x.Requisition.Job.JobNumber, 70, "Job", "", Alignment.MiddleLeft); columns.Add(x => x.Requisition.Number, 50, "NO.", "", Alignment.MiddleLeft); columns.Add(x => x.Product.Code, 70, "Code", "", Alignment.MiddleLeft); columns.Add(x => x.Product.Name, 200, "Product Name", "", Alignment.MiddleLeft); columns.Add(x => x.Style.Description, 150, "Style", "", Alignment.MiddleLeft); columns.Add(x => x.Qty, 50, "Qty", "", Alignment.MiddleLeft); columns.Add(x => x.Dimensions.UnitSize, 50, "Size", "", Alignment.MiddleLeft); columns.Add(x => x.PurchaseOrderNumbers, 80, "PO Numbers", "", Alignment.MiddleLeft); columns.Add(x => x.Notes, 300, "Notes", "", Alignment.MiddleLeft); columns.AddRange(base.GenerateColumns()); return columns; } }