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());
示例#2
0
        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();
        }
示例#3
0
        public static void Transform(RawReport rawReport, FileInfo outputPath)
        {
            var package = new ExcelPackage();

            GenerateTitleSheet(rawReport, package);
            GenerateSectionSheets(rawReport, package);

            package.SaveAs(outputPath);
        }
示例#4
0
        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();
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
        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
                });
            }
        }
示例#7
0
        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));
        }