diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7f7bb5c8c..78311f2f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,17 +17,17 @@ preflight: stage: preflight script: - pwd - - git clone -b only_final "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 paths: - clearing_test only: + - master - dev - /^dev_.*$/ - new - - spring-state-machine-template-v2 resource_group: clearing-test build: @@ -41,10 +41,10 @@ build: paths: - /builds/mfd/clearing/z-distr/target/clearing only: + - master - dev - /^dev_.*$/ - new - - spring-state-machine-template-v2 resource_group: clearing-test test: @@ -56,18 +56,20 @@ 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 - - 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 only: + - master - dev - /^dev_.*$/ - new - - spring-state-machine-template-v2 resource_group: clearing-test \ No newline at end of file diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index 3c4dda71e..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.240 + SPCEX-3.18.244 4.0.0 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) ); diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 0e2e21749..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.240 + SPCEX-3.18.244 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 { @@ -39,6 +31,8 @@ public class RSplitDepositActionNew implements IAction - + @@ -1070,6 +1070,7 @@
+ @@ -1082,6 +1083,7 @@ + @@ -1094,6 +1096,7 @@ + @@ -1557,14 +1560,14 @@ - + - + @@ -1579,7 +1582,7 @@ - + @@ -2540,7 +2543,7 @@ - + @@ -2669,7 +2672,7 @@ - + diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 11756a7ab..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.240 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index 120f4da12..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.240 + SPCEX-3.18.244 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/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 8db315ba9..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.240 + SPCEX-3.18.244 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.18.240 + SPCEX-3.18.244 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index 55c932828..e29b11964 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.244 4.0.0 diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java new file mode 100644 index 000000000..6e526f3f7 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/component/GroupRgsKey.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.component; + +import java.util.Objects; + +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; + GroupRgsKey that = (GroupRgsKey) 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/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/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..5c478bbf4 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,12 +161,17 @@ 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; ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), + sTrd.getClassCode(), excDepSide.getKey()); return cash.containsKey(excKey); }); @@ -198,7 +210,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 +226,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 +346,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..e07f59763 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,12 +185,17 @@ 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; ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), + sTrd.getClassCode(), excDepSide.getKey()); return cash.containsKey(excKey); }); @@ -227,7 +234,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 +250,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 +400,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 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)); 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()) ); 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); 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; 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 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..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,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.GroupRgsKey; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -159,14 +160,16 @@ 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 GroupRgsKey(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(); + String market = group.getKey().market(); Function findByCode = rgsCode -> group.getValue() .stream() .filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs)) @@ -176,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; } @@ -192,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); }); @@ -203,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); }); @@ -236,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/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 -> { 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/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); 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..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 @@ -18,7 +18,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.component.predicate.cash.registry.AssetByTcrCompanyAccountCashedPredicate; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.RgsError; @@ -128,8 +130,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 +152,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 +193,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,8 +347,9 @@ public class InspectionObligationsV2 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())) + //доп группировка по market не нужна, лист registries уже сгруппирован + 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(); @@ -354,11 +357,17 @@ 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()), - pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) - ) + pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()), + marketCondition + ), + 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/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); 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; } 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..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 @@ -363,7 +363,8 @@ public class RequirementsAndObligationCreation implements ISessionStage { exec.getCompanyId(), settlementDt(exec), exec.getSessionId(), - exec.getExchangeExecutionId() + exec.getExchangeExecutionId(), + exec.getMarket() ); } @@ -396,11 +397,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 +410,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), + 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()); 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..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,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.GroupRgsKey; 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)); 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; - } } diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 4ad731309..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 5f56f6b48..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.240 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 93126a5bf..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 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; 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..2244bd92c 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,12 +2185,14 @@ 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; -- 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 'Дата и время изменения'; @@ -2296,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/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; 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 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..fc0f21bd1 --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/MARKET_LCC.sql @@ -0,0 +1,10 @@ +-- 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, '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; 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..85d3b351d --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.19.sql @@ -0,0 +1,9 @@ +-- DB version: 3.18 -> 3.19 + +ALTER TABLE REGISTRY ADD COLUMN IF NOT EXISTS MARKET VARCHAR(8); +COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента'; + +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/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 651cfeba9..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index f71532fff..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 35c2cca06..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 1c0533b57..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.240 + SPCEX-3.18.244 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.18.240 + SPCEX-3.18.244 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index 1c95bc53d..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.240 + SPCEX-3.18.244 4.0.0 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/DigitalSecurityService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/DigitalSecurityService.java index 95c931835..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; @@ -46,8 +48,15 @@ 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(); + 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 7ac886e8f..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 @@ -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()); @@ -26,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/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index dbcaceecf..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.244 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index 8c896bed2..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.244 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.244 compile 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 { @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()); diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index 01145fbcb..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.240 + SPCEX-3.18.244 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 394bb00e2..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.240 + SPCEX-3.18.244 clearing ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 258427f1c..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.240 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 2cca42e5e..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 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..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,13 +144,14 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( - pbRegistry.and( - pbRegistry.equals("groupId", groupId), - 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(), @@ -170,7 +171,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.18.240 + SPCEX-3.18.244 compile 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..fc62ce337 --- /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("Основание", + LauncherCommandRequest::getPaymentPurpose, + ValidationError.IncorrectPaymentPurpose) + ); + }; + } +} 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; } 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; + } + } diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index e8de38c63..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.240 + SPCEX-3.18.244 4.0.0 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..b1f328385 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/builder/DigitalCertificateRequestBuilder.java @@ -0,0 +1,135 @@ +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.Allowed; +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() { + } + + 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 DigitalCertificateRequestBuilder digitalSecurityId(final Long digitalSecurityId) { + this.digitalSecurityId = digitalSecurityId; + return this; + } + + public DigitalCertificateSecurityNewRequest buildNewRequest() { + DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); + + 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); + 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.setSettlementHouse(gatewayRequest.getSettlementOrganization()); + newRequest.setDepository(gatewayRequest.getSettlementDepository()); + newRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); + newRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); + return newRequest; + } + + public DigitalCertificateSecurityUpdateRequest buildUpdateRequest() { + DigitalCertificateSecurityUpdateRequest updateRequest = new DigitalCertificateSecurityUpdateRequest(); + + 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); + 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.setSettlementHouse(gatewayRequest.getSettlementOrganization()); + updateRequest.setDepository(gatewayRequest.getSettlementDepository()); + updateRequest.setNominalIndexationDate(gatewayRequest.getNominalIndexDate()); + updateRequest.setNominalValue(gatewayRequest.getNominalDenominationUnitForDate()); + 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); + } + + 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); + } +} 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..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 @@ -52,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; @@ -478,36 +479,34 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin private RequestInfoUpdate newDigitalSecurities(BaseRequest baseRequest) { DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload(); - DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest(); - newRequest.setBaseCode(request.getDepoDcId()); - newRequest.setInstrumentType(request.getInstrumentType()); 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 = companySymbols.getCompanyId(); - newRequest.setIssuerId(companyId); - - 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); + Long companyId = null; + if (companySymbols != null) { + companyId = companySymbols.getCompanyId(); + } else { + log.warn("Not found company symbols.."); + } + 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 + .digitalSecurityId(security.getId()) + .buildUpdateRequest(); + digitalCertificateSecurityFacade.updateDigitalCertificate(updateRequest); + } + + security = securitySelector.selectSecurityBySymbol(request.getSecuritySymbol()); Long securityId = security.getId(); for (ListingNewRequest listingReq : request.getListing()) { try { @@ -515,11 +514,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); diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index bb4c452a5..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile ru.spcex.clearing dictionary - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 70aa8bd2e..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.240 + SPCEX-3.18.244 jar ru.spcex.clearing clearing-parent - SPCEX-3.18.240 + SPCEX-3.18.244 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 71a534016..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.240 + SPCEX-3.18.244 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index ce7f4f3eb..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.240 + SPCEX-3.18.244 test-clearing Test-clearing - SPCEX-3.18.240 + SPCEX-3.18.244 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index c1f60fdc4..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.240 + SPCEX-3.18.244 trade-importer trade-importer Trade importer module - SPCEX-3.18.240 + SPCEX-3.18.244 jar @@ -55,7 +55,7 @@ ru.spcex.clearing classes - SPCEX-3.18.240 + SPCEX-3.18.244 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index 20d7c00f2..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.240 + SPCEX-3.18.244 4.0.0 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); diff --git a/clearing-parent/xml-exporter/pom.xml b/clearing-parent/xml-exporter/pom.xml index 5047be5ab..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 diff --git a/clearing-parent/xml-importer/pom.xml b/clearing-parent/xml-importer/pom.xml index b9d82faa4..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.240 + SPCEX-3.18.244 clearing-parent ru.spcex.clearing - SPCEX-3.18.240 + SPCEX-3.18.244 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 397312c8b..43294faea 100644 Binary files a/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar and b/clr_test/clearing-all/clearing_testing_utils/clearing-tester/clearing-tester.jar differ 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/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..85c586df5 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,36 +29,33 @@ services: environment: - CLR_TEST_NAME=${CLR_TEST_NAME} depends_on: - db: - condition: service_healthy - kafka: + db-updater: condition: service_started + kafka: + condition: service_healthy volumes: - logs_volume:/opt/clearing/bin/log_artifacts - # restart: always - - zookeeper: - image: mirror.gcr.io/confluentinc/cp-zookeeper:6.2.3.amd64 - container_name: zookeeper - environment: - ZOOKEEPER_SERVER_ID: 1 - ZOOKEEPER_CLIENT_PORT: 2181 - ZOOKEEPER_TICK_TIME: 2000 kafka: - image: mirror.gcr.io/confluentinc/cp-kafka:6.2.3.amd64 + build: kafka 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 - 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 + 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/Dockerfile b/clr_test/kafka/Dockerfile new file mode 100644 index 000000000..dc9f0fda4 --- /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/ \ No newline at end of file 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 diff --git a/clr_test/run_test_docker_containers.py b/clr_test/run_test_docker_containers.py index c3e7e8d0f..7827766bc 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) @@ -45,9 +50,6 @@ def run_docker(folder_name: str) -> int: os.chdir("..") - if code != 0: - sys.exit(code) - return code @@ -86,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") @@ -98,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: @@ -108,9 +119,47 @@ 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)] + remove_if_exists("clr_test/results.txt") + + combine_ddl_updates_into_file() for folder in folders: stop_docker_compose() apply_test_case(folder) 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; + } + +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryChangeRefundDateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryChangeRefundDateRequest.java index 7f959507a..fecfab5bf 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryChangeRefundDateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryChangeRefundDateRequest.java @@ -15,6 +15,8 @@ public class RegistryChangeRefundDateRequest { @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) private LocalDate refundDate; + @JsonProperty + public String market; public Long getGroupId() { return groupId; @@ -31,4 +33,12 @@ public class RegistryChangeRefundDateRequest { public void setRefundDate(LocalDate refundDate) { this.refundDate = refundDate; } + + public String getMarket() { + return market; + } + + public void setMarket(String market) { + this.market = market; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryReturnDepositRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryReturnDepositRequest.java index cfe98ab36..1f040f0ff 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryReturnDepositRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistryReturnDepositRequest.java @@ -10,6 +10,8 @@ public class RegistryReturnDepositRequest implements WithId { private Long id; @JsonProperty private BigDecimal balance; + @JsonProperty + public String market; public Long getId() { return id; @@ -26,4 +28,12 @@ public class RegistryReturnDepositRequest implements WithId { public void setBalance(BigDecimal balance) { this.balance = balance; } + + public String getMarket() { + return market; + } + + public void setMarket(String market) { + this.market = market; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistrySplitDepositActionRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistrySplitDepositActionRequest.java index c3a6d39ee..a687b027b 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistrySplitDepositActionRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/RegistrySplitDepositActionRequest.java @@ -23,6 +23,8 @@ public class RegistrySplitDepositActionRequest { private String contract; @JsonProperty private String direction; + @JsonProperty + public String market; public String getComment() { return comment; @@ -63,4 +65,12 @@ public class RegistrySplitDepositActionRequest { public void setDirection(String direction) { this.direction = direction; } + + public String getMarket() { + return market; + } + + public void setMarket(String market) { + this.market = market; + } } 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..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 @@ -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; @@ -19,6 +21,8 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym @JsonProperty private UUID issuerId; @JsonProperty + private String inn; + @JsonProperty private String shortName; @JsonProperty private String fullName; @@ -41,6 +45,7 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym @JsonProperty private String settlementDepository; @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) @JsonProperty private LocalDate nominalIndexDate; @JsonProperty @@ -75,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; } diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 1286f37b8..dba723d42 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.244 diff --git a/pom.xml b/pom.xml index 3139f7680..c80223a22 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.18.240 + SPCEX-3.18.244 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.18.240 + SPCEX-3.18.244 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 4b71d7b4d..f7de15b47 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.244 4.0.0