示例#1
0
        /// <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);
            }
        }
示例#2
0
        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);
            }
        }