소스 검색

SupplierProduct now allows for different dimensions of the same product
Fixed Supplier pricing calculations for Purchase Order Items

Frank van den Bos 2 년 전
부모
커밋
f01c7a84cf

+ 30 - 10
prs.classes/Entities/PurchaseOrder/PurchaseOrder.cs

@@ -225,27 +225,38 @@ namespace Comal.Classes
             Category = new PurchaseOrderCategoryLink();
         }
         
-        public static void UpdateCosts(IEnumerable<PurchaseOrderItem> items, Guid supplierid, Action<String,object>? update)
+        public static void UpdateCosts(IEnumerable<PurchaseOrderItem> items, Guid supplierid, Dictionary<String,object?> changes)
         {
 
             void UpdateValue<TType>(PurchaseOrderItem item,Expression<Func<PurchaseOrderItem, TType>> property, TType value)
             {
-                String propertyname = CoreUtils.GetFullPropertyName(property, ".");
-                if (update == null)
-                    CoreUtils.SetPropertyValue(item, propertyname , value);
-                else
-                    update?.Invoke(propertyname, value);
+                CoreUtils.MonitorChanges(
+                    item, 
+                    () => CoreUtils.SetPropertyValue(item, CoreUtils.GetFullPropertyName(property, "."), value),
+                    changes
+                );
             }
             
             var productids = items.Where(x => x.Product.ID != Guid.Empty).Select(x => x.Product.ID).ToArray();
             MultiQuery query = new MultiQuery();
             query.Add(
-                new Filter<SupplierProduct>(x=>x.SupplierLink.ID).IsEqualTo(supplierid).And(x=>x.ProductLink.ID).InList(productids),
-                new Columns<SupplierProduct>(x=>x.ProductLink.ID).Add(x=>x.Job.ID).Add(x=>x.CostPrice).Add(x=>x.SupplierCode).Add(x=>x.SupplierDescription)
+                new Filter<SupplierProduct>(x=>x.SupplierLink.ID).IsEqualTo(supplierid)
+                    .And(x=>x.ProductLink.ID).InList(productids)
+                    .And(x=>x.Dimensions.UnitSize).IsEqualTo(items.First().Dimensions.UnitSize),
+                new Columns<SupplierProduct>(x=>x.ProductLink.ID)
+                    .Add(x=>x.Job.ID)
+                    .Add(x=>x.CostPrice)
+                    .Add(x=>x.SupplierCode)
+                    .Add(x=>x.SupplierDescription)
+                    .Add(x=>x.Dimensions.Value)
             );
             query.Add(
                 new Filter<Product>(x=>x.ID).InList(productids),
-                new Columns<Product>(x=>x.ID).Add(x=>x.NettCost).Add(x=>x.Code).Add(x=>x.Name)
+                new Columns<Product>(x=>x.ID)
+                    .Add(x=>x.NettCost)
+                    .Add(x=>x.Code)
+                    .Add(x=>x.Name)
+                    .Add(x=>x.Dimensions.Value)
             );
             query.Query();
                 
@@ -275,7 +286,16 @@ namespace Comal.Classes
                     {
                         UpdateValue<String>(item, x => x.SupplierCode, row.Get<Product, String>(c => c.Code));
                         UpdateValue<String>(item, x => x.Description, row.Get<Product, String>(c => c.Name));
-                        UpdateValue<double>(item, x => x.Cost, row.Get<Product, double>(c => c.NettCost));
+                        if (String.Equals(row.Get<Product,String>(c=>c.Dimensions.UnitSize),items.First().Dimensions.UnitSize))
+                            UpdateValue<double>(item, x => x.Cost, row.Get<Product, double>(c => c.NettCost));
+                        else
+                            UpdateValue<double>(item, x => x.Cost, 0.0F);
+                    }
+                    else
+                    {
+                        UpdateValue<String>(item, x => x.SupplierCode, "");
+                        UpdateValue<String>(item, x => x.Description, "");
+                        UpdateValue<double>(item, x => x.Cost, 0.0F);
                     }
                 }
 

+ 4 - 4
prs.classes/Entities/PurchaseOrder/PurchaseOrderItem.cs

@@ -223,8 +223,8 @@ namespace Comal.Classes
             {
                 String col = String.Join(".", name.Split('.').Skip(1));
                 CoreUtils.SetPropertyValue(this, col, after);
-                if (size.IsEqualTo(name))
-                    ExTax = Qty * (double)after * Cost;
+                // if (size.IsEqualTo(name))
+                //     ExTax = Qty * (double)after * Cost;
             }
             
             else if (style.IsParentOf(name))
@@ -234,10 +234,10 @@ namespace Comal.Classes
             }
             
             else if (qty.IsEqualTo(name))
-                ExTax = (double)after * Dimensions.Value * Cost;
+                ExTax = (double)after /* * Dimensions.Value */ * Cost;
 
             else if (cost.IsEqualTo(name))
-                ExTax = Qty * Dimensions.Value * (double)after;
+                ExTax = Qty /* * Dimensions.Value */ * (double)after;
             
             else if (inctax.IsEqualTo(name))
                 Balance = ReceivedDate.IsEmpty() ? (double)after : 0.00F;

+ 14 - 9
prs.classes/Entities/Supplier/SupplierProduct.cs

@@ -4,7 +4,7 @@ using InABox.Core;
 namespace Comal.Classes
 {
     [UserTracking(typeof(Product))]
-    public class SupplierProduct : Entity, IPersistent, IRemotable, ILicense<ProductManagementLicense>, IExportable, IImportable, IManyToMany<Supplier, Product>
+    public class SupplierProduct : DimensionedEntity<StockDimensions>, IPersistent, IRemotable, ILicense<ProductManagementLicense>, IExportable, IImportable, IManyToMany<Supplier, Product>
     {
         private bool bChanging;
 
@@ -13,7 +13,7 @@ namespace Comal.Classes
 
         [EditorSequence(1)]
         public ProductLink ProductLink { get; set; }
-
+        
         [EditorSequence(2)]
         public JobLink Job { get; set; }
 
@@ -24,32 +24,36 @@ namespace Comal.Classes
         [TextBoxEditor]
         [EditorSequence(4)]
         public string SupplierDescription { get; set; }
+        
+        [EditorSequence(5)]
+        [RequiredColumn]
+        public override StockDimensions Dimensions { get; set; }
 
         [TextBoxEditor]
-        [EditorSequence(5)]
+        [EditorSequence(6)]
         public string SupplierCategory { get; set; }
 
         [CurrencyEditor(Visible = Visible.Optional)]
-        [EditorSequence(6)]
+        [EditorSequence(7)]
         public double TradePrice { get; set; }
 
         [DoubleEditor(Visible = Visible.Optional)]
-        [EditorSequence(7)]
+        [EditorSequence(8)]
         public double Discount { get; set; }
 
         [CurrencyEditor(Visible = Visible.Optional)]
-        [EditorSequence(8)]
+        [EditorSequence(9)]
         public double CostPrice { get; set; }
 
-        [EditorSequence(9)]
+        [EditorSequence(10)]
         public TaxCodeLink TaxCode { get; set; }
 
         [URLEditor]
-        [EditorSequence(10)]
+        [EditorSequence(11)]
         public string URL { get; set; }
 
         [TimestampEditor]
-        [EditorSequence(11)]
+        [EditorSequence(12)]
         public DateTime Expired { get; set; }
 
         protected override void Init()
@@ -57,6 +61,7 @@ namespace Comal.Classes
             base.Init();
             SupplierLink = new SupplierLink(this);
             ProductLink = new ProductLink();
+            Dimensions = new StockDimensions();
             Job = new JobLink();
             TaxCode = new TaxCodeLink();
         }

+ 10 - 0
prs.desktop/Panels/Products/Master List/ProductSuppliersGrid.cs

@@ -59,6 +59,9 @@ namespace PRSDesktop
 
                 product.NettCost = Product.CalculateNettCost(product.PricingStrategy, product.BaseCost, product.ComponentCost);
 
+                var sp = arg2.First().ToObject<SupplierProduct>();
+                product.Dimensions.CopyFrom(sp.Dimensions,true);
+                
                 new Client<Product>().Save(product, "Updated Default Supplier");
                 OnChanged?.Invoke(this);
             }
@@ -90,6 +93,13 @@ namespace PRSDesktop
         {
             var result = base.CreateItem();
             result.ProductLink.ID = ProductID;
+            var ptbl = new Client<Product>().Query(
+                new Filter<Product>(c => c.ID).IsEqualTo(ProductID),
+                LookupFactory.RequiredColumns<Product>()
+            );
+            var product = ptbl.Rows.FirstOrDefault()?.ToObject<Product>();
+            if (product != null)
+                result.Dimensions.CopyFrom(product.Dimensions);
             return result;
         }
 

+ 11 - 9
prs.desktop/Panels/Suppliers/SupplierPurchaseOrderItemOneToMany.cs

@@ -12,23 +12,25 @@ namespace PRSDesktop
             
         }
 
-        protected override Dictionary<string, object> EditorValueChanged(DynamicEditorForm editor, PurchaseOrderItem[] items, string name,
-            object value)
+        protected override void OnAfterEditorValueChanged(DynamicEditorGrid grid, PurchaseOrderItem[] items, string columnnname, Dictionary<string, object?> changes)
         {
-            var results = base.EditorValueChanged(editor, items, name, value);
-            if (name.Equals("Product.ID") || name.Equals("Job.ID"))
+            base.OnAfterEditorValueChanged(grid, items, columnnname, changes);
+            if (columnnname.Equals("Product.ID") || columnnname.Equals("Job.ID") || columnnname.StartsWith("Dimensions."))
             {
                 PurchaseOrder.UpdateCosts(
                     items, 
                     Item.SupplierLink.ID,
-                    (n,v) => DynamicGridUtils.UpdateEditorValue(items, n, v, results)
+                    changes
                 );
             }
-            else if (name.Equals("ProductLink.TaxCode.ID"))
-            {
-                DynamicGridUtils.UpdateEditorValue(items, "TaxCode.ID", (Guid)value, results);
-            }
+        }
 
+        protected override Dictionary<string, object> EditorValueChanged(DynamicEditorForm editor, PurchaseOrderItem[] items, string name,
+            object value)
+        {
+            var results = base.EditorValueChanged(editor, items, name, value);
+            if (name.Equals("ProductLink.TaxCode.ID"))
+                DynamicGridUtils.UpdateEditorValue(items, "TaxCode.ID", (Guid)value, results);
             return results;
         }
     }

+ 11 - 9
prs.desktop/Panels/Suppliers/SupplierPurchaseOrderItems.cs

@@ -198,20 +198,22 @@ namespace PRSDesktop
             object value)
         {
             var results = base.EditorValueChanged(editor, items, name, value);
-            if (name.Equals("Product.ID") || name.Equals("Job.ID"))
+            if (name.Equals("ProductLink.TaxCode.ID"))
+                DynamicGridUtils.UpdateEditorValue(items, "TaxCode.ID", (Guid)value, results);
+            return results;
+        }
+        
+        protected override void OnAfterEditorValueChanged(DynamicEditorGrid grid, PurchaseOrderItem[] items, String name, Dictionary<String,object> changes)
+        {
+            base.OnAfterEditorValueChanged(grid, items, name, changes);
+            if (name.Equals("Product.ID") || name.Equals("Job.ID") || name.StartsWith("Dimensions."))
             {
                 PurchaseOrder.UpdateCosts(
                     items, 
-                    SupplierID, 
-                    (name,value) => DynamicGridUtils.UpdateEditorValue(items, name, value, results)
+                    SupplierID,
+                    changes
                 );
             }
-            else if (name.Equals("ProductLink.TaxCode.ID"))
-            {
-                DynamicGridUtils.UpdateEditorValue(items, "TaxCode.ID", (Guid)value, results);
-            }
-
-            return results;
         }
 
         private bool CheckPOStatus(Func<bool> basefunction)