public async Task <decimal> GetPrice(string schemecode, DateTime date) { decimal price = 0; var history = await GetHistory(schemecode); NavHistory fund = null; do { fund = history.Find(x => x.Date.Date == date.Date); if (fund != null) { price = fund.nav; } date = date.AddDays(-1); }while (fund == null); return(price); }
private async Task <decimal> FetchLatestNavPrice(string schemecode) { decimal price = 0; LatestNavPrice lastestNavPrice = FetchCachedPrice(schemecode); if (lastestNavPrice != null) { price = lastestNavPrice.NavPrice; } else { MutualFundProxy proxy = new MutualFundProxy(); NavHistory nav = await proxy.GetLatestPrice(schemecode); UpdateCache(schemecode, nav); price = nav.nav; } return(price); }
private void UpdateCache(string schemecode, NavHistory latestNav) { using (var context = new InvestmentTrackerDbContext()) { var latest = context.LatestNavPrice.Where(x => x.SchemeCode == schemecode).SingleOrDefault(); if (latest == null) { context.LatestNavPrice.Add(new LatestNavPrice { SchemeCode = schemecode, LastFetch = DateTime.Now.GetIndianDateTime().Date, Date = latestNav.Date, NavPrice = latestNav.nav }); } else { latest.LastFetch = DateTime.Now.GetIndianDateTime(); latest.Date = latestNav.Date; latest.NavPrice = latestNav.nav; } context.SaveChanges(); } }
public async Task <ActionResult> InsertInvestor([FromBody] InvestorViewModel viewModel) { try { var investor = new Investor(viewModel); var invCnt = dbContext.Investors.Count(); dbContext.Investors.Add(investor); var usd = dbContext.Assets.FirstOrDefault(a => a.Name == "USD"); if (usd != null) { usd.Quantity += investor.AmountInvested; dbContext.Assets.Update(usd); if (invCnt == 0) { var time = DateTime.Now; var nav = new NavHistory { Date = time, Value = usd.Quantity / investor.SharesReceived }; var rate = await coinApi.GetCurrencyRateToUsd("BTC"); var btc = new BtcHistory { Date = time, Value = rate.Rate }; dbContext.NavHistories.Add(nav); dbContext.BtcHistories.Add(btc); //if (!dbContext.Assets.ToList().Exists(a => a.ShortName == "BTC")) //{ // try // { // var rate = await coinApi.GetCurrencyRateToUsd("BTC"); // var currency = dbContext.Currencies.FirstOrDefault(c => c.ShortName == "BTC"); // if (currency != null) // { // currency.Rate = rate.Rate; // dbContext.Currencies.Update(currency); // } // dbContext.CurrencyRates.Add(rate); // } // catch (Exception e) // { // Console.WriteLine(e); // } //} } } dbContext.SaveChanges(); return(this.Json(new MetaResponse <object> { StatusCode = 200 })); } catch (Exception e) { Console.WriteLine(e); return(this.Json(new MetaResponse <object> { StatusCode = 200 })); } }
private async Task UpdateDatabase() { using (var scope = _scopeFactory.CreateScope()) { var coinApi = new CoinApi(_configuration); var dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>(); var navs = dbContext.NavHistories.ToList(); if (navs.Count > 0) { var latestNav = navs.Last(); var timeDiff = latestNav.Date - DateTime.Now; if (Math.Abs(timeDiff.Hours) < 3) { return; } } var assets = dbContext.Assets.ToList(); var investors = await dbContext.Investors.ToListAsync(); if (investors.Count == 0) { return; } var sum = assets.Sum(a => a.Price * a.Quantity); var totalShares = investors.Sum(investor => investor.SharesReceived); var time = DateTime.Now; var nav = new NavHistory { Date = time, Value = sum / totalShares }; var rate = await coinApi.GetCurrencyRateToUsd("BTC"); var btc = new BtcHistory { Date = time, Value = rate.Rate }; dbContext.NavHistories.Add(nav); dbContext.BtcHistories.Add(btc); dbContext.SaveChanges(); //if (!assets.Exists(a => a.ShortName == "BTC")) //{ // try // { // var currency = dbContext.Currencies.FirstOrDefault(c => c.ShortName == "BTC"); // if (currency != null) // { // currency.Rate = rate.Rate; // dbContext.Currencies.Update(currency); // } // dbContext.CurrencyRates.Add(rate); // } // catch (Exception e) // { // Console.WriteLine(e); // } //} } }