private bool IsLimitValueMonth(IncomeTaxThreshold currentValueIncomeTaxThreshold, TaxCalculationContext context) { var currentIncomesSum = context.TotalIncomes + context.CurrentIncome; return(currentIncomesSum > currentValueIncomeTaxThreshold.ToAmount && context.TotalIncomes > currentValueIncomeTaxThreshold.FromAmount); }
private decimal CalculateForBorderMonth(TaxCalculationContext context, IncomeTaxThreshold currentValueIncomeTaxThreshold, IncomeTaxThreshold nextThreshold) { decimal taxValue = (currentValueIncomeTaxThreshold.ToAmount - context.TotalIncomes) * currentValueIncomeTaxThreshold.Percentage; var remainingValueForNextThreshold = ((context.TotalIncomes + context.CurrentIncome) - nextThreshold.FromAmount) * nextThreshold.Percentage; return(taxValue + remainingValueForNextThreshold); }
public decimal Calculate(TaxCalculationContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } decimal taxValue = 0; List <IncomeTaxThreshold> incomeTaxThresholds = GetIncomeTaxThreshold(); var currentValueIncomeTaxThreshold = GetCurrentValueIncomeTaxThreshold(context, incomeTaxThresholds); if (IsLimitValueMonth(currentValueIncomeTaxThreshold, context)) { IncomeTaxThreshold nextThreshold = GetNextIncomeTaxThreshold(incomeTaxThresholds, currentValueIncomeTaxThreshold); taxValue = CalculateForBorderMonth(context, currentValueIncomeTaxThreshold, nextThreshold); } else { taxValue = CalculateForFullMonth(currentValueIncomeTaxThreshold, context); } return(Decimal.Round(taxValue, 2)); }
private IncomeTaxThreshold GetNextIncomeTaxThreshold(List <IncomeTaxThreshold> incomeTaxThresholds, IncomeTaxThreshold currentTaxThreshold) { return(incomeTaxThresholds.FirstOrDefault(x => x.ThresholdNumber == (currentTaxThreshold.ThresholdNumber + 1))); }
private decimal CalculateForFullMonth(IncomeTaxThreshold currentValueIncomeTaxThreshold, TaxCalculationContext context) { return(context.CurrentIncome * currentValueIncomeTaxThreshold.Percentage); }
private decimal GetTaxPercentage() { IncomeTaxThreshold incomeTaxThreshold = _taxPercentagesService.GetLinearRate() ?? throw new DomainException("Tax percentages not found"); return(incomeTaxThreshold.Percentage); }