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); }
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); }
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; } } }