From 46d2bf902c3929f7554d657f845805c5bef30098 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Thu, 29 May 2025 17:30:14 +0300 Subject: [PATCH 01/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../securities/service/cud/GatewaySecurityService.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index 59dcb332c..d986bd777 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -487,8 +487,12 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin query.put("companySymbolValue", request.getIssuerId()); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(query); - Long companyId = companySymbols.getCompanyId(); - newRequest.setIssuerId(companyId); + if (companySymbols != null) { + Long companyId = companySymbols.getCompanyId(); + newRequest.setIssuerId(companyId); + } else { + log.warn("Not found company symbols..skip request"); + } newRequest.setShortName(request.getShortName()); newRequest.setFullName(request.getFullName()); From 2ac9ab49ec77b211eef619c72c34c4cac18abe90 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Thu, 29 May 2025 17:58:50 +0300 Subject: [PATCH 02/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../securities/service/cud/GatewaySecurityService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index d986bd777..ec5638104 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -519,11 +519,11 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin Listing existListing = findListing(listingReq); if (existListing == null) { validationHelper.validateTillFirstErrorAndThrow(listingReq, listingValidation.listingNewValidator()); - log.trace("For company[{}] do new Listing", companyId); + log.trace("For securityId[{}] do new Listing", securityId); Listing listing = listingFacade.newListing(listingReq); log.debug("New listing.id={}", listing.getId()); } else { - log.trace("For company[{}] do update Listing[{}]", companyId, existListing.getId()); + log.trace("For securityId[{}] do update Listing[{}]", securityId, existListing.getId()); ListingUpdateRequest partUpdateRequest = toUpdateRequest(existListing, listingReq); validationHelper.validateTillFirstErrorAndThrow(partUpdateRequest, listingValidation.listingUpdateValidator()); Listing listing = listingFacade.updateListing(partUpdateRequest); From 34f376dfae146a1c7d2fedf440eff60885d6b6d3 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 30 May 2025 12:24:13 +0300 Subject: [PATCH 03/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../DigitalCertificateSecurityGatewayRequest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java index aaec65262..66f367490 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java @@ -1,12 +1,14 @@ package ru.spcex.clearing.platform.messaging.domain.cud.securitites; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; @@ -41,9 +43,12 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym @JsonProperty private String settlementDepository; @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) @JsonProperty private LocalDate nominalIndexDate; @JsonProperty + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) private BigDecimal nominalDenominationUnitForDate; @JsonProperty private String nominalIndexFact; From 3909af085ceb054d7e89de852ffa7794d7ac9fae Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 30 May 2025 12:37:04 +0300 Subject: [PATCH 04/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../securities/service/cud/GatewaySecurityService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index ec5638104..19c9fca07 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -1,6 +1,7 @@ package ru.spcex.clearing.securities.service.cud; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -480,6 +481,13 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload(); DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); newRequest.setBaseCode(request.getDepoDcId()); + + InstrumentType clrInstrumentType = Arrays.asList("DC", "D") + .contains(request.getInstrumentType()) ? InstrumentType.DGCT : null; + if (clrInstrumentType == null) { + log.warn("Not defined instrumentType={}", request.getInstrumentType()); + return null; + } newRequest.setInstrumentType(request.getInstrumentType()); Map> query = new HashMap<>(); From 3c480922d7e752417838f7d19670e1d846e7e022 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 30 May 2025 13:08:24 +0300 Subject: [PATCH 05/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../securitites/DigitalCertificateSecurityGatewayRequest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java index 66f367490..a6dd25d2b 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java @@ -47,8 +47,6 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym @JsonProperty private LocalDate nominalIndexDate; @JsonProperty - @JsonSerialize(using = LocalDateSerializer.class) - @JsonDeserialize(using = LocalDateDeserializer.class) private BigDecimal nominalDenominationUnitForDate; @JsonProperty private String nominalIndexFact; From b6f6b74e395146ced9beae2aa0eee3724f521f76 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 30 May 2025 17:02:14 +0300 Subject: [PATCH 06/61] http://jira.mfd.msk:8088/browse/CLS-851 --- .../DigitalCertificateRequestBuilder.java | 88 +++++++++++++++++++ .../service/cud/GatewaySecurityService.java | 47 ++++------ 2 files changed, 104 insertions(+), 31 deletions(-) create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java new file mode 100644 index 000000000..1b2a92bd0 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java @@ -0,0 +1,88 @@ +package ru.spcex.clearing.securities.service.builder; + +import java.util.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityGatewayRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityUpdateRequest; +import ru.spcex.platform.enumeration.InstrumentType; + +public class DigitalCertificateRequestBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private DigitalCertificateSecurityGatewayRequest gatewayRequest; + private Long companyId; + private DigitalCertificateRequestBuilder() { + } + + public static DigitalCertificateRequestBuilder builder() { + return new DigitalCertificateRequestBuilder(); + } + + public DigitalCertificateRequestBuilder gatewayRequest(final DigitalCertificateSecurityGatewayRequest gatewayRequest) { + this.gatewayRequest = gatewayRequest; + return this; + } + + public DigitalCertificateRequestBuilder companyId(final Long companyId) { + this.companyId = companyId; + return this; + } + public DigitalCertificateSecurityNewRequest buildNewRequest() { + DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); + + InstrumentType clrInstrumentType = Arrays.asList("DC", "D") + .contains(gatewayRequest.getInstrumentType()) ? InstrumentType.DGCT : null; + if (clrInstrumentType == null) { + log.warn("Not defined instrumentType={}", gatewayRequest.getInstrumentType()); + return null; + } + newRequest.setInstrumentType(clrInstrumentType.getKey()); + newRequest.setBaseCode(gatewayRequest.getDepoDcId()); + newRequest.setIssuerId(companyId); + newRequest.setShortName(gatewayRequest.getShortName()); + newRequest.setFullName(gatewayRequest.getFullName()); + newRequest.setShortNameEng(gatewayRequest.getShortNameEng()); + newRequest.setFullNameEng(gatewayRequest.getFullNameEng()); + newRequest.setBaseUnitSize(gatewayRequest.getNumberOfUcp().longValue()); + newRequest.setPriceVarianceLimit(gatewayRequest.getDeltaPrice()); + newRequest.setSecuritySymbol(gatewayRequest.getSecuritySymbol()); + newRequest.setWorkflowStatus(gatewayRequest.getWorkflowStatus()); + newRequest.setNominalTypeCode(gatewayRequest.getTypeCode()); + newRequest.setSettlementHouse(gatewayRequest.getSettlementOrganization()); + newRequest.setDepository(gatewayRequest.getSettlementDepository()); + newRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); + newRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); + newRequest.setNominalIndexationSign(gatewayRequest.getNominalIndexFact()); + return newRequest; + } + + public DigitalCertificateSecurityUpdateRequest buildUpdateRequest() { + DigitalCertificateSecurityUpdateRequest updateRequest = new DigitalCertificateSecurityUpdateRequest(); + + InstrumentType clrInstrumentType = Arrays.asList("DC", "D") + .contains(gatewayRequest.getInstrumentType()) ? InstrumentType.DGCT : null; + if (clrInstrumentType == null) { + log.warn("Not defined instrumentType={}", gatewayRequest.getInstrumentType()); + return null; + } + updateRequest.setInstrumentType(clrInstrumentType.getKey()); + updateRequest.setBaseCode(gatewayRequest.getDepoDcId()); + updateRequest.setIssuerId(companyId); + updateRequest.setShortName(gatewayRequest.getShortName()); + updateRequest.setFullName(gatewayRequest.getFullName()); + updateRequest.setShortNameEng(gatewayRequest.getShortNameEng()); + updateRequest.setFullNameEng(gatewayRequest.getFullNameEng()); + updateRequest.setBaseUnitSize(gatewayRequest.getNumberOfUcp().longValue()); + updateRequest.setPriceVarianceLimit(gatewayRequest.getDeltaPrice()); + updateRequest.setSecuritySymbol(gatewayRequest.getSecuritySymbol()); + updateRequest.setWorkflowStatus(gatewayRequest.getWorkflowStatus()); + updateRequest.setNominalTypeCode(gatewayRequest.getTypeCode()); + updateRequest.setSettlementHouse(gatewayRequest.getSettlementOrganization()); + updateRequest.setDepository(gatewayRequest.getSettlementDepository()); + updateRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); + updateRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); + updateRequest.setNominalIndexationSign(gatewayRequest.getNominalIndexFact()); + return updateRequest; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index 19c9fca07..b08594122 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -1,7 +1,6 @@ package ru.spcex.clearing.securities.service.cud; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -53,6 +52,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecu import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.securities.service.builder.DigitalCertificateRequestBuilder; import ru.spcex.clearing.securities.service.facade.DigitalCertificateSecurityFacade; import ru.spcex.clearing.securities.service.facade.ListingFacade; import ru.spcex.clearing.securities.validation.ListingValidationProvider; @@ -479,47 +479,32 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin private RequestInfoUpdate newDigitalSecurities(BaseRequest baseRequest) { DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload(); - DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); - newRequest.setBaseCode(request.getDepoDcId()); - - InstrumentType clrInstrumentType = Arrays.asList("DC", "D") - .contains(request.getInstrumentType()) ? InstrumentType.DGCT : null; - if (clrInstrumentType == null) { - log.warn("Not defined instrumentType={}", request.getInstrumentType()); - return null; - } - newRequest.setInstrumentType(request.getInstrumentType()); Map> query = new HashMap<>(); query.put("companySymbol", CompanySymbol.UUID.getKey()); query.put("companySymbolValue", request.getIssuerId()); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(query); + Long companyId = null; if (companySymbols != null) { - Long companyId = companySymbols.getCompanyId(); - newRequest.setIssuerId(companyId); + companyId = companySymbols.getCompanyId(); } else { - log.warn("Not found company symbols..skip request"); + log.warn("Not found company symbols.."); } - - newRequest.setShortName(request.getShortName()); - newRequest.setFullName(request.getFullName()); - newRequest.setShortNameEng(request.getShortNameEng()); - newRequest.setFullNameEng(request.getFullNameEng()); - newRequest.setBaseUnitSize(request.getNumberOfUcp().longValue()); - newRequest.setPriceVarianceLimit(request.getDeltaPrice()); - newRequest.setSecuritySymbol(request.getSecuritySymbol()); - newRequest.setWorkflowStatus(request.getWorkflowStatus()); - newRequest.setNominalTypeCode(request.getTypeCode()); - newRequest.setSettlementHouse(request.getSettlementOrganization()); - newRequest.setDepository(request.getSettlementDepository()); - newRequest.setNominalIndexationDate(request.getNominalIndexDate()); - newRequest.setNominalValue(request.getNominalDenominationUnitForDate()); - newRequest.setNominalIndexationSign(request.getNominalIndexFact()); - - digitalCertificateSecurityFacade.newDigitalCertificate(newRequest); + DigitalCertificateRequestBuilder builder = DigitalCertificateRequestBuilder.builder() + .gatewayRequest(request) + .companyId(companyId); Security security = securitySelector.selectSecurityBySymbol(request.getSecuritySymbol()); + if (security == null) { + DigitalCertificateSecurityNewRequest newRequest = builder.buildNewRequest(); + digitalCertificateSecurityFacade.newDigitalCertificate(newRequest); + } else { + DigitalCertificateSecurityUpdateRequest updateRequest = builder.buildUpdateRequest(); + digitalCertificateSecurityFacade.updateDigitalCertificate(updateRequest); + } + + security = securitySelector.selectSecurityBySymbol(request.getSecuritySymbol()); Long securityId = security.getId(); for (ListingNewRequest listingReq : request.getListing()) { try { From f8fc9a2ee5cff105425ff8e4a56a99b28fe9429f Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 30 May 2025 17:12:55 +0300 Subject: [PATCH 07/61] http://jira.mfd.msk:8088/browse/CLS-850 --- clearing-parent/backend-api/src/main/resources/meta/meta.json | 4 ++-- clearing-parent/backend-api/src/main/resources/meta/meta.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 98fc95f78..14d9c59c7 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.18.240.129", + "version": "3.18.240.130", "enums": { @@ -10961,7 +10961,7 @@ } , {"code": "isin", - "type": 2,"length": 50,"name": "Наименование инструмента ISIN","shortname": "ISIN","searchable": true,"sortable": true,"visible": true,"extends": "security" + "type": 2,"length": 50,"name": "Наименование инструмента ISIN","shortname": "ISIN","searchable": true,"sortable": true,"visible": false,"extends": "security" } , {"code": "instrumentType", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 48aaffbf8..7a7a722cf 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -2540,7 +2540,7 @@ - + From da3ac07a00d15489e3219c080bb925a839d0e285 Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Fri, 30 May 2025 17:39:28 +0300 Subject: [PATCH 08/61] db-updater container added for updating db data up to current ddl version --- .gitlab-ci.yml | 1 + clr_test/db-updater/Dockerfile | 10 +++++++ clr_test/db-updater/init.sh | 19 ++++++++++++ clr_test/docker-compose.yml | 12 ++++++-- clr_test/run_test_docker_containers.py | 41 ++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 clr_test/db-updater/Dockerfile create mode 100644 clr_test/db-updater/init.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b9d493aa..c88640489 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -54,6 +54,7 @@ test: script: - echo "Installing maven and python" && apk update && apk add maven python3 - echo "Copying jar files to clearing-all/bin" && cp -r /builds/mfd/clearing/z-distr/target/clearing/bin ./clr_test/clearing-all/bin + - echo "Copying ddl files to clearing-all/db" && cp -r /builds/mfd/clearing/z-distr/target/clearing/db ./clr_test/clearing-all/db - echo "Removing old logs folder artifacts/logs" && rm -rf artifacts/logs - python3 clr_test/run_test_docker_containers.py - echo "Copying logs" && mkdir -p artifacts/logs && docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf - diff --git a/clr_test/db-updater/Dockerfile b/clr_test/db-updater/Dockerfile new file mode 100644 index 000000000..246a01c32 --- /dev/null +++ b/clr_test/db-updater/Dockerfile @@ -0,0 +1,10 @@ +FROM alpine + +ADD combined_update_ddl.sql /init.sql +ADD init.sh /init.sh + +RUN apk add --update --no-cache postgresql-client +RUN chmod +x init.sh +RUN find . -name "*.sh" | xargs sed -i 's/\r$//' + +ENTRYPOINT [ "./init.sh" ] \ No newline at end of file diff --git a/clr_test/db-updater/init.sh b/clr_test/db-updater/init.sh new file mode 100644 index 000000000..2f9e91ce4 --- /dev/null +++ b/clr_test/db-updater/init.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +until pg_isready -U clearing -h db -p 5432 -d clearing -t 1; do + echo "Waiting for database to be ready..." + sleep 2 +done + +echo "PSQL version: $(psql --version)" +echo "DB password is $PGPASSWORD" +echo "Database connection test:" +psql -U clearing -h db -p 5432 -d clearing -c "SELECT 'Database is connected!' AS status" + +echo "Executing SQL file:" +cat init.sql + +echo "Updating database" +psql -U clearing -h db -p 5432 -d clearing -f init.sql + +tail -f /dev/null \ No newline at end of file diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 901e85af0..9b27b14af 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -13,6 +13,14 @@ services: timeout: 5s retries: 100 + db-updater: + build: db-updater + environment: + - PGPASSWORD=Aa111111 + depends_on: + db: + condition: service_healthy + clearing_system: build: context: ./clearing-all @@ -21,8 +29,8 @@ services: environment: - CLR_TEST_NAME=${CLR_TEST_NAME} depends_on: - db: - condition: service_healthy + db-updater: + condition: service_started kafka: condition: service_started volumes: diff --git a/clr_test/run_test_docker_containers.py b/clr_test/run_test_docker_containers.py index c3e7e8d0f..740fae90d 100644 --- a/clr_test/run_test_docker_containers.py +++ b/clr_test/run_test_docker_containers.py @@ -1,3 +1,4 @@ +from glob import glob import logging import os import re @@ -12,6 +13,7 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(me DATA_ROOT_DIR = os.environ['CLEARING_TEST_DIR'] CLR_TEST_DIR = os.environ['CLR_TEST_DIR'] RESULT_FILES_DIR = os.environ['RESULT_FILES_DIR'] +DDL_VERSION_FROM = (3, 18, 0) def run_docker(folder_name: str) -> int: @@ -37,6 +39,9 @@ def run_docker(folder_name: str) -> int: logging.info("Removing all clr_test-db images") subprocess.call('docker rmi -f clr_test-db', shell=True) + logging.info("Removing all clr_test-db-updater images") + subprocess.call('docker rmi -f clr_test-db-updater', shell=True) + logging.info("Removing all clr_test-clearing_system images") subprocess.call('docker rmi -f clr_test-clearing_system', shell=True) @@ -108,9 +113,45 @@ def stop_docker_compose() -> None: os.chdir("..") +def combine_ddl_updates_into_file(): + logging.info(f"Combining DDLs...") + logging.info(f"Found files = {os.listdir(f'{CLR_TEST_DIR}/clearing-all/db')}") + pattern = re.compile(r'updateDDL_(\d+(?:\.\d+)+)\.sql$', re.IGNORECASE) + + files = [] + for filepath in glob(f"{CLR_TEST_DIR}/clearing-all/db/updateDDL_*.sql"): + filename = os.path.basename(filepath) + match = pattern.match(filename) + if match: + version_str = match.group(1) + parts = version_str.split('.') + + try: + version_numbers = [int(p) for p in parts] + padded_version = version_numbers[:3] + [0] * max(0, 3 - len(version_numbers)) + + if tuple(padded_version) > DDL_VERSION_FROM: + files.append((version_numbers, padded_version, filepath)) + + except ValueError: + continue + + files.sort(key=lambda x: x[0]) + logging.info(f"Found files: {files}") + + with open(f"{CLR_TEST_DIR}/db-updater/combined_update_ddl.sql", 'w', encoding='utf-8') as outfile: + for orig_ver, padded_ver, filepath in files: + with open(filepath, 'r', encoding='utf-8') as infile: + content = infile.read().rstrip('\n') + outfile.write(content + '\n\n') + + logging.info(f"Result: {os.listdir(f'{CLR_TEST_DIR}/db-updater')}") + + def main() -> None: folders = [i for i in sorted(os.listdir(DATA_ROOT_DIR)) if re.search("\\d{1,}.\\d{1,}.*", i)] + combine_ddl_updates_into_file() for folder in folders: stop_docker_compose() apply_test_case(folder) From ed0fbdaaaf6c1121241d70687680bab32faf6b1b Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 2 Jun 2025 12:21:03 +0300 Subject: [PATCH 09/61] http://jira.mfd.msk:8088/browse/CLS-851 --- .../inbound/request/listing/fond/DigitalCertificate.java | 2 +- .../service/adapter/DigitalSecurityRequestAdapter.java | 1 + .../service/builder/DigitalCertificateRequestBuilder.java | 7 +++++++ .../securities/service/cud/GatewaySecurityService.java | 4 +++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/listing/fond/DigitalCertificate.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/listing/fond/DigitalCertificate.java index f97fcfbbc..5443087c7 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/listing/fond/DigitalCertificate.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/listing/fond/DigitalCertificate.java @@ -86,7 +86,7 @@ public class DigitalCertificate extends WithMapId { ) private BigDecimal numberOfUcp; - @JsonProperty("deltaPrice") + @JsonProperty("delta_price") @ApiModelProperty( value = "Общая информация\\Пределы изменения цены", example = """ diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java index 7ac886e8f..68f07c0b5 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java @@ -17,6 +17,7 @@ public class DigitalSecurityRequestAdapter { gatewayRequest.setIssuerId(digitalCertificate.getIssuerId()); gatewayRequest.setShortName(digitalCertificate.getShortName()); gatewayRequest.setFullName(digitalCertificate.getFullName()); + gatewayRequest.setFullNameEng(digitalCertificate.getFullNameEng()); gatewayRequest.setShortNameEng(digitalCertificate.getShortNameEng()); gatewayRequest.setNumberOfUcp(digitalCertificate.getNumberOfUcp()); gatewayRequest.setDeltaPrice(digitalCertificate.getDeltaPrice()); diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java index 1b2a92bd0..9cc58ae7d 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java @@ -12,6 +12,7 @@ public class DigitalCertificateRequestBuilder { private final Logger log = LoggerFactory.getLogger(getClass()); private DigitalCertificateSecurityGatewayRequest gatewayRequest; private Long companyId; + private Long digitalSecurityId; private DigitalCertificateRequestBuilder() { } @@ -28,6 +29,11 @@ public class DigitalCertificateRequestBuilder { this.companyId = companyId; return this; } + + public DigitalCertificateRequestBuilder digitalSecurityId(final Long digitalSecurityId) { + this.digitalSecurityId = digitalSecurityId; + return this; + } public DigitalCertificateSecurityNewRequest buildNewRequest() { DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); @@ -60,6 +66,7 @@ public class DigitalCertificateRequestBuilder { public DigitalCertificateSecurityUpdateRequest buildUpdateRequest() { DigitalCertificateSecurityUpdateRequest updateRequest = new DigitalCertificateSecurityUpdateRequest(); + updateRequest.setId(digitalSecurityId); InstrumentType clrInstrumentType = Arrays.asList("DC", "D") .contains(gatewayRequest.getInstrumentType()) ? InstrumentType.DGCT : null; if (clrInstrumentType == null) { diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index b08594122..3491cccac 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -500,7 +500,9 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin DigitalCertificateSecurityNewRequest newRequest = builder.buildNewRequest(); digitalCertificateSecurityFacade.newDigitalCertificate(newRequest); } else { - DigitalCertificateSecurityUpdateRequest updateRequest = builder.buildUpdateRequest(); + DigitalCertificateSecurityUpdateRequest updateRequest = builder + .digitalSecurityId(security.getId()) + .buildUpdateRequest(); digitalCertificateSecurityFacade.updateDigitalCertificate(updateRequest); } From 04a20c34dbf4bcdb601d87f4123f66ef59d20f19 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 2 Jun 2025 12:48:41 +0300 Subject: [PATCH 10/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../DigitalCertificateRequestBuilder.java | 55 +++++++++++++------ .../platform/enumeration/NominalTypeCode.java | 21 +++++++ 2 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/NominalTypeCode.java diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java index 9cc58ae7d..066766c16 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java @@ -1,18 +1,22 @@ package ru.spcex.clearing.securities.service.builder; import java.util.Arrays; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityUpdateRequest; import ru.spcex.platform.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.NominalTypeCode; public class DigitalCertificateRequestBuilder { private final Logger log = LoggerFactory.getLogger(getClass()); private DigitalCertificateSecurityGatewayRequest gatewayRequest; private Long companyId; private Long digitalSecurityId; + private DigitalCertificateRequestBuilder() { } @@ -34,16 +38,15 @@ public class DigitalCertificateRequestBuilder { this.digitalSecurityId = digitalSecurityId; return this; } + public DigitalCertificateSecurityNewRequest buildNewRequest() { DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); - InstrumentType clrInstrumentType = Arrays.asList("DC", "D") - .contains(gatewayRequest.getInstrumentType()) ? InstrumentType.DGCT : null; - if (clrInstrumentType == null) { - log.warn("Not defined instrumentType={}", gatewayRequest.getInstrumentType()); - return null; - } - newRequest.setInstrumentType(clrInstrumentType.getKey()); + Optional clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType()); + Optional clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode()); + clrInstrumentType.ifPresent(instrumentType -> newRequest.setInstrumentType(instrumentType.getKey())); + clrNominalTypeCode.ifPresent(nominalTypeCode -> newRequest.setNominalTypeCode(nominalTypeCode.getKey())); + newRequest.setBaseCode(gatewayRequest.getDepoDcId()); newRequest.setIssuerId(companyId); newRequest.setShortName(gatewayRequest.getShortName()); @@ -54,7 +57,6 @@ public class DigitalCertificateRequestBuilder { newRequest.setPriceVarianceLimit(gatewayRequest.getDeltaPrice()); newRequest.setSecuritySymbol(gatewayRequest.getSecuritySymbol()); newRequest.setWorkflowStatus(gatewayRequest.getWorkflowStatus()); - newRequest.setNominalTypeCode(gatewayRequest.getTypeCode()); newRequest.setSettlementHouse(gatewayRequest.getSettlementOrganization()); newRequest.setDepository(gatewayRequest.getSettlementDepository()); newRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); @@ -67,13 +69,11 @@ public class DigitalCertificateRequestBuilder { DigitalCertificateSecurityUpdateRequest updateRequest = new DigitalCertificateSecurityUpdateRequest(); updateRequest.setId(digitalSecurityId); - InstrumentType clrInstrumentType = Arrays.asList("DC", "D") - .contains(gatewayRequest.getInstrumentType()) ? InstrumentType.DGCT : null; - if (clrInstrumentType == null) { - log.warn("Not defined instrumentType={}", gatewayRequest.getInstrumentType()); - return null; - } - updateRequest.setInstrumentType(clrInstrumentType.getKey()); + Optional clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType()); + Optional clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode()); + clrInstrumentType.ifPresent(instrumentType -> updateRequest.setInstrumentType(instrumentType.getKey())); + clrNominalTypeCode.ifPresent(nominalTypeCode -> updateRequest.setNominalTypeCode(nominalTypeCode.getKey())); + updateRequest.setBaseCode(gatewayRequest.getDepoDcId()); updateRequest.setIssuerId(companyId); updateRequest.setShortName(gatewayRequest.getShortName()); @@ -84,7 +84,6 @@ public class DigitalCertificateRequestBuilder { updateRequest.setPriceVarianceLimit(gatewayRequest.getDeltaPrice()); updateRequest.setSecuritySymbol(gatewayRequest.getSecuritySymbol()); updateRequest.setWorkflowStatus(gatewayRequest.getWorkflowStatus()); - updateRequest.setNominalTypeCode(gatewayRequest.getTypeCode()); updateRequest.setSettlementHouse(gatewayRequest.getSettlementOrganization()); updateRequest.setDepository(gatewayRequest.getSettlementDepository()); updateRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); @@ -92,4 +91,28 @@ public class DigitalCertificateRequestBuilder { updateRequest.setNominalIndexationSign(gatewayRequest.getNominalIndexFact()); return updateRequest; } + + private Optional resolveInstrumentType(final String instrumentType) { + InstrumentType clrInstrumentType = Arrays.asList("DC", "D") + .contains(instrumentType) ? InstrumentType.DGCT : null; + if (clrInstrumentType == null) { + log.warn("Not defined instrumentType={}", instrumentType); + return Optional.empty(); + } + return Optional.of(clrInstrumentType); + } + + private Optional resolveTypeCode(final String nominalTypeCode) { + NominalTypeCode clrNominalTypeCode = null; + if (StringUtils.hasLength(nominalTypeCode)) { + clrNominalTypeCode = + nominalTypeCode.equals("X") ? NominalTypeCode.INDX : + nominalTypeCode.equals("U") ? NominalTypeCode.FIXD : null; + } + if (clrNominalTypeCode == null) { + log.warn("Not defined NominalTypeCode={}", nominalTypeCode); + return Optional.empty(); + } + return Optional.of(clrNominalTypeCode); + } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/NominalTypeCode.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/NominalTypeCode.java new file mode 100644 index 000000000..ad76d3676 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/NominalTypeCode.java @@ -0,0 +1,21 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum NominalTypeCode implements IEnumKey { + INDX("INDX"), + FIXD("FIXD") + ; + + private final String key; + + NominalTypeCode(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } + +} From 134de7d9ab50879b54995e0b4c0f2b6738979195 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 2 Jun 2025 13:29:30 +0300 Subject: [PATCH 11/61] up pom version --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- clearing-parent/xml-exporter/pom.xml | 4 ++-- clearing-parent/xml-importer/pom.xml | 4 ++-- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 33 files changed, 67 insertions(+), 67 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index 3c4dda71e..ba36b5bb1 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 0e2e21749..492563c33 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 11756a7ab..029d120f1 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index 120f4da12..870923128 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 8db315ba9..6f1c627a5 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.18.240 + SPCEX-3.18.241 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index cb19cf1c3..e148c7a21 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 4ad731309..700759b13 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 5f56f6b48..8dd15dc9f 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 93126a5bf..6cd1bc728 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 651cfeba9..5c599aff9 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index f71532fff..54181deee 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 35c2cca06..fe0051194 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 1c0533b57..1d2014ef8 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.18.240 + SPCEX-3.18.241 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 1c95bc53d..8a7161118 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index dbcaceecf..f5cd60c30 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.241 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index 8c896bed2..ae0e30651 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.241 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index 01145fbcb..fcbb1254a 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.18.240 + SPCEX-3.18.241 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 394bb00e2..a55435d27 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.18.240 + SPCEX-3.18.241 clearing ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 258427f1c..45618a37a 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 2cca42e5e..12f708819 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index aa557fd1a..9b3d30317 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index e8de38c63..d2287a2d0 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index bb4c452a5..5048c1543 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 70aa8bd2e..b558ffb1f 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.18.240 + SPCEX-3.18.241 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 71a534016..9a64c8ff0 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index ce7f4f3eb..aca96dab3 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 test-clearing Test-clearing - SPCEX-3.18.240 + SPCEX-3.18.241 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index c1f60fdc4..a630f763f 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.241 trade-importer trade-importer Trade importer module - SPCEX-3.18.240 + SPCEX-3.18.241 jar @@ -55,7 +55,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.241 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index 20d7c00f2..d572e10a2 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 diff --git a/clearing-parent/xml-exporter/pom.xml b/clearing-parent/xml-exporter/pom.xml index 5047be5ab..8068ff0fb 100644 --- a/clearing-parent/xml-exporter/pom.xml +++ b/clearing-parent/xml-exporter/pom.xml @@ -7,12 +7,12 @@ xml-exporter xml-exporter XML exporter for XML files - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/clearing-parent/xml-importer/pom.xml b/clearing-parent/xml-importer/pom.xml index b9d82faa4..888d06318 100644 --- a/clearing-parent/xml-importer/pom.xml +++ b/clearing-parent/xml-importer/pom.xml @@ -8,12 +8,12 @@ xml-importer xml-importer XML loader for XML files - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 1286f37b8..7c8a60e0b 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.18.240 + SPCEX-3.18.241 diff --git a/pom.xml b/pom.xml index 3139f7680..5131b3b6f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.18.240 + SPCEX-3.18.241 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.18.240 + SPCEX-3.18.241 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 4b71d7b4d..4e5052d10 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.241 4.0.0 From 28b5ef8b4b1ef5baf819d7b1256c2f091d1ddc01 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 2 Jun 2025 16:18:23 +0300 Subject: [PATCH 12/61] http://jira.mfd.msk:8088/browse/CLS-827 --- .../validation/LauncherValidationConfig.java | 35 ++++++++++++ .../scheduler/error/ValidationError.java | 3 +- .../scheduler/service/LauncherService.java | 56 ++++++++++++++----- 3 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java new file mode 100644 index 000000000..42987237f --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.scheduler.config.validation; + +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.scheduler.error.ValidationError; +import ru.spcex.clearing.validation.common.rules.ValidateSymbolsRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +@Configuration +public class LauncherValidationConfig { + + @Bean("launcherRequestValidator") + public Function launcherRequestValidator(Map> imdgForValidation) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols); + return new ValidatorImpl<>(context, + ValidateSymbolsRule.notRequired("PaymentPurpose", + LauncherCommandRequest::getPaymentPurpose, + ValidationError.IncorrectPaymentPurpose) + ); + }; + } +} diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java index 68c1e5fb7..756cdbed6 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java @@ -13,7 +13,8 @@ public enum ValidationError implements IErrorEnumId { CompanyNotFound(7014L), SecurityNotFound(7012L), CompanyNotActive(7015L), - SecurityNotActive(7013L); + SecurityNotActive(7013L), + IncorrectPaymentPurpose(7018L); private final Long id; diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java index c4a73ecfc..3de8250b0 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.scheduler.service; +import java.time.Instant; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -24,13 +29,11 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.log.ExceptionUtils; - -import java.time.Instant; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - +import ru.spcex.platform.utils.enumeration.EnumMessage; import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.log.ExceptionUtils; +import ru.spcex.platform.utils.validation.IValidator; @Service public class LauncherService extends QueueConsumer implements InitializingBean { @@ -38,23 +41,30 @@ public class LauncherService extends QueueConsumer implements InitializingBean { private final Imdg launcherMap; private final Producer kafkaProducer; private final UserRoleVerification userRoleVerification; + private final Function launcherRequestValidator; + private final IMessageResolver messageResolver; @Autowired public LauncherService(Consumer kafkaQueue, Producer kafkaProducer, @Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification, - ImdgProvider imdgProvider) { + ImdgProvider imdgProvider, + @Qualifier("launcherRequestValidator") + Function launcherRequestValidator, + IMessageResolver messageResolver) { super(kafkaQueue, kafkaProducer); this.kafkaProducer = kafkaProducer; this.userRoleVerification = userRoleVerification; this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class); + this.launcherRequestValidator = launcherRequestValidator; + this.messageResolver = messageResolver; } @Override public void afterPropertiesSet() { callback(LauncherCommandRequest.class) - .setFunction(this::newLauncher) - .forDestination(Consts.LAUNCHER_NEW, callbacks::put); + .setFunction(this::newLauncher) + .forDestination(Consts.LAUNCHER_NEW, callbacks::put); init(); } @@ -69,18 +79,27 @@ public class LauncherService extends QueueConsumer implements InitializingBean { throw new IllegalStateException(String.format("User id in request must match: baseRequest.userId = %s, launcherCommandRequest.userId = %s", userRequest.getUserId(), req.getUserId())); } - Instant created = Instant.now(); - Launcher launcher = new Launcher(); - if (getEnumByKey(Task.class, req.getTaskName()) == null) { + Task task = getEnumByKey(Task.class, req.getTaskName()); + if (task == null) { throw new IllegalStateException("Illegal task name:\t" + req.getTaskName()); } + if (Task.dbfExport_OUTV == task) { + IValidator validator = launcherRequestValidator.apply(req); + Optional errorMessage = validator.tillFirstError(); + if (errorMessage.isPresent()) { + String error = messageResolver.resolve(errorMessage.get()); + return makeErrorResponse(userRequest, error); + } + } + Instant created = Instant.now(); + Launcher launcher = new Launcher(); launcher.setTask(req.getTaskName()); launcher.setSenderId(req.getUserId()); launcher.setCreated(created); launcher.setUpdated(created); launcherMap.insert(launcher); log.debug("successfully processed, new id {}", launcher.getId()); - if (Task.dbfExport_OUTV.equalsByKey(req.getTaskName())) { + if (Task.dbfExport_OUTV == task) { return processRequestOUTV(userRequest, req); } else { kafkaProducer.send(new ProducerRecord<>("launcher-" + launcher.getTask(), userRequest)); @@ -90,7 +109,7 @@ public class LauncherService extends QueueConsumer implements InitializingBean { private RequestInfoUpdate processRequestOUTV(BaseRequest userRequest, LauncherCommandRequest launcherNew) { log.debug("Redirect {} (userRequest.id={}) to queue {}", launcherNew.getTaskName(), - userRequest.getId(), Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION); + userRequest.getId(), Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION); var req = new PIClearingOutbondActionNewRequest(); req.setSenderId(launcherNew.getSenderId()); req.setAddresseeId(launcherNew.getAddresseeId()); @@ -134,4 +153,13 @@ public class LauncherService extends QueueConsumer implements InitializingBean { return successRouting; } + private RequestInfoUpdate makeErrorResponse(BaseRequest launcherCommandRequest, + String errorMessage) { + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(launcherCommandRequest.getId()); + requestInfoUpdate.setStatus(Status.Error); + requestInfoUpdate.setMessage(errorMessage); + return requestInfoUpdate; + } + } From 4099d3d1c03777e3ce35495180167948ad600625 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 3 Jun 2025 11:39:48 +0300 Subject: [PATCH 13/61] http://jira.mfd.msk:8088/browse/CLS-851 --- .../DigitalSecurityRequestAdapter.java | 22 +++++++++++-------- .../config/validation/ValidationConfig.java | 2 ++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java index 68f07c0b5..fd2e769ff 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java @@ -27,15 +27,19 @@ public class DigitalSecurityRequestAdapter { gatewayRequest.setSettlementOrganization(digitalCertificate.getSettlementOrganization()); gatewayRequest.setSettlementDepository(digitalCertificate.getSettlementDepository()); - Optional digitalNominal = digitalCertificate.getNominal().stream() - .filter( - nominal -> nominal.getIndexDate().isEqual(LocalDate.now())) - .findFirst(); - digitalNominal.ifPresent(nominal -> { - gatewayRequest.setNominalIndexDate(nominal.getIndexDate()); - gatewayRequest.setNominalDenominationUnitForDate(nominal.getDenominationUnitForDate()); - gatewayRequest.setNominalIndexFact(nominal.getIndexFact()); - }); + if (digitalCertificate.getTypeCode().equals("U")) { + gatewayRequest.setNominalDenominationUnitForDate(digitalCertificate.getUcp().getDenominationUnitBase()); + } else { + Optional digitalNominal = digitalCertificate.getNominal().stream() + .filter( + nominal -> nominal.getIndexDate().isEqual(LocalDate.now())) + .findFirst(); + digitalNominal.ifPresent(nominal -> { + gatewayRequest.setNominalIndexDate(nominal.getIndexDate()); + gatewayRequest.setNominalDenominationUnitForDate(nominal.getDenominationUnitForDate()); + gatewayRequest.setNominalIndexFact(nominal.getIndexFact()); + }); + } return gatewayRequest; } } diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/ValidationConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/ValidationConfig.java index caf60a95d..25a1f02d7 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/ValidationConfig.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/ValidationConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.misc.ValidationSymbols; import ru.clearing.classes.statics.data.scheduler.ClearingCalendar; import ru.clearing.classes.statics.data.scheduler.Planner; import ru.clearing.classes.statics.data.scheduler.PlannerTemplate; @@ -43,6 +44,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Security, Security.class); addImdg.accept(IMDGDistributedNames.Map_DayStatusDictionary, DayStatusDictionary.class); addImdg.accept(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class); + addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class); return imdg; } From ecab562499e637681d746fb76ac4807c2c5ec6fd Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 3 Jun 2025 12:05:09 +0300 Subject: [PATCH 14/61] http://jira.mfd.msk:8088/browse/CLS-851 --- .../clearing/gatewayapi/service/DigitalSecurityService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java index 95c931835..3f8e3bf96 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java @@ -46,8 +46,9 @@ public class DigitalSecurityService { for (DigitalCertificate security : securityList) { try { DigitalCertificateSecurityGatewayRequest digitalCertificateSecurityRequest = digitalSecurityRequestAdapter.toRequest(security); - List listingRequests = request.getListingList().stream(). - map(securityRequestAdapter::toIncomeListing).toList(); + List listingRequests = request.getListingList().stream() + .filter(incomeListing -> incomeListing.getSymbolCode().equals(security.getSecuritySymbol())) + .map(securityRequestAdapter::toIncomeListing).toList(); digitalCertificateSecurityRequest.setListing(listingRequests); kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_DGCT_GATEWAY, digitalCertificateSecurityRequest); } catch (Throwable e) { From 9e09ca74861d577e4b10e15a2f420f78ae25477b Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Tue, 3 Jun 2025 12:09:52 +0300 Subject: [PATCH 15/61] test cases validator added, kafka and zookeeper versions removed in docker-compose.yml --- .gitlab-ci.yml | 3 ++- clr_test/clearing-all/launch_and_test.sh | 4 ++-- clr_test/docker-compose.yml | 5 ++--- clr_test/run_test_docker_containers.py | 16 ++++++++++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c88640489..20abafe65 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,8 +59,9 @@ test: - python3 clr_test/run_test_docker_containers.py - echo "Copying logs" && mkdir -p artifacts/logs && docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf - - echo "Cleaning up log volume" && docker volume rm clr_test_logs_volume + - cat clr_test/results.txt && ! grep -q "failed" clr_test/results.txt artifacts: - expire_in: 1 day + expire_in: 7 day when: always paths: - artifacts/logs diff --git a/clr_test/clearing-all/launch_and_test.sh b/clr_test/clearing-all/launch_and_test.sh index 4e5548b36..c9e12972f 100644 --- a/clr_test/clearing-all/launch_and_test.sh +++ b/clr_test/clearing-all/launch_and_test.sh @@ -131,8 +131,8 @@ fi if [ "$TESTER_EXIT_CODE" -eq "0" ] then echo "Test case ${CLR_TEST_NAME} passed successfully" + exit 0 else echo "Test case ${CLR_TEST_NAME} failed" + exit 1 fi - -exit 0 \ No newline at end of file diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 9b27b14af..350d7c7c9 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -35,10 +35,9 @@ services: condition: service_started volumes: - logs_volume:/opt/clearing/bin/log_artifacts - # restart: always zookeeper: - image: mirror.gcr.io/confluentinc/cp-zookeeper:6.2.3.amd64 + image: mirror.gcr.io/confluentinc/cp-zookeeper container_name: zookeeper environment: ZOOKEEPER_SERVER_ID: 1 @@ -46,7 +45,7 @@ services: ZOOKEEPER_TICK_TIME: 2000 kafka: - image: mirror.gcr.io/confluentinc/cp-kafka:6.2.3.amd64 + image: mirror.gcr.io/confluentinc/cp-kafka container_name: kafka environment: KAFKA_BROKER_ID: 1 diff --git a/clr_test/run_test_docker_containers.py b/clr_test/run_test_docker_containers.py index 740fae90d..7827766bc 100644 --- a/clr_test/run_test_docker_containers.py +++ b/clr_test/run_test_docker_containers.py @@ -50,9 +50,6 @@ def run_docker(folder_name: str) -> int: os.chdir("..") - if code != 0: - sys.exit(code) - return code @@ -91,6 +88,14 @@ def copy_directory(path_from: str, path_to: str) -> None: shutil.copytree(path_from, path_to, dirs_exist_ok=True) +def append_to_log_file(test_case: str, code: int) -> None: + with open("clr_test/results.txt", 'a') as f: + if code == 0: + f.write(f"Test case {test_case} passed successfully\n") + else: + f.write(f"Test case {test_case} failed\n") + + def apply_test_case(folder: str) -> None: remove_directory(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/expected") remove_directory(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") @@ -103,7 +108,8 @@ def apply_test_case(folder: str) -> None: remove_files_with_extensions(".xml") # change_date(folder) - run_docker(folder) + exit_code = run_docker(folder) + append_to_log_file(folder, exit_code) def stop_docker_compose() -> None: @@ -151,6 +157,8 @@ def combine_ddl_updates_into_file(): def main() -> None: folders = [i for i in sorted(os.listdir(DATA_ROOT_DIR)) if re.search("\\d{1,}.\\d{1,}.*", i)] + remove_if_exists("clr_test/results.txt") + combine_ddl_updates_into_file() for folder in folders: stop_docker_compose() From 68bf6a78d07af713059811708d374ddb53ce3fcb Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Tue, 3 Jun 2025 12:53:11 +0300 Subject: [PATCH 16/61] kafka log level changed to warn in docker-compose.yml --- clr_test/docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 350d7c7c9..0bf2d5063 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -56,6 +56,8 @@ services: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_LOG4J_LOGGERS: kafka=WARN,kafka.controller=WARN,kafka.log.LogCleaner=WARN,state.change.logger=WARN,kafka.producer.async.DefaultEventHandler=WARN + KAFKA_LOG4J_ROOT_LOGLEVEL: WARN depends_on: - zookeeper From 6bff686528395a06a9a036db3a5387ded708025e Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 4 Jun 2025 11:57:48 +0300 Subject: [PATCH 17/61] http://jira.mfd.msk:8088/browse/CLS-849 --- .../DigitalCertificateRequestBuilder.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java index 066766c16..b1f328385 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java @@ -8,6 +8,7 @@ import org.springframework.util.StringUtils; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityUpdateRequest; +import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.NominalTypeCode; @@ -44,8 +45,10 @@ public class DigitalCertificateRequestBuilder { Optional clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType()); Optional clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode()); + Optional nominalIndexationSign = resolveNominalIndexFact(gatewayRequest.getNominalIndexFact()); clrInstrumentType.ifPresent(instrumentType -> newRequest.setInstrumentType(instrumentType.getKey())); clrNominalTypeCode.ifPresent(nominalTypeCode -> newRequest.setNominalTypeCode(nominalTypeCode.getKey())); + nominalIndexationSign.ifPresent(indexFact -> newRequest.setNominalIndexationSign(indexFact.getKey())); newRequest.setBaseCode(gatewayRequest.getDepoDcId()); newRequest.setIssuerId(companyId); @@ -61,7 +64,6 @@ public class DigitalCertificateRequestBuilder { newRequest.setDepository(gatewayRequest.getSettlementDepository()); newRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); newRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); - newRequest.setNominalIndexationSign(gatewayRequest.getNominalIndexFact()); return newRequest; } @@ -71,8 +73,10 @@ public class DigitalCertificateRequestBuilder { updateRequest.setId(digitalSecurityId); Optional clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType()); Optional clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode()); + Optional nominalIndexationSign = resolveNominalIndexFact(gatewayRequest.getNominalIndexFact()); clrInstrumentType.ifPresent(instrumentType -> updateRequest.setInstrumentType(instrumentType.getKey())); clrNominalTypeCode.ifPresent(nominalTypeCode -> updateRequest.setNominalTypeCode(nominalTypeCode.getKey())); + nominalIndexationSign.ifPresent(indexFact -> updateRequest.setNominalIndexationSign(indexFact.getKey())); updateRequest.setBaseCode(gatewayRequest.getDepoDcId()); updateRequest.setIssuerId(companyId); @@ -88,7 +92,6 @@ public class DigitalCertificateRequestBuilder { updateRequest.setDepository(gatewayRequest.getSettlementDepository()); updateRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); updateRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); - updateRequest.setNominalIndexationSign(gatewayRequest.getNominalIndexFact()); return updateRequest; } @@ -115,4 +118,18 @@ public class DigitalCertificateRequestBuilder { } return Optional.of(clrNominalTypeCode); } + + private Optional resolveNominalIndexFact(final String nominalIndexFact) { + Allowed allowed = null; + if (StringUtils.hasLength(nominalIndexFact)) { + allowed = + nominalIndexFact.equals("Y") ? Allowed.ALLOWED : + nominalIndexFact.equals("N") ? Allowed.DENIED : null; + } + if (allowed == null) { + log.warn("Not defined nominalIndexFact={}", nominalIndexFact); + return Optional.empty(); + } + return Optional.of(allowed); + } } From eec121924df433e3bf5c03c47b774d0177c255ef Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 4 Jun 2025 13:15:19 +0300 Subject: [PATCH 18/61] http://jira.mfd.msk:8088/browse/CLS-844 --- .../service/ValidationSymbolsService.java | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/ValidationSymbolsService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/ValidationSymbolsService.java index c1ddf9c74..e24cc16ac 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/ValidationSymbolsService.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/ValidationSymbolsService.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.utility.service; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -8,45 +9,22 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.misc.ValidationSymbols; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest; import ru.spcex.clearing.platform.messaging.domain.cud.misc.ValidationSymbolsNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.misc.ValidationSymbolsUpdateRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest; -import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; -import ru.spcex.platform.enumeration.*; 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 ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; -import ru.spcex.platform.utils.collection.Pair; -import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - @Service public class ValidationSymbolsService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -116,7 +94,7 @@ public class ValidationSymbolsService extends QueueConsumer implements Initializ ValidationSymbols vs = new ValidationSymbols(); vs.setId(validationSymbolsImdg.nextIDSequenceFor()); - vs.setCode(req.getCode()); + vs.setCode(req.getCode().toUpperCase()); vs.setSymbols(req.getSymbols()); vs.setComment(req.getComment()); validationSymbolsImdg.insert(vs); @@ -136,7 +114,7 @@ public class ValidationSymbolsService extends QueueConsumer implements Initializ ValidationSymbolsUpdateRequest req = userRequest.getRequestPayload(); ValidationSymbols vs = validationSymbolsImdg.getSingleObjectByID(req.getId()); - vs.setCode(req.getCode()); + vs.setCode(req.getCode().toUpperCase()); vs.setSymbols(req.getSymbols()); vs.setComment(req.getComment()); validationSymbolsImdg.update(vs); From ebcdb6a2b008d4c33480580c01c063d3c09f5dad Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 6 Jun 2025 13:40:53 +0300 Subject: [PATCH 19/61] actual MARKET.sql --- .../src/main/resources/db/MARKET.sql | 281 ++++++------------ 1 file changed, 98 insertions(+), 183 deletions(-) diff --git a/clearing-parent/db-scripts/src/main/resources/db/MARKET.sql b/clearing-parent/db-scripts/src/main/resources/db/MARKET.sql index 4168e1f0e..c719c8d6a 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/MARKET.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET.sql @@ -6,186 +6,101 @@ /* Business objects */ -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (1, 'ABEC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион СПВБ', 'Размещение: Аукцион СПВБ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (2, 'AEPC', 'FOND', 'PRMR', 'RUB', 'Размещение: акции (аукцион по цене)', 'Размещение: акции (аукцион по цене)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (3, 'AESC', 'FOND', 'PRMR', 'RUB', 'Размещение: акции (аукцион по цене)', 'Размещение: акции (аукцион по цене)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (4, 'ABFC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ПД-Аукцион', 'СПВБ: Обл. с ПД-Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (5, 'ABIC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ИН - Аукцион', 'СПВБ: Обл. с ИН - Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (6, 'ABMC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с АД - Аукцион', 'СПВБ: Обл. с АД - Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (7, 'ABVC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ПК - Аукцион', 'СПВБ: Обл. с ПК - Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (8, 'BKVC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион БР', 'Размещение: Аукцион БР') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (9, 'BMFC', 'FOND', 'PRMR', 'RUB', 'ОФЗПД-Размещение: Аукцион', 'ОФЗПД-Размещение: Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (10, 'BMIC', 'FOND', 'PRMR', 'RUB', 'ОФЗИН-Размещение: Аукцион', 'ОФЗИН-Размещение: Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (11, 'BMMC', 'FOND', 'PRMR', 'RUB', 'ОФЗАД-Размещение: Аукцион', 'ОФЗАД-Размещение: Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (12, 'BMVC', 'FOND', 'PRMR', 'RUB', 'ОФЗПК-Размещение: Аукцион', 'ОФЗПК-Размещение: Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (13, 'DBEC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (14, 'DBFC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (15, 'DBIC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (16, 'DBMC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (17, 'DBVC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (18, 'DEPC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (19, 'DESC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (20, 'DKVC', 'FOND', 'SCND', 'RUB', 'Дискретный аукцион', 'Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (21, 'DMFC', 'FOND', 'SCND', 'RUB', 'ОФЗПД-Дискретный аукцион', 'ОФЗПД-Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (22, 'DMIC', 'FOND', 'SCND', 'RUB', 'ОФЗИН-Дискретный аукцион', 'ОФЗИН-Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (23, 'DMMC', 'FOND', 'SCND', 'RUB', 'ОФЗАД-Дискретный аукцион', 'ОФЗАД-Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (24, 'DMVC', 'FOND', 'SCND', 'RUB', 'ОФЗПК-Дискретный аукцион', 'ОФЗПК-Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (25, 'KBFC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион по ставке', 'Размещение: Аукцион по ставке') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (26, 'KBIC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион по ставке', 'Размещение: Аукцион по ставке') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (27, 'KBMC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион по ставке', 'Размещение: Аукцион по ставке') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (28, 'KBVC', 'FOND', 'PRMR', 'RUB', 'Размещение: Аукцион по ставке', 'Размещение: Аукцион по ставке') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (29, 'PMFC', 'FOND', 'PRMR', 'RUB', 'ОФЗПД-Торги в режиме выкупа', 'ОФЗПД-Торги в режиме выкупа') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (30, 'PMIC', 'FOND', 'PRMR', 'RUB', 'ОФЗИН-Торги в режиме выкупа', 'ОФЗИН-Торги в режиме выкупа') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (31, 'PMMC', 'FOND', 'PRMR', 'RUB', 'ОФЗАД-Торги в режиме выкупа', 'ОФЗАД-Торги в режиме выкупа') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (32, 'PMVC', 'FOND', 'PRMR', 'RUB', 'ОФЗПК-Торги в режиме выкупа', 'ОФЗПК-Торги в режиме выкупа') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (33, 'NBEC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (34, 'NBFC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (35, 'NBIC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (36, 'NBMC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (37, 'NBVC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (38, 'NEPC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (39, 'NESC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (40, 'NKVC', 'FOND', 'SCND', 'RUB', 'Режим переговорных сделок (РПС)', 'Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (41, 'SBFC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ПД - Доразмещение', 'СПВБ: Обл. с ПД - Доразмещение') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (42, 'SBIC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ИН - Доразмещение', 'СПВБ: Обл. с ИН - Доразмещение') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (43, 'SBMC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с АД -Доразмещение', 'СПВБ: Обл. с АД -Доразмещение') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (44, 'SBVC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Обл. с ПК-Доразмещение', 'СПВБ: Обл. с ПК-Доразмещение') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (45, 'SKVC', 'FOND', 'PRMR', 'RUB', 'Доразмещение: Адресные заявки БР', 'Доразмещение: Адресные заявки БР') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (46, 'SMFC', 'FOND', 'PRMR', 'RUB', 'ОФЗПД- Доразмещение: Адресные заявки', 'ОФЗПД- Доразмещение: Адресные заявки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (47, 'SMIC', 'FOND', 'PRMR', 'RUB', 'ОФЗИН-Доразмещение: Адресные заявки', 'ОФЗИН-Доразмещение: Адресные заявки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (48, 'SMMC', 'FOND', 'PRMR', 'RUB', 'ОФЗАД-Доразмещение: Адресные заявки', 'ОФЗАД-Доразмещение: Адресные заявки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (49, 'SMVC', 'FOND', 'PRMR', 'RUB', 'ОФЗПК-Доразмещение: Адресные заявки', 'ОФЗПК-Доразмещение: Адресные заявки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (50, 'UBEC', 'FOND', 'SCND', 'RUB', 'Режим непрерывных торгов', 'Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (51, 'UBFC', 'FOND', 'SCND', 'RUB', 'СПВБ: Обл. с ПД - Торги', 'СПВБ: Обл. с ПД - Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (52, 'UBIC', 'FOND', 'SCND', 'RUB', 'СПВБ: Обл. с ИН - Торги', 'СПВБ: Обл. с ИН - Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (53, 'UBMC', 'FOND', 'SCND', 'RUB', 'СПВБ: Обл. с АД - Торги', 'СПВБ: Обл. с АД - Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (54, 'UBVC', 'FOND', 'SCND', 'RUB', 'СПВБ: Обл. с ПК - Торги', 'СПВБ: Обл. с ПК - Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (55, 'UEPC', 'FOND', 'SCND', 'RUB', 'Режим непрерывных торгов', 'Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (56, 'UESC', 'FOND', 'SCND', 'RUB', 'СПВБ: Акции – Торги', 'СПВБ: Акции – Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (57, 'UKVC', 'FOND', 'SCND', 'RUB', 'Режим непрерывных торгов', 'Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (58, 'UMFC', 'FOND', 'SCND', 'RUB', 'ОФЗПД-Режим непрерывных торгов', 'ОФЗПД-Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (59, 'UMIC', 'FOND', 'SCND', 'RUB', 'ОФЗИН-Режим непрерывных торгов', 'ОФЗИН-Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (60, 'UMMC', 'FOND', 'SCND', 'RUB', 'ОФЗАД-Режим непрерывных торгов', 'ОФЗАД-Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (61, 'UMVC', 'FOND', 'SCND', 'RUB', 'ОФЗПК-Режим непрерывных торгов', 'ОФЗПК-Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (62, 'WBFC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (63, 'WBIC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (64, 'WBMC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (65, 'WBVC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (66, 'WEPC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (67, 'WESC', 'FOND', 'PRMR', 'RUB', 'Размещение: адресные заявки (подписка)', 'Размещение: адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (68, 'ABZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл. - Аукцион', 'СПВБ: Диск. обл. - Аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (69, 'SBZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл.-Доразмещение', 'СПВБ: Диск. обл.-Доразмещение') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (70, 'UBZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл. - Торги', 'СПВБ: Диск. обл. - Торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (71, 'NBZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл. - РПС', 'СПВБ: Диск. обл. - РПС') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (72, 'DBZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл. - Дискретный аукцион', 'СПВБ: Диск. обл. - Дискретный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (73, 'WBZC', 'FOND', 'PRMR', 'RUB', 'СПВБ: Диск. обл. - адресные заявки (подписка)', 'СПВБ: Диск. обл. - адресные заявки (подписка)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (74, 'XMDTATSS', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (75, 'XMDTAVGB', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (76, 'XMDTFSKB', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (77, 'XMDTKFLO', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (78, 'XMDTKFSP', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (79, 'XMNTFSKB', 'MKR', 'PRMR', 'RUB', 'Депозитные торги (аукцион)', 'Депозитные торги (аукцион)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (80, 'XMNTKFLO', 'MKR', 'PRMR', 'RUB', 'Депозитные торги (аукцион)', 'Депозитные торги (аукцион)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (81, 'XMNTKFSP', 'MKR', 'PRMR', 'RUB', 'Депозитные торги (аукцион)', 'Депозитные торги (аукцион)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (82, 'XMDSFSKB', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (83, 'XMDSKFLO', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (84, 'XMDSKFSP', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитный аукцион', 'Размещение: депозитный аукцион') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (85, 'XMTTKFSP', 'MKR', 'PRMR', 'RUB', 'Размещение: депозитные торги', 'Размещение: депозитные торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, CODE, SECTION, MARKET_TYPE, SETTLEMENT_CURRENCY, NAME, DESCRIPTION) values (86, 'XMNSKFLO', 'MKR', 'PRMR', 'RUB', 'Депозитные торги (аукцион)', 'Депозитные торги (аукцион)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, NAME = EXCLUDED.NAME, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (96, 'PRMR', 'CURR', 'RUB', 'UVAV', 'Двусторонний непрерывный аукцион', 1, 'Двусторонний непрерывный аукцион (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (97, 'PRMR', 'CURR', 'RUB', 'NVAV', 'Режим адресных сделок с клирингом и расчетами на СПВБ', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; - -INSERT INTO MARKET(ID, EXCHANGE_ID, NAME, CODE, SETTLEMENT_CURRENCY, SECTION, MARKET_TYPE, DESCRIPTION) values (103, 1, 'Режим непрерывных торгов', 'UDXC', 'RUB', 'FOND', 'SCND', 'СПВБ: Цифровые свидетельства с индексируемым номиналом УЦП – Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, NAME = EXCLUDED.NAME, CODE = EXCLUDED.CODE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE; - -INSERT INTO MARKET(ID, EXCHANGE_ID, NAME, CODE, SETTLEMENT_CURRENCY, SECTION, MARKET_TYPE, DESCRIPTION) values (104, 1, 'Режим непрерывных торгов', 'UDUC', 'RUB', 'FOND', 'SCND', 'СПВБ: Цифровые свидетельства с постоянным номиналом УЦП – Режим непрерывных торгов') ON CONFLICT (ID) DO UPDATE SET EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, NAME = EXCLUDED.NAME, CODE = EXCLUDED.CODE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE; - -INSERT INTO MARKET(ID, EXCHANGE_ID, NAME, CODE, SETTLEMENT_CURRENCY, SECTION, MARKET_TYPE, DESCRIPTION) values (105, 1, 'Режим переговорных сделок (РПС)', 'NDXC', 'RUB', 'FOND', 'SCND', 'СПВБ: Цифровые свидетельства с индексируемым номиналом УЦП – Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, NAME = EXCLUDED.NAME, CODE = EXCLUDED.CODE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE; - -INSERT INTO MARKET(ID, EXCHANGE_ID, NAME, CODE, SETTLEMENT_CURRENCY, SECTION, MARKET_TYPE, DESCRIPTION) values (106, 1, 'Режим переговорных сделок (РПС)', 'NDUC', 'RUB', 'FOND', 'SCND', 'СПВБ: Цифровые свидетельства с постоянным номиналом УЦП – Режим переговорных сделок (РПС)') ON CONFLICT (ID) DO UPDATE SET EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, NAME = EXCLUDED.NAME, CODE = EXCLUDED.CODE, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, SECTION = EXCLUDED.SECTION, MARKET_TYPE = EXCLUDED.MARKET_TYPE; +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Акции. Торги', 1, 'СПВБ: Акции. Торги', 'UESC', 'RUB', 'FOND', 'SCND', 1); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NESC', 'RUB', 'FOND', 'SCND', 2); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DESC', 'RUB', 'FOND', 'SCND', 3); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене)', 'AESC', 'RUB', 'FOND', 'PRMR', 4); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WESC', 'RUB', 'FOND', 'PRMR', 5); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим непрерывных торгов', 1, 'Режим непрерывных торгов', 'UEPC', 'RUB', 'FOND', 'SCND', 6); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NEPC', 'RUB', 'FOND', 'SCND', 7); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DEPC', 'RUB', 'FOND', 'SCND', 8); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене)', 'AEPC', 'RUB', 'FOND', 'PRMR', 9); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WEPC', 'RUB', 'FOND', 'PRMR', 10); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПК - Аукцион ', 1, 'СПВБ: Обл. с ПК - Аукцион', 'ABVC', 'RUB', 'FOND', 'PRMR', 11); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПК-Доразмещение', 1, 'СПВБ: Обл. с ПК-Доразмещение', 'SBVC', 'RUB', 'FOND', 'PRMR', 12); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке', 'KBVC', 'RUB', 'FOND', 'PRMR', 13); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПК - Торги', 1, 'СПВБ: Обл. с ПК - Торги', 'UBVC', 'RUB', 'FOND', 'SCND', 14); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NBVC', 'RUB', 'FOND', 'SCND', 15); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DBVC', 'RUB', 'FOND', 'SCND', 16); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WBVC', 'RUB', 'FOND', 'PRMR', 17); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПД-Аукцион ', 1, 'СПВБ: Обл. с ПД-Аукцион ', 'ABFC', 'RUB', 'FOND', 'PRMR', 18); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПД - Доразмещение', 1, 'СПВБ: Обл. с ПД - Доразмещение', 'SBFC', 'RUB', 'FOND', 'PRMR', 19); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке', 'KBFC', 'RUB', 'FOND', 'PRMR', 20); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ПД - Торги', 1, 'СПВБ: Обл. с ПД - Торги', 'UBFC', 'RUB', 'FOND', 'SCND', 21); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NBFC', 'RUB', 'FOND', 'SCND', 22); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DBFC', 'RUB', 'FOND', 'SCND', 23); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WBFC', 'RUB', 'FOND', 'PRMR', 24); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ИН - Аукцион ', 1, 'СПВБ: Обл. с ИН - Аукцион ', 'ABIC', 'RUB', 'FOND', 'PRMR', 25); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ИН - Доразмещение', 1, 'СПВБ: Обл. с ИН - Доразмещение', 'SBIC', 'RUB', 'FOND', 'PRMR', 26); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке', 'KBIC', 'RUB', 'FOND', 'PRMR', 27); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с ИН - Торги', 1, 'СПВБ: Обл. с ИН - Торги', 'UBIC', 'RUB', 'FOND', 'SCND', 28); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NBIC', 'RUB', 'FOND', 'SCND', 29); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DBIC', 'RUB', 'FOND', 'SCND', 30); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WBIC', 'RUB', 'FOND', 'PRMR', 31); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с АД - Аукцион ', 1, 'СПВБ: Обл. с АД - Аукцион', 'ABMC', 'RUB', 'FOND', 'PRMR', 32); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с АД -Доразмещение', 1, 'СПВБ: Обл. с АД -Доразмещение', 'SBMC', 'RUB', 'FOND', 'PRMR', 33); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке', 'KBMC', 'RUB', 'FOND', 'PRMR', 34); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Обл. с АД - Торги', 1, 'СПВБ: Обл. с АД - Торги', 'UBMC', 'RUB', 'FOND', 'SCND', 35); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NBMC', 'RUB', 'FOND', 'SCND', 36); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DBMC', 'RUB', 'FOND', 'SCND', 37); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка)', 'WBMC', 'RUB', 'FOND', 'PRMR', 38); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл. - Аукцион ', 1, 'СПВБ: Диск. обл. - Аукцион', 'ABZC', 'RUB', 'FOND', 'PRMR', 39); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл.-Доразмещение', 1, 'СПВБ: Диск. обл.-Доразмещение', 'SBZC', 'RUB', 'FOND', 'PRMR', 40); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл. - Торги', 1, 'СПВБ: Диск. обл. - Торги', 'UBZC', 'RUB', 'FOND', 'SCND', 41); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл. - РПС', 1, 'СПВБ: Диск. обл. - РПС', 'NBZC', 'RUB', 'FOND', 'SCND', 42); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл. - Дискретный аукцион', 1, 'СПВБ: Диск. обл. - Дискретный аукцион', 'DBZC', 'RUB', 'FOND', 'SCND', 43); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Диск. обл. - адресные заявки (подписка)', 1, 'СПВБ: Диск. обл. - адресные заявки (подписка)', 'WBZC', 'RUB', 'FOND', 'PRMR', 44); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион СПВБ', 1, 'Размещение: Аукцион СПВБ', 'ABEC', 'RUB', 'FOND', 'PRMR', 45); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим непрерывных торгов', 1, 'Режим непрерывных торгов', 'UBEC', 'RUB', 'FOND', 'SCND', 46); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NBEC', 'RUB', 'FOND', 'SCND', 47); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DBEC', 'RUB', 'FOND', 'SCND', 48); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: Аукцион БР', 1, 'Размещение: Аукцион БР', 'BKVC', 'RUB', 'FOND', 'PRMR', 49); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Доразмещение: Адресные заявки БР', 1, 'Доразмещение: Адресные заявки БР', 'SKVC', 'RUB', 'FOND', 'PRMR', 50); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим непрерывных торгов', 1, 'Режим непрерывных торгов', 'UKVC', 'RUB', 'FOND', 'SCND', 51); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NKVC', 'RUB', 'FOND', 'SCND', 52); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Дискретный аукцион', 1, 'Дискретный аукцион', 'DKVC', 'RUB', 'FOND', 'SCND', 53); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПК-Размещение: Аукцион', 1, 'ОФЗПК-Размещение: Аукцион', 'BMVC', 'RUB', 'FOND', 'PRMR', 54); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПК-Доразмещение: Адресные заявки', 1, 'ОФЗПК-Доразмещение: Адресные заявки', 'SMVC', 'RUB', 'FOND', 'PRMR', 55); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПК-Режим непрерывных торгов', 1, 'ОФЗПК-Режим непрерывных торгов', 'UMVC', 'RUB', 'FOND', 'SCND', 56); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПК-Дискретный аукцион', 1, 'ОФЗПК-Дискретный аукцион', 'DMVC', 'RUB', 'FOND', 'SCND', 57); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПК-Торги в режиме выкупа', 1, 'ОФЗПК-Торги в режиме выкупа', 'PMVC', 'RUB', 'FOND', 'SCND', 58); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПД-Размещение: Аукцион', 1, 'ОФЗПД-Размещение: Аукцион', 'BMFC', 'RUB', 'FOND', 'PRMR', 59); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПД- Доразмещение: Адресные заявки', 1, 'ОФЗПД- Доразмещение: Адресные заявки', 'SMFC', 'RUB', 'FOND', 'PRMR', 60); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПД-Режим непрерывных торгов', 1, 'ОФЗПД-Режим непрерывных торгов', 'UMFC', 'RUB', 'FOND', 'SCND', 61); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПД-Дискретный аукцион', 1, 'ОФЗПД-Дискретный аукцион', 'DMFC', 'RUB', 'FOND', 'SCND', 62); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗПД-Торги в режиме выкупа', 1, 'ОФЗПД-Торги в режиме выкупа', 'PMFC', 'RUB', 'FOND', 'SCND', 63); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗАД-Размещение: Аукцион', 1, 'ОФЗАД-Размещение: Аукцион', 'BMMC', 'RUB', 'FOND', 'PRMR', 64); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗАД-Доразмещение: Адресные заявки', 1, 'ОФЗАД-Доразмещение: Адресные заявки', 'SMMC', 'RUB', 'FOND', 'PRMR', 65); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗАД-Режим непрерывных торгов', 1, 'ОФЗАД-Режим непрерывных торгов', 'UMMC', 'RUB', 'FOND', 'SCND', 66); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗАД-Дискретный аукцион', 1, 'ОФЗАД-Дискретный аукцион', 'DMMC', 'RUB', 'FOND', 'SCND', 67); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗАД-Торги в режиме выкупа', 1, 'ОФЗАД-Торги в режиме выкупа', 'PMMC', 'RUB', 'FOND', 'SCND', 68); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗИН-Размещение: Аукцион', 1, 'ОФЗИН-Размещение: Аукцион', 'BMIC', 'RUB', 'FOND', 'PRMR', 69); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗИН-Доразмещение: Адресные заявки', 1, 'ОФЗИН-Доразмещение: Адресные заявки', 'SMIC', 'RUB', 'FOND', 'PRMR', 70); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗИН-Режим непрерывных торгов', 1, 'ОФЗИН-Режим непрерывных торгов', 'UMIC', 'RUB', 'FOND', 'SCND', 71); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗИН-Дискретный аукцион', 1, 'ОФЗИН-Дискретный аукцион', 'DMIC', 'RUB', 'FOND', 'SCND', 72); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗИН-Торги в режиме выкупа', 1, 'ОФЗИН-Торги в режиме выкупа', 'PMIC', 'RUB', 'FOND', 'SCND', 73); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTATSS', 'RUB', 'MKR', 'PRMR', 74); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTAVGB', 'RUB', 'MKR', 'PRMR', 75); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTFSKB', 'RUB', 'MKR', 'PRMR', 76); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTKFLO', 'RUB', 'MKR', 'PRMR', 77); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTKFSP', 'RUB', 'MKR', 'PRMR', 78); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Депозитные торги (аукцион)', 1, 'Депозитные торги (аукцион)', 'XMNTFSKB', 'RUB', 'MKR', 'PRMR', 79); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Депозитные торги (аукцион)', 1, 'Депозитные торги (аукцион)', 'XMNTKFLO', 'RUB', 'MKR', 'PRMR', 80); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Депозитные торги (аукцион)', 1, 'Депозитные торги (аукцион)', 'XMNTKFSP', 'RUB', 'MKR', 'PRMR', 81); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDSFSKB', 'RUB', 'MKR', 'PRMR', 82); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDSKFLO', 'RUB', 'MKR', 'PRMR', 83); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDSKFSP', 'RUB', 'MKR', 'PRMR', 84); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитные торги', 1, 'Размещение: депозитные торги', 'XMTTKFSP', 'RUB', 'MKR', 'PRMR', 85); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Депозитные торги (аукцион)', 1, 'Депозитные торги (аукцион)', 'XMNSKFLO', 'RUB', 'MKR', 'PRMR', 86); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Депозитные торги (аукцион)', 1, 'Депозитные торги (аукцион)', 'XMNSKFSP', 'RUB', 'MKR', 'PRMR', 87); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Размещение: депозитный аукцион', 1, 'Размещение: депозитный аукцион', 'XMDTVRGO', 'RUB', 'MKR', 'PRMR', 88); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗ-АД - Аукцион БР', 1, 'ОФЗ-АД - Аукцион БР', 'BBMC', 'RUB', 'FOND', 'PRMR', 89); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗ-ПД - Аукцион БР', 1, 'ОФЗ-ПД - Аукцион БР', 'BBFC', 'RUB', 'FOND', 'PRMR', 90); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗ-ИН - Аукцион БР', 1, 'ОФЗ-ИН - Аукцион БР', 'BBIC', 'RUB', 'FOND', 'PRMR', 91); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('ОФЗ-ПК - Аукцион БР', 1, 'ОФЗ-ПК - Аукцион БР', 'BBVC', 'RUB', 'FOND', 'PRMR', 92); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Двусторонний непрерывный аукцион (TOD)', 1, 'Двусторонний непрерывный аукцион', 'UVAV', 'RUB', 'CURR', 'SCND', 96); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ', 'NVAV', 'RUB', 'CURR', 'SCND', 97); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Цифровые свидетельства с индексируемым номиналом УЦП – Режим непрерывных торгов', 1, 'Режим непрерывных торгов', 'UDXC', 'RUB', 'FOND', 'SCND', 103); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Цифровые свидетельства с постоянным номиналом УЦП – Режим непрерывных торгов', 1, 'Режим непрерывных торгов', 'UDUC', 'RUB', 'FOND', 'SCND', 104); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Цифровые свидетельства с индексируемым номиналом УЦП – Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NDXC', 'RUB', 'FOND', 'SCND', 105); +insert into market (description, exchange_id, name, code, settlement_currency, section, market_type, id) values ('СПВБ: Цифровые свидетельства с постоянным номиналом УЦП – Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС)', 'NDUC', 'RUB', 'FOND', 'SCND', 106); \ No newline at end of file From c8a317c0c8e4310d6f73297833d2479c35d670ae Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 6 Jun 2025 13:41:30 +0300 Subject: [PATCH 20/61] actual MARKET_LCC.sql --- .../db-scripts/src/main/resources/db/MARKET_LCC.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql diff --git a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql new file mode 100644 index 000000000..746c720f1 --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql @@ -0,0 +1,11 @@ +-- DB version: 3.11.0.78 +-- DATA version: 3.11.0.78 +-- INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.11.0.78') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION + + +/* Dictionaries */ + +/* Business objects */ + +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим адресных сделок с клирингом и расчетами на СПВБ', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'UVWK', 'Режим адресных сделок с клирингом и расчетами на СПВБ', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; From 19fb640d7e73a6a65e216c564b0e76f5938004fb Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Fri, 6 Jun 2025 16:28:28 +0300 Subject: [PATCH 21/61] clearing_test repository branch changed to successful_set_export_fixed --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20abafe65..d6901939f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,7 +17,7 @@ preflight: stage: preflight script: - pwd - - git clone -b successful_set_with_df01_renamed "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git" + - git clone -b successful_set_export_fixed "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git" artifacts: name: "$CI_COMMIT_REF_NAME" expire_in: 1 day From ead7b1cf5d4444e7513ce5be86bb2ea04a9e389e Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Mon, 9 Jun 2025 10:50:45 +0300 Subject: [PATCH 22/61] clearing-tester.jar updated --- .../clearing-tester/clearing-tester.jar | Bin 58104846 -> 58104512 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar b/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar index 397312c8b05d89d258876f6585e08cae0032090d..8a6d073779f22dc758543fda4e718bfbad2de5eb 100644 GIT binary patch delta 30267 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
F}^WZnB_e%*e;;sQhZ`Bpou#M4Pl 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 Date: Mon, 9 Jun 2025 12:09:01 +0300 Subject: [PATCH 23/61] add dictionaries values for lcc --- .../src/main/resources/db/DATA_INITIAL.sql | 25 +++++++++++--- .../main/resources/db/DATA_INITIAL_LCC.sql | 34 +++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL_LCC.sql diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL.sql index eccec4bd2..4ee1f39bf 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL.sql @@ -25,13 +25,28 @@ INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (840, 'USD') ON CONFLICT (ID) DO INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (978, 'EUR') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (156, 'CNY') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; +INSERT INTO CURRENCY (ID, CURRENCY_CODE) VALUES (398, 'KZT') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; +INSERT INTO CURRENCY (ID, CURRENCY_CODE) VALUES (51, 'AMD') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; +INSERT INTO CURRENCY (ID, CURRENCY_CODE) VALUES (417, 'KGS') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; +INSERT INTO CURRENCY (ID, CURRENCY_CODE) VALUES (860, 'UZS') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; +INSERT INTO CURRENCY (ID, CURRENCY_CODE) VALUES (933, 'BYN') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; INSERT INTO SECURITY(ID, INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS) values (643, 'CRNC', 'RUB', 'Российский рубль', 'RUB', 'ACTV') ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; INSERT INTO SECURITY(ID, INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS) values (840, 'CRNC', 'USD', 'Доллар США', 'USD', 'ACTV') ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; -INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (1, 1, '30414810300000006000', 'TRAN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; - -INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (2, 1, '30414810600000007000', 'ANLT', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; - -INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (3, 1, '700100000AT0', 'DTRN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (1, '30414810300000006000', 'TRAN', 'ACTV', 'ALWD', 1, 'RUB') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (2, '30414810600000007000', 'ANLT', 'ACTV', 'ALWD', 1, 'RUB') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (3, '700100000AT0', 'DTRN', 'ACTV', 'ALWD', 1, '') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (4, '30414156500000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'CNY') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (5, '30414156200000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'CNY') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (6, '30414860100000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'UZS') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (7, '30414860800000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'UZS') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (10, '30414398300000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'KZT') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (11, '30414398000000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'KZT') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (12, '30414417100000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'KGS') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (13, '30414417800000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'KGS') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (14, '30414933600000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'BYN') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (15, '30414933300000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'BYN') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (16, '30414051100000007000' ,'ANLT' ,'ACTV' ,'ALWD' ,1, 'AMD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT (ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN, COMPANY_ID, CURRENCY) VALUES (17, '30414051800000006000' ,'TRAN' ,'ACTV' ,'ALWD' ,1, 'AMD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; \ No newline at end of file diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL_LCC.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL_LCC.sql new file mode 100644 index 000000000..b9eda0893 --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/DATA_INITIAL_LCC.sql @@ -0,0 +1,34 @@ +-- DB version: 3.8 +-- DATA version: 3.9.0.68 + + +/* Dictionaries */ + +/* Business objects */ +INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (1, 'АО Санкт-Петербургская Валютная Биржа', 'СПВБ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (2, 'ЗАО «Петербургский Расчетный Центр»', 'ПРЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (3, 'Торговая организация', 'ТС', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (4, 'ЗАО «Санкт-Петербургский Расчетно-Депозитарный Центр»', 'РДЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (5, 'ЛЦК', 'ЛЦК', '800', '800', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (1, 1, 'BIC', '044030920') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE; + +INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (2, 2, 'BIC', '044030505') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE; + +INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (643, 'RUB') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; + +INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (156, 'CNY') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE; + +INSERT INTO SECURITY(ID, INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS) values (643, 'CRNC', 'RUB', 'Российский рубль', 'RUB', 'ACTV') ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO SECURITY(ID, INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS) values (156, 'CRNC', 'CNY', 'Китайский юань', 'CNY', 'ACTV') ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS; + +INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN,currency) values (1, 5, 'TRAN', 'TRAN', 'ACTV', 'ALWD','RUB') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN,currency) values (5, 5, 'TRANCNY', 'TRAN', 'ACTV', 'ALWD','CNY') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN,CURRENCY) values (2, 5, '30414810900000000600', 'ANLT', 'ACTV', 'ALWD','RUB') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN,CURRENCY) values (4, 5, '30414156800000000600', 'ANLT', 'ACTV', 'ALWD','CNY') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; +INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (3, 5, '700100000AT0', 'DTRN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN; From 88be2dbe41ec4da4d0837107a30a355b1d14d68a Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 9 Jun 2025 13:05:06 +0300 Subject: [PATCH 24/61] add dictionaries values for lcc --- .../db-scripts/src/main/resources/db/MARKET_LCC.sql | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql index 746c720f1..e4b31705e 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql @@ -1,11 +1,10 @@ --- DB version: 3.11.0.78 --- DATA version: 3.11.0.78 --- INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.11.0.78') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION +-- DB version: 3.18 +-- MARKET LCC version: 3.18.0.1 /* Dictionaries */ /* Business objects */ -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим адресных сделок с клирингом и расчетами на СПВБ', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'UVWK', 'Режим адресных сделок с клирингом и расчетами на СПВБ', 1, 'Режим адресных сделок с клирингом и расчетами на СПВБ (TOD)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'UVWK', 'СВОП. Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'СВОП. Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; From 24fe8f7d708ae9474c1ca43a05d4cbe9d27865d2 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 9 Jun 2025 13:19:54 +0300 Subject: [PATCH 25/61] add dictionaries values for lcc --- .../backend-api/src/main/resources/meta/meta.json | 6 +++--- .../backend-api/src/main/resources/meta/meta.xml | 6 +++--- .../db-scripts/src/main/resources/db/MARKET_LCC.sql | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 14d9c59c7..95a16de87 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.18.240.130", + "version": "3.18.240.131", "enums": { @@ -6810,7 +6810,7 @@ } , {"code": "market", - "type": 12,"dbname": "Код секции валютного инструмента","name": "Секция валютного инструмента","shortname": "Секция","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "description" + "type": 12,"dbname": "Код секции валютного инструмента","name": "Секция валютного инструмента","shortname": "Секция","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "name" } , {"code": "marketName", @@ -11491,7 +11491,7 @@ { "code": "marketName" - ,"field": "market","type": 12,"dbname": "Код секции валютного инструмента","name": "Наименование класса валютного инструмента","shortname": "Наименование класса","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "description" + ,"field": "market","type": 12,"dbname": "Код секции валютного инструмента","name": "Наименование класса валютного инструмента","shortname": "Наименование класса","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "name" } , diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 7a7a722cf..ac00cb56e 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -1579,7 +1579,7 @@ - + @@ -2669,7 +2669,7 @@ - + diff --git a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql index e4b31705e..fc0f21bd1 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql @@ -6,5 +6,5 @@ /* Business objects */ -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; -INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'UVWK', 'СВОП. Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'СВОП. Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1000, 'SCND', 'CURR', 'RUB', 'UVAK', 'Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'Continuous trading mode (foreign currency trading with a Liquidity Provider)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; +INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1001, 'SCND', 'CURR', 'RUB', 'UVWK', 'СВОП. Режим непрерывных торгов (торги иностранной валютой с Провайдером ликвидности)', 1, 'SWAP. Continuous trading mode (foreign currency trading with a Liquidity Provider)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION; From 7fc0b784d152d7b5a56e219cd7ae83cbe755662e Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 9 Jun 2025 15:53:48 +0300 Subject: [PATCH 26/61] up pom version --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- clearing-parent/xml-exporter/pom.xml | 4 ++-- clearing-parent/xml-importer/pom.xml | 4 ++-- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 33 files changed, 67 insertions(+), 67 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index ba36b5bb1..e98bcf8f6 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 492563c33..26a6e4e74 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 029d120f1..5f57df0dd 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index 870923128..240048a0e 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 6f1c627a5..5b0a5d5af 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.18.241 + SPCEX-3.18.242 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index e148c7a21..caafa7070 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 700759b13..977b8b96b 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile ru.spcex.clearing dictionary - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 8dd15dc9f..a7e399655 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 6cd1bc728..458336636 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 5c599aff9..cc0b821a6 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index 54181deee..b9745a000 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index fe0051194..3cf1cbbd8 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 1d2014ef8..8c27a8ff1 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.18.241 + SPCEX-3.18.242 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 8a7161118..46e546f9e 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index f5cd60c30..6b1086f63 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile ru.spcex.clearing dictionary - SPCEX-3.18.241 + SPCEX-3.18.242 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index ae0e30651..f657d84fb 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile ru.spcex.clearing dictionary - SPCEX-3.18.241 + SPCEX-3.18.242 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index fcbb1254a..402d411b1 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.18.241 + SPCEX-3.18.242 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index a55435d27..1807cf334 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.18.241 + SPCEX-3.18.242 clearing ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 45618a37a..40ab55be7 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 12f708819..f669db194 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index 9b3d30317..d6fa158e0 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index d2287a2d0..70ab6229c 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index 5048c1543..9e3af12bd 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile ru.spcex.clearing dictionary - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index b558ffb1f..2bbf13646 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.18.241 + SPCEX-3.18.242 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 9a64c8ff0..0a5c92024 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index aca96dab3..0dcd39259 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 test-clearing Test-clearing - SPCEX-3.18.241 + SPCEX-3.18.242 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index a630f763f..46c157e4c 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.241 + SPCEX-3.18.242 trade-importer trade-importer Trade importer module - SPCEX-3.18.241 + SPCEX-3.18.242 jar @@ -55,7 +55,7 @@ ru.spcex.clearing classes - SPCEX-3.18.241 + SPCEX-3.18.242 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index d572e10a2..f5505b752 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 diff --git a/clearing-parent/xml-exporter/pom.xml b/clearing-parent/xml-exporter/pom.xml index 8068ff0fb..00a535657 100644 --- a/clearing-parent/xml-exporter/pom.xml +++ b/clearing-parent/xml-exporter/pom.xml @@ -7,12 +7,12 @@ xml-exporter xml-exporter XML exporter for XML files - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/clearing-parent/xml-importer/pom.xml b/clearing-parent/xml-importer/pom.xml index 888d06318..fa4616542 100644 --- a/clearing-parent/xml-importer/pom.xml +++ b/clearing-parent/xml-importer/pom.xml @@ -8,12 +8,12 @@ xml-importer xml-importer XML loader for XML files - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 7c8a60e0b..f412ddda6 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.18.241 + SPCEX-3.18.242 diff --git a/pom.xml b/pom.xml index 5131b3b6f..70b8d9558 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.18.241 + SPCEX-3.18.242 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.18.241 + SPCEX-3.18.242 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 4e5052d10..2804db08a 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.18.241 + SPCEX-3.18.242 4.0.0 From a70efb051dc55d6999802f99a3aa419284666b04 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 9 Jun 2025 15:55:55 +0300 Subject: [PATCH 27/61] update meta --- clearing-parent/backend-api/src/main/resources/meta/meta.json | 2 +- clearing-parent/backend-api/src/main/resources/meta/meta.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 95a16de87..30ef4eadd 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.18.240.131", + "version": "3.18.242.132", "enums": { diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index ac00cb56e..777ab0383 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + From 169302163e1ba65343bf968ae137c0d00822be4a Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 16 Jun 2025 14:16:21 +0300 Subject: [PATCH 28/61] http://jira.mfd.msk:8088/browse/CLS-863 --- .../service/adapter/DigitalSecurityRequestAdapter.java | 1 + .../securities/service/cud/GatewaySecurityService.java | 4 ++-- .../DigitalCertificateSecurityGatewayRequest.java | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java index fd2e769ff..66be9e235 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java @@ -15,6 +15,7 @@ public class DigitalSecurityRequestAdapter { gatewayRequest.setDepoDcId(digitalCertificate.getDepoDcId()); gatewayRequest.setInstrumentType(digitalCertificate.getInstrumentType()); gatewayRequest.setIssuerId(digitalCertificate.getIssuerId()); + gatewayRequest.setInn(digitalCertificate.getUcp().getCompanyInn()); gatewayRequest.setShortName(digitalCertificate.getShortName()); gatewayRequest.setFullName(digitalCertificate.getFullName()); gatewayRequest.setFullNameEng(digitalCertificate.getFullNameEng()); diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index 3491cccac..558f88ec6 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -481,8 +481,8 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload(); Map> query = new HashMap<>(); - query.put("companySymbol", CompanySymbol.UUID.getKey()); - query.put("companySymbolValue", request.getIssuerId()); + query.put("companySymbol", CompanySymbol.INN.getKey()); + query.put("companySymbolValue", request.getInn()); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(query); Long companyId = null; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java index a6dd25d2b..6ddeb5b30 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/DigitalCertificateSecurityGatewayRequest.java @@ -21,6 +21,8 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym @JsonProperty private UUID issuerId; @JsonProperty + private String inn; + @JsonProperty private String shortName; @JsonProperty private String fullName; @@ -78,6 +80,14 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym this.issuerId = issuerId; } + public String getInn() { + return inn; + } + + public void setInn(String inn) { + this.inn = inn; + } + public String getShortName() { return shortName; } From 0170de8e7319dae3ae29fafd47c22503154f86c3 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 16 Jun 2025 14:17:33 +0300 Subject: [PATCH 29/61] increase version --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- clearing-parent/xml-exporter/pom.xml | 4 ++-- clearing-parent/xml-importer/pom.xml | 4 ++-- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 33 files changed, 67 insertions(+), 67 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index e98bcf8f6..0f6b30ad6 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 26a6e4e74..341661ab1 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 5f57df0dd..cf9a22d88 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index 240048a0e..c62bf71ba 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 5b0a5d5af..5d7cbeed9 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.18.242 + SPCEX-3.18.243 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index caafa7070..a679f7dc5 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 977b8b96b..84fcb33af 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile ru.spcex.clearing dictionary - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index a7e399655..032d87580 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 458336636..0feddd9d5 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index cc0b821a6..5bbdbcee2 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index b9745a000..56b431c7e 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 3cf1cbbd8..58593fe54 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 8c27a8ff1..a209217f0 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.18.242 + SPCEX-3.18.243 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 46e546f9e..4449e7aca 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index 6b1086f63..9acf40257 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile ru.spcex.clearing dictionary - SPCEX-3.18.242 + SPCEX-3.18.243 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index f657d84fb..7263e7f8b 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile ru.spcex.clearing dictionary - SPCEX-3.18.242 + SPCEX-3.18.243 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index 402d411b1..f3551cf6d 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.18.242 + SPCEX-3.18.243 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 1807cf334..58738ec3c 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.18.242 + SPCEX-3.18.243 clearing ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 40ab55be7..dd65d3184 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index f669db194..277ee1e41 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index d6fa158e0..97b508803 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index 70ab6229c..c570c950d 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index 9e3af12bd..d8a9bad1d 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile ru.spcex.clearing dictionary - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 2bbf13646..636fa6c63 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.18.242 + SPCEX-3.18.243 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 0a5c92024..d09e42e92 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index 0dcd39259..1b0a5a53d 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 test-clearing Test-clearing - SPCEX-3.18.242 + SPCEX-3.18.243 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 46c157e4c..40c8f65aa 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.242 + SPCEX-3.18.243 trade-importer trade-importer Trade importer module - SPCEX-3.18.242 + SPCEX-3.18.243 jar @@ -55,7 +55,7 @@ ru.spcex.clearing classes - SPCEX-3.18.242 + SPCEX-3.18.243 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index f5505b752..69ab6d33f 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 diff --git a/clearing-parent/xml-exporter/pom.xml b/clearing-parent/xml-exporter/pom.xml index 00a535657..e2fb00bc2 100644 --- a/clearing-parent/xml-exporter/pom.xml +++ b/clearing-parent/xml-exporter/pom.xml @@ -7,12 +7,12 @@ xml-exporter xml-exporter XML exporter for XML files - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/clearing-parent/xml-importer/pom.xml b/clearing-parent/xml-importer/pom.xml index fa4616542..9239ad8c0 100644 --- a/clearing-parent/xml-importer/pom.xml +++ b/clearing-parent/xml-importer/pom.xml @@ -8,12 +8,12 @@ xml-importer xml-importer XML loader for XML files - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index f412ddda6..c88f6988f 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.18.242 + SPCEX-3.18.243 diff --git a/pom.xml b/pom.xml index 70b8d9558..1114cd123 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.18.242 + SPCEX-3.18.243 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.18.242 + SPCEX-3.18.243 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 2804db08a..558bf1246 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.18.242 + SPCEX-3.18.243 4.0.0 From 2ac98d9f392ca3c1603ad369d777a62c79fbe233 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 16 Jun 2025 16:38:32 +0300 Subject: [PATCH 30/61] http://jira.mfd.msk:8088/browse/CLS-861 --- .../BankAccountValidationConfig.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 4b8856552..6713d5fee 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -71,37 +71,37 @@ public class BankAccountValidationConfig { AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false), - ValidateSymbolsRule.required("bankIdentificationCode", + ValidateSymbolsRule.required("БИК", BankAccountNewRequest::getBankIdentificationCode, AccountError.RequiredFieldEmpty, AccountError.BadSymbol), - ValidateSymbolsRule.required("bankName", + ValidateSymbolsRule.required("Наименование компании", BankAccountNewRequest::getBankName, AccountError.RequiredFieldEmpty, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("correspondentAccount", + ValidateSymbolsRule.notRequired("Корр. счет", BankAccountNewRequest::getCorrespondentAccount, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("correspondentAccountName", + ValidateSymbolsRule.notRequired("Наименование корр. счета", BankAccountNewRequest::getCorrespondentAccountName, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("destination", + ValidateSymbolsRule.notRequired("Назначение платежа", BankAccountNewRequest::getDestination, AccountError.BadSymbol), - ValidateSymbolsRule.required("account", + ValidateSymbolsRule.required("Счет", BankAccountNewRequest::getAccount, AccountError.RequiredFieldEmpty, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("taxpayerIdentificationNumber", + ValidateSymbolsRule.notRequired("ИНН", BankAccountNewRequest::getTaxpayerIdentificationNumber, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("taxRegistrationReasonCode", + ValidateSymbolsRule.notRequired("КПП", BankAccountNewRequest::getTaxRegistrationReasonCode, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("swiftCode", + ValidateSymbolsRule.notRequired("SWIFT", BankAccountNewRequest::getSwiftCode, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("intermediarySwiftCode", + ValidateSymbolsRule.notRequired("SWIFT посредника", BankAccountNewRequest::getIntermediarySwiftCode, AccountError.BadSymbol) ); @@ -145,34 +145,34 @@ public class BankAccountValidationConfig { AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false), - ValidateSymbolsRule.notRequired("bankIdentificationCode", + ValidateSymbolsRule.notRequired("БИК", BankAccountUpdateRequest::getBankIdentificationCode, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("bankName", + ValidateSymbolsRule.notRequired("Наименование компании", BankAccountUpdateRequest::getBankName, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("correspondentAccount", + ValidateSymbolsRule.notRequired("Корр. счет", BankAccountUpdateRequest::getCorrespondentAccount, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("correspondentAccountName", + ValidateSymbolsRule.notRequired("Наименование корр. счета", BankAccountUpdateRequest::getCorrespondentAccountName, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("destination", + ValidateSymbolsRule.notRequired("Назначение платежа", BankAccountUpdateRequest::getDestination, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("account", + ValidateSymbolsRule.notRequired("Счет", BankAccountUpdateRequest::getAccount, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("taxpayerIdentificationNumber", + ValidateSymbolsRule.notRequired("ИНН", BankAccountUpdateRequest::getTaxpayerIdentificationNumber, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("taxRegistrationReasonCode", + ValidateSymbolsRule.notRequired("КПП", BankAccountUpdateRequest::getTaxRegistrationReasonCode, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("swiftCode", + ValidateSymbolsRule.notRequired("SWIFT", BankAccountUpdateRequest::getSwiftCode, AccountError.BadSymbol), - ValidateSymbolsRule.notRequired("intermediarySwiftCode", + ValidateSymbolsRule.notRequired("SWIFT посредника", BankAccountUpdateRequest::getIntermediarySwiftCode, AccountError.BadSymbol) ); From 5f42c6df63d2dbe8530cf16370613355ac95ba55 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 16 Jun 2025 17:02:50 +0300 Subject: [PATCH 31/61] http://jira.mfd.msk:8088/browse/CLS-863 --- .../gatewayapi/service/DigitalSecurityService.java | 8 ++++++++ .../service/adapter/DigitalSecurityRequestAdapter.java | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java index 3f8e3bf96..6291bf571 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java @@ -1,11 +1,13 @@ package ru.spcex.clearing.gatewayapi.service; import java.util.List; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.DigitalCertificate; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondDigitalListingsRequest; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.IssuerCompanySymbols; import ru.spcex.clearing.gatewayapi.service.adapter.DigitalSecurityRequestAdapter; import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -49,6 +51,12 @@ public class DigitalSecurityService { List listingRequests = request.getListingList().stream() .filter(incomeListing -> incomeListing.getSymbolCode().equals(security.getSecuritySymbol())) .map(securityRequestAdapter::toIncomeListing).toList(); + Optional innVal = request.getIssuerCompanySymbolsList().stream() + .filter(issuerCompanySymbols -> issuerCompanySymbols.getCompanyId().equals(security.getIssuerId()) + && issuerCompanySymbols.getCompanySymbol().equals("INN")) + .findFirst() + .map(IssuerCompanySymbols::getCompanySymbolValue); + innVal.ifPresent(digitalCertificateSecurityRequest::setInn); digitalCertificateSecurityRequest.setListing(listingRequests); kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_DGCT_GATEWAY, digitalCertificateSecurityRequest); } catch (Throwable e) { diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java index 66be9e235..fd2e769ff 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/DigitalSecurityRequestAdapter.java @@ -15,7 +15,6 @@ public class DigitalSecurityRequestAdapter { gatewayRequest.setDepoDcId(digitalCertificate.getDepoDcId()); gatewayRequest.setInstrumentType(digitalCertificate.getInstrumentType()); gatewayRequest.setIssuerId(digitalCertificate.getIssuerId()); - gatewayRequest.setInn(digitalCertificate.getUcp().getCompanyInn()); gatewayRequest.setShortName(digitalCertificate.getShortName()); gatewayRequest.setFullName(digitalCertificate.getFullName()); gatewayRequest.setFullNameEng(digitalCertificate.getFullNameEng()); From af0725284c80b1f0fe2a62263186476f2b8bfab7 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 17 Jun 2025 13:08:47 +0300 Subject: [PATCH 32/61] http://jira.mfd.msk:8088/browse/CLS-864 --- .../db-scripts/src/main/resources/db/DICTIONARIES.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql b/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql index 69035893d..ef5a988a8 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql @@ -8,6 +8,8 @@ INSERT INTO WORKFLOW_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Ак INSERT INTO WORKFLOW_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активен') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO WORKFLOW_STATUS_DICTIONARY(ID, CODE, NAME) values (3, 'PAUS', 'Приостановлен') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO COUNTRY_CODE_DICTIONARY(ID, CODE, NAME) values (1, 'RUS', 'Россия') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO SECTION_DICTIONARY(ID, CODE, NAME) values (1, 'MKR', 'Секция Денежного рынка МКР') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -644,6 +646,8 @@ INSERT INTO OBJECT_TYPE_DICTIONARY(ID, CODE, NAME) values (6, 'ACCB', 'account') INSERT INTO OBJECT_TYPE_DICTIONARY(ID, CODE, NAME) values (7, 'DIFF', 'registry') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO OBJECT_TYPE_DICTIONARY(ID, CODE, NAME) values (8, 'SESS', 'session') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO NOTIFICATION_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'PEND', 'В ожидании') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO NOTIFICATION_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'CNCL', 'Отменено') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; From a8aa50863902412f1a3eb4e554612e9fb64697c6 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 17 Jun 2025 17:05:32 +0300 Subject: [PATCH 33/61] http://jira.mfd.msk:8088/browse/CLS-862 --- .../execution/ExecutionDepositComponent.java | 49 ++++++++++++++++--- .../execution/ExecutionFondComponent.java | 41 ++++++++++++++-- 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index 943348330..8bed4e07e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -9,9 +9,11 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import static java.lang.String.format; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.EnableScheduling; @@ -27,6 +29,7 @@ import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingException; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType; @@ -36,6 +39,8 @@ import ru.spcex.clearing.service.validation.strades.CompanyByTradingCodeCashingV import ru.spcex.clearing.service.validation.strades.STradesSecurityPresentDepositValidationRule; import ru.spcex.clearing.service.validation.strades.TcrByCodeAndCmpIsActiveCashingValidationRule; import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; @@ -73,6 +78,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { private final Imdg imdgCompany; private final Imdg imdgTradingClearingRegistry; private final ImdgId idGen; + private final NotificationSender notifications; //fixme ждать ТЗ Long tradeNum; @@ -86,7 +92,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { @Autowired - public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer kafka, + public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer kafka, NotificationSender notifications, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, IMessageResolver msgResolver) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); @@ -96,6 +102,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { this.imdgCompany = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Company, Company.class, null); this.imdgTradingClearingRegistry = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null); this.idGen = imdgProvider.getImdgIdGenerator(); + this.notifications = notifications; this.kafkaSender = kafkaSender; this.msgResolver = msgResolver; @@ -154,7 +161,11 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation()); + logNotifyW(format( + "cannot parse strade.tradeNum=%d strade.operation %s", + sTrd.getTradeNum(), + sTrd.getOperation()) + ); return true; } MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; @@ -198,7 +209,10 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { } catch (ClearingException ce) { auditMessage(ce); } catch (Exception e) { - log.error("When create new ExecutionDeposit by STrade[{}] error: {}", sTrd.getId(), ExceptionUtils.getStackTrace(e)); + String err = String.format("When create new ExecutionDeposit by STrade[%d] error: %s", + sTrd.getId(), + ExceptionUtils.getStackTrace(e)); + logNotifyE(err); } } log.info("batch putAll {} ExecutionDeposit", execsToInsert.size()); @@ -211,7 +225,8 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { protected void auditMessage(ClearingException ce) { - log.error("AUDIT error code {}: {}", ce.getEnumMsg(), ce.getMessage()); + String err = String.format("AUDIT error code %s: %s", ce.getEnumMsg(), ce.getMessage()); + logNotifyE(err); } protected void sendNotification(ExecutionDeposit forED) throws ClearingException { @@ -330,11 +345,33 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { } private void logError(IEnumId subject, Object... args) { - log.info("{}", msgResolver.resolve(new EnumMessage(subject, args))); + String err = msgResolver.resolve(new EnumMessage(subject, args)); + log.info("{}", err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } + private void logError(Long sTradeId, EnumMessage msg) { - log.warn("sTrade id={} {}", sTradeId, msgResolver.resolve(msg)); + String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + log.warn(err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); + } + + private void logNotifyW(String msg) { + logNotify(msg, Level.WARN); + } + + private void logNotifyE(String msg) { + logNotify(msg, Level.ERROR); + } + + private void logNotify(String msg, Level lvl) { + switch (lvl) { + case WARN -> log.warn(msg); + case ERROR -> log.error(msg); + default -> log.error("lvl not supported {}. {}", lvl, msg); + } + notifications.sendNotification(ObjectType.vfrs, msg, Priority.HIGH); } private Optional searchTcrByStrades(STrades sTrades) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index a499a2032..f041d45cb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -9,8 +9,10 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import static java.lang.String.format; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.EnableScheduling; @@ -183,7 +185,11 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation()); + logNotifyW(format( + "cannot parse strade.tradeNum=%d strade.operation %s", + sTrd.getTradeNum(), + sTrd.getOperation()) + ); return true; } Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL; @@ -227,7 +233,10 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { } catch (ClearingException ce) { auditMessage(ce); } catch (Exception e) { - log.error("When create new ExecutionFond by STrade[{}] error: {}", sTrd.getId(), ExceptionUtils.getStackTrace(e)); + String err = String.format("When create new ExecutionFond by STrade[%d] error: %s", + sTrd.getId(), + ExceptionUtils.getStackTrace(e)); + logNotifyE(err); } } log.info("batch putAll {} ExecutionFond", execsToInsert.size()); @@ -240,7 +249,8 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { protected void auditMessage(ClearingException ce) { - log.error("AUDIT error code {}: {}", ce.getEnumMsg(), ce.getMessage()); + String err = String.format("AUDIT error code %s: %s", ce.getEnumMsg(), ce.getMessage()); + logNotifyE(err); } protected void sendNotification(ExecutionFond forEF) throws ClearingException { @@ -389,11 +399,32 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { } private void logError(IEnumId subject, Object... args) { - log.info("{}", msgResolver.resolve(new EnumMessage(subject, args))); + String err = msgResolver.resolve(new EnumMessage(subject, args)); + log.info("{}", err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } private void logError(Long sTradeId, EnumMessage msg) { - log.warn("sTrade id={} {}", sTradeId, msgResolver.resolve(msg)); + String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + log.warn(err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); + } + + private void logNotifyW(String msg) { + logNotify(msg, Level.WARN); + } + + private void logNotifyE(String msg) { + logNotify(msg, Level.ERROR); + } + + private void logNotify(String msg, Level lvl) { + switch (lvl) { + case WARN -> log.warn(msg); + case ERROR -> log.error(msg); + default -> log.error("lvl not supported {}. {}", lvl, msg); + } + notifications.sendNotification(ObjectType.vfrs, msg, Priority.HIGH); } @Override From 10b1921487af60c2ab1845df62b861146e44ba52 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 18 Jun 2025 12:01:15 +0300 Subject: [PATCH 34/61] http://jira.mfd.msk:8088/browse/CLS-861 --- .../scheduler/config/validation/LauncherValidationConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java index 42987237f..fc62ce337 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java @@ -26,7 +26,7 @@ public class LauncherValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols); return new ValidatorImpl<>(context, - ValidateSymbolsRule.notRequired("PaymentPurpose", + ValidateSymbolsRule.notRequired("Основание", LauncherCommandRequest::getPaymentPurpose, ValidationError.IncorrectPaymentPurpose) ); From dacf7e551d46ed5332d6c4604e66ff33cc76166b Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Wed, 18 Jun 2025 18:04:14 +0300 Subject: [PATCH 35/61] zookeeper removed, clearing-tester.jar updated --- .../clearing-tester/clearing-tester.jar | Bin 58104512 -> 58104423 bytes clr_test/docker-compose.yml | 40 +++--- clr_test/kafka/log4j2.yaml | 135 ++++++++++++++++++ 3 files changed, 154 insertions(+), 21 deletions(-) create mode 100644 clr_test/kafka/log4j2.yaml diff --git a/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar b/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar index 8a6d073779f22dc758543fda4e718bfbad2de5eb..43294faea19afb9949d2e7ee260c50ae6dbc3f1e 100644 GIT binary patch delta 17923 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 z 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 P5-NnKH;)AoC@B69>3!-2 diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 0bf2d5063..c57d3df20 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -32,34 +32,32 @@ services: db-updater: condition: service_started kafka: - condition: service_started + condition: service_healthy volumes: - logs_volume:/opt/clearing/bin/log_artifacts - zookeeper: - image: mirror.gcr.io/confluentinc/cp-zookeeper - container_name: zookeeper - environment: - ZOOKEEPER_SERVER_ID: 1 - ZOOKEEPER_CLIENT_PORT: 2181 - ZOOKEEPER_TICK_TIME: 2000 - kafka: - image: mirror.gcr.io/confluentinc/cp-kafka + image: mirror.gcr.io/bitnami/kafka:4.0.0 container_name: kafka environment: KAFKA_BROKER_ID: 1 - KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" - KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT - KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 - KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 - KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 - KAFKA_LOG4J_LOGGERS: kafka=WARN,kafka.controller=WARN,kafka.log.LogCleaner=WARN,state.change.logger=WARN,kafka.producer.async.DefaultEventHandler=WARN - KAFKA_LOG4J_ROOT_LOGLEVEL: WARN - depends_on: - - zookeeper + KAFKA_CFG_NODE_ID: 1 + KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093 + KAFKA_ENABLE_KRAFT: yes + KAFKA_CFG_PROCESS_ROLES: broker,controller + KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER + KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 + KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT + KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 + ALLOW_PLAINTEXT_LISTENER: yes + KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true + volumes: + - ./kafka/log4j2.yaml:/opt/bitnami/kafka/config/log4j2.yaml + healthcheck: + test: kafka-topics.sh --list --bootstrap-server kafka:9092 || exit 1 + interval: 1s + timeout: 60s + retries: 100 sftp: build: sftp diff --git a/clr_test/kafka/log4j2.yaml b/clr_test/kafka/log4j2.yaml new file mode 100644 index 000000000..f4f8739b3 --- /dev/null +++ b/clr_test/kafka/log4j2.yaml @@ -0,0 +1,135 @@ +Configuration: + Properties: + Property: + # Fallback if the system property is not set + - name: "kafka.logs.dir" + value: "." + - name: "logPattern" + value: "[%d] %p %m (%c)%n" + + # Appenders configuration + # See: https://logging.apache.org/log4j/2.x/manual/appenders.html + Appenders: + Console: + name: STDOUT + PatternLayout: + pattern: "${logPattern}" + + RollingFile: + - name: KafkaAppender + fileName: "${sys:kafka.logs.dir}/server.log" + filePattern: "${sys:kafka.logs.dir}/server.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + # State Change appender + - name: StateChangeAppender + fileName: "${sys:kafka.logs.dir}/state-change.log" + filePattern: "${sys:kafka.logs.dir}/stage-change.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + # Request appender + - name: RequestAppender + fileName: "${sys:kafka.logs.dir}/kafka-request.log" + filePattern: "${sys:kafka.logs.dir}/kafka-request.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + # Cleaner appender + - name: CleanerAppender + fileName: "${sys:kafka.logs.dir}/log-cleaner.log" + filePattern: "${sys:kafka.logs.dir}/log-cleaner.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + # Controller appender + - name: ControllerAppender + fileName: "${sys:kafka.logs.dir}/controller.log" + filePattern: "${sys:kafka.logs.dir}/controller.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + # Authorizer appender + - name: AuthorizerAppender + fileName: "${sys:kafka.logs.dir}/kafka-authorizer.log" + filePattern: "${sys:kafka.logs.dir}/kafka-authorizer.log.%d{yyyy-MM-dd-HH}" + PatternLayout: + pattern: "${logPattern}" + TimeBasedTriggeringPolicy: + modulate: true + interval: 1 + + # Loggers configuration + # See: https://logging.apache.org/log4j/2.x/manual/configuration.html#configuring-loggers + Loggers: + Root: + level: WARN + AppenderRef: + - ref: STDOUT + - ref: KafkaAppender + Logger: + # Kafka logger + - name: kafka + level: WARN + # Kafka org.apache logger + - name: org.apache.kafka + level: WARN + # Kafka request logger + - name: kafka.request.logger + level: WARN + additivity: false + AppenderRef: + ref: RequestAppender + # Uncomment the lines below and change log4j.logger.kafka.network.RequestChannel$ to TRACE + # for additional output related to the handling of requests + # - name: kafka.network.Processor + # level: TRACE + # additivity: false + # AppenderRef: + # ref: RequestAppender + # - name: kafka.server.KafkaApis + # level: TRACE + # additivity: false + # AppenderRef: + # ref: RequestAppender + # Kafka network RequestChannel$ logger + - name: kafka.network.RequestChannel$ + level: WARN + additivity: false + AppenderRef: + ref: RequestAppender + # Controller logger + - name: org.apache.kafka.controller + level: WARN + additivity: false + AppenderRef: + ref: ControllerAppender + # LogCleaner logger + - name: kafka.log.LogCleaner + level: WARN + additivity: false + AppenderRef: + ref: CleanerAppender + # State change logger + - name: state.change.logger + level: WARN + additivity: false + AppenderRef: + ref: StateChangeAppender + # Authorizer logger + - name: kafka.authorizer.logger + level: WARN + additivity: false + AppenderRef: + ref: AuthorizerAppender From 43fdced052c0265bf28dc2ac53a3237c8eefd386 Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Wed, 18 Jun 2025 18:21:13 +0300 Subject: [PATCH 36/61] docker-compose.yml fixed --- clr_test/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index c57d3df20..6527fc142 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -52,7 +52,7 @@ services: ALLOW_PLAINTEXT_LISTENER: yes KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true volumes: - - ./kafka/log4j2.yaml:/opt/bitnami/kafka/config/log4j2.yaml + - /builds/mfd/clearing/clr_test/kafka/log4j2.yaml:/opt/bitnami/kafka/config/log4j2.yaml healthcheck: test: kafka-topics.sh --list --bootstrap-server kafka:9092 || exit 1 interval: 1s From 594efc8ec432173cdfc19dbac41fae7596f8a27c Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Thu, 19 Jun 2025 10:24:21 +0300 Subject: [PATCH 37/61] kafka Dockerfile created --- clr_test/docker-compose.yml | 4 +--- clr_test/kafka/Dockerfile | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 clr_test/kafka/Dockerfile diff --git a/clr_test/docker-compose.yml b/clr_test/docker-compose.yml index 6527fc142..85c586df5 100644 --- a/clr_test/docker-compose.yml +++ b/clr_test/docker-compose.yml @@ -37,7 +37,7 @@ services: - logs_volume:/opt/clearing/bin/log_artifacts kafka: - image: mirror.gcr.io/bitnami/kafka:4.0.0 + build: kafka container_name: kafka environment: KAFKA_BROKER_ID: 1 @@ -51,8 +51,6 @@ services: KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 ALLOW_PLAINTEXT_LISTENER: yes KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: true - volumes: - - /builds/mfd/clearing/clr_test/kafka/log4j2.yaml:/opt/bitnami/kafka/config/log4j2.yaml healthcheck: test: kafka-topics.sh --list --bootstrap-server kafka:9092 || exit 1 interval: 1s diff --git a/clr_test/kafka/Dockerfile b/clr_test/kafka/Dockerfile new file mode 100644 index 000000000..11c9c67a0 --- /dev/null +++ b/clr_test/kafka/Dockerfile @@ -0,0 +1,3 @@ +FROM mirror.gcr.io/bitnami/kafka:4.0.0 + +ADD log4j2.yaml /opt/bitnami/kafka/config/ka \ No newline at end of file From 4959afe9f013b3be58271ad6ca7bdc434d406e4b Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Thu, 19 Jun 2025 10:38:42 +0300 Subject: [PATCH 38/61] Dockerfile fixed --- clr_test/kafka/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clr_test/kafka/Dockerfile b/clr_test/kafka/Dockerfile index 11c9c67a0..dc9f0fda4 100644 --- a/clr_test/kafka/Dockerfile +++ b/clr_test/kafka/Dockerfile @@ -1,3 +1,3 @@ FROM mirror.gcr.io/bitnami/kafka:4.0.0 -ADD log4j2.yaml /opt/bitnami/kafka/config/ka \ No newline at end of file +ADD log4j2.yaml /opt/bitnami/kafka/config/ \ No newline at end of file From 2f6e8fe99b75c55899fcd49ca014e06af2902b9c Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 20 Jun 2025 10:27:39 +0300 Subject: [PATCH 39/61] http://jira.mfd.msk:8088/browse/CLS-870 --- .../classes/statics/data/registry/Registry.java | 9 +++++++++ .../db-scripts/src/main/resources/db/DDL.sql | 4 +++- .../src/main/resources/db/updateDDL_3.19.sql | 6 ++++++ .../imdg/businessobject/RegistryMapStore.java | 13 +++++++++++-- .../imdg/services/HazelcastLifecycleSupport.java | 2 +- 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java index d8313394d..daa138109 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java @@ -61,6 +61,7 @@ public class Registry extends BusinessObject implements Cloneable { private String sessionType; private Long paymentId; private String section; + private String market; public Long getCompanyId() { return companyId; @@ -444,6 +445,14 @@ public class Registry extends BusinessObject implements Cloneable { this.section = section; } + public String getMarket() { + return market; + } + + public void setMarket(String market) { + this.market = market; + } + @Override public Registry clone() { try { diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql index 3c3b82f06..553a9b4f4 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -2082,7 +2082,7 @@ GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY TO clearing -- registry - Регистр активов, обязательств и требований УК DROP TABLE IF EXISTS REGISTRY; -CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4)); +CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4), MARKET varchar(8)); COMMENT ON TABLE REGISTRY IS 'Регистр активов, обязательств и требований УК'; COMMENT ON COLUMN REGISTRY.COMPANY_ID IS 'Идентификатор участника (linked to company)'; @@ -2185,6 +2185,8 @@ COMMENT ON COLUMN REGISTRY.SECURITY_ID IS 'Идентификатор инстр COMMENT ON COLUMN REGISTRY.SECTION IS 'Код секции (linked to section)'; +COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента'; + GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing; diff --git a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql new file mode 100644 index 000000000..cdd8604a3 --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql @@ -0,0 +1,6 @@ +-- DB version: 3.18 -> 3.19 + +ALTER TABLE REGISTRY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8); +COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента'; + +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.19') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java index c26094816..f16801014 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java @@ -68,7 +68,14 @@ public class RegistryMapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_SYMBOL", "BALANCE", "BALANCE_RUB", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION" + "COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", + "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", + "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", + "SECURITY_SYMBOL", "BALANCE", "BALANCE_RUB", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", + "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", + "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", + "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", + "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION", "MARKET" }; } @@ -125,6 +132,7 @@ public class RegistryMapStore extends TemplateMapStore { object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); object.setSection(resultSet.getObject("SECTION", String.class)); + object.setMarket(resultSet.getObject("MARKET", String.class)); return object; } @@ -180,7 +188,8 @@ public class RegistryMapStore extends TemplateMapStore { TimeUtil.toDateFromInstant(object.getCreated()), TimeUtil.toDateFromInstant(object.getUpdated()), object.getSecurityId(), - object.getSection() + object.getSection(), + object.getMarket() }; return args; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/HazelcastLifecycleSupport.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/HazelcastLifecycleSupport.java index d38b6ffdd..9900626d9 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/HazelcastLifecycleSupport.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/HazelcastLifecycleSupport.java @@ -14,7 +14,7 @@ public class HazelcastLifecycleSupport extends AbstractHazelcastLifecycleSupport /** * Рабочая версия БД. Требуется вручную сверять с DDL.sql и накручивать эту переменную. */ - public static final String CHECK_DB_VERSION = "3.18"; + public static final String CHECK_DB_VERSION = "3.19"; private final Logger log = LoggerFactory.getLogger(this.getClass()); From 15ed82e788851f079d8e23ebbfa114215b51474e Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 20 Jun 2025 10:51:12 +0300 Subject: [PATCH 40/61] http://jira.mfd.msk:8088/browse/CLS-870 --- clearing-parent/db-scripts/src/main/resources/db/DDL.sql | 3 ++- .../db-scripts/src/main/resources/db/updateDDL_3.19.sql | 5 ++++- .../imdg/businessevent/RegistryHistoryMapStore.java | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql index 553a9b4f4..2244bd92c 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -2192,7 +2192,7 @@ GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing; -- History log of registry - Регистр активов, обязательств и требований УК DROP TABLE IF EXISTS REGISTRY_HISTORY; -CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4)); +CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), BALANCE_RUB numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), REASON varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4), MARKET varchar(8)); COMMENT ON TABLE REGISTRY_HISTORY IS 'История изменений таблицы registry'; COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY'; COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -2298,6 +2298,7 @@ COMMENT ON COLUMN REGISTRY_HISTORY.UPDATED_AT IS 'Дата и время изм COMMENT ON COLUMN REGISTRY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; COMMENT ON COLUMN REGISTRY_HISTORY.SECTION IS 'Код секции (linked to section)'; +COMMENT ON COLUMN REGISTRY_HISTORY.MARKET IS 'Код класса инструмента'; GRANT ALL PRIVILEGES ON TABLE REGISTRY_HISTORY TO clearing; diff --git a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql index cdd8604a3..85d3b351d 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql @@ -3,4 +3,7 @@ ALTER TABLE REGISTRY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8); COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента'; -INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.19') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION +ALTER TABLE REGISTRY_HISTORY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8); +COMMENT ON COLUMN REGISTRY_HISTORY.MARKET IS 'Код класса инструмента'; + +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.19') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java index 710051630..680b74ba5 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java @@ -61,7 +61,7 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore Date: Mon, 23 Jun 2025 11:51:42 +0300 Subject: [PATCH 41/61] .gitlab-ci.yml changed, master branch added to auto test execution --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d6901939f..78311f2f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,6 +24,7 @@ preflight: paths: - clearing_test only: + - master - dev - /^dev_.*$/ - new @@ -40,6 +41,7 @@ build: paths: - /builds/mfd/clearing/z-distr/target/clearing only: + - master - dev - /^dev_.*$/ - new @@ -66,6 +68,7 @@ test: paths: - artifacts/logs only: + - master - dev - /^dev_.*$/ - new From d5366ab2a1b10b6f8ff364fc489f60e9bd0b82ac Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 15:24:49 +0300 Subject: [PATCH 42/61] =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20market=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=80=D0=B5=D0=B3=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/session/stage/impl/RegistryCkBuilder.java | 1 + .../spcex/clearing/session/stage/impl/RegistryCurrBuilder.java | 1 + .../spcex/clearing/session/stage/impl/RegistryDepoBuilder.java | 1 + .../spcex/clearing/session/stage/impl/RegistryFondBuilder.java | 1 + 4 files changed, 4 insertions(+) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCkBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCkBuilder.java index 294bded7f..d7baaa574 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCkBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCkBuilder.java @@ -210,6 +210,7 @@ public class RegistryCkBuilder implements IRegistryBuilder { reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); reg.setSection(Section.CURR.getKey()); + reg.setMarket(exec.getMarket()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java index b9b8757f9..c0ed90125 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java @@ -213,6 +213,7 @@ public class RegistryCurrBuilder implements IRegistryBuilder { reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); reg.setSection(Section.CURR.getKey()); + reg.setMarket(exec.getMarket()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java index ee02d74da..de6d247de 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java @@ -158,6 +158,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder { reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); reg.setSection(Section.MKR.getKey()); + reg.setMarket(exec.getMarket()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java index 67e50fea8..42f783a40 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java @@ -239,6 +239,7 @@ public class RegistryFondBuilder implements IRegistryBuilder { reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); reg.setSection(Section.FOND.getKey()); + reg.setMarket(exec.getMarket()); return reg; } From f21bafb2d7d1b51bd0db1be286a6468ded18d303 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 23 Jun 2025 15:28:06 +0300 Subject: [PATCH 43/61] =?UTF-8?q?Execution=20=D1=83=D1=81=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=BC=D0=B0=D1=80=D0=BA?= =?UTF-8?q?=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/service/execution/ExecUploadKey.java | 13 +++++++++---- .../execution/ExecutionCurrencyComponent.java | 1 + .../execution/ExecutionDepositComponent.java | 1 + .../service/execution/ExecutionFondComponent.java | 1 + .../ks/KSCommissionTradesReportBuilder.java | 3 +++ .../builders/ks/KSRepTradesReportBuilder.java | 7 ++++--- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecUploadKey.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecUploadKey.java index 678dbb3ea..de3290f73 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecUploadKey.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecUploadKey.java @@ -4,14 +4,19 @@ import java.time.LocalDate; import java.util.Objects; import ru.clearing.classes.statics.data.execution.ExecutionCommon; -public record ExecUploadKey(LocalDate tradeDate, Long exchangeExecutionId, String side) { +public record ExecUploadKey(LocalDate tradeDate, Long exchangeExecutionId, String market, String side) { - public static ExecUploadKey cash(LocalDate tradingDate, Long exchangeExecutionId, String side) { - return new ExecUploadKey(tradingDate, exchangeExecutionId, side); + public static ExecUploadKey cash(LocalDate tradingDate, Long exchangeExecutionId, String market, String side) { + return new ExecUploadKey(tradingDate, exchangeExecutionId, market, side); } public static ExecUploadKey cash(ExecutionCommon exec) { - return new ExecUploadKey(exec.getTradingDate(), exec.getExchangeExecutionId(), exec.getSide()); + return new ExecUploadKey( + exec.getTradingDate(), + exec.getExchangeExecutionId(), + exec.getMarket(), + exec.getSide() + ); } @Override diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index 9d647d224..869c9ac8d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -176,6 +176,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { // MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), + sTrd.getClassCode(), sTrdSide.getKey()); return cash.containsKey(excKey); }); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index 943348330..999a5b21c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -160,6 +160,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), + sTrd.getClassCode(), excDepSide.getKey()); return cash.containsKey(excKey); }); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index a499a2032..57d6d2de5 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -189,6 +189,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL; ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), + sTrd.getClassCode(), excDepSide.getKey()); return cash.containsKey(excKey); }); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 59fd03832..c4bea14ca 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -32,6 +32,7 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.text.TextUtil; @Component public class KSCommissionTradesReportBuilder extends CSVReportBuilder { @@ -168,6 +169,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate( pb.and( pb.equals("exchangeExecutionId", registry.getGroupId()), + TextUtil.isEmpty(registry.getMarket()) ? + pb.alwaysTrue() : pb.equals("market", registry.getMarket()), pb.notNull("market") ) ); 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 3bde5b548..acceeabce 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 @@ -149,6 +149,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( pbRegistry.and( pbRegistry.equals("groupId", groupId), + pbRegistry.equals("market", execution.getMarket()), //fixme может быть "старый" registry без market pbRegistry.equals("companyId", execution.getCompanyId()), pbRegistry.in("registryStatus", RegistryStatus.NACC.getKey(), @@ -170,7 +171,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder Date: Mon, 23 Jun 2025 15:33:04 +0300 Subject: [PATCH 44/61] =?UTF-8?q?Execution=20=D1=83=D1=81=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=BC=D0=B0=D1=80=D0=BA?= =?UTF-8?q?=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builders/ks/KSRepTradesReportBuilder.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 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 acceeabce..1fb62f185 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 @@ -144,14 +144,14 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( - pbRegistry.and( - pbRegistry.equals("groupId", groupId), - pbRegistry.equals("market", execution.getMarket()), //fixme может быть "старый" registry без market - pbRegistry.equals("companyId", execution.getCompanyId()), - pbRegistry.in("registryStatus", + pb.and( + pb.equals("groupId", groupId), + pb.or(pb.equals("market", execution.getMarket()), pb.isNull("market")), + pb.equals("companyId", execution.getCompanyId()), + pb.in("registryStatus", RegistryStatus.NACC.getKey(), RegistryStatus.NACK.getKey(), RegistryStatus.FAIL.getKey(), From d27b7d003d49e06e971292ce3e99816a17175a3d Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 16:44:22 +0300 Subject: [PATCH 45/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=207=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/GroupingRegistryKey.java | 18 ++++++++++++++++++ .../FormingPaymentInstructionSecurities.java | 14 ++++++++------ .../group/RegistryLiabilitiesGroup.java | 8 +++++--- 3 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java new file mode 100644 index 000000000..5c1f38463 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.component; + +import java.util.Objects; + +public record GroupingRegistryKey(Long groupId, String market) { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GroupingRegistryKey that = (GroupingRegistryKey) o; + return Objects.equals(groupId, that.groupId) && Objects.equals(market, that.market); + } + + @Override + public int hashCode() { + return Objects.hash(groupId, market); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java index 4bcd7c6c7..766c04ce7 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java @@ -24,6 +24,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.clearing.component.GroupingRegistryKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -159,14 +160,15 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { { Collection registries = selectSecurityRegistries(sessionId); log.debug("found registries.size() = {}", registries.size()); - //группируем регистры по groupId - Map> groups = registries - .stream() - .collect(Collectors.groupingBy(Registry::getGroupId)); + //группируем регистры по groupId и market + Map> groups = registries + .stream() + .collect(Collectors.groupingBy(r -> new GroupingRegistryKey(r.getGroupId(), r.getMarket()))); + log.debug("groups.size = {}", groups.size()); Map lstGroups = RegistryLiabilitiesGroup.group(groups); - for (Map.Entry> group : groups.entrySet()) { - Long groupId = group.getKey(); + for (Map.Entry> group : groups.entrySet()) { + Long groupId = group.getKey().groupId(); Function findByCode = rgsCode -> group.getValue() .stream() .filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs)) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java index 2db0608b7..9d8ddfeff 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupingRegistryKey; import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.platform.enumeration.RegistryTradingParams; import static ru.spcex.platform.enumeration.RegistryTradingParams.OS_T; @@ -21,17 +22,18 @@ import ru.spcex.platform.utils.text.TextUtil; public class RegistryLiabilitiesGroup { private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class); - public static Map group(Map> registriesCollection) { + public static Map group(Map> registriesCollection) { Map result = new HashMap<>(); List> lstCstGroup = registriesCollection.entrySet() .stream() .map(entry -> { - Long groupId = entry.getKey(); + Long groupId = entry.getKey().groupId(); + String market = entry.getKey().market(); List value = entry.getValue(); Registry ls_t = obtain(value, OS_T); Registry cs_t = obtain(value, TS_T); if (ls_t == null || cs_t == null) { - log.error("groupId {} registries {} failed to find LS_T/CS_T", groupId, value.stream() + log.error("groupId/market {}/{} registries {} failed to find LS_T/CS_T", groupId, market, value.stream() .map(Registry::getId) .map(Object::toString) .collect(TextUtil.join)); From bd2d8fcc580b1a081a12d1943e88400ac2fccc6a Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 17:06:15 +0300 Subject: [PATCH 46/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=207=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...upingRegistryKey.java => GroupRgsKey.java} | 4 ++-- .../FormingPaymentInstructionSecurities.java | 19 ++++++++++--------- .../group/RegistryLiabilitiesGroup.java | 4 ++-- .../session/stage/util/RegistryUtil.java | 13 ------------- 4 files changed, 14 insertions(+), 26 deletions(-) rename clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/{GroupingRegistryKey.java => GroupRgsKey.java} (76%) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java similarity index 76% rename from clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java rename to clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java index 5c1f38463..6e526f3f7 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupingRegistryKey.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java @@ -2,12 +2,12 @@ package ru.spcex.clearing.component; import java.util.Objects; -public record GroupingRegistryKey(Long groupId, String market) { +public record GroupRgsKey(Long groupId, String market) { @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - GroupingRegistryKey that = (GroupingRegistryKey) o; + GroupRgsKey that = (GroupRgsKey) o; return Objects.equals(groupId, that.groupId) && Objects.equals(market, that.market); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java index 766c04ce7..d18189ae6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java @@ -24,7 +24,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.component.GroupingRegistryKey; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -161,14 +161,15 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { Collection registries = selectSecurityRegistries(sessionId); log.debug("found registries.size() = {}", registries.size()); //группируем регистры по groupId и market - Map> groups = registries + Map> groups = registries .stream() - .collect(Collectors.groupingBy(r -> new GroupingRegistryKey(r.getGroupId(), r.getMarket()))); + .collect(Collectors.groupingBy(r -> new GroupRgsKey(r.getGroupId(), r.getMarket()))); log.debug("groups.size = {}", groups.size()); Map lstGroups = RegistryLiabilitiesGroup.group(groups); - for (Map.Entry> group : groups.entrySet()) { + for (Map.Entry> group : groups.entrySet()) { Long groupId = group.getKey().groupId(); + String market = group.getKey().market(); Function findByCode = rgsCode -> group.getValue() .stream() .filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs)) @@ -178,12 +179,12 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { Registry cs_t = findByCode.apply(RegistryTradingParams.TS_T); Registry ls_t = findByCode.apply(RegistryTradingParams.OS_T); if (cs_t == null || ls_t == null) { - log.error("groupId {} cmt_t {} ls_t {} - both must be present", groupId, cs_t, ls_t); + log.error("groupId/market {}/{} cmt_t {} ls_t {} - both must be present", groupId, market, cs_t, ls_t); continue; } PaymentGroup ls_t_group = lstGroups.get(ls_t.getId()); if (ls_t_group == null) { - log.debug("groupId {} cmt_t {} ls_t {} were included in a group, skipping", groupId, cs_t, ls_t); + log.debug("groupId/market {}/{} cmt_t {} ls_t {} were included in a group, skipping", groupId, market, cs_t, ls_t); continue; } @@ -194,7 +195,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { AS_T ); payerAstO.ifPresent(as_t -> { - log.debug("groupId {} cmt_t {} ls_t {} changing AS*T.id={} sender", groupId, cs_t, ls_t, as_t.getId()); + log.debug("groupId/market {}/{} cmt_t {} ls_t {} changing AS*T.id={} sender", groupId, market, cs_t, ls_t, as_t.getId()); as_t.setSettledDebit(safeBD(as_t.getSettledDebit()).add(safeBD(ls_t_group.getSum()))); setUpdatedStoreInImdg(as_t, now); }); @@ -205,7 +206,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { AS_T ); receiverAstO.ifPresent(as_t -> { - log.debug("groupId {} cmt_t {} ls_t {} changing AS*T.id={} receiver", groupId, cs_t, ls_t, as_t.getId()); + log.debug("groupId/market {}/{} cmt_t {} ls_t {} changing AS*T.id={} receiver", groupId, market, cs_t, ls_t, as_t.getId()); as_t.setSettledCredit(safeBD(as_t.getSettledCredit()).add(safeBD(ls_t_group.getSum()))); setUpdatedStoreInImdg(as_t, now); }); @@ -238,7 +239,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { paymentInstructionImdg.insert(pmt); paymentInstructionAll.add(pmt); - log.trace("generated PaymentInstructions for groupId {}: pmtInstr.id={}", groupId, pmt.getId()); + log.trace("generated PaymentInstructions for groupId/market {}/{}: pmtInstr.id={}", groupId, market, pmt.getId()); } } { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java index 9d8ddfeff..5be7a7127 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/payment/group/RegistryLiabilitiesGroup.java @@ -11,7 +11,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.component.GroupingRegistryKey; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.platform.enumeration.RegistryTradingParams; import static ru.spcex.platform.enumeration.RegistryTradingParams.OS_T; @@ -22,7 +22,7 @@ import ru.spcex.platform.utils.text.TextUtil; public class RegistryLiabilitiesGroup { private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class); - public static Map group(Map> registriesCollection) { + public static Map group(Map> registriesCollection) { Map result = new HashMap<>(); List> lstCstGroup = registriesCollection.entrySet() .stream() diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java index 8e752c590..fd79c7c5b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/util/RegistryUtil.java @@ -57,17 +57,4 @@ public class RegistryUtil { newRgsCde.setCharAt(2, '-'); return newRgsCde.toString(); } - - public static Map> groupByGroupId(Collection registries) { - HashMap> groups = new HashMap<>(); - for (Registry reg : registries) { - List lst = groups.get(reg.getGroupId()); - if (lst == null) { - lst = new ArrayList<>(); - groups.put(reg.getGroupId(), lst); - } - lst.add(reg); - } - return groups; - } } From 86917e91fda39c7e6492a22c021ec2f362b9a450 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 17:44:08 +0300 Subject: [PATCH 47/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=205=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stage/impl/InspectionObligationsV2.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java index a7913fda8..34fc51e3b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.component.predicate.cash.registry.AssetByTcrCompanyAccountCashedPredicate; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.RgsError; @@ -128,8 +129,8 @@ public class InspectionObligationsV2 implements ISessionStage { Collection registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition); Map rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация? - List>> registriesByGroupSorted = registriesToProcess.stream() - .collect(Collectors.groupingBy(Registry::getGroupId)) + List>> registriesByGroupSorted = registriesToProcess.stream() + .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))) .entrySet() .stream() .sorted((entry1, entry2) -> { @@ -150,15 +151,15 @@ public class InspectionObligationsV2 implements ISessionStage { log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition); ImdgPredicateBuilder rgsPb = registryImdg.predicateBuilder(); GROUP: - for (Map.Entry> entry : registriesByGroupSorted) { + for (Map.Entry> entry : registriesByGroupSorted) { List group = entry.getValue(); List obligationsInGroup = group.stream().filter(registry -> IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O).toList(); - log.debug("Find {} obligation with ids: {} in group: {}", obligationsInGroup.size(), + log.debug("Find {} obligation with ids: {} in group/market: {}/{}", obligationsInGroup.size(), obligationsInGroup.stream() .map(Registry::getId).collect(Collectors.toList()), - entry.getKey()); + entry.getKey().groupId(), entry.getKey().market()); boolean isUncovered = false; List checkResults = new ArrayList<>(); for (Registry obligation : obligationsInGroup) { @@ -191,7 +192,7 @@ public class InspectionObligationsV2 implements ISessionStage { }); RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()); if (mOrS == null) { - log.error("RegistryInstrumentType is null for groupId {} {}.id={}", entry.getKey(), + log.error("RegistryInstrumentType is null for groupId/market {}/{} {}.id={}", entry.getKey().groupId(), entry.getKey().market(), rgs.getRegistryCode(), rgs.getId()); failGroup.run(); continue; @@ -345,6 +346,7 @@ public class InspectionObligationsV2 implements ISessionStage { private Collection getRefundDateRgsIfPresent(List registries) { if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { + //доп группировка по market не нужна, лист registries уже сгруппирован Optional> groupIdAndSettleDate = registries.stream() .map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) .filter(pair -> pair.getFirst() != null) From f78d4394c3dde8173b259c33fda36f438644676d Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 18:17:17 +0300 Subject: [PATCH 48/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=204=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stage/impl/InclusionObligations.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java index 2f7665714..3202e89d4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java @@ -18,12 +18,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionCurrency; 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.component.GroupRgsKey; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.session.stage.ISessionStage; @@ -129,17 +131,17 @@ public class InclusionObligations implements ISessionStage { } log.info("Inclusion to pool with predicate: {}", registryPredicate.toString()); Collection obligations = registryImdg.getCollectionObjectsByPredicate(registryPredicate); - Map> registryByGroupId = obligations.stream() + Map> registryByGroupId = obligations.stream() .filter(registry -> registry.getSettlementDate().isEqual(LocalDate.now())) - .collect(Collectors.groupingBy(Registry::getGroupId)); + .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))); Optional ssnType = obtainSessionType(sessionId); Map rgsToUpdate = new HashMap<>(); List execsToUpdate = new ArrayList<>(); boolean loadExecs = !IEnumKey.contains(sessionType, SessionType.TRDT, SessionType.CURR, SessionType.UNIT, SessionType.IPOT); - for (Map.Entry> entrySet : registryByGroupId.entrySet()) { - log.debug("Processing set of registry with groupId: {}", entrySet.getKey()); + for (Map.Entry> entrySet : registryByGroupId.entrySet()) { + log.debug("Processing set of registry with groupId/market: {}/{}", entrySet.getKey().groupId(), entrySet.getKey().market()); String rgsSection = null; for (Registry registry : entrySet.getValue()) { registry.setRegistryStatus(RegistryStatus.POOL.getKey()); @@ -164,7 +166,7 @@ public class InclusionObligations implements ISessionStage { } @SuppressWarnings("unchecked") - private Collection updateExecutions(Long sessionId, Long rgsGroupId, String rgsSection) { + private Collection updateExecutions(Long sessionId, GroupRgsKey groupRgsKey, String rgsSection) { Instant now = Instant.now(); SessionType ssnTpe = obtainSessionType(sessionId).orElse(null); if (ssnTpe == null || sessionId == null) { @@ -193,7 +195,10 @@ public class InclusionObligations implements ISessionStage { return Collections.emptyList(); } ImdgPredicateBuilder pb = execImdg.predicateBuilder(); - ImdgPredicate prdct = pb.equals("exchangeExecutionId", rgsGroupId); + ImdgPredicate prdct = pb.and( + pb.equals("exchangeExecutionId", groupRgsKey.groupId()), + StringUtils.hasText(groupRgsKey.market()) ? pb.equals("market", groupRgsKey.market()) : pb.alwaysTrue() + ); Collection execs = execImdg.getCollectionObjectsByPredicate(prdct); //Imdg finalExecImdg = execImdg; execs.forEach(e -> { From 485b269dcfcb5dfbe8bc42d7f616c4afb5b63de9 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 18:21:10 +0300 Subject: [PATCH 49/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=203=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/session/stage/impl/ObligationAdmission.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java index a422134d6..9d403bd3c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java @@ -18,6 +18,7 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.validation.admission.AccountActiveValidationRule; import ru.spcex.clearing.service.validation.admission.ClearingAvailableValidationRule; @@ -76,10 +77,11 @@ public class ObligationAdmission implements ISessionStage { private StageResult obligationAdmission(Long sessionId) { Collection registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId); - Map> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId)); + Map> byGroups = registries.stream() + .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))); log.info("found {} ({} groups) registries with sessionId {}", registries.size(), byGroups.size(), sessionId); Map rgsToUpdate = new HashMap<>(); - for (Map.Entry> grpEntry : byGroups.entrySet()) { + for (Map.Entry> grpEntry : byGroups.entrySet()) { EnumMessage groupError = null; List rgsGroup = grpEntry.getValue(); for (Registry rgs : rgsGroup) { @@ -91,7 +93,8 @@ public class ObligationAdmission implements ISessionStage { } } if (groupError != null) { - log.warn("error {} for registries groupId = {}", messageResolver.resolve(groupError), grpEntry.getKey()); + log.warn("error {} for registries groupId/market = {}/{}", messageResolver.resolve(groupError), + grpEntry.getKey().groupId(), grpEntry.getKey().market()); for (Registry rgs : rgsGroup) { rgs.setRegistryStatus(RegistryStatus.NACK.getKey()); rgsToUpdate.put(rgs.getId(), rgs); From 8b21e7aec2bc4909efae82be74cd322a8b126b44 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 23 Jun 2025 18:38:46 +0300 Subject: [PATCH 50/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=205=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/GroupRgsKeyComparator.java | 13 +++++++++++ .../InspectionObligationsDepositReturn.java | 23 +++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKeyComparator.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKeyComparator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKeyComparator.java new file mode 100644 index 000000000..8ead41a8a --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKeyComparator.java @@ -0,0 +1,13 @@ +package ru.spcex.clearing.component; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import ru.clearing.classes.statics.data.registry.Registry; + +public class GroupRgsKeyComparator implements Comparator>> { + @Override + public int compare(Map.Entry> o1, Map.Entry> o2) { + return o1.getKey().groupId().compareTo(o2.getKey().groupId()); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java index 511a7400c..5a3987adc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java @@ -15,6 +15,8 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupRgsKey; +import ru.spcex.clearing.component.GroupRgsKeyComparator; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.integration.GatewayRequestCreator; @@ -53,6 +55,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { private final TradingTimeService tradingTimeService; private final GatewayRequester gateway; private final PlanBalanceCalc planBalanceCalc; + private static final GroupRgsKeyComparator groupRgsKeyComparator = new GroupRgsKeyComparator(); @Autowired public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) { @@ -97,27 +100,27 @@ public class InspectionObligationsDepositReturn implements ISessionStage { RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(), RegistryStatus.POOL.getKey()); - List>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition) + List>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition) .stream() - .collect(Collectors.groupingBy(Registry::getGroupId)) + .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))) .entrySet() .stream() - .sorted(Map.Entry.comparingByKey()) + .sorted(groupRgsKeyComparator) .toList(); log.info("registry groups found {}", registriesByGroupSorted.size()); - for (Map.Entry> entry : registriesByGroupSorted) { + for (Map.Entry> entry : registriesByGroupSorted) { List group = entry.getValue(); Optional omtInGroupO = group.stream().filter(registry -> equalByRgs(OM_T, registry)).findFirst(); Optional tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst(); if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) { - log.error("groupId {} failed to find OM*T/TM*T registry", entry.getKey()); + log.error("groupId/market {}/{} failed to find OM*T/TM*T registry", entry.getKey().groupId(), entry.getKey().market()); group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG continue; } Registry omtRgs = omtInGroupO.get(); Registry tmtRgs = tmtInGroupO.get(); - log.debug("groupId={}, OM*T.id={}", entry.getKey(), omtRgs.getId()); + log.debug("groupId={}, market={}, OM*T.id={}", entry.getKey().groupId(), entry.getKey().market(), omtRgs.getId()); BigDecimal omtBalance = safeBD(omtRgs.getBalance()); //первая часть сделки депозита @@ -150,18 +153,20 @@ public class InspectionObligationsDepositReturn implements ISessionStage { Optional amfAssetO = searchAssetByOMT(omtRgs); Optional amfAssetReceiverO = searchAssetByOMT(tmtRgs); if (amfAssetO.isEmpty()) { - log.error("OM*T register.id={} groupId={} failed to find AM*F asset", omtRgs.getId(), entry.getKey()); + log.error("OM*T register.id={} groupId={}, market={} failed to find AM*F asset", omtRgs.getId(), + entry.getKey().groupId(), entry.getKey().market()); group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG continue; } if (amfAssetReceiverO.isEmpty()) { - log.error("TM*T register.id={} groupId={} failed to find AM*F asset", tmtRgs.getId(), entry.getKey()); + log.error("TM*T register.id={} groupId={}, market={} failed to find AM*F asset", tmtRgs.getId(), + entry.getKey().groupId(), entry.getKey().market()); group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG continue; } Registry amfAsset = amfAssetO.get(); - log.debug("groupId={}, AM*F.id={}", entry.getKey(), amfAsset.getId()); + log.debug("groupId={}, market={}, AM*F.id={}", entry.getKey().groupId(), entry.getKey().market(), amfAsset.getId()); BigDecimal amfBalance = safeBD(amfAsset.getBalance()); BiConsumer processAssetsAndSetSessionId = (amf, amount) -> { Optional asts = assets.processByAm_f(amf, amount); From aa38fa986a3dc87c21ed45847351bfb355bbf202 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 09:58:32 +0300 Subject: [PATCH 51/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=207=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/FormingPaymentInstructionDepositReturn.java | 9 +++++---- .../stage/impl/FormingPaymentInstructionReturnMkr.java | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java index 2ac818e3f..d5f1efbcb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java @@ -23,6 +23,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -126,18 +127,18 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { .filter(rgs -> rgs.getSettlementDate().isAfter(rgs.getValueDate())) .toList(); - Map> registriesByGroup = obligations + Map> registriesByGroup = obligations .stream(). - collect(Collectors.groupingBy(Registry::getGroupId)); + collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))); log.info("registry groups found {}", registriesByGroup.size()); ArrayList pmtCreated = new ArrayList<>(); - for (Map.Entry> entry : registriesByGroup.entrySet()) { + for (Map.Entry> entry : registriesByGroup.entrySet()) { List groupRgs = entry.getValue(); Optional lmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.OM_T, rgs)).findFirst(); Optional cmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.TM_T, rgs)).findFirst(); if (lmtO.isEmpty() || cmtO.isEmpty()) { - log.error("groupId {} LM*T or CM*T not found", entry.getKey()); + log.error("groupId/market {}/{} LM*T or CM*T not found", entry.getKey().groupId(), entry.getKey().market()); continue; } Registry lm_t = lmtO.get(); //obligation by money diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java index 30d788d3c..66bf7c968 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java @@ -23,6 +23,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -151,16 +152,16 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { List pmtCreated = new ArrayList<>(); - Map> registriesByGroup = rgsAll + Map> registriesByGroup = rgsAll .stream(). - collect(Collectors.groupingBy(Registry::getGroupId)); + collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))); log.info("registry groups found {}", registriesByGroup.size()); - for (Map.Entry> entry : registriesByGroup.entrySet()) { + for (Map.Entry> entry : registriesByGroup.entrySet()) { List groupRgs = entry.getValue(); Optional lmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.OM_T, rgs)).findFirst(); Optional cmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.TM_T, rgs)).findFirst(); if (lmtO.isEmpty() || cmtO.isEmpty()) { - log.error("LM*T or CM*T not found for group {}", entry.getKey()); + log.error("LM*T or CM*T not found for group/market {}/{}", entry.getKey().groupId(), entry.getKey().market()); continue; } Registry lm_t = lmtO.get(); //obligation by money From 1bb489e3cba8246cfc4d3ee34b3b6c4d96f02558 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 10:25:25 +0300 Subject: [PATCH 52/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=2010=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../session/stage/impl/FinishingSession.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java index b5a04a1d2..7a44aa357 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java @@ -24,6 +24,7 @@ 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.clearing.classes.statics.data.sdf.SDf05; +import ru.spcex.clearing.component.GroupRgsKey; import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -135,12 +136,13 @@ public class FinishingSession implements ISessionStage { log.error("Session id={} not found. Can not update Execution's.", sessionId); } else { Collection oRegs = findORegistryBySessionId(allLiabilitiesAndOKClaims); - Map obligationStatusByGroupId; + Map obligationStatusByGroupId; obligationStatusByGroupId = oRegs.stream() - .map(rgs -> new Pair<>(rgs.getGroupId(), getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus()))) + .map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(), rgs.getMarket()), + getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus()))) .filter(pair -> pair.getSecond() != null) .collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (o1, o2) -> o1)); - Function statusByExchangeId = id-> { + Function statusByExchangeId = id-> { RegistryStatus obligationStatus = obligationStatusByGroupId.get(id); if (obligationStatus == null) return null; return switch (obligationStatus) { @@ -164,7 +166,8 @@ public class FinishingSession implements ISessionStage { Collection executions = findExecutionDepositBySessionId(sessionId); log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId); for (ExecutionDeposit execution : executions) { - CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId()); + CoverageStatus toStatus = statusByExchangeId.apply( + new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket())); if (toStatus == null) { log.trace("CoverageStatus not defined for execution.id={}", execution.getId()); continue; @@ -194,7 +197,8 @@ public class FinishingSession implements ISessionStage { Map execFond = new HashMap<>(); log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId); for (ExecutionCommon execution : executions) { - CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId()); + CoverageStatus toStatus = statusByExchangeId.apply( + new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket())); if (toStatus == null) { log.trace("CoverageStatus not defined for execution.id={}", execution.getId()); continue; From 1110278d6a9a922bedcf53602749d7c9993139c4 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 10:43:55 +0300 Subject: [PATCH 53/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=207=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../registry/PaymentStateMarkService.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java index 9aaf4694f..375738de0 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanyRoleSet; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.session.stage.util.RegistryUtil; @@ -56,15 +57,16 @@ public class PaymentStateMarkService { pb.equals("registryStatus", RegistryStatus.OK.getKey()) ); Collection claimsAndLiabilities = rgsImdg.getCollectionObjectsByPredicate(prdct); - Map> groups = claimsAndLiabilities + Map> groups = claimsAndLiabilities .stream() .filter(rgs -> rgs.getValueDate() != null) .filter(rgs -> rgs.getSettlementDate() != null) .filter(rgs -> rgs.getSettlementDate().equals(rgs.getValueDate())) - .collect(Collectors.groupingBy(Registry::getGroupId)); + .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))); log.debug("found {} ({} groups) CM*T/LM*T by {}", claimsAndLiabilities.size(), groups.size(), prdct.toString()); - for (Map.Entry> group : groups.entrySet()) { - Long groupId = group.getKey(); + for (Map.Entry> group : groups.entrySet()) { + Long groupId = group.getKey().groupId(); + String market = group.getKey().market(); Function findRgs = (rd) -> group.getValue() .stream() .filter(rgs -> rd.equalsByKey(rgs.getRegistryDesignation())) @@ -73,7 +75,7 @@ public class PaymentStateMarkService { Registry cm_t = findRgs.apply(RegistryDesignation.T); Registry lm_t = findRgs.apply(RegistryDesignation.O); if (cm_t == null || lm_t == null) { - log.warn("groupId {}, coudn't find CM*T or LM*T", groupId); + log.warn("groupId/market {}/{}, coudn't find CM*T or LM*T", groupId, market); continue; } CompanyRoleSet initRole = cmpRoleImdg.getFirstObjectBySQL( @@ -84,7 +86,8 @@ public class PaymentStateMarkService { ) ); if (initRole == null) { - log.debug("groupId {}, initiator (lm*t.id={}) does not have ODEP role", groupId, lm_t.getId()); + log.debug("groupId/market {}/{}, initiator (lm*t.id={}) does not have ODEP role", groupId, + market, lm_t.getId()); continue; } Registry dm_v = cm_t.clone(); @@ -95,8 +98,8 @@ public class PaymentStateMarkService { dm_v.setBalance(cm_t.getBalance()); dm_v.setRegistryStatus(RegistryStatus.PROC.getKey()); rgsImdg.insert(dm_v); - log.debug("groupId {}, lm*t.id={}, cm*t.id={} created dm*v.id={}", - groupId, lm_t.getId(), cm_t.getId(), dm_v.getId()); + log.debug("groupId/market {}/{}, lm*t.id={}, cm*t.id={} created dm*v.id={}", + groupId, market, lm_t.getId(), cm_t.getId(), dm_v.getId()); Optional assetsFound = assets.searchMoneyByAccAndCompany(cm_t.getCompanyId(), cm_t.getAccountId()); assetsFound.ifPresent(assetTrio -> assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), BigDecimal.ZERO)); From 4efb263362dd92cfc7b8be28b280eeede7e38b78 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 10:55:08 +0300 Subject: [PATCH 54/61] =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20registry=20=D1=81=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20market=20=D0=B8=20groupId=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B3=D0=B0=2011=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stage/impl/EndStageNotification.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java index 8a27ff254..9766e1b64 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.session.stage.impl; +import java.time.Instant; +import java.util.Collection; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +11,8 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupRgsKey; +import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; @@ -24,13 +29,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import java.time.Instant; -import java.util.Collection; -import java.util.Objects; -import java.util.stream.Collectors; - -import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; - @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class EndStageNotification implements ISessionStage { @@ -83,25 +81,24 @@ public class EndStageNotification implements ISessionStage { } Collection forRegistries = selectRegistry(); - Collection groups = forRegistries.stream() - .map(Registry::getGroupId) - .filter(Objects::nonNull) + Collection groups = forRegistries.stream() + .map(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())) .distinct().collect(Collectors.toList()); log.debug("Sending notifications for {} groups ({} registers) on section {}", groups, forRegistries.size(), section); - for (Long groupId : groups) { - log.trace("For registry group {} send notification", - groupId); + for (GroupRgsKey groupKey : groups) { + log.trace("For registry group/market {}/{} send notification", + groupKey.groupId(), groupKey.market()); StageResult sResult; if (Section.FOND.equalsByKey(section)) { - sResult = notificationDF14(groupId); + sResult = notificationDF14(groupKey.groupId()); } else if (Section.MKR.equalsByKey(section)) { - sResult = notificationDF05(groupId); + sResult = notificationDF05(groupKey.groupId()); } else { throw new IllegalArgumentException("Unsupported section " + section); } if (sResult.getError() != null) { - log.warn("When sending groupId={} has error: {}", groupId, msgResolver.resolve(sResult.getError())); + log.warn("When sending groupId={} has error: {}", groupKey, msgResolver.resolve(sResult.getError())); } } StageResult> res = new StageResult<>(null, true); From c6b644d1180579217ff8c924f95162fc1d823250 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 11:13:07 +0300 Subject: [PATCH 55/61] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=20market=20=D0=BD=D0=B0=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../session/stage/impl/InspectionObligations.java | 14 ++++++++++---- .../stage/impl/InspectionObligationsV2.java | 15 ++++++++++----- .../impl/RequirementsAndObligationCreation.java | 12 ++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java index f4b1d26a2..88b5953fc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java @@ -17,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.RgsError; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -348,8 +350,8 @@ public class InspectionObligations implements ISessionStage { private Collection getRefundDateRgsIfPresent(List registries) { if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { - Optional> groupIdAndSettleDate = registries.stream() - .map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) + Optional> groupIdAndSettleDate = registries.stream() + .map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate())) .filter(pair -> pair.getFirst() != null) .filter(pair -> pair.getSecond() != null) .findFirst(); @@ -359,8 +361,12 @@ public class InspectionObligations implements ISessionStage { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); return registryImdg.getCollectionObjectsByPredicate( pb.and( - pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), - pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) + pb.and( + pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()), + StringUtils.hasText(groupIdAndSettleDate.get().getFirst().market()) ? + pb.equals("market", groupIdAndSettleDate.get().getFirst().market()) : pb.alwaysTrue() + ), + pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) ) ); } else return Collections.emptyList(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java index 34fc51e3b..73ba32bb0 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java @@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.component.GroupRgsKey; import ru.spcex.clearing.component.predicate.cash.registry.AssetByTcrCompanyAccountCashedPredicate; @@ -347,8 +348,8 @@ public class InspectionObligationsV2 implements ISessionStage { private Collection getRefundDateRgsIfPresent(List registries) { if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { //доп группировка по market не нужна, лист registries уже сгруппирован - Optional> groupIdAndSettleDate = registries.stream() - .map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) + Optional> groupIdAndSettleDate = registries.stream() + .map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate())) .filter(pair -> pair.getFirst() != null) .filter(pair -> pair.getSecond() != null) .findFirst(); @@ -357,10 +358,14 @@ public class InspectionObligationsV2 implements ISessionStage { } ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); return registryImdg.getCollectionObjectsByPredicate( + pb.and( pb.and( - pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), - pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) - ) + pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()), + StringUtils.hasText(groupIdAndSettleDate.get().getFirst().market()) ? + pb.equals("market", groupIdAndSettleDate.get().getFirst().market()) : pb.alwaysTrue() + ), + pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) + ) ); } else return Collections.emptyList(); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index 2aa2cd40f..48bd186c6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; @@ -363,7 +364,8 @@ public class RequirementsAndObligationCreation implements ISessionStage { exec.getCompanyId(), settlementDt(exec), exec.getSessionId(), - exec.getExchangeExecutionId() + exec.getExchangeExecutionId(), + exec.getMarket() ); } @@ -396,11 +398,12 @@ public class RequirementsAndObligationCreation implements ISessionStage { exec.getCompanyId(), ((ExecutionDeposit) exec).getSecondLegSettlementDate(), exec.getSessionId(), - exec.getExchangeExecutionId()); + exec.getExchangeExecutionId(), + exec.getMarket()); } public Optional imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt, - Long sessionId, Long exchangeExecutionId) { + Long sessionId, Long exchangeExecutionId, String market) { String sql = RegistryCodeSqlBuilder.getInstance(p).build(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), @@ -408,7 +411,8 @@ public class RequirementsAndObligationCreation implements ISessionStage { pb.equals("companyId", companyId), pb.equals("settlementDate", settlementDt), pb.equals("sessionId", sessionId), - pb.equals("groupId", exchangeExecutionId) + pb.equals("groupId", exchangeExecutionId), + StringUtils.hasText(market) ? pb.equals("market", market) : pb.alwaysTrue() ); Registry rgs = registryImdg.getSingleObjectByPredicate(rgstrPredicate); log.trace("rgs.id={} found by: {}", rgs == null ? "'not found'" : rgs.getId(), rgstrPredicate.toString()); From 7ba559ad407623757f1e28f529637d9e840faa80 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 24 Jun 2025 14:07:56 +0300 Subject: [PATCH 56/61] http://jira.mfd.msk:8088/browse/CLS-872 --- .../session/stage/impl/InspectionObligationsV2.java | 6 ++++-- .../stage/impl/RequirementsAndObligationCreation.java | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java index 73ba32bb0..8b8cd6446 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsV2.java @@ -357,12 +357,14 @@ public class InspectionObligationsV2 implements ISessionStage { return Collections.emptyList(); } ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + String groupMarket = groupIdAndSettleDate.get().getFirst().market(); + ImdgPredicate marketCondition = StringUtils.hasText(groupMarket) ? + pb.or(pb.equals("market", groupMarket), pb.isNull("market")) : pb.alwaysTrue(); return registryImdg.getCollectionObjectsByPredicate( pb.and( pb.and( pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()), - StringUtils.hasText(groupIdAndSettleDate.get().getFirst().market()) ? - pb.equals("market", groupIdAndSettleDate.get().getFirst().market()) : pb.alwaysTrue() + marketCondition ), pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) ) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index 48bd186c6..47e72b956 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -15,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; @@ -412,7 +411,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { pb.equals("settlementDate", settlementDt), pb.equals("sessionId", sessionId), pb.equals("groupId", exchangeExecutionId), - StringUtils.hasText(market) ? pb.equals("market", market) : pb.alwaysTrue() + pb.or(pb.equals("market", market), pb.isNull("market")) ); Registry rgs = registryImdg.getSingleObjectByPredicate(rgstrPredicate); log.trace("rgs.id={} found by: {}", rgs == null ? "'not found'" : rgs.getId(), rgstrPredicate.toString()); From 25290484851a656d9eb4d2ea546a96ec6f4cb3cb Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 15:03:27 +0300 Subject: [PATCH 57/61] http://jira.mfd.msk:8088/browse/CLS-871 --- .../cud/registry/ChangeRefundDateActionNew.java | 11 +++++++++++ .../request/cud/registry/ReturnDepositActionNew.java | 11 +++++++++++ .../cud/registry/RegistryChangeRefundDateRequest.java | 10 ++++++++++ .../cud/registry/RegistryReturnDepositRequest.java | 10 ++++++++++ 4 files changed, 42 insertions(+) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/ChangeRefundDateActionNew.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/ChangeRefundDateActionNew.java index 76856dd5f..cd8447aaa 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/ChangeRefundDateActionNew.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/ChangeRefundDateActionNew.java @@ -26,12 +26,15 @@ public class ChangeRefundDateActionNew implements IAction Date: Tue, 24 Jun 2025 15:09:55 +0300 Subject: [PATCH 58/61] http://jira.mfd.msk:8088/browse/CLS-871 --- .../cud/registry/RSplitDepositActionNew.java | 23 +++++++++++-------- .../RegistrySplitDepositActionRequest.java | 10 ++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/RSplitDepositActionNew.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/RSplitDepositActionNew.java index 62ec95e7b..85b42e29e 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/RSplitDepositActionNew.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/registry/RSplitDepositActionNew.java @@ -4,21 +4,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import io.swagger.annotations.ApiModelProperty; -import org.apache.commons.lang3.StringUtils; +import java.math.BigDecimal; +import java.time.LocalDate; import ru.spcex.clearing.backendapi.domain.actions.IAction; -import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; -import ru.spcex.platform.utils.enumeration.EnumMessage; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; public class RSplitDepositActionNew implements IAction { @@ -39,6 +31,8 @@ public class RSplitDepositActionNew implements IAction Date: Tue, 24 Jun 2025 15:21:56 +0300 Subject: [PATCH 59/61] http://jira.mfd.msk:8088/browse/CLS-871 --- .../src/main/resources/meta/meta.json | 18 +++++++++++++++--- .../src/main/resources/meta/meta.xml | 9 ++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 30ef4eadd..a0e25f8de 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.18.242.132", + "version": "3.18.244.133", "enums": { @@ -4597,6 +4597,10 @@ {"code": "section", "type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section" } + , + {"code": "market", + "type": 2,"length": 8,"dbname": "Код класса инструмента","name": "Код класса","shortname": "Код","visible": false,"searchable": true,"sortable": true + } ] ,"actions":[ {"method":"post", @@ -4652,6 +4656,10 @@ {"code": "balance", "type": 10,"name": "Сумма","shortname": "Сумма","required": true } + , + {"code": "market", + "type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false + } ] } , @@ -4710,6 +4718,10 @@ {"code": "refundDate", "type": 6,"name": "Дата возврата депозита","shortname": "Возврат депозита","visible": true,"enabled": true } + , + {"code": "market", + "type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false + } ] } , @@ -6714,7 +6726,7 @@ } , {"code": "exchangeExecutionMicroseconds", - "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true + "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true } , {"code": "coverageStatus", @@ -6750,7 +6762,7 @@ } , {"code": "exchangeExecutionMicroseconds", - "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true + "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true } , {"code": "tradingDate", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 777ab0383..12c086842 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -1070,6 +1070,7 @@
+ @@ -1082,6 +1083,7 @@ + @@ -1094,6 +1096,7 @@ + @@ -1557,14 +1560,14 @@ - + - + From cea1fc2d39704d332b0f802cc94033d1d4448d65 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 24 Jun 2025 15:23:07 +0300 Subject: [PATCH 60/61] increase version --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- clearing-parent/xml-exporter/pom.xml | 4 ++-- clearing-parent/xml-importer/pom.xml | 4 ++-- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 33 files changed, 67 insertions(+), 67 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index 0f6b30ad6..503158a8f 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 341661ab1..763665abb 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index cf9a22d88..962bfee54 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index c62bf71ba..19456cc47 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 5d7cbeed9..48759e5be 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.18.243 + SPCEX-3.18.244 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index a679f7dc5..2a19fe24a 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 84fcb33af..187987eb4 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 032d87580..9e416d818 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 0feddd9d5..67eead1ca 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 5bbdbcee2..e334169cb 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index 56b431c7e..0f3c8a1ca 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 58593fe54..e8d78fbed 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index a209217f0..38229ee6e 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.18.243 + SPCEX-3.18.244 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 4449e7aca..a51138a19 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index 9acf40257..df113b3ea 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.243 + SPCEX-3.18.244 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index 7263e7f8b..779b54413 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.243 + SPCEX-3.18.244 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index f3551cf6d..fd7cb0cbb 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.18.243 + SPCEX-3.18.244 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 58738ec3c..265026084 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.18.243 + SPCEX-3.18.244 clearing ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index dd65d3184..90641f23c 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 277ee1e41..d70cc66a0 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index 97b508803..65f440fb6 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index c570c950d..580347f7d 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index d8a9bad1d..656f7cc63 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 636fa6c63..34cb6d7f3 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.18.243 + SPCEX-3.18.244 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index d09e42e92..d94ed8f5a 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index 1b0a5a53d..649183bb4 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 test-clearing Test-clearing - SPCEX-3.18.243 + SPCEX-3.18.244 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 40c8f65aa..722c0a9e9 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.18.243 + SPCEX-3.18.244 trade-importer trade-importer Trade importer module - SPCEX-3.18.243 + SPCEX-3.18.244 jar @@ -55,7 +55,7 @@ ru.spcex.clearing classes - SPCEX-3.18.243 + SPCEX-3.18.244 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index 69ab6d33f..49b58abcd 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/xml-exporter/pom.xml b/clearing-parent/xml-exporter/pom.xml index e2fb00bc2..ae3cbe6ce 100644 --- a/clearing-parent/xml-exporter/pom.xml +++ b/clearing-parent/xml-exporter/pom.xml @@ -7,12 +7,12 @@ xml-exporter xml-exporter XML exporter for XML files - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/clearing-parent/xml-importer/pom.xml b/clearing-parent/xml-importer/pom.xml index 9239ad8c0..588a9b020 100644 --- a/clearing-parent/xml-importer/pom.xml +++ b/clearing-parent/xml-importer/pom.xml @@ -8,12 +8,12 @@ xml-importer xml-importer XML loader for XML files - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index c88f6988f..dba723d42 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.18.243 + SPCEX-3.18.244 diff --git a/pom.xml b/pom.xml index 1114cd123..c80223a22 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.18.243 + SPCEX-3.18.244 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.18.243 + SPCEX-3.18.244 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 558bf1246..f7de15b47 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.18.243 + SPCEX-3.18.244 4.0.0 From 404cd991fd699871aee2e8a8c4889ab935ee5254 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 24 Jun 2025 15:23:46 +0300 Subject: [PATCH 61/61] http://jira.mfd.msk:8088/browse/CLS-872 --- .../validation/RefundDateValidationRule.java | 14 +++++++------- .../validation/ReturnDepositValidationRule.java | 14 ++++++++------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java index 0e52d3834..6b2de4d0f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.service.validation; +import java.util.Collection; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -12,11 +16,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.util.Collection; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - public enum RefundDateValidationRule implements IValidationRule> { Fields() { @Override @@ -39,6 +38,7 @@ public enum RefundDateValidationRule implements IValidationRule rgs.getRefundDate().equals(rgs.getSettlementDate())) .collect(Collectors.toList()); - if (rgss.size() < 1) { - return of(ClearingError.RecordNotFound, "groupId=" + validatedObject.getGroupId()); + if (rgss.isEmpty()) { + return of(ClearingError.RecordNotFound, "groupId=%d; market=%s".formatted(validatedObject.getGroupId(), validatedObject.getMarket())); } for (Registry rgs : rgss) { if (!validatedObject.getRefundDate().isAfter(rgs.getValueDate())) { // если request.RefundDate <= ValueDate - то ошибка diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java index 1117dcc1d..941049a13 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java @@ -1,10 +1,14 @@ package ru.spcex.clearing.service.validation; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Optional; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; +import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryTradingParams; @@ -19,12 +23,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidationRule; -import java.math.BigDecimal; -import java.util.Collection; -import java.util.Optional; - -import static ru.spcex.clearing.service.registry.RegistryManager.equalsByCode; - //1. Проверки //1.1 Проверить, в запросе у регистра код: // 1.1.1 Если регистр TM-T: @@ -67,7 +65,11 @@ public enum ReturnDepositValidationRule implements IValidationRule rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + String mrkt = rgs.getMarket(); + ImdgPredicate mrktCondition = TextUtil.isEmpty(mrkt) ? + pb.alwaysTrue() : pb.or(pb.equals("market", mrkt), pb.isNull("market")); ImdgPredicate prdct = pb.and( + mrktCondition, pb.equals("groupId", rgs.getGroupId()), pb.equals("contract", rgs.getContract()) );