Parcourir la source

Improvements to stock holding transfer buttons; fixing security and editable conditions

Kenric Nugteren il y a 11 mois
Parent
commit
a3e963634f

+ 1 - 1
prs.classes/Entities/Stock/StockMovement/StockMovement.cs

@@ -157,7 +157,7 @@ namespace Comal.Classes
         public string Notes { get; set; }
 
         [EditorSequence(13)]
-        [EnumLookupEditor(typeof(StockMovementType),Editable = Editable.Hidden)]
+        [EnumLookupEditor(typeof(StockMovementType),Editable = Editable.Hidden, Visible = Visible.Default)]
         public StockMovementType Type { get; set; }
         
         [EditorSequence(14)]

+ 5 - 16
prs.desktop/Panels/Products/Locations/StockHoldingGrid.cs

@@ -293,12 +293,7 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
     private void ReleaseAllocatedStock_Click(StockHolding holding)
     {
         var requiitems = holding.LoadRequisitionItems(true).Where(x => x.ID != Guid.Empty).ToList();
-        var win = new StockHoldingRelocationWindow(holding, requiitems)
-        {
-            ShowFrom = false,
-            IsTargetEditable = false,
-            Title = "Release Stock"
-        };
+        var win = new StockHoldingRelocationWindow(holding, requiitems, StockHoldingRelocationWindow.RelocationMode.ReleaseAllocations);
         if (win.ShowDialog() == true)
         {
             var quantities = win.GetQuantities();
@@ -337,10 +332,8 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
     
     private void RelocateItems(StockHolding holding, JobRequisitionItem[] requiitems)
     {
-        var win = new StockHoldingRelocationWindow(holding, requiitems)
+        var win = new StockHoldingRelocationWindow(holding, requiitems, StockHoldingRelocationWindow.RelocationMode.Transfer)
         {
-            IsJobEditable = true,
-            RequireChangeTarget = true,
             OriginalTarget = new StockLocation
             {
                 ID = holding.Location.ID,
@@ -352,8 +345,7 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
                 ID = holding.Job.ID,
                 JobNumber = holding.Job.JobNumber,
                 Name = holding.Job.Name
-            },
-            ShowFrom = false
+            }
         };
         if (win.ShowDialog() == true)
         {
@@ -521,16 +513,13 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
     {
         var updates = new List<StockMovement>();
 
-        var win = new StockHoldingRelocationWindow(holding, requiitems)
+        var win = new StockHoldingRelocationWindow(holding, requiitems, StockHoldingRelocationWindow.RelocationMode.Issue)
         {
-            IsTargetEditable = false,
-            IsJobEditable = true,
             OriginalJob = new Job
             {
                 ID = holding.Job.ID,
                 JobNumber = holding.Job.JobNumber
-            },
-            Title = "Issue Items"
+            }
         };
         if (win.ShowDialog() == true)
         {

+ 69 - 15
prs.desktop/Panels/Products/Locations/StockHoldingRelocationWindow.xaml.cs

@@ -3,6 +3,7 @@ using InABox.Clients;
 using InABox.Core;
 using InABox.DynamicGrid;
 using Microsoft.CodeAnalysis.VisualBasic.Syntax;
+using Org.BouncyCastle.Asn1.Mozilla;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
@@ -30,6 +31,25 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
 {
     public StockHolding From { get; private init; }
 
+    public enum RelocationMode
+    {
+        Issue,
+        Transfer,
+        ReleaseAllocations
+    }
+
+    private RelocationMode _mode;
+    public RelocationMode Mode
+    {
+        get => _mode;
+        set
+        {
+            _mode = value;
+
+            UpdateMode();
+        }
+    }
+
     public bool ShowHeader => ShowFrom || IsTargetEditable || IsJobEditable;
 
     private bool _showFrom = true;
@@ -102,23 +122,10 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
             OnPropertyChanged($"{nameof(Job)}.{nameof(Job.JobNumber)}");
             OnPropertyChanged($"{nameof(Job)}.{nameof(Job.Name)}");
 
-            var jobID = value?.ID ?? Guid.Empty;
-            foreach(var item in Grid.Items)
-            {
-                if(item.JRI.ID != Guid.Empty && item.JRI.Job.ID != jobID)
-                {
-                    item.Editable = false;
-                    item.Issued = 0;
-                }
-                else
-                {
-                    item.Editable = true;
-                }
-            }
+            UpdateMode();
         }
     }
 
-
     private StockLocation? _to;
     public StockLocation? To
     {
@@ -134,6 +141,9 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
     }
 
     private bool _requireChangeTarget = false;
+    /// <summary>
+    /// Require that the target location be changed before allowing the "Save" button to be clicked.
+    /// </summary>
     public bool RequireChangeTarget
     {
         get => _requireChangeTarget;
@@ -177,7 +187,7 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
         }
     }
 
-    public StockHoldingRelocationWindow(StockHolding from, IEnumerable<JobRequisitionItem> items)
+    public StockHoldingRelocationWindow(StockHolding from, IEnumerable<JobRequisitionItem> items, RelocationMode mode)
     {
         Client.EnsureColumns(from, Columns.None<StockHolding>().Add(x => x.Location.Code));
 
@@ -186,6 +196,50 @@ public partial class StockHoldingRelocationWindow : Window, INotifyPropertyChang
         InitializeComponent();
 
         SetRequisitionItems(items);
+        Mode = mode;
+    }
+
+    private void UpdateMode()
+    {
+        if(Mode == RelocationMode.Issue)
+        {
+            var jobID = Job?.ID ?? Guid.Empty;
+            foreach(var item in Grid.Items)
+            {
+                if(item.JRI.ID != Guid.Empty && item.JRI.Job.ID != jobID)
+                {
+                    item.Editable = false;
+                    item.Issued = 0;
+                }
+                else
+                {
+                    item.Editable = true;
+                }
+            }
+            Title = "Issue Items";
+            IsJobEditable = true;
+            IsTargetEditable = false;
+            ShowFrom = true;
+        }
+        else if(Mode == RelocationMode.Transfer)
+        {
+            foreach(var item in Grid.Items)
+            {
+                item.Editable = item.JRI.ID == Guid.Empty || Security.IsAllowed<CanEditAllocatedJobRequisitions>();
+            }
+            IsJobEditable = true;
+            IsTargetEditable = true;
+            ShowFrom = false;
+            RequireChangeTarget = true;
+            Title = "Transfer Stock";
+        }
+        else if(Mode == RelocationMode.ReleaseAllocations)
+        {
+            ShowFrom = false;
+            IsTargetEditable = false;
+            IsJobEditable = false;
+            Title = "Release Stock";
+        }
     }
 
     private void Grid_PropertyChanged(object sender, PropertyChangedEventArgs e)

+ 20 - 0
prs.desktop/Panels/Reservation Management/ReservationManagementPanel.xaml.cs

@@ -138,6 +138,8 @@ public partial class ReservationManagementPanel : UserControl, IPanel<JobRequisi
         ProductSetupActions.Standard(host);
         host.CreateSetupAction(new PanelAction() { Caption = "Reservation Management Settings", Image = PRSDesktop.Resources.specifications, OnExecute = ConfigSettingsClick });
 
+        host.CreatePanelAction(new PanelAction("Treatment PO", PRSDesktop.Resources.purchase, TreatmentPO_Click));
+
         if(Mode == PanelMode.Purchase && SplitPanel.IsDetailVisible())
         {
             var sectionName = SupplierPurchaseOrderPanel.SectionName;
@@ -335,6 +337,24 @@ public partial class ReservationManagementPanel : UserControl, IPanel<JobRequisi
         SelectNewPurchaseOrder();
     }
 
+    private void TreatmentPO_Click(PanelAction action)
+    {
+        var jris = JobRequiItems.SelectedRows.ToArray<JobRequisitionItem>();
+        if(jris.Length == 0)
+        {
+            MessageWindow.ShowMessage("Please select at least one job requisition item.", "No items selected");
+            return;
+        }
+        foreach(var jri in jris)
+        {
+            if(jri.TreatmentRequired - jri.TreatmentOnOrder <= 0)
+            {
+                MessageWindow.ShowMessage("Please select only items requiring treatment.", "Already treated");
+                return;
+            }
+        }
+    }
+
     private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
     {
         JobRequiItems.Reconfigure();

+ 6 - 0
prs.shared/Editors/Dimensions/DimensionsEditorControl.cs

@@ -208,6 +208,12 @@ namespace PRS.Shared
         {
             // Don't trigger value changed if invisible, this will have been handled by the SelectionChanged event handler.
             if (d is not DoubleTextBox box || !IsBoxVisible(box)) return;
+
+            if(((double?)e.OldValue ?? default(double)) == ((double?)e.NewValue ?? default(double)))
+            {
+                return;
+            }
+
             CheckChanged();
         }