/// <summary> /// Get statements from data provider and insert it to database. /// </summary> /// <param name="simId">The sim identifier.</param> /// <returns></returns> public async Task <bool> UpdateStatements(string simId) { if (simId.IsNullOrWhiteSpace()) { return(false); } var cd = _hcl.GetCompanyDetails(simId); if (cd.LastUpdate != null && ((TimeSpan)(DateTime.Now - cd.LastUpdate)).Days < 30) { return(true); } var companyFinancials = await ObtainCompanyFinancilasAsync(simId); if (companyFinancials == null || companyFinancials.Count == 0) { return(false); } var cfMdl = new List <CompanyFinancialsMd>(); var oldcfML = _dbconCompany.Get(o => o.SimId.Equals(simId)).ToList(); foreach (var(companyFinancial, oldcf) in from companyFinancial in companyFinancials let oldcf = oldcfML.Where(o => o.SimId.Equals(companyFinancial.SimId) && o.FYear == companyFinancial.FYear && o.Statement == companyFinancial.Statement).FirstOrDefault() select(companyFinancial, oldcf)) { cfMdl.Add(new CompanyFinancialsMd(companyFinancial)); if (oldcf != null) { cfMdl.Last().Id = oldcf.Id; } } try { var returnValue = await _dbconCompany.UpdateMultiple(cfMdl); if (returnValue == false) { return(false); } await RemoveUnwantedRecords(cfMdl, oldcfML); returnValue = await _hcl.UpdateCompanyDetailAsync(simId, cfMdl.First().IndustryTemplate); return(returnValue); } catch (Exception ex) { Console.WriteLine($"Error in method HandleFinacials:UpdateStatments\n{ex.Message}"); return(false); } }
public async Task UpdateAnalysis() { var ac = await _hcl.GetAllCompaniesFromDbAsync(); try { await _dfr.ParseKeyFinanceFromS3(ServiceExtensions.BucketName, ServiceExtensions.Region, "1. Key Ratios.xlsx"); } catch (Exception ex) { _logger.LogError($"Error while reading excel file\n{ex.Message}"); return; } var result = await _dbpiScore.RemoveAll(); _logger.LogDebug($"Excel file contains {_dfr.dataCollection.Count}"); List <DataCollection> dcl = _dfr.dataCollection; List <CompanyDetail> allCompanies = await _hcl.GetAllCompaniesFromDbAsync(); var counter = 0; var newValues = new List <PiotroskiScoreMd>(); var updateTime = DateTime.Now; foreach (var dc in dcl) { if (string.IsNullOrWhiteSpace(dc.CompanyName) || string.IsNullOrWhiteSpace(dc.Ticker)) { _logger.LogDebug($"Skipping {dc.CompanyName} => {dc.Ticker} due to missing details"); continue; } var selected = (from comp in allCompanies where (comp.Ticker == dc.Ticker && comp.Name == dc.CompanyName) select comp).FirstOrDefault(); if (selected == null) { _logger.LogDebug("Referential integrity error"); _logger.LogDebug($"Did not find {dc.CompanyName} => {dc.Ticker} in Company Details"); continue; } var ProfitablityRatios = new Dictionary <string, decimal> { { "Gross Margin", (decimal)dc.GrossMargin }, { "Operating Margin", (decimal)dc.OperatingMargin }, { "Net Profit Margin", (decimal)dc.NetMargin }, { "Return on Equity", (decimal)dc.ReturnOnEquity }, { "Return on Assets", (decimal)dc.ReturnOnAssets } }; var newValue = new PiotroskiScore { SimId = selected.SimId, FYear = DateTime.Now.Year, Rating = dc.PiotroskiScoreCurrent, EBITDA = (long)dc.EbitdaCurrent, LastUpdate = DateTime.Now, ProfitablityRatios = ProfitablityRatios, Revenue = dc.Revenue, Ticker = dc.Ticker }; newValues.Add(Mapper.Map <PiotroskiScoreMd>(newValue)); newValue.ProfitablityRatios.Clear(); UpdateAnalysis(newValue, DateTime.Now.Year - 1, dc.PiotroskiScore1YrAgo, dc.Ebitda1YrAgo); newValues.Add(Mapper.Map <PiotroskiScoreMd>(newValue)); UpdateAnalysis(newValue, DateTime.Now.Year - 2, dc.PiotroskiScore2YrAgo, dc.Ebitda2YrAgo); newValues.Add(Mapper.Map <PiotroskiScoreMd>(newValue)); UpdateAnalysis(newValue, DateTime.Now.Year - 3, dc.PiotroskiScore3YrAgo, dc.Ebitda3YrAgo); newValues.Add(Mapper.Map <PiotroskiScoreMd>(newValue)); selected.LastUpdate = updateTime; await _hcl.UpdateCompanyDetailAsync(selected.SimId, dc.Sector, updateTime); if (++counter % 500 == 0) { Console.WriteLine($"Updated {counter} firms {DateTime.Now}"); _logger.LogDebug($"Updated {counter} firms"); await _dbpiScore.Create(newValues); newValues.Clear(); } } if (newValues.Any()) { Console.WriteLine($"Updated {counter} firms"); _logger.LogDebug($"Updated {counter} firms"); await _dbpiScore.Create(newValues); } }