From 717e861fe0f3aa4e693523017f5db33515f7343e Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 30 Jun 2023 15:20:14 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-358 (report builders) --- .../reports/config/ReportBuildersConfig.java | 9 + .../config/validation/ValidationConfig.java | 12 +- .../reports/reports/CSVReportBuilder.java | 5 + .../bp/ExecutedDealReportBuilderCommon.java | 30 +- .../bp/UnfulfilledDealReportBuilder.java | 59 +- .../ks/KSRepCashNettoReportBuilder.java | 104 ++++ .../KSRepCashRegisterSumsReportBuilder.java | 111 ++++ .../ks/KSRepCashRegistersReportBuilder.java | 140 +++++ .../ks/KSRepDepoNettoReportBuilder.java | 106 ++++ ...epDepoRegisterQuantitiesReportBuilder.java | 114 ++++ .../ks/KSRepDepoRegistersReportBuilder.java | 141 +++++ .../ks/KSRepFirmDetailsReportBuilder.java | 121 ++++ .../reports/ks/KSRepTradesReportBuilder.java | 172 ++++++ ...iceTest.java => ReportServiceTest_BP.java} | 32 +- .../services/ReportServiceTest_KS.java | 557 ++++++++++++++++++ .../KS_BR_PFX64_INFTYPE_1_expected.csv | 2 - .../KS_BR_PFX64_INFTYPE_2_expected.csv | 2 - .../KS_BR_PFX64_INFTYPE_3_expected.csv | 2 - .../KS_BR_PFX64_INFTYPE_4_expected.csv | 2 - .../KS_BR_PFX64_empty_expected.csv | 1 - .../bp/KS_BR_PFX64_INFTYPE_1_expected.csv | 2 + .../bp/KS_BR_PFX64_INFTYPE_2_expected.csv | 2 + .../bp/KS_BR_PFX64_INFTYPE_3_expected.csv | 2 + .../bp/KS_BR_PFX64_INFTYPE_4_expected.csv | 2 + .../bp/KS_BR_PFX64_empty_expected.csv | 1 + ...perational_liabilities_claims_expected.csv | 0 .../operational_money_change_expected.csv | 0 .../period_liabilities_claims_expected.csv | 0 .../{ => bp}/period_money_change_expected.csv | 0 .../summary_liabilities_claims_expected.csv | 0 .../summary_money_change_expected.csv | 0 .../bp/unfulfilled_deal_report_expected.csv | 2 + .../ks/KS_REP_CASH_NETTO_expected.csv | 2 + .../ks/KS_REP_CASH_REGISTERS_expected.csv | 2 + .../ks/KS_REP_CASH_REGISTER_SUMS_expected.csv | 2 + .../ks/KS_REP_DEPO_NETTO_expected.csv | 2 + .../ks/KS_REP_DEPO_REGISTERS_expected.csv | 2 + ..._REP_DEPO_REGISTER_QUANTITIES_expected.csv | 2 + .../ks/KS_REP_FIRM_DETAILS_expected.csv | 2 + .../ks/KS_REP_TRADES_expected.csv | 3 + .../unfulfilled_deal_report_expected.csv | 2 - .../platform/enumeration/CoverageStatus.java | 21 + .../platform/enumeration/ReportType.java | 8 + 43 files changed, 1710 insertions(+), 71 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepFirmDetailsReportBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java rename clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/{ReportServiceTest.java => ReportServiceTest_BP.java} (97%) create mode 100644 clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_empty_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/operational_liabilities_claims_expected.csv (100%) rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/operational_money_change_expected.csv (100%) rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/period_liabilities_claims_expected.csv (100%) rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/period_money_change_expected.csv (100%) rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/summary_liabilities_claims_expected.csv (100%) rename clearing-parent/reports-service/src/test/resources/expected_reports_csv/{ => bp}/summary_money_change_expected.csv (100%) create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/unfulfilled_deal_report_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv create mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv delete mode 100644 clearing-parent/reports-service/src/test/resources/expected_reports_csv/unfulfilled_deal_report_expected.csv create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CoverageStatus.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java index b88e8fd6f..df1f4b839 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.clearing.reports.reports.*; import ru.spcex.clearing.reports.reports.bp.*; +import ru.spcex.clearing.reports.reports.ks.*; import ru.spcex.platform.enumeration.ReportType; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -18,6 +19,12 @@ public class ReportBuildersConfig { Map>> resultMap = new HashMap<>(); resultMap.put(ReportType.SUMMARY_LIABILITIES_CLAIMS, List.of(new SummaryLiabilitiesClaimsReportBuilder(imdgProvider))); resultMap.put(ReportType.SUMMARY_MONEY_CHANGE, List.of(new SummaryMoneyChangeReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_CASH_REGISTERS, List.of(new KSRepCashRegistersReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_CASH_REGISTER_SUMS, List.of(new KSRepCashRegisterSumsReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_DEPO_REGISTERS, List.of(new KSRepDepoRegistersReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, List.of(new KSRepDepoRegisterQuantitiesReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_TRADES, List.of(new KSRepTradesReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_FIRM_DETAILS, List.of(new KSRepFirmDetailsReportBuilder(imdgProvider))); return resultMap; } @@ -35,6 +42,8 @@ public class ReportBuildersConfig { ) ); resultMap.put(ReportType.UNFULFILLED_DEAL_REPORT, List.of(new UnfulfilledDealReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_CASH_NETTO, List.of(new KSRepCashNettoReportBuilder(imdgProvider))); + resultMap.put(ReportType.KS_REP_DEPO_NETTO, List.of(new KSRepDepoNettoReportBuilder(imdgProvider))); return resultMap; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java index 650fa6668..7c67f6866 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java @@ -60,7 +60,13 @@ public class ValidationConfig { ReportRequest::getReportId, new IEnumKey[]{ ReportType.SUMMARY_LIABILITIES_CLAIMS, - ReportType.SUMMARY_MONEY_CHANGE + ReportType.SUMMARY_MONEY_CHANGE, + ReportType.KS_REP_CASH_REGISTERS, + ReportType.KS_REP_CASH_REGISTER_SUMS, + ReportType.KS_REP_DEPO_REGISTERS, + ReportType.KS_REP_DEPO_REGISTER_QUANTITIES, + ReportType.KS_REP_TRADES, + ReportType.KS_REP_FIRM_DETAILS }, ReportError.WrongFieldValue, ReportError.RequiredFieldEmpty) @@ -82,7 +88,9 @@ public class ValidationConfig { ReportType.OPERATIONAL_LIABILITIES_CLAIMS, ReportType.OPERATIONAL_MONEY_CHANGE, ReportType.EXECUTED_DEAL_REPORT, - ReportType.UNFULFILLED_DEAL_REPORT + ReportType.UNFULFILLED_DEAL_REPORT, + ReportType.KS_REP_CASH_NETTO, + ReportType.KS_REP_DEPO_NETTO, }, ReportError.WrongFieldValue, ReportError.RequiredFieldEmpty), diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java index aa1c830fb..3cf079b85 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/CSVReportBuilder.java @@ -4,12 +4,14 @@ import com.opencsv.CSVWriterBuilder; import com.opencsv.ICSVWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.format.datetime.standard.InstantFormatter; import ru.spcex.platform.enumeration.ReportType; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.text.DecimalFormat; import java.time.format.DateTimeFormatter; import java.util.List; @@ -21,9 +23,12 @@ import java.util.List; public abstract class CSVReportBuilder

{ protected static final Logger log = LoggerFactory.getLogger(CSVReportBuilder.class); + protected DecimalFormat df02Format = new DecimalFormat("#0.00"); protected DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); protected DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); + protected DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); + protected InstantFormatter instantFormatter = new InstantFormatter(); /** * Метод получения заголовков для CSV отчета diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java index c2d7ab7e7..b7a630692 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/ExecutedDealReportBuilderCommon.java @@ -14,10 +14,7 @@ import java.math.RoundingMode; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilder { protected final DateTimeFormatter fileNameDateTimeFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); @@ -26,7 +23,7 @@ public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilde private final Imdg sTradesImdg; private final String[] headers = { - "id", "securityId", "tradeNo", "tradeDate", "tradeTime", + "securityId", "tradeNo", "tradeDate", "tradeTime", "settleDate", "settleCode", "price", "quanity", "value" }; private List lines = null; @@ -58,12 +55,17 @@ public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilde protected void collect(T params) { Collection executionFonds = getExecutionFondsForReport(params); + Map activeCompanyForId = new HashMap<>(); lines = new ArrayList<>(executionFonds.size()); - long reportRowId = 0L; for (ExecutionFond executionFond : executionFonds) { try { - Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId()); - if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; + Boolean activeCompany = activeCompanyForId.get(executionFond.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(executionFond.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; STrades sTrade = null; if (executionFond.getSide() != null && executionFond.getExchangeExecutionId() != null) { @@ -75,8 +77,7 @@ public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilde ); } - String id = String.valueOf(reportRowId++); - String securityId = String.valueOf(executionFond.getSecurityId()); + String securityId = String.valueOf(executionFond.getSecuritySymbol()); String tradeNo = String.valueOf(executionFond.getExchangeExecutionId()); String tradeDate = ""; String tradeTime = ""; @@ -84,15 +85,15 @@ public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilde if (executionFond.getTradingDate() != null) { tradeDate = dateFormatter.format(executionFond.getTradingDate()); } - if (executionFond.getCreated() != null) { - tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getCreated(), ZoneId.systemDefault())); + if (executionFond.getExchangeExecutionTime() != null) { + tradeTime = dateFormatter.format(LocalDate.ofInstant(executionFond.getExchangeExecutionTime(), ZoneId.systemDefault())); } if (executionFond.getSettlementDate() != null) { settleDate = dateFormatter.format(executionFond.getSettlementDate()); } String settleCode = sTrade != null ? sTrade.getSettleCode() : ""; - String quantity = String.valueOf(executionFond.getQuantity()); - String value = String.valueOf(executionFond.getSettlementAmount()); + String quantity = executionFond.getQuantity() != null ? String.valueOf(executionFond.getQuantity()) : ""; + String value = executionFond.getSettlementAmount() != null ? String.valueOf(executionFond.getSettlementAmount()) : ""; String price = ""; if (executionFond.getSettlementAmount() != null && executionFond.getQuantity() != null) { price = String.valueOf(executionFond.getSettlementAmount().divide(executionFond.getQuantity(), RoundingMode.HALF_UP)); @@ -100,7 +101,6 @@ public abstract class ExecutedDealReportBuilderCommon extends CSVReportBuilde int valueIdx = 0; String[] line = new String[getHeaders().length]; - line[valueIdx++] = id; line[valueIdx++] = securityId; line[valueIdx++] = tradeNo; line[valueIdx++] = tradeDate; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java index ca3a03b8b..20ceb6362 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/UnfulfilledDealReportBuilder.java @@ -15,17 +15,14 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; public class UnfulfilledDealReportBuilder extends CSVReportBuilder { private final Imdg executionFondImdg; private final Imdg companyImdg; private final Imdg sTradesImdg; private final String[] headers = { - "id", "securityId", "tradeNo", "tradeDate", "settleCode" + "securityId", "tradeNo", "tradeDate", "settleCode" }; private List lines = null; @@ -64,32 +61,40 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder executionFonds = executionFondImdg.getCollectionObjectsByPredicate(predicate); - long reportRowId = 0L; + Map activeCompanyForId = new HashMap<>(); lines = new ArrayList<>(executionFonds.size()); for (ExecutionFond executionFond : executionFonds) { - Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId()); - if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; - STrades sTrade = sTradesImdg.getSingleObjectByFieldValues( - Map.of( - "settleCode", executionFond.getSettlementCode(), - "operation", executionFond.getSide() - ) - ); + try { + Boolean activeCompany = activeCompanyForId.get(executionFond.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(executionFond.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(executionFond.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; - String id = String.valueOf(reportRowId++); - String securityId = String.valueOf(executionFond.getSecurityId()); - String tradeNo = String.valueOf(executionFond.getExchangeExecutionId()); - String tradeDate = dateFormatter.format(executionFond.getTradingDate()); - String settleCode = sTrade != null ? sTrade.getClassCode() : null; + STrades sTrade = sTradesImdg.getSingleObjectByFieldValues( + Map.of( + "settleCode", executionFond.getSettlementCode(), + "operation", executionFond.getSide() + ) + ); - int valueIdx = 0; - String[] line = new String[getHeaders().length]; - line[valueIdx++] = id; - line[valueIdx++] = securityId; - line[valueIdx++] = tradeNo; - line[valueIdx++] = tradeDate; - line[valueIdx++] = settleCode; - lines.add(line); + String securityId = String.valueOf(executionFond.getSecurityId()); + String tradeNo = String.valueOf(executionFond.getExchangeExecutionId()); + String tradeDate = dateFormatter.format(executionFond.getTradingDate()); + String settleCode = sTrade != null ? sTrade.getClassCode() : null; + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = securityId; + line[valueIdx++] = tradeNo; + line[valueIdx++] = tradeDate; + line[valueIdx++] = settleCode; + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for execution_fond (id = %d), skipped".formatted(executionFond.getId()), e); + } } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java new file mode 100644 index 000000000..25e0a63cd --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java @@ -0,0 +1,104 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.SessionIdParam; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +public class KSRepCashNettoReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg sessionImdg; + + private final String[] headers = { + "FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "VALUE", "DATE" + }; + private List lines = null; + + public KSRepCashNettoReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(SessionIdParam params) { + return "KS_REP_CASH_NETTO_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_CASH_NETTO; + } + + @Override + protected void collect(SessionIdParam params) { + LocalDate nowDate = LocalDate.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.equals("sessionId", params.getSessionId()), + pb.equals("clearingDate", nowDate), + pb.regex("registryCode","[T|O]M.T") + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map createdAtForSessionId = new HashMap<>(); + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + String sessionId = String.valueOf(registry.getSessionId()); + + String sessionDate = createdAtForSessionId.get(registry.getSessionId()); + if (sessionDate == null) { + Session session = sessionImdg.getSingleObjectByID(registry.getSessionId()); + sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : ""; + createdAtForSessionId.put(registry.getSessionId(), sessionDate); + } + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey())) + account = registry.getAccount(); + + // todo выяснить, как заполнять + String value = registry.getBalance() != null ? df02Format.format(registry.getBalance()) : ""; + + String date = dateFormatter.format(nowDate); + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = sessionId; + line[valueIdx++] = sessionDate; + line[valueIdx++] = account; + line[valueIdx++] = value; + line[valueIdx++] = date; + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilder.java new file mode 100644 index 000000000..51a33a157 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegisterSumsReportBuilder.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg companyImdg; + + private final String[] headers = { + "FIRMID", "ACCOUNT", "REGISTER_CODE", "ADD_SUM", "ADD_TIME", "ADD_DATE" + }; + private List lines = null; + + public KSRepCashRegisterSumsReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_CASH_REGISTER_SUMS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_CASH_REGISTERS; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + Instant instantNow = Instant.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.regex("registryCode", "AM.."), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)) + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map activeCompanyForId = new HashMap<>(); + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(registry.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey())) + account = registry.getAccount(); + + String registerCode = registry.getRegistryCode(); + + String addSum = ""; + if (registry.getCredit() != null) addSum = df02Format.format(registry.getCredit()); + else if (registry.getDebit() != null) addSum = df02Format.format(registry.getDebit()); + + String addTime = ""; + String addDate = dateFormatter.format(nowDate); + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = account; + line[valueIdx++] = registerCode; + line[valueIdx++] = addSum; + line[valueIdx++] = addTime; + line[valueIdx++] = addDate; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java new file mode 100644 index 000000000..54d93474d --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashRegistersReportBuilder.java @@ -0,0 +1,140 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.platform.dictionary.RegistryCodeDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +public class KSRepCashRegistersReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg companyImdg; + private final Imdg registryCodeDictionaryImdg; + + private final String[] headers = { + "FIRMID", "ACCOUNT", "DATE", "REGISTER_CODE", "REGISTER_NAME", "OPEN_BALANCE", "CHANGE_BALANCE", "ADD_WITHDRAW", "CLOSE_BALANCE", "REMARKS" + }; + private List lines = null; + + public KSRepCashRegistersReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_CASH_REGISTERS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_CASH_REGISTERS; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + Instant instantNow = Instant.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.regex("registryCode", "AM.T"), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)) + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map nameForRegisterCode = new HashMap<>(); + Map activeCompanyForId = new HashMap<>(); + + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(registry.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Info.getKey()) || registry.getAccountType().equalsIgnoreCase(AccountType.Clrn.getKey())) + account = registry.getAccount(); + + String date = dateFormatter.format(nowDate); + String registerCode = registry.getRegistryCode(); + + String registerName = nameForRegisterCode.get(registerCode); + if (registerName == null) { + RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode)); + registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : ""; + nameForRegisterCode.put(registerCode, registerName); + } + + String openBalance = registry.getOpenBalance() != null ? df02Format.format(registry.getOpenBalance()) : ""; + + String changeBalance = ""; + if (registry.getSettledCredit() != null) { + if (registry.getSettledDebit() != null) + changeBalance = df02Format.format(registry.getSettledCredit().subtract(registry.getSettledDebit())); + else changeBalance = df02Format.format(registry.getSettledCredit()); + } + + String addWithdraw = ""; + if (registry.getCredit() != null) { + if (registry.getDebit() != null) + addWithdraw = df02Format.format(registry.getCredit().subtract(registry.getDebit())); + else addWithdraw = df02Format.format(registry.getCredit()); + } + + String closeBalance = registry.getCloseBalance() != null ? df02Format.format(registry.getCloseBalance()) : ""; + String remarks = ""; + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = account; + line[valueIdx++] = date; + line[valueIdx++] = registerCode; + line[valueIdx++] = registerName; + line[valueIdx++] = openBalance; + line[valueIdx++] = changeBalance; + line[valueIdx++] = addWithdraw; + line[valueIdx++] = closeBalance; + line[valueIdx++] = remarks; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java new file mode 100644 index 000000000..2b920fcef --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java @@ -0,0 +1,106 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.SessionIdParam; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +public class KSRepDepoNettoReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg sessionImdg; + + private final String[] headers = { + "FIRMID", "SESSION_ID", "SESSION_DATE", "ACCOUNT", "SECURITYID", "VALUE", "DATE" + }; + private List lines = null; + + public KSRepDepoNettoReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(SessionIdParam params) { + return "KS_REP_DEPO_NETTO_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_CASH_NETTO; + } + + @Override + protected void collect(SessionIdParam params) { + LocalDate nowDate = LocalDate.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.equals("sessionId", params.getSessionId()), + pb.equals("clearingDate", nowDate), + pb.regex("registryCode","[T|O]S.T") + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map createdAtForSessionId = new HashMap<>(); + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + String sessionId = String.valueOf(registry.getSessionId()); + + String sessionDate = createdAtForSessionId.get(registry.getSessionId()); + if (sessionDate == null) { + Session session = sessionImdg.getSingleObjectByID(registry.getSessionId()); + sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : ""; + createdAtForSessionId.put(registry.getSessionId(), sessionDate); + } + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey())) account = registry.getAccount(); + + String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : ""; + + // todo выяснить, как заполнять + String value = registry.getBalance() != null ? df02Format.format(registry.getBalance()) : ""; + + String date = dateFormatter.format(nowDate); + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = sessionId; + line[valueIdx++] = sessionDate; + line[valueIdx++] = account; + line[valueIdx++] = securityId; + line[valueIdx++] = value; + line[valueIdx++] = date; + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java new file mode 100644 index 000000000..dda8a8a6f --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegisterQuantitiesReportBuilder.java @@ -0,0 +1,114 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg companyImdg; + + private final String[] headers = { + "FIRMID", "ACCOUNT", "SECURITYID", "REGISTER_CODE", "ADD_QUANTITY", "ADD_TIME", "ADD_DATE" + }; + private List lines = null; + + public KSRepDepoRegisterQuantitiesReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_DEPO_REGISTER_QUANTITIES_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_DEPO_REGISTER_QUANTITIES; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + Instant instantNow = Instant.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.regex("registryCode", "AS.."), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)) + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map activeCompanyForId = new HashMap<>(); + + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(registry.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey())) + account = registry.getAccount(); + + String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : ""; + String registerCode = registry.getRegistryCode(); + + String addQuantity = ""; + if (registry.getCredit() != null) addQuantity = df02Format.format(registry.getCredit()); + else if (registry.getDebit() != null) addQuantity = df02Format.format(registry.getDebit()); + + String addTime = ""; + String addDate = dateFormatter.format(nowDate); + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = account; + line[valueIdx++] = securityId; + line[valueIdx++] = registerCode; + line[valueIdx++] = addQuantity; + line[valueIdx++] = addTime; + line[valueIdx++] = addDate; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java new file mode 100644 index 000000000..07526d8cd --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoRegistersReportBuilder.java @@ -0,0 +1,141 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.platform.dictionary.RegistryCodeDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg companyImdg; + private final Imdg registryCodeDictionaryImdg; + + private final String[] headers = { + "FIRMID", "ACCOUNT", "DATE", "SECURITYID", "REGISTER_CODE", "REGISTER_NAME", "OPEN_QUANTITY", "CHANGE_QUANTITY", "ADD_WITHDRAW_DEPO", "CLOSE_QUANTITY", "REMARKS" + }; + private List lines = null; + + public KSRepDepoRegistersReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_DEPO_REGISTERS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_CASH_REGISTERS; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + Instant instantNow = Instant.now(); + + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate finalPredicate = pb.and( + pb.regex("registryCode", "AS.T"), + pb.greatEqual("updated", instantNow.truncatedTo(ChronoUnit.DAYS)), + pb.less("updated", instantNow.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS)) + ); + Collection registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); + + Map nameForRegisterCode = new HashMap<>(); + Map activeCompanyForId = new HashMap<>(); + + lines = new ArrayList<>(registries.size()); + for (Registry registry : registries) { + try { + Boolean activeCompany = activeCompanyForId.get(registry.getCompanyId()); + if (activeCompany == null) { + Company company = companyImdg.getSingleObjectByID(registry.getCompanyId()); + activeCompany = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()); + activeCompanyForId.put(registry.getCompanyId(), activeCompany); + } + if (!activeCompany) continue; + + String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; + + String account = ""; + if (registry.getAccountType().equalsIgnoreCase(AccountType.Depo.getKey())) account = registry.getAccount(); + + String date = dateFormatter.format(nowDate); + String securityId = registry.getSecuritySymbol() != null ? registry.getSecuritySymbol() : ""; + String registerCode = registry.getRegistryCode(); + + String registerName = nameForRegisterCode.get(registerCode); + if (registerName == null) { + RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", registerCode)); + registerName = registryCodeDescription != null && registryCodeDescription.getName() != null ? registryCodeDescription.getName() : ""; + nameForRegisterCode.put(registerCode, registerName); + } + + String openQuantity = registry.getOpenBalance() != null ? registry.getOpenBalance().toString() : ""; + + String changeQuantity = ""; + if (registry.getSettledCredit() != null) { + if (registry.getSettledDebit() != null) + changeQuantity = registry.getSettledCredit().subtract(registry.getSettledDebit()).toString(); + else changeQuantity = registry.getSettledCredit().toString(); + } + + String addWithdrawDepo = ""; + if (registry.getCredit() != null) { + if (registry.getDebit() != null) + addWithdrawDepo = registry.getCredit().subtract(registry.getDebit()).toString(); + else addWithdrawDepo = registry.getCredit().toString(); + } + + String closeQuantity = registry.getCloseBalance() != null ? registry.getCloseBalance().toString() : ""; + String remarks = ""; + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = account; + line[valueIdx++] = date; + line[valueIdx++] = securityId; + line[valueIdx++] = registerCode; + line[valueIdx++] = registerName; + line[valueIdx++] = openQuantity; + line[valueIdx++] = changeQuantity; + line[valueIdx++] = addWithdrawDepo; + line[valueIdx++] = closeQuantity; + line[valueIdx++] = remarks; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for registry (id = %d), skipped".formatted(registry.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepFirmDetailsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepFirmDetailsReportBuilder.java new file mode 100644 index 000000000..476f7c175 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepFirmDetailsReportBuilder.java @@ -0,0 +1,121 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder { + private final Imdg companyImdg; + private final Imdg companySymbolsImdg; + private final Imdg profileDocumentImdg; + + private final String[] headers = { + "FIRMID", "PART_INN", "PART_KPP", "AGREEMENT_NUMBER", "AGREEMENT_DATE", "AGREEMENT_NAME", "FIRM_NAME" + }; + private List lines = null; + + public KSRepFirmDetailsReportBuilder(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_FIRM_DETAILS_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_FIRM_DETAILS; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + Instant instantNow = Instant.now(); + + Collection companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey())); + + lines = new ArrayList<>(companies.size()); + for (Company company : companies) { + try { + String firmId = company.getTradingCode() != null ? company.getTradingCode() : ""; + + CompanySymbols innCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues( + Map.of( + "companyId", company.getId(), + "companySymbol", CompanySymbol.INN.getKey() + ) + ); + String partInn = innCompanySymbol != null && innCompanySymbol.getCompanySymbolValue() != null ? innCompanySymbol.getCompanySymbolValue() : ""; + + CompanySymbols cppCompanySymbol = companySymbolsImdg.getSingleObjectByFieldValues( + Map.of( + "companyId", company.getId(), + "companySymbol", CompanySymbol.CPP.getKey() + ) + ); + String partKpp = cppCompanySymbol != null && cppCompanySymbol.getCompanySymbolValue() != null ? cppCompanySymbol.getCompanySymbolValue() : ""; + + ProfileDocument profileDocument = profileDocumentImdg.getSingleObjectByFieldValues( + Map.of( + "companyId", company.getId(), + "documentType", DocumentTypes.cntr.getKey() + ) + ); + String agreementNumber = ""; + String agreementDate = ""; + String agreementName = ""; + if (profileDocument != null) { + agreementNumber = profileDocument.getNumber() != null ? profileDocument.getNumber() : ""; + agreementDate = profileDocument.getIssueDate() != null ? dateFormatter.format(profileDocument.getIssueDate()) : ""; + agreementName = profileDocument.getName() != null ? profileDocument.getName() : ""; + } + + String firmName = company.getFullName() != null ? company.getFullName() : ""; + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = firmId; + line[valueIdx++] = partInn; + line[valueIdx++] = partKpp; + line[valueIdx++] = agreementNumber; + line[valueIdx++] = agreementDate; + line[valueIdx++] = agreementName; + line[valueIdx++] = firmName; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for company (id = %d), skipped".formatted(company.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java new file mode 100644 index 000000000..c3921e858 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java @@ -0,0 +1,172 @@ +package ru.spcex.clearing.reports.reports.ks; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.EmptyParams; +import ru.spcex.platform.enumeration.CoverageStatus; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.enumeration.IEnumKey; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +public class KSRepTradesReportBuilder extends CSVReportBuilder { + private final Imdg executionDepositImdg; + private final Imdg executionFondImdg; + private final Imdg sessionImdg; + private final Imdg registryImdg; + private final Imdg companyImdg; + + private final String[] headers = { + "SESSION_ID", "SESSION_DATE", "TR_ID", "FIRM_ID", "TKR", "CASH_LIABILITY", "DEPO_LIABILITY", "TRADE_NUM", "CLASS_CODE", "TRADE_DATE", "STATUS" + }; + private List lines = null; + + public KSRepTradesReportBuilder(ImdgProvider imdgProvider) { + executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); + executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); + sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + } + + @Override + protected String[] getHeaders() { + return headers; + } + + @Override + protected List getLines() { + return lines; + } + + @Override + protected String getReportFilename(EmptyParams params) { + return "KS_REP_TRADES_%s".formatted(dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); + } + + @Override + public ReportType getReportType() { + return ReportType.KS_REP_TRADES; + } + + @Override + protected void collect(EmptyParams params) { + LocalDate nowDate = LocalDate.now(); + + ImdgPredicateBuilder pbExecutionDeposit = executionDepositImdg.predicateBuilder(); + Collection executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate( + pbExecutionDeposit.equals("tradingDate", nowDate) + ); + ImdgPredicateBuilder pbExecutionFond = executionFondImdg.predicateBuilder(); + Collection executionFonds = executionFondImdg.getCollectionObjectsByPredicate( + pbExecutionFond.equals("tradingDate", nowDate) + ); + List executions = new ArrayList<>(); + executions.addAll(executionDeposits); + executions.addAll(executionFonds); + + Map tradingCodeForCompanyId = new HashMap<>(); + Map sessionDateForSessionId = new HashMap<>(); + lines = new ArrayList<>(executions.size()); + for (ExecutionCommon execution : executions) { + try { + String sessionId = execution.getSessionId() != null ? String.valueOf(execution.getSessionId()) : ""; + + String sessionDate = ""; + if (execution.getSessionId() != null) { + sessionDate = sessionDateForSessionId.get(execution.getSessionId()); + if (sessionDate == null) { + Session session = sessionImdg.getSingleObjectByID(execution.getSessionId()); + sessionDate = session != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : ""; + sessionDateForSessionId.put(execution.getSessionId(), sessionDate); + } + } + + String trId = String.valueOf(execution.getId()); + + // todo выяснить, так ли это + String firmId = ""; + if (execution.getCompanyId() != null) { + firmId = tradingCodeForCompanyId.get(execution.getCompanyId()); + if (firmId == null) { + Company company = companyImdg.getSingleObjectByID(execution.getCompanyId()); + firmId = company != null && company.getTradingCode() != null ? company.getTradingCode() : ""; + tradingCodeForCompanyId.put(execution.getCompanyId(), firmId); + } + } + + String tkr = execution.getTradingClearingRegistryId() != null ? String.valueOf(execution.getTradingClearingRegistryId()) : ""; + + String cashLiability = ""; + String depoLiability = ""; + if (execution instanceof ExecutionDeposit executionDeposit) { + cashLiability = executionDeposit.getFirstLegAmount() != null ? df02Format.format(executionDeposit.getFirstLegAmount()) : ""; + } else if (execution instanceof ExecutionFond executionFond) { + cashLiability = executionFond.getSettlementAmount() != null ? df02Format.format(executionFond.getSettlementAmount()) : ""; + depoLiability = executionFond.getQuantity() != null ? executionFond.getQuantity().toString() : ""; + } + + String tradeNum = execution.getExchangeExecutionId() != null ? String.valueOf(execution.getExchangeExecutionId()) : ""; + String classCode = ""; + String tradeDate = execution.getExchangeExecutionTime() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(execution.getExchangeExecutionTime(), ZoneId.systemDefault())) : ""; + + String status = ""; + if (execution.getCoverageStatus() != null) { + String coverageStatus = execution.getCoverageStatus().toUpperCase(); + CoverageStatus coverage = IEnumKey.getEnumByKey(CoverageStatus.class, coverageStatus); + if (coverage == CoverageStatus.NULL) { + status = "0"; + } else if (coverage == CoverageStatus.ALWD) { + status = "1"; + } else if (coverage == CoverageStatus.DNED) { + // todo обсудить + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + Registry registry = registryImdg.getSingleObjectByPredicate( + pb.and( + pb.equals("sessionId", execution.getSessionId()), + pb.regex("registryCode", "[O|T][S|M].[T]") + ) + ); + if (registry.getRegistryStatus() != null) { + String registryStatusStr = registry.getRegistryStatus().toUpperCase(); + RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registryStatusStr); + if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.NACK) status = "0"; + else if (registryStatus == RegistryStatus.FAIL) status = "3"; + } + } + } + + int valueIdx = 0; + String[] line = new String[getHeaders().length]; + line[valueIdx++] = sessionId; + line[valueIdx++] = sessionDate; + line[valueIdx++] = trId; + line[valueIdx++] = firmId; + line[valueIdx++] = tkr; + line[valueIdx++] = cashLiability; + line[valueIdx++] = depoLiability; + line[valueIdx++] = tradeNum; + line[valueIdx++] = classCode; + line[valueIdx++] = tradeDate; + line[valueIdx++] = status; + + lines.add(line); + } catch (Throwable e) { + log.error("Can't create report row for execution_%s (id = %d), skipped".formatted(execution instanceof ExecutionFond ? "fond" : "deposit", execution.getId()), e); + } + } + } +} diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_BP.java similarity index 97% rename from clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest.java rename to clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_BP.java index 56d455290..5592409b2 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_BP.java @@ -64,7 +64,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; TestConfig.class }) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class ReportServiceTest { +public class ReportServiceTest_BP { private static File outFolder; private final ExecutionFond testExecutionFond = new ExecutionFond(); private final ExecutionDeposit testExecutionDeposit = new ExecutionDeposit(); @@ -201,7 +201,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/operational_liabilities_claims_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_liabilities_claims_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date")); testExecutionDeposit.setSessionId(oldSessionIdDeposit); @@ -231,7 +231,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/period_liabilities_claims_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_liabilities_claims_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date")); outFile.delete(); @@ -254,7 +254,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/summary_liabilities_claims_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_liabilities_claims_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "tr_date", "clearing_date", "tr_execDate", "clearing_time", "repaym_date")); outFile.delete(); @@ -286,7 +286,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/operational_money_change_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/operational_money_change_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time")); testRegistry_1.setSessionId(oldRegistrySessionId_1); @@ -316,7 +316,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/period_money_change_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/period_money_change_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time")); outFile.delete(); @@ -343,7 +343,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/summary_money_change_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/summary_money_change_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("doc_time", "doc_date", "add_time", "withdraw_time")); registryImdg.insert(testRegistryForCompanyId_1); @@ -365,7 +365,7 @@ public class ReportServiceTest { @Order(7) public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_1() throws CsvValidationException, IOException { clearTestDir(); - File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile()); + File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile()); ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey()); @@ -396,7 +396,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_1"))[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate")); for (File file : outFolder.listFiles()) { @@ -417,7 +417,7 @@ public class ReportServiceTest { @Order(8) public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_2() throws CsvValidationException, IOException { clearTestDir(); - File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile()); + File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile()); ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey()); @@ -448,7 +448,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_2"))[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate")); for (File file : outFolder.listFiles()) { @@ -469,7 +469,7 @@ public class ReportServiceTest { @Order(9) public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_3() throws CsvValidationException, IOException { clearTestDir(); - File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile()); + File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile()); ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey()); @@ -497,7 +497,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_3"))[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate")); for (File file : outFolder.listFiles()) { @@ -518,7 +518,7 @@ public class ReportServiceTest { @Order(10) public void createReportTest_EXECUTED_DEAL_REPORT_INFTYPE_4() throws CsvValidationException, IOException { clearTestDir(); - File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_empty_expected.csv").getFile()); + File expectedEmptyFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv").getFile()); ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); reportRequest.setReportId(ReportType.EXECUTED_DEAL_REPORT.getKey()); @@ -547,7 +547,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles((dir, name) -> name.contains("INFTYPE_4"))[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate", "tradeTime", "settleDate")); for (File file : outFolder.listFiles()) { @@ -597,7 +597,7 @@ public class ReportServiceTest { TestUtils.waitingSendAndCheckRecord(0L, producer); File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/unfulfilled_deal_report_expected.csv").getFile()); + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/unfulfilled_deal_report_expected.csv").getFile()); compareCSVFiles(expectedFile, outFile, Arrays.asList("tradeDate")); testExecutionFond.setSessionId(oldExecutionFondSessionId); diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java new file mode 100644 index 000000000..3d8e3d4e8 --- /dev/null +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java @@ -0,0 +1,557 @@ +package ru.spcex.clearing.reports.services; + +import com.opencsv.CSVParser; +import com.opencsv.CSVParserBuilder; +import com.opencsv.CSVReader; +import com.opencsv.CSVReaderBuilder; +import com.opencsv.exceptions.CsvValidationException; +import org.apache.commons.io.FileUtils; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.Producer; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.misc.STrades; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.statement.Statement; +import ru.clearing.platform.dictionary.RegistryCodeDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId; +import ru.spcex.clearing.reports.config.BeanConfiguration; +import ru.spcex.clearing.reports.config.ReportBuildersConfig; +import ru.spcex.clearing.reports.config.TestConfig; +import ru.spcex.clearing.reports.config.validation.ValidationConfig; +import ru.spcex.clearing.test.TestUtils; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import javax.annotation.PostConstruct; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, + ReportService.class, + ImdgTestConfig.class, + KafkaTestConfig.class, + ReportBuildersConfig.class, + TestConfig.class +}) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ReportServiceTest_KS { + private static File outFolder; + private static int reportRequestCnt = 0; + private static int reportRequestWithSessionIdCnt = 0; + private static int reportRequestWithSessionIdListCnt = 0; + private static int reportRequestWithPeriodCnt = 0; + private Imdg registryImdg; + private Imdg companyImdg; + private Imdg registryCodeDictionaryImdg; + private Imdg executionDepositImdg; + private Imdg executionFondImdg; + private Imdg sessionImdg; + private Imdg companySymbolsImdg; + private Imdg profileDocumentImdg; + + private Long COMPANY_ID; + private Imdg

listingImdg; + private Imdg fixedIncomeSecurityImdg; + private Imdg tradingClearingRegistryImdg; + private Imdg paymentInstructionImdg; + private Imdg statementImdg; + private Imdg sTradeImdg; + @Autowired + private ReportService reportService; + @Autowired + @Qualifier("hazelcastServiceTest") + private ImdgProvider imdgProvider; + @Autowired + @Qualifier("mockProducer") + private Producer producer; + + @BeforeAll + public static void createTestFolder() { + outFolder = new File("out"); + outFolder.mkdir(); + } + + @AfterAll + public static void deleteTestFolder() throws IOException { + FileUtils.deleteDirectory(outFolder); + } + + + @Test + @Order(1) + public void createReportTest_KSRepCashRegistriesReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_CASH_REGISTERS.getKey()); + + RegistryCodeDictionary registryCodeDictionary = new RegistryCodeDictionary(); + registryCodeDictionary.setCode("AM_T"); + registryCodeDictionary.setName("AM_T_NAME"); + registryCodeDictionaryImdg.insert(registryCodeDictionary); + + Registry registry = new Registry(); + registry.setCompanyId(COMPANY_ID); + registry.setRegistryCode("AM_T"); + registry.setUpdated(Instant.now()); + registry.setTradingCode("TRADING_CODE"); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Clrn.getKey()); + registry.setOpenBalance(BigDecimal.valueOf(77.777777777)); + registry.setSettledCredit(BigDecimal.valueOf(88.88888888)); + registry.setSettledDebit(BigDecimal.valueOf(22.2222222)); + registry.setCredit(BigDecimal.valueOf(88.88888888)); + registry.setDebit(BigDecimal.valueOf(22.2222222)); + registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("DATE")); + + registryCodeDictionaryImdg.delete(registryCodeDictionary); + registryImdg.delete(registry); + } + + @Test + @Order(2) + public void createReportTest_KSRepCashRegisterSumsReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_CASH_REGISTER_SUMS.getKey()); + + Registry registry = new Registry(); + registry.setCompanyId(COMPANY_ID); + registry.setRegistryCode("AM__"); + registry.setUpdated(Instant.now()); + registry.setTradingCode("TRADING_CODE"); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Clrn.getKey()); + registry.setDebit(BigDecimal.valueOf(22.2222222)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("ADD_DATE")); + + registryImdg.delete(registry); + } + + @Test + @Order(3) + public void createReportTest_KSRepDepoRegistriesReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_DEPO_REGISTERS.getKey()); + + RegistryCodeDictionary registryCodeDictionary = new RegistryCodeDictionary(); + registryCodeDictionary.setCode("AS_T"); + registryCodeDictionary.setName("AS_T_NAME"); + registryCodeDictionaryImdg.insert(registryCodeDictionary); + + Registry registry = new Registry(); + registry.setCompanyId(COMPANY_ID); + registry.setRegistryCode("AS_T"); + registry.setUpdated(Instant.now()); + registry.setTradingCode("TRADING_CODE"); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Depo.getKey()); + registry.setOpenBalance(BigDecimal.valueOf(77.777777777)); + registry.setSettledCredit(BigDecimal.valueOf(88.88888888)); + registry.setSettledDebit(BigDecimal.valueOf(22.2222222)); + registry.setCredit(BigDecimal.valueOf(88.88888888)); + registry.setDebit(BigDecimal.valueOf(22.2222222)); + registry.setCloseBalance(BigDecimal.valueOf(11.11111111)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("DATE")); + + registryCodeDictionaryImdg.delete(registryCodeDictionary); + registryImdg.delete(registry); + } + + @Test + @Order(4) + public void createReportTest_KSRepDepoRegisterQuantitiesReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_DEPO_REGISTER_QUANTITIES.getKey()); + + Registry registry = new Registry(); + registry.setCompanyId(COMPANY_ID); + registry.setRegistryCode("AS__"); + registry.setSecuritySymbol("SECURITY_SYMBOL"); + registry.setUpdated(Instant.now()); + registry.setTradingCode("TRADING_CODE"); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Depo.getKey()); + registry.setDebit(BigDecimal.valueOf(22.2222222)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("ADD_DATE")); + + registryImdg.delete(registry); + } + + @Test + @Order(5) + public void createReportTest_KSRepTradesReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_TRADES.getKey()); + + Session session_1 = new Session(); + session_1.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2023, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC))); + Long sessionId_1 = sessionImdg.insert(session_1); + + Session session_2 = new Session(); + session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC))); + Long sessionId_2 = sessionImdg.insert(session_2); + + ExecutionFond executionFond = new ExecutionFond(); + executionFond.setCompanyId(COMPANY_ID); + executionFond.setTradingDate(LocalDate.now()); + executionFond.setSessionId(sessionId_1); + executionFond.setTradingClearingRegistryId(666L); + executionFond.setSettlementAmount(BigDecimal.valueOf(8888.888888)); + executionFond.setQuantity(BigDecimal.valueOf(123.456789)); + executionFond.setExchangeExecutionId(222L); + executionFond.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); + executionFond.setCoverageStatus(CoverageStatus.ALWD.getKey()); + executionFondImdg.insert(executionFond); + + Registry registry = new Registry(); + registry.setSessionId(sessionId_2); + registry.setRegistryCode("OM_T"); + registry.setRegistryStatus(RegistryStatus.FAIL.getKey()); + registryImdg.insert(registry); + + ExecutionDeposit executionDeposit = new ExecutionDeposit(); + executionDeposit.setCompanyId(COMPANY_ID); + executionDeposit.setTradingDate(LocalDate.now()); + executionDeposit.setSessionId(sessionId_2); + executionDeposit.setTradingClearingRegistryId(666L); + executionDeposit.setFirstLegAmount(BigDecimal.valueOf(8888.888888)); + executionDeposit.setExchangeExecutionId(222L); + executionDeposit.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); + executionDeposit.setCoverageStatus(CoverageStatus.DNED.getKey()); + executionDepositImdg.insert(executionDeposit); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_TRADES_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID","TR_ID")); + + executionDepositImdg.delete(executionDeposit); + executionFondImdg.delete(executionFond); + sessionImdg.delete(session_1); + sessionImdg.delete(session_2); + registryImdg.delete(registry); + } + + @Test + @Order(6) + public void createReportTest_KSRepCashNettoReport() throws IOException, CsvValidationException { + clearTestDir(); + + Session session = new Session(); + session.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); + Long sessionId = sessionImdg.insert(session); + + ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); + reportRequest.setReportId(ReportType.KS_REP_CASH_NETTO.getKey()); + reportRequest.setSessionId(sessionId); + + Registry registry = new Registry(); + registry.setTradingCode("TRADING_CODE"); + registry.setClearingDate(LocalDate.now()); + registry.setRegistryCode("TM_T"); + registry.setSessionId(sessionId); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Clrn.getKey()); + registry.setBalance(BigDecimal.valueOf(22.2222222)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT_FOR_SESSION_ID, + reportRequestWithSessionIdCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID", "DATE")); + + registryImdg.delete(registry); + sessionImdg.delete(session); + } + + @Test + @Order(7) + public void createReportTest_KSRepDepoNettoReport() throws IOException, CsvValidationException { + clearTestDir(); + + Session session = new Session(); + session.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); + Long sessionId = sessionImdg.insert(session); + + ReportRequestWithSessionId reportRequest = new ReportRequestWithSessionId(); + reportRequest.setReportId(ReportType.KS_REP_DEPO_NETTO.getKey()); + reportRequest.setSessionId(sessionId); + + Registry registry = new Registry(); + registry.setTradingCode("TRADING_CODE"); + registry.setClearingDate(LocalDate.now()); + registry.setRegistryCode("TS_T"); + registry.setSecuritySymbol("SECURITY_SYMBOL"); + registry.setSessionId(sessionId); + registry.setAccount("ACCOUNT"); + registry.setAccountType(AccountType.Depo.getKey()); + registry.setBalance(BigDecimal.valueOf(22.2222222)); + registryImdg.insert(registry); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT_FOR_SESSION_ID, + reportRequestWithSessionIdCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID", "DATE")); + + registryImdg.delete(registry); + sessionImdg.delete(session); + } + + @Test + @Order(8) + public void createReportTest_KSRepFirmDetailsReport() throws IOException, CsvValidationException { + clearTestDir(); + + ReportRequest reportRequest = new ReportRequest(); + reportRequest.setReportId(ReportType.KS_REP_FIRM_DETAILS.getKey()); + + Collection oldCompanies = companyImdg.getAllValues(); + for (Company company : oldCompanies) { + companyImdg.delete(company); + } + + Company company = new Company(); + company.setTradingCode("TRADING_CODE"); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + company.setFullName("FULL_NAME"); + Long companyId = companyImdg.insert(company); + + CompanySymbols inn = new CompanySymbols(); + inn.setCompanyId(companyId); + inn.setCompanySymbol(CompanySymbol.INN.getKey()); + inn.setCompanySymbolValue("INN___"); + companySymbolsImdg.insert(inn); + + CompanySymbols cpp = new CompanySymbols(); + cpp.setCompanyId(companyId); + cpp.setCompanySymbol(CompanySymbol.CPP.getKey()); + cpp.setCompanySymbolValue("CPP____"); + companySymbolsImdg.insert(cpp); + + ProfileDocument profileDocument = new ProfileDocument(); + profileDocument.setCompanyId(companyId); + profileDocument.setDocumentType(DocumentTypes.cntr.getKey()); + profileDocument.setNumber("NUMBER"); + profileDocument.setIssueDate(LocalDate.of(1999, 1, 1)); + profileDocument.setName("NAME"); + profileDocumentImdg.insert(profileDocument); + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT, + reportRequestCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Collections.emptyList()); + + companySymbolsImdg.delete(inn); + companySymbolsImdg.delete(cpp); + profileDocumentImdg.delete(profileDocument); + companyImdg.delete(company); + for (Company currCompany : oldCompanies) { + if (Objects.equals(currCompany.getId(), COMPANY_ID)) { + COMPANY_ID = companyImdg.insert(currCompany); + } else { + companyImdg.insert(currCompany); + } + } + } + + + private void compareCSVFiles(File expectedFile, File actualFile, List columnsForSkip) throws IOException, CsvValidationException { + if (columnsForSkip == null) columnsForSkip = Collections.emptyList(); + CSVParser csvParser = new CSVParserBuilder().withSeparator(',').withQuoteChar('\"').build(); + CSVReader expectedCSVReader = new CSVReaderBuilder(new FileReader(expectedFile)).withCSVParser(csvParser).build(); + CSVReader actualCSVReader = new CSVReaderBuilder(new FileReader(actualFile)).withCSVParser(csvParser).build(); + + Map expectedValueForColumn = new HashMap<>(); + Map actualValueForColumn = new HashMap<>(); + + String[] expectedHeaders = expectedCSVReader.readNext(); + String[] actualHeaders = actualCSVReader.readNext(); + assertEquals(expectedHeaders.length, actualHeaders.length); + + for (int headerIdx = 0; headerIdx < expectedHeaders.length; headerIdx++) { + String expectedHeader = expectedHeaders[headerIdx]; + String actualHeader = actualHeaders[headerIdx]; + if (!columnsForSkip.contains(expectedHeader)) expectedValueForColumn.put(expectedHeader, headerIdx); + if (!columnsForSkip.contains(actualHeader)) actualValueForColumn.put(actualHeader, headerIdx); + } + + do { + String[] expectedLines = expectedCSVReader.readNext(); + String[] actualLines = actualCSVReader.readNext(); + if (expectedLines == null || actualLines == null) { + if (expectedLines == null && actualLines == null) { + break; + } + Assertions.fail("expected and actual lines not equal"); + } + for (String expectedHeader : expectedValueForColumn.keySet()) { + int expectedIdx = expectedValueForColumn.get(expectedHeader); + int actualIdx = actualValueForColumn.get(expectedHeader); + String expected = expectedLines[expectedIdx]; + String actual = actualLines[actualIdx]; + assertEquals(expected, actual, expectedHeader); + } + } while (true); + + expectedCSVReader.close(); + actualCSVReader.close(); + } + + @PostConstruct + private void init() { + ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + registryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class); + + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + Company company = new Company(); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + company.setTradingCode("TRADING_CODE"); + COMPANY_ID = companyImdg.insert(company); + + executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); + executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); + sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + } + + private void clearTestDir() throws IOException { + FileUtils.deleteDirectory(outFolder); + outFolder.mkdir(); + } +} diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv deleted file mode 100644 index 4b77a6238..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_1_expected.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value -"0","3007","777","07.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv deleted file mode 100644 index e639c0e85..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_2_expected.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value -"0","3007","777","17.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv deleted file mode 100644 index b5ee192b4..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_3_expected.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value -"0","3007","777","27.05.2023","17.05.2023","27.05.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv deleted file mode 100644 index 68b4b8df8..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_INFTYPE_4_expected.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value -"0","3007","777","27.05.2023","17.05.2023","17.05.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_empty_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_empty_expected.csv deleted file mode 100644 index a5e3347ef..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/KS_BR_PFX64_empty_expected.csv +++ /dev/null @@ -1 +0,0 @@ -id,securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv new file mode 100644 index 000000000..e229b43e4 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_1_expected.csv @@ -0,0 +1,2 @@ +securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value +"test-security-symbol-1","777","20.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv new file mode 100644 index 000000000..2c9194b93 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_2_expected.csv @@ -0,0 +1,2 @@ +securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value +"test-security-symbol-1","777","30.06.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv new file mode 100644 index 000000000..89c68a77a --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_3_expected.csv @@ -0,0 +1,2 @@ +securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value +"test-security-symbol-1","777","10.07.2023","25.08.1994","10.07.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv new file mode 100644 index 000000000..380ae1a20 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_INFTYPE_4_expected.csv @@ -0,0 +1,2 @@ +securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value +"test-security-symbol-1","777","10.07.2023","25.08.1994","30.06.2023","test-settle-code","1000","7777","7777777" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv new file mode 100644 index 000000000..16f77f588 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/KS_BR_PFX64_empty_expected.csv @@ -0,0 +1 @@ +securityId,tradeNo,tradeDate,tradeTime,settleDate,settleCode,price,quanity,value diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/operational_liabilities_claims_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/operational_liabilities_claims_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/operational_liabilities_claims_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/operational_liabilities_claims_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/operational_money_change_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/operational_money_change_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/operational_money_change_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/operational_money_change_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/period_liabilities_claims_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/period_liabilities_claims_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/period_liabilities_claims_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/period_liabilities_claims_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/period_money_change_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/period_money_change_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/period_money_change_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/period_money_change_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/summary_liabilities_claims_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/summary_liabilities_claims_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/summary_liabilities_claims_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/summary_liabilities_claims_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/summary_money_change_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/summary_money_change_expected.csv similarity index 100% rename from clearing-parent/reports-service/src/test/resources/expected_reports_csv/summary_money_change_expected.csv rename to clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/summary_money_change_expected.csv diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/unfulfilled_deal_report_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/unfulfilled_deal_report_expected.csv new file mode 100644 index 000000000..c917aaa25 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/bp/unfulfilled_deal_report_expected.csv @@ -0,0 +1,2 @@ +securityId,tradeNo,tradeDate,settleCode +"3007","777","20.06.2023","test-class-code" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv new file mode 100644 index 000000000..1730c1482 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv @@ -0,0 +1,2 @@ +FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,VALUE,DATE +"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","22,22","30.06.2023" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv new file mode 100644 index 000000000..fd4d9201b --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv @@ -0,0 +1,2 @@ +FIRMID,ACCOUNT,DATE,REGISTER_CODE,REGISTER_NAME,OPEN_BALANCE,CHANGE_BALANCE,ADD_WITHDRAW,CLOSE_BALANCE,REMARKS +"TRADING_CODE","ACCOUNT","30.06.2023","AM_T","AM_T_NAME","77,78","66,67","66,67","11,11","" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv new file mode 100644 index 000000000..2e4e749c1 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv @@ -0,0 +1,2 @@ +FIRMID,ACCOUNT,REGISTER_CODE,ADD_SUM,ADD_TIME,ADD_DATE +"TRADING_CODE","ACCOUNT","AM__","22,22","","30.06.2023" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv new file mode 100644 index 000000000..d3083705b --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_NETTO_expected.csv @@ -0,0 +1,2 @@ +FIRMID,SESSION_ID,SESSION_DATE,ACCOUNT,SECURITYID,VALUE,DATE +"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","SECURITY_SYMBOL","22,22","30.06.2023" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv new file mode 100644 index 000000000..cd8b176ea --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTERS_expected.csv @@ -0,0 +1,2 @@ +FIRMID,ACCOUNT,DATE,SECURITYID,REGISTER_CODE,REGISTER_NAME,OPEN_QUANTITY,CHANGE_QUANTITY,ADD_WITHDRAW_DEPO,CLOSE_QUANTITY,REMARKS +"TRADING_CODE","ACCOUNT","30.06.2023","","AS_T","AS_T_NAME","77.777777777","66.66666668","66.66666668","11.11111111","" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv new file mode 100644 index 000000000..0bd1253ae --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv @@ -0,0 +1,2 @@ +FIRMID,ACCOUNT,SECURITYID,REGISTER_CODE,ADD_QUANTITY,ADD_TIME,ADD_DATE +"TRADING_CODE","ACCOUNT","SECURITY_SYMBOL","AS__","22,22","","30.06.2023" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv new file mode 100644 index 000000000..ec5427532 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_FIRM_DETAILS_expected.csv @@ -0,0 +1,2 @@ +FIRMID,PART_INN,PART_KPP,AGREEMENT_NUMBER,AGREEMENT_DATE,AGREEMENT_NAME,FIRM_NAME +"TRADING_CODE","INN___","CPP____","NUMBER","01.01.1999","NAME","FULL_NAME" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv new file mode 100644 index 000000000..629273089 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv @@ -0,0 +1,3 @@ +SESSION_ID,SESSION_DATE,TR_ID,FIRM_ID,TKR,CASH_LIABILITY,DEPO_LIABILITY,TRADE_NUM,CLASS_CODE,TRADE_DATE,STATUS +"3","20.01.1970T07:09:07","6","TRADING_CODE","666","8888,89","","222","","20.01.1970T02:49:58","3" +"2","20.01.1970T15:54:43","4","TRADING_CODE","666","8888,89","123.456789","222","","20.01.1970T02:49:58","1" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/unfulfilled_deal_report_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/unfulfilled_deal_report_expected.csv deleted file mode 100644 index 85ff732d3..000000000 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/unfulfilled_deal_report_expected.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,securityId,tradeNo,tradeDate,settleCode -"0","3007","777","07.05.2023","test-class-code" diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CoverageStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CoverageStatus.java new file mode 100644 index 000000000..1dfa96691 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CoverageStatus.java @@ -0,0 +1,21 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum CoverageStatus implements IEnumKey { + NULL("NULL"), + ALWD("ALWD"), + DNED("DNED"), + ; + + private final String key; + + CoverageStatus(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java index 411efd74a..4bf2bb6bf 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java @@ -15,6 +15,14 @@ public enum ReportType implements IEnumKey { PERIOD_MONEY_CHANGE("period-money-change"), EXECUTED_DEAL_REPORT("executed-deal-report"), UNFULFILLED_DEAL_REPORT("unfulfilled-deal-report"), + KS_REP_CASH_REGISTERS("ks_rep_cash_registers"), + KS_REP_CASH_REGISTER_SUMS("ks_rep_cash_register_sums"), + KS_REP_DEPO_REGISTERS("ks_rep_depo_registers"), + KS_REP_DEPO_REGISTER_QUANTITIES("ks_rep_depo_register_quantities"), + KS_REP_TRADES("ks_rep_trades"), + KS_REP_CASH_NETTO("ks_rep_cash_netto"), + KS_REP_DEPO_NETTO("ks_rep_depo_netto"), + KS_REP_FIRM_DETAILS("ks_rep_firm_details") ; private final String key;