public static bool SecurityCheck(IEnumerable <ShareClassDto> actualShareClassList, ExpectedResultDto dto, Logger logger) { bool hasPassedSecurity = true; // Security check 1: ISIN and currency in report are existing and the same as in internal DB var shareClass = actualShareClassList .FirstOrDefault( sc => sc.Isin == dto.Isin && sc.CurrencyShare == dto.CurrencyShare); if (shareClass == null) { logger.Error(string.Format(ErrorMessages.InvalidIsin, dto.Isin, dto.CurrencyShare));; hasPassedSecurity = false; } // Missing internal provider check if (shareClass.Provider == null) { logger.Error(string.Format(ErrorMessages.MissingProvider, dto.Isin));; hasPassedSecurity = false; } // Security check 2: Provider matching if (shareClass.Provider != dto.ProviderName) { logger.Error(string.Format(ErrorMessages.InvalidProvider, dto.Isin, dto.ProviderName)); hasPassedSecurity = false; } // Security check 3: Nav date matching expected date from internal DB if (shareClass.ExpectedNavDate != dto.DateReport) { logger.Error(string.Format(ErrorMessages.InvalidExpectedDate, dto.Isin, dto.DateReport)); hasPassedSecurity = false; } // Security check 4: Aggregated sf Aum and share sum of AuM have same result //if (shareClass == null) //{ // logger.Error(string.Format(ErrorMessages.InvalidAuM, isin, currency)); // hasPassedSecurity = false; //} // Set shareclass Id dto.Id = shareClass.IdShareClass; return(hasPassedSecurity); }
public static List <TimeSerie> ProcessData(Provider provider, string csv_file_path, Logger logger) { var records = new List <TimeSerie>(); bool didPassSecurity = true; try { var queryDate = File.GetCreationTime(csv_file_path); // Test date //var queryDate = new DateTime(2020, 07, 23); // Retrieve shareclass sql table by date of today to perform security checks var actualShareClassList = SqlService.GetShareClassList(queryDate, logger); using (var streamReader = new StreamReader(csv_file_path)) { using (CsvReader reader = new CsvReader(streamReader, CultureInfo.InvariantCulture)) { reader.Configuration.Delimiter = GlobalConstants.RequiredDelimiter; reader.Read(); reader.ReadHeader(); while (reader.Read()) { var headers = provider.Headers.ToArray(); //Expected result coming from official file - isin, currencyShare, dateReport ExpectedResultDto dto = new ExpectedResultDto(); dto.ProviderId = provider.Id; dto.ProviderName = provider.Title; var dateField = reader.GetField(headers[IndexNavDate].Name); dto.DateReport = new DateTime(Convert.ToInt32(dateField.Substring(0, 4)), // Year Convert.ToInt32(dateField.Substring(4, 2)), // Month Convert.ToInt32(dateField.Substring(6, 2))); // Day dto.CurrencyShare = reader.GetField(headers[IndexCurrency].Name); dto.Isin = reader.GetField(headers[IndexIsin].Name); // Map time series types between xml and source var types = new List <TimeSerieType>(); for (int i = CountHeadersToSkip; i < headers.Length; i++) { var type = new TimeSerieType { Id = headers[i].Id_TS, Value = reader.GetField <decimal>(headers[i].Name), }; types.Add(type); } // Check result from security before creating new entity didPassSecurity = Controller.SecurityCheck(actualShareClassList, dto, logger); if (!didPassSecurity) { records = null; continue; } // Different time series type creates new entry in DB foreach (var type in types) { var record = new TimeSerie { date_ts = dto.DateReport, id_ts = type.Id, value_ts = type.Value, currency_ts = dto.CurrencyShare, provider_ts = dto.ProviderId, id_shareclass = dto.Id, file_name = Path.GetFileName(csv_file_path), }; records.Add(record); } } } } } catch (Exception ex) { didPassSecurity = true; logger.Error(ex.Message); } if (!didPassSecurity) { return(null); } return(records); }