From 94a0a3ab57d5e77ec3ba560235503301371fd471 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 9 Oct 2024 16:06:54 +0300 Subject: [PATCH 1/8] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-769=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing-service/src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/resources/application.properties b/clearing-parent/clearing-service/src/main/resources/application.properties index 79b890a40..1fc9e0f50 100644 --- a/clearing-parent/clearing-service/src/main/resources/application.properties +++ b/clearing-parent/clearing-service/src/main/resources/application.properties @@ -22,3 +22,5 @@ clearing-service.kafka-producer.buffer-memory=33554432 clearing-service.session-stage.inspection-gateway-timeout=60 clearing-service.scheduler.check-payment-instruction=*/5 * * * * * + +clearing-service.balance-check-omt=false From 6bd925c231cdde7beb41016076aa1ac2e3404d2f Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 9 Oct 2024 17:04:19 +0300 Subject: [PATCH 2/8] trade-importer http://jira.mfd.msk:8088/browse/CLS-777 --- .../clearing/trade/importer/services/TradeImporterService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 363d0cda6..427140412 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -261,6 +261,8 @@ public class TradeImporterService { sTrades.setSettleCurrency(resultSet.getObject("SettleCurrency", String.class)); sTrades.setTradeTimeMs(resultSet.getObject("TradeTimeMs", Long.class)); sTrades.setBankAccId(resultSet.getObject("BankAccId", String.class)); + sTrades.setKind(resultSet.getObject("Kind", String.class)); + sTrades.setLinkedTrade(resultSet.getObject("LinkedTrade", Long.class)); return sTrades; } From ab98240a00b3994e8040c19e2f4e5cd3f2cca0e0 Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 9 Oct 2024 17:40:47 +0300 Subject: [PATCH 3/8] http://jira.mfd.msk:8088/browse/CLS-765 --- .../ks/KSRepLccNettoReportBuilder.java | 136 ++++++++++++++---- 1 file changed, 112 insertions(+), 24 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java index 78f3e0e28..0a732343b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java @@ -4,7 +4,10 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -72,35 +75,73 @@ public class KSRepLccNettoReportBuilder extends CSVReportBuilder> groupedRegistries = registries.stream() + .collect( + Collectors.groupingBy( + registry -> new SecuritySymbolSettlementDateTKR( + registry.getSecuritySymbol(), + registry.getSettlementDate(), + registry.getTradingClearingRegistry() + ), + HashMap::new, + Collectors.toList() + ) + ); + + + for (Map.Entry> entry : groupedRegistries.entrySet()) { + List registriesForTKR = entry.getValue(); + Registry sampleRegistry = registriesForTKR.iterator().next(); + for (Registry registry : registriesForTKR) { + if (!sampleRegistry.getTradingCode().equalsIgnoreCase(registry.getTradingCode())) { + log.warn( + "For group registries (security_symbol: {}, settlement_date: {}, tkr: {}) " + + "found registry with another trading_code (expected: {}, actual: {}). Use {} for report", + sampleRegistry.getSecuritySymbol(), + sampleRegistry.getSettlementDate(), + sampleRegistry.getTradingClearingRegistry(), + sampleRegistry.getTradingCode(), + registry.getTradingCode(), + sampleRegistry.getTradingCode() + ); + } + } for (DataTypes dataType : DataTypes.values()) { KSRepLccNettoReport ksRepLccNettoReport = new KSRepLccNettoReport(); - ksRepLccNettoReport.setFirmId(registry.getTradingCode()); - ksRepLccNettoReport.setTkr(registry.getTradingClearingRegistry()); - ksRepLccNettoReport.setCurrencyId(registry.getSecuritySymbol()); + ksRepLccNettoReport.setFirmId(sampleRegistry.getTradingCode()); + ksRepLccNettoReport.setTkr(sampleRegistry.getTradingClearingRegistry()); + ksRepLccNettoReport.setCurrencyId(sampleRegistry.getSecuritySymbol()); ksRepLccNettoReport.setDate(now); - RegistryStatus status = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); - RegistryDesignation designation = IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()); + BigDecimal debit = BigDecimal.ZERO; BigDecimal credit = BigDecimal.ZERO; - if (dataType == DataTypes.FX_OBLIG) { - if (status == RegistryStatus.PROC || status == RegistryStatus.MNG) { - if (designation == RegistryDesignation.O) - debit = registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO; - if (designation == RegistryDesignation.T) - credit = registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO; - } - } else if (dataType == DataTypes.PR_NETTOSUM) { - if (status == RegistryStatus.CLRD) { - if (designation == RegistryDesignation.O) - debit = registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO; - if (designation == RegistryDesignation.T) - credit = registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO; - } - } else if (dataType == DataTypes.FX_DEBT) { - if (designation == RegistryDesignation.A) { - if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) < 0) - debit = registry.getBalance(); + for (Registry registry : registriesForTKR) { + RegistryStatus status = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()); + RegistryDesignation designation = IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()); + if (dataType == DataTypes.FX_OBLIG) { + if (status == RegistryStatus.PROC || status == RegistryStatus.MNG) { + if (designation == RegistryDesignation.O) { + debit = debit.add(registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO); + } + if (designation == RegistryDesignation.T) { + credit = credit.add(registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO); + } + } + } else if (dataType == DataTypes.PR_NETTOSUM) { + if (status == RegistryStatus.CLRD) { + if (designation == RegistryDesignation.O) { + debit = debit.add(registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO); + } + if (designation == RegistryDesignation.T) { + credit = credit.add(registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO); + } + } + } else if (dataType == DataTypes.FX_DEBT) { + if (designation == RegistryDesignation.A) { + if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) < 0) { + debit = debit.add(registry.getBalance()); + } + } } } ksRepLccNettoReport.setDataType(dataType.value); @@ -123,4 +164,51 @@ public class KSRepLccNettoReportBuilder extends CSVReportBuilder Date: Thu, 10 Oct 2024 14:14:56 +0300 Subject: [PATCH 4/8] fix config --- .../backendapi/controller/queue/misc/JsConfigController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/JsConfigController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/JsConfigController.java index ba6845b14..5dbb6cb11 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/JsConfigController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/JsConfigController.java @@ -25,7 +25,7 @@ public class JsConfigController { @ApiOperation(value = "get js config.") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) - @RequestMapping(path = "/spcex.config.js", method = RequestMethod.GET) + @RequestMapping(path = "/spcexConfig.js", method = RequestMethod.GET) @ResponseBody public Map getJsConfig() { Map result = new HashMap<>(); From 115fcc1aacd0fc3a2ee92c32277c2351d6005154 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Thu, 10 Oct 2024 16:05:42 +0300 Subject: [PATCH 5/8] account service bug fix --- .../ru/spcex/clearing/account/service/AccountService.java | 2 +- .../account/service/InformationAccountService.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 5bf66bbee..5e00c9c7e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -169,7 +169,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); } - Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId); + Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId, specialAnltAccId); String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 7ea1a5215..e234cada2 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -237,7 +237,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); } Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1 + Long infoSequenceId = accountNextId(currency, 810L, "7000"); // требуется последовательность n+1 String accountValue = generateInfoAccount(810L, infoSequenceId, specialAnltAccId); log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); @@ -309,7 +309,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali } public synchronized Long accountNextId(String currency) { - return accountNextId(currency, 810L); + return accountNextId(currency, 810L, "7000"); } /** @@ -318,7 +318,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali * @param * @return infoCounter++ */ - public synchronized Long accountNextId(String currency, Long currencyCodeId) { + public synchronized Long accountNextId(String currency, Long currencyCodeId, String specialAnltAccId) { String idWithTrailingZero = String.format("%03d", currencyCodeId); if (currency == null) currency = CurrencyCode.RUB.getKey(); // default @@ -342,7 +342,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali infoCounter = new AtomicLong(1); log.debug("No account information on map. n={}", infoCounter.get()); } else { - Pattern accPattern = Pattern.compile("39911%s([0-9]{8})7000".formatted(idWithTrailingZero)); + Pattern accPattern = Pattern.compile(("39911%s([0-9]{8})" + specialAnltAccId).formatted(idWithTrailingZero)); int maxN = 1; int parsedCount = 0; String lastAccount = null; // for debug From 868540ffa3ec83c947a9d098ef00c5a80915b17c Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Thu, 10 Oct 2024 16:24:27 +0300 Subject: [PATCH 6/8] account service bug fix --- .../ru/spcex/clearing/account/service/AccountService.java | 2 +- .../account/service/InformationAccountService.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 5e00c9c7e..5bf66bbee 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -169,7 +169,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); } - Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId, specialAnltAccId); + Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId); String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index e234cada2..705d05e3b 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -237,7 +237,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); } Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(currency, 810L, "7000"); // требуется последовательность n+1 + Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1 String accountValue = generateInfoAccount(810L, infoSequenceId, specialAnltAccId); log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); @@ -309,7 +309,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali } public synchronized Long accountNextId(String currency) { - return accountNextId(currency, 810L, "7000"); + return accountNextId(currency, 810L); } /** @@ -318,7 +318,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali * @param * @return infoCounter++ */ - public synchronized Long accountNextId(String currency, Long currencyCodeId, String specialAnltAccId) { + public synchronized Long accountNextId(String currency, Long currencyCodeId) { String idWithTrailingZero = String.format("%03d", currencyCodeId); if (currency == null) currency = CurrencyCode.RUB.getKey(); // default @@ -342,7 +342,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali infoCounter = new AtomicLong(1); log.debug("No account information on map. n={}", infoCounter.get()); } else { - Pattern accPattern = Pattern.compile(("39911%s([0-9]{8})" + specialAnltAccId).formatted(idWithTrailingZero)); + Pattern accPattern = Pattern.compile("39911%s([0-9]{8})\\d".formatted(idWithTrailingZero)); int maxN = 1; int parsedCount = 0; String lastAccount = null; // for debug From 68a10e5f2ab0948ce629f5f4a838f0fb8d3eab35 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Thu, 10 Oct 2024 16:24:57 +0300 Subject: [PATCH 7/8] account service bug fix --- .../clearing/account/service/InformationAccountService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 705d05e3b..518ddb1cf 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -342,7 +342,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali infoCounter = new AtomicLong(1); log.debug("No account information on map. n={}", infoCounter.get()); } else { - Pattern accPattern = Pattern.compile("39911%s([0-9]{8})\\d".formatted(idWithTrailingZero)); + Pattern accPattern = Pattern.compile("39911%s([0-9]{8})\\d{4}".formatted(idWithTrailingZero)); int maxN = 1; int parsedCount = 0; String lastAccount = null; // for debug From ffb3e13ba22c9e1191c6d24bfdabf8bd92e74db5 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 10 Oct 2024 18:27:09 +0300 Subject: [PATCH 8/8] http://jira.mfd.msk:8088/browse/CLS-767 --- .../builders/ks/KSRepLccNettoReportBuilder.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java index 0a732343b..ac965db8d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccNettoReportBuilder.java @@ -72,7 +72,10 @@ public class KSRepLccNettoReportBuilder extends CSVReportBuilder registries = registryImdg.getCollectionObjectsByPredicate( pb.and( registryPredicate, - pb.equals("settlementDate", now) + pb.or( + pb.equals("settlementDate", now), + pb.equals("settlementDate", now.plusDays(1)) + ) ) ); Map> groupedRegistries = registries.stream() @@ -90,6 +93,7 @@ public class KSRepLccNettoReportBuilder extends CSVReportBuilder> entry : groupedRegistries.entrySet()) { + SecuritySymbolSettlementDateTKR securitySymbolSettlementDateTKR = entry.getKey(); List registriesForTKR = entry.getValue(); Registry sampleRegistry = registriesForTKR.iterator().next(); for (Registry registry : registriesForTKR) { @@ -111,7 +115,7 @@ public class KSRepLccNettoReportBuilder extends CSVReportBuilder