예제 #1
0
        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));
            }
        }
예제 #4
0
        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);
        }