Browse Source

Adding audit trail message for stock release functionality.

Kenric Nugteren 1 year ago
parent
commit
a53c64e470

+ 147 - 147
prs.desktop/Panels/Jobs/Stock Holdings/JobStockGrid.cs

@@ -12,177 +12,177 @@ using InABox.Wpf;
 using InABox.WPF;
 using net.sf.mpxj.MpxjUtilities;
 
-namespace PRSDesktop.Panels.Jobs
+namespace PRSDesktop.Panels.Jobs;
+
+public class JobStockGrid : DynamicDataGrid<StockHolding>, IMasterDetailControl<Job,StockHolding>, IBasePanel
 {
-    public class JobStockGrid : DynamicDataGrid<StockHolding>, IMasterDetailControl<Job,StockHolding>, IBasePanel
+    public Job? Master
     {
-        public Job? Master
+        get => _master;
+        set
         {
-            get => _master;
-            set
-            {
-                _master = value; 
-                _releaseStock.IsEnabled = value?.JobStatus.Active == false && SelectedRows?.Any() == true;
-            }
+            _master = value; 
+            _releaseStock.IsEnabled = value?.JobStatus.Active == false && SelectedRows?.Any() == true;
         }
+    }
 
-        private Button _releaseStock;
-        private Job? _master;
+    private Button _releaseStock;
+    private Job? _master;
 
-        public JobStockGrid()
-        {
-            _releaseStock = AddButton("Release Stock", PRSDesktop.Resources.archive.AsBitmapImage(), ReleaseStock);
-            HiddenColumns.Add(x => x.Location.ID);
-            HiddenColumns.Add(x => x.Product.ID);
-            HiddenColumns.Add(x => x.Style.ID);
-            HiddenColumns.Add(x=>x.Dimensions.Unit.ID);
-            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.Job.ID);
-        }
+    public JobStockGrid()
+    {
+        _releaseStock = AddButton("Release Stock", PRSDesktop.Resources.archive.AsBitmapImage(), ReleaseStock);
+        HiddenColumns.Add(x => x.Location.ID);
+        HiddenColumns.Add(x => x.Product.ID);
+        HiddenColumns.Add(x => x.Style.ID);
+        HiddenColumns.Add(x=>x.Dimensions.Unit.ID);
+        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.Job.ID);
+    }
 
-        protected override void Init()
-        {
-            base.Init();
-        }
+    protected override void Init()
+    {
+        base.Init();
+    }
 
-        protected override void SelectItems(CoreRow[]? rows)
-        {
-            base.SelectItems(rows);
-            _releaseStock.IsEnabled = Master?.JobStatus.Active == false && SelectedRows?.Any() == true;
-        }
+    protected override void SelectItems(CoreRow[]? rows)
+    {
+        base.SelectItems(rows);
+        _releaseStock.IsEnabled = Master?.JobStatus.Active == false && SelectedRows?.Any() == true;
+    }
 
 
-        private bool ReleaseStock(object sender, CoreRow[] rows)
+    private bool ReleaseStock(object sender, CoreRow[] rows)
+    {
+        if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release the selected holdings from this job.", "Confirm") != MessageWindowResult.Yes)
+            return false;
+
+        var toSave = new List<StockMovement>();
+        foreach (var row in SelectedRows)
         {
-            if(MessageWindow.ShowYesNoCancel("Are you sure you wish to do this? This will release the selected holdings from this job.", "Confirm") != MessageWindowResult.Yes)
-                return false;
+            StockHolding holding = row.ToObject<StockHolding>();
+            var movements = new Client<StockMovement>().Query(
+                    StockHolding.GetFilter(holding),
+                    new Columns<StockMovement>(x => x.Units)
+                        .Add(x => x.Location.ID)
+                        .Add(x => x.Product.ID)
+                        .Add(x => x.Style.ID)
+                        .AddDimensionsColumns(x => x.Dimensions)
+                        .Add(x => x.Cost)
+                        .Add(x => x.OrderItem.ID)
+                        .Add(x => x.JobRequisitionItem.ID))
+                .ToObjects<StockMovement>()
+                .GroupBy(x => new
+                {
+                    Location = x.Location.ID,
+                    Product = x.Product.ID,
+                    Style = x.Style.ID,
+                    x.Dimensions,
+                    x.Cost,
+                    OrderItem = x.OrderItem.ID,
+                    JobRequisitionItem = x.JobRequisitionItem.ID
+                })
+                .Select(x => new
+                    {
+                        x.Key,
+                        Units = x.Sum(x => x.Units)
+                    }
+                );
 
-            var toSave = new List<StockMovement>();
-            foreach (var row in SelectedRows)
+            foreach (var group in movements)
             {
-                StockHolding holding = row.ToObject<StockHolding>();
-                var movements = new Client<StockMovement>().Query(
-                        StockHolding.GetFilter(holding),
-                        new Columns<StockMovement>(x => x.Units)
-                            .Add(x => x.Location.ID)
-                            .Add(x => x.Product.ID)
-                            .Add(x => x.Style.ID)
-                            .AddDimensionsColumns(x => x.Dimensions)
-                            .Add(x => x.Cost)
-                            .Add(x => x.OrderItem.ID)
-                            .Add(x => x.JobRequisitionItem.ID))
-                    .ToObjects<StockMovement>()
-                    .GroupBy(x => new
-                    {
-                        Location = x.Location.ID,
-                        Product = x.Product.ID,
-                        Style = x.Style.ID,
-                        x.Dimensions,
-                        x.Cost,
-                        OrderItem = x.OrderItem.ID,
-                        JobRequisitionItem = x.JobRequisitionItem.ID
-                    })
-                    .Select(x => new
-                        {
-                            x.Key,
-                            Units = x.Sum(x => x.Units)
-                        }
-                    );
-
-                foreach (var group in movements)
-                {
 
-                    var from = holding.CreateMovement();
-                    from.OrderItem.ID = group.Key.OrderItem;
-                    from.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
-                    from.Cost = group.Key.Cost;
-                    from.Type = StockMovementType.TransferOut;
-                    from.Job.ID = Master.ID;
-                    from.Issued = group.Units;
-
-                    var to = holding.CreateMovement();
-                    to.Cost = group.Key.Cost;
-                    to.OrderItem.ID = group.Key.OrderItem;
-                    to.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
-                    to.Type = StockMovementType.TransferIn;
-                    to.Transaction = from.Transaction;
-                    to.Units = group.Units;
-
-                    toSave.Add(from);
-                    toSave.Add(to);
-                }
+                var from = holding.CreateMovement();
+                from.OrderItem.ID = group.Key.OrderItem;
+                from.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
+                from.Cost = group.Key.Cost;
+                from.Type = StockMovementType.TransferOut;
+                from.Job.ID = Master.ID;
+                from.Issued = group.Units;
+
+                var to = holding.CreateMovement();
+                to.Cost = group.Key.Cost;
+                to.OrderItem.ID = group.Key.OrderItem;
+                to.JobRequisitionItem.ID = group.Key.JobRequisitionItem;
+                to.Type = StockMovementType.TransferIn;
+                to.Transaction = from.Transaction;
+                to.Units = group.Units;
+                to.Notes = $"Released from job {Master.JobNumber}";
+
+                toSave.Add(from);
+                toSave.Add(to);
             }
+        }
 
-            new Client<StockMovement>().Save(toSave, "Released job stock.");
-            Refresh(false,true);
-            MessageWindow.ShowMessage("All job stock reserves released.", "Success");
+        Client.Save(toSave, $"Stock Released from {Master.JobNumber}");
+        Refresh(false,true);
+        MessageWindow.ShowMessage("All job stock reserves released.", "Success");
 
-            return true;
-        }
+        return true;
+    }
 
-        public Filter<StockHolding> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
-            ? new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master.ID)
-            : new Filter<StockHolding>().None();
-        
-        protected override void DoReconfigure(FluentList<DynamicGridOption> options)
-        {
-            base.DoReconfigure(options);
-            options
-                .BeginUpdate()
-                .Clear()
-                .Add(DynamicGridOption.FilterRows)
-                .Add(DynamicGridOption.RecordCount)
-                .Add(DynamicGridOption.SelectColumns)
-                .Add(DynamicGridOption.ExportData)
-                .EndUpdate();
-        }
-        
-        protected override void Reload(Filters<StockHolding> criteria, Columns<StockHolding> columns, ref SortOrder<StockHolding>? sort, Action<CoreTable?, Exception?> action)
-        {
-            criteria.Add(MasterDetailFilter);
-            base.Reload(criteria, columns, ref sort, action);
-        }
+    public Filter<StockHolding> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
+        ? new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master.ID)
+        : new Filter<StockHolding>().None();
+    
+    protected override void DoReconfigure(FluentList<DynamicGridOption> options)
+    {
+        base.DoReconfigure(options);
+        options
+            .BeginUpdate()
+            .Clear()
+            .Add(DynamicGridOption.FilterRows)
+            .Add(DynamicGridOption.RecordCount)
+            .Add(DynamicGridOption.SelectColumns)
+            .Add(DynamicGridOption.ExportData)
+            .EndUpdate();
+    }
+    
+    protected override void Reload(Filters<StockHolding> criteria, Columns<StockHolding> columns, ref SortOrder<StockHolding>? sort, Action<CoreTable?, Exception?> action)
+    {
+        criteria.Add(MasterDetailFilter);
+        base.Reload(criteria, columns, ref sort, action);
+    }
 
-        public void Setup()
-        {
-            Refresh(true,false);
-        }
+    public void Setup()
+    {
+        Refresh(true,false);
+    }
 
-        public void Shutdown(CancelEventArgs? cancel)
-        {
-            
-        }
+    public void Shutdown(CancelEventArgs? cancel)
+    {
+        
+    }
 
-        public void Refresh()
-        {
-            Refresh(false,true);
-        }
+    public void Refresh()
+    {
+        Refresh(false,true);
+    }
 
-        public string SectionName => "Stock Holdings";
-        public DataModel DataModel(Selection selection)
-        {
-            return new AutoDataModel<StockHolding>(
-                new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master?.ID ?? CoreUtils.FullGuid));
-        }
+    public string SectionName => "Stock Holdings";
+    public DataModel DataModel(Selection selection)
+    {
+        return new AutoDataModel<StockHolding>(
+            new Filter<StockHolding>(x => x.Job.ID).IsEqualTo(Master?.ID ?? CoreUtils.FullGuid));
+    }
 
-        public event DataModelUpdateEvent? OnUpdateDataModel;
-        public bool IsReady { get; set; }
-        public void CreateToolbarButtons(IPanelHost host)
-        {
-        }
+    public event DataModelUpdateEvent? OnUpdateDataModel;
+    public bool IsReady { get; set; }
+    public void CreateToolbarButtons(IPanelHost host)
+    {
+    }
 
-        public Dictionary<string, object[]> Selected()
-        {
-            return new Dictionary<string, object[]>();
-        }
+    public Dictionary<string, object[]> Selected()
+    {
+        return new Dictionary<string, object[]>();
+    }
 
-        public void Heartbeat(TimeSpan time)
-        {
-            
-        }
+    public void Heartbeat(TimeSpan time)
+    {
+        
     }
 }

+ 5 - 4
prs.desktop/Panels/Jobs/Summary/JobSummaryGrid.cs

@@ -97,9 +97,9 @@ internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IMasterDetailContr
         Progress.ShowModal("Loading Holdings", progress =>
         {
             var holdings = GetHoldings(rows);
-            foreach (var holding in holdings.Keys)
+            foreach (var (holding, items) in holdings)
             {
-                foreach (var item in holdings[holding])
+                foreach (var item in items)
                 {
                     var from = holding.CreateMovement();
                     //from.OrderItem.ID = group.Key.OrderItem;
@@ -117,6 +117,7 @@ internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IMasterDetailContr
                     to.Type = StockMovementType.TransferIn;
                     to.Transaction = from.Transaction;
                     to.Received = item.Qty;
+                    to.Notes = $"Released from job {Master.JobNumber}";
 
                     updates.Add(from);
                     updates.Add(to);
@@ -124,7 +125,7 @@ internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IMasterDetailContr
             }
             progress.Report("Saving Movements");
             if (updates.Any())
-                Client.Save(updates, "Stock Released from Job Summary Screen");
+                Client.Save(updates, $"Stock Released from {Master.JobNumber} on Job Summary Screen");
         });
         MessageWindow.ShowMessage("The selected stock holdings have been cancelled.","Done");
 
@@ -158,7 +159,7 @@ internal class JobSummaryGrid : DynamicDataGrid<JobMaterial>, IMasterDetailContr
                 }
 
                 progress.Report("Cancelling Requisitions");
-                Client.Save(updates, "Requsition cancelled from Job Summary Screen");
+                Client.Save(updates, $"Requsition cancelled for {Master.JobNumber} from Job Summary Screen");
             }
         });
         MessageWindow.ShowMessage("The selected requisitions have been cancelled.","Done");