public SelfEmployeeCalculation(SelfEmployeeCalculationContext calculationContext) { if (calculationContext == null) { throw new ArgumentNullException(nameof(calculationContext)); } if (calculationContext.BaseAmount < 0) { throw new ArgumentOutOfRangeException(nameof(calculationContext.BaseAmount)); } if (calculationContext.IncomeCost < 0) { throw new ArgumentOutOfRangeException(nameof(calculationContext.IncomeCost)); } this.Id = Guid.NewGuid(); CalculateVatAmount(calculationContext); this.TaxBaseAmount = CalculateTaxBaseAmount(calculationContext.BaseAmount, calculationContext.IsGross); this.IncomeCostsAmount = calculationContext.IncomeCost; this.Month = calculationContext.Month; AddInsuranceContribution(calculationContext.InsuranceContributionContext); CalculateMonthlyBaseAmount(calculationContext); CalculateIncomeTax(calculationContext); CalculateNetPay(calculationContext); CalculateNetPayEstimate(calculationContext); }
private void CalculateNetPay(SelfEmployeeCalculationContext context) { this.NetPay = this.TaxBaseAmount - this.InsuranceContribution.InsuranceContributionsSum() - this.TaxAmount - this.IncomeCostsAmount; }
private void CalculateVatAmount(SelfEmployeeCalculationContext calculationContext) { //TODO Add vat rate to command and context if (calculationContext.IsGross) { this.VatAmount = Math.Round((calculationContext.BaseAmount - (calculationContext.BaseAmount / (1 + calculationContext.VatTaxRate))), 2); } else { this.VatAmount = Math.Round((calculationContext.BaseAmount * calculationContext.VatTaxRate), 2); } }
private void CalculateIncomeTax(SelfEmployeeCalculationContext calculationContext) { if (this.BaseAmount <= 0) { this.TaxAmount = 0; } else { if (calculationContext.TaxationForm == TaxationForm.LINEAR) { calculationContext.MonthlyTaxFreeAmount = 0; } this.TaxAmount = Math.Round(calculationContext.IncomeTaxAmmount.Invoke(CreateTaxCalculationContext(calculationContext)) - (this.InsuranceContribution.HealthInsuranceDiscount + calculationContext.MonthlyTaxFreeAmount), 0); } }
private SelfEmployeeCalculationContext CreateSelfEmployeeCalculationContext(SelfEmployeeCalculationCommand request) { SelfEmployeeCalculationContext context = new SelfEmployeeCalculationContext() { BaseAmount = request.Salary, IncomeCost = request.IncomeCosts, IncomeTaxAmmount = _taxCalculator.Calculate, InsuranceContributionContext = _insuranceContributionService.Create(request.InsuranceContributionForm, request.AccidentContributionPercentage, request.IsMedicalInsurance), IsMedicalInsurance = request.IsMedicalInsurance, Month = (Month)DateTime.Today.Month, PreviusMonthsIncome = request.PreviousMonthsIncomes, TaxationForm = request.TaxationForm, IsGross = request.IsGross, VatTaxRate = GetValue(VATKEY), MonthlyTaxFreeAmount = GetValue(MONTHLYTAXFREEAMOUNTKEY) }; return(context); }
private void CalculateMonthlyBaseAmount(SelfEmployeeCalculationContext context) { this.BaseAmount = Math.Round(this.TaxBaseAmount - this.IncomeCostsAmount - this.InsuranceContribution.SocialInsuranceContributionSum(), 0); }
private TaxCalculationContext CreateTaxCalculationContext(SelfEmployeeCalculationContext calculationContext) { return(new TaxCalculationContext(calculationContext.PreviusMonthsIncome, this.BaseAmount, calculationContext.TaxationForm)); }