Beispiel #1
0
        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);
        }
Beispiel #2
0
 private void CalculateNetPay(SelfEmployeeCalculationContext context)
 {
     this.NetPay = this.TaxBaseAmount -
                   this.InsuranceContribution.InsuranceContributionsSum() -
                   this.TaxAmount -
                   this.IncomeCostsAmount;
 }
Beispiel #3
0
 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);
     }
 }
Beispiel #4
0
 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);
        }
Beispiel #6
0
 private void CalculateMonthlyBaseAmount(SelfEmployeeCalculationContext context)
 {
     this.BaseAmount = Math.Round(this.TaxBaseAmount - this.IncomeCostsAmount -
                                  this.InsuranceContribution.SocialInsuranceContributionSum(), 0);
 }
Beispiel #7
0
 private TaxCalculationContext CreateTaxCalculationContext(SelfEmployeeCalculationContext calculationContext)
 {
     return(new TaxCalculationContext(calculationContext.PreviusMonthsIncome, this.BaseAmount, calculationContext.TaxationForm));
 }