public TaxCalculationBase(
            EmployeeInsuranceFee employeeFee,
            RurMoney employeeNdfl,
            RurMoney additionalFee,
            RurMoney totalFee
            )
        {
            if (employeeNdfl < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(employeeNdfl));
            }
            if (additionalFee < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(additionalFee));
            }
            if (totalFee < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(totalFee));
            }

            EmployeeFee   = employeeFee;
            EmployeeNdfl  = employeeNdfl;
            AdditionalFee = additionalFee;
            TotalFee      = totalFee;
        }
Exemple #2
0
        public static OrgUsnDTaxAggregate Calculate(
            TaxCalculationBase @base,
            OrganizationUsnDTaxParameters @params)
        {
            var usnChargedTax = CalculateUsnDChargedTax(@params);

            var feeDeduction =
                @params.CustomerTaxParameters.Salary > RurMoney.Zero
                    ? RurMoney.Min(0.5M * usnChargedTax, @base.TotalFee)
                    : @base.TotalFee;

            var taxTotal = usnChargedTax - feeDeduction;

            var(total, burgen) =
                CalculateTotal(taxTotal + @base.EmployeeNdfl, @base.TotalFee, @params);

            return(new OrgUsnDTaxAggregate(
                       usnChargedTax,
                       taxTotal,
                       @base.EmployeeFee,
                       feeDeduction,
                       @base.TotalFee,
                       @base.EmployeeNdfl,
                       total,
                       burgen
                       ));
        }
Exemple #3
0
        public static (RurMoney total, decimal burgen) CalculateTotal(RurMoney totalTax, RurMoney totalFee, TaxParameters @params)
        {
            var total  = totalTax + totalFee;
            var burgen = (total.Amount / @params.CustomerTaxParameters.Income.Amount) * 100m;

            return(total, Math.Round(burgen * 100m) / 100m);
        }
        public static OrgUsnD_RTaxAggregate Calculate(
            TaxCalculationBase @base,
            OrganizationUsnD_RTaxParameters @params)
        {
            var totalExpenses = @base.EmployeeFee.Total
                                + @base.EmployeeNdfl
                                + @params.CustomerTaxParameters.Expense
                                + @params.CustomerTaxParameters.Salary;

            var chargedTax = CalculateUsnDRChargedTax(@params, totalExpenses);

            var sts = RurMoney.Max(chargedTax, @params.MinTaxRate.Value * @params.CustomerTaxParameters.Income);

            var(total, burgen) = CalculateTotal(sts + @base.EmployeeNdfl, @base.TotalFee, @params);

            return(new OrgUsnD_RTaxAggregate(
                       totalExpenses,
                       sts,
                       @base.EmployeeFee,
                       @base.EmployeeNdfl,
                       @base.TotalFee,
                       total,
                       burgen
                       ));
        }
Exemple #5
0
        public static IndividualUsnD_RTaxAggregate Calculate(
            TaxCalculationBase @base,
            IndividualUsnD_RTaxParameters @params)
        {
            var totalExpenses = @params.SelfInsuranceFee.Total
                                + @base.EmployeeFee.Total
                                + @base.EmployeeNdfl
                                + @params.CustomerTaxParameters.Expense
                                + @params.CustomerTaxParameters.Salary;

            var chargedTax = CalculateUsnDRChargedTax(@params, totalExpenses);

            var taxTotal = RurMoney.Max(chargedTax, @params.MinTaxRate.Value * @params.CustomerTaxParameters.Income);

            var(total, burgen) = CalculateTotal(taxTotal + @base.EmployeeNdfl, @base.TotalFee, @params);

            return(new IndividualUsnD_RTaxAggregate(
                       totalExpenses,
                       taxTotal,
                       @params.SelfInsuranceFee,
                       @base.EmployeeFee,
                       @base.AdditionalFee,
                       @base.EmployeeNdfl,
                       @base.TotalFee,
                       total,
                       burgen
                       ));
        }
Exemple #6
0
        public static IndividualUsnDTaxAggregate Calculate(
            TaxCalculationBase @base,
            IndividualUsnDTaxParameters @params)
        {
            var chargedTax = CalculateUsnDChargedTax(@params);

            var feeDeduction =
                @params.CustomerTaxParameters.Salary > RurMoney.Zero
                        ? RurMoney.Min(@base.TotalFee, 0.5M * chargedTax) // есть сотрудники
                        : @base.TotalFee;

            var usnTotalTax = chargedTax - feeDeduction;

            var(total, burgen) = CalculateTotal(usnTotalTax + @base.EmployeeNdfl, @base.TotalFee, @params);

            return(new IndividualUsnDTaxAggregate(
                       chargedTax,
                       feeDeduction,
                       @base.TotalFee,
                       usnTotalTax,
                       @params.SelfInsuranceFee,
                       @base.EmployeeFee,
                       @base.AdditionalFee,
                       @base.EmployeeNdfl,
                       total,
                       burgen
                       ));
        }
Exemple #7
0
        public static RurMoney CalculateUsnDRChargedTax(TaxParameters @params, RurMoney expense)
        {
            if (@params is UsnTaxParameters idp && idp.UsnType == EUsnType.IncomeExpense)
            {
                return(idp.UsnRate.Value * (@params.CustomerTaxParameters.Income - expense));
            }

            throw new NotSupportedException();
        }
Exemple #8
0
 protected IndividualUsnTaxAggregate(
     RurMoney sts,
     SelfInsuranceFee selfInsuranceFee,
     RurMoney additionalFee,
     RurMoney feeTotal,
     EmployeeInsuranceFee employeeFee,
     RurMoney employeeNdfl,
     RurMoney total,
     decimal burgen
     ) : base(selfInsuranceFee, additionalFee, feeTotal, employeeFee, employeeNdfl, total, burgen)
 {
     STS = sts;
 }
 protected TaxAggregate(
     RurMoney insuranceContributionsTotal,
     EmployeeInsuranceFee employeeFee,
     RurMoney ndfl,
     RurMoney total,
     decimal taxBurden)
 {
     EmployeeFee            = employeeFee;
     EmployeeNdfl           = ndfl;
     InsuranceContributions = insuranceContributionsTotal;
     Total     = total;
     TaxBurden = taxBurden;
 }
 public OrgUsnD_RTaxAggregate(
     RurMoney taxExpenses,
     RurMoney sts,
     EmployeeInsuranceFee employeeFee,
     RurMoney ndfl,
     RurMoney feeTotal,
     RurMoney total,
     decimal burgen
     ) : base(feeTotal, employeeFee, ndfl, total, burgen)
 {
     TaxableExpenses = taxExpenses;
     STS             = sts;
 }
Exemple #11
0
 protected IndividualTaxAggregate(
     SelfInsuranceFee selfInsuranceFee,
     RurMoney additionalFee,
     RurMoney feeTotal,
     EmployeeInsuranceFee employeeInsuranceFee,
     RurMoney ndfl,
     RurMoney total,
     decimal taxBurden
     ) : base(feeTotal, employeeInsuranceFee, ndfl, total, taxBurden)
 {
     InsuranceOneself       = selfInsuranceFee;
     AdditionalInsuranceFee = additionalFee;
 }
 public OrgOsnTaxAggregate(
     RurMoney profitTax,
     RurMoney nds,
     RurMoney feeTotal,
     EmployeeInsuranceFee employeeFee,
     RurMoney ndfl,
     RurMoney total,
     decimal burgen)
     : base(feeTotal, employeeFee, ndfl, total, burgen)
 {
     ProfitTax = profitTax;
     VAT       = nds;
 }
Exemple #13
0
 public IndividualUsnD_RTaxAggregate(
     RurMoney taxExpenses,
     RurMoney sts,
     SelfInsuranceFee selfInsuranceFee,
     EmployeeInsuranceFee employeeFee,
     RurMoney additionalFee,
     RurMoney employeeNdfl,
     RurMoney feeTotal,
     RurMoney total,
     decimal burgen
     ) : base(sts, selfInsuranceFee, additionalFee, feeTotal, employeeFee, employeeNdfl, total, burgen)
 {
     TaxableExpenses = taxExpenses;
 }
Exemple #14
0
        public SelfInsuranceFee(RurMoney pfr, RurMoney ffoms)
        {
            if (pfr < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(pfr));
            }
            if (ffoms < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(ffoms));
            }

            Pension = pfr;
            Health  = ffoms;
            Total   = pfr + ffoms;
        }
 public IndividualOsnTaxAggregate(
     RurMoney pit,
     RurMoney nds,
     SelfInsuranceFee selfInsuranceFee,
     RurMoney additionalFee,
     RurMoney feeTotal,
     EmployeeInsuranceFee employeeFee,
     RurMoney employeeNdfl,
     RurMoney total,
     decimal burgen
     ) : base(selfInsuranceFee, additionalFee, feeTotal, employeeFee, employeeNdfl, total, burgen)
 {
     PIT = pit;
     VAT = nds;
 }
Exemple #16
0
 public OrgUsnDTaxAggregate(
     RurMoney chargedTax,
     RurMoney sts,
     EmployeeInsuranceFee employeeFee,
     RurMoney feeDeduction,
     RurMoney feeTotal,
     RurMoney ndfl,
     RurMoney total,
     decimal burgen
     ) : base(feeTotal, employeeFee, ndfl, total, burgen)
 {
     STS        = sts;
     AccruedSTS = chargedTax;
     InsuranceContributionsDeduction = feeDeduction;
 }
Exemple #17
0
 public IndividualUsnDTaxAggregate(
     RurMoney accruedSTS,
     RurMoney feeDeduction,
     RurMoney feeTotal,
     RurMoney sts,
     SelfInsuranceFee selfInsuranceFee,
     EmployeeInsuranceFee employeeFee,
     RurMoney additionalFee,
     RurMoney employeeNdfl,
     RurMoney total,
     decimal burgen
     ) : base(sts, selfInsuranceFee, additionalFee, feeTotal, employeeFee, employeeNdfl, total, burgen)
 {
     AccruedSTS = accruedSTS;
     InsuranceContributionsDeduction = feeDeduction;
 }
Exemple #18
0
        /// <summary>
        /// часть, соответствующая НДФЛ сотрудников
        /// </summary>
        /// <param name="params"></param>
        /// <returns></returns>
        public static RurMoney CalculateEmployeeNdfl(TaxParameters @params)
        {
            var salaryRate = new Rate(1M / (1M - @params.NdflRate.Value));

            var salary = salaryRate.Value * @params.CustomerTaxParameters.Salary;

            var pfr = @params.InsuranceFeeParams.PfrRate.Value * salary;

            var ffoms = @params.InsuranceFeeParams.FfomsRate.Value * salary;

            var fss = @params.InsuranceFeeParams.FssRate.Value * salary;

            var ndfl = RurMoney.Round(@params.NdflRate.Value * salary);

            return(ndfl);
        }
Exemple #19
0
        public static RurMoney CalculateTotalFee(
            EmployeeInsuranceFee employeeFee,
            RurMoney additionalFee,
            SelfInsuranceFee selfFee,
            TaxParameters @params)
        {
            var tmp = employeeFee.Total + additionalFee;

            switch (@params.CompanyType)
            {
            case ECompanyType.IP:
                return(tmp + selfFee.Total);

            default:
                return(tmp);
            }
        }
        public InsuranceFeeParameters(
            Rate pfrRate,
            Rate ffomsRate,
            Rate fssRate,
            Rate additionalContribRate,
            RurMoney annualFreeIncomeBoundary)
        {
            if (annualFreeIncomeBoundary < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(annualFreeIncomeBoundary));
            }

            PfrRate                  = pfrRate;
            FfomsRate                = ffomsRate;
            FssRate                  = fssRate;
            AdditionalContribRate    = additionalContribRate;
            AnnualFreeIncomeBoundary = annualFreeIncomeBoundary;
        }
Exemple #21
0
        /// <param name="income">доход</param>
        /// <param name="expense">расход</param>
        /// <param name="salary">зарплата сотрудников</param>
        public CustomerTaxParameters(RurMoney income, RurMoney expense, RurMoney salary)
        {
            if (income < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(income));
            }
            if (expense < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(expense));
            }
            if (salary < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(salary));
            }

            Income  = income;
            Expense = expense;
            Salary  = salary;
        }
Exemple #22
0
        public EmployeeInsuranceFee(RurMoney pfr, RurMoney ffoms, RurMoney fss)
        {
            if (fss < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(pfr));
            }
            if (pfr < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(pfr));
            }
            if (ffoms < RurMoney.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(ffoms));
            }

            PFR   = pfr;
            FFOMS = ffoms;
            FSS   = fss;

            Total = PFR + FFOMS + FSS;
        }
Exemple #23
0
        public async Task ChooseOrgOsn_Then_CalculateWright()
        {
            // Assign
            var calculator =
                await _taxCalculatorFactory.CreateCalculator(
                    ECompanyType.OOO,
                    EAccountTaxationSystem.Osn);

            // Act
            var @params =
                new CustomerTaxParameters(
                    new RurMoney(1000000m),
                    new RurMoney(100000m),
                    new RurMoney(30000m));

            var actual = await calculator(@params);

            // Assert
            var feeTotal = new RurMoney(10344.83m);

            var profitTax = new RurMoney(143576.81m);

            var nds = new RurMoney(137288.13m);

            var expected = new OrgOsnTaxAggregate(
                profitTax,
                nds,
                feeTotal,
                employeeFee: new EmployeeInsuranceFee(
                    new RurMoney(7586.21m),
                    new RurMoney(1758.62m),
                    new RurMoney(1000m)),
                ndfl: new RurMoney(4483m),
                total: new RurMoney(295692.77m),
                burgen: 29.57m
                );

            Assert.AreEqual(expected, actual);
        }
        public static IndividualOsnTaxAggregate Calculate(
            TaxCalculationBase @base,
            IndividualOsnTaxParameters @params)
        {
            var(salesNds, buyNds, totalNds) = CalculateNds(@params);

            var individualNdfl = CalculateIndividualNdfl();

            var(total, burgen) =
                CalculateTotal(individualNdfl + totalNds, @base.TotalFee, @params);

            return(new IndividualOsnTaxAggregate(
                       individualNdfl,
                       totalNds,
                       @params.SelfInsuranceFee,
                       @base.AdditionalFee,
                       @base.TotalFee,
                       @base.EmployeeFee,
                       @base.EmployeeNdfl,
                       total,
                       burgen
                       ));

            RurMoney CalculateIndividualNdfl()
            {
                var expense = @params.CustomerTaxParameters.Expense - buyNds + @params.SelfInsuranceFee.Total;

                var totalExpense = expense
                                   + @base.EmployeeFee.Total
                                   + @base.EmployeeNdfl
                                   + @params.CustomerTaxParameters.Salary;

                var profit = @params.CustomerTaxParameters.Income - salesNds - totalExpense;

                return(RurMoney.Round(@params.NdflRate.Value * profit));
            }
        }
Exemple #25
0
        public async Task ChooseOrgOsnWithoutEmployee_Then_CalculateWright()
        {
            // Assign
            var calculator =
                await _taxCalculatorFactory.CreateCalculator(
                    ECompanyType.OOO,
                    EAccountTaxationSystem.Osn);

            // Act
            var @params =
                new CustomerTaxParameters(
                    new RurMoney(1000000m),
                    new RurMoney(100000m),
                    RurMoney.Zero);

            var actual = await calculator(@params);

            // Assert
            var feeTotal = RurMoney.Zero;

            var profitTax = new RurMoney(152542.37m);

            var nds = new RurMoney(137288.13m);

            var expected = new OrgOsnTaxAggregate(
                profitTax,
                nds,
                feeTotal,
                employeeFee: new EmployeeInsuranceFee(RurMoney.Zero, RurMoney.Zero, RurMoney.Zero),
                ndfl: RurMoney.Zero,
                total: new RurMoney(289830.5m),
                burgen: 28.98m
                );

            Assert.AreEqual(expected, actual);
        }