Prechádzať zdrojové kódy

Added Adjust Value option to Stock Grids

frogsoftware 11 mesiacov pred
rodič
commit
6d7efd27c0

+ 44 - 0
prs.classes/Entities/Stock/StockHolding/StockHolding.cs

@@ -148,6 +148,7 @@ namespace Comal.Classes
         public static StockMovement CreateMovement(this IStockHolding holding)
         {
             var movement = new StockMovement();
+            movement.Date = DateTime.Now;
             movement.Job.ID = holding.Job.ID;
             movement.Job.Synchronise(holding.Job);
             movement.Product.ID = holding.Product.ID;
@@ -239,6 +240,49 @@ namespace Comal.Classes
             return items;
         }
 
+        public static IEnumerable<StockMovement> AdjustValue(this StockHolding holding, double unitvalue, StockMovementBatch batch)
+        {
+            List<StockMovement> _result = new List<StockMovement>();
+            var movements = Client.Query(
+                new Filter<StockMovement>(x => x.Location.ID).IsEqualTo(holding.Location.ID)
+                    .And(x => x.Style.ID).IsEqualTo(holding.Style.ID)
+                    .And(x => x.Dimensions).DimensionEquals(holding.Dimensions)
+                    .And(x => x.Job.ID).IsEqualTo(holding.Job.ID),
+                Columns.Required<StockMovement>().Add(x=>x.Units)
+            ).Rows.ToObjects<StockMovement>().ToArray();
+            var _allocations = movements.GroupBy(x => x.JobRequisitionItem.ID);
+            foreach (var _allocation in _allocations)
+            {
+                var _units = _allocation.Sum(x => x.Units);
+                if (!_units.IsEffectivelyEqual(0.0))
+                {
+                    var _transout = holding.CreateMovement();
+                    _transout.Employee.ID = batch.Employee.ID;
+                    _transout.Issued = _units;
+                    _transout.Cost = holding.AverageValue;
+                    _transout.Type = StockMovementType.TransferOut;
+                    _transout.JobRequisitionItem.ID = _allocation.Key;
+                    _transout.Batch.ID = batch.ID;
+                    _transout.Notes = $"Adjusting Average Value from ${holding.AverageValue:F2} to ${unitvalue:F2}";
+                    _result.Add(_transout);
+
+                    var _transin = holding.CreateMovement();
+                    _transin.Date = _transout.Date.AddTicks(1);
+                    _transout.Employee.ID = batch.Employee.ID;
+                    _transin.Received = _units;
+                    _transin.Cost = unitvalue;
+                    _transin.Type = StockMovementType.TransferIn;
+                    _transin.Transaction = _transout.Transaction;
+                    _transin.JobRequisitionItem.ID = _allocation.Key;
+                    _transin.Batch.ID = batch.ID;
+                    _transin.Notes = $"Adjusting Average Value from ${holding.AverageValue:F2} to ${unitvalue:F2}";
+                    _result.Add(_transin);
+                }
+            }
+
+            return _result;
+        }
+        
     //     public static IEnumerable<Tuple<Guid,double>> GetAllocations(this StockHolding holding, bool alwaysshowunallocated)
     //     {
     //         var table = new Client<StockMovement>().Query(

+ 52 - 2
prs.desktop/Panels/Products/Locations/StockHoldingGrid.cs

@@ -27,9 +27,7 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
     }
     private MovementAction _action;
     private StockHolding? _holding;
-
     
-
     private Button IssueButton;
 
     private Button ReceiveButton;
@@ -42,6 +40,8 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
     
     private Button RecalculateButton;
 
+    private Button AdjustValueButton;
+
     public StockHoldingGrid() : base()
     {         
         ColumnsTag = "StockHolding";
@@ -66,6 +66,10 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
         TransferButton.Margin = new Thickness(20, TransferButton.Margin.Top, TransferButton.Margin.Right, TransferButton.Margin.Bottom);
         TransferButton.IsEnabled = false;
 
+        AdjustValueButton = AddButton("Adjust Value", PRSDesktop.Resources.receipt.AsBitmapImage(), AdjustValues,
+            DynamicGridButtonPosition.Right);
+        AdjustValueButton.Margin = new Thickness(AdjustValueButton.Margin.Left, AdjustValueButton.Margin.Top, 10, AdjustValueButton.Margin.Bottom);
+        
         RecalculateButton = AddButton("Recalculate", PRSDesktop.Resources.service.AsBitmapImage(), RecalculateHoldings,
             DynamicGridButtonPosition.Right);
 
@@ -101,6 +105,46 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
         ActionColumns.Add(new DynamicMenuColumn(BuildMenu) { Position = DynamicActionColumnPosition.End });
     }
 
+    private bool AdjustValues(Button arg1, CoreRow[] rows)
+    {
+        if (rows?.Any() != true)
+            return false;
+        
+        double _newvalue = 0.0;
+        if (DoubleEdit.Execute("New Average Value", 0, double.MaxValue, ref _newvalue))
+        {
+            Progress.ShowModal("Creating Batch", progress =>
+            {
+                StockMovementBatch _batch = new StockMovementBatch()
+                {
+                    Type = StockMovementBatchType.Transfer,
+                    Employee = new EmployeeLink() { ID = App.EmployeeID },
+                    Notes = "Stock Value Adjustment"
+                };
+                Client.Save(_batch,"Stock value adjusted from holding grid");
+                
+                progress.Report("Creating Movements");
+                List<StockMovement> _updates = new List<StockMovement>();
+                foreach (var _row in rows)
+                {
+                    var _holding = _row.ToObject<StockHolding>();
+                    _holding.AverageValue = _newvalue;
+                    _holding.Value = _newvalue * _holding.Units;
+                    Client.Save(_holding,"Stock value adjusted from holding grid");
+                    _updates.AddRange(_holding.AdjustValue(_newvalue, _batch));
+                }
+                
+                progress.Report("Saving Movements");
+                Client.Save(_updates,"Stock value adjusted from holding grid");
+            });
+            MessageBox.Show("All Done");
+            return true;
+        }
+
+        return false;
+    }
+
+    
     private bool RecalculateHoldings(Button arg1, CoreRow[] arg2)
     {
         Dictionary<String, int> messages = new();
@@ -630,6 +674,12 @@ public class StockHoldingGrid : DynamicDataGrid<StockHolding>
         ReceiveButton.IsEnabled = Location != null && Location.ID != Guid.Empty;
         IssueButton.IsEnabled = Location != null && Location.ID != Guid.Empty && rows?.Any() == true;
         TransferButton.IsEnabled = Location != null && Location.ID != Guid.Empty && rows?.Any() == true;
+        var _groups = rows?.GroupBy(x => new Tuple<Guid, double>(
+            x.Get<StockHolding, Guid>(c => c.Product.ID),
+            x.Get<StockHolding, double>(c => c.Dimensions.Value))
+        );
+        AdjustValueButton.IsEnabled = Location != null && Location.ID != Guid.Empty && _groups?.Count() == 1;
+        RecalculateButton.IsEnabled = Location != null && Location.ID != Guid.Empty;
     }
 
     private DynamicDataGrid<StockMovement> CheckStockMovementGrid(MovementAction action, StockHolding holding)