Browse Source

Fixed Job Scope Labour and Materials Calculations

frogsoftware 2 weeks ago
parent
commit
99c4a3acd2

+ 54 - 18
prs.classes/Entities/Job/JobScopes/JobScope.cs

@@ -190,11 +190,20 @@ namespace Comal.Classes
         
         private class MaterialsMarginFormula : ComplexFormulaGenerator<JobScope, double>
         {
-            public override IComplexFormulaNode<JobScope, double> GetFormula()
-                => Formula(FormulaOperator.Divide,
-                    Formula(FormulaOperator.Subtract, Property(x => x.MaterialsSell), Property(x => x.MaterialsCost)),
-                        Property(x => x.MaterialsSell)
-                    );
+            public override IComplexFormulaNode<JobScope, double> GetFormula() => 
+                Formula(
+                    FormulaOperator.Divide, 
+                    Formula(
+                        FormulaOperator.Multiply, 
+                        Formula(
+                            FormulaOperator.Subtract, 
+                            Property(x=>x.MaterialsSell), 
+                            Property(c => c.MaterialsCost)
+                        ), 
+                        Constant(100.0F)
+                    ),  
+                    Property(c=>c.MaterialsSell)
+                );
         }
         
         [ComplexFormula(typeof(MaterialsMarginFormula))]
@@ -204,10 +213,19 @@ namespace Comal.Classes
         
         private class MaterialsMarkupFormula : ComplexFormulaGenerator<JobScope, double>
         {
-            public override IComplexFormulaNode<JobScope, double> GetFormula()
-                => Formula(FormulaOperator.Divide,
-                    Formula(FormulaOperator.Subtract, Property(x => x.MaterialsSell), Property(x => x.MaterialsCost)),
-                    Property(x => x.MaterialsCost)
+            public override IComplexFormulaNode<JobScope, double> GetFormula() => 
+                Formula(
+                    FormulaOperator.Divide, 
+                    Formula(
+                        FormulaOperator.Multiply, 
+                        Formula(
+                            FormulaOperator.Subtract, 
+                            Property(x=>x.MaterialsSell), 
+                            Property(c => c.MaterialsCost)
+                        ), 
+                        Constant(100.0F)
+                    ),  
+                    Property(c=>c.MaterialsCost)
                 );
         }
         
@@ -242,11 +260,20 @@ namespace Comal.Classes
         
         private class LabourMarginFormula : ComplexFormulaGenerator<JobScope, double>
         {
-            public override IComplexFormulaNode<JobScope, double> GetFormula()
-                => Formula(FormulaOperator.Divide,
-                    Formula(FormulaOperator.Subtract, Property(x => x.LabourSell), Property(x => x.LabourCost)),
-                        Property(x => x.LabourSell)
-                    );
+            public override IComplexFormulaNode<JobScope, double> GetFormula() => 
+                Formula(
+                    FormulaOperator.Divide, 
+                    Formula(
+                        FormulaOperator.Multiply, 
+                        Formula(
+                            FormulaOperator.Subtract, 
+                            Property(x=>x.LabourSell), 
+                            Property(c => c.LabourCost)
+                        ), 
+                        Constant(100.0F)
+                    ),  
+                    Property(c=>c.LabourSell)
+                );
         }
         
         [ComplexFormula(typeof(LabourMarginFormula))]
@@ -256,10 +283,19 @@ namespace Comal.Classes
         
         private class LabourMarkupFormula : ComplexFormulaGenerator<JobScope, double>
         {
-            public override IComplexFormulaNode<JobScope, double> GetFormula()
-                => Formula(FormulaOperator.Divide,
-                    Formula(FormulaOperator.Subtract, Property(x => x.LabourSell), Property(x => x.LabourCost)),
-                    Property(x => x.LabourCost)
+            public override IComplexFormulaNode<JobScope, double> GetFormula() => 
+                Formula(
+                    FormulaOperator.Divide, 
+                    Formula(
+                        FormulaOperator.Multiply, 
+                        Formula(
+                            FormulaOperator.Subtract, 
+                            Property(x=>x.LabourSell), 
+                            Property(c => c.LabourCost)
+                        ), 
+                        Constant(100.0F)
+                    ),  
+                    Property(c=>c.LabourCost)
                 );
         }
         

+ 20 - 1
prs.classes/Entities/Job/JobScopes/JobScopeActivity.cs

@@ -19,19 +19,38 @@ namespace Comal.Classes
         public AssignmentActivityLink Activity { get; set; }
         
         [EditorSequence(2)]
+        [DurationEditor(Summary = Summary.Sum)]
         public TimeSpan Hours { get; set; }
         
         [EditorSequence(3)]
         public double Rate { get; set; }
         
         [EditorSequence(4)]
+        [CurrencyEditor(Summary = Summary.Sum, Editable = Editable.Disabled)]
         public double Cost { get; set; }
         
         [EditorSequence(5)]
         public double Markup { get; set; }
         
         [EditorSequence(6)]
+        [CurrencyEditor(Summary = Summary.Sum, Editable = Editable.Disabled)]
         public double Sell { get; set; }
-        
+
+        protected override void DoPropertyChanged(string name, object? before, object? after)
+        {
+            base.DoPropertyChanged(name, before, after);
+            if (name.Equals(nameof(Hours)))
+            {
+                Cost = Rate * ((TimeSpan?)after ?? TimeSpan.Zero).TotalHours;
+                Sell = Cost * ((100.0F + Markup)/100.0F);
+            }
+            else if (name.Equals(nameof(Rate)))
+            {
+                Cost = Hours.TotalHours * ((double?)after ?? 0.0F);
+                Sell = Cost * ((100.0F + Markup)/100.0F);
+            }
+            else if (name.Equals(nameof(Markup)))
+                Sell = Cost * ((100.0F + ((double?)after ?? 0.0F))/100.0F);
+        }
     }
 }

+ 11 - 1
prs.classes/Entities/Job/JobScopes/JobScopeCostCentre.cs

@@ -18,13 +18,23 @@ namespace Comal.Classes
         public CostCentreLink CostCentre { get; set; }
     
         [EditorSequence(2)]
+        [CurrencyEditor(Summary = Summary.Sum)]
         public double Cost { get; set; }
     
         [EditorSequence(3)]
         public double Markup { get; set; }
     
         [EditorSequence(4)]
+        [CurrencyEditor(Summary = Summary.Sum, Editable = Editable.Disabled)]
         public double Sell { get; set; }
-    
+
+        protected override void DoPropertyChanged(string name, object? before, object? after)
+        {
+            base.DoPropertyChanged(name, before, after);
+            if (name.Equals(nameof(Cost)))
+                Sell = ((double?)after ?? 0.0F) * ((100.0F + Markup) / 100.0F);
+            else if (name.Equals(nameof(Markup)))
+                Sell = Cost * ((100.0F + ((double?)after ?? 0.0F)) / 100.0F);
+        }
     }
 }

+ 1 - 1
prs.desktop/Panels/Jobs/JobScopes/JobScopeActivityGrid.cs

@@ -34,7 +34,7 @@ public class JobScopeActivityGrid : DynamicDataGrid<JobScopeActivity>, IJobScope
         var _columns = new DynamicGridColumns();
         _columns.Add<JobScopeActivity>(x => x.Activity.Code, 120, "Code", "", Alignment.MiddleLeft);
         _columns.Add<JobScopeActivity>(x => x.Activity.Description, 0, "Description", "", Alignment.MiddleLeft);
-        _columns.Add<JobScopeActivity>(x => x.Hours, 70, "Hours", "hhh:mm", Alignment.MiddleCenter);
+        _columns.Add<JobScopeActivity>(x => x.Hours, 70, "Hours", "hh:mm", Alignment.MiddleCenter);
         _columns.Add<JobScopeActivity>(x => x.Rate, 70, "Rate", "F2", Alignment.MiddleCenter);
         _columns.Add<JobScopeActivity>(x => x.Cost, 70, "Cost", "F2", Alignment.MiddleCenter);
         _columns.Add<JobScopeActivity>(x => x.Markup, 70, "M/Up", "F2", Alignment.MiddleCenter);