public CalculateNpvResponse CalculateNpv(CalculateNpvRequest request) { var result = new CalculateNpvResponse(); var discountDetail = request.DiscountRateDetail; var noIncrement = discountDetail.IncrementPercentage == 0; for (var discountPercentage = discountDetail.LowerBoundPercentage; discountPercentage <= discountDetail.UpperBoundPercentage; discountPercentage += discountDetail.IncrementPercentage) { var npvsForDiscount = CalculateNpvForDiscount(request.InitialInvestment, request.CashFlows, discountPercentage); result.Add(new NpvResult { DiscountPercentage = discountPercentage, PeriodNpvs = npvsForDiscount, Npv = npvsForDiscount.LastOrDefault() }); if (noIncrement) { break; } } return(result); }
public override void SetUp() { base.SetUp(); _validCalculateNpvRequest = new CalculateNpvRequest { CashFlows = new List <double> { 1000, 2000, 3000 }, DiscountRateDetail = DiscountRateDetailValidatorTests.CreateValidDiscountRateDetail(), InitialInvestment = 10000 }; }
public IActionResult CalculateNpv([FromBody] CalculateNpvRequest request) { if (request == null || !ModelState.IsValid) { return(BadRequest(ModelState.GetFirstError() ?? GenericErrorMessage)); } try { var result = _npvCalculator.CalculateNpv(request); return(Ok(result)); } catch { return(BadRequest(GenericErrorMessage)); } }
public void CalculateNpv_ShouldCalculateNpvForDifferentDiscounts() { var request = new CalculateNpvRequest { InitialInvestment = 12000, CashFlows = new List <double> { 2500, 4000, 5000, 3000, 1000 }, DiscountRateDetail = new DiscountRateDetail { LowerBoundPercentage = 1, UpperBoundPercentage = 15, IncrementPercentage = 0.25 } }; var target = CreateTarget(); var result = target.CalculateNpv(request); result.Should().HaveCount(57); result.All(r => r.PeriodNpvs.Count == 5).Should().BeTrue(); var tolerance = 0.0001; var firstResult = result.First(); firstResult.DiscountPercentage.Should().Be(1); firstResult.PeriodNpvs.Last().Should().Be(firstResult.Npv); firstResult.Npv.Should().BeApproximately(3083.7891, tolerance); var midResult = result[23]; midResult.DiscountPercentage.Should().Be(6.75); midResult.PeriodNpvs.Last().Should().Be(midResult.Npv); midResult.Npv.Should().BeApproximately(993.8657, tolerance); var lastResult = result.Last(); lastResult.DiscountPercentage.Should().Be(15); lastResult.PeriodNpvs.Last().Should().Be(lastResult.Npv); lastResult.Npv.Should().BeApproximately(-1301.4947, tolerance); }