Browse Source

Added archive button at bottom of Reservation management screen.

Kenric Nugteren 1 year ago
parent
commit
ae7db72103

+ 15 - 1
prs.classes/Entities/Stock/StockHolding.cs

@@ -104,7 +104,9 @@ namespace Comal.Classes
 
         public override bool Distinct => true;
 
-        public override Column<IStockHolding>[] IDColumns => new Column<IStockHolding>[]
+        public override Column<IStockHolding>[] IDColumns => Columns;
+
+        public static Column<IStockHolding>[] Columns => new Column<IStockHolding>[]
         {
             new Column<IStockHolding>(x => x.Job.ID),
             new Column<IStockHolding>(x => x.Location.ID),
@@ -117,6 +119,18 @@ namespace Comal.Classes
             new Column<IStockHolding>(x => x.Dimensions.Height),
             new Column<IStockHolding>(x => x.Dimensions.Weight),
         };
+
+        public static Filter<StockMovement>? GetFilter(IStockHolding holding)
+        {
+            var filter = new Filters<StockMovement>();
+
+            foreach(var column in Columns)
+            {
+                filter.Add(new Filter<StockMovement>(column.Cast<StockMovement>()).IsEqualTo(CoreUtils.GetPropertyValue(holding, column.Property)));
+            }
+
+            return filter.Combine();
+        }
     }
     
     [UserTracking(typeof(StockMovement))]

+ 1 - 12
prs.desktop/Panels/Products/Locations/StockHoldingGrid.cs

@@ -62,16 +62,12 @@ namespace PRSDesktop
             TransferButton.IsEnabled = false;
 
             HiddenColumns.Add(x => x.Product.ID);
-            HiddenColumns.Add(x => x.Product.Deleted);
             HiddenColumns.Add(x => x.Job.ID);
             HiddenColumns.Add(x => x.Job.JobNumber);
-            HiddenColumns.Add(x => x.Job.Deleted);
             HiddenColumns.Add(x => x.Location.ID);
             HiddenColumns.Add(x => x.Location.Code);
-            HiddenColumns.Add(x => x.Location.Deleted);
             HiddenColumns.Add(x => x.Style.ID);
             HiddenColumns.Add(x => x.Style.Code);
-            HiddenColumns.Add(x => x.Style.Deleted);
             HiddenColumns.Add(x => x.Qty);
             HiddenColumns.Add(x => x.Units);
             HiddenColumns.Add(x => x.AverageValue);
@@ -273,7 +269,7 @@ namespace PRSDesktop
 
         private void SaveBatch(StockMovementBatchType type, StockMovement[] movements)
         {
-            StockMovementBatch batch = new StockMovementBatch();
+            var batch = new StockMovementBatch();
             batch.Type = type;
             batch.Notes = batch.Type + " batch created from Desktop Stock Location Screen";
             batch.Employee.ID = _employeeid;
@@ -392,13 +388,6 @@ namespace PRSDesktop
             CheckStockMovementGrid();
 
             var holding = rows.First().ToObject<StockHolding>();
-            // var jobid = rows.First().Get<StockHolding, Guid>(x => x.Job.ID);
-            // var jobno = rows.First().Get<StockHolding, string>(x => x.Job.JobNumber);
-            // var productid = rows.First().Get<StockHolding, Guid>(x => x.Product.ID);
-            // var styleid = rows.First().Get<StockHolding, Guid>(x => x.Style.ID);
-            // var stylecode = rows.First().Get<StockHolding, string>(x => x.Style.Code);
-            // var units = rows.First().Get<StockHolding, double>(x => x.Units);
-            // var size = rows.First().Get<StockHolding, double>(x => x.UnitSize);
 
             var movement = new StockMovement();
             movement.Date = DateTime.Now;

+ 72 - 73
prs.desktop/Panels/Products/Locations/StockLocationGrid.cs

@@ -10,99 +10,98 @@ using InABox.DynamicGrid;
 using InABox.WPF;
 using NPOI.SS.Formula.Functions;
 
-namespace PRSDesktop
+namespace PRSDesktop;
+
+public class StockLocationGrid : DynamicDataGrid<StockLocation>
 {
-    public class StockLocationGrid : DynamicDataGrid<StockLocation>
+    private bool bShowAll;
+    public Button ShowAllBtn;
+    public Button StockTakeBtn;
+
+    protected override void Init()
     {
-        private bool bShowAll;
-        public Button ShowAllBtn;
-        public Button StockTakeBtn;
+        base.Init();
+        ShowAllBtn = AddButton("Show All", PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), ToggleHiddenJobs);
 
-        protected override void Init()
-        {
-            base.Init();
-            ShowAllBtn = AddButton("Show All", PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), ToggleHiddenJobs);
+        if (Security.CanEdit<StockMovement>())
+            StockTakeBtn = AddButton("Stock Take", PRSDesktop.Resources.rack.AsBitmapImage(Color.White), DoStockTake);
+        HiddenColumns.Add(x => x.Job.ID);
 
-            if (Security.CanEdit<StockMovement>())
-                StockTakeBtn = AddButton("Stock Take", PRSDesktop.Resources.rack.AsBitmapImage(Color.White), DoStockTake);
-            HiddenColumns.Add(x => x.Job.ID);
+        //HiddenColumns.Add(x => x.Movements);
 
-            //HiddenColumns.Add(x => x.Movements);
+        OnCustomiseEditor += CustomiseEditor;
+    }
+    protected override void DoReconfigure(FluentList<DynamicGridOption> options)
+    {
+        base.DoReconfigure(options);
+        options.AddRange(
+            DynamicGridOption.MultiSelect,
+            DynamicGridOption.FilterRows,
+            DynamicGridOption.SelectColumns
+        );
+    }
 
-            OnCustomiseEditor += CustomiseEditor;
-        }
-        protected override void DoReconfigure(FluentList<DynamicGridOption> options)
+    private bool DoStockTake(Button sender, CoreRow[] rows)
+    {
+        if (!rows.Any())
         {
-            base.DoReconfigure(options);
-            options.AddRange(
-                DynamicGridOption.MultiSelect,
-                DynamicGridOption.FilterRows,
-                DynamicGridOption.SelectColumns
-            );
+            MessageBox.Show("Please select at least one row for Stocktake!");
+            return false;
         }
 
-        private bool DoStockTake(Button sender, CoreRow[] rows)
-        {
-            if (!rows.Any())
-            {
-                MessageBox.Show("Please select at least one row for Stocktake!");
-                return false;
-            }
+        var page = new StockTakeWindow(rows);
 
-            var page = new StockTakeWindow(rows);
+        page.Show();
 
-            page.Show();
+        return true;
+    }
 
-            return true;
-        }
 
+    private bool ToggleHiddenJobs(Button sender, CoreRow[] rows)
+    {
+        bShowAll = !bShowAll;
+        UpdateButton(sender, PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), bShowAll ? "Active Only" : "Show All");
+        return true;
+    }
 
-        private bool ToggleHiddenJobs(Button sender, CoreRow[] rows)
-        {
-            bShowAll = !bShowAll;
-            UpdateButton(sender, PRSDesktop.Resources.parcel.AsBitmapImage(Color.White), bShowAll ? "Active Only" : "Show All");
-            return true;
-        }
+    protected override void Reload(Filters<StockLocation> criteria, Columns<StockLocation> columns, ref SortOrder<StockLocation>? sort, Action<CoreTable?, Exception?> action)
+    {
+        if (!bShowAll)
+            criteria.Add(new Filter<StockLocation>(x => x.Active).IsEqualTo(true));
+        base.Reload(criteria, columns, ref sort, action);
+    }
 
-        protected override void Reload(Filters<StockLocation> criteria, Columns<StockLocation> columns, ref SortOrder<StockLocation>? sort, Action<CoreTable?, Exception?> action)
+    protected override void DoValidate(StockLocation[] items, List<string> errors)
+    {
+        base.DoValidate(items, errors);
+        var bHoldings = false;
+        var bDefault = false;
+        var bTransient = false;
+        foreach (var item in items)
         {
-            if (!bShowAll)
-                criteria.Add(new Filter<StockLocation>(x => x.Active).IsEqualTo(true));
-            base.Reload(criteria, columns, ref sort, action);
+            bHoldings = bHoldings;
+            bDefault = bDefault || (item.Default && !item.Active);
+            bTransient = bTransient || (item.Default && item.Type.Equals(StockLocationType.Transient));
         }
 
-        protected override void DoValidate(StockLocation[] items, List<string> errors)
-        {
-            base.DoValidate(items, errors);
-            var bHoldings = false;
-            var bDefault = false;
-            var bTransient = false;
-            foreach (var item in items)
-            {
-                bHoldings = bHoldings;
-                bDefault = bDefault || (item.Default && !item.Active);
-                bTransient = bTransient || (item.Default && item.Type.Equals(StockLocationType.Transient));
-            }
-
-            if (bHoldings)
-                errors.Add("Non-Empty locations must always be [Active]!");
-            if (bDefault)
-                errors.Add("Default locations must always be [Active]!");
-            if (bTransient)
-                errors.Add("Default locations must always be [Permanent]!");
-        }
+        if (bHoldings)
+            errors.Add("Non-Empty locations must always be [Active]!");
+        if (bDefault)
+            errors.Add("Default locations must always be [Active]!");
+        if (bTransient)
+            errors.Add("Default locations must always be [Permanent]!");
+    }
 
-        private void CustomiseEditor(IDynamicEditorForm sender, StockLocation[]? items, DynamicGridColumn column, BaseEditor editor)
+    private void CustomiseEditor(IDynamicEditorForm sender, StockLocation[]? items, DynamicGridColumn column, BaseEditor editor)
+    {
+        if (string.Equals(column.ColumnName, "Active"))
         {
-            if (string.Equals(column.ColumnName, "Active"))
-            {
-                //var bHasHoldings = items.FirstOrDefault().Holdings != 0;
-                //editor.Editable = bHasHoldings ? Editable.Disabled : Editable.Enabled;
-                //if (bHasHoldings)
-                var item = items?.FirstOrDefault();
-                if (item is not null)
-                    item.Active = true;
-            }
+            //var bHasHoldings = items.FirstOrDefault().Holdings != 0;
+            //editor.Editable = bHasHoldings ? Editable.Disabled : Editable.Enabled;
+            //if (bHasHoldings)
+            var item = items?.FirstOrDefault();
+            if (item is not null)
+                item.Active = true;
         }
     }
 }

+ 73 - 17
prs.desktop/Panels/Products/Reservation Management/JobRequisitionReviewGrid.cs

@@ -41,6 +41,8 @@ public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
 {
     private readonly JobRequisitionReviewUserSettings FilterSettings = new JobRequisitionReviewUserSettings();
 
+    private Button ArchiveButton;
+
     public JobRequisitionReviewGrid()
     {
         FilterSettings = new UserConfiguration<JobRequisitionReviewUserSettings>().Load();
@@ -88,7 +90,11 @@ public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
         ColumnsTag = "JobRequisitionReview";
 
         FilterComponent.OnFiltersSelected += GridOnFilterSelected;
+
+        ArchiveButton = AddButton("Archive", PRSDesktop.Resources.archive.AsBitmapImage(), ArchiveButton_Clicked);
+        ArchiveButton.IsEnabled = false;
     }
+
     protected override void DoReconfigure(FluentList<DynamicGridOption> options)
     {
         base.DoReconfigure(options);
@@ -129,6 +135,16 @@ public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
         return columns;
     }
 
+    protected override void SelectItems(CoreRow[]? rows)
+    {
+        base.SelectItems(rows);
+
+        if(rows?.Any() == true)
+        {
+            ArchiveButton.IsEnabled = true;
+        }
+    }
+
     #region Action Column Buttons
 
     private bool CheckValidAction(JobRequisitionItem item)
@@ -193,32 +209,72 @@ public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
         }
     }
 
-    private void Archive_Clicked(CoreRow? row)
+    private static bool Archive(IEnumerable<JobRequisitionItem> items)
     {
-        if (row is null) return;
-
-        var item = row.ToObject<JobRequisitionItem>();
+        var itemsList = items.AsIList();
 
-        if(item.Status != JobRequisitionItemStatus.Allocated)
+        var toChange = new List<JobRequisitionItem>();
+        foreach(var item in itemsList)
         {
-            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)
+            if (item.Status != JobRequisitionItemStatus.Allocated)
             {
-                return;
+                var win = MessageWindow.New()
+                    .Message($"Requisition item for requisition {item.Requisition.Number} is not fully allocated; " +
+                    $"its current status is {item.Status}. Are you sure you wish to archive this item?")
+                    .Title("Confirm Archive")
+                    .AddYesButton("Archive");
+                if(itemsList.Count > 1)
+                {
+                    win.AddNoButton("Skip");
+                }
+                var result = win
+                    .AddCancelButton()
+                    .Display().Result;
+
+                if (result == MessageWindowResult.Cancel)
+                {
+                    return false;
+                }
+                else if(result == MessageWindowResult.Yes)
+                {
+                    toChange.Add(item);
+                }
+            }
+            else
+            {
+                toChange.Add(item);
             }
         }
+        if(toChange.Count == 0)
+        {
+            MessageWindow.ShowMessage("No items archived.", "Cancelled");
+            return false;
+        }
 
-        item.Archived = DateTime.Now;
-        item.Notes += Environment.NewLine + "Line marked as Archived by " + App.EmployeeName + " on " + DateTime.Now.ToString("dd MMM yy");
+        foreach(var item in toChange)
+        {
+            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");
+        Client.Save(toChange, "Updated From Job Requisition Review Dashboard");
 
-        Refresh(false, true);
+        return true;
+    }
+
+    private bool ArchiveButton_Clicked(Button _btn, CoreRow[] rows)
+    {
+        return Archive(rows.ToObjects<JobRequisitionItem>());
+    }
+
+    private void Archive_Clicked(CoreRow? row)
+    {
+        if (row is null) return;
+
+        if (Archive(CoreUtils.One(row.ToObject<JobRequisitionItem>())))
+        {
+            Refresh(false, true);
+        }
     }
 
     private void OrderRequired_Clicked(CoreRow? row)