コード例 #1
0
        public void CalculateNetSalary_ShouldReturnNetSalaryWithIncomeTaxAndMaxSocialContributionsTax_IfGrossSalaryIsAboveMaxGrossSalary()
        {
            //Arrange
            double grossSalaryAboveMax = GlobalConstants.MaxGrossSalaryForSocialContributions + 1;

            double incomeTax = (grossSalaryAboveMax - GlobalConstants.MinGrossSalary) * GlobalConstants.IncomeTaxPercent / 100;
            var    mockedIncomeTaxCalculator = new Mock <IIncomeTaxCalculator>();

            mockedIncomeTaxCalculator.Setup(x => x.CalculateIncomeTax(grossSalaryAboveMax)).Returns(incomeTax);

            double socialContributions = (GlobalConstants.MaxGrossSalaryForSocialContributions - GlobalConstants.MinGrossSalary) * GlobalConstants.SocialContributionsPercent / 100;
            var    mockedSocialContributionsCalculator = new Mock <ISocialContributionsCalculator>();

            mockedSocialContributionsCalculator.Setup(x => x.CalculateSocialContributions(grossSalaryAboveMax)).Returns(socialContributions);

            NetSalaryCalculator netSalaryCalculator = new NetSalaryCalculator(mockedIncomeTaxCalculator.Object, mockedSocialContributionsCalculator.Object);

            double expectedNetSalary = grossSalaryAboveMax - incomeTax - socialContributions;

            //Action
            double resultNetSalary = netSalaryCalculator.CalculateNetSalary(grossSalaryAboveMax);

            //Assert
            Assert.AreEqual(expectedNetSalary, resultNetSalary, $"Result net salary is not equal to {expectedNetSalary}");
        }
コード例 #2
0
ファイル: StartUp.cs プロジェクト: iovigi/SalaryCalculator
        static void Main(string[] args)
        {
            decimal grossSalary = 0m;

            Console.WriteLine("Please input gross salary. Gross salary should be number between 0 to {0}", decimal.MaxValue);
            string userInput = Console.ReadLine();

            while (!decimal.TryParse(userInput, out grossSalary) || grossSalary < 0)
            {
                Console.WriteLine("Please input valid gross salary. Valid gross salary should be number between 0 to {0}", decimal.MaxValue);
                userInput = Console.ReadLine();
            }

            const decimal belowTaxSalaryLevel                 = 1000;
            const decimal higherSalaryLevel                   = 3000;
            const int     percentOfIncomeTaxation             = 10;
            const int     percentOfSocialContributionTaxation = 15;

            var rules = new ITaxationRule[]
            {
                new IncomeTaxationRule(belowTaxSalaryLevel, percentOfIncomeTaxation),
                new SocialContributionTaxationRule(belowTaxSalaryLevel, higherSalaryLevel, percentOfSocialContributionTaxation)
            };

            NetSalaryCalculator salaryCalculator = new NetSalaryCalculator(rules);
            var netSalary = salaryCalculator.CalculateNetSalary(grossSalary);

            Console.WriteLine("Net salary after taxes is {0}", netSalary);
        }
コード例 #3
0
        // Formula for net salary
        public static uint FormulaForNetSalary(NetSalaryCalculator _grossSalary)
        {
            var netSalary = _grossSalary.GrossSalary - ((uint)(0.25 * _grossSalary.GrossSalary)) - ((uint)(0.10 * _grossSalary.GrossSalary))
                            - ((uint)(0.10 * (_grossSalary.GrossSalary - ((uint)(0.25 * _grossSalary.GrossSalary))
                                              - ((uint)(0.10 * _grossSalary.GrossSalary)))));

            return(netSalary);
        }
コード例 #4
0
        public void SalaryAfterCalculationShouldBeTheSame()
        {
            var grossSalary = 2000;

            NetSalaryCalculator salaryCalculator = new NetSalaryCalculator();
            var calculatedSalary = salaryCalculator.CalculateNetSalary(grossSalary);

            Assert.AreEqual(grossSalary, calculatedSalary);
        }
コード例 #5
0
 public IActionResult Index([Bind("GrossSalary")] NetSalaryCalculator _grossSalary)
 {
     if (ModelState.IsValid && _grossSalary != null)
     {
         var calculationResult = Formulas.ForNetSalaryAndEmployeeTaxesCalculationFromGrossSalary(_grossSalary);
         SaveResultsInDB(calculationResult);
         return(RedirectToAction(nameof(CompleteCalculation), "NetSalaryCalculator", calculationResult));
     }
     return(View(_grossSalary));
 }
コード例 #6
0
        public void ForNegativeSalaryShouldThrowArgumentException()
        {
            var grossSalary = -100;

            NetSalaryCalculator salaryCalculator = new NetSalaryCalculator();

            Assert.Catch <ArgumentException>(() =>
            {
                salaryCalculator.CalculateNetSalary(grossSalary);
            });
        }
コード例 #7
0
        public void SalaryAfterCalculationShouldBeTenPercentLower()
        {
            var grossSalary = 2000;

            NetSalaryCalculator salaryCalculator = new NetSalaryCalculator(new MockTaxationRule());
            var calculatedSalary = salaryCalculator.CalculateNetSalary(grossSalary);

            decimal expectedSalary = 1800m;

            Assert.AreEqual(expectedSalary, calculatedSalary);
        }
コード例 #8
0
        public void Setup()
        {
            var configuration = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

            _configuration = configuration.Build();

            _salaryTaxOptions    = Options.Create(_configuration.GetSection("salaryTaxConfig").Get <SalaryTaxConfig>());
            _netSalaryCalculator = new NetSalaryCalculator(_salaryTaxOptions);
        }
コード例 #9
0
        static void Main(string[] args)
        {
            INetSalaryCalculator netSalaryCalculator = new NetSalaryCalculator();

            Console.Write("Input gross salary: ");
            double grossSalary = double.Parse(Console.ReadLine());

            double netSalary = netSalaryCalculator.CalculateNetSalary(grossSalary);

            Console.WriteLine($"Net salary: {netSalary}");
        }
コード例 #10
0
        // Formula for net salary and the employee taxes (CAS, CASS, taxable base, tax)
        public static NetSalaryCalculator ForNetSalaryAndEmployeeTaxesCalculationFromGrossSalary(NetSalaryCalculator _grossSalary)
        {
            var calculationNet = new NetSalaryCalculator()
            {
                GrossSalary = _grossSalary.GrossSalary,
                Cas         = FormulaForCas(_grossSalary),
                Cass        = FormulaForCass(_grossSalary),
                TaxableBase = FormulaForTaxableBase(_grossSalary),
                Tax         = FormulaForTax(_grossSalary),
                NetSalary   = FormulaForNetSalary(_grossSalary)
            };

            return(calculationNet);
        }
コード例 #11
0
        public void CalculateNetSalary_ShouldThrowArgumentException_IfGrossSalaryIsNegative()
        {
            //Arrange
            double grossSalaryNegative = -1;

            var mockedIncomeTaxCalculator           = new Mock <IIncomeTaxCalculator>();
            var mockedSocialContributionsCalculator = new Mock <ISocialContributionsCalculator>();

            NetSalaryCalculator netSalaryCalculator = new NetSalaryCalculator(mockedIncomeTaxCalculator.Object, mockedSocialContributionsCalculator.Object);

            //Action
            var exception = Assert.Throws <ArgumentException>(() => netSalaryCalculator.CalculateNetSalary(grossSalaryNegative));

            //Assert
            Assert.That(exception.Message, Is.EqualTo(GlobalConstants.NegativeGrossSalaryMessage));
        }
コード例 #12
0
        public void CalculateNetSalary_ShouldReturnGrossSalary_IfIncomeTaxIs0AndSocialContributionsIs0()
        {
            //Arrange
            double grossSalaryBelowMin = GlobalConstants.MinGrossSalary - 1;

            var mockedIncomeTaxCalculator = new Mock <IIncomeTaxCalculator>();

            mockedIncomeTaxCalculator.Setup(x => x.CalculateIncomeTax(grossSalaryBelowMin)).Returns(0);

            var mockedSocialContributionsCalculator = new Mock <ISocialContributionsCalculator>();

            mockedSocialContributionsCalculator.Setup(x => x.CalculateSocialContributions(grossSalaryBelowMin)).Returns(0);

            NetSalaryCalculator netSalaryCalculator = new NetSalaryCalculator(mockedIncomeTaxCalculator.Object, mockedSocialContributionsCalculator.Object);

            //Action
            double resultNetSalary = netSalaryCalculator.CalculateNetSalary(grossSalaryBelowMin);

            //Assert
            Assert.AreEqual(grossSalaryBelowMin, resultNetSalary, $"Result net salary is not equal to {grossSalaryBelowMin}");
        }
コード例 #13
0
 private void SaveResultsInDB(NetSalaryCalculator result)
 {
     _context.NetSalariesCalculator.Add(result);
     _context.SaveChanges();
 }
コード例 #14
0
 public IActionResult CompleteCalculation(NetSalaryCalculator calculationResult)
 {
     return(View(calculationResult));
 }
コード例 #15
0
        // Formula for CASS
        public static uint FormulaForCass(NetSalaryCalculator _grossSalary)
        {
            var cass = (uint)(0.10 * _grossSalary.GrossSalary);

            return(cass);
        }
コード例 #16
0
        // Formula for tax
        public static uint FormulaForTax(NetSalaryCalculator _grossSalary)
        {
            var tax = (uint)(0.10 * (_grossSalary.GrossSalary - ((uint)(0.25 * _grossSalary.GrossSalary)) - ((uint)(0.10 * _grossSalary.GrossSalary))));

            return(tax);
        }
コード例 #17
0
        // Formula for taxable base
        public static uint FormulaForTaxableBase(NetSalaryCalculator _grossSalary)
        {
            var taxableBase = _grossSalary.GrossSalary - ((uint)(0.25 * _grossSalary.GrossSalary)) - ((uint)(0.10 * _grossSalary.GrossSalary));

            return(taxableBase);
        }