| 
					
				 | 
			
			
				@@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |