diff --git a/EvoCalculator.Core.Calculation/v2/Columns/CashflowMSFOColumn/BaseCashflowMSFOColumn.cs b/EvoCalculator.Core.Calculation/v2/Columns/CashflowMSFOColumn/BaseCashflowMSFOColumn.cs index 73448c2..743cb4d 100644 --- a/EvoCalculator.Core.Calculation/v2/Columns/CashflowMSFOColumn/BaseCashflowMSFOColumn.cs +++ b/EvoCalculator.Core.Calculation/v2/Columns/CashflowMSFOColumn/BaseCashflowMSFOColumn.cs @@ -1,5 +1,7 @@ -using EvoCalculator.Core.Base.Columns; +using System; +using EvoCalculator.Core.Base.Columns; using EvoCalculator.Core.Calculation.v1.Columns; +using EvoCalculator.Core.Models.Calculation.Models; using EvoCalculator.Core.Models.Calculation.Models.Prepared; namespace EvoCalculator.Core.Calculation.v2.Columns; @@ -36,4 +38,16 @@ public class BaseCashflowMSFOColumn : v1.Columns.BaseCashflowMSFOColumn + _agentComissionExpensesColumn.Values[i] + _subsidyExpensesColumn.Values[i]; } + + public void PostCheck(AdditionalData additionalData, Constants.Calculation constants) + { + base.PostCheck(additionalData); + + if (_preparedValues.PaymentDateNew != null && + this.Nominal < (_preparedValues.IRR_MSFO_Plan - constants.DeltaIRR)) + { + throw new Exception( + "По итогам результата расчета данное изменение графика влечет к убыточности сделки. Скорректируйте вносимые изменения либо получите согласование с адреса calculator@evoleasing.ru"); + } + } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/EvoKaskoNmperGrColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/EvoKaskoNmperGrColumn.cs new file mode 100644 index 0000000..b9bd1e7 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/EvoKaskoNmperGrColumn.cs @@ -0,0 +1,36 @@ +using System; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using EvoCalculator.Core.Tools.Check; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class EvoKaskoNmperGrColumn : BaseColumnWithSum +{ + private readonly PreparedValues preparedValues; + + public EvoKaskoNmperGrColumn(int count, PreparedValues preparedValues) : base(count) + { + this.preparedValues = preparedValues; + } + + + public void ComputeValues() + { + if (preparedValues.Nmper == 12) + { + Values[1] = preparedValues.InsuranceEvoKasko + preparedValues.InsuranceBonusLoss; + } + else + { + var EvoKaskoMonth = (preparedValues.InsuranceEvoKasko + preparedValues.InsuranceBonusLoss) / 12; + for (var i = 1; i < preparedValues.Nmper + 1; i += 12) + if (i <= preparedValues.Nmper) + Values[i] = preparedValues.Nmper - i + 1 >= 12 + ? EvoKaskoMonth * 12 + : EvoKaskoMonth * (preparedValues.Nmper - i + 1); + } + + Values[0] = -Sum; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/NegativeCashflowColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/NegativeCashflowColumn.cs index f418f71..6f24b48 100644 --- a/EvoCalculator.Core.Calculation/v3/Columns/NegativeCashflowColumn.cs +++ b/EvoCalculator.Core.Calculation/v3/Columns/NegativeCashflowColumn.cs @@ -8,10 +8,11 @@ public class NegativeCashflowColumn : BaseColumnWithSum { } - public void ComputeValues(BaseColumn kaskoNmperGrColumn, BaseColumn finGAPNmperGrColumn) + public void ComputeValues(BaseColumn kaskoNmperGrColumn, BaseColumn finGAPNmperGrColumn, + BaseColumn evoKaskoNmperGrColumn) { for (var i = 1; i < Values.Length; i++) - Values[i] = -kaskoNmperGrColumn.Values[i] - finGAPNmperGrColumn.Values[i]; + Values[i] = -kaskoNmperGrColumn.Values[i] - finGAPNmperGrColumn.Values[i] - evoKaskoNmperGrColumn.Values[i]; Values[0] = Sum; } diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs index fb9f275..b39b7e7 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs @@ -105,15 +105,18 @@ public static partial class CalculateManager var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1); agentComissionExpensesColumn.ComputeValues(preparedValues); + var evoKaskoNmperGrColumn = new EvoKaskoNmperGrColumn(preparedValues.Nmper + 1, preparedValues); + evoKaskoNmperGrColumn.ComputeValues(); + var negativeCashflowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1); - negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn, finGAPNmperGrColumn); + negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn, finGAPNmperGrColumn, evoKaskoNmperGrColumn); var cashflowMsfoColumn = new CashflowMSFOColumnVT2(preparedValues.Nmper + 1, dateTempColumn, postValues, preparedValues, percentPaymentColumn, sumColumn, negativeCashflowColumn, nsibBruttoGrColumn, tlmGrColumn, gpsGrColumn, npvBonusExpensesColumn, agentComissionExpensesColumn, subsidyExpensesColumn); cashflowMsfoColumn.ComputeValues(); - cashflowMsfoColumn.PostCheck(additionalData); + cashflowMsfoColumn.PostCheck(additionalData, constants); var vatColumn = new VATColumn(preparedValues.Nmper + 1); vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); @@ -242,7 +245,7 @@ public static partial class CalculateManager var npvFinalColumn = new NPVFinalColumn(maxColumnLength, dateTempColumn); npvFinalColumn.ComputeValues(cashflowNpvFinalColumn, npvWeightColumn); - + postValues.ComputeDirectorBonus(); postValues.ComputeDirectorExtraBonus(cashflowMsfoColumn); postValues.ComputeRegionalDirectorBonus(); @@ -318,6 +321,7 @@ public static partial class CalculateManager insuranceBonusExpensesColumn, comissionBonusExpensesColumn, expensesColumn, + evoKaskoNmperGrColumn, negativeCashflowColumn, nsibBruttoGrColumn, taxColumn, diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs index dbb9234..e3eca25 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs @@ -84,8 +84,11 @@ public static partial class CalculateManager var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1); agentComissionExpensesColumn.ComputeValues(preparedValues); + var evoKaskoNmperGrColumn = new EvoKaskoNmperGrColumn(preparedValues.Nmper + 1, preparedValues); + evoKaskoNmperGrColumn.ComputeValues(); + var negativeCashflowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1); - negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn, finGAPNmperGrColumn); + negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn, finGAPNmperGrColumn, evoKaskoNmperGrColumn); var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1); nsibBruttoGrColumn.ComputeValues(preparedValues); @@ -264,7 +267,7 @@ public static partial class CalculateManager var creditColumn = new CreditColumn(preparedValues.LoanRatePeriod + 4); creditColumn.ComputeValues(preparedValues, sumCreditColumn); - + var sumVATCreditColumn = new SumVATCreditColumn(12 + 2); sumVATCreditColumn.ComputeValues(preparedValues, vatColumn); @@ -315,7 +318,8 @@ public static partial class CalculateManager registrExpensesColumn, insuranceBonusExpensesColumn, comissionBonusExpensesColumn, - expensesColumn, + expensesColumn, + evoKaskoNmperGrColumn, negativeCashflowColumn, nsibBruttoGrColumn, taxColumn, diff --git a/EvoCalculator.Core.Calculation/v3/PostValues.cs b/EvoCalculator.Core.Calculation/v3/PostValues.cs index 4c92adf..749d45b 100644 --- a/EvoCalculator.Core.Calculation/v3/PostValues.cs +++ b/EvoCalculator.Core.Calculation/v3/PostValues.cs @@ -26,7 +26,9 @@ public class PostValues : v2.PostValues + Math.Abs(tlmGrColumn.Values[0]) + Math.Abs(gpsGrColumn.Values[0]) + _preparedValues.Rats + _preparedValues.Registration + _preparedValues.TrackerCost + _preparedValues.TLMCost + _preparedValues.TransportTaxGr + - _preparedValues.InsuranceFinGAPNmper) * + _preparedValues.InsuranceFinGAPNmper + + _preparedValues.InsuranceEvoKasko / 12 * _preparedValues.Nmper + + _preparedValues.InsuranceBonusLoss / 12 * _preparedValues.Nmper) * (decimal) _preparedValues.Leasing0K + _preparedValues.NsibBrutto; } diff --git a/EvoCalculator.Core.Constants/Calculation.cs b/EvoCalculator.Core.Constants/Calculation.cs index 18574f3..c3be457 100644 --- a/EvoCalculator.Core.Constants/Calculation.cs +++ b/EvoCalculator.Core.Constants/Calculation.cs @@ -12,4 +12,5 @@ public class Calculation public int MaxOnePolicePeriod = 16; public double VatValue = 0.2; public decimal MinBonus = 100; + public double DeltaIRR = 0.02; } \ No newline at end of file diff --git a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs index e59a571..61960c1 100644 --- a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs +++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs @@ -122,7 +122,8 @@ public class PreparedValues TransportTaxGr; public decimal AcquisitionExpenses => PlPrice + Insurance - ComissionRub - Discount + TrackerCost + TLMCost + - BaseRegistration + Rats + TransportTaxGr + InsuranceFinGAP; + BaseRegistration + Rats + TransportTaxGr + InsuranceFinGAP + + InsuranceEvoKasko + InsuranceBonusLoss; public decimal NpvBase => PlPrice + (NsibNetto * 12 / Nmper + @@ -179,4 +180,6 @@ public class PreparedValues public decimal InsuranceFinGAPNmper => InsuranceFinGAP / 12 * NmperFinGAP; public decimal BonusFinGAP { get; set; } public decimal DirectorBonusFinGAP { get; set; } + public decimal InsuranceEvoKasko { get; set; } + public decimal InsuranceBonusLoss { get; set; } } \ No newline at end of file diff --git a/EvoCalculator.Core.Models/PostCalculation/Models/Prepared/PreparedTables/TableInsurance.cs b/EvoCalculator.Core.Models/PostCalculation/Models/Prepared/PreparedTables/TableInsurance.cs index 447cc5f..6eef9d0 100644 --- a/EvoCalculator.Core.Models/PostCalculation/Models/Prepared/PreparedTables/TableInsurance.cs +++ b/EvoCalculator.Core.Models/PostCalculation/Models/Prepared/PreparedTables/TableInsurance.cs @@ -9,4 +9,5 @@ public class TableInsuranceRow public DateTime DateStartPeriodInsurance { get; set; } public decimal CostInsurance { get; set; } public decimal BaseInsurance { get; set; } + public decimal InsuranceBonusLoss { get; set; } } \ No newline at end of file diff --git a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/CashflowMSFOColumn.cs b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/CashflowMSFOColumn.cs index c796dc8..4e00f03 100644 --- a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/CashflowMSFOColumn.cs +++ b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/CashflowMSFOColumn.cs @@ -25,10 +25,10 @@ public class CashflowMSFOColumn : BaseColumnWithNominal costInsurances = nextTableInsurance .Where(ins => ins.PeriodNumberInsurance > 1 - && ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" + && ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO" && ins.DateStartPeriodInsurance <= nextDateTempColumn.Values[^1]) .OrderBy(x => x.TypeRiskInsurance) - .Select(x => -x.CostInsurance) + .Select(x => -(x.CostInsurance + x.InsuranceBonusLoss)) .ToArray(); var tlmCosts = Array.Empty(); @@ -56,7 +56,7 @@ public class CashflowMSFOColumn : BaseColumnWithNominal dateStartPeriodInsurances = nextTableInsurance .Where(ins => ins.PeriodNumberInsurance > 1 - && ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" + && ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO" && ins.DateStartPeriodInsurance <= nextDateTempColumn.Values[^1]) .OrderBy(x => x.TypeRiskInsurance) .Select(x => x.DateStartPeriodInsurance) diff --git a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumCurrentNegativeColumn.cs b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumCurrentNegativeColumn.cs index 15bbb08..e763dc9 100644 --- a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumCurrentNegativeColumn.cs +++ b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumCurrentNegativeColumn.cs @@ -19,7 +19,7 @@ public class SumCurrentNegativeColumn : BaseColumn return; var targetInsurance = nextTableInsurance - .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP"); + .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO"); var groupSumCurrentNegativeColumn = GroupColumns.SumToMainGroup( GroupColumns.Create(nextDateTempColumn.Values, ArraySegment.Empty), @@ -29,7 +29,7 @@ public class SumCurrentNegativeColumn : BaseColumn .Select(x => x.DateStartPeriodInsurance), targetInsurance .Where(x => x.DateStartPeriodInsurance <= nextDateTempColumn.Values[^1]) - .Select(x => x.CostInsurance)) + .Select(x => x.CostInsurance + x.InsuranceBonusLoss)) ); Values = Array.Concat( diff --git a/EvoCalculator.Core.PostCalculation/v1/NextValues.cs b/EvoCalculator.Core.PostCalculation/v1/NextValues.cs index 0a0f6a1..604a283 100644 --- a/EvoCalculator.Core.PostCalculation/v1/NextValues.cs +++ b/EvoCalculator.Core.PostCalculation/v1/NextValues.cs @@ -52,8 +52,9 @@ public class NextValues var nextCostInsurance = 0m; if (nextTableInsurance != null) nextCostInsurance = nextTableInsurance - .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" && x.PeriodNumberInsurance == 1) - .Sum(x => x.CostInsurance); + .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO" && + x.PeriodNumberInsurance == 1) + .Sum(x => x.CostInsurance + x.InsuranceBonusLoss); AcquisitionExpenses = preparedValues.PlPrice.Next @@ -112,8 +113,8 @@ public class NextValues var nextCostInsurance = 0m; if (nextTableInsurance != null) nextCostInsurance = nextTableInsurance - .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP") - .Sum(x => x.CostInsurance); + .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO") + .Sum(x => x.CostInsurance + x.InsuranceBonusLoss); BaseCost = (preparedValues.PlPrice.Next + nextCostInsurance