Explorar o código

Re-Applying changes after dodgy merge

frogsoftware hai 1 ano
pai
achega
5a8ed83d85

+ 50 - 12
prs.classes/Entities/Product/Instance/ProductInstance.cs

@@ -1,31 +1,69 @@
 using InABox.Core;
 using System;
 using System.Collections.Generic;
+using System.Linq.Expressions;
 using System.Text;
 
 namespace Comal.Classes
 {
-    public class ProductInstance : DimensionedEntity<ProductDimensions>, ILicense<ProductManagementLicense>, IRemotable, IPersistent, IProductInstance, ISequenceable
+
+    public class ProductInstanceFreeStockAggregate : CoreAggregate<ProductInstance, StockMovement, double>
+    {
+        public override Expression<Func<StockMovement, double>> Aggregate => x => x.Qty;
+
+        public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.Job).NotLinkValid();
+
+        public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<ProductInstance, object>>>
+            Links =>
+            new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<ProductInstance, object>>>()
+            {
+                { StockMovement => StockMovement.Product.ID, Instance => Instance.Product.ID },
+                { StockMovement => StockMovement.Style.ID, Instance => Instance.Style.ID },
+                { StockMovement => StockMovement.Dimensions.UnitSize, Instance => Instance.Dimensions.UnitSize },
+            };
+
+        public override AggregateCalculation Calculation => AggregateCalculation.Sum;
+    }
+
+    public class ProductInstance : DimensionedEntity<StockDimensions>, IRemotable, IPersistent, IProductInstance,
+        ISequenceable
     {
-        
-        [NullEditor]
-        public long Sequence { get; set; }
-        
-        [NullEditor]
-        public ProductLink Product { get; set; }
-
-        [EditorSequence(1)]
+
+        [NullEditor] public long Sequence { get; set; }
+
+        [NullEditor] public ProductLink Product { get; set; }
+
+        [EditorSequence(1)] 
         public ProductStyleLink Style { get; set; }
 
         [EditorSequence(2)]
         [RequiredColumn]
-        [DimensionsEditor(typeof(ProductDimensions))]
-        public override ProductDimensions Dimensions { get; set; }
+        [DimensionsEditor(typeof(StockDimensions), AllowEditingUnit = false)]
+        public override StockDimensions Dimensions { get; set; }
 
         [IntegerEditor]
         [EditorSequence(3)]
+        [LoggableProperty]
         public int MinimumStockLevel { get; set; }
 
+        [Aggregate(typeof(ProductInstanceFreeStockAggregate))]
+        [DoubleEditor(Editable = Editable.Hidden)]
+        public double FreeStock { get; set; }
+
+        [CurrencyEditor(Visible = Visible.Optional)]
+        [EditorSequence(5)]
+        [LoggableProperty]
+        public double NettCost { get; set; }
+
+        [CurrencyEditor(Visible = Visible.Optional)]
+        [EditorSequence(4)]
+        [LoggableProperty]
+        public double AverageCost { get; set; }
+
+        [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Disabled)]
+        [EditorSequence(5)]
+        [LoggableProperty]
+        public double LastCost { get; set; }
 
     }
-}
+}

+ 23 - 25
prs.classes/Entities/PurchaseOrder/PurchaseOrderItem.cs

@@ -175,12 +175,9 @@ namespace Comal.Classes
 
         static PurchaseOrderItem()
         {
-
             LinkedProperties.Register<PurchaseOrderItem, ProductLink, String>(x => x.Product, x => x.Code, x => x.SupplierCode);
             LinkedProperties.Register<PurchaseOrderItem, ProductLink, String>(x => x.Product, x => x.Name, x => x.Description);
-            LinkedProperties.Register<PurchaseOrderItem, ProductLink, double>(x => x.Product, x => x.NettCost,
-                x => x.Cost);
-
+            
             LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, Guid>(x => x.Product.TaxCode, x => x.ID, x => x.TaxCode.ID);
             LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, String>(x => x.Product.TaxCode, x => x.Code,
                 x => x.TaxCode.Code);
@@ -188,28 +185,22 @@ namespace Comal.Classes
                 x => x.TaxCode.Description);
             LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, double>(x => x.Product.TaxCode, x => x.Rate,
                 x => x.TaxCode.Rate);
-            LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, double>(x => x.Product.TaxCode, x => x.Rate, x => x.TaxCode.Rate);
-
-            LinkedProperties.Register<PurchaseOrderItem, PurchaseGLCodeLink, Guid>(x => x.Product.PurchaseGL, x => x.ID, x => x.PurchaseGL.ID);
+            LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, double>(x => x.TaxCode, x => x.Rate, x => x.TaxRate);
             
+            LinkedProperties.Register<PurchaseOrderItem, PurchaseGLCodeLink, Guid>(x => x.Product.PurchaseGL, x => x.ID, x => x.PurchaseGL.ID);
             LinkedProperties.Register<PurchaseOrderItem, CostCentreLink, Guid>(x => x.Product.CostCentre, x => x.ID, x => x.CostCentre.ID);
             
             LinkedProperties.Register<PurchaseOrderItem, ProductStyleLink, Guid>(x => x.Product.DefaultInstance.Style, x => x.ID, x => x.Style.ID);
             LinkedProperties.Register<PurchaseOrderItem, ProductStyleLink, String>(x => x.Product.DefaultInstance.Style, x => x.Code, x => x.Style.Code);
             LinkedProperties.Register<PurchaseOrderItem, ProductStyleLink, String>(x => x.Product.DefaultInstance.Style, x => x.Description, x => x.Style.Description);
 
-            StockEntity.LinkStockDimensions<PurchaseOrderItem>();
+            LinkedProperties.Register<PurchaseOrderItem, ProductInstanceLink, double>(x => x.Product.DefaultInstance, x => x.NettCost,
+                x => x.Cost);
 
-            LinkedProperties.Register<PurchaseOrderItem, TaxCodeLink, double>(x => x.TaxCode, x => x.Rate, x => x.TaxRate);
+            StockEntity.LinkStockDimensions<PurchaseOrderItem>();
+            
         }
-
-        private static Column<PurchaseOrderItem> qty = new Column<PurchaseOrderItem>(x => x.Qty);
-        private static Column<PurchaseOrderItem> cost = new Column<PurchaseOrderItem>(x => x.Cost);
-        private static Column<PurchaseOrderItem> extax = new Column<PurchaseOrderItem>(x => x.ExTax);
-        private static Column<PurchaseOrderItem> inctax = new Column<PurchaseOrderItem>(x => x.IncTax);
-        private static Column<PurchaseOrderItem> balance = new Column<PurchaseOrderItem>(x => x.Balance);
-        private static Column<PurchaseOrderItem> received = new Column<PurchaseOrderItem>(x => x.ReceivedDate);
-
+        
         private bool bChanging;
 
         protected override void DoPropertyChanged(string name, object? before, object? after)
@@ -221,17 +212,24 @@ namespace Comal.Classes
             {
                 bChanging = true;
 
-                if (qty.IsEqualTo(name))
-                    ExTax = (double)after /* * Dimensions.Value */ * Cost;
+                if (name.Equals(nameof(Qty)) && after is double qty)
+                    ExTax = qty * Cost;
 
-                else if (cost.IsEqualTo(name))
-                    ExTax = Qty /* * Dimensions.Value */ * (double)after;
+                else if (name.Equals(nameof(Cost)) && after is double cost)
+                    ExTax = Qty * cost;
+                
+                else if (name.Equals(nameof(ExTax)) && after is double extax)
+                {
+                    if (Qty == 0)
+                        Qty = 1;
+                    Cost = extax / Qty;
+                }
 
-                else if (inctax.IsEqualTo(name))
-                    Balance = ReceivedDate.IsEmpty() ? (double)after : 0.00F;
+                else if (name.Equals(nameof(IncTax)) && after is double inctax)
+                    Balance = ReceivedDate.IsEmpty() ? inctax : 0.00F;
 
-                else if (received.IsEqualTo(name))
-                    Balance = ((DateTime)after).IsEmpty() ? IncTax : 0.00F;
+                else if (name.Equals(nameof(ReceivedDate)) && after is DateTime received)
+                    Balance = received.IsEmpty() ? IncTax : 0.00F;
             }
             finally
             {

+ 16 - 0
prs.desktop/Panels/Jobs/JobBillOfMaterialsItemsGrid.cs

@@ -104,6 +104,7 @@ namespace PRSDesktop
                 JobBillOfMaterialsItem BOMitem = row.ToObject<JobBillOfMaterialsItem>();
                 JobRequisitionItem requiItem = new JobRequisitionItem();
                 requiItem.Qty = BOMitem.Quantity;
+                requiItem.UnitCost = BOMitem.UnitCost;
                 requiItem.Product.ID = BOMitem.Product.ID;
                 requiItem.Product.Code = BOMitem.Product.Code;
                 requiItem.Product.Name = BOMitem.Product.Name;
@@ -116,6 +117,7 @@ namespace PRSDesktop
                 requiItem.Dimensions.CopyFrom(BOMitem.Dimensions);
                 requiItem.Job.ID = BillOfMaterials.Job.ID;
                 requiItem.Job.Synchronise(BillOfMaterials.Job);
+                requiItem.Supplier.ID = BOMitem.Supplier.ID;
                 requiItem.Notes = "Create from BOM " + BOMitem.BillOfMaterials.Description + " on " + DateTime.Now.ToString("hh:mm t dd-MMM-yy") + " by " + empName;
                 requiItems.Add(requiItem);
             }
@@ -143,6 +145,7 @@ namespace PRSDesktop
             result.BillOfMaterials.Synchronise(BillOfMaterials);
             result.Job.ID = BillOfMaterials.Job.ID;
             result.Job.Synchronise(BillOfMaterials.Job);
+            result.Quantity = 1;
             return result;
         }
 
@@ -153,6 +156,19 @@ namespace PRSDesktop
             base.Reload(criteria, columns, ref sort, action);
         }
 
+
+        protected override void OnAfterEditorValueChanged(DynamicEditorGrid grid, JobBillOfMaterialsItem[] items, AfterEditorValueChangedArgs args, Dictionary<string, object?> changes)
+        {
+            base.OnAfterEditorValueChanged(grid, items, args, changes);
+            if (args.ColumnName.Equals("Product.ID") || args.ColumnName.Equals("Dimensions") || args.ColumnName.StartsWith("Dimensions.") || args.ColumnName.Equals("Style.ID") || args.ColumnName.Equals("Supplier.ID"))
+            {
+                JobBillOfMaterialsItem.UpdateCosts(
+                    items, 
+                    changes
+                );
+            }
+        }
+
         #region Create PO
         private void GetEmpID()
         {

+ 13 - 0
prs.desktop/Panels/Jobs/JobRequisitionItemGrid.cs

@@ -149,8 +149,21 @@ namespace PRSDesktop
             result.Requisition.Synchronise(Requisition);
             result.Job.ID = Requisition.Job.ID;
             result.Job.Synchronise(Requisition.Job);
+            result.Qty = 1;
             return result;
         }
+        
+        protected override void OnAfterEditorValueChanged(DynamicEditorGrid grid, JobRequisitionItem[] items, AfterEditorValueChangedArgs args, Dictionary<string, object?> changes)
+        {
+            base.OnAfterEditorValueChanged(grid, items, args, changes);
+            if (args.ColumnName.Equals("Product.ID") || args.ColumnName.Equals("Dimensions") || args.ColumnName.StartsWith("Dimensions.") || args.ColumnName.Equals("Style.ID") || args.ColumnName.Equals("Supplier.ID"))
+            {
+                JobRequisitionItem.UpdateCosts(
+                    items, 
+                    changes
+                );
+            }
+        }
 
         public override DynamicGridColumns GenerateColumns()
         {