//Percentage and FixedAmount have two variations that sets them over upper limit and calculated should be equal to upper limit public void CalculatedOverUpperLimitMultipleVariations() { ConfigurationServiceMock configurationService = new ConfigurationServiceMock(); PriceCalculationDMNServiceMock priceCalCService = new PriceCalculationDMNServiceMock(configurationService); MarketRatesServiceMock marketRatesService = new MarketRatesServiceMock(); var OfferPriceCalculation = new OfferPriceCalculation(priceCalCService, marketRatesService, configurationService, null); FeeCondition regularFee = new FeeCondition { Percentage = (decimal)0.1, FixedAmount = new Currency { Amount = 20, Code = "EUR" }, LowerLimit = new Currency { Amount = 20, Code = "EUR" }, UpperLimit = new Currency { Amount = 200, Code = "EUR" }, VariationsDefinitionDMN = "product/price-variations/multiple-fee-var-over-range.dmn", PercentageLowerLimit = (decimal)0.05, PercentageUpperLimit = 1, Title = "Origination-fee1", EffectiveDate = DateTime.Now.AddDays(-1), Currencies = new List <string> { "RSD", "EUR" } }; ProductConditions conditions = new ProductConditions { Fees = new List <FeeCondition> { regularFee }, InterestRates = new List <InterestRateCondition> { } }; Application application = Utility.GetApplication(conditions); var arrangementRequest = application.ArrangementRequests[0] as TermLoanRequest; var priceCalculationConditions = Utility.GetPriceCalculationParameterFromTermLoanRequest(arrangementRequest); var result = OfferPriceCalculation.CalculatePrice(application, arrangementRequest); var resultFees = result.Result.Conditions.Fees[0]; var variation = result.Result.Conditions.Fees[0].Variations; Assert.Equal("2", variation.Count.ToString()); var variationOne = variation[0]; var variationTwo = variation[1]; Assert.Equal("RanToCompletion", result.Status.ToString()); Assert.Equal(1, resultFees.CalculatedPercentage); Assert.Equal((decimal)0.4, variationOne.Percentage); Assert.Equal((decimal)0.6, variationTwo.Percentage); Assert.Equal("product/price-variations/multiple-fee-var-over-range.dmn", resultFees.VariationsDefinitionDMN); }
//Percentage and FixedAmount have a variation that sets them to near lower limit but still above public void CalculatedNearLowerLimit() { ConfigurationServiceMock configurationService = new ConfigurationServiceMock(); PriceCalculationDMNServiceMock priceCalCService = new PriceCalculationDMNServiceMock(configurationService); MarketRatesServiceMock marketRatesService = new MarketRatesServiceMock(); var OfferPriceCalculation = new OfferPriceCalculation(priceCalCService, marketRatesService, configurationService, null); FeeCondition regularFee = new FeeCondition { //Samo % se testira za sada jer trenutno nema za fixedAmount //Samo varijacije uticu na PercentageKind = FeeConditionKinds.OriginationFee, Percentage = (decimal)0.1, FixedAmount = new Currency { Amount = 200, Code = "EUR" }, LowerLimit = new Currency { Amount = 20, Code = "EUR" }, UpperLimit = new Currency { Amount = 200, Code = "EUR" }, VariationsDefinitionDMN = "product/price-variations/fee-in-range-lower.dmn", PercentageLowerLimit = (decimal)0.01, PercentageUpperLimit = 1, Title = "Origination-fee1", EffectiveDate = DateTime.Now.AddDays(-1), Currencies = new List <string> { "RSD", "EUR" } }; ProductConditions conditions = new ProductConditions { Fees = new List <FeeCondition> { regularFee }, InterestRates = new List <InterestRateCondition> { } }; Application application = Utility.GetApplication(conditions); var arrangementRequest = application.ArrangementRequests[0] as TermLoanRequest; var priceCalculationConditions = Utility.GetPriceCalculationParameterFromTermLoanRequest(arrangementRequest); var result = OfferPriceCalculation.CalculatePrice(application, arrangementRequest); //Basic assertions Assert.Equal("RanToCompletion", result.Status.ToString()); Assert.Single(result.Result.Conditions.Fees); var resultFees = result.Result.Conditions.Fees[0]; Assert.Single(resultFees.Variations); var variation = resultFees.Variations[0]; //Asserting input Assert.Equal(200, resultFees.FixedAmount.Amount); Assert.Equal((decimal)0.1, resultFees.Percentage); //Asserting output Assert.Equal("product/price-variations/fee-in-range-lower.dmn", resultFees.VariationsDefinitionDMN); Assert.Equal((decimal)0.02, resultFees.CalculatedPercentage); Assert.Equal((decimal) - 0.08, variation.Percentage); Assert.Equal(21, resultFees.CalculatedFixedAmount); Assert.Equal(-179, variation.FixedAmount); }
//No variations, calc rates should be as they are set in the request //Rate is within limits public void NoVariationsBelowLimitWithoutMarketRate() { ConfigurationServiceMock configurationService = new ConfigurationServiceMock(); PriceCalculationDMNServiceMock priceCalCService = new PriceCalculationDMNServiceMock(configurationService); MarketRatesServiceMock marketRatesService = new MarketRatesServiceMock(); var OfferPriceCalculation = new OfferPriceCalculation(priceCalCService, marketRatesService, configurationService, null); InterestRateCondition regularInterestEuribor = new InterestRateCondition { //This base rate id removes -1.5 from spreadRateValue, making rate under limit Kind = InterestRateKinds.RegularInterest, Rate = new InterestRate { BaseRateId = "EURIBOR-6M", SpreadRateValue = (decimal)9.9 }, UpperLimit = new InterestRate { BaseRateId = "EURIBOR-6M", SpreadRateValue = 18 }, LowerLimit = new InterestRate { BaseRateId = "EURIBOR-6M", SpreadRateValue = 10 }, Title = "regular-interest", Currencies = new List <string> { "EUR" } }; ProductConditions conditions = new ProductConditions { Fees = new List <FeeCondition> { }, InterestRates = new List <InterestRateCondition> { regularInterestEuribor } }; Application application = Utility.GetApplication(conditions); var arrangementRequest = application.ArrangementRequests[0] as TermLoanRequest; var priceCalculationConditions = Utility.GetPriceCalculationParameterFromTermLoanRequest(arrangementRequest); var variationsDefinition = Utility.GetVariationDefinitionParamsFromApplication(application); var result = OfferPriceCalculation.CalculatePrice(application, arrangementRequest); var resultInterest = result.Result.Conditions.InterestRates[0]; //Basic assertions Assert.Equal("RanToCompletion", result.Status.ToString()); Assert.Equal("0", resultInterest.Variations.Count.ToString()); //Asserting input parameters Assert.Equal("EURIBOR-6M", resultInterest.Rate.BaseRateId); Assert.Equal(0, resultInterest.Rate.BaseRateValue); Assert.Equal((decimal)9.9, resultInterest.Rate.SpreadRateValue); Assert.Equal("EURIBOR-6M", resultInterest.UpperLimit.BaseRateId); Assert.Equal(0, resultInterest.UpperLimit.BaseRateValue); Assert.Equal((decimal)18.0, resultInterest.UpperLimit.SpreadRateValue); Assert.Equal("EURIBOR-6M", resultInterest.LowerLimit.BaseRateId); Assert.Equal(0, resultInterest.LowerLimit.BaseRateValue); Assert.Equal((decimal)10.0, resultInterest.LowerLimit.SpreadRateValue); //Asserting Napr and calculation results Assert.Equal((decimal)10.0, ((TermLoanRequest)result.Result).Napr); Assert.Equal((decimal)10.0, resultInterest.CalculatedRate); Assert.Equal((decimal)10.0, resultInterest.CalculatedLowerLimit); Assert.Equal((decimal)18.0, resultInterest.CalculatedUpperLimit); }
//Percentage and FixedAmount have a variation that sets them to near lower limit but still above public void IterativeCalculatedNearLowerLimit() { ConfigurationServiceMock configurationService = new ConfigurationServiceMock(); PriceCalculationDMNServiceMock priceCalCService = new PriceCalculationDMNServiceMock(configurationService); MarketRatesServiceMock marketRatesService = new MarketRatesServiceMock(); var priceCalculator = new OfferPriceCalculation(priceCalCService, marketRatesService, configurationService, null); FeeCondition regularFee = new FeeCondition { //Samo % se testira za sada jer trenutno nema za fixedAmount //Samo varijacije uticu na PercentageKind = FeeConditionKinds.OriginationFee, Percentage = (decimal)0.1, FixedAmount = new Currency { Amount = 200, Code = "EUR" }, LowerLimit = new Currency { Amount = 20, Code = "EUR" }, UpperLimit = new Currency { Amount = 200, Code = "EUR" }, VariationsDefinitionDMN = "product/price-variations/iterative-fee-in-range-lower.dmn", PercentageLowerLimit = (decimal)0.01, PercentageUpperLimit = 1, Title = "Origination-fee1", EffectiveDate = DateTime.Now.AddDays(-1), Currencies = new List <string> { "RSD", "EUR" } }; ProductConditions conditions = new ProductConditions { Fees = new List <FeeCondition> { regularFee }, InterestRates = new List <InterestRateCondition> { } }; var arrangementRequest = Utility.GetArangementRequest(conditions); Application application = new Application { ArrangementNumber = "1", CustomerName = "Tester", StatusInformation = new StatusInformation { Description = "Works as a tester" }, CustomerSegment = "student", CollateralModel = "two-co-debtors", RiskScore = 55, ChannelCode = "web", RequestDate = DateTime.Now }; var result = priceCalculator.CalculatePrice(application, arrangementRequest); //Basic assertions Assert.Equal("RanToCompletion", result.Status.ToString()); Assert.Single(result.Result.Conditions.Fees); var resultFees = result.Result.Conditions.Fees[0]; Assert.Single(resultFees.Variations); var variation = resultFees.Variations[0]; //Asserting input Assert.Equal(200, resultFees.FixedAmount.Amount); Assert.Equal((decimal)0.1, resultFees.Percentage); //Asserting output Assert.Equal("product/price-variations/iterative-fee-in-range-lower.dmn", resultFees.VariationsDefinitionDMN); Assert.Equal((decimal)0.03, resultFees.CalculatedPercentage); Assert.Equal((decimal) - 0.07, variation.Percentage); Assert.Equal(22, resultFees.CalculatedFixedAmount); Assert.Equal(-178, variation.FixedAmount); }
//Percentage and FixedAmount have two variations that sets them over upper limit and calculated should be equal to upper limit public void IterativeCalculatedOverUpperLimitMultipleVariations() { ConfigurationServiceMock configurationService = new ConfigurationServiceMock(); PriceCalculationDMNServiceMock priceCalCService = new PriceCalculationDMNServiceMock(configurationService); MarketRatesServiceMock marketRatesService = new MarketRatesServiceMock(); var priceCalculator = new OfferPriceCalculation(priceCalCService, marketRatesService, configurationService, null); FeeCondition regularFee = new FeeCondition { Percentage = (decimal)0.1, FixedAmount = new Currency { Amount = 20, Code = "EUR" }, LowerLimit = new Currency { Amount = 20, Code = "EUR" }, UpperLimit = new Currency { Amount = 200, Code = "EUR" }, VariationsDefinitionDMN = "product/price-variations/iterative-multiple-fee-var-over-range.dmn", PercentageLowerLimit = (decimal)0.05, PercentageUpperLimit = 1, Title = "Origination-fee1", EffectiveDate = DateTime.Now.AddDays(-1), Currencies = new List <string> { "RSD", "EUR" } }; ProductConditions conditions = new ProductConditions { Fees = new List <FeeCondition> { regularFee }, InterestRates = new List <InterestRateCondition> { } }; var arrangementRequest = Utility.GetArangementRequest(conditions); Application application = new Application { ArrangementNumber = "1", CustomerName = "Tester", StatusInformation = new StatusInformation { Description = "Works as a tester" }, CustomerSegment = "student", CollateralModel = "two-co-debtors", RiskScore = 55, ChannelCode = "web", RequestDate = DateTime.Now }; var result = priceCalculator.CalculatePrice(application, arrangementRequest); var resultFees = result.Result.Conditions.Fees[0]; var variation = result.Result.Conditions.Fees[0].Variations; Assert.Equal("2", variation.Count.ToString()); var variationOne = variation[0]; var variationTwo = variation[1]; Assert.Equal("RanToCompletion", result.Status.ToString()); Assert.Equal(1, resultFees.CalculatedPercentage); Assert.Equal((decimal)0.5, variationOne.Percentage); Assert.Equal((decimal)0.6, variationTwo.Percentage); Assert.Equal("product/price-variations/iterative-multiple-fee-var-over-range.dmn", resultFees.VariationsDefinitionDMN); }
public void SetUp() { _configSvcMock = new ConfigurationServiceMock(); _dbConnFact = new DbConnectionFactory(_configSvcMock.Object); }