From fac5dca462e13d90a1aaf95ef64ef363276efeb1 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 16 Nov 2023 11:58:30 +0300 Subject: [PATCH 1/8] replace SUM and AGREEMENT_SETTLEMENT_DATE (KSCommissionTradesReport) --- .../builders/bean/KSCommissionTradesReport.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java index 5c003b405..5b3031872 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSCommissionTradesReport.java @@ -38,16 +38,16 @@ public class KSCommissionTradesReport { @CsvDate(value = "dd.MM.yyyy") private LocalDate agreementDate; - @CsvBindByName(column = "SUM") - @CsvBindByPosition(position = 7) - @CsvNumber(value = "#0.00", writeFormat = "#0.00") - private BigDecimal sum; - @CsvBindByName(column = "AGREEMENT_SETTLEMENT_DATE") - @CsvBindByPosition(position = 8) + @CsvBindByPosition(position = 7) @CsvDate(value = "dd.MM.yyyy") private LocalDate agreementSettlementDate; + @CsvBindByName(column = "SUM") + @CsvBindByPosition(position = 8) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal sum; + @CsvBindByName(column = "REPAYM_DATE") @CsvBindByPosition(position = 9) @CsvDate(value = "dd.MM.yyyy") From 10d8803651e3ae9ba5f5681222fffb08d84afffc Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 16 Nov 2023 12:43:44 +0300 Subject: [PATCH 2/8] =?UTF-8?q?dbf-importer=20swt-importer=20=D0=97=D0=B0?= =?UTF-8?q?=D0=B1=D0=B8=D1=80=D0=B0=D1=82=D1=8C=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=8F=D0=B4=D0=BA=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=20sftp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java | 3 +++ .../ru/spcex/clearing/dbf/importer/services/FileChecker.java | 1 + .../java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java | 3 +++ .../ru/spcex/clearing/swt/importer/services/FileChecker.java | 1 + 4 files changed, 8 insertions(+) diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java index 90eb87d67..274f69025 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java @@ -22,6 +22,7 @@ import org.springframework.scheduling.support.PeriodicTrigger; import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import java.io.File; +import java.util.Comparator; import java.util.concurrent.TimeUnit; @Configuration @@ -60,6 +61,8 @@ public class SFTPConfig { fileSync.setTemporaryFileSuffix(".tmp"); fileSync.setRemoteDirectory(settings.getStore().getSftpIn().getSftpSrcDir()); fileSync.setFilter(new AcceptAllFileListFilter<>()); + fileSync.setPreserveTimestamp(true); + fileSync.setComparator(Comparator.comparingInt(f -> f.getAttrs().getMTime())); return fileSync; } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java index 2ee390a94..b9e3d74e0 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java @@ -48,6 +48,7 @@ public class FileChecker { List resultFiles = new LinkedList<>(); if (dbfFiles != null && dbfFiles.length >= 1) { + Arrays.sort(dbfFiles, Comparator.comparingLong(File::lastModified)); resultFiles.addAll(Arrays.asList(dbfFiles)); } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java index c0255fa1a..d96dfb250 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java @@ -22,6 +22,7 @@ import org.springframework.scheduling.support.PeriodicTrigger; import ru.spcex.clearing.swt.importer.config.settings.ImportSWTServiceSettings; import java.io.File; +import java.util.Comparator; import java.util.concurrent.TimeUnit; @Configuration @@ -60,6 +61,8 @@ public class SFTPConfig { fileSync.setTemporaryFileSuffix(".tmp"); fileSync.setRemoteDirectory(settings.getStore().getSftpIn().getSftpSrcDir()); fileSync.setFilter(new AcceptAllFileListFilter<>()); + fileSync.setPreserveTimestamp(true); + fileSync.setComparator(Comparator.comparingInt(f -> f.getAttrs().getMTime())); return fileSync; } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/FileChecker.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/FileChecker.java index f8287590d..6c99c5da7 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/FileChecker.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/FileChecker.java @@ -54,6 +54,7 @@ public class FileChecker { List resultFiles = new LinkedList<>(); if (swtFiles != null && swtFiles.length >= 1) { + Arrays.sort(swtFiles, Comparator.comparingLong(File::lastModified)); resultFiles.addAll(Arrays.asList(swtFiles)); } From 4e431ee7986b714e2186c743ac58fa67426ba44c Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 16 Nov 2023 11:37:12 +0300 Subject: [PATCH 3/8] http://jira.mfd.msk:8088/browse/CLS-497 KSRepTrades --- .../builders/ks/KSRepTradesReportBuilder.java | 49 +++++++++---------- .../services/ReportServiceTest_KS.java | 12 ++--- .../ks/KS_REP_TRADES_expected.csv | 4 +- .../enumeration/RegistryTradingParams.java | 5 ++ 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java index 557125aaa..bf40cf2e6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java @@ -224,55 +224,50 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( pbRegistry.and( - pbRegistry.sql(registryPredicateStr), pbRegistry.equals("groupId", groupId) + pbRegistry.equals("groupId", groupId), + pbRegistry.equals("companyId", execution.getCompanyId()), + pbRegistry.in("registryStatus", + RegistryStatus.NACC.getKey(), + RegistryStatus.NACC.getKey(), + RegistryStatus.FAIL.getKey(), + RegistryStatus.UNCV.getKey()), + pbRegistry.sql(registryPredicateStr) ) ); if (registryCollection.isEmpty()) { log.warn( - "Broken execution (empty registries). Registry for groupId = {} not found. Execution (id = {}) skipped", + "Broken execution (empty registries). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped", groupId, + execution.getCompanyId(), execution.getId() ); continue; } - boolean allOk = checkRegistryStatus( - registryCollection, - List.of(RegistryStatus.NACK, RegistryStatus.NACC, RegistryStatus.FAIL, RegistryStatus.UNCV) - ); - if (allOk) { - for (Registry registry : registryCollection) { - RegistryInstrumentType registryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()); - if (registryInstrumentType == RegistryInstrumentType.M) { - ksRepTradesReport.setStatus("2"); - break; - } - if (registryInstrumentType == RegistryInstrumentType.S) { - ksRepTradesReport.setStatus("3"); - break; - } - } + Registry registry = registryCollection.iterator().next(); + RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); + if (registryStatus == RegistryStatus.NACK || registryStatus == RegistryStatus.UNCV) { + status = "3"; + } else if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.FAIL) { + status = "2"; } } - } } ksRepTradesReport.setStatus(status); rows.add(ksRepTradesReport); } 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); + 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_KS.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportServiceTest_KS.java index 6c4a16474..2b1b094bf 100644 --- 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 @@ -651,9 +651,9 @@ public class ReportServiceTest_KS { Registry registry = new Registry(); registry.setSessionId(sessionId_2); - registry.setRegistryCode("OM_T"); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + registry.setCompanyId(COMPANY_ID); + registry.setRegistryCode("_S_T"); + registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry.setRegistryUnit(RegistryUnit.T.getKey()); registry.setGroupId(Long.parseLong("%s%d%d".formatted(dateFormatter_yyyyMMdd.format(LocalDate.now()), 222, marketId))); registry.setRegistryStatus(RegistryStatus.FAIL.getKey()); @@ -662,9 +662,9 @@ public class ReportServiceTest_KS { Registry registry_2 = new Registry(); registry_2.setSessionId(sessionId_2); - registry_2.setRegistryCode("OM_T"); - registry_2.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + registry_2.setCompanyId(COMPANY_ID); + registry_2.setRegistryCode("_S_T"); + registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry_2.setRegistryUnit(RegistryUnit.T.getKey()); registry_2.setGroupId(executionFond_3.getExchangeExecutionId()); registry_2.setRegistryStatus(RegistryStatus.FAIL.getKey()); 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 index 1445a25c5..8504a5ba0 100644 --- 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 @@ -1,5 +1,5 @@ "SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS" -"4","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","0" +"4","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","2" "3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","1" -"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","0" +"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","2" "3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","8888.89","-123","222","3333","20.01.1970T02:49:58","1" diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java index f3358101a..6976b2cf8 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryTradingParams.java @@ -112,6 +112,7 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, public final static RegistryTradingParams DMAI; public final static RegistryTradingParams D__I; public final static RegistryTradingParams D__V; + public final static RegistryTradingParams _S_T; static { OS_T = new RegistryTradingParams(RegistryDesignation.O, @@ -255,6 +256,10 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation, null, null, RegistryUnit.T); + _S_T = new RegistryTradingParams(null, + RegistryInstrumentType.S, + null, + RegistryUnit.T); } } From 458159238068b0cf9a5ae0772109426162e29b2a Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 16 Nov 2023 13:22:07 +0300 Subject: [PATCH 4/8] http://jira.mfd.msk:8088/browse/CLS-497 KSRepCashNettoReport --- .../builders/bean/KSRepCashNettoReport.java | 25 +++++++++++++ .../ks/KSRepCashNettoReportBuilder.java | 35 +++++++++++++++---- .../services/ReportServiceTest_KS.java | 20 ++++++++++- .../ks/KS_COMMISSION_TRADES_expected.csv | 4 +-- .../ks/KS_REP_CASH_NETTO_expected.csv | 6 ++-- .../platform/enumeration/SessionType.java | 3 +- 6 files changed, 80 insertions(+), 13 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java index d25360536..472595456 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java @@ -41,6 +41,16 @@ public class KSRepCashNettoReport { @CsvDate(value = "dd.MM.yyyy") private LocalDate date; + @CsvBindByName(column = "OBL_VALUE") + @CsvBindByPosition(position = 7) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal oblValue; + + @CsvBindByName(column = "REQ_VALUE") + @CsvBindByPosition(position = 8) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal reqValue; + public String getFirmId() { return firmId; @@ -98,4 +108,19 @@ public class KSRepCashNettoReport { this.date = date; } + public BigDecimal getOblValue() { + return oblValue; + } + + public void setOblValue(BigDecimal oblValue) { + this.oblValue = oblValue; + } + + public BigDecimal getReqValue() { + return reqValue; + } + + public void setReqValue(BigDecimal reqValue) { + this.reqValue = reqValue; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index d57f54604..632e53ebc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -20,10 +20,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Component @@ -180,13 +177,39 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionTypeForValue = Set.of( + SessionType.IPOT, + SessionType.TRDT, + SessionType.LIQU, + SessionType.IPOB, + SessionType.IPO0 + ); + Set sessionTypeForOblReqValue = Set.of( + SessionType.FINL, + SessionType.MEDM, + SessionType.XDEP + ); for (Registry cmtRegistry : cmtRegistries) { - if (cmtRegistry.getBalance() != null) cmtBalance = cmtBalance.add(cmtRegistry.getBalance()); + if (cmtRegistry.getBalance() != null) { + SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, cmtRegistry.getSessionType()); + if (sessionType == null) continue; + if (sessionTypeForValue.contains(sessionType)) cmtBalance = cmtBalance.add(cmtRegistry.getBalance()); + if (sessionTypeForOblReqValue.contains(sessionType)) reqValue = reqValue.add(cmtRegistry.getBalance()); + } } for (Registry lmtRegistry : lmtRegistries) { - if (lmtRegistry.getBalance() != null) lmtBalance = lmtBalance.add(lmtRegistry.getBalance()); + if (lmtRegistry.getBalance() != null) { + SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, lmtRegistry.getSessionType()); + if (sessionType == null) continue; + if (sessionTypeForValue.contains(sessionType)) lmtBalance = lmtBalance.add(lmtRegistry.getBalance()); + if (sessionTypeForOblReqValue.contains(sessionType)) oblValue = oblValue.add(lmtRegistry.getBalance()); + } } ksRepCashNettoReport.setValue(cmtBalance.subtract(lmtBalance)); + ksRepCashNettoReport.setOblValue(oblValue); + ksRepCashNettoReport.setReqValue(reqValue); rows.add(ksRepCashNettoReport); } catch (Throwable e) { 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 index 2b1b094bf..7552f4cdd 100644 --- 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 @@ -729,6 +729,7 @@ public class ReportServiceTest_KS { registry_1.setClearingDate(LocalDate.now()); registry_1.setRegistryCode("LM_T"); registry_1.setTradingClearingRegistry("TKR"); + registry_1.setSessionType(SessionType.IPO0.getKey()); registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryDesignation(RegistryDesignation.L.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); @@ -744,6 +745,7 @@ public class ReportServiceTest_KS { registry_2.setSettlementDate(LocalDate.now()); registry_2.setGroupId(Long.MAX_VALUE); registry_2.setClearingDate(LocalDate.now()); + registry_2.setSessionType(SessionType.IPO0.getKey()); registry_2.setRegistryCode("CM_T"); registry_2.setTradingClearingRegistry("TKR"); registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); @@ -768,6 +770,7 @@ public class ReportServiceTest_KS { registry_3.setGroupId(Long.MAX_VALUE); registry_3.setClearingDate(LocalDate.now()); registry_3.setRegistryCode("LM_T"); + registry_3.setSessionType(SessionType.FINL.getKey()); registry_3.setTradingClearingRegistry("TKR"); registry_3.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_3.setRegistryDesignation(RegistryDesignation.L.getKey()); @@ -783,6 +786,7 @@ public class ReportServiceTest_KS { registry_4.setTradingCode("TRADING_CODE"); registry_4.setSettlementDate(LocalDate.now()); registry_4.setGroupId(Long.MAX_VALUE); + registry_4.setSessionType(SessionType.FINL.getKey()); registry_4.setClearingDate(LocalDate.now()); registry_4.setRegistryCode("CM_T"); registry_4.setTradingClearingRegistry("TKR"); @@ -1121,7 +1125,21 @@ public class ReportServiceTest_KS { } } if (findEqual) continue; - Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(",", actualLine))); + Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(", ", actualLine))); + } + + List errors = new ArrayList<>(); + for (int idx = 0; idx < expectedHeaders.length; idx++) { + if (!Objects.equals(expectedHeaders[idx], actualHeaders[idx])) { + errors.add("expected header (%s) for idx = %d not equal actual header (%s)".formatted( + expectedHeaders[idx], + idx, + actualHeaders[idx]) + ); + } + } + if (!errors.isEmpty()) { + Assertions.fail("Files equal, but header sequence broken, cause: %s".formatted(String.join(",", errors))); } expectedCSVReader.close(); diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv index b2f2e750f..e82b5b07c 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv @@ -1,2 +1,2 @@ -"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","SUM","AGREEMENT_SETTLEMENT_DATE","REPAYM_DATE","EXEC_STATUS" -"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","-77.78","02.01.2022","10.11.2023","Исполнен" +"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","AGREEMENT_SETTLEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS" +"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","06.11.2023","-77.78","16.11.2023","Исполнен" 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 index e56d91b52..7bc88c3da 100644 --- 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 @@ -1,3 +1,3 @@ -"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE" -"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","01.11.2023" -"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","22.22","01.11.2023" +"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE" +"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","16.11.2023","0.00","0.00" +"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","0.00","16.11.2023","22.22","44.44" diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java index 1615a0e62..5d5d01c0c 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java @@ -3,7 +3,8 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum SessionType implements IEnumKey { - IPOB("IPOB"), IPO0("IPO0"), IPOT("IPOT"), TRDT("TRDT"), MEDM("MEDM"), FINL("FINL"), XDEP("XDEP"), + IPOB("IPOB"), IPO0("IPO0"), IPOT("IPOT"), TRDT("TRDT"), + MEDM("MEDM"), FINL("FINL"), XDEP("XDEP"), LIQU("LIQU"), ; SessionType(String key) { From 939ea451a15b898ea9a4555b98f61e4f44d8a240 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 16 Nov 2023 16:16:35 +0300 Subject: [PATCH 5/8] http://jira.mfd.msk:8088/browse/CLS-497 KSRepTrades --- .../builders/ks/KSRepTradesReportBuilder.java | 86 ++++++++++--------- .../services/ReportServiceTest_KS.java | 4 +- .../ks/KS_REP_TRADES_expected.csv | 2 +- 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java index bf40cf2e6..557de76f0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java @@ -93,6 +93,49 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder statusForExecution = new HashMap<>(); + executions.forEach(execution -> { + if (Set.of("S", "SELL").contains(execution.getSide())) { + String status = ""; + if (execution.getCoverageStatus() != null) { + Long groupId = execution.getExchangeExecutionId(); + String coverageStatus = execution.getCoverageStatus().toUpperCase(); + CoverageStatus coverage = IEnumKey.getEnumByKey(CoverageStatus.class, coverageStatus); + // Есть 2 пары Execution, SELL и BUY, статус определяем заранее по SELL и проставляем в BUY + if (coverage == CoverageStatus.DEND) { + if (execution instanceof ExecutionFond) { + ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder(); + String registryPredicateStr = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).build(); + Collection registryCollection = registryImdg.getCollectionObjectsByPredicate( + pbRegistry.and( + pbRegistry.equals("groupId", groupId), + pbRegistry.equals("companyId", execution.getCompanyId()), + pbRegistry.in("registryStatus", + RegistryStatus.NACC.getKey(), + RegistryStatus.NACK.getKey(), + RegistryStatus.FAIL.getKey(), + RegistryStatus.UNCV.getKey()), + pbRegistry.sql(registryPredicateStr) + ) + ); + if (registryCollection.isEmpty()) { + status = null; + } else { + Registry registry = registryCollection.iterator().next(); + RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); + if (registryStatus == RegistryStatus.NACK || registryStatus == RegistryStatus.UNCV) { + status = "3"; + } else if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.FAIL) { + status = "2"; + } + } + } + statusForExecution.put(new ExecutionKey(groupId, execution.getSessionId()), status); + } + } + } + }); + rows = new ArrayList<>(executions.size()); for (ExecutionCommon execution : executions) { try { @@ -226,37 +269,17 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( - pbRegistry.and( - pbRegistry.equals("groupId", groupId), - pbRegistry.equals("companyId", execution.getCompanyId()), - pbRegistry.in("registryStatus", - RegistryStatus.NACC.getKey(), - RegistryStatus.NACC.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.UNCV.getKey()), - pbRegistry.sql(registryPredicateStr) - ) - ); - if (registryCollection.isEmpty()) { + status = statusForExecution.get(new ExecutionKey(groupId, execution.getSessionId())); + if (status == null) { log.warn( - "Broken execution (empty registries). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped", + "Broken execution (can't define status). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped", groupId, execution.getCompanyId(), execution.getId() ); continue; } - Registry registry = registryCollection.iterator().next(); - RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); - if (registryStatus == RegistryStatus.NACK || registryStatus == RegistryStatus.UNCV) { - status = "3"; - } else if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.FAIL) { - status = "2"; - } } } } @@ -272,21 +295,6 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registries, Collection registryStatuses) { - for (Registry registry : registries) { - RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); - if (registryStatuses.contains(registryStatus)) continue; - return false; - } - return true; - } - - private boolean checkRegistryInstrumentType(Collection registries, Collection RegistryInstrumentTypes) { - for (Registry registry : registries) { - RegistryInstrumentType RegistryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()); - if (RegistryInstrumentTypes.contains(RegistryInstrumentType)) continue; - return false; - } - return true; + private record ExecutionKey(Long groupId, Long sessionId) { } } 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 index 7552f4cdd..ad726dea2 100644 --- 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 @@ -642,7 +642,7 @@ public class ReportServiceTest_KS { 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()); + executionFond.setCoverageStatus(CoverageStatus.DEND.getKey()); executionFondImdg.insert(executionFond); Market market = new Market(); @@ -655,7 +655,7 @@ public class ReportServiceTest_KS { registry.setRegistryCode("_S_T"); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setGroupId(Long.parseLong("%s%d%d".formatted(dateFormatter_yyyyMMdd.format(LocalDate.now()), 222, marketId))); + registry.setGroupId(222L); registry.setRegistryStatus(RegistryStatus.FAIL.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registryImdg.insert(registry); 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 index 8504a5ba0..29b0f1120 100644 --- 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 @@ -2,4 +2,4 @@ "4","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","2" "3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","1" "3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","2" -"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","8888.89","-123","222","3333","20.01.1970T02:49:58","1" +"3","20.01.1970T15:54:43","222","","TRADING_CODE","TKR","","","8888.89","-123","222","3333","20.01.1970T02:49:58","2" From 4a0df9bb48266691e5b025f87fab25b36964cb8a Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 16 Nov 2023 16:29:45 +0300 Subject: [PATCH 6/8] =?UTF-8?q?dbf-importer=20swt-importer=20=D0=97=D0=B0?= =?UTF-8?q?=D0=B1=D0=B8=D1=80=D0=B0=D1=82=D1=8C=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=8F=D0=B4=D0=BA=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=20sftp=20(2))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbf/importer/services/DBFImporterService.java | 12 +++++++++++- .../swt/importer/services/SWTImporterService.java | 11 ++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java index 358604067..111a222aa 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import ru.spcex.clearing.dbf.importer.logic.Processor; import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer; import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; +import ru.spcex.platform.utils.collection.Pair; import java.io.File; import java.nio.file.Path; @@ -59,13 +60,22 @@ public class DBFImporterService { } else { log.trace("no files were found"); } + + // Сортировка по возрастанию времени изменения - обрабатывать только в таком порядке + List> orderByTimeFiles = new ArrayList<>(); for (Map.Entry> newFilesEntry : newFiles.entrySet()) { ETable currTable = newFilesEntry.getKey(); List fileList = newFilesEntry.getValue(); for (File dbfFile : fileList) { - processor.process(ResultContainer.createNewTask(currTable, dbfFile)); + orderByTimeFiles.add(new Pair<>(dbfFile, currTable)); } } + orderByTimeFiles.sort(Comparator.comparingLong(iF -> iF.getFirst().lastModified())); + for (Pair newFilesEntry : orderByTimeFiles) { + ETable currTable = newFilesEntry.getSecond(); + File dbfFile = newFilesEntry.getFirst(); + processor.process(ResultContainer.createNewTask(currTable, dbfFile)); + } } finally { if (newFiles != null && newFiles.size() > 0) { cleanFiles(newFiles); diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/SWTImporterService.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/SWTImporterService.java index b7b65395f..1a2b841c1 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/SWTImporterService.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/services/SWTImporterService.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import ru.spcex.clearing.swt.importer.logic.Processor; import ru.spcex.clearing.swt.importer.logic.data.ResultContainer; import ru.spcex.clearing.swt.importer.logic.data.enums.ETable; +import ru.spcex.platform.utils.collection.Pair; import java.io.File; import java.nio.file.Path; @@ -81,13 +82,21 @@ public class SWTImporterService { } else { log.trace("no files were found"); } + // Сортировка по возрастанию времени изменения - обрабатывать только в таком порядке + List> orderByTimeFiles = new ArrayList<>(); for (Map.Entry> newFilesEntry : newFiles.entrySet()) { ETable currTable = newFilesEntry.getKey(); List fileList = newFilesEntry.getValue(); for (File swtFile : fileList) { - processor.process(ResultContainer.createNewTask(currTable, swtFile)); + orderByTimeFiles.add(new Pair<>(swtFile, currTable)); } } + orderByTimeFiles.sort(Comparator.comparingLong(iF -> iF.getFirst().lastModified())); + for (Pair newFilesEntry : orderByTimeFiles) { + ETable currTable = newFilesEntry.getSecond(); + File swtFile = newFilesEntry.getFirst(); + processor.process(ResultContainer.createNewTask(currTable, swtFile)); + } } finally { if (newFiles != null && newFiles.size() > 0) { cleanFiles(newFiles); From 37a741e866d06ff790952794ecd7eada40b7e73e Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 16 Nov 2023 16:14:30 +0300 Subject: [PATCH 7/8] =?UTF-8?q?D**I=20fix=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20open=5Fbalance/close=5Fbalance/plan=5Fbalance/created=5Fat(n?= =?UTF-8?q?ew)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/service/executors/Sdf10Executor.java | 4 ++++ .../ru/spcex/clearing/service/registry/DmiService.java | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java index 3858ad2ec..e97e41968 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java @@ -225,6 +225,10 @@ public class Sdf10Executor { rgsD.setDiffBalance(BigDecimal.ZERO); rgsD.setCheckBalance(BigDecimal.ZERO); rgsD.setRegistryStatus(RegistryStatus.PROC.getKey()); + rgsD.setOpenBalance(BigDecimal.ZERO); + rgsD.setCloseBalance(BigDecimal.ZERO); + rgsD.setPlanBalance(BigDecimal.ZERO); + rgsD.setCreated(Instant.now()); rgsD.setContract(outDocument); registryImdg.insert(rgsD); log.debug("created DS*I.id={}", rgsD.getId()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java index 41e93d7ec..58195d03d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java @@ -156,15 +156,14 @@ public class DmiService { return Optional.empty(); } Registry rgsD = am_t.clone(); + RegistryManager.zeroState(rgsD); + rgsD.setOpenBalance(BigDecimal.ZERO); + rgsD.setCloseBalance(BigDecimal.ZERO); rgsD.setRegistryDesignation(RegistryDesignation.D.getKey()); rgsD.setRegistryUnit(RegistryUnit.I.getKey()); rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD)); rgsD.setBalance(summ); - rgsD.setDebit(BigDecimal.ZERO); - rgsD.setCredit(BigDecimal.ZERO); - rgsD.setDiffBalance(BigDecimal.ZERO); - rgsD.setCheckBalance(BigDecimal.ZERO); rgsD.setRegistryStatus(RegistryStatus.PROC.getKey()); return Optional.of(rgsD); } From 8ae41b9d1623837ea593b6113a11d532a1659557 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 16 Nov 2023 17:56:00 +0300 Subject: [PATCH 8/8] =?UTF-8?q?DS*I=20fix=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/service/executors/Sdf10Executor.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java index e97e41968..a3d24aaea 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java @@ -216,19 +216,14 @@ public class Sdf10Executor { private void createDs_i(Registry as_t, BigDecimal summ, String outDocument) { Registry rgsD = as_t.clone(); + RegistryManager.zeroState(rgsD); rgsD.setRegistryDesignation(RegistryDesignation.D.getKey()); rgsD.setRegistryUnit(RegistryUnit.I.getKey()); rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD)); rgsD.setBalance(summ); - rgsD.setDebit(BigDecimal.ZERO); - rgsD.setCredit(BigDecimal.ZERO); - rgsD.setDiffBalance(BigDecimal.ZERO); - rgsD.setCheckBalance(BigDecimal.ZERO); rgsD.setRegistryStatus(RegistryStatus.PROC.getKey()); rgsD.setOpenBalance(BigDecimal.ZERO); rgsD.setCloseBalance(BigDecimal.ZERO); - rgsD.setPlanBalance(BigDecimal.ZERO); - rgsD.setCreated(Instant.now()); rgsD.setContract(outDocument); registryImdg.insert(rgsD); log.debug("created DS*I.id={}", rgsD.getId());