Merge branch 'dev' into spring-state-machine-template-v2

# Conflicts:
#	.gitlab-ci.yml
This commit is contained in:
ialbert 2025-06-24 17:46:39 +03:00
commit b8d55c4627
102 changed files with 1228 additions and 553 deletions

View file

@ -17,17 +17,17 @@ preflight:
stage: preflight stage: preflight
script: script:
- pwd - 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: artifacts:
name: "$CI_COMMIT_REF_NAME" name: "$CI_COMMIT_REF_NAME"
expire_in: 1 day expire_in: 1 day
paths: paths:
- clearing_test - clearing_test
only: only:
- master
- dev - dev
- /^dev_.*$/ - /^dev_.*$/
- new - new
- spring-state-machine-template-v2
resource_group: clearing-test resource_group: clearing-test
build: build:
@ -41,10 +41,10 @@ build:
paths: paths:
- /builds/mfd/clearing/z-distr/target/clearing - /builds/mfd/clearing/z-distr/target/clearing
only: only:
- master
- dev - dev
- /^dev_.*$/ - /^dev_.*$/
- new - new
- spring-state-machine-template-v2
resource_group: clearing-test resource_group: clearing-test
test: test:
@ -56,18 +56,20 @@ test:
script: script:
- echo "Installing maven and python" && apk update && apk add maven python3 - 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 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 - echo "Removing old logs folder artifacts/logs" && rm -rf artifacts/logs
- python3 clr_test/run_test_docker_containers.py - 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 "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 - 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: artifacts:
expire_in: 1 day expire_in: 7 day
when: always when: always
paths: paths:
- artifacts/logs - artifacts/logs
only: only:
- master
- dev - dev
- /^dev_.*$/ - /^dev_.*$/
- new - new
- spring-state-machine-template-v2
resource_group: clearing-test resource_group: clearing-test

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -71,37 +71,37 @@ public class BankAccountValidationConfig {
AccountError.RequiredFieldEmpty, AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound, AccountError.DictionaryNotFound,
false), false),
ValidateSymbolsRule.required("bankIdentificationCode", ValidateSymbolsRule.required("БИК",
BankAccountNewRequest::getBankIdentificationCode, BankAccountNewRequest::getBankIdentificationCode,
AccountError.RequiredFieldEmpty, AccountError.RequiredFieldEmpty,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.required("bankName", ValidateSymbolsRule.required("Наименование компании",
BankAccountNewRequest::getBankName, BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty, AccountError.RequiredFieldEmpty,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("correspondentAccount", ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountNewRequest::getCorrespondentAccount, BankAccountNewRequest::getCorrespondentAccount,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("correspondentAccountName", ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountNewRequest::getCorrespondentAccountName, BankAccountNewRequest::getCorrespondentAccountName,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("destination", ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountNewRequest::getDestination, BankAccountNewRequest::getDestination,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.required("account", ValidateSymbolsRule.required("Счет",
BankAccountNewRequest::getAccount, BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty, AccountError.RequiredFieldEmpty,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("taxpayerIdentificationNumber", ValidateSymbolsRule.notRequired("ИНН",
BankAccountNewRequest::getTaxpayerIdentificationNumber, BankAccountNewRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("taxRegistrationReasonCode", ValidateSymbolsRule.notRequired("КПП",
BankAccountNewRequest::getTaxRegistrationReasonCode, BankAccountNewRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("swiftCode", ValidateSymbolsRule.notRequired("SWIFT",
BankAccountNewRequest::getSwiftCode, BankAccountNewRequest::getSwiftCode,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("intermediarySwiftCode", ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountNewRequest::getIntermediarySwiftCode, BankAccountNewRequest::getIntermediarySwiftCode,
AccountError.BadSymbol) AccountError.BadSymbol)
); );
@ -145,34 +145,34 @@ public class BankAccountValidationConfig {
AccountError.RequiredFieldEmpty, AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound, AccountError.DictionaryNotFound,
false), false),
ValidateSymbolsRule.notRequired("bankIdentificationCode", ValidateSymbolsRule.notRequired("БИК",
BankAccountUpdateRequest::getBankIdentificationCode, BankAccountUpdateRequest::getBankIdentificationCode,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("bankName", ValidateSymbolsRule.notRequired("Наименование компании",
BankAccountUpdateRequest::getBankName, BankAccountUpdateRequest::getBankName,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("correspondentAccount", ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountUpdateRequest::getCorrespondentAccount, BankAccountUpdateRequest::getCorrespondentAccount,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("correspondentAccountName", ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountUpdateRequest::getCorrespondentAccountName, BankAccountUpdateRequest::getCorrespondentAccountName,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("destination", ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountUpdateRequest::getDestination, BankAccountUpdateRequest::getDestination,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("account", ValidateSymbolsRule.notRequired("Счет",
BankAccountUpdateRequest::getAccount, BankAccountUpdateRequest::getAccount,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("taxpayerIdentificationNumber", ValidateSymbolsRule.notRequired("ИНН",
BankAccountUpdateRequest::getTaxpayerIdentificationNumber, BankAccountUpdateRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("taxRegistrationReasonCode", ValidateSymbolsRule.notRequired("КПП",
BankAccountUpdateRequest::getTaxRegistrationReasonCode, BankAccountUpdateRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("swiftCode", ValidateSymbolsRule.notRequired("SWIFT",
BankAccountUpdateRequest::getSwiftCode, BankAccountUpdateRequest::getSwiftCode,
AccountError.BadSymbol), AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("intermediarySwiftCode", ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountUpdateRequest::getIntermediarySwiftCode, BankAccountUpdateRequest::getIntermediarySwiftCode,
AccountError.BadSymbol) AccountError.BadSymbol)
); );

View file

@ -11,7 +11,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>

View file

@ -26,12 +26,15 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
@JsonSerialize(using = LocalDateSerializer.class) @JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class) @JsonDeserialize(using = LocalDateDeserializer.class)
public LocalDate refundDate; public LocalDate refundDate;
@JsonProperty
public String market;
@Override @Override
public RegistryChangeRefundDateRequest toRequest() { public RegistryChangeRefundDateRequest toRequest() {
var req = new RegistryChangeRefundDateRequest(); var req = new RegistryChangeRefundDateRequest();
req.setGroupId(groupId); req.setGroupId(groupId);
req.setRefundDate(refundDate); req.setRefundDate(refundDate);
req.setMarket(market);
return req; return req;
} }
@ -68,4 +71,12 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
public void setRefundDate(LocalDate refundDate) { public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate; this.refundDate = refundDate;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -4,21 +4,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActionRequest> { public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActionRequest> {
@ -39,6 +31,8 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
@ApiModelProperty(value = "Направление", example = "OUT") @ApiModelProperty(value = "Направление", example = "OUT")
@JsonProperty @JsonProperty
public String direction; public String direction;
@JsonProperty
public String market;
@Override @Override
@ -49,6 +43,7 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
req.setRefundDate(this.refundDate); req.setRefundDate(this.refundDate);
req.setContract(this.contract); req.setContract(this.contract);
req.setDirection(this.direction); req.setDirection(this.direction);
req.setMarket(this.market);
return req; return req;
} }
@ -97,4 +92,12 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
public void setDirection(String direction) { public void setDirection(String direction) {
this.direction = direction; this.direction = direction;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -22,12 +22,15 @@ public class ReturnDepositActionNew implements IAction<RegistryReturnDepositRequ
@ApiModelProperty(value = "Сумма", example = "1600.20") @ApiModelProperty(value = "Сумма", example = "1600.20")
@JsonProperty @JsonProperty
public BigDecimal balance; public BigDecimal balance;
@JsonProperty
public String market;
@Override @Override
public RegistryReturnDepositRequest toRequest() { public RegistryReturnDepositRequest toRequest() {
var req = new RegistryReturnDepositRequest(); var req = new RegistryReturnDepositRequest();
req.setId(id); req.setId(id);
req.setBalance(balance); req.setBalance(balance);
req.setMarket(market);
return req; return req;
} }
@ -65,4 +68,12 @@ public class ReturnDepositActionNew implements IAction<RegistryReturnDepositRequ
public void setBalance(BigDecimal balance) { public void setBalance(BigDecimal balance) {
this.balance = balance; this.balance = balance;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -1,6 +1,6 @@
{ {
"version": "3.18.240.129", "version": "3.18.244.133",
"enums": { "enums": {
@ -4597,6 +4597,10 @@
{"code": "section", {"code": "section",
"type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section" "type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section"
} }
,
{"code": "market",
"type": 2,"length": 8,"dbname": "Код класса инструмента","name": "Код класса","shortname": "Код","visible": false,"searchable": true,"sortable": true
}
] ]
,"actions":[ ,"actions":[
{"method":"post", {"method":"post",
@ -4652,6 +4656,10 @@
{"code": "balance", {"code": "balance",
"type": 10,"name": "Сумма","shortname": "Сумма","required": true "type": 10,"name": "Сумма","shortname": "Сумма","required": true
} }
,
{"code": "market",
"type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false
}
] ]
} }
, ,
@ -4710,6 +4718,10 @@
{"code": "refundDate", {"code": "refundDate",
"type": 6,"name": "Дата возврата депозита","shortname": "Возврат депозита","visible": true,"enabled": true "type": 6,"name": "Дата возврата депозита","shortname": "Возврат депозита","visible": true,"enabled": true
} }
,
{"code": "market",
"type": 2,"length": 8,"name": "Код класса","shortname": "Код","visible": false
}
] ]
} }
, ,
@ -6714,7 +6726,7 @@
} }
, ,
{"code": "exchangeExecutionMicroseconds", {"code": "exchangeExecutionMicroseconds",
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true
} }
, ,
{"code": "coverageStatus", {"code": "coverageStatus",
@ -6750,7 +6762,7 @@
} }
, ,
{"code": "exchangeExecutionMicroseconds", {"code": "exchangeExecutionMicroseconds",
"type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true "type": 4,"name": "Микросекунды заключения сделки в Торговой системе","shortname": "Микросекунды заключения сделки","visible": true,"searchable": true,"sortable": true,"ignore": true
} }
, ,
{"code": "tradingDate", {"code": "tradingDate",
@ -6810,7 +6822,7 @@
} }
, ,
{"code": "market", {"code": "market",
"type": 12,"dbname": "Код секции валютного инструмента","name": "Секция валютного инструмента","shortname": "Секция","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "description" "type": 12,"dbname": "Код секции валютного инструмента","name": "Секция валютного инструмента","shortname": "Секция","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "name"
} }
, ,
{"code": "marketName", {"code": "marketName",
@ -10961,7 +10973,7 @@
} }
, ,
{"code": "isin", {"code": "isin",
"type": 2,"length": 50,"name": "Наименование инструмента ISIN","shortname": "ISIN","searchable": true,"sortable": true,"visible": true,"extends": "security" "type": 2,"length": 50,"name": "Наименование инструмента ISIN","shortname": "ISIN","searchable": true,"sortable": true,"visible": false,"extends": "security"
} }
, ,
{"code": "instrumentType", {"code": "instrumentType",
@ -11491,7 +11503,7 @@
{ {
"code": "marketName" "code": "marketName"
,"field": "market","type": 12,"dbname": "Код секции валютного инструмента","name": "Наименование класса валютного инструмента","shortname": "Наименование класса","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "description" ,"field": "market","type": 12,"dbname": "Код секции валютного инструмента","name": "Наименование класса валютного инструмента","shortname": "Наименование класса","visible": true,"searchable": true,"sortable": true,"link": "market","linkKeyCode": "code","linkCode": "name"
} }
, ,

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?--> <!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
<meta version="3.18.240.129"> <meta version="3.18.244.133">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" --> <!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари--> <!--Здесь словари-->
<enums> <enums>
@ -1070,6 +1070,7 @@
<updatedAt field="updated" type="4" name="Дата и время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/> <updatedAt field="updated" type="4" name="Дата и время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
<securityId type="1" dbname="Идентификатор инструмента" name="Код инструмента" shortname="Код инструмента" searchable="false" sortable="true" visible="false" link="security" linkCode="shortName"/> <securityId type="1" dbname="Идентификатор инструмента" name="Код инструмента" shortname="Код инструмента" searchable="false" sortable="true" visible="false" link="security" linkCode="shortName"/>
<section type="12" dbname="Код секции" name="Наименование секции" shortname="Секция" searchable="true" sortable="true" visible="true" link="section"/> <section type="12" dbname="Код секции" name="Наименование секции" shortname="Секция" searchable="true" sortable="true" visible="true" link="section"/>
<market type="2" length="8" dbname="Код класса инструмента" name="Код класса" shortname="Код" visible="false" searchable="true" sortable="true"/>
<actions> <actions>
<post name="Разделение депозита" destination="registries/splitDeposit" confirmation="contract,outboundAmount,refundDate" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew"> <post name="Разделение депозита" destination="registries/splitDeposit" confirmation="contract,outboundAmount,refundDate" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew">
<companyId type="1" name="Наименование участника" shortname="Инициатор" link="company" linkCode="shortName" enabled="false"/> <companyId type="1" name="Наименование участника" shortname="Инициатор" link="company" linkCode="shortName" enabled="false"/>
@ -1082,6 +1083,7 @@
<post name="Отметить средства на возврат депозита" destination="registries/returnDeposit" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew"> <post name="Отметить средства на возврат депозита" destination="registries/returnDeposit" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew">
<id type="1" name="Регистр требований" shortname="Регистр требований" required="true" enabled="false" visible="false"/> <id type="1" name="Регистр требований" shortname="Регистр требований" required="true" enabled="false" visible="false"/>
<balance type="10" name="Сумма" shortname="Сумма" required="true"/> <balance type="10" name="Сумма" shortname="Сумма" required="true"/>
<market type="2" length="8" name="Код класса" shortname="Код" visible="false"/>
</post> </post>
<post name="Идентификация неразмеченных средств" destination="registries/identificationFunds" confirmation="securitySymbol,balance,tradingClearingRegistryId" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew"> <post name="Идентификация неразмеченных средств" destination="registries/identificationFunds" confirmation="securitySymbol,balance,tradingClearingRegistryId" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew">
<id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/> <id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/>
@ -1094,6 +1096,7 @@
<groupId type="1" dbname="Идентификатор группы связанных регистров" name="Идентификатор группы" required="true" enabled="false" visible="false"/> <groupId type="1" dbname="Идентификатор группы связанных регистров" name="Идентификатор группы" required="true" enabled="false" visible="false"/>
<contract type="2" length="255" name="Договор" shortname="Номер договора" required="true" enabled="false"/> <contract type="2" length="255" name="Договор" shortname="Номер договора" required="true" enabled="false"/>
<refundDate type="6" name="Дата возврата депозита" shortname="Возврат депозита" visible="true" enabled="true"/> <refundDate type="6" name="Дата возврата депозита" shortname="Возврат депозита" visible="true" enabled="true"/>
<market type="2" length="8" name="Код класса" shortname="Код" visible="false"/>
</put> </put>
<put name="Установить отметку о получении выписки" destination="registries/changeStatusExtract" confirmation="shortName,contract,balance" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew"> <put name="Установить отметку о получении выписки" destination="registries/changeStatusExtract" confirmation="shortName,contract,balance" class="ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew">
<id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/> <id type="1" name="Идентификатор записи" shortname="ID" link="registry" linkCode="id" required="true"/>
@ -1557,14 +1560,14 @@
<securityFullName type="2" length="255" name="Наименование инструмента" shortname="Инструмент" visible="true" searchable="true" sortable="true"/> <securityFullName type="2" length="255" name="Наименование инструмента" shortname="Инструмент" visible="true" searchable="true" sortable="true"/>
<settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/> <settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/>
<settlementCurrency type="12" dbname="Код валюты расчетов по инструменту" name="Валюта расчетов по инструменту" shortname="Валюта" visible="true" searchable="true" sortable="true" link="currencyCode" linkCode="code"/> <settlementCurrency type="12" dbname="Код валюты расчетов по инструменту" name="Валюта расчетов по инструменту" shortname="Валюта" visible="true" searchable="true" sortable="true" link="currencyCode" linkCode="code"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true"/> <exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true" ignore="true"/>
<coverageStatus type="12" dbname="Код статуса достаточности обеспечения" name="Статус достаточности обеспечения" shortname="Обеспеченность" searchable="true" sortable="true" link="allowed"/> <coverageStatus type="12" dbname="Код статуса достаточности обеспечения" name="Статус достаточности обеспечения" shortname="Обеспеченность" searchable="true" sortable="true" link="allowed"/>
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/> <sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
</executionFond> </executionFond>
<executionCurrency name="Сделки с валютными инструментами" destination="execution-currency" class="ru.clearing.classes.statics.data.execution.ExecutionCurrency" logUpdates="true" table="execution_currency"> <executionCurrency name="Сделки с валютными инструментами" destination="execution-currency" class="ru.clearing.classes.statics.data.execution.ExecutionCurrency" logUpdates="true" table="execution_currency">
<exchangeExecutionId type="1" name="Идентификационный номер сделки в Торговой системе" shortname="Номер сделки" visible="true" searchable="true" sortable="true"/> <exchangeExecutionId type="1" name="Идентификационный номер сделки в Торговой системе" shortname="Номер сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionTime type="4" name="Время заключения сделки в Торговой системе" shortname="Время заключения сделки" visible="true" searchable="true" sortable="true"/> <exchangeExecutionTime type="4" name="Время заключения сделки в Торговой системе" shortname="Время заключения сделки" visible="true" searchable="true" sortable="true"/>
<exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true"/> <exchangeExecutionMicroseconds type="4" name="Микросекунды заключения сделки в Торговой системе" shortname="Микросекунды заключения сделки" visible="true" searchable="true" sortable="true" ignore="true"/>
<tradingDate type="6" name="Дата заключения сделки" shortname="Дата заключения сделки" visible="true" searchable="true" sortable="true"/> <tradingDate type="6" name="Дата заключения сделки" shortname="Дата заключения сделки" visible="true" searchable="true" sortable="true"/>
<settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/> <settlementDate type="6" name="Дата расчетов" shortname="Дата расчетов" visible="true" searchable="true" sortable="true"/>
<settlementCode type="2" length="12" name="Код расчетов при размещении" shortname="Код расчетов при размещении" visible="false" searchable="true" sortable="true" ignore="true"/> <settlementCode type="2" length="12" name="Код расчетов при размещении" shortname="Код расчетов при размещении" visible="false" searchable="true" sortable="true" ignore="true"/>
@ -1579,7 +1582,7 @@
<counterPartyName field="counterPartyId" type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Название УК контрагента" shortname="Название УК контрагента" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName" ignore="true"/> <counterPartyName field="counterPartyId" type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Название УК контрагента" shortname="Название УК контрагента" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName" ignore="true"/>
<counterPartyTradingClearingRegistryId type="1" dbname="Идентификатор торгово-клирингового регистра партнера" name="Торгово-клиринговый регистр партнера" shortname="ТКР партнера" visible="true" searchable="true" sortable="true" link="tradingClearingRegistry" linkCode="code" ignore="true"/> <counterPartyTradingClearingRegistryId type="1" dbname="Идентификатор торгово-клирингового регистра партнера" name="Торгово-клиринговый регистр партнера" shortname="ТКР партнера" visible="true" searchable="true" sortable="true" link="tradingClearingRegistry" linkCode="code" ignore="true"/>
<counterPartyTradingClearingRegistry type="2" length="20" dbname="Торгово-клиринговый регистр партнера" name="Торгово-клиринговый регистр партнера" shortname="ТКР партнера" visible="true" searchable="true" sortable="true" /> <counterPartyTradingClearingRegistry type="2" length="20" dbname="Торгово-клиринговый регистр партнера" name="Торгово-клиринговый регистр партнера" shortname="ТКР партнера" visible="true" searchable="true" sortable="true" />
<market type="12" dbname="Код секции валютного инструмента" name="Секция валютного инструмента" shortname="Секция" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="description"/> <market type="12" dbname="Код секции валютного инструмента" name="Секция валютного инструмента" shortname="Секция" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="name"/>
<marketName field="market" type="12" dbname="Код секции валютного инструмента" name="Наименование класса валютного инструмента" shortname="Наименование класса" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="description" ignore="true"/> <marketName field="market" type="12" dbname="Код секции валютного инструмента" name="Наименование класса валютного инструмента" shortname="Наименование класса" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="description" ignore="true"/>
<price type="10" name="Цена" shortname ="Цена" visible="true" searchable="true" sortable="true"/> <price type="10" name="Цена" shortname ="Цена" visible="true" searchable="true" sortable="true"/>
<lotSize type="11" name="Размер лота" shortname="Лот" searchable="true" sortable="true" visible="true" linkKeyCode="securityId" linkCode="lotSize" link="listing" extends="listing"/> <lotSize type="11" name="Размер лота" shortname="Лот" searchable="true" sortable="true" visible="true" linkKeyCode="securityId" linkCode="lotSize" link="listing" extends="listing"/>
@ -2540,7 +2543,7 @@
<shortName type="2" length="255" name="Краткое наименование инструмента" shortname="Краткое наименование" searchable="true" sortable="true" visible="true" extends="security"/> <shortName type="2" length="255" name="Краткое наименование инструмента" shortname="Краткое наименование" searchable="true" sortable="true" visible="true" extends="security"/>
<securitySymbol type="2" length="255" name="Код инструмента" shortname="Код" searchable="true" sortable="true" visible="true" extends="security"/> <securitySymbol type="2" length="255" name="Код инструмента" shortname="Код" searchable="true" sortable="true" visible="true" extends="security"/>
<fullName type="2" length="255" name="Полное наименование инструмента" shortname="Наименование" searchable="true" sortable="true" visible="true" extends="security"/> <fullName type="2" length="255" name="Полное наименование инструмента" shortname="Наименование" searchable="true" sortable="true" visible="true" extends="security"/>
<isin type="2" length="50" name="Наименование инструмента ISIN" shortname="ISIN" searchable="true" sortable="true" visible="true" extends="security"/> <isin type="2" length="50" name="Наименование инструмента ISIN" shortname="ISIN" searchable="true" sortable="true" visible="false" extends="security"/>
<instrumentType type="12" dbname="Код типа инструмента" name="Наименование типа инструмента" shortname="Тип инструмента" searchable="true" sortable="true" visible="true" link="instrumentType" extends="security"/> <instrumentType type="12" dbname="Код типа инструмента" name="Наименование типа инструмента" shortname="Тип инструмента" searchable="true" sortable="true" visible="true" link="instrumentType" extends="security"/>
<issuerId type="1" dbname="Идентификатор эмитента" name="Наименование эмитента" shortname="Эмитент" searchable="true" sortable="true" visible="true" link="company" linkCode="shortName" extends="security"/> <issuerId type="1" dbname="Идентификатор эмитента" name="Наименование эмитента" shortname="Эмитент" searchable="true" sortable="true" visible="true" link="company" linkCode="shortName" extends="security"/>
<shortNameEng type="2" length="255" name="Краткое наименование инструмента на английском" shortname="Краткое наименование на английском" searchable="true" sortable="true" visible="true" extends="security"/> <shortNameEng type="2" length="255" name="Краткое наименование инструмента на английском" shortname="Краткое наименование на английском" searchable="true" sortable="true" visible="true" extends="security"/>
@ -2669,7 +2672,7 @@
<set><companyId type="1" dbname="Идентификатор компании" name="Название участника клиринга" shortname="Название УК" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/></set> <set><companyId type="1" dbname="Идентификатор компании" name="Название участника клиринга" shortname="Название УК" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/></set>
<set><counterPartyCode field="counterPartyId" type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Код УК контрагента" shortname="Код УК контрагента" visible="true" searchable="true" sortable="true" ignore="false" link="company" linkCode="clearingCode"/></set> <set><counterPartyCode field="counterPartyId" type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Код УК контрагента" shortname="Код УК контрагента" visible="true" searchable="true" sortable="true" ignore="false" link="company" linkCode="clearingCode"/></set>
<set><counterPartyId type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Название УК контрагента" shortname="Название УК контрагента" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/></set> <set><counterPartyId type="1" dbname="Идентификатор компании-партнера, с которой заключена сделка" name="Название УК контрагента" shortname="Название УК контрагента" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/></set>
<set><marketName field="market" type="12" dbname="Код секции валютного инструмента" name="Наименование класса валютного инструмента" shortname="Наименование класса" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="description"/></set> <set><marketName field="market" type="12" dbname="Код секции валютного инструмента" name="Наименование класса валютного инструмента" shortname="Наименование класса" visible="true" searchable="true" sortable="true" link="market" linkKeyCode="code" linkCode="name"/></set>
<set><currencyCode type="12" name="Код валюты расчетов" shortname="Валюта расчетов" searchable="true" sortable="true" link="currencyCode" linkCode="code" visible="true"/></set> <set><currencyCode type="12" name="Код валюты расчетов" shortname="Валюта расчетов" searchable="true" sortable="true" link="currencyCode" linkCode="code" visible="true"/></set>
<set><marketSectionCode field="market" type="12" dbname="Код секции валютного инструмента" name="Код секции в Клиринговой системе" shortname="Код секции в КС" visible="true" searchable="true" sortable="true" ignore="false" link="market" linkKeyCode="code" linkCode="section"/></set> <set><marketSectionCode field="market" type="12" dbname="Код секции валютного инструмента" name="Код секции в Клиринговой системе" shortname="Код секции в КС" visible="true" searchable="true" sortable="true" ignore="false" link="market" linkKeyCode="code" linkCode="section"/></set>
<set><linkedExchangeExecutionId type="1" name="Идентификационный номер витринной сделки в Торговой системе" shortname="Номер витринной сделки" searchable="true" sortable="true" visible="true" ignore="false"/></set> <set><linkedExchangeExecutionId type="1" name="Идентификационный номер витринной сделки в Торговой системе" shortname="Номер витринной сделки" searchable="true" sortable="true" visible="true" ignore="false"/></set>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -12,7 +12,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>

View file

@ -61,6 +61,7 @@ public class Registry extends BusinessObject implements Cloneable {
private String sessionType; private String sessionType;
private Long paymentId; private Long paymentId;
private String section; private String section;
private String market;
public Long getCompanyId() { public Long getCompanyId() {
return companyId; return companyId;
@ -444,6 +445,14 @@ public class Registry extends BusinessObject implements Cloneable {
this.section = section; this.section = section;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
@Override @Override
public Registry clone() { public Registry clone() {
try { try {

View file

@ -6,13 +6,13 @@
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<artifactId>cleaning-builders</artifactId> <artifactId>cleaning-builders</artifactId>
<name>cleaning-builders</name> <name>cleaning-builders</name>
<description>Cleaning builders module</description> <description>Cleaning builders module</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<packaging>jar</packaging> <packaging>jar</packaging>
@ -26,7 +26,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -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);
}
}

View file

@ -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<Map.Entry<GroupRgsKey, List<Registry>>> {
@Override
public int compare(Map.Entry<GroupRgsKey, List<Registry>> o1, Map.Entry<GroupRgsKey, List<Registry>> o2) {
return o1.getKey().groupId().compareTo(o2.getKey().groupId());
}
}

View file

@ -4,14 +4,19 @@ import java.time.LocalDate;
import java.util.Objects; import java.util.Objects;
import ru.clearing.classes.statics.data.execution.ExecutionCommon; 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) { public static ExecUploadKey cash(LocalDate tradingDate, Long exchangeExecutionId, String market, String side) {
return new ExecUploadKey(tradingDate, exchangeExecutionId, side); return new ExecUploadKey(tradingDate, exchangeExecutionId, market, side);
} }
public static ExecUploadKey cash(ExecutionCommon exec) { 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 @Override

View file

@ -176,6 +176,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
// MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; // MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(), sTrd.getTradeNum(),
sTrd.getClassCode(),
sTrdSide.getKey()); sTrdSide.getKey());
return cash.containsKey(excKey); return cash.containsKey(excKey);
}); });

View file

@ -9,9 +9,11 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import static java.lang.String.format;
import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.EnableScheduling; 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.ClearingError;
import ru.spcex.clearing.error.ClearingException; import ru.spcex.clearing.error.ClearingException;
import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType; 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.STradesSecurityPresentDepositValidationRule;
import ru.spcex.clearing.service.validation.strades.TcrByCodeAndCmpIsActiveCashingValidationRule; import ru.spcex.clearing.service.validation.strades.TcrByCodeAndCmpIsActiveCashingValidationRule;
import ru.spcex.platform.enumeration.MoneyFlowSide; 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.Section;
import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
@ -73,6 +78,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
private final Imdg<Company> imdgCompany; private final Imdg<Company> imdgCompany;
private final Imdg<TradingClearingRegistry> imdgTradingClearingRegistry; private final Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
private final ImdgId idGen; private final ImdgId idGen;
private final NotificationSender notifications;
//fixme ждать ТЗ //fixme ждать ТЗ
Long tradeNum; Long tradeNum;
@ -86,7 +92,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
@Autowired @Autowired
public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka, public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka, NotificationSender notifications,
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender,
IMessageResolver msgResolver) { IMessageResolver msgResolver) {
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); 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.imdgCompany = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_Company, Company.class, null);
this.imdgTradingClearingRegistry = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null); this.imdgTradingClearingRegistry = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, null);
this.idGen = imdgProvider.getImdgIdGenerator(); this.idGen = imdgProvider.getImdgIdGenerator();
this.notifications = notifications;
this.kafkaSender = kafkaSender; this.kafkaSender = kafkaSender;
this.msgResolver = msgResolver; this.msgResolver = msgResolver;
@ -154,12 +161,17 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
sTrades.removeIf(sTrd -> { sTrades.removeIf(sTrd -> {
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { 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; return true;
} }
MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(), sTrd.getTradeNum(),
sTrd.getClassCode(),
excDepSide.getKey()); excDepSide.getKey());
return cash.containsKey(excKey); return cash.containsKey(excKey);
}); });
@ -198,7 +210,10 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
} catch (ClearingException ce) { } catch (ClearingException ce) {
auditMessage(ce); auditMessage(ce);
} catch (Exception e) { } 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()); log.info("batch putAll {} ExecutionDeposit", execsToInsert.size());
@ -211,7 +226,8 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
protected void auditMessage(ClearingException ce) { 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 { protected void sendNotification(ExecutionDeposit forED) throws ClearingException {
@ -330,11 +346,33 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
} }
private void logError(IEnumId subject, Object... args) { 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) { 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<TradingClearingRegistry> searchTcrByStrades(STrades sTrades) { private Optional<TradingClearingRegistry> searchTcrByStrades(STrades sTrades) {

View file

@ -9,8 +9,10 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import static java.lang.String.format;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
@ -183,12 +185,17 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
sTrades.removeIf(sTrd -> { sTrades.removeIf(sTrd -> {
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { 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; return true;
} }
Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL; Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL;
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
sTrd.getTradeNum(), sTrd.getTradeNum(),
sTrd.getClassCode(),
excDepSide.getKey()); excDepSide.getKey());
return cash.containsKey(excKey); return cash.containsKey(excKey);
}); });
@ -227,7 +234,10 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
} catch (ClearingException ce) { } catch (ClearingException ce) {
auditMessage(ce); auditMessage(ce);
} catch (Exception e) { } 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()); log.info("batch putAll {} ExecutionFond", execsToInsert.size());
@ -240,7 +250,8 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
protected void auditMessage(ClearingException ce) { 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 { protected void sendNotification(ExecutionFond forEF) throws ClearingException {
@ -389,11 +400,32 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
} }
private void logError(IEnumId subject, Object... args) { 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) { 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 @Override

View file

@ -14,6 +14,7 @@ import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanyRoleSet; import ru.clearing.classes.statics.data.company.CompanyRoleSet;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.clearing.session.stage.util.RegistryUtil;
@ -56,15 +57,16 @@ public class PaymentStateMarkService {
pb.equals("registryStatus", RegistryStatus.OK.getKey()) pb.equals("registryStatus", RegistryStatus.OK.getKey())
); );
Collection<Registry> claimsAndLiabilities = rgsImdg.getCollectionObjectsByPredicate(prdct); Collection<Registry> claimsAndLiabilities = rgsImdg.getCollectionObjectsByPredicate(prdct);
Map<Long, List<Registry>> groups = claimsAndLiabilities Map<GroupRgsKey, List<Registry>> groups = claimsAndLiabilities
.stream() .stream()
.filter(rgs -> rgs.getValueDate() != null) .filter(rgs -> rgs.getValueDate() != null)
.filter(rgs -> rgs.getSettlementDate() != null) .filter(rgs -> rgs.getSettlementDate() != null)
.filter(rgs -> rgs.getSettlementDate().equals(rgs.getValueDate())) .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()); log.debug("found {} ({} groups) CM*T/LM*T by {}", claimsAndLiabilities.size(), groups.size(), prdct.toString());
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey(); Long groupId = group.getKey().groupId();
String market = group.getKey().market();
Function<RegistryDesignation, Registry> findRgs = (rd) -> group.getValue() Function<RegistryDesignation, Registry> findRgs = (rd) -> group.getValue()
.stream() .stream()
.filter(rgs -> rd.equalsByKey(rgs.getRegistryDesignation())) .filter(rgs -> rd.equalsByKey(rgs.getRegistryDesignation()))
@ -73,7 +75,7 @@ public class PaymentStateMarkService {
Registry cm_t = findRgs.apply(RegistryDesignation.T); Registry cm_t = findRgs.apply(RegistryDesignation.T);
Registry lm_t = findRgs.apply(RegistryDesignation.O); Registry lm_t = findRgs.apply(RegistryDesignation.O);
if (cm_t == null || lm_t == null) { 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; continue;
} }
CompanyRoleSet initRole = cmpRoleImdg.getFirstObjectBySQL( CompanyRoleSet initRole = cmpRoleImdg.getFirstObjectBySQL(
@ -84,7 +86,8 @@ public class PaymentStateMarkService {
) )
); );
if (initRole == null) { 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; continue;
} }
Registry dm_v = cm_t.clone(); Registry dm_v = cm_t.clone();
@ -95,8 +98,8 @@ public class PaymentStateMarkService {
dm_v.setBalance(cm_t.getBalance()); dm_v.setBalance(cm_t.getBalance());
dm_v.setRegistryStatus(RegistryStatus.PROC.getKey()); dm_v.setRegistryStatus(RegistryStatus.PROC.getKey());
rgsImdg.insert(dm_v); rgsImdg.insert(dm_v);
log.debug("groupId {}, lm*t.id={}, cm*t.id={} created dm*v.id={}", log.debug("groupId/market {}/{}, lm*t.id={}, cm*t.id={} created dm*v.id={}",
groupId, lm_t.getId(), cm_t.getId(), dm_v.getId()); groupId, market, lm_t.getId(), cm_t.getId(), dm_v.getId());
Optional<AssetTrio> assetsFound = assets.searchMoneyByAccAndCompany(cm_t.getCompanyId(), cm_t.getAccountId()); Optional<AssetTrio> assetsFound = assets.searchMoneyByAccAndCompany(cm_t.getCompanyId(), cm_t.getAccountId());
assetsFound.ifPresent(assetTrio assetsFound.ifPresent(assetTrio
-> assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), BigDecimal.ZERO)); -> assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), BigDecimal.ZERO));

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.service.validation; 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.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; 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.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule; 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<ImdgValidationContext<RegistryChangeRefundDateRequest>> { public enum RefundDateValidationRule implements IValidationRule<ImdgValidationContext<RegistryChangeRefundDateRequest>> {
Fields() { Fields() {
@Override @Override
@ -39,6 +38,7 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
ImdgPredicate prdct = pb.and( ImdgPredicate prdct = pb.and(
pb.equals("groupId", validatedObject.getGroupId()), pb.equals("groupId", validatedObject.getGroupId()),
pb.equals("market", validatedObject.getMarket()),
pb.or( pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()), pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.MNG.getKey()), pb.equals("registryStatus", RegistryStatus.MNG.getKey()),
@ -55,8 +55,8 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
.filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate())) .filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (rgss.size() < 1) { if (rgss.isEmpty()) {
return of(ClearingError.RecordNotFound, "groupId=" + validatedObject.getGroupId()); return of(ClearingError.RecordNotFound, "groupId=%d; market=%s".formatted(validatedObject.getGroupId(), validatedObject.getMarket()));
} }
for (Registry rgs : rgss) { for (Registry rgs : rgss) {
if (!validatedObject.getRefundDate().isAfter(rgs.getValueDate())) { // если request.RefundDate <= ValueDate - то ошибка if (!validatedObject.getRefundDate().isAfter(rgs.getValueDate())) { // если request.RefundDate <= ValueDate - то ошибка

View file

@ -1,10 +1,14 @@
package ru.spcex.clearing.service.validation; 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.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest; 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.ClearingCategory;
import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams; 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.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule; 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 Проверить, в запросе у регистра код:
// 1.1.1 Если регистр TM-T: // 1.1.1 Если регистр TM-T:
@ -67,7 +65,11 @@ public enum ReturnDepositValidationRule implements IValidationRule<ImdgValidatio
if (ctgr.get().equals(ClearingCategory.V)) { if (ctgr.get().equals(ClearingCategory.V)) {
Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); Imdg<Registry> rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class);
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); 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( ImdgPredicate prdct = pb.and(
mrktCondition,
pb.equals("groupId", rgs.getGroupId()), pb.equals("groupId", rgs.getGroupId()),
pb.equals("contract", rgs.getContract()) pb.equals("contract", rgs.getContract())
); );

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.session.stage.impl; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -8,6 +11,8 @@ import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; 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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; 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.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; 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 @Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class EndStageNotification implements ISessionStage { public class EndStageNotification implements ISessionStage {
@ -83,25 +81,24 @@ public class EndStageNotification implements ISessionStage {
} }
Collection<Registry> forRegistries = selectRegistry(); Collection<Registry> forRegistries = selectRegistry();
Collection<Long> groups = forRegistries.stream() Collection<GroupRgsKey> groups = forRegistries.stream()
.map(Registry::getGroupId) .map(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket()))
.filter(Objects::nonNull)
.distinct().collect(Collectors.toList()); .distinct().collect(Collectors.toList());
log.debug("Sending notifications for {} groups ({} registers) on section {}", log.debug("Sending notifications for {} groups ({} registers) on section {}",
groups, forRegistries.size(), section); groups, forRegistries.size(), section);
for (Long groupId : groups) { for (GroupRgsKey groupKey : groups) {
log.trace("For registry group {} send notification", log.trace("For registry group/market {}/{} send notification",
groupId); groupKey.groupId(), groupKey.market());
StageResult sResult; StageResult sResult;
if (Section.FOND.equalsByKey(section)) { if (Section.FOND.equalsByKey(section)) {
sResult = notificationDF14(groupId); sResult = notificationDF14(groupKey.groupId());
} else if (Section.MKR.equalsByKey(section)) { } else if (Section.MKR.equalsByKey(section)) {
sResult = notificationDF05(groupId); sResult = notificationDF05(groupKey.groupId());
} else { } else {
throw new IllegalArgumentException("Unsupported section " + section); throw new IllegalArgumentException("Unsupported section " + section);
} }
if (sResult.getError() != null) { 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<Collection<Registry>> res = new StageResult<>(null, true); StageResult<Collection<Registry>> res = new StageResult<>(null, true);

View file

@ -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.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf05; import ru.clearing.classes.statics.data.sdf.SDf05;
import ru.spcex.clearing.component.GroupRgsKey;
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; 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); log.error("Session id={} not found. Can not update Execution's.", sessionId);
} else { } else {
Collection<Registry> oRegs = findORegistryBySessionId(allLiabilitiesAndOKClaims); Collection<Registry> oRegs = findORegistryBySessionId(allLiabilitiesAndOKClaims);
Map<Long, RegistryStatus> obligationStatusByGroupId; Map<GroupRgsKey, RegistryStatus> obligationStatusByGroupId;
obligationStatusByGroupId = oRegs.stream() 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) .filter(pair -> pair.getSecond() != null)
.collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (o1, o2) -> o1)); .collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (o1, o2) -> o1));
Function<Long, CoverageStatus> statusByExchangeId = id-> { Function<GroupRgsKey, CoverageStatus> statusByExchangeId = id-> {
RegistryStatus obligationStatus = obligationStatusByGroupId.get(id); RegistryStatus obligationStatus = obligationStatusByGroupId.get(id);
if (obligationStatus == null) return null; if (obligationStatus == null) return null;
return switch (obligationStatus) { return switch (obligationStatus) {
@ -164,7 +166,8 @@ public class FinishingSession implements ISessionStage {
Collection<ExecutionDeposit> executions = findExecutionDepositBySessionId(sessionId); Collection<ExecutionDeposit> executions = findExecutionDepositBySessionId(sessionId);
log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId); log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId);
for (ExecutionDeposit execution : executions) { for (ExecutionDeposit execution : executions) {
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId()); CoverageStatus toStatus = statusByExchangeId.apply(
new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket()));
if (toStatus == null) { if (toStatus == null) {
log.trace("CoverageStatus not defined for execution.id={}", execution.getId()); log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
continue; continue;
@ -194,7 +197,8 @@ public class FinishingSession implements ISessionStage {
Map<Long, ExecutionFond> execFond = new HashMap<>(); Map<Long, ExecutionFond> execFond = new HashMap<>();
log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId); log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId);
for (ExecutionCommon execution : executions) { for (ExecutionCommon execution : executions) {
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId()); CoverageStatus toStatus = statusByExchangeId.apply(
new GroupRgsKey(execution.getExchangeExecutionId(), execution.getMarket()));
if (toStatus == null) { if (toStatus == null) {
log.trace("CoverageStatus not defined for execution.id={}", execution.getId()); log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
continue; continue;

View file

@ -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.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -126,18 +127,18 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
.filter(rgs -> rgs.getSettlementDate().isAfter(rgs.getValueDate())) .filter(rgs -> rgs.getSettlementDate().isAfter(rgs.getValueDate()))
.toList(); .toList();
Map<Long, List<Registry>> registriesByGroup = obligations Map<GroupRgsKey, List<Registry>> registriesByGroup = obligations
.stream(). .stream().
collect(Collectors.groupingBy(Registry::getGroupId)); collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.info("registry groups found {}", registriesByGroup.size()); log.info("registry groups found {}", registriesByGroup.size());
ArrayList<PaymentInstruction> pmtCreated = new ArrayList<>(); ArrayList<PaymentInstruction> pmtCreated = new ArrayList<>();
for (Map.Entry<Long, List<Registry>> entry : registriesByGroup.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroup.entrySet()) {
List<Registry> groupRgs = entry.getValue(); List<Registry> groupRgs = entry.getValue();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.OM_T, rgs)).findFirst(); Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.OM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.TM_T, rgs)).findFirst(); Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(RegistryTradingParams.TM_T, rgs)).findFirst();
if (lmtO.isEmpty() || cmtO.isEmpty()) { 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; continue;
} }
Registry lm_t = lmtO.get(); //obligation by money Registry lm_t = lmtO.get(); //obligation by money

View file

@ -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.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -151,16 +152,16 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
List<PaymentInstruction> pmtCreated = new ArrayList<>(); List<PaymentInstruction> pmtCreated = new ArrayList<>();
Map<Long, List<Registry>> registriesByGroup = rgsAll Map<GroupRgsKey, List<Registry>> registriesByGroup = rgsAll
.stream(). .stream().
collect(Collectors.groupingBy(Registry::getGroupId)); collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
log.info("registry groups found {}", registriesByGroup.size()); log.info("registry groups found {}", registriesByGroup.size());
for (Map.Entry<Long, List<Registry>> entry : registriesByGroup.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroup.entrySet()) {
List<Registry> groupRgs = entry.getValue(); List<Registry> groupRgs = entry.getValue();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.OM_T, rgs)).findFirst(); Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.OM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.TM_T, rgs)).findFirst(); Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> equalByRgs(RegistryTradingParams.TM_T, rgs)).findFirst();
if (lmtO.isEmpty() || cmtO.isEmpty()) { 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; continue;
} }
Registry lm_t = lmtO.get(); //obligation by money Registry lm_t = lmtO.get(); //obligation by money

View file

@ -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.SDf03;
import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -159,14 +160,16 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
{ {
Collection<Registry> registries = selectSecurityRegistries(sessionId); Collection<Registry> registries = selectSecurityRegistries(sessionId);
log.debug("found registries.size() = {}", registries.size()); log.debug("found registries.size() = {}", registries.size());
//группируем регистры по groupId //группируем регистры по groupId и market
Map<Long, List<Registry>> groups = registries Map<GroupRgsKey, List<Registry>> groups = registries
.stream() .stream()
.collect(Collectors.groupingBy(Registry::getGroupId)); .collect(Collectors.groupingBy(r -> new GroupRgsKey(r.getGroupId(), r.getMarket())));
log.debug("groups.size = {}", groups.size()); log.debug("groups.size = {}", groups.size());
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(groups); Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(groups);
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> group : groups.entrySet()) {
Long groupId = group.getKey(); Long groupId = group.getKey().groupId();
String market = group.getKey().market();
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue() Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
.stream() .stream()
.filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs)) .filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs))
@ -176,12 +179,12 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
Registry cs_t = findByCode.apply(RegistryTradingParams.TS_T); Registry cs_t = findByCode.apply(RegistryTradingParams.TS_T);
Registry ls_t = findByCode.apply(RegistryTradingParams.OS_T); Registry ls_t = findByCode.apply(RegistryTradingParams.OS_T);
if (cs_t == null || ls_t == null) { 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; continue;
} }
PaymentGroup ls_t_group = lstGroups.get(ls_t.getId()); PaymentGroup ls_t_group = lstGroups.get(ls_t.getId());
if (ls_t_group == null) { 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; continue;
} }
@ -192,7 +195,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
AS_T AS_T
); );
payerAstO.ifPresent(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()))); as_t.setSettledDebit(safeBD(as_t.getSettledDebit()).add(safeBD(ls_t_group.getSum())));
setUpdatedStoreInImdg(as_t, now); setUpdatedStoreInImdg(as_t, now);
}); });
@ -203,7 +206,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
AS_T AS_T
); );
receiverAstO.ifPresent(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()))); as_t.setSettledCredit(safeBD(as_t.getSettledCredit()).add(safeBD(ls_t_group.getSum())));
setUpdatedStoreInImdg(as_t, now); setUpdatedStoreInImdg(as_t, now);
}); });
@ -236,7 +239,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
paymentInstructionImdg.insert(pmt); paymentInstructionImdg.insert(pmt);
paymentInstructionAll.add(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());
} }
} }
{ {

View file

@ -18,12 +18,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; 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.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionCurrency; import ru.clearing.classes.statics.data.execution.ExecutionCurrency;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.session.stage.ISessionStage; 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()); log.info("Inclusion to pool with predicate: {}", registryPredicate.toString());
Collection<Registry> obligations = registryImdg.getCollectionObjectsByPredicate(registryPredicate); Collection<Registry> obligations = registryImdg.getCollectionObjectsByPredicate(registryPredicate);
Map<Long, List<Registry>> registryByGroupId = obligations.stream() Map<GroupRgsKey, List<Registry>> registryByGroupId = obligations.stream()
.filter(registry -> registry.getSettlementDate().isEqual(LocalDate.now())) .filter(registry -> registry.getSettlementDate().isEqual(LocalDate.now()))
.collect(Collectors.groupingBy(Registry::getGroupId)); .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())));
Optional<SessionType> ssnType = obtainSessionType(sessionId); Optional<SessionType> ssnType = obtainSessionType(sessionId);
Map<Long, Registry> rgsToUpdate = new HashMap<>(); Map<Long, Registry> rgsToUpdate = new HashMap<>();
List<ExecutionCommon> execsToUpdate = new ArrayList<>(); List<ExecutionCommon> execsToUpdate = new ArrayList<>();
boolean loadExecs = !IEnumKey.contains(sessionType, boolean loadExecs = !IEnumKey.contains(sessionType,
SessionType.TRDT, SessionType.CURR, SessionType.UNIT, SessionType.IPOT); SessionType.TRDT, SessionType.CURR, SessionType.UNIT, SessionType.IPOT);
for (Map.Entry<Long, List<Registry>> entrySet : registryByGroupId.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> entrySet : registryByGroupId.entrySet()) {
log.debug("Processing set of registry with groupId: {}", entrySet.getKey()); log.debug("Processing set of registry with groupId/market: {}/{}", entrySet.getKey().groupId(), entrySet.getKey().market());
String rgsSection = null; String rgsSection = null;
for (Registry registry : entrySet.getValue()) { for (Registry registry : entrySet.getValue()) {
registry.setRegistryStatus(RegistryStatus.POOL.getKey()); registry.setRegistryStatus(RegistryStatus.POOL.getKey());
@ -164,7 +166,7 @@ public class InclusionObligations implements ISessionStage {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T extends ExecutionCommon> Collection<ExecutionCommon> updateExecutions(Long sessionId, Long rgsGroupId, String rgsSection) { private <T extends ExecutionCommon> Collection<ExecutionCommon> updateExecutions(Long sessionId, GroupRgsKey groupRgsKey, String rgsSection) {
Instant now = Instant.now(); Instant now = Instant.now();
SessionType ssnTpe = obtainSessionType(sessionId).orElse(null); SessionType ssnTpe = obtainSessionType(sessionId).orElse(null);
if (ssnTpe == null || sessionId == null) { if (ssnTpe == null || sessionId == null) {
@ -193,7 +195,10 @@ public class InclusionObligations implements ISessionStage {
return Collections.emptyList(); return Collections.emptyList();
} }
ImdgPredicateBuilder pb = execImdg.predicateBuilder(); 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<T> execs = execImdg.getCollectionObjectsByPredicate(prdct); Collection<T> execs = execImdg.getCollectionObjectsByPredicate(prdct);
//Imdg<T> finalExecImdg = execImdg; //Imdg<T> finalExecImdg = execImdg;
execs.forEach(e -> { execs.forEach(e -> {

View file

@ -17,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry; 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.ClearingError;
import ru.spcex.clearing.error.RgsError; import ru.spcex.clearing.error.RgsError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -348,8 +350,8 @@ public class InspectionObligations implements ISessionStage {
private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) { private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) {
if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) {
Optional<Pair<Long, LocalDate>> groupIdAndSettleDate = registries.stream() Optional<Pair<GroupRgsKey, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) .map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate()))
.filter(pair -> pair.getFirst() != null) .filter(pair -> pair.getFirst() != null)
.filter(pair -> pair.getSecond() != null) .filter(pair -> pair.getSecond() != null)
.findFirst(); .findFirst();
@ -359,7 +361,11 @@ public class InspectionObligations implements ISessionStage {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
return registryImdg.getCollectionObjectsByPredicate( return registryImdg.getCollectionObjectsByPredicate(
pb.and( pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), 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())) pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
) )
); );

View file

@ -15,6 +15,8 @@ import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.registry.Registry; 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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.service.integration.GatewayRequestCreator; import ru.spcex.clearing.service.integration.GatewayRequestCreator;
@ -53,6 +55,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
private final TradingTimeService tradingTimeService; private final TradingTimeService tradingTimeService;
private final GatewayRequester gateway; private final GatewayRequester gateway;
private final PlanBalanceCalc planBalanceCalc; private final PlanBalanceCalc planBalanceCalc;
private static final GroupRgsKeyComparator groupRgsKeyComparator = new GroupRgsKeyComparator();
@Autowired @Autowired
public InspectionObligationsDepositReturn(ImdgProvider imdgProvider, RegistryManager rgsMng, AssetTBFProcessing assets, TradingTimeService tradingTimeService, GatewayRequester gateway, PlanBalanceCalc planBalanceCalc) { 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(), RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(),
RegistryStatus.POOL.getKey()); RegistryStatus.POOL.getKey());
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition) List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition)
.stream() .stream()
.collect(Collectors.groupingBy(Registry::getGroupId)) .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())))
.entrySet() .entrySet()
.stream() .stream()
.sorted(Map.Entry.comparingByKey()) .sorted(groupRgsKeyComparator)
.toList(); .toList();
log.info("registry groups found {}", registriesByGroupSorted.size()); log.info("registry groups found {}", registriesByGroupSorted.size());
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) { for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroupSorted) {
List<Registry> group = entry.getValue(); List<Registry> group = entry.getValue();
Optional<Registry> omtInGroupO = group.stream().filter(registry -> equalByRgs(OM_T, registry)).findFirst(); Optional<Registry> omtInGroupO = group.stream().filter(registry -> equalByRgs(OM_T, registry)).findFirst();
Optional<Registry> tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst(); Optional<Registry> tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst();
if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) { 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 group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue; continue;
} }
Registry omtRgs = omtInGroupO.get(); Registry omtRgs = omtInGroupO.get();
Registry tmtRgs = tmtInGroupO.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()); BigDecimal omtBalance = safeBD(omtRgs.getBalance());
//первая часть сделки депозита //первая часть сделки депозита
@ -150,18 +153,20 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
Optional<Registry> amfAssetO = searchAssetByOMT(omtRgs); Optional<Registry> amfAssetO = searchAssetByOMT(omtRgs);
Optional<Registry> amfAssetReceiverO = searchAssetByOMT(tmtRgs); Optional<Registry> amfAssetReceiverO = searchAssetByOMT(tmtRgs);
if (amfAssetO.isEmpty()) { 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 group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue; continue;
} }
if (amfAssetReceiverO.isEmpty()) { 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 group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG
continue; continue;
} }
Registry amfAsset = amfAssetO.get(); 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()); BigDecimal amfBalance = safeBD(amfAsset.getBalance());
BiConsumer<Registry, BigDecimal> processAssetsAndSetSessionId = (amf, amount) -> { BiConsumer<Registry, BigDecimal> processAssetsAndSetSessionId = (amf, amount) -> {
Optional<AssetTrio> asts = assets.processByAm_f(amf, amount); Optional<AssetTrio> asts = assets.processByAm_f(amf, amount);

View file

@ -18,7 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry; 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.component.predicate.cash.registry.AssetByTcrCompanyAccountCashedPredicate;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.error.RgsError; import ru.spcex.clearing.error.RgsError;
@ -128,8 +130,8 @@ public class InspectionObligationsV2 implements ISessionStage {
Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition); Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition);
Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация? Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация?
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream() List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream()
.collect(Collectors.groupingBy(Registry::getGroupId)) .collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())))
.entrySet() .entrySet()
.stream() .stream()
.sorted((entry1, entry2) -> { .sorted((entry1, entry2) -> {
@ -150,15 +152,15 @@ public class InspectionObligationsV2 implements ISessionStage {
log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition); log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition);
ImdgPredicateBuilder rgsPb = registryImdg.predicateBuilder(); ImdgPredicateBuilder rgsPb = registryImdg.predicateBuilder();
GROUP: GROUP:
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) { for (Map.Entry<GroupRgsKey, List<Registry>> entry : registriesByGroupSorted) {
List<Registry> group = entry.getValue(); List<Registry> group = entry.getValue();
List<Registry> obligationsInGroup = group.stream().filter(registry -> List<Registry> obligationsInGroup = group.stream().filter(registry ->
IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O).toList(); 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() obligationsInGroup.stream()
.map(Registry::getId).collect(Collectors.toList()), .map(Registry::getId).collect(Collectors.toList()),
entry.getKey()); entry.getKey().groupId(), entry.getKey().market());
boolean isUncovered = false; boolean isUncovered = false;
List<CheckResult> checkResults = new ArrayList<>(); List<CheckResult> checkResults = new ArrayList<>();
for (Registry obligation : obligationsInGroup) { for (Registry obligation : obligationsInGroup) {
@ -191,7 +193,7 @@ public class InspectionObligationsV2 implements ISessionStage {
}); });
RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()); RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType());
if (mOrS == null) { 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()); rgs.getRegistryCode(), rgs.getId());
failGroup.run(); failGroup.run();
continue; continue;
@ -345,8 +347,9 @@ public class InspectionObligationsV2 implements ISessionStage {
private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) { private Collection<Registry> getRefundDateRgsIfPresent(List<Registry> registries) {
if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) {
Optional<Pair<Long, LocalDate>> groupIdAndSettleDate = registries.stream() //доп группировка по market не нужна, лист registries уже сгруппирован
.map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) Optional<Pair<GroupRgsKey, LocalDate>> groupIdAndSettleDate = registries.stream()
.map(rgs -> new Pair<>(new GroupRgsKey(rgs.getGroupId(),rgs.getMarket()), rgs.getSettlementDate()))
.filter(pair -> pair.getFirst() != null) .filter(pair -> pair.getFirst() != null)
.filter(pair -> pair.getSecond() != null) .filter(pair -> pair.getSecond() != null)
.findFirst(); .findFirst();
@ -354,9 +357,15 @@ public class InspectionObligationsV2 implements ISessionStage {
return Collections.emptyList(); return Collections.emptyList();
} }
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); 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( return registryImdg.getCollectionObjectsByPredicate(
pb.and( pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), pb.and(
pb.equals("groupId", groupIdAndSettleDate.get().getFirst().groupId()),
marketCondition
),
pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond()))
) )
); );

View file

@ -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.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.validation.admission.AccountActiveValidationRule; import ru.spcex.clearing.service.validation.admission.AccountActiveValidationRule;
import ru.spcex.clearing.service.validation.admission.ClearingAvailableValidationRule; import ru.spcex.clearing.service.validation.admission.ClearingAvailableValidationRule;
@ -76,10 +77,11 @@ public class ObligationAdmission implements ISessionStage {
private StageResult<?> obligationAdmission(Long sessionId) { private StageResult<?> obligationAdmission(Long sessionId) {
Collection<Registry> registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId); Collection<Registry> registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId);
Map<Long, List<Registry>> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId)); Map<GroupRgsKey, List<Registry>> 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); log.info("found {} ({} groups) registries with sessionId {}", registries.size(), byGroups.size(), sessionId);
Map<Long, Registry> rgsToUpdate = new HashMap<>(); Map<Long, Registry> rgsToUpdate = new HashMap<>();
for (Map.Entry<Long, List<Registry>> grpEntry : byGroups.entrySet()) { for (Map.Entry<GroupRgsKey, List<Registry>> grpEntry : byGroups.entrySet()) {
EnumMessage groupError = null; EnumMessage groupError = null;
List<Registry> rgsGroup = grpEntry.getValue(); List<Registry> rgsGroup = grpEntry.getValue();
for (Registry rgs : rgsGroup) { for (Registry rgs : rgsGroup) {
@ -91,7 +93,8 @@ public class ObligationAdmission implements ISessionStage {
} }
} }
if (groupError != null) { 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) { for (Registry rgs : rgsGroup) {
rgs.setRegistryStatus(RegistryStatus.NACK.getKey()); rgs.setRegistryStatus(RegistryStatus.NACK.getKey());
rgsToUpdate.put(rgs.getId(), rgs); rgsToUpdate.put(rgs.getId(), rgs);

View file

@ -210,6 +210,7 @@ public class RegistryCkBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId()); reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType()); reg.setSessionType(sessionType());
reg.setSection(Section.CURR.getKey()); reg.setSection(Section.CURR.getKey());
reg.setMarket(exec.getMarket());
return reg; return reg;
} }

View file

@ -213,6 +213,7 @@ public class RegistryCurrBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId()); reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType()); reg.setSessionType(sessionType());
reg.setSection(Section.CURR.getKey()); reg.setSection(Section.CURR.getKey());
reg.setMarket(exec.getMarket());
return reg; return reg;
} }

View file

@ -158,6 +158,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId()); reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType()); reg.setSessionType(sessionType());
reg.setSection(Section.MKR.getKey()); reg.setSection(Section.MKR.getKey());
reg.setMarket(exec.getMarket());
return reg; return reg;
} }

View file

@ -239,6 +239,7 @@ public class RegistryFondBuilder implements IRegistryBuilder {
reg.setSessionId(exec.getSessionId()); reg.setSessionId(exec.getSessionId());
reg.setSessionType(sessionType()); reg.setSessionType(sessionType());
reg.setSection(Section.FOND.getKey()); reg.setSection(Section.FOND.getKey());
reg.setMarket(exec.getMarket());
return reg; return reg;
} }

View file

@ -363,7 +363,8 @@ public class RequirementsAndObligationCreation implements ISessionStage {
exec.getCompanyId(), exec.getCompanyId(),
settlementDt(exec), settlementDt(exec),
exec.getSessionId(), exec.getSessionId(),
exec.getExchangeExecutionId() exec.getExchangeExecutionId(),
exec.getMarket()
); );
} }
@ -396,11 +397,12 @@ public class RequirementsAndObligationCreation implements ISessionStage {
exec.getCompanyId(), exec.getCompanyId(),
((ExecutionDeposit) exec).getSecondLegSettlementDate(), ((ExecutionDeposit) exec).getSecondLegSettlementDate(),
exec.getSessionId(), exec.getSessionId(),
exec.getExchangeExecutionId()); exec.getExchangeExecutionId(),
exec.getMarket());
} }
public Optional<Registry> imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt, public Optional<Registry> 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(); String sql = RegistryCodeSqlBuilder.getInstance(p).build();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
@ -408,7 +410,8 @@ public class RequirementsAndObligationCreation implements ISessionStage {
pb.equals("companyId", companyId), pb.equals("companyId", companyId),
pb.equals("settlementDate", settlementDt), pb.equals("settlementDate", settlementDt),
pb.equals("sessionId", sessionId), 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); Registry rgs = registryImdg.getSingleObjectByPredicate(rgstrPredicate);
log.trace("rgs.id={} found by: {}", rgs == null ? "'not found'" : rgs.getId(), rgstrPredicate.toString()); log.trace("rgs.id={} found by: {}", rgs == null ? "'not found'" : rgs.getId(), rgstrPredicate.toString());

View file

@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.component.GroupRgsKey;
import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryTradingParams;
import static ru.spcex.platform.enumeration.RegistryTradingParams.OS_T; import static ru.spcex.platform.enumeration.RegistryTradingParams.OS_T;
@ -21,17 +22,18 @@ import ru.spcex.platform.utils.text.TextUtil;
public class RegistryLiabilitiesGroup { public class RegistryLiabilitiesGroup {
private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class); private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class);
public static Map<Long, PaymentGroup> group(Map<Long, List<Registry>> registriesCollection) { public static Map<Long, PaymentGroup> group(Map<GroupRgsKey, List<Registry>> registriesCollection) {
Map<Long, PaymentGroup> result = new HashMap<>(); Map<Long, PaymentGroup> result = new HashMap<>();
List<Pair<Registry, Registry>> lstCstGroup = registriesCollection.entrySet() List<Pair<Registry, Registry>> lstCstGroup = registriesCollection.entrySet()
.stream() .stream()
.map(entry -> { .map(entry -> {
Long groupId = entry.getKey(); Long groupId = entry.getKey().groupId();
String market = entry.getKey().market();
List<Registry> value = entry.getValue(); List<Registry> value = entry.getValue();
Registry ls_t = obtain(value, OS_T); Registry ls_t = obtain(value, OS_T);
Registry cs_t = obtain(value, TS_T); Registry cs_t = obtain(value, TS_T);
if (ls_t == null || cs_t == null) { 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(Registry::getId)
.map(Object::toString) .map(Object::toString)
.collect(TextUtil.join)); .collect(TextUtil.join));

View file

@ -57,17 +57,4 @@ public class RegistryUtil {
newRgsCde.setCharAt(2, '-'); newRgsCde.setCharAt(2, '-');
return newRgsCde.toString(); return newRgsCde.toString();
} }
public static Map<Long, List<Registry>> groupByGroupId(Collection<Registry> registries) {
HashMap<Long, List<Registry>> groups = new HashMap<>();
for (Registry reg : registries) {
List<Registry> lst = groups.get(reg.getGroupId());
if (lst == null) {
lst = new ArrayList<>();
groups.put(reg.getGroupId(), lst);
}
lst.add(reg);
}
return groups;
}
} }

View file

@ -8,12 +8,12 @@
<name>clearing-validation</name> <name>clearing-validation</name>
<description>Clearing-module, dependency version of platform-utils</description> <description>Clearing-module, dependency version of platform-utils</description>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>
@ -35,13 +35,13 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId> <artifactId>dictionary</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -7,12 +7,12 @@
<artifactId>db-scripts</artifactId> <artifactId>db-scripts</artifactId>
<name>db-scripts</name> <name>db-scripts</name>
<description>db-scripts for PostgreSQL</description> <description>db-scripts for PostgreSQL</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<build> <build>

View file

@ -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 (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 (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 (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 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, 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, 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, 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, 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 (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;

View file

@ -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;

View file

@ -2082,7 +2082,7 @@ GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY TO clearing
-- registry - Регистр активов, обязательств и требований УК -- registry - Регистр активов, обязательств и требований УК
DROP TABLE IF EXISTS 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 TABLE REGISTRY IS 'Регистр активов, обязательств и требований УК';
COMMENT ON COLUMN REGISTRY.COMPANY_ID IS 'Идентификатор участника (linked to company)'; 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.SECTION IS 'Код секции (linked to section)';
COMMENT ON COLUMN REGISTRY.MARKET IS 'Код класса инструмента';
GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing; GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing;
-- History log of registry - Регистр активов, обязательств и требований УК -- History log of registry - Регистр активов, обязательств и требований УК
DROP TABLE IF EXISTS REGISTRY_HISTORY; 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 TABLE REGISTRY_HISTORY IS 'История изменений таблицы registry';
COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY'; COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY';
COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; 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.SECURITY_ID IS 'Идентификатор инструмента (linked to security)';
COMMENT ON COLUMN REGISTRY_HISTORY.SECTION IS 'Код секции (linked to section)'; 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; GRANT ALL PRIVILEGES ON TABLE REGISTRY_HISTORY TO clearing;

View file

@ -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 (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 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; 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 (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 (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; INSERT INTO NOTIFICATION_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'CNCL', 'Отменено') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;

View file

@ -6,186 +6,101 @@
/* Business objects */ /* 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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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(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 (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);
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;

View file

@ -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;

View file

@ -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

View file

@ -7,12 +7,12 @@
<artifactId>dbf-exporter</artifactId> <artifactId>dbf-exporter</artifactId>
<name>dbf-exporter</name> <name>dbf-exporter</name>
<description>DBF exporter for DBF files</description> <description>DBF exporter for DBF files</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<dependencies> <dependencies>

View file

@ -8,12 +8,12 @@
<artifactId>dbf-importer</artifactId> <artifactId>dbf-importer</artifactId>
<name>dbf-importer</name> <name>dbf-importer</name>
<description>DBF loader for DBF files</description> <description>DBF loader for DBF files</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<dependencies> <dependencies>

View file

@ -8,12 +8,12 @@
<name>Clearing dictionary</name> <name>Clearing dictionary</name>
<description>Clearing dictionary</description> <description>Clearing dictionary</description>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>

View file

@ -4,12 +4,12 @@
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<artifactId>extdb-importer</artifactId> <artifactId>extdb-importer</artifactId>
<name>extdb-importer</name> <name>extdb-importer</name>
<description>Extdb importer module. Аналог trade-importer.</description> <description>Extdb importer module. Аналог trade-importer.</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -86,7 +86,7 @@ public class DigitalCertificate extends WithMapId {
) )
private BigDecimal numberOfUcp; private BigDecimal numberOfUcp;
@JsonProperty("deltaPrice") @JsonProperty("delta_price")
@ApiModelProperty( @ApiModelProperty(
value = "Общая информация\\Пределы изменения цены", value = "Общая информация\\Пределы изменения цены",
example = """ example = """

View file

@ -1,11 +1,13 @@
package ru.spcex.clearing.gatewayapi.service; package ru.spcex.clearing.gatewayapi.service;
import java.util.List; import java.util.List;
import java.util.Optional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; 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.DigitalCertificate;
import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondDigitalListingsRequest; 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.DigitalSecurityRequestAdapter;
import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter; import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
@ -46,8 +48,15 @@ public class DigitalSecurityService {
for (DigitalCertificate security : securityList) { for (DigitalCertificate security : securityList) {
try { try {
DigitalCertificateSecurityGatewayRequest digitalCertificateSecurityRequest = digitalSecurityRequestAdapter.toRequest(security); DigitalCertificateSecurityGatewayRequest digitalCertificateSecurityRequest = digitalSecurityRequestAdapter.toRequest(security);
List<ListingNewRequest> listingRequests = request.getListingList().stream(). List<ListingNewRequest> listingRequests = request.getListingList().stream()
map(securityRequestAdapter::toIncomeListing).toList(); .filter(incomeListing -> incomeListing.getSymbolCode().equals(security.getSecuritySymbol()))
.map(securityRequestAdapter::toIncomeListing).toList();
Optional<String> 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); digitalCertificateSecurityRequest.setListing(listingRequests);
kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_DGCT_GATEWAY, digitalCertificateSecurityRequest); kafkaSender.sendRequestToQueue(Consts.DESTINATION_SECURITY_DGCT_GATEWAY, digitalCertificateSecurityRequest);
} catch (Throwable e) { } catch (Throwable e) {

View file

@ -17,6 +17,7 @@ public class DigitalSecurityRequestAdapter {
gatewayRequest.setIssuerId(digitalCertificate.getIssuerId()); gatewayRequest.setIssuerId(digitalCertificate.getIssuerId());
gatewayRequest.setShortName(digitalCertificate.getShortName()); gatewayRequest.setShortName(digitalCertificate.getShortName());
gatewayRequest.setFullName(digitalCertificate.getFullName()); gatewayRequest.setFullName(digitalCertificate.getFullName());
gatewayRequest.setFullNameEng(digitalCertificate.getFullNameEng());
gatewayRequest.setShortNameEng(digitalCertificate.getShortNameEng()); gatewayRequest.setShortNameEng(digitalCertificate.getShortNameEng());
gatewayRequest.setNumberOfUcp(digitalCertificate.getNumberOfUcp()); gatewayRequest.setNumberOfUcp(digitalCertificate.getNumberOfUcp());
gatewayRequest.setDeltaPrice(digitalCertificate.getDeltaPrice()); gatewayRequest.setDeltaPrice(digitalCertificate.getDeltaPrice());
@ -26,6 +27,9 @@ public class DigitalSecurityRequestAdapter {
gatewayRequest.setSettlementOrganization(digitalCertificate.getSettlementOrganization()); gatewayRequest.setSettlementOrganization(digitalCertificate.getSettlementOrganization());
gatewayRequest.setSettlementDepository(digitalCertificate.getSettlementDepository()); gatewayRequest.setSettlementDepository(digitalCertificate.getSettlementDepository());
if (digitalCertificate.getTypeCode().equals("U")) {
gatewayRequest.setNominalDenominationUnitForDate(digitalCertificate.getUcp().getDenominationUnitBase());
} else {
Optional<DigitalNominal> digitalNominal = digitalCertificate.getNominal().stream() Optional<DigitalNominal> digitalNominal = digitalCertificate.getNominal().stream()
.filter( .filter(
nominal -> nominal.getIndexDate().isEqual(LocalDate.now())) nominal -> nominal.getIndexDate().isEqual(LocalDate.now()))
@ -35,6 +39,7 @@ public class DigitalSecurityRequestAdapter {
gatewayRequest.setNominalDenominationUnitForDate(nominal.getDenominationUnitForDate()); gatewayRequest.setNominalDenominationUnitForDate(nominal.getDenominationUnitForDate());
gatewayRequest.setNominalIndexFact(nominal.getIndexFact()); gatewayRequest.setNominalIndexFact(nominal.getIndexFact());
}); });
}
return gatewayRequest; return gatewayRequest;
} }
} }

View file

@ -5,12 +5,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>imdg-hist</artifactId> <artifactId>imdg-hist</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
@ -36,13 +36,13 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId> <artifactId>dictionary</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
@ -82,7 +82,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId> <artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -7,12 +7,12 @@
<artifactId>imdg</artifactId> <artifactId>imdg</artifactId>
<name>Clearing in memory data grid</name> <name>Clearing in memory data grid</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>
@ -32,13 +32,13 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId> <artifactId>dictionary</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
@ -89,7 +89,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId> <artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -61,7 +61,7 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
"CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_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", "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", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "REASON", "PARENT_ID", "GROUP_ID", "SESSION_ID",
"SESSION_TYPE", "PAYMENT_ID", "SECTION" "SESSION_TYPE", "PAYMENT_ID", "SECTION", "MARKET"
}; };
} }
@ -181,6 +181,7 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class)); object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class)); object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
object.setSection(resultSet.getObject("SECTION", String.class)); object.setSection(resultSet.getObject("SECTION", String.class));
object.setMarket(resultSet.getObject("MARKET", String.class));
registryHistory.setObject(object); registryHistory.setObject(object);
return registryHistory; return registryHistory;
@ -244,7 +245,8 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
object.getSessionId(), object.getSessionId(),
object.getSessionType(), object.getSessionType(),
object.getPaymentId(), object.getPaymentId(),
object.getSection() object.getSection(),
object.getMarket()
}; };
return args; return args;
} }

View file

@ -68,7 +68,14 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
@Override @Override
public String[] getFields() { public String[] getFields() {
return new String[]{ 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<Registry> {
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
object.setSection(resultSet.getObject("SECTION", String.class)); object.setSection(resultSet.getObject("SECTION", String.class));
object.setMarket(resultSet.getObject("MARKET", String.class));
return object; return object;
} }
@ -180,7 +188,8 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
TimeUtil.toDateFromInstant(object.getCreated()), TimeUtil.toDateFromInstant(object.getCreated()),
TimeUtil.toDateFromInstant(object.getUpdated()), TimeUtil.toDateFromInstant(object.getUpdated()),
object.getSecurityId(), object.getSecurityId(),
object.getSection() object.getSection(),
object.getMarket()
}; };
return args; return args;
} }

View file

@ -14,7 +14,7 @@ public class HazelcastLifecycleSupport extends AbstractHazelcastLifecycleSupport
/** /**
* Рабочая версия БД. Требуется вручную сверять с DDL.sql и накручивать эту переменную. * Рабочая версия БД. Требуется вручную сверять с 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()); private final Logger log = LoggerFactory.getLogger(this.getClass());

View file

@ -3,13 +3,13 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>lim-exporter</artifactId> <artifactId>lim-exporter</artifactId>
<name>Lim exporter</name> <name>Lim exporter</name>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>
@ -35,7 +35,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -7,12 +7,12 @@
<name>_parent_clearing</name> <name>_parent_clearing</name>
<description>Clearing parent module</description> <description>Clearing parent module</description>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing</artifactId> <artifactId>clearing</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modules> <modules>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -8,12 +8,12 @@
<artifactId>reports-service</artifactId> <artifactId>reports-service</artifactId>
<name>reports-service</name> <name>reports-service</name>
<description>Service for creating reports</description> <description>Service for creating reports</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<dependencies> <dependencies>
<!-- Spring boot --> <!-- Spring boot -->

View file

@ -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.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.text.TextUtil;
@Component @Component
public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> { public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> {
@ -168,6 +169,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
Collection<ExecutionDeposit> executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate( Collection<ExecutionDeposit> executionDeposits = executionDepositImdg.getCollectionObjectsByPredicate(
pb.and( pb.and(
pb.equals("exchangeExecutionId", registry.getGroupId()), pb.equals("exchangeExecutionId", registry.getGroupId()),
TextUtil.isEmpty(registry.getMarket()) ?
pb.alwaysTrue() : pb.equals("market", registry.getMarket()),
pb.notNull("market") pb.notNull("market")
) )
); );

View file

@ -144,13 +144,14 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
// Есть 2 пары Execution, SELL и BUY, статус определяем заранее по SELL и проставляем в BUY // Есть 2 пары Execution, SELL и BUY, статус определяем заранее по SELL и проставляем в BUY
if (coverage == CoverageStatus.DEND) { if (coverage == CoverageStatus.DEND) {
if (execution instanceof ExecutionFond) { if (execution instanceof ExecutionFond) {
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).buildPredicate(pbRegistry); ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).buildPredicate(pb);
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate( Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate(
pbRegistry.and( pb.and(
pbRegistry.equals("groupId", groupId), pb.equals("groupId", groupId),
pbRegistry.equals("companyId", execution.getCompanyId()), pb.or(pb.equals("market", execution.getMarket()), pb.isNull("market")),
pbRegistry.in("registryStatus", pb.equals("companyId", execution.getCompanyId()),
pb.in("registryStatus",
RegistryStatus.NACC.getKey(), RegistryStatus.NACC.getKey(),
RegistryStatus.NACK.getKey(), RegistryStatus.NACK.getKey(),
RegistryStatus.FAIL.getKey(), RegistryStatus.FAIL.getKey(),
@ -170,7 +171,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
} }
} }
} }
statusForExecution.put(new ExecutionKey(groupId, execution.getSessionId()), status); statusForExecution.put(new ExecutionKey(groupId, execution.getMarket(), execution.getSessionId()), status);
} }
} }
} }
@ -365,7 +366,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
status = "2"; status = "2";
} else if (execution instanceof ExecutionFond) { } else if (execution instanceof ExecutionFond) {
Long groupId = execution.getExchangeExecutionId(); Long groupId = execution.getExchangeExecutionId();
status = statusForExecution.get(new ExecutionKey(groupId, execution.getSessionId())); status = statusForExecution.get(new ExecutionKey(groupId, execution.getMarket(), execution.getSessionId()));
if (status == null) { if (status == null) {
log.warn( log.warn(
"Broken execution (can't define status). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped", "Broken execution (can't define status). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped",
@ -390,6 +391,6 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
} }
} }
private record ExecutionKey(Long groupId, Long sessionId) { private record ExecutionKey(Long groupId, String market, Long sessionId) {
} }
} }

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -51,7 +51,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>cleaning-builders</artifactId> <artifactId>cleaning-builders</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -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<LauncherCommandRequest, IValidator> launcherRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return launcherCommandRequest -> {
ImdgValidationContext<LauncherCommandRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(launcherCommandRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
ValidateSymbolsRule.notRequired("Основание",
LauncherCommandRequest::getPaymentPurpose,
ValidationError.IncorrectPaymentPurpose)
);
};
}
}

View file

@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import ru.clearing.classes.statics.data.company.Company; 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.ClearingCalendar;
import ru.clearing.classes.statics.data.scheduler.Planner; import ru.clearing.classes.statics.data.scheduler.Planner;
import ru.clearing.classes.statics.data.scheduler.PlannerTemplate; 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_Security, Security.class);
addImdg.accept(IMDGDistributedNames.Map_DayStatusDictionary, DayStatusDictionary.class); addImdg.accept(IMDGDistributedNames.Map_DayStatusDictionary, DayStatusDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class); addImdg.accept(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class);
return imdg; return imdg;
} }

View file

@ -13,7 +13,8 @@ public enum ValidationError implements IErrorEnumId {
CompanyNotFound(7014L), CompanyNotFound(7014L),
SecurityNotFound(7012L), SecurityNotFound(7012L),
CompanyNotActive(7015L), CompanyNotActive(7015L),
SecurityNotActive(7013L); SecurityNotActive(7013L),
IncorrectPaymentPurpose(7018L);
private final Long id; private final Long id;

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.scheduler.service; 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.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; 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.enumeration.Task;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.time.Instant;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; 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 @Service
public class LauncherService extends QueueConsumer implements InitializingBean { public class LauncherService extends QueueConsumer implements InitializingBean {
@ -38,16 +41,23 @@ public class LauncherService extends QueueConsumer implements InitializingBean {
private final Imdg<Launcher> launcherMap; private final Imdg<Launcher> launcherMap;
private final Producer<String, Object> kafkaProducer; private final Producer<String, Object> kafkaProducer;
private final UserRoleVerification userRoleVerification; private final UserRoleVerification userRoleVerification;
private final Function<LauncherCommandRequest, IValidator> launcherRequestValidator;
private final IMessageResolver messageResolver;
@Autowired @Autowired
public LauncherService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer, public LauncherService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
@Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification, @Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification,
ImdgProvider imdgProvider) { ImdgProvider imdgProvider,
@Qualifier("launcherRequestValidator")
Function<LauncherCommandRequest, IValidator> launcherRequestValidator,
IMessageResolver messageResolver) {
super(kafkaQueue, kafkaProducer); super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer; this.kafkaProducer = kafkaProducer;
this.userRoleVerification = userRoleVerification; this.userRoleVerification = userRoleVerification;
this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class); this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class);
this.launcherRequestValidator = launcherRequestValidator;
this.messageResolver = messageResolver;
} }
@Override @Override
@ -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())); 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(); Task task = getEnumByKey(Task.class, req.getTaskName());
Launcher launcher = new Launcher(); if (task == null) {
if (getEnumByKey(Task.class, req.getTaskName()) == null) {
throw new IllegalStateException("Illegal task name:\t" + req.getTaskName()); throw new IllegalStateException("Illegal task name:\t" + req.getTaskName());
} }
if (Task.dbfExport_OUTV == task) {
IValidator validator = launcherRequestValidator.apply(req);
Optional<EnumMessage> 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.setTask(req.getTaskName());
launcher.setSenderId(req.getUserId()); launcher.setSenderId(req.getUserId());
launcher.setCreated(created); launcher.setCreated(created);
launcher.setUpdated(created); launcher.setUpdated(created);
launcherMap.insert(launcher); launcherMap.insert(launcher);
log.debug("successfully processed, new id {}", launcher.getId()); log.debug("successfully processed, new id {}", launcher.getId());
if (Task.dbfExport_OUTV.equalsByKey(req.getTaskName())) { if (Task.dbfExport_OUTV == task) {
return processRequestOUTV(userRequest, req); return processRequestOUTV(userRequest, req);
} else { } else {
kafkaProducer.send(new ProducerRecord<>("launcher-" + launcher.getTask(), userRequest)); kafkaProducer.send(new ProducerRecord<>("launcher-" + launcher.getTask(), userRequest));
@ -134,4 +153,13 @@ public class LauncherService extends QueueConsumer implements InitializingBean {
return successRouting; return successRouting;
} }
private RequestInfoUpdate makeErrorResponse(BaseRequest<LauncherCommandRequest> launcherCommandRequest,
String errorMessage) {
RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate();
requestInfoUpdate.setId(launcherCommandRequest.getId());
requestInfoUpdate.setStatus(Status.Error);
requestInfoUpdate.setMessage(errorMessage);
return requestInfoUpdate;
}
} }

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -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<InstrumentType> clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType());
Optional<NominalTypeCode> clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode());
Optional<Allowed> 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<InstrumentType> clrInstrumentType = resolveInstrumentType(gatewayRequest.getInstrumentType());
Optional<NominalTypeCode> clrNominalTypeCode = resolveTypeCode(gatewayRequest.getTypeCode());
Optional<Allowed> 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<InstrumentType> 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<NominalTypeCode> 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<Allowed> 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);
}
}

View file

@ -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.domain.cud.security.CurrencyPairSecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; 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.DigitalCertificateSecurityFacade;
import ru.spcex.clearing.securities.service.facade.ListingFacade; import ru.spcex.clearing.securities.service.facade.ListingFacade;
import ru.spcex.clearing.securities.validation.ListingValidationProvider; import ru.spcex.clearing.securities.validation.ListingValidationProvider;
@ -478,36 +479,34 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
private RequestInfoUpdate newDigitalSecurities(BaseRequest<DigitalCertificateSecurityGatewayRequest> baseRequest) { private RequestInfoUpdate newDigitalSecurities(BaseRequest<DigitalCertificateSecurityGatewayRequest> baseRequest) {
DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload(); DigitalCertificateSecurityGatewayRequest request = baseRequest.getRequestPayload();
DigitalCertificateSecurityNewRequest newRequest = new DigitalCertificateSecurityNewRequest();
newRequest.setBaseCode(request.getDepoDcId());
newRequest.setInstrumentType(request.getInstrumentType());
Map<String, Comparable<?>> query = new HashMap<>(); Map<String, Comparable<?>> query = new HashMap<>();
query.put("companySymbol", CompanySymbol.UUID.getKey()); query.put("companySymbol", CompanySymbol.INN.getKey());
query.put("companySymbolValue", request.getIssuerId()); query.put("companySymbolValue", request.getInn());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(query); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(query);
Long companyId = companySymbols.getCompanyId(); Long companyId = null;
newRequest.setIssuerId(companyId); if (companySymbols != null) {
companyId = companySymbols.getCompanyId();
newRequest.setShortName(request.getShortName()); } else {
newRequest.setFullName(request.getFullName()); log.warn("Not found company symbols..");
newRequest.setShortNameEng(request.getShortNameEng()); }
newRequest.setFullNameEng(request.getFullNameEng()); DigitalCertificateRequestBuilder builder = DigitalCertificateRequestBuilder.builder()
newRequest.setBaseUnitSize(request.getNumberOfUcp().longValue()); .gatewayRequest(request)
newRequest.setPriceVarianceLimit(request.getDeltaPrice()); .companyId(companyId);
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);
Security security = securitySelector.selectSecurityBySymbol(request.getSecuritySymbol()); 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(); Long securityId = security.getId();
for (ListingNewRequest listingReq : request.getListing()) { for (ListingNewRequest listingReq : request.getListing()) {
try { try {
@ -515,11 +514,11 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin
Listing existListing = findListing(listingReq); Listing existListing = findListing(listingReq);
if (existListing == null) { if (existListing == null) {
validationHelper.validateTillFirstErrorAndThrow(listingReq, listingValidation.listingNewValidator()); 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); Listing listing = listingFacade.newListing(listingReq);
log.debug("New listing.id={}", listing.getId()); log.debug("New listing.id={}", listing.getId());
} else { } 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); ListingUpdateRequest partUpdateRequest = toUpdateRequest(existListing, listingReq);
validationHelper.validateTillFirstErrorAndThrow(partUpdateRequest, listingValidation.listingUpdateValidator()); validationHelper.validateTillFirstErrorAndThrow(partUpdateRequest, listingValidation.listingUpdateValidator());
Listing listing = listingFacade.updateListing(partUpdateRequest); Listing listing = listingFacade.updateListing(partUpdateRequest);

View file

@ -8,12 +8,12 @@
<name>security-util clearing</name> <name>security-util clearing</name>
<description>Clearing misc util for verify user roles</description> <description>Clearing misc util for verify user roles</description>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>
@ -35,13 +35,13 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId> <artifactId>dictionary</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -3,13 +3,13 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>swt-exporter</artifactId> <artifactId>swt-exporter</artifactId>
<name>Swt exporter</name> <name>Swt exporter</name>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<properties> <properties>
@ -35,7 +35,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -4,11 +4,11 @@
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<artifactId>test-clearing</artifactId> <artifactId>test-clearing</artifactId>
<name>Test-clearing</name> <name>Test-clearing</name>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>ru.spcex.platform</groupId> <groupId>ru.spcex.platform</groupId>

View file

@ -4,12 +4,12 @@
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<artifactId>trade-importer</artifactId> <artifactId>trade-importer</artifactId>
<name>trade-importer</name> <name>trade-importer</name>
<description>Trade importer module</description> <description>Trade importer module</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
@ -55,7 +55,7 @@
<dependency> <dependency>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId> <artifactId>classes</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.utility.service; package ru.spcex.clearing.utility.service;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger; 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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; 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.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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; 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.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.ValidationSymbolsNewRequest; 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.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.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper; 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.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; 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 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 @Service
public class ValidationSymbolsService extends QueueConsumer implements InitializingBean { public class ValidationSymbolsService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
@ -116,7 +94,7 @@ public class ValidationSymbolsService extends QueueConsumer implements Initializ
ValidationSymbols vs = new ValidationSymbols(); ValidationSymbols vs = new ValidationSymbols();
vs.setId(validationSymbolsImdg.nextIDSequenceFor()); vs.setId(validationSymbolsImdg.nextIDSequenceFor());
vs.setCode(req.getCode()); vs.setCode(req.getCode().toUpperCase());
vs.setSymbols(req.getSymbols()); vs.setSymbols(req.getSymbols());
vs.setComment(req.getComment()); vs.setComment(req.getComment());
validationSymbolsImdg.insert(vs); validationSymbolsImdg.insert(vs);
@ -136,7 +114,7 @@ public class ValidationSymbolsService extends QueueConsumer implements Initializ
ValidationSymbolsUpdateRequest req = userRequest.getRequestPayload(); ValidationSymbolsUpdateRequest req = userRequest.getRequestPayload();
ValidationSymbols vs = validationSymbolsImdg.getSingleObjectByID(req.getId()); ValidationSymbols vs = validationSymbolsImdg.getSingleObjectByID(req.getId());
vs.setCode(req.getCode()); vs.setCode(req.getCode().toUpperCase());
vs.setSymbols(req.getSymbols()); vs.setSymbols(req.getSymbols());
vs.setComment(req.getComment()); vs.setComment(req.getComment());
validationSymbolsImdg.update(vs); validationSymbolsImdg.update(vs);

View file

@ -7,12 +7,12 @@
<artifactId>xml-exporter</artifactId> <artifactId>xml-exporter</artifactId>
<name>xml-exporter</name> <name>xml-exporter</name>
<description>XML exporter for XML files</description> <description>XML exporter for XML files</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<dependencies> <dependencies>

View file

@ -8,12 +8,12 @@
<artifactId>xml-importer</artifactId> <artifactId>xml-importer</artifactId>
<name>xml-importer</name> <name>xml-importer</name>
<description>XML loader for XML files</description> <description>XML loader for XML files</description>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
<parent> <parent>
<artifactId>clearing-parent</artifactId> <artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<dependencies> <dependencies>

View file

@ -131,8 +131,8 @@ fi
if [ "$TESTER_EXIT_CODE" -eq "0" ] if [ "$TESTER_EXIT_CODE" -eq "0" ]
then then
echo "Test case ${CLR_TEST_NAME} passed successfully" echo "Test case ${CLR_TEST_NAME} passed successfully"
exit 0
else else
echo "Test case ${CLR_TEST_NAME} failed" echo "Test case ${CLR_TEST_NAME} failed"
exit 1
fi fi
exit 0

View file

@ -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" ]

View file

@ -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

View file

@ -13,6 +13,14 @@ services:
timeout: 5s timeout: 5s
retries: 100 retries: 100
db-updater:
build: db-updater
environment:
- PGPASSWORD=Aa111111
depends_on:
db:
condition: service_healthy
clearing_system: clearing_system:
build: build:
context: ./clearing-all context: ./clearing-all
@ -21,36 +29,33 @@ services:
environment: environment:
- CLR_TEST_NAME=${CLR_TEST_NAME} - CLR_TEST_NAME=${CLR_TEST_NAME}
depends_on: depends_on:
db: db-updater:
condition: service_healthy
kafka:
condition: service_started condition: service_started
kafka:
condition: service_healthy
volumes: volumes:
- logs_volume:/opt/clearing/bin/log_artifacts - 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: kafka:
image: mirror.gcr.io/confluentinc/cp-kafka:6.2.3.amd64 build: kafka
container_name: kafka container_name: kafka
environment: environment:
KAFKA_BROKER_ID: 1 KAFKA_BROKER_ID: 1
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_CFG_NODE_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT KAFKA_ENABLE_KRAFT: yes
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_CFG_PROCESS_ROLES: broker,controller
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
depends_on: KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
- zookeeper 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: sftp:
build: sftp build: sftp

View file

@ -0,0 +1,3 @@
FROM mirror.gcr.io/bitnami/kafka:4.0.0
ADD log4j2.yaml /opt/bitnami/kafka/config/

135
clr_test/kafka/log4j2.yaml Normal file
View file

@ -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

View file

@ -1,3 +1,4 @@
from glob import glob
import logging import logging
import os import os
import re 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'] DATA_ROOT_DIR = os.environ['CLEARING_TEST_DIR']
CLR_TEST_DIR = os.environ['CLR_TEST_DIR'] CLR_TEST_DIR = os.environ['CLR_TEST_DIR']
RESULT_FILES_DIR = os.environ['RESULT_FILES_DIR'] RESULT_FILES_DIR = os.environ['RESULT_FILES_DIR']
DDL_VERSION_FROM = (3, 18, 0)
def run_docker(folder_name: str) -> int: 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") logging.info("Removing all clr_test-db images")
subprocess.call('docker rmi -f clr_test-db', shell=True) 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") logging.info("Removing all clr_test-clearing_system images")
subprocess.call('docker rmi -f clr_test-clearing_system', shell=True) subprocess.call('docker rmi -f clr_test-clearing_system', shell=True)
@ -45,9 +50,6 @@ def run_docker(folder_name: str) -> int:
os.chdir("..") os.chdir("..")
if code != 0:
sys.exit(code)
return 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) 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: 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/expected")
remove_directory(f"{CLR_TEST_DIR}/clearing-all/clearing_testing_utils/store/input") 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") remove_files_with_extensions(".xml")
# change_date(folder) # change_date(folder)
run_docker(folder) exit_code = run_docker(folder)
append_to_log_file(folder, exit_code)
def stop_docker_compose() -> None: def stop_docker_compose() -> None:
@ -108,9 +119,47 @@ def stop_docker_compose() -> None:
os.chdir("..") 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: def main() -> None:
folders = [i for i in sorted(os.listdir(DATA_ROOT_DIR)) if re.search("\\d{1,}.\\d{1,}.*", i)] 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: for folder in folders:
stop_docker_compose() stop_docker_compose()
apply_test_case(folder) apply_test_case(folder)

View file

@ -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;
}
}

View file

@ -15,6 +15,8 @@ public class RegistryChangeRefundDateRequest {
@JsonSerialize(using = LocalDateSerializer.class) @JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class) @JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate refundDate; private LocalDate refundDate;
@JsonProperty
public String market;
public Long getGroupId() { public Long getGroupId() {
return groupId; return groupId;
@ -31,4 +33,12 @@ public class RegistryChangeRefundDateRequest {
public void setRefundDate(LocalDate refundDate) { public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate; this.refundDate = refundDate;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -10,6 +10,8 @@ public class RegistryReturnDepositRequest implements WithId {
private Long id; private Long id;
@JsonProperty @JsonProperty
private BigDecimal balance; private BigDecimal balance;
@JsonProperty
public String market;
public Long getId() { public Long getId() {
return id; return id;
@ -26,4 +28,12 @@ public class RegistryReturnDepositRequest implements WithId {
public void setBalance(BigDecimal balance) { public void setBalance(BigDecimal balance) {
this.balance = balance; this.balance = balance;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -23,6 +23,8 @@ public class RegistrySplitDepositActionRequest {
private String contract; private String contract;
@JsonProperty @JsonProperty
private String direction; private String direction;
@JsonProperty
public String market;
public String getComment() { public String getComment() {
return comment; return comment;
@ -63,4 +65,12 @@ public class RegistrySplitDepositActionRequest {
public void setDirection(String direction) { public void setDirection(String direction) {
this.direction = direction; this.direction = direction;
} }
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
} }

View file

@ -1,12 +1,14 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites; package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; 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.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import ru.spcex.platform.classes.base.interfaces.WithInstrumentType; import ru.spcex.platform.classes.base.interfaces.WithInstrumentType;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
@ -19,6 +21,8 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym
@JsonProperty @JsonProperty
private UUID issuerId; private UUID issuerId;
@JsonProperty @JsonProperty
private String inn;
@JsonProperty
private String shortName; private String shortName;
@JsonProperty @JsonProperty
private String fullName; private String fullName;
@ -41,6 +45,7 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym
@JsonProperty @JsonProperty
private String settlementDepository; private String settlementDepository;
@JsonSerialize(using = LocalDateSerializer.class) @JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty @JsonProperty
private LocalDate nominalIndexDate; private LocalDate nominalIndexDate;
@JsonProperty @JsonProperty
@ -75,6 +80,14 @@ public class DigitalCertificateSecurityGatewayRequest implements WithSecuritySym
this.issuerId = issuerId; this.issuerId = issuerId;
} }
public String getInn() {
return inn;
}
public void setInn(String inn) {
this.inn = inn;
}
public String getShortName() { public String getShortName() {
return shortName; return shortName;
} }

View file

@ -14,7 +14,7 @@
<parent> <parent>
<groupId>ru.spcex.clearing</groupId> <groupId>ru.spcex.clearing</groupId>
<artifactId>clearing</artifactId> <artifactId>clearing</artifactId>
<version>SPCEX-3.18.240</version> <version>SPCEX-3.18.244</version>
</parent> </parent>
<modules> <modules>

Some files were not shown because too many files have changed in this diff Show more