using Comal.Classes; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using InABox.WPF; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows; using System.Windows.Controls; namespace PRSDesktop; public class JobRequisitionReviewUserSettings : IUserConfigurationSettings { [Obsolete] private CoreFilterDefinition? _currentFilter; [Obsolete] public CoreFilterDefinition? CurrentFilter { get => _currentFilter; set { if (value is not null) { Filters = new DynamicGridSelectedFilterSettings(new List { value }, false, null); } } } public DynamicGridSelectedFilterSettings Filters { get; set; } = new(); } public delegate void JobRequiItemSelect(CoreRow[] rows); public delegate void GridRefresh(); public class JobRequisitionReviewGrid : DynamicDataGrid { private readonly JobRequisitionReviewUserSettings FilterSettings = new JobRequisitionReviewUserSettings(); public JobRequisitionReviewGrid() { FilterSettings = new UserConfiguration().Load(); FilterComponent.SetSettings(FilterSettings.Filters, false); HiddenColumns.Add(x => x.ID); HiddenColumns.Add(x => x.Product.ID); HiddenColumns.Add(x => x.Product.Code); HiddenColumns.Add(x => x.Product.Group.ID); HiddenColumns.Add(x => x.Product.Group.Code); HiddenColumns.Add(x => x.Product.Group.Description); HiddenColumns.Add(x => x.Style.ID); HiddenColumns.Add(x => x.Style.Code); HiddenColumns.Add(x => x.Style.Description); HiddenColumns.Add(x => x.Status); HiddenColumns.Add(x => x.Requisition.ID); HiddenColumns.Add(x => x.Requisition.Job.ID); HiddenColumns.Add(x => x.Requisition.Job.JobNumber); HiddenColumns.Add(x => x.Requisition.Job.Name); HiddenColumns.Add(x => x.Requisition.Number); HiddenColumns.Add(x => x.Job.ID); HiddenColumns.Add(x => x.Job.Name); HiddenColumns.Add(x => x.Job.JobNumber); HiddenColumns.Add(x => x.Dimensions.UnitSize); HiddenColumns.Add(x => x.Dimensions.Length); HiddenColumns.Add(x => x.Dimensions.Width); HiddenColumns.Add(x => x.Dimensions.Height); HiddenColumns.Add(x => x.Dimensions.Weight); HiddenColumns.Add(x => x.Dimensions.Quantity); HiddenColumns.Add(x => x.Dimensions.Value); HiddenColumns.Add(x => x.Dimensions.Unit.ID); HiddenColumns.Add(x => x.Dimensions.Unit.HasLength); HiddenColumns.Add(x => x.Dimensions.Unit.HasHeight); HiddenColumns.Add(x => x.Dimensions.Unit.HasWidth); HiddenColumns.Add(x => x.Dimensions.Unit.HasWeight); HiddenColumns.Add(x => x.Dimensions.Unit.HasQuantity); HiddenColumns.Add(x => x.Dimensions.Unit.Formula); HiddenColumns.Add(x => x.Dimensions.Unit.Format); HiddenColumns.Add(x => x.Dimensions.Unit.Code); HiddenColumns.Add(x => x.Dimensions.Unit.Description); if (Security.CanEdit()) ActionColumns.Add(new DynamicMenuColumn(BuildMenu)); ColumnsTag = "JobRequisitionReview"; FilterComponent.OnFiltersSelected += GridOnFilterSelected; } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.BeginUpdate() .AddRange( DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns, DynamicGridOption.RecordCount, DynamicGridOption.DragSource) .Remove(DynamicGridOption.AddRows) .Remove(DynamicGridOption.ImportData) .Remove(DynamicGridOption.ExportData) .Remove(DynamicGridOption.Print) .Remove(DynamicGridOption.ShowHelp) .EndUpdate(); } private void GridOnFilterSelected(DynamicGridSelectedFilterSettings settings) { new UserConfiguration().Save(new JobRequisitionReviewUserSettings { Filters = settings }); Refresh(false, true); } 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); return columns; } #region Action Column Buttons private bool CheckValidAction(JobRequisitionItem item) { bool valid = true; if (item.Status == JobRequisitionItemStatus.Allocated) { MessageWindow.ShowMessage("Item has already been reserved!", "Error", image: MessageWindow.WarningImage); return false; } else if (item.Status == JobRequisitionItemStatus.OnOrder) { MessageWindow.ShowMessage("Item is already on order!", "Error", image: MessageWindow.WarningImage); return false; } return valid; } private void SplitLine(JobRequisitionItem item, double oldItemQty, double newItemQty, string notes) { List items = new List(); JobRequisitionItem newItem = new JobRequisitionItem(); newItem.Requisition.ID = item.Requisition.ID; newItem.Requisition.Job.ID = item.Requisition.Job.ID; newItem.Requisition.Job.JobNumber = item.Requisition.Job.JobNumber; newItem.Requisition.Job.Name = item.Requisition.Job.Name; newItem.Product.ID = item.Product.ID; newItem.Product.Name = item.Product.Name; newItem.Product.Code = item.Product.Code; newItem.Product.Group.ID = item.Product.Group.ID; newItem.Product.Group.Description = item.Product.Group.Description; newItem.Dimensions.CopyFrom(item.Dimensions); newItem.Style.ID = item.Style.ID; newItem.Style.Description = item.Style.Description; newItem.Style.Code = item.Style.Code; newItem.Notes = item.Notes + Environment.NewLine + notes; item.Notes = newItem.Notes; item.Qty = oldItemQty; newItem.Qty = newItemQty; items.Add(newItem); items.Add(item); Client.Save(items, "Split lines from Job Requi Item Review Dashboard"); MessageWindow.ShowMessage("Line split - original line Qty is now " + item.Qty + ". New line Qty is " + newItem.Qty, "Success"); Refresh(false, true); } private void SplitLine_Clicked(CoreRow? row) { if (row is null) return; var item = row.ToObject(); if (CheckValidAction(item)) { int units = Convert.ToInt32(item.Qty); if (NumberEdit.Execute("Enter amount to split", 1, units, ref units)) { SplitLine(item, item.Qty - units, units, "Line split"); } } } private void Archive_Clicked(CoreRow? row) { if (row is null) return; var item = row.ToObject(); if(item.Status != JobRequisitionItemStatus.Allocated) { var result = MessageWindow.New() .Message($"This requisition item is not fully allocated; its current status is {item.Status}. Are you sure you wish to archive this item?") .Title("Confirm Archive") .AddYesButton("Archive") .AddCancelButton() .Display().Result; if(result != MessageWindowResult.Yes) { return; } } item.Archived = DateTime.Now; item.Notes += Environment.NewLine + "Line marked as Archived by " + App.EmployeeName + " on " + DateTime.Now.ToString("dd MMM yy"); Client.Save(item, "Updated From Job Requisition Review Dashboard"); Refresh(false, true); } private void OrderRequired_Clicked(CoreRow? row) { if (row is null) return; var item = row.ToObject(); if (CheckValidAction(item)) { item.OrderRequired = DateTime.Now; item.Notes += Environment.NewLine + "Line marked as Order Required by " + App.EmployeeName + " on " + DateTime.Now.ToString("dd MMM yy"); Client.Save(item, "Updated From Job Requisition Review Dashboard"); Refresh(false, true); } } #endregion protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { criteria.Add(new Filter(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue)); criteria.Add(new Filter(x => x.Archived).IsEqualTo(DateTime.MinValue)); sort = new SortOrder(x => x.Requisition.Number, SortDirection.Descending); base.Reload(criteria, columns, ref sort, action); } private void BuildMenu(DynamicMenuColumn column, CoreRow? row) { column.AddItem("Order Required", PRSDesktop.Resources.purchase, OrderRequired_Clicked); column.AddItem("Split Line", PRSDesktop.Resources.split, SplitLine_Clicked); column.AddItem("Archive", PRSDesktop.Resources.archive, Archive_Clicked); } protected override DragDropEffects OnRowsDragStart(CoreRow[] rows) { // Only allow dragging the selected rows. var selected = SelectedRows.Select(x => x.Get(x => x.ID)).ToHashSet(); var draggedRows = rows.Where(x => selected.Contains(x.Get(x => x.ID))).ToArray(); if(draggedRows.Length == 0) { return DragDropEffects.None; } else { return base.OnRowsDragStart(draggedRows); } } } public class JobRequiReviewDashboardFilterItem { public Guid SupplierID { get; set; } public Guid ProductID { get; set; } public string Text { get; set; } public JobRequiReviewDashboardFilterItem() { SupplierID = Guid.Empty; ProductID = Guid.Empty; Text = ""; } }