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 48a8bba01..e87a4d18d 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 @@ -33,11 +33,12 @@ public class SecurityService { } public void sendRequest(FondListingsRequest request) { - List securityList = request.getSecurities(); CodeStatusComparator comparatorBySecSymbolAndWorkflowStatus = CodeStatusComparator.create( - FondSecurity::getSecuritySymbol, - FondSecurity::getWorkflowStatus); - securityList.sort(comparatorBySecSymbolAndWorkflowStatus); + FondSecurity::getSecuritySymbol, + FondSecurity::getWorkflowStatus); + List securityList = request.getSecurities().stream() + .filter(r->r.getSecuritySymbol() != null && r.getWorkflowStatus() != null) + .sorted(comparatorBySecSymbolAndWorkflowStatus).toList(); for (FondSecurity security : securityList) { try { log.debug("process security uuid: {}", security.getId()); diff --git a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/RestTemplateTestConfig.java b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/RestTemplateTestConfig.java new file mode 100644 index 000000000..f3873ee29 --- /dev/null +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/RestTemplateTestConfig.java @@ -0,0 +1,15 @@ +package ru.spcex.clearing.gatewayapi.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateTestConfig { + + @Bean("rest-template") + public RestTemplate restTemplate(RestTemplateErrorHandler restTemplateErrorHandler) { + RestTemplate restTemplate = new RestTemplate(); + return restTemplate; + } +} \ No newline at end of file diff --git a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/TestConfig.java b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/TestConfig.java new file mode 100644 index 000000000..41a77c826 --- /dev/null +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/config/TestConfig.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.gatewayapi.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = {"ru.spcex.clearing.gatewayapi.controller", "ru.spcex.clearing.gatewayapi.service"}) +public class TestConfig { + + @Bean + public GatewayApiSettings getGatewayApiSettings() { + GatewayApiSettings gatewayApiSettings = new GatewayApiSettings(); + InboundServerSettings inboundServerSettings = new InboundServerSettings(); + gatewayApiSettings.setInboundServer(inboundServerSettings); + return gatewayApiSettings; + } +} \ No newline at end of file diff --git a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/AbstractControllerTest.java b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/AbstractControllerTest.java new file mode 100644 index 000000000..119897877 --- /dev/null +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/AbstractControllerTest.java @@ -0,0 +1,97 @@ +package ru.spcex.clearing.gatewayapi.controller; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.filter.CharacterEncodingFilter; +import ru.spcex.clearing.gatewayapi.config.BeanConfiguration; +import ru.spcex.clearing.gatewayapi.config.RestTemplateErrorHandler; +import ru.spcex.clearing.gatewayapi.config.RestTemplateTestConfig; +import ru.spcex.clearing.gatewayapi.config.TestConfig; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.CommonRequest; +import ru.spcex.clearing.gatewayapi.controller.inbound.response.CommonResponse; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.clearing.test.json.MatcherFactoryWithJson; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import javax.annotation.PostConstruct; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.atomic.AtomicLong; + +import static ru.spcex.clearing.test.json.MatcherFactoryWithJson.usingIgnoringFieldsComparatorForClass; + + +@ContextConfiguration(classes = { + BeanConfiguration.class, + RestTemplateTestConfig.class, + RestTemplateErrorHandler.class, + TestConfig.class, + ImdgTestConfig.class, + KafkaTestConfig.class}) +//todo может быть указать пакедж а не список контроллеров +@ExtendWith(SpringExtension.class) +@WebMvcTest +public abstract class AbstractControllerTest { + protected static final MatcherFactoryWithJson.Matcher BASE_REQUEST_MATCHER = usingIgnoringFieldsComparatorForClass(BaseRequest.class,"userId"); +// protected static final MatcherFactoryWithJson.Matcher CUD_RESPONSE_MATCHER = usingIgnoringFieldsComparatorForClass(CudResponse.class); + protected static final AtomicLong currentId = new AtomicLong(); + private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter(); + + static { + Path path = Paths.get("src", "main", "resources"); + String currentPath = path.toAbsolutePath().toString(); + System.setProperty("spring.config.location", currentPath + File.separator); + + CHARACTER_ENCODING_FILTER.setEncoding("UTF-8"); + CHARACTER_ENCODING_FILTER.setForceEncoding(true); + } + + @Autowired + private WebApplicationContext webApplicationContext; + + @Autowired + @Qualifier("hazelcastServiceTest") + protected ImdgProvider imdgProvider; + + private MockMvc mockMvc; + + @PostConstruct + private void postConstruct() { + mockMvc = MockMvcBuilders + .webAppContextSetup(webApplicationContext) + .addFilter(CHARACTER_ENCODING_FILTER) +// .apply(springSecurity()) + .build(); + imdgProvider.waitAvailable(); + } + + protected ResultActions perform(MockHttpServletRequestBuilder builder) throws Exception { + return mockMvc.perform(builder); + } + + + protected CommonResponse createResponse(CommonRequest request, boolean success) { + CommonResponse commonResponse = new CommonResponse(); + commonResponse.setId(request.getId()); + commonResponse.setType(request.getType()); + commonResponse.setDatetime(request.getDatetime()); + commonResponse.setSection(request.getSection()); + if (success) { + commonResponse.setCode(0L); + commonResponse.setMessage("success"); + } + return commonResponse; + } +} 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 new file mode 100644 index 000000000..02f93ba98 --- /dev/null +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/controller/GatewayControllerTest.java @@ -0,0 +1,359 @@ +package ru.spcex.clearing.gatewayapi.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondListingsRequest; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondSecurity; +import ru.spcex.clearing.gatewayapi.controller.inbound.response.CommonResponse; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static ru.spcex.clearing.test.json.JsonUtil.writeValue; + +class GatewayControllerTest extends AbstractControllerTest{ + public static final String LISTING_FOND_URL = "/listing_fond/"; + + @Test + void listingsFond() throws Exception { + CommonResponse expected = new CommonResponse(); + expected.setCode(0L); + expected.setMessage("success"); + FondListingsRequest request = new FondListingsRequest(); + List securities = new ArrayList<>(); + FondSecurity fondSecurity = new FondSecurity(); + fondSecurity.setId(UUID.fromString("a06ca1ef-872f-4fa5-9771-871a97599067")); + fondSecurity.setInstrumentType("EQTY"); + fondSecurity.setFullName("\"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\" (публичное акционерное общество), акция обыкновенная"); + fondSecurity.setFullNameEng("MKB"); + fondSecurity.setIsin("RU000A0JUG31"); + fondSecurity.setWorkflowStatus("ACTV"); + fondSecurity.setShareType("S"); + fondSecurity.setNominalValue(new BigDecimal("1.000000")); + fondSecurity.setNominalForDate(new BigDecimal("1.000000")); + fondSecurity.setNominalCurrency("RUB"); + securities.add(fondSecurity); + fondSecurity.setId(UUID.fromString("a06ca1ef-872f-4fa5-9771-871a97599067")); + fondSecurity.setInstrumentType("EQTY"); + fondSecurity.setFullName("\"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\" (публичное акционерное общество), акция обыкновенная"); + fondSecurity.setFullNameEng("MKB"); + fondSecurity.setIsin("RU000A0JUG31"); + fondSecurity.setWorkflowStatus("ACTV"); + fondSecurity.setShareType("S"); + fondSecurity.setNominalValue(new BigDecimal("1.000000")); + fondSecurity.setNominalForDate(new BigDecimal("1.000000")); + fondSecurity.setNominalCurrency("RUB"); + securities.add(fondSecurity); + request.setSecurities(securities); + String req1 = writeValue(request); + //ACT + MvcResult mvcResult = perform(MockMvcRequestBuilders.post(LISTING_FOND_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(req)) + .andDo(print())//output to the log request and response + //ASSERT + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + //.andExpect(content().json(writeValue(expected))) + .andReturn(); +// CudResponseTest cudResponseTest = readValue(mvcResult.getResponse().getContentAsString(), CudResponseTest.class); +// expected.setPayload(new QueueSuccessResponse(ActionType.NEW, cudResponseTest.getPayload().getId())); +// CUD_RESPONSE_MATCHER.assertMatch(cudResponseTest, expected); + } + String req = "{\n" + + "\t\"id\": \"bbf4ccc0-bd9d-466d-9b2b-837e2bc3d35c\",\n" + + "\t\"type\": \"ON_DEMAND\",\n" + + "\t\"section\": \"FOND\",\n" + + "\t\"datetime\": \"02.08.2023 09:30:00:314\",\n" + + "\t\"security\": [{\n" + + "\t\t\t\"id\": \"a06ca1ef-872f-4fa5-9771-871a97599067\",\n" + + "\t\t\t\"instrument_type\": \"EQTY\",\n" + + "\t\t\t\"issuer_id\": \"fcb059ec-544c-4bf8-8024-fe06f22a607f\",\n" + + "\t\t\t\"short_name\": \"МКБ ао\",\n" + + "\t\t\t\"full_name\": \"\\\"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\\\" (публичное акционерное общество), акция обыкновенная\",\n" + + "\t\t\t\"full_name_eng\": \"MKB\",\n" + + " \"security_symbol\": \"RU000A0JUG31\",\n" + + "\t\t\t\"isin\": \"RU000A0JUG31\",\n" + + "\t\t\t\"workflow_status\": \"ACTV\",\n" + + "\t\t\t\"share_type\": \"S\",\n" + + "\t\t\t\"nominal_value\": \"1.000000\",\n" + + "\t\t\t\"nominal_for_date\": \"1.000000\",\n" + + "\t\t\t\"nominal_currency\": \"RUB\"\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"id\": \"a57aa2c4-8d07-46b5-bfdd-3a00c29f61c6\",\n" + + "\t\t\t\"instrument_type\": \"BOND\",\n" + + "\t\t\t\"issuer_id\": \"35bf708b-459d-432f-bb0e-899cc3530c65\",\n" + + "\t\t\t\"full_name\": \"Неконвертируемые процентные документарные облигации на предъявителя серии 08 с обязательным централизованным хранением\",\n" + + "\t\t\t\"full_name_eng\": \"PJSC \\\"RusHydro\\\" VAR 02/02/23\",\n" + + "\t\t\t\"isin\": \"RU000A0JTMK9\",\n" + + "\t\t\t\"workflow_status\": \"BLKD\",\n" + + "\t\t\t\"maturity_date\": \"02.02.2023\",\n" + + "\t\t\t\"nominal_value\": \"1000.000000\",\n" + + "\t\t\t\"nominal_for_date\": \"1000.000000\",\n" + + "\t\t\t\"nominal_currency\": \"RUB\",\n" + + "\t\t\t\"coupon_type\": \"VAR\",\n" + + "\t\t\t\"coupon_frequency\": \"2.000000\"\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"instrument_type\": \"BOND\",\n" + + "\t\t\t\"issuer_id\": \"adab5846-3fc9-4774-b1db-2e2e05f07583\",\n" + + "\t\t\t\"short_name\": \"ОФЗ 29020\",\n" + + "\t\t\t\"full_name\": \"Облигации федерального займа с переменным купонным доходом\",\n" + + "\t\t\t\"full_name_eng\": \"Minfin Rossii VAR 22/09/27\",\n" + + "\t\t\t\"security_symbol\": \"SU29020RMFS3\",\n" + + "\t\t\t\"isin\": \"RU000A102BV4\",\n" + + "\t\t\t\"workflow_status\": \"BLKD\",\n" + + "\t\t\t\"bond_type\": \"V\",\n" + + "\t\t\t\"maturity_date\": \"22.09.2027\",\n" + + "\t\t\t\"nominal_value\": \"1000.000000\",\n" + + "\t\t\t\"nominal_for_date\": \"1000.000000\",\n" + + "\t\t\t\"nominal_currency\": \"RUB\",\n" + + "\t\t\t\"coupon_type\": \"RUO\",\n" + + "\t\t\t\"coupon_frequency\": \"4.000000\"\n" + + "\t\t}\n" + + "\t],\n" + + "\t\"listing\": [{\n" + + "\t\t\t\"security_id\": \"a06ca1ef-872f-4fa5-9771-871a97599067\",\n" + + "\t\t\t\"lot_size\": 100,\n" + + "\t\t\t\"symbol_code\": \"CBOM\",\n" + + "\t\t\t\"symbol_name\": \"МКБ ао\",\n" + + "\t\t\t\"trading_currency\": \"RUB\",\n" + + "\t\t\t\"workflow_status\": \"ACTV\",\n" + + "\t\t\t\"precision\": 2,\n" + + "\t\t\t\"min_step\": 1,\n" + + "\t\t\t\"settle_code\": \"T0\",\n" + + "\t\t\t\"settle_days\": 0,\n" + + "\t\t\t\"name\": \"Акции – Торги\",\n" + + "\t\t\t\"code\": \"UESC\",\n" + + "\t\t\t\"sector\": \"FOND\",\n" + + "\t\t\t\"start_date\": \"10.08.2022\",\n" + + "\t\t\t\"end_date\": \"16.09.2027\"\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"a06ca1ef-872f-4fa5-9771-871a97599067\",\n" + + "\t\t\t\"lot_size\": 100,\n" + + "\t\t\t\"symbol_code\": \"CBOM\",\n" + + "\t\t\t\"symbol_name\": \"МКБ ао\",\n" + + "\t\t\t\"trading_currency\": \"RUB\",\n" + + "\t\t\t\"workflow_status\": \"ACTV\",\n" + + "\t\t\t\"precision\": 2,\n" + + "\t\t\t\"min_step\": 1,\n" + + "\t\t\t\"settle_code\": \"T0\",\n" + + "\t\t\t\"settle_days\": 0,\n" + + "\t\t\t\"name\": \"Акции - РПС\",\n" + + "\t\t\t\"code\": \"NESC\",\n" + + "\t\t\t\"sector\": \"FOND\",\n" + + "\t\t\t\"start_date\": \"10.08.2022\",\n" + + "\t\t\t\"end_date\": \"16.09.2027\"\n" + + "\t\t}\n" + + "\t],\n" + + "\t\"coupon_schedule\": [{\n" + + "\t\t\t\"security_id\": \"a57aa2c4-8d07-46b5-bfdd-3a00c29f61c6\",\n" + + "\t\t\t\"period_start_date\": \"04.08.2022\",\n" + + "\t\t\t\"period_end_date\": \"02.02.2023\",\n" + + "\t\t\t\"coupon_rate\": \"0.100000\",\n" + + "\t\t\t\"coupon_number\": 20,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"28.12.2022\",\n" + + "\t\t\t\"period_end_date\": \"29.03.2023\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 9,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"29.03.2023\",\n" + + "\t\t\t\"period_end_date\": \"28.06.2023\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 3,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"27.09.2023\",\n" + + "\t\t\t\"period_end_date\": \"27.12.2023\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 5,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"26.03.2025\",\n" + + "\t\t\t\"period_end_date\": \"25.06.2025\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 11,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"25.06.2025\",\n" + + "\t\t\t\"period_end_date\": \"24.09.2025\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 12,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"24.09.2025\",\n" + + "\t\t\t\"period_end_date\": \"24.12.2025\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 13,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"24.12.2025\",\n" + + "\t\t\t\"period_end_date\": \"25.03.2026\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 14,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"25.03.2026\",\n" + + "\t\t\t\"period_end_date\": \"24.06.2026\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 15,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"24.06.2026\",\n" + + "\t\t\t\"period_end_date\": \"23.09.2026\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 16,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"23.09.2026\",\n" + + "\t\t\t\"period_end_date\": \"23.12.2026\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 17,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"23.12.2026\",\n" + + "\t\t\t\"period_end_date\": \"24.03.2027\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 18,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"24.03.2027\",\n" + + "\t\t\t\"period_end_date\": \"23.06.2027\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 19,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"23.06.2027\",\n" + + "\t\t\t\"period_end_date\": \"22.09.2027\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 20,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": false\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"28.09.2022\",\n" + + "\t\t\t\"period_end_date\": \"28.12.2022\",\n" + + "\t\t\t\"coupon_rate\": \"75.000000\",\n" + + "\t\t\t\"coupon_number\": 1,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"28.12.2022\",\n" + + "\t\t\t\"period_end_date\": \"29.03.2023\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 2,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"28.06.2023\",\n" + + "\t\t\t\"period_end_date\": \"27.09.2023\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 4,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"27.12.2023\",\n" + + "\t\t\t\"period_end_date\": \"27.03.2024\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 6,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"27.03.2024\",\n" + + "\t\t\t\"period_end_date\": \"26.06.2024\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 7,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"26.06.2024\",\n" + + "\t\t\t\"period_end_date\": \"25.09.2024\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 8,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"25.09.2024\",\n" + + "\t\t\t\"period_end_date\": \"25.12.2024\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 9,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"security_id\": \"8421fc8e-c0ce-451a-9c18-e074a6d58f2d\",\n" + + "\t\t\t\"period_start_date\": \"25.12.2024\",\n" + + "\t\t\t\"period_end_date\": \"26.03.2025\",\n" + + "\t\t\t\"coupon_rate\": \"7.220000\",\n" + + "\t\t\t\"coupon_number\": 10,\n" + + "\t\t\t\"coupon_currency\": \"RUB\",\n" + + "\t\t\t\"is_deleted\": true\n" + + "\t\t}\n" + + "\t]\n" + + "}"; +} \ No newline at end of file