public static Report Transform(RawReport report) => new Report( new Header(), new Sections( SettedTrades: ParseSettledTradesSection(report.Sections.Single(a => a.Name == "1.1 Информация о совершенных и исполненных сделках на конец отчетного периода")), UnsettledTrades: ParseUnsettledTradesSection(report.Sections.Single(a => a.Name == "1.2 Информация о неисполненных сделках на конец отчетного периода")), OtherTrades: ParseOtherTradesSection(report.Sections.Single(a => a.Name == "1.3 Сделки за расчетный период, обязательства из которых прекращены не в результате исполнения")), /* * todo: * 1.4 repo contract changes sections * */ CashOperations: ParseCashFlowOperationsSection(report.Sections.Single(a => a.Name == "2. Операции с денежными средствами")), /* * todo: * 3.1 Движение по ценным бумагам инвестора * 3.2 Движение по производным финансовым инструментам * 3.3 Информация о позиционном состоянии по производным финансовым инструментам из таблицы * 4.1 Информация о ценных бумагах * 4.2 Информация об инструментах, не квалифицированных в качестве ценной бумаги * 4.3 Информация о производных финансовых инструментах */ ExchangeInformation: ParseExchangeInformation(report.Sections.Single(a => a.Name == "5.Информация о торговых площадках")), CodeDefinitions: ParseCodeDefinitionsSection(report.Sections.Single(a => a.Name == "6. Расшифровка дополнительных кодов используемых в отчете")) ), new Footer());
private static void GenerateTitleSheet(RawReport rawReport, ExcelPackage package) { var titleSheet = package.Workbook.Worksheets.Add("Intro"); titleSheet.Cells["A1"].Value = "Compiled report by kasthack.tinkoffReader"; titleSheet.Cells["A1"].Style.Font.Size *= 2; titleSheet.Row(1).Height *= 2; var rows = new[] { "Метаданные:", rawReport.Header.BrokerInfo, rawReport.Header.Investor, rawReport.Header.ReportDate, rawReport.Header.ReportRange, rawReport.Footer.BrokerName, rawReport.Footer.BrokerDivisionHead, rawReport.Footer.AccountingPerson, }; for (var i = 0; i < rows.Length; i++) { titleSheet.Cells[3 + i, 1].Value = rows[i]; } titleSheet.Cells[titleSheet.Dimension.Address].AutoFitColumns(); }
public static void Transform(RawReport rawReport, FileInfo outputPath) { var package = new ExcelPackage(); GenerateTitleSheet(rawReport, package); GenerateSectionSheets(rawReport, package); package.SaveAs(outputPath); }
private static void GenerateSectionSheets(RawReport rawReport, ExcelPackage package) { foreach (var section in rawReport.Sections) { var sectionSheet = package.Workbook.Worksheets.Add(section.Name); var xOffset = 1; var yOffset = 1; foreach (var table in section.Tables) { xOffset = WriteParentTable(sectionSheet, xOffset, yOffset, table); } sectionSheet.Cells[sectionSheet.Dimension.Address].AutoFitColumns(); } }
public async Task Handle(string queryString) { var parsedQueryString = HttpUtility.ParseQueryString(queryString); var sender = parsedQueryString[SenderParameterName]; var timestamp = parsedQueryString[TimestampParameterName]; var text = parsedQueryString[TextParameterName]; var incomingMessageId = parsedQueryString[IncomingMessageIdParameterName].ParseToNullableInt(); var outgoingMessageId = parsedQueryString[OutgoingMessageIdParameterName].ParseToNullableInt(); var modemNumber = parsedQueryString[ModemNumberParameterName].ParseToNullableInt(); var apiKey = parsedQueryString[ApiKeyParameterName]; ErrorReportData reportErrorData = null; try { Alert triggeredAlert = null; ProjectHealthRisk projectHealthRisk = null; GatewaySetting gatewaySetting = null; using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var rawReport = new RawReport { Sender = sender, Timestamp = timestamp, ReceivedAt = _dateTimeProvider.UtcNow, Text = text, IncomingMessageId = incomingMessageId, OutgoingMessageId = outgoingMessageId, ModemNumber = modemNumber, ApiKey = apiKey }; await _nyssContext.AddAsync(rawReport); var reportValidationResult = await ParseAndValidateReport(rawReport, parsedQueryString); if (reportValidationResult.IsSuccess) { gatewaySetting = reportValidationResult.GatewaySetting; projectHealthRisk = reportValidationResult.ReportData.ProjectHealthRisk; var epiDate = _dateTimeProvider.GetEpiDate(reportValidationResult.ReportData.ReceivedAt); var report = new Report { IsTraining = reportValidationResult.ReportData.DataCollector.IsInTrainingMode, ReportType = reportValidationResult.ReportData.ParsedReport.ReportType, Status = ReportStatus.New, ReceivedAt = reportValidationResult.ReportData.ReceivedAt, CreatedAt = _dateTimeProvider.UtcNow, DataCollector = reportValidationResult.ReportData.DataCollector, EpiWeek = epiDate.EpiWeek, EpiYear = epiDate.EpiYear, PhoneNumber = sender, Location = reportValidationResult.ReportData.DataCollector.Location, ReportedCase = reportValidationResult.ReportData.ParsedReport.ReportedCase, KeptCase = new ReportCase { CountMalesBelowFive = null, CountMalesAtLeastFive = null, CountFemalesBelowFive = null, CountFemalesAtLeastFive = null }, DataCollectionPointCase = reportValidationResult.ReportData.ParsedReport.DataCollectionPointCase, ProjectHealthRisk = projectHealthRisk, ReportedCaseCount = projectHealthRisk.HealthRisk.HealthRiskType == HealthRiskType.Human ? (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountFemalesAtLeastFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountFemalesBelowFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountMalesAtLeastFive ?? 0) + (reportValidationResult.ReportData.ParsedReport.ReportedCase.CountMalesBelowFive ?? 0) : 1 }; rawReport.Report = report; await _nyssContext.Reports.AddAsync(report); triggeredAlert = await _alertService.ReportAdded(report); } else { reportErrorData = reportValidationResult.ErrorReportData; gatewaySetting = reportValidationResult.GatewaySetting; } await _nyssContext.SaveChangesAsync(); transactionScope.Complete(); } if (reportErrorData == null) { if (!string.IsNullOrEmpty(gatewaySetting?.EmailAddress) && projectHealthRisk != null) { var recipients = new List <string> { sender }; await _queuePublisherService.SendSMSesViaEagle(gatewaySetting.EmailAddress, gatewaySetting.Name, recipients, projectHealthRisk.FeedbackMessage); } if (triggeredAlert != null) { await _alertService.SendNotificationsForNewAlert(triggeredAlert, gatewaySetting); } } else { await SendFeedbackOnError(reportErrorData, gatewaySetting); } } catch (ReportValidationException e) { _loggerAdapter.Warn(e.Message); } }
private async Task <ReportValidationResult> ParseAndValidateReport(RawReport rawReport, NameValueCollection parsedQueryString) { GatewaySetting gatewaySetting = null; try { var apiKey = parsedQueryString[ApiKeyParameterName]; var sender = parsedQueryString[SenderParameterName]; var timestamp = parsedQueryString[TimestampParameterName]; var text = parsedQueryString[TextParameterName]; var receivedAt = ParseTimestamp(timestamp); ValidateReceivalTime(receivedAt); rawReport.ReceivedAt = receivedAt; gatewaySetting = await ValidateGatewaySetting(apiKey); rawReport.NationalSociety = gatewaySetting.NationalSociety; var dataCollector = await ValidateDataCollector(sender, gatewaySetting.NationalSocietyId); rawReport.DataCollector = dataCollector; rawReport.IsTraining = dataCollector.IsInTrainingMode; rawReport.Village = dataCollector.Village; rawReport.Zone = dataCollector.Zone; var parsedReport = _reportMessageService.ParseReport(text); var projectHealthRisk = await ValidateReport(parsedReport, dataCollector); return(new ReportValidationResult { IsSuccess = true, ReportData = new ReportData { DataCollector = dataCollector, ProjectHealthRisk = projectHealthRisk, ReceivedAt = receivedAt, ParsedReport = parsedReport }, GatewaySetting = gatewaySetting }); } catch (ReportValidationException e) { _loggerAdapter.Warn(e); var sender = parsedQueryString[SenderParameterName]; string languageCode = null; if (gatewaySetting != null) { languageCode = await _nyssContext.NationalSocieties .Where(ns => ns.Id == gatewaySetting.NationalSocietyId) .Select(ns => ns.ContentLanguage.LanguageCode) .FirstOrDefaultAsync(); } return(new ReportValidationResult { IsSuccess = false, ErrorReportData = new ErrorReportData { Sender = sender, LanguageCode = languageCode, ReportErrorType = e.ErrorType }, GatewaySetting = gatewaySetting }); } catch (Exception e) { _loggerAdapter.Warn(e.Message); return(new ReportValidationResult { IsSuccess = false }); } }
private void GenerateDataCollectorsWithReports() { var numberOfDataCollectors = 17; var numberOfHumanDataCollectors = 10; var numberOfDataCollectionPoints = 6; var humansStartIndex = 0; var collectionPointsStartIndex = numberOfHumanDataCollectors; var numberOfTrainingHumans = 2; var numberOfTrainingCollectionPoints = 2; var numberOfReports = (numberOfDataCollectors - 1) * 2; var numberOfErrorReports = 2; DataCollectors = Enumerable.Range(1, numberOfDataCollectors) .Select(i => new DataCollector { Id = i, Project = Projects[0], Supervisor = (SupervisorUser)Users[0], DataCollectorType = DataCollectorType.Human, IsInTrainingMode = false, Reports = new List <Report>(), RawReports = new List <RawReport>(), Zone = i == numberOfDataCollectors ? Zones[i - 2] : Zones[i - 1], Village = i == numberOfDataCollectors ? Zones[i - 2].Village : Zones[i - 1].Village }) .ToList(); DataCollectors.GetRange(collectionPointsStartIndex, numberOfDataCollectionPoints).ForEach(dc => dc.DataCollectorType = DataCollectorType.CollectionPoint); DataCollectors.GetRange(humansStartIndex, numberOfTrainingHumans).ForEach(dc => dc.IsInTrainingMode = true); DataCollectors.GetRange(collectionPointsStartIndex, numberOfTrainingCollectionPoints).ForEach(dc => dc.IsInTrainingMode = true); Reports = Enumerable.Range(1, numberOfReports) .Select(i => new Report { Id = i, DataCollector = DataCollectors[(i - 1) / 2], Status = ReportStatus.New }) .ToList(); Reports.ForEach(r => { r.IsTraining = r.DataCollector.IsInTrainingMode; r.CreatedAt = BaseDate.AddDays(r.Id - 1); r.ReceivedAt = r.CreatedAt; r.EpiWeek = _dateTimeProvider.GetEpiDate(r.CreatedAt).EpiWeek; r.EpiYear = _dateTimeProvider.GetEpiDate(r.CreatedAt).EpiYear; r.ProjectHealthRisk = ProjectHealthRisks[(r.Id - 1) % 3 == 0 ? 0 : 1]; r.RawReport = new RawReport { Id = r.Id, DataCollector = r.DataCollector, NationalSociety = NationalSocieties[0], IsTraining = r.IsTraining, Village = r.DataCollector.Village, Zone = r.DataCollector.Zone, Report = r }; r.DataCollector.Reports.Add(r); r.ProjectHealthRisk.Reports.Add(r); }); Reports.Where(r => r.DataCollector.DataCollectorType == DataCollectorType.Human).ToList() .ForEach(r => { r.ReportedCaseCount = (r.Id % 4) switch { 0 => 1, 1 => 1, 2 => 1, 3 => 1, _ => (r.ReportedCase.CountMalesBelowFive ?? 0) + (r.ReportedCase.CountFemalesAtLeastFive ?? 0) + (r.ReportedCase.CountFemalesBelowFive ?? 0) + (r.ReportedCase.CountMalesAtLeastFive ?? 0) + (r.DataCollectionPointCase.DeathCount ?? 0) + (r.DataCollectionPointCase.FromOtherVillagesCount ?? 0) + (r.DataCollectionPointCase.ReferredCount ?? 0) }; r.ReportedCase = (r.Id % 4) switch { 0 => new ReportCase { CountMalesBelowFive = 1, CountMalesAtLeastFive = 0, CountFemalesBelowFive = 0, CountFemalesAtLeastFive = 0 }, 1 => new ReportCase { CountMalesAtLeastFive = 1, CountFemalesBelowFive = 0, CountFemalesAtLeastFive = 0, CountMalesBelowFive = 0 }, 2 => new ReportCase { CountFemalesBelowFive = 1, CountMalesBelowFive = 0, CountMalesAtLeastFive = 0, CountFemalesAtLeastFive = 0 }, 3 => new ReportCase { CountFemalesAtLeastFive = 1, CountMalesBelowFive = 0, CountFemalesBelowFive = 0, CountMalesAtLeastFive = 0 }, _ => r.ReportedCase }; }); var test = Reports.Where(r => r.DataCollector.DataCollectorType == DataCollectorType.CollectionPoint).ToList(); Reports.Where(r => r.DataCollector.DataCollectorType == DataCollectorType.CollectionPoint).ToList() .ForEach(r => { r.ReportType = ReportType.DataCollectionPoint; r.ReportedCase = (r.Id % 4) switch { 0 => new ReportCase { CountMalesBelowFive = 1, CountMalesAtLeastFive = 0, CountFemalesBelowFive = 0, CountFemalesAtLeastFive = 0 }, 1 => new ReportCase { CountMalesAtLeastFive = 1, CountFemalesBelowFive = 0, CountFemalesAtLeastFive = 0, CountMalesBelowFive = 0 }, 2 => new ReportCase { CountFemalesBelowFive = 1, CountMalesBelowFive = 0, CountMalesAtLeastFive = 0, CountFemalesAtLeastFive = 0 }, 3 => new ReportCase { CountFemalesAtLeastFive = 1, CountMalesBelowFive = 0, CountFemalesBelowFive = 0, CountMalesAtLeastFive = 0 }, _ => r.ReportedCase }; r.DataCollectionPointCase = (r.Id % 3) switch { 0 => new DataCollectionPointCase { FromOtherVillagesCount = 1, ReferredCount = 0, DeathCount = 0 }, 1 => new DataCollectionPointCase { ReferredCount = 1, FromOtherVillagesCount = 0, DeathCount = 0 }, 2 => new DataCollectionPointCase { DeathCount = 1, FromOtherVillagesCount = 0, ReferredCount = 0 }, _ => r.DataCollectionPointCase }; r.ReportedCaseCount = (r.Id % 4) switch { 0 => 1, 1 => 1, 2 => 1, 3 => 1, _ => (r.ReportedCase.CountMalesBelowFive ?? 0) + (r.ReportedCase.CountFemalesAtLeastFive ?? 0) + (r.ReportedCase.CountFemalesBelowFive ?? 0) + (r.ReportedCase.CountMalesAtLeastFive ?? 0) + (r.DataCollectionPointCase.DeathCount ?? 0) + (r.DataCollectionPointCase.FromOtherVillagesCount ?? 0) + (r.DataCollectionPointCase.ReferredCount ?? 0) }; }); RawReports = new List <RawReport>(); Reports.ForEach(r => { var rawReport = new RawReport { Id = r.Id, DataCollector = r.DataCollector, ReceivedAt = r.ReceivedAt, IsTraining = r.IsTraining, Report = r }; RawReports.Add(rawReport); }); var errorReports = Enumerable.Range(1, numberOfErrorReports) .Select(i => new RawReport { Id = i + numberOfReports, DataCollector = DataCollectors[DataCollectors.Count - 1], ReceivedAt = BaseDate.AddDays(i - 1), IsTraining = false }).ToList(); RawReports.AddRange(errorReports); RawReports.ForEach(r => r.DataCollector.RawReports.Add(r)); }