From 53df6b6b62234845b7bcc19c9309433c4eea7eaa Mon Sep 17 00:00:00 2001 From: AKurakin Date: Sat, 27 Apr 2024 17:01:22 +0300 Subject: [PATCH] gateway-api securities-service http://jira.mfd.msk:8088/browse/CLS-663 CURR(currency-pair) --- .../gatewayapi/service/SecurityService.java | 1 - .../CurrencyPairSecurityRequestAdapter.java | 6 +- .../controller/GatewayControllerTest.java | 5 +- .../resources/requests/testCurrRequest.json | 629 ++++++++++++++++++ .../cud/CurrencyPairSecurityService.java | 5 +- .../service/cud/GatewaySecurityService.java | 122 +++- .../platform/messaging/domain/Consts.java | 3 +- .../CurrencyPairSecurityGatewayRequest.java | 24 - ...CurrencyPairSecurityNewGatewayRequest.java | 30 +- 9 files changed, 759 insertions(+), 66 deletions(-) create mode 100644 clearing-parent/gateway-api/src/test/resources/requests/testCurrRequest.json delete mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CurrencyPairSecurityGatewayRequest.java diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/SecurityService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/SecurityService.java index 8ec12b60e..3118fdbd4 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/SecurityService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/SecurityService.java @@ -7,7 +7,6 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithSecurityId; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.*; import ru.spcex.clearing.gatewayapi.service.adapter.SecurityRequestAdapter; import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CurrencyPairSecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest; diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CurrencyPairSecurityRequestAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CurrencyPairSecurityRequestAdapter.java index 53cab3d15..45739fc34 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CurrencyPairSecurityRequestAdapter.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/CurrencyPairSecurityRequestAdapter.java @@ -15,17 +15,21 @@ public class CurrencyPairSecurityRequestAdapter { CurrencyPairSecurityNewRequest securityNewRequest = new CurrencyPairSecurityNewRequest(); securityNewRequest.setInstrumentType(InstrumentType.CRNC.getKey()); securityNewRequest.setSecuritySymbol(currencyInstrument.getTicker()); + securityNewRequest.setShortName(currencyInstrument.getTicker()); securityNewRequest.setFullName(currencyInstrument.getName()); securityNewRequest.setBaseUnitSize(currencyInstrument.getNumberOfLotCurrency()); securityNewRequest.setSettlementType(currencyInstrument.getSettleCode()); securityNewRequest.setClearingOrganization(currencyInstrument.getClearingOrganization()); securityNewRequest.setWorkflowStatus(currencyInstrument.getWorkflowStatus()); - //to listing securityNewRequest.setMinStep(currencyInstrument.getMinStep()); securityNewRequest.setPrecision(currencyInstrument.getPrecision()); securityNewRequest.setLotSize(currencyInstrument.getLotSize()); + // для currencyPairId + req.setLotCurrencyLetterCode(currencyInstrument.getLotCurrencyLetterCode()); + req.setMatchedCurrencyLetterCode(currencyInstrument.getMatchedCurrencyLetterCode()); + req.setCurrencySecurityNewRequest(securityNewRequest); // req.setUuid(currencyInstrument.getInitiatorId() != null ? currencyInstrument.getInitiatorId().toString() : null); return req; diff --git a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/GatewayControllerTest.java b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/GatewayControllerTest.java index 7bcb4d499..c55c6d214 100644 --- a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/GatewayControllerTest.java +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/GatewayControllerTest.java @@ -432,9 +432,12 @@ class GatewayControllerTest extends AbstractControllerTest{ ] } """; + CurrListingsRequest cudReqObj = JsonUtil.readValue(CURR_REQ, CurrListingsRequest.class); + Assertions.assertEquals("CNY", cudReqObj.getCurrencyInstrumentList().get(0).getLotCurrencyLetterCode()); + Assertions.assertEquals("RUB", cudReqObj.getCurrencyInstrumentList().get(0).getMatchedCurrencyLetterCode()); //ACT - MvcResult mvcResult = perform(MockMvcRequestBuilders.post(LISTING_FOND_URL) + MvcResult mvcResult = perform(MockMvcRequestBuilders.post(LISTING_CURR_URL) .contentType(MediaType.APPLICATION_JSON) .content(CURR_REQ)) .andDo(print())//output to the log request and response diff --git a/clearing-parent/gateway-api/src/test/resources/requests/testCurrRequest.json b/clearing-parent/gateway-api/src/test/resources/requests/testCurrRequest.json new file mode 100644 index 000000000..6a64b5ed9 --- /dev/null +++ b/clearing-parent/gateway-api/src/test/resources/requests/testCurrRequest.json @@ -0,0 +1,629 @@ +{ + "id": "5ae29407-834a-460d-bf1e-612dda694527", + "type": "DAY_START", + "section": "CURR", + "datetime": "26.04.2024 09:30:00:065", + "currency_specification": [ + { + "id": "617f3172-20a9-4f83-b008-db4548a4de44", + "ticker": "CNYRUB_TOD_N", + "name": "Спот-инструмент китайский юань с расчетами сегодня без клиринга и расчетов в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "N", + "lot_currency_letter_code": "CNY", + "matched_currency_letter_code": "RUB", + "trading_mode": "NVAD", + "lot_size": 1, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 1, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "ACTV" + }, + { + "id": "3c0fb45e-2d6c-4ece-9444-13acd7426f5c", + "ticker": "ARSRUB_TOD_C", + "name": "тест", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 2, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ARS", + "matched_currency_letter_code": "RUB", + "trading_mode": "UVAV", + "lot_size": 1000, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "13.03.2024", + "specification_approval_number": "123", + "workflow_status": "BLKD" + }, + { + "id": "c019b97e-7480-4b8a-83b9-742afc0f8789", + "ticker": "ALLCVE_TOD_C", + "name": "а", + "exchange_offexchange": "EXCHANGE", + "min_step": 5, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "CVE", + "trading_mode": "UVAV", + "lot_size": 2, + "clearing_organization": "в", + "settlement_organization": "а", + "matched_settlement_organization": "п", + "number_of_lot_currency": 2, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "4", + "workflow_status": "BLKD" + }, + { + "id": "e3577cd1-4d36-4691-91ae-72536896fc64", + "ticker": "EURRUB_TOD_C", + "name": "Спот-инструмент казахстанский тенге с расчетами сегодня с клирингом в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "EUR", + "matched_currency_letter_code": "RUB", + "trading_mode": "UVAV", + "lot_size": 10000, + "clearing_organization": "НКО АО ПРЦ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "СПВБ", + "number_of_lot_currency": 1000, + "start_trading_date": "15.03.2024", + "specification_approval_date": "13.03.2024", + "specification_approval_number": "123", + "workflow_status": "ACTV" + }, + { + "id": "45c8205e-14d9-4e0f-9a25-4f07702a8ae5", + "ticker": "KZTRUB_TOD_N", + "name": "Спот-инструмент казахстанский тенге с расчетами сегодня без клиринга и расчетов в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "N", + "lot_currency_letter_code": "KZT", + "matched_currency_letter_code": "RUB", + "trading_mode": "NVAD", + "lot_size": 10000, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 100, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "ACTV" + }, + { + "id": "3f30841f-b138-444d-bd5f-2bfc9cc3a6f7", + "ticker": "CADRUB_TOD_C", + "name": "Канадский доллар Рубль РФ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "CAD", + "matched_currency_letter_code": "RUB", + "trading_mode": "UVAV", + "lot_size": 1000, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 100000, + "start_trading_date": "22.03.2024", + "specification_approval_date": "20.03.2024", + "specification_approval_number": "566", + "workflow_status": "ACTV" + }, + { + "id": "31518ec5-244e-4082-9f9c-29a8e4b6d955", + "ticker": "KZTRUB_TOD_C", + "name": "Спот-инструмент казахстанский тенге с расчетами сегодня с клирингом в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 25, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "KZT", + "matched_currency_letter_code": "RUB", + "trading_mode": "UVAV", + "lot_size": 10000, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 100, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "ACTV" + }, + { + "id": "0742d050-96e7-444b-9e87-66eb875b5776", + "ticker": "EURRUB_TOD_N", + "name": "тестовый инструмент", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 2, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "N", + "lot_currency_letter_code": "EUR", + "matched_currency_letter_code": "RUB", + "trading_mode": "NVAD", + "lot_size": 1000, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 10, + "start_trading_date": "21.03.2024", + "specification_approval_date": "20.03.2024", + "specification_approval_number": "123", + "workflow_status": "ACTV" + }, + { + "id": "115ece73-b658-4f7e-b608-d5f50005ccba", + "ticker": "CNYRUB_TOD_C", + "name": "Спот-инструмент китайский юань с расчетами сегодня с клирингом в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 5, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "CNY", + "matched_currency_letter_code": "RUB", + "trading_mode": "UVAV", + "lot_size": 1000, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 1, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "1", + "workflow_status": "ACTV" + }, + { + "id": "c20c7b3d-750b-438c-b2c8-06bd49d02642", + "ticker": "EURUSD_TOD_C", + "name": "тест импорт", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "EUR", + "matched_currency_letter_code": "USD", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "12.03.2024", + "specification_approval_date": "11.03.2024", + "specification_approval_number": "123", + "workflow_status": "ACTV" + }, + { + "id": "bf158264-7b03-40d2-a3fe-c404f8f87150", + "ticker": "ALLDZD_TOD_C", + "name": "аааааа", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "B0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "DZD", + "trading_mode": "UVAV", + "lot_size": 5, + "clearing_organization": "ррр", + "settlement_organization": "рррр", + "matched_settlement_organization": "рррр", + "number_of_lot_currency": 1111, + "start_trading_date": "08.04.2024", + "specification_approval_date": "03.04.2024", + "specification_approval_number": "аааа", + "workflow_status": "ACTV" + }, + { + "id": "ff2c0881-220a-496e-b7f0-fa4487b9457f", + "ticker": "CNYRUB_TOD_R", + "name": "Спот-инструмент китайский юань с расчетами сегодня с клирингом в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "R", + "lot_currency_letter_code": "CNY", + "matched_currency_letter_code": "RUB", + "trading_mode": "NVAV", + "lot_size": 1, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 1, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "ACTV" + }, + { + "id": "4f41bcc3-d66a-4f56-94d8-4c7c2834a834", + "ticker": "ALLBND_TOD_R", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "R", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "BND", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "a", + "settlement_organization": "b", + "matched_settlement_organization": "c", + "number_of_lot_currency": 1, + "start_trading_date": "31.03.2024", + "specification_approval_date": "07.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "093de51b-5d80-4362-b942-ede93dca9cd7", + "ticker": "ALLDZD_TOD_R", + "name": "Тестовый инструмент АЛЛ-ДЗД", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 2, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "R", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "DZD", + "trading_mode": "UVAV", + "lot_size": 1000, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "13.03.2024", + "specification_approval_number": "12345", + "workflow_status": "BLKD" + }, + { + "id": "a0be959e-f2f2-4c9e-9230-1a28167d20aa", + "ticker": "ALLBWP_TOD_C", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "BWP", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "a", + "settlement_organization": "b", + "matched_settlement_organization": "c", + "number_of_lot_currency": 1, + "start_trading_date": "05.03.2024", + "specification_approval_date": "05.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "d49ce1ea-52d7-49e2-a636-dc791270d32d", + "ticker": "DZDALL_TOD_C", + "name": "проверка удаления", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "DZD", + "matched_currency_letter_code": "ALL", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "0417fd5d-080e-4135-8b26-5c0d61116fe0", + "ticker": "ALLALL_TOD_C", + "name": "тест создание", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 2, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "ALL", + "trading_mode": "UVAV", + "lot_size": 1000, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "13.03.2024", + "specification_approval_number": "123", + "workflow_status": "BLKD" + }, + { + "id": "3fecd8e4-4f61-4ba4-8494-3c09b84386c4", + "ticker": "ALLCVE_TOD_C", + "name": "проверка ап", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "CVE", + "trading_mode": "UVAV", + "lot_size": 2, + "clearing_organization": "авы", + "settlement_organization": "ыва", + "matched_settlement_organization": "авы", + "number_of_lot_currency": 3, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "34", + "workflow_status": "BLKD" + }, + { + "id": "b1f864a0-df55-4061-b1c1-3f569d4cea03", + "ticker": "ALLDZD_TOD_C", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "DZD", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "ко", + "settlement_organization": "ро", + "matched_settlement_organization": "рос", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "53440d91-633b-4171-9820-a280a8f8cd32", + "ticker": "ALLKHR_TOD_C", + "name": "абвгд", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "KHR", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "цц", + "settlement_organization": "цц", + "matched_settlement_organization": "цц", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "515d5ae1-185d-4d04-b353-7fb6f119b2b8", + "ticker": "ALLBTN_TOD_C", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "BTN", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "a", + "settlement_organization": "b", + "matched_settlement_organization": "c", + "number_of_lot_currency": 1, + "start_trading_date": "23.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "f73d20ad-77a7-48f2-8a69-816d72755c55", + "ticker": "BSDARS_TOD_C", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "B0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "BSD", + "matched_currency_letter_code": "ARS", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "a", + "settlement_organization": "b", + "matched_settlement_organization": "c", + "number_of_lot_currency": 1, + "start_trading_date": "30.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "BLKD" + }, + { + "id": "aa9c44e0-6808-4b75-883f-421243e1433f", + "ticker": "ALLARS_TOD_C", + "name": "абырвалг", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 2, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "ARS", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 123, + "start_trading_date": "14.03.2024", + "specification_approval_date": "13.03.2024", + "specification_approval_number": "123", + "workflow_status": "BLKD" + }, + { + "id": "dce81fd0-7773-4e7e-bd1a-212bdfa1c9d1", + "ticker": "ALLAUD_TOD_C", + "name": "проверка пр", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "AUD", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "кк", + "settlement_organization": "уу", + "matched_settlement_organization": "тт", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "3", + "workflow_status": "BLKD" + }, + { + "id": "712a96d1-3076-4130-a0a1-31a500c13753", + "ticker": "KZTRUB_TOD_R", + "name": "Спот-инструмент казахстанский тенге с расчетами сегодня с клирингом в АО СПВБ", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "R", + "lot_currency_letter_code": "KZT", + "matched_currency_letter_code": "RUB", + "trading_mode": "NVAV", + "lot_size": 10000, + "clearing_organization": "АО СПВБ", + "settlement_organization": "НКО АО ПРЦ", + "matched_settlement_organization": "НКО АО ПРЦ", + "number_of_lot_currency": 100, + "start_trading_date": "06.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "2", + "workflow_status": "ACTV" + }, + { + "id": "1faf9210-3d59-4686-9bc1-fd720e4cb240", + "ticker": "ALLARS_TOD_C", + "name": "абвгд", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "ARS", + "trading_mode": "UVAV", + "lot_size": 1, + "clearing_organization": "1", + "settlement_organization": "1", + "matched_settlement_organization": "1", + "number_of_lot_currency": 1, + "start_trading_date": "14.03.2024", + "specification_approval_date": "14.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + }, + { + "id": "3a32922a-ee15-47f3-b14c-539cb0ac410f", + "ticker": "ALLBBD_TOD_C", + "name": "проверка", + "exchange_offexchange": "EXCHANGE", + "min_step": 1, + "precision": 4, + "settle_code": "T0", + "value_date": "TOD", + "symbol_trading_mode": "C", + "lot_currency_letter_code": "ALL", + "matched_currency_letter_code": "BBD", + "trading_mode": "UVAV", + "lot_size": 2, + "clearing_organization": "а", + "settlement_organization": "б", + "matched_settlement_organization": "в", + "number_of_lot_currency": 1, + "start_trading_date": "08.03.2024", + "specification_approval_date": "06.03.2024", + "specification_approval_number": "1", + "workflow_status": "BLKD" + } + ] +} \ No newline at end of file diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CurrencyPairSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CurrencyPairSecurityService.java index 5fb66e203..1492c5e89 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CurrencyPairSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/CurrencyPairSecurityService.java @@ -74,10 +74,6 @@ public class CurrencyPairSecurityService extends QueueConsumer implements Initia callback(CommonDeleteRequest.class) .setFunction(this::deleteCurrencyPairSecurity) .forDestination(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_DELETE, callbacks::put); - //todo DESTINATION_GATEWAY_CURRENCY_PAIR_SECURITY see CLS-612, CLS-663 -// callback(CurrencyPairSecurityNewGatewayRequest.class) -// .setFunction(this::newCurrencyPairSecurity) -// .forDestination(Consts.DESTINATION_GATEWAY_CURRENCY_PAIR_SECURITY, callbacks::put); imdgProvider.waitAvailable(); init(); } @@ -113,6 +109,7 @@ public class CurrencyPairSecurityService extends QueueConsumer implements Initia currencyPairSecurity.setBaseUnitSize(req.getBaseUnitSize()); currencyPairSecurity.setCurrencyPairId(req.getCurrencyPairId()); //todo currencyPairSecurity.setCode(req.getCode()); + //req.getPrecision() currencyPairSecurity.setSettlementType(req.getSettlementType()); currencyPairSecurity.setClearingOrganization(req.getClearingOrganization()); //todo currencyPairSecurity.setSettlementOrganization(req.getSettlementOrganization()); diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index c9ffb4691..18ec7d91a 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -16,17 +16,20 @@ import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; +import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CurrencyPairSecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.EquitySecurityGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.FixedIncomeGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.SecurityFondGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.*; +import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.securities.validation.ValidationProvider; @@ -53,11 +56,13 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin private final Imdg fixedIncomeSecurityImdg; private final Imdg equitySecurityImdg; private final Imdg moneyMarketSecurityImdg; + private final Imdg currencyPairSecurityImdg; private final Imdg listingImdg; private final Imdg couponPeriodImdg; private final Imdg fixedIncomeCashFlowImdg; private final Imdg companySymbolsImdg; private final Imdg companyImdg; + private final Imdg currencyPairDictionaryImdg; private final ImdgProvider imdgProvider; private final ImdgId idGenerator; @@ -97,6 +102,8 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class); + this.currencyPairDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairDictionary, CurrencyPairDictionary.class); this.currencyPairSecurityService = currencyPairSecurityService; this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class); @@ -129,9 +136,9 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin callback(MoneyMarketSecurityNewGatewayRequest.class) .setFunction(this::newMoneyMarketSecurity) .forDestination(Consts.DESTINATION_GATEWAY_MONEY_MARKET_SECURITY, callbacks::put); - callback(CurrencyPairSecurityGatewayRequest.class) - .setFunction(this::newSecurities) - .forDestination(Consts.DESTINATION_SECURITY_CURRENCY_GATEWAY, callbacks::put); + callback(CurrencyPairSecurityNewGatewayRequest.class) + .setFunction(this::newSecuritiesCurrencyPair) + .forDestination(Consts.DESTINATION_GATEWAY_CURRENCY_PAIR_SECURITY, callbacks::put); imdgProvider.waitAvailable(); init(); @@ -183,6 +190,74 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } } + private RequestInfoUpdate newSecuritiesCurrencyPair(BaseRequest baseRequest) { + log.debug("CurrencyPairSecurityGatewayRequest id={} received", baseRequest.getId()); + CurrencyPairSecurityNewGatewayRequest req = (CurrencyPairSecurityNewGatewayRequest) baseRequest.getRequestPayload(); + + Security security = null; + + try { + CurrencyPairSecurityNewRequest currencyPairRequest = req.getCurrencySecurityNewRequest(); + if (currencyPairRequest != null) { + if (StringUtils.isEmpty(currencyPairRequest.getSecuritySymbol())) { + log.warn("Skip creating CurrencyPairSecurity without securityId"); + return null; + } + log.debug("Processed request with securitySymbol: {}", currencyPairRequest.getSecuritySymbol()); + if (req.getLotCurrencyLetterCode() == null || req.getMatchedCurrencyLetterCode() == null) { + log.warn("Required field was empty: LotCurrencyLetterCode={}, MatchedCurrencyLetterCode={}", + req.getLotCurrencyLetterCode(), req.getMatchedCurrencyLetterCode()); + } else { + CurrencyPairDictionary currencyPairD = currencyPairDictionaryImdg.getFirstObjectByFieldValues(Map.of( + "baseCurrency", req.getLotCurrencyLetterCode(), + "quoteCurrency", req.getMatchedCurrencyLetterCode() + )); + if (currencyPairD == null) { + log.warn("CurrencyPairDictionary not found by {}/{}", + req.getLotCurrencyLetterCode(), req.getMatchedCurrencyLetterCode()); + } else { + log.trace("CurrencyPairId={} by {}/{}", currencyPairD.getId(), + req.getLotCurrencyLetterCode(), req.getMatchedCurrencyLetterCode()); + currencyPairRequest.setCurrencyPairId(currencyPairD.getId()); + } + } + + String securitySymbol = currencyPairRequest.getSecuritySymbol(); + security = findSecurityBySecuritySymbol(currencyPairSecurityImdg, securitySymbol); + + if (security == null) { + security = currencyPairSecurityService.newCurrencyPairSecurity0(currencyPairRequest); + } else { + CurrencyPairSecurityUpdateRequest updateRequest = toUpdateRequest(security, currencyPairRequest); + security = currencyPairSecurityService.updateCurrencyPairSecurity0(updateRequest); + } + } else { + log.warn("currencyPairSecurityGatewayRequest is null"); + } + } catch (ValidationException expected) { + if (security == null) { + log.error("Error create or update issue: {}", messageResolver.resolve(expected.getEnumMsg())); + return requestHelper.makeErrorResponse(baseRequest, expected.getEnumMsg()); + } else { + log.warn("Error create or update issue: {}. But issue id={} found, try continue...", + messageResolver.resolve(expected.getEnumMsg()), security.getId()); + } + } + + Long securityId; + if (security == null) { + log.error("No new or update security."); + securityId = null; + } else { + securityId = security.getId(); + log.debug("Use security {}.id={} ({} {})", security.getClass().getSimpleName(), securityId, security.getInstrumentType(), security.getShortName()); + } + + log.debug("successfully processed, request id {}, currencyPairId={}", + baseRequest.getId(), securityId); + return null; // default success + } + private RequestInfoUpdate newSecurities(BaseRequest baseRequest) { log.debug("SecurityFondGatewayRequest id={} received", baseRequest.getId()); SecurityFondGatewayRequest req = (SecurityFondGatewayRequest) baseRequest.getRequestPayload(); @@ -237,26 +312,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } } if (InstrumentType.CRNC.equalsByKey(req.getSecurityType())) { -// CurrencyPairSecurityGatewayRequest currencyPairSecurityGatewayRequest = (CurrencyPairSecurityGatewayRequest) req; -// CurrencyPairSecurityNewRequest currencyPairRequest = currencyPairSecurityGatewayRequest.getSecurity(); -// if (StringUtils.isEmpty(currencyPairRequest.getSecuritySymbol())) { -// log.warn("Skip creating CurrencyPairSecurity without securityId: uuid: {}", req.getUuid()); -// return null; -// } -// log.debug("Processed request with securitySymbol: {}", currencyPairRequest.getSecuritySymbol()); -// currencyPairRequest.setIssuerId(companyId); -// log.trace("EquitySecurityNewRequest - FOND"); -// String securitySymbol = currencyPairRequest.getSecuritySymbol(); -// security = findSecurityBySecuritySymbol(currencyPairSecurityImdg, securitySymbol); -// -// if (security == null) { -// security = currencyPairSecurityService.newEquity0(currencyPairRequest); -// } else { -// EquitySecurityUpdateRequest updateRequest = toUpdateRequest(security, currencyPairRequest); -// security = currencyPairSecurityService.updateEquity0(updateRequest); -// } -// //fixme currencypair будет отдельная задача - throw new IllegalStateException("todo CRNC"); + throw new IllegalStateException("CRNC support in other function"); // см. другой метод. } } catch (ValidationException expected) { if (security == null) { @@ -536,4 +592,22 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin return updateRequest; } + CurrencyPairSecurityUpdateRequest toUpdateRequest(Security currencyPairSecurity, CurrencyPairSecurityNewRequest newRequest) { + var updateRequest = new CurrencyPairSecurityUpdateRequest(); + updateRequest.setId(currencyPairSecurity.getId()); + + updateRequest.setInstrumentType(newRequest.getInstrumentType()); + updateRequest.setSecuritySymbol(newRequest.getSecuritySymbol()); + updateRequest.setShortName(newRequest.getShortName()); + updateRequest.setFullName(newRequest.getFullName()); + updateRequest.setCurrencyPairId(newRequest.getCurrencyPairId()); + updateRequest.setLotSize(newRequest.getLotSize()); + updateRequest.setMinStep(newRequest.getMinStep()); +// updateRequest.setPrecision(newRequest.getPrecision()); + updateRequest.setBaseUnitSize(newRequest.getBaseUnitSize()); + updateRequest.setSettlementType(newRequest.getSettlementType()); + updateRequest.setWorkflowStatus(newRequest.getWorkflowStatus()); + updateRequest.setClearingOrganization(newRequest.getClearingOrganization()); + return updateRequest; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 6f2e70a39..a2fed7f78 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -16,7 +16,7 @@ public interface Consts { String DESTINATION_SECURITY_BOND_GATEWAY = "security-bond-gateway-request-new"; String DESTINATION_SECURITY_EQTY_GATEWAY = "security-eqty-gateway-request-new"; - String DESTINATION_SECURITY_CURRENCY_GATEWAY = "security-currency-pair-gateway-request-new"; + String DESTINATION_GATEWAY_CURRENCY_PAIR_SECURITY = "currency-pair-securities-gateway-new"; // "security-currency-pair-gateway-request-new" String DESTINATION_FIXED_INCOME_CASH_FLOW_NEW = "fixed-income-cash-flow-new"; String DESTINATION_FIXED_INCOME_CASH_FLOW_UPDATE = "fixed-income-cash-flow-update"; @@ -188,7 +188,6 @@ public interface Consts { String DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW = "registry-on-trading_clearing_registry_list-new"; - String DESTINATION_GATEWAY_CURRENCY_PAIR_SECURITY = "currency-pair-securities-gateway-new"; String DESTINATION_CURRENCY_PAIR_SECURITIES_NEW = "currency-pair-securities-new"; String DESTINATION_CURRENCY_PAIR_SECURITIES_UPDATE = "currency-pair-securities-update"; String DESTINATION_CURRENCY_PAIR_SECURITIES_DELETE = "currency-pair-securities-delete"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CurrencyPairSecurityGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CurrencyPairSecurityGatewayRequest.java deleted file mode 100644 index 57e16088f..000000000 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CurrencyPairSecurityGatewayRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.spcex.clearing.platform.messaging.domain.cud.company; - -import com.fasterxml.jackson.annotation.JsonProperty; -import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest; - -public class CurrencyPairSecurityGatewayRequest extends SecurityFondGatewayRequest { - @JsonProperty - private CurrencyPairSecurityNewRequest security; - - public CurrencyPairSecurityGatewayRequest() { - } - - public CurrencyPairSecurityGatewayRequest(CurrencyPairSecurityNewRequest security) { - this.security = security; - } - - public CurrencyPairSecurityNewRequest getSecurity() { - return security; - } - - public void setSecurity(CurrencyPairSecurityNewRequest security) { - this.security = security; - } -} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/security/CurrencyPairSecurityNewGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/security/CurrencyPairSecurityNewGatewayRequest.java index 6bd10ac13..64a41eb19 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/security/CurrencyPairSecurityNewGatewayRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/security/CurrencyPairSecurityNewGatewayRequest.java @@ -3,18 +3,14 @@ package ru.spcex.clearing.platform.messaging.domain.cud.security; import com.fasterxml.jackson.annotation.JsonProperty; public class CurrencyPairSecurityNewGatewayRequest { - @JsonProperty - private String uuid; @JsonProperty private CurrencyPairSecurityNewRequest currencySecurityNewRequest; - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } + // in currencySecurityNewRequest: + @JsonProperty + private String lotCurrencyLetterCode; + @JsonProperty + private String matchedCurrencyLetterCode; public CurrencyPairSecurityNewRequest getCurrencySecurityNewRequest() { return currencySecurityNewRequest; @@ -23,4 +19,20 @@ public class CurrencyPairSecurityNewGatewayRequest { public void setCurrencySecurityNewRequest(CurrencyPairSecurityNewRequest currencySecurityNewRequest) { this.currencySecurityNewRequest = currencySecurityNewRequest; } + + public String getLotCurrencyLetterCode() { + return lotCurrencyLetterCode; + } + + public void setLotCurrencyLetterCode(String lotCurrencyLetterCode) { + this.lotCurrencyLetterCode = lotCurrencyLetterCode; + } + + public String getMatchedCurrencyLetterCode() { + return matchedCurrencyLetterCode; + } + + public void setMatchedCurrencyLetterCode(String matchedCurrencyLetterCode) { + this.matchedCurrencyLetterCode = matchedCurrencyLetterCode; + } }