Ejemplo n.º 1
0
        public bool AddToHistory(NetPresentValueRequest netPresentValueRequest)
        {
            List <NPV_HISTORY_CASHFLOWS> lstCashFlows = new List <NPV_HISTORY_CASHFLOWS>();
            int counter = 1;

            foreach (decimal cashFlow in netPresentValueRequest.cashFlows)
            {
                lstCashFlows.Add(new NPV_HISTORY_CASHFLOWS()
                {
                    ID        = Guid.NewGuid(),
                    CASH_FLOW = cashFlow,
                    ORDER     = counter
                });
                counter++;
            }

            NPV_HISTORY npv_history = new NPV_HISTORY()
            {
                ID                        = Guid.NewGuid(),
                INITIAL_VALUE             = netPresentValueRequest.initialValue,
                LOWER_BOUND_DISCOUNT_RATE = netPresentValueRequest.lowerBoundDiscountRate,
                UPPER_BOUND_DISCOUNT_RATE = netPresentValueRequest.upperBoundDiscountRate,
                INCREMENT                 = netPresentValueRequest.increment,
                CREATED_DATE              = DateTime.Now,
                NPV_HISTORY_CASHFLOWS     = lstCashFlows
            };

            unitOfWork.NPVHistory.Add(npv_history);
            return(unitOfWork.SaveChanges() > 0);
        }
Ejemplo n.º 2
0
        public async Task <int> AddNetPresentValue(Guid userId, NetPresentValueRequest request)
        {
            //if (await _context.NetPresentValues.AnyAsync(r => r.Name == request.Name))
            //    throw new Exception($"Error: NetPresentValue '{request.Name}' already exists");

            var npv = new Entities.NetPresentValue()
            {
                Name = null,
                InitialInvestment      = request.InitialInvestment,
                LowerBoundDiscountRate = request.LowerBoundDiscountRate,
                UpperBoundDiscountRate = request.UpperBoundDiscountRate,
                DiscountRateIncrement  = request.DiscountRateIncrement,
                CreatedDate            = DateTime.UtcNow
            };

            /* https://devblogs.microsoft.com/cesardelatorre/using-resilient-entity-framework-core-sql-connections-and-transactions-retries-with-exponential-backoff/ */
            var strategy = _context.Database.CreateExecutionStrategy();
            await strategy.ExecuteAsync(async() =>
            {
                using (var transaction = _context.Database.BeginTransaction())
                {
                    int saveCount = 0;

                    await _context.NetPresentValues.AddAsync(npv);
                    saveCount = await _context.SaveChangesAsync();

                    var cashFlows = request.CashFlows.Where(cf => cf.Amount != 0).Select(cf => new Entities.PeriodAmount()
                    {
                        NetPresentValueId = npv.NetPresentValueId,
                        Amount            = cf.Amount,
                        Period            = cf.Period
                    });

                    await _context.PeriodAmounts.AddRangeAsync(cashFlows);
                    saveCount = await _context.SaveChangesAsync();

                    var userNpv = new Entities.UserNetPresentValue()
                    {
                        UserId            = userId,
                        NetPresentValueId = npv.NetPresentValueId
                    };

                    await _context.UserNetPresentValues.AddAsync(userNpv);
                    saveCount = await _context.SaveChangesAsync();

                    transaction.Commit();
                }
            });

            return(npv.NetPresentValueId);
        }
Ejemplo n.º 3
0
        public IEnumerable <NPVPerDiscountRateDTO> ComputeNetPresentValues(NetPresentValueRequest netPresentValueRequest)
        {
            while (netPresentValueRequest.lowerBoundDiscountRate <= netPresentValueRequest.upperBoundDiscountRate)
            {
                decimal npv = ComputeNetPresentValue(netPresentValueRequest.cashFlows, netPresentValueRequest.initialValue, netPresentValueRequest.lowerBoundDiscountRate);
                yield return(new NPVPerDiscountRateDTO()
                {
                    DiscountRate = netPresentValueRequest.lowerBoundDiscountRate,
                    NPV = npv
                });

                netPresentValueRequest.lowerBoundDiscountRate += netPresentValueRequest.increment;
                if (netPresentValueRequest.increment == 0)
                {
                    break;
                }
            }
        }