diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index bbb557877..97125a334 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -48,6 +48,7 @@ public class AccountValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); + addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", CorrespondentAccountNewRequest::getCompanyId, @@ -106,6 +107,15 @@ public class AccountValidationConfig { return DictionaryPresentRule.DICTIONARY_NOT_FOUND_DECORATOR_2.decorator(causeEmpty, errorCode, fieldName, fieldValue); } ), + + DictionaryPresentRule.instance("currency", + CorrespondentAccountNewRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, + ServiceStatusDictionary.class, + null, + AccountError.DictionaryNotFound, + false + ), new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount) ); }; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java index 11431002d..19e917a56 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java @@ -38,6 +38,7 @@ public class InformationAccountValidationConfig { addImdg.accept(IMDGDistributedNames.Map_InformationAccount); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); + addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); addImdg.accept(IMDGDistributedNames.Map_Account); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", @@ -59,6 +60,10 @@ public class InformationAccountValidationConfig { DictionaryPresentRule.instance("accountType", InformationAccountNewRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false), + DictionaryPresentRule.instance("currency", InformationAccountNewRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, ServiceStatusDictionary.class, + null, AccountError.DictionaryNotFound,false + ), new SameAccountValidationRule<>(AccountType.Info, InformationAccountNewRequest::getAccount) ); }; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java index b18cd3eac..9ba14ec75 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.account.config.validation; +import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; @@ -14,6 +15,7 @@ import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -52,7 +54,7 @@ public class TradingClearingRegistryListValidationConfig { AccountError.RequiredFieldEmpty, AccountError.TradingClearingRegistryNotFound, false), - new ExistAllCurrencyAccountId<>("accountId", + new ExistAllAccountId<>("accountId", TradingClearingRegistryListNewRequest::getAccountId, false, null), @@ -79,17 +81,18 @@ public class TradingClearingRegistryListValidationConfig { addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl>(context, IdPresentRule.instance2("id", - TradingClearingRegistryListUpdateRequest::getTradingClearingRegistryId, + TradingClearingRegistryListUpdateRequest::getId, IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class, AccountError.RequiredFieldEmpty, - AccountError.TradingClearingRegistryNotFound, + AccountError.RecordNotFound, true, (tcrList)-> { Long accountId = tcrList.getAccountId(); if (accountId==null) return null; - if (!IEnumKey.contains(context.getValidatedObject().getStatus(), ServiceStatus.Active, ServiceStatus.Reopened)) + if (!IEnumKey.contains(context.getValidatedObject().getStatus(), + ServiceStatus.Active, ServiceStatus.Reopened)) return null; Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); @@ -119,13 +122,13 @@ public class TradingClearingRegistryListValidationConfig { } - public static class ExistAllCurrencyAccountId implements IValidationRule> { + public static class ExistAllAccountId implements IValidationRule> { String fieldName; Function accountIdGetter; boolean required; Function idGetter; - public ExistAllCurrencyAccountId(String fieldName, Function accountIdGetter, boolean required, Function idGetter) { + public ExistAllAccountId(String fieldName, Function accountIdGetter, boolean required, Function idGetter) { this.fieldName = fieldName; this.accountIdGetter = accountIdGetter; this.required = required; @@ -148,7 +151,11 @@ public class TradingClearingRegistryListValidationConfig { Account byIdObject = accountImdg.getSingleObjectByID(accountId); if (byIdObject == null) return of(AccountError.AccountNotFound, accountId, fieldName); - if (!AccountType.Curr.equalsByKey(byIdObject.getAccountType())) { + if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) { + return of(AccountError.AccountIsNotACurrency, accountId, + fieldName, "expected: CLRN/INFO but is " + byIdObject.getAccountType()); // Счет %S не + } + if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) { return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 3d47a3de6..351ae727b 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -129,18 +129,20 @@ public class AccountService extends QueueConsumer implements InitializingBean { if (requestInfoUpdate != null) return requestInfoUpdate; CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); + String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); Instant now = Instant.now(); Account account = new Account(); account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); if (AccountType.Info.equalsByKey(req.getAccountType())) { - Long infoSequenceId = informationAccountService.accountNextId(); + Long infoSequenceId = informationAccountService.accountNextId(currency); String accountValue = informationAccountService.generateInfoAccount(infoSequenceId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); } account.setAccountType(req.getAccountType()); + account.setCurrency(currency); if (req.getStatus() == null) { account.setStatus(WorkflowStatus.Active.getKey()); log.trace("Status not set in request. Use default: {}", account.getStatus()); @@ -198,10 +200,11 @@ public class AccountService extends QueueConsumer implements InitializingBean { infoAcc.setAccountId(account.getId()); Account firstAccountAntl = accountMap.getFirstObjectByFieldValues(Map.of( "companyId", Sender.One.getId(), - "accountType", AccountType.Anlt.getKey() + "accountType", AccountType.Anlt.getKey(), + "currency", account.getCurrency() )); if (firstAccountAntl == null) { - log.warn("Can not find 1 ANTL account for fill information ClearingAccountId."); + log.warn("Can not find 1 ANTL {} account for fill information ClearingAccountId.", account.getCurrency()); } else { infoAcc.setClearingAccountId(firstAccountAntl.getId()); } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 26e273f76..91274aa2f 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -16,7 +16,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest; import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; @@ -26,6 +25,7 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -40,6 +40,7 @@ import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; @@ -63,7 +64,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali * Кэш-счётчик сквозных номеров счетов. * См. accountNextId() */ - protected AtomicLong infoCounter; + protected Map infoCounterByCurrency = new HashMap<>(); @Autowired public InformationAccountService(Consumer kafkaQueue, @@ -115,15 +116,17 @@ public class InformationAccountService extends QueueConsumer implements Initiali if (requestInfoUpdate != null) return requestInfoUpdate; InformationAccountNewRequest req = userRequest.getRequestPayload(); + String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); //userRequest.getRequestPayload().getCurrency(); Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(); + Long infoSequenceId = accountNextId(currency); String accountValue = generateInfoAccount(infoSequenceId); log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder(); ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1L); - ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()); + ImdgPredicate accountTypePredicate = accountPredicateBuilder.and(accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()), + accountPredicateBuilder.equals("currency", currency)); ImdgPredicate andPredicate = accountPredicateBuilder.and(companyIdPredicate, accountTypePredicate); Collection accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate); if (accountsAnlt.isEmpty()) { @@ -209,8 +212,11 @@ public class InformationAccountService extends QueueConsumer implements Initiali } + String currency = userRequest.getRequestPayload().getCurrency(); + if (currency == null) + currency = CurrencyCode.RUB.getKey(); Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(); // требуется последовательность n+1 + Long infoSequenceId = accountNextId(currency); // требуется последовательность n+1 String accountValue = generateInfoAccount(infoSequenceId); log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); @@ -218,7 +224,8 @@ public class InformationAccountService extends QueueConsumer implements Initiali { ImdgPredicate andPredicate = pb.and( pb.equals("companyId", 1L), - pb.equals("accountType", AccountType.Anlt.getKey()) + pb.equals("accountType", AccountType.Anlt.getKey()), + pb.equals("currency", currency) ); Collection accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate); if (accountsAnlt.isEmpty()) { @@ -302,13 +309,20 @@ public class InformationAccountService extends QueueConsumer implements Initiali /** * Сквозной номер инфо-счетов * + * @param * @return infoCounter++ */ - public synchronized Long accountNextId() { + public synchronized Long accountNextId(String currency) { + if (currency == null) + currency = CurrencyCode.RUB.getKey(); // default + AtomicLong infoCounter = infoCounterByCurrency.get(currency); if (infoCounter == null) synchronized (this) { if (infoCounter == null) { log.debug("Init account-information counter."); - Collection allInfoAcc = accountImdg.getCollectionObjectsByFieldValues(Map.of("accountType", AccountType.Info.getKey())); + Collection allInfoAcc = accountImdg.getCollectionObjectsByFieldValues(Map.of( + "accountType", AccountType.Info.getKey(), + "currency", currency + )); if (allInfoAcc.isEmpty()) { infoCounter = new AtomicLong(1); log.debug("No account information on map. n={}", infoCounter.get()); @@ -341,6 +355,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali if (parsedCount == 0 && lastAccount != null) log.debug("Last unparseable account: {}", lastAccount); } + infoCounterByCurrency.put(currency, infoCounter); } } return infoCounter.incrementAndGet(); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java index 60940f4cc..2e0824d44 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.account.service; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -21,12 +26,8 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryByTCRListRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest; import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; @@ -35,19 +36,12 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.ServiceStatus; -import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose; -import ru.spcex.platform.enumeration.TradingClearingRegistryType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.validation.IValidator; -import java.time.Instant; -import java.util.*; -import java.util.function.Function; - @Service public class TradingClearingRegistryListService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -141,7 +135,9 @@ public class TradingClearingRegistryListService extends QueueConsumer implements return requestInfoUpdate; } + TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload(); + Account account = accountImdg.getSingleObjectByID(req.getAccountId()); Instant now = Instant.now(); List newIds=new ArrayList<>(); @@ -153,6 +149,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements tradingClearingRegistryList.setUpdated(now); tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); tradingClearingRegistryList.setAccountId(currAccId); + tradingClearingRegistryList.setCurrency(account.getCurrency()); if (req.getStatus() == null) { tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey()); log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus()); @@ -210,6 +207,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements } TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload(); + Account account = accountImdg.getSingleObjectByID(req.getAccountId()); Instant now = Instant.now(); Long id = tradingClearingRegistryListImdg.nextIDSequenceFor(); @@ -219,6 +217,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements tradingClearingRegistryList.setUpdated(now); tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); tradingClearingRegistryList.setAccountId(req.getAccountId()); + tradingClearingRegistryList.setCurrency(account.getCurrency()); if (req.getStatus() == null) { tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey()); log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus()); @@ -231,26 +230,26 @@ public class TradingClearingRegistryListService extends QueueConsumer implements if (!innerCall) { // Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов. - try { - TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId()); - ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest(); - cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); - cCodeReq.setDepoAccountId(tcr.getDepoAccountId()); - cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId()); - cCodeReq.setCompanyId(tcr.getCompanyId()); - cCodeReq.setCurrencyAccountList(Arrays.asList(req.getAccountId())); // todo rewrite API - cCodeReq.setStatus(tradingClearingRegistryList.getStatus()); - //todo cCodeReq.setCode(); - BaseRequest request2 = new BaseRequest<>(); - request2.setRequestPayload(cCodeReq); - requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true); - if (requestInfoUpdate != null) return requestInfoUpdate; - } catch (Exception e) { - log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}", - userRequest.getId(), - ExceptionUtils.getStackTrace(e)); - return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); - } +// try { +// TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId()); +// ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest(); +// cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); +// cCodeReq.setDepoAccountId(tcr.getDepoAccountId()); +// cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId()); +// cCodeReq.setCompanyId(tcr.getCompanyId()); +// cCodeReq.setCurrencyAccountList(Arrays.asList(req.getAccountId())); // todo rewrite API +// cCodeReq.setStatus(tradingClearingRegistryList.getStatus()); +// //todo cCodeReq.setCode(); +// BaseRequest request2 = new BaseRequest<>(); +// request2.setRequestPayload(cCodeReq); +// requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true); +// if (requestInfoUpdate != null) return requestInfoUpdate; +// } catch (Exception e) { +// log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}", +// userRequest.getId(), +// ExceptionUtils.getStackTrace(e)); +// return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); +// } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java index 6a68bef1e..7e7b5f3e6 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.account.service; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -40,10 +47,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; -import java.time.Instant; -import java.util.*; -import java.util.function.Function; - @Service public class TradingClearingRegistryService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -394,14 +397,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini if (code.length() > 4) code = code.substring(code.length() - 4); code = "%4s".formatted(code).replace(' ', '0'); - code += registryPurpose.getKey(); // C / M / ... +// code += registryPurpose.getKey(); // C / M / ... + code += "C";//пока ставим всегда С, возможно придется откатить String trType = tradingRegistryType + "T"; // 2 символа code += trType; String sId = "%5s".formatted(id).replace(' ', '0'); if (sId.length() > 5) sId = sId.substring(sId.length() - 5); code += sId; - return code; // 12 имволов + return code; // 12 символов } public RequestInfoUpdate tradingClearingRegistryUpdate(BaseRequest userRequest) { diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java index 6fa633e59..1cdc637a4 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -124,6 +124,7 @@ class InformationAccountServiceTest { Account accountAnlt = new Account(); accountAnlt.setAccountType(AccountType.Anlt.getKey()); accountAnlt.setCompanyId(1L); + accountAnlt.setCurrency("RUB"); anltAccountId = accountImdg.insert(accountAnlt); new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L); @@ -134,6 +135,7 @@ class InformationAccountServiceTest { InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest(); InformationAccountNewRequest.setCompanyId(companyId); InformationAccountNewRequest.setAccount(account); + InformationAccountNewRequest.setCurrency(null); String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L); @@ -178,11 +180,13 @@ class InformationAccountServiceTest { Account account = new Account(); account.setId(120L); account.setAccountType(AccountType.Info.getKey()); + account.setCurrency(CurrencyCode.RUB.getKey()); account.setCompanyId(10L); account.setAccount("39911810000000127000"); accountImdg.insert(account); InformationAccount accountInfo = new InformationAccount(); accountInfo.setId(121L); + account.setCurrency(CurrencyCode.RUB.getKey()); accountInfo.setAccountId(account.getId()); accountInfo.setCompanyId(account.getCompanyId()); accountInfoImdg.insert(accountInfo); @@ -190,9 +194,17 @@ class InformationAccountServiceTest { UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class); InformationAccountService infoAccSvc=new InformationAccountService(null,null,null, null, userRoleVerification, hazelcastServiceTest, null, null, null, null); - Long n = infoAccSvc.accountNextId(); + Long n = infoAccSvc.accountNextId(null); Assertions.assertEquals(13L, n); - n = infoAccSvc.accountNextId(); + n = infoAccSvc.accountNextId(null); Assertions.assertEquals(14L, n); + + // Другие валюты + n = infoAccSvc.accountNextId(CurrencyCode.RUB.getKey()); + Assertions.assertEquals(15L, n); + n = infoAccSvc.accountNextId("CNY"); + Assertions.assertEquals(2L, n); + n = infoAccSvc.accountNextId("CNY"); + Assertions.assertEquals(3L, n); } } \ No newline at end of file diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryListServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryListServiceTest.java index f09dd40f7..5958be1b2 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryListServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/TradingClearingRegistryListServiceTest.java @@ -167,7 +167,8 @@ class TradingClearingRegistryListServiceTest { c2Account.setAccount("AAAX-44654-CURR"); c2Account.setStatus("ACTV"); c2Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта - c2Account.setAccountType(AccountType.Curr.getKey()); + c2Account.setAccountType(AccountType.Info.getKey()); + c2Account.setCurrency("USD"); accounts.insert(c2Account); Account c3Account = new Account(); @@ -175,7 +176,8 @@ class TradingClearingRegistryListServiceTest { c3Account.setAccount("AAAX-12654-CURR"); c3Account.setStatus("ACTV"); c3Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта - c3Account.setAccountType(AccountType.Curr.getKey()); + c3Account.setAccountType(AccountType.Info.getKey()); + c3Account.setCurrency("USD"); accounts.insert(c3Account); new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L); @@ -201,7 +203,7 @@ class TradingClearingRegistryListServiceTest { final String ccCode = null; TradingClearingRegistryListNewRequest tcrlNewRequest = new TradingClearingRegistryListNewRequest(); tcrlNewRequest.setTradingClearingRegistryId(TCR_ID); - tcrlNewRequest.setCurrencyAccountList(Arrays.asList(134L)); + tcrlNewRequest.setAccountId(134L); tcrlNewRequest.setStatus("ACTV"); ClientCode predictableClientCode = new ClientCode(); @@ -212,7 +214,7 @@ class TradingClearingRegistryListServiceTest { TradingClearingRegistryList predictableTradingClearingRegistryList = new TradingClearingRegistryList(); predictableTradingClearingRegistryList.setAccountId(134L); predictableTradingClearingRegistryList.setStatus("ACTV"); - predictableTradingClearingRegistryList.setCurrency("RUB"); + predictableTradingClearingRegistryList.setCurrency("USD"); //ACT String jsonString = TestUtils.getJsonStringForNew(tcrlNewRequest, ID); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/HistoryConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/HistoryConfig.java index d75397db0..40918ca81 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/HistoryConfig.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/HistoryConfig.java @@ -40,6 +40,7 @@ public class HistoryConfig { hst.add(excludeLiabilitiesRegister()); hst.add(liabilitiesRegister()); hst.add(executionRegister()); + hst.add(session()); return hst; } @@ -174,4 +175,17 @@ public class HistoryConfig { )); return sbscr; } + + + private HistorySubscription session() { + HistorySubscription sbscr = new HistorySubscription(); + sbscr.setDestination("session"); + sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchSession); + sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_Session); + sbscr.setConditions(List.of( + new ClearingDateFromCondition(pb), + new ClearingDateToCondition(pb) + )); + return sbscr; + } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/TradingClearingRegistryListController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/registry/TradingClearingRegistryListController.java similarity index 97% rename from clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/TradingClearingRegistryListController.java rename to clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/registry/TradingClearingRegistryListController.java index b9f529e0e..c0a854b60 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/TradingClearingRegistryListController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/registry/TradingClearingRegistryListController.java @@ -1,4 +1,4 @@ -package ru.spcex.clearing.backendapi.controller.queue.register; +package ru.spcex.clearing.backendapi.controller.queue.registry; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.ExecutionException; +// todo unittest for TradingClearingRegistryListController @Controller @RequestMapping("/trading-clearing-registries-list") public class TradingClearingRegistryListController extends AbstractQueueController { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/AccountInformationNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/AccountInformationNewAction.java index 79041f21f..d7dd2b37d 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/AccountInformationNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/AccountInformationNewAction.java @@ -17,6 +17,9 @@ public class AccountInformationNewAction implements IAction { @ApiModelProperty(value = "Наименование типа счета", example = "CLRN") @JsonProperty private String accountType; + @ApiModelProperty(value = "Код валюты", example = "RUB") + @JsonProperty + private String currency; @Override public AccountNewRequest toRequest() { @@ -37,6 +40,7 @@ public class AccountNewAction implements IAction { req.setAccount(this.account); req.setStatus(this.status); req.setAccountType(this.accountType); + req.setCurrency(this.currency); return req; } @@ -77,4 +81,12 @@ public class AccountNewAction implements IAction { public void setAccountType(String accountType) { this.accountType = accountType; } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } } diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 590401157..03c6f56b7 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.11.0.83", + "version": "3.11.0.86", "enums": { @@ -4303,7 +4303,7 @@ "name": "Добавление списка счетов ТКР", - "confirmation": "tradingClearingRegistryId,accountId,status", + "confirmation": "tradingClearingRegistryId,accountId", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListNewAction", @@ -4322,7 +4322,7 @@ "name": "Изменение списка счетов ТКР", - "confirmation": "tradingClearingRegistryId,accountId,status", + "confirmation": "id,status", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListUpdateAction", @@ -4764,6 +4764,10 @@ {"code": "accountType", "type": 12,"name": "Наименование типа счета","shortname": "Тип","link": "accountType","required": true,"visible": false } + , + {"code": "currency", + "type": 12,"name": "Код валюты","shortname": "Валюта","visible": true,"link": "currencyCode","linkCode": "code" + } ] } , @@ -6136,6 +6140,8 @@ "destination": "sessions", + "historyDestination": "history", + "class": "ru.clearing.classes.statics.data.misc.Session", "logUpdates": "true", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 43d9be490..5923015e0 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -997,11 +997,11 @@ - + - + @@ -1105,6 +1105,7 @@ + @@ -1413,7 +1414,7 @@ - + diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index 590401157..03c6f56b7 100644 --- a/clearing-parent/backend-api/src/test/resources/meta.json +++ b/clearing-parent/backend-api/src/test/resources/meta.json @@ -1,6 +1,6 @@ { - "version": "3.11.0.83", + "version": "3.11.0.86", "enums": { @@ -4303,7 +4303,7 @@ "name": "Добавление списка счетов ТКР", - "confirmation": "tradingClearingRegistryId,accountId,status", + "confirmation": "tradingClearingRegistryId,accountId", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListNewAction", @@ -4322,7 +4322,7 @@ "name": "Изменение списка счетов ТКР", - "confirmation": "tradingClearingRegistryId,accountId,status", + "confirmation": "id,status", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListUpdateAction", @@ -4764,6 +4764,10 @@ {"code": "accountType", "type": 12,"name": "Наименование типа счета","shortname": "Тип","link": "accountType","required": true,"visible": false } + , + {"code": "currency", + "type": 12,"name": "Код валюты","shortname": "Валюта","visible": true,"link": "currencyCode","linkCode": "code" + } ] } , @@ -6136,6 +6140,8 @@ "destination": "sessions", + "historyDestination": "history", + "class": "ru.clearing.classes.statics.data.misc.Session", "logUpdates": "true", diff --git a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.11.sql b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.11.sql index 3b31eb64a..53ce9c8c4 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.11.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.11.sql @@ -22,12 +22,12 @@ GRANT ALL PRIVILEGES ON TABLE CURRENCY_SETTLEMENT_TYPE_DICTIONARY TO clearing; -- currencyPair - Справочник валютных пар DROP TABLE IF EXISTS CURRENCY_PAIR_DICTIONARY; -CREATE TABLE CURRENCY_PAIR_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(25), BASE_CURRENCY_ID varchar(4), QUOTE_CURRENCY_ID varchar(4), MAJOR_SIGN varchar(4)); +CREATE TABLE CURRENCY_PAIR_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(25), BASE_CURRENCY varchar(4), QUOTE_CURRENCY varchar(4), MAJOR_SIGN varchar(4)); COMMENT ON TABLE CURRENCY_PAIR_DICTIONARY IS 'Справочник валютных пар'; COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.ID IS 'Идентификатор'; COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.CODE IS 'Код'; -COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.BASE_CURRENCY_ID IS 'Код валюты лота (linked to currencyCode)'; -COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.QUOTE_CURRENCY_ID IS 'Код сопряженной валюты (linked to currencyCode)'; +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.BASE_CURRENCY IS 'Код валюты лота (linked to currencyCode)'; +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.QUOTE_CURRENCY IS 'Код сопряженной валюты (linked to currencyCode)'; COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.MAJOR_SIGN IS 'Код признака конвертируемости валюты (linked to majorSign)'; GRANT ALL PRIVILEGES ON TABLE CURRENCY_PAIR_DICTIONARY TO clearing; @@ -65,7 +65,7 @@ GRANT ALL PRIVILEGES ON TABLE SETTLEMENT_HOUSE_PROPERTIES_HISTORY TO clearing; -- currencyPairSecurity - Инструменты валютного рынка DROP TABLE IF EXISTS CURRENCY_PAIR_SECURITY; -CREATE TABLE CURRENCY_PAIR_SECURITY(, CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +CREATE TABLE CURRENCY_PAIR_SECURITY(ID bigint PRIMARY KEY, CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp); COMMENT ON TABLE CURRENCY_PAIR_SECURITY IS 'Инструменты валютного рынка'; COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.CURRENCY_PAIR_ID IS 'Валютная пара (linked to currencyPair)'; COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.BASE_UNIT_SIZE IS 'Количество валюты лота'; @@ -81,7 +81,7 @@ GRANT ALL PRIVILEGES ON TABLE CURRENCY_PAIR_SECURITY TO clearing; -- History log of currencyPairSecurity - Инструменты валютного рынка DROP TABLE IF EXISTS CURRENCY_PAIR_SECURITY_HISTORY; -CREATE TABLE CURRENCY_PAIR_SECURITY_HISTORY(CURRENCY_PAIR_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), , CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +CREATE TABLE CURRENCY_PAIR_SECURITY_HISTORY(CURRENCY_PAIR_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp); COMMENT ON TABLE CURRENCY_PAIR_SECURITY_HISTORY IS 'История изменений таблицы currencyPairSecurity'; COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CURRENCY_PAIR_SECURITY_ID IS 'Идентификатор записи в таблице CURRENCY_PAIR_SECURITY'; COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java index 3ee258360..47bfb56d9 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java @@ -158,7 +158,7 @@ public class GatewayController { @ResponseBody public CommonResponse limits(@RequestBody LimitRequest request) { log.debug("Received message: {}", request); - notificationService.sendLimitNotification(request); + executor.submit(() -> notificationService.sendLimitNotification(request)); return createCommonResponse(request.getId()); } @@ -175,7 +175,10 @@ public class GatewayController { @ResponseBody public CommonResponse operations(@RequestBody OperationsRequest request) { log.debug("Received message: {}", request); - executor.submit(() -> operationService.checkAssetsAndSendMessage(request)); + executor.submit(() -> { + operationService.checkAssetsAndSendMessage(request); + notificationService.updateGatewayResultInMap(request); + }); return createCommonResponse(request.getId()); } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java index 0b7f95d91..87389b7e5 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java @@ -10,13 +10,16 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import ru.clearing.classes.statics.data.register.GatewayResult; import ru.spcex.clearing.gatewayapi.config.GatewayApiSettings; import ru.spcex.clearing.gatewayapi.config.InboundServerSettings; import ru.spcex.clearing.gatewayapi.controller.inbound.request.operations.SentAsset; import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.response.SuccessResponse; import ru.spcex.clearing.gatewayapi.enums.OutboundRequestType; +import ru.spcex.clearing.gatewayapi.service.builders.GatewayResultBuilder; import ru.spcex.clearing.gatewayapi.service.builders.OutboundRequestBuilder; +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.clearing.AssetOperationListRequest; @@ -32,6 +35,8 @@ import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.ReportType; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IEnumKey; import java.math.BigDecimal; @@ -47,6 +52,7 @@ public class GatewayService extends QueueConsumer implements InitializingBean { private final InboundServerSettings inboundServerSettings; private final Map> sentAssets; private final Map outboundRequestByUuid; + protected final Imdg gatewayResultImdg; private final static Pattern REPORT_FILE_NAME_PATTERN = Pattern.compile("(\\S*)_(\\d{15}).csv"); public GatewayService(Consumer kafkaQueue, @@ -55,13 +61,15 @@ public class GatewayService extends QueueConsumer implements InitializingBean { UserRoleVerification userRoleVerification, GatewayApiSettings gatewayApiSettings, @Qualifier("sentAssets") Map> sentAssets, - Map outboundRequestByUuid) { + Map outboundRequestByUuid, + ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.restTemplate = restTemplate; this.userRoleVerification = userRoleVerification; this.inboundServerSettings = gatewayApiSettings.getInboundServer(); this.sentAssets = sentAssets; this.outboundRequestByUuid = outboundRequestByUuid; + this.gatewayResultImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_GatewayResult, GatewayResult.class); } @Override @@ -121,6 +129,7 @@ public class GatewayService extends QueueConsumer implements InitializingBean { HttpEntity request = makeDefaultRequest(outboundFondRequest); outboundRequestByUuid.put(outboundFondRequest.getId(), outboundFondRequest); + gatewayResultImdg.insert(GatewayResultBuilder.builder().outboundRequest(outboundFondRequest).build()); ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, SuccessResponse.class); SuccessResponse bodyResponse = response.getBody(); if (bodyResponse != null) { @@ -181,7 +190,9 @@ public class GatewayService extends QueueConsumer implements InitializingBean { Long requestId = request.getId(); Collection assetOperations = request.getRequestPayload().getAssetOperationRequests(); List assets = new ArrayList<>(); + GatewayResultBuilder gatewayBuilder = GatewayResultBuilder.builder(); for (AssetOperationRequest assetOperation : assetOperations) { + gatewayBuilder.assetOperation(assetOperation); Map content = new HashMap<>() {{ put("direction", assetOperation.getDirection()); put("code", assetOperation.getCode()); @@ -199,10 +210,12 @@ public class GatewayService extends QueueConsumer implements InitializingBean { .type(OutboundRequestType.ASSET_OPERATION.getKey()) .content(content).build(); + gatewayBuilder.outboundRequest(outboundRequest); String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); HttpEntity r = makeDefaultRequest(outboundRequest); try { outboundRequestByUuid.put(outboundRequest.getId(), outboundRequest); + gatewayResultImdg.insert(gatewayBuilder.build()); ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, r, SuccessResponse.class); SuccessResponse bodyResponse = response.getBody(); if (bodyResponse != null) { diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java index 1d1e38fa2..157e85c4b 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java @@ -3,16 +3,24 @@ package ru.spcex.clearing.gatewayapi.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.register.GatewayResult; import ru.spcex.clearing.gatewayapi.controller.inbound.request.limit.LimitRequest; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.operations.OperationsRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.response.ErrorResponse; import ru.spcex.clearing.gatewayapi.enums.OutboundRequestType; +import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; 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.sender.KafkaSender; import ru.spcex.platform.enumeration.ObjectType; import ru.spcex.platform.enumeration.Priority; +import ru.spcex.platform.enumeration.ResultStatuses; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.UUID; @@ -23,12 +31,15 @@ public class NotificationService { private final KafkaSender kafkaSender; private final Map outboundRequestByUuid; - private final List supportedTypes = List.of(OutboundRequestType.FILL_LIMITS.getKey()); + protected final Imdg gatewayResultImdg; + private final List supportedTypes = List.of(OutboundRequestType.FILL_LIMITS.getKey(), OutboundRequestType.ASSET_OPERATION.getKey()); public NotificationService(KafkaSender kafkaSender, - Map outboundRequestByUuid) { + Map outboundRequestByUuid, + ImdgProvider imdgProvider) { this.kafkaSender = kafkaSender; this.outboundRequestByUuid = outboundRequestByUuid; + this.gatewayResultImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_GatewayResult, GatewayResult.class); } public void sendLimitNotification(LimitRequest request) { @@ -40,6 +51,9 @@ public class NotificationService { } log.info("Receive request: uuid = {}, file = {} with result = {} and sending section = {}.", request.getId(), request.getLogFile(), request.getResult(), outboundReq.getSection()); + + updateGatewayResultInMap(request); + newRequest.setObjectType(ObjectType.rgst.getKey()); newRequest.setComment(request.getDescription()); if (request.getResult() != null && request.getResult()) { @@ -53,14 +67,69 @@ public class NotificationService { kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newRequest); } + public void updateGatewayResultInMap(LimitRequest request) { + if (request.getId() == null || request.getResult() == null) { + log.warn("GatewayResult not found because LimitRequest not valid: {}", LogFormatter.toString(request)); + return; + } + GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", request.getId().toString())); + if (gatewayResult == null) { + log.warn("GatewayResult by requestId = {} not found in map", request.getId().toString()); + return; + } + gatewayResult.setUpdated(Instant.now()); + gatewayResult.setGatewayResultStatus(request.getResult() ? ResultStatuses.success.getKey() : ResultStatuses.notSuccess.getKey()); + gatewayResult.setResult(LogFormatter.toString(request)); + gatewayResultImdg.update(gatewayResult); + log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); + } + + public void updateGatewayResultInMap(OperationsRequest request) { + if (request.getId() == null || request.getResult() == null) { + log.warn("GatewayResult not found because OperationsRequest not valid: {}", LogFormatter.toString(request)); + return; + } + GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", request.getId().toString())); + if (gatewayResult == null) { + log.warn("GatewayResult by requestId = {} not found in map", request.getId().toString()); + return; + } + gatewayResult.setUpdated(Instant.now()); + gatewayResult.setGatewayResultStatus(request.getResult() ? ResultStatuses.success.getKey() : ResultStatuses.notSuccess.getKey()); + gatewayResult.setResult(LogFormatter.toString(request)); + gatewayResultImdg.update(gatewayResult); + log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); + } + + public void updateGatewayResultInMap(ErrorResponse response) { + if (response.getId() == null) { + log.warn("GatewayResult not found because OperationsRequest not valid: {}", LogFormatter.toString(response)); + return; + } + GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", response.getId().toString())); + if (gatewayResult == null) { + log.warn("GatewayResult by requestId = {} not found in map", response.getId().toString()); + return; + } + gatewayResult.setUpdated(Instant.now()); + gatewayResult.setGatewayResultStatus(ResultStatuses.notSuccess.getKey()); + gatewayResult.setResult(LogFormatter.toString(response)); + gatewayResultImdg.update(gatewayResult); + log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); + } + public void sendErrorNotification(ErrorResponse response, OutboundRequest request) { NotificationNewRequest newRequest = new NotificationNewRequest(); - log.info("Receive ErrorResponse: uuid = {}, file = {} and sending section = {}.", - response.getId(), request.getContent().get("file"), request.getSection()); + updateGatewayResultInMap(response); + if (OutboundRequestType.FILL_LIMITS.equalsByKey(request.getType()) && request.getContent() != null && request.getContent().size() > 0) + log.info("Receive ErrorResponse: uuid = {}, file = {}, sending type = {} and section = {}.", + response.getId(), request.getContent().get("file"), request.getType(), request.getSection()); + else + log.info("Receive ErrorResponse: uuid = {}, sending type = {} and section = {}.", response.getId(), request.getType(), request.getSection()); newRequest.setObjectType(ObjectType.rgst.getKey()); newRequest.setComment(response.getMessage()); newRequest.setPriority(Priority.HIGH.getKey()); - log.info("Sending notification to kafka: {}", newRequest); + log.info("Sending notification to kafka: {}", LogFormatter.toString(newRequest)); kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newRequest); } 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..1782a637b 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,16 +15,22 @@ 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 + // Для listing securityNewRequest.setMinStep(currencyInstrument.getMinStep()); securityNewRequest.setPrecision(currencyInstrument.getPrecision()); securityNewRequest.setLotSize(currencyInstrument.getLotSize()); + req.setTradeMode(currencyInstrument.getTradingMode()); + + // для currencyPairId + req.setLotCurrencyLetterCode(currencyInstrument.getLotCurrencyLetterCode()); + req.setMatchedCurrencyLetterCode(currencyInstrument.getMatchedCurrencyLetterCode()); req.setCurrencySecurityNewRequest(securityNewRequest); // req.setUuid(currencyInstrument.getInitiatorId() != null ? currencyInstrument.getInitiatorId().toString() : null); diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java new file mode 100644 index 000000000..4f7a77464 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java @@ -0,0 +1,95 @@ +package ru.spcex.clearing.gatewayapi.service.builders; + +import ru.clearing.classes.statics.data.register.GatewayResult; +import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; +import ru.spcex.clearing.gatewayapi.enums.OutboundRequestType; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRequest; +import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; +import ru.spcex.platform.enumeration.InOutDirection; +import ru.spcex.platform.enumeration.Section; + +import java.time.Instant; + +import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; + +public class GatewayResultBuilder { + + private String requestId; + private String nameRequest; + private String request; + private InOutDirection direction; + + private GatewayResultBuilder() { + } + + public static GatewayResultBuilder builder() { + return new GatewayResultBuilder(); + } + + public GatewayResultBuilder assetOperation(AssetOperationRequest assetOperation) { + this.direction = getEnumByKey(InOutDirection.class, assetOperation.getDirection()); + return this; + } + + public GatewayResultBuilder outboundRequest(OutboundRequest outboundRequest) { + this.request = LogFormatter.toString(outboundRequest); + this.requestId = outboundRequest.getId().toString(); + Section section = getEnumByKey(Section.class, outboundRequest.getSection()); + if (direction != null && OutboundRequestType.ASSET_OPERATION.equalsByKey(outboundRequest.getType())) + this.nameRequest = getNameReqByAsset(section, direction); + else if (OutboundRequestType.FILL_LIMITS.equalsByKey(outboundRequest.getType())) + this.nameRequest = getNameReqByLim(section); + return this; + } + + public GatewayResult build() { + GatewayResult outboundRequest = new GatewayResult(); + Instant now = Instant.now(); + outboundRequest.setCreated(now); + outboundRequest.setUpdated(now); + outboundRequest.setRequestId(requestId); + outboundRequest.setNameRequest(nameRequest); + outboundRequest.setRequest(request); + return outboundRequest; + } + + private String getNameReqByAsset(Section section, InOutDirection direction) { + String nameRequest; + if (InOutDirection.in.equals(direction)) { + if (Section.MKR.equals(section)) { + nameRequest = "Зачисление денежных средств"; + } else if (Section.FOND.equals(section)) { + nameRequest = "Зачисление ценных бумаг"; + } else if (Section.CURR.equals(section)) { + nameRequest = "Зачисление валютных средств"; + } else { + nameRequest = "Зачисление " + section.getKey(); + } + } else { + if (Section.MKR.equals(section)) { + nameRequest = "Списание денежных средств"; + } else if (Section.FOND.equals(section)) { + nameRequest = "Списание ценных бумаг"; + } else if (Section.CURR.equals(section)) { + nameRequest = "Списание валютных средств"; + } else { + nameRequest = "Списание " + section.getKey(); + } + } + return nameRequest; + } + + private String getNameReqByLim(Section section) { + String nameRequest; + if (Section.MKR.equals(section)) { + nameRequest = "Лимиты по денежным средствам"; + } else if (Section.FOND.equals(section)) { + nameRequest = "Лимиты по ценным бумагам"; + } else if (Section.CURR.equals(section)) { + nameRequest = "Лимиты по валютным средствам"; + } else { + nameRequest = "Лимиты по " + section.getKey(); + } + return nameRequest; + } +} 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/java/ru/spcex/clearing/gatewayapi/service/GatewayServiceTest.java b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/service/GatewayServiceTest.java index 5cb275a18..70390545d 100644 --- a/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/service/GatewayServiceTest.java +++ b/clearing-parent/gateway-api/src/test/java/ru/spcex/clearing/gatewayapi/service/GatewayServiceTest.java @@ -32,18 +32,23 @@ import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.response.ErrorResponse; import ru.spcex.clearing.gatewayapi.controller.outbound.response.SuccessResponse; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationListRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRequest; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.LimExportedRequest; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.enumeration.InOutDirection; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.imdg.api.ImdgProvider; import javax.annotation.PostConstruct; import java.io.ByteArrayOutputStream; import java.io.File; +import java.math.BigDecimal; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; @@ -61,6 +66,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. public class GatewayServiceTest { private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter(); public static final String LIMITS_URL = "/limits/"; + public static final String OPERATIONS_URL = "/operations/"; private MockRestServiceServer mockServer; @Autowired @@ -137,6 +143,36 @@ public class GatewayServiceTest { service.requestOnLimit(req); } + @Disabled//Для отладки + @Test + void requestOnAsset() throws Exception { + String message = "test response"; + BaseRequest req = new BaseRequest<>(); + AssetOperationListRequest reqP = new AssetOperationListRequest(); + AssetOperationRequest reqI = new AssetOperationRequest(); + req.setId(1L); + reqP.setAssetOperationRequests(List.of(reqI)); + req.setRequestPayload(reqP); + reqI.setAmount(BigDecimal.ONE); + reqI.setDirection(InOutDirection.in.getKey()); + AtomicReference uuid = prepareMockServerResponse(HttpStatus.OK, message); + service.requestOnAsset(req); + LimitRequest request = new LimitRequest(); + request.setId(uuid.get()); + request.setResult(true); + request.setDescription(message); + MvcResult mvcResult = perform(MockMvcRequestBuilders.post(OPERATIONS_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(request))) + .andDo(print())//output to the log request and response + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) + .andReturn(); + + uuid = prepareMockServerResponse(HttpStatus.BAD_REQUEST, message); + service.requestOnAsset(req); + } + public AtomicReference prepareMockServerResponse(HttpStatus responseStatus, String message) { mockServer.reset(); @@ -145,7 +181,7 @@ public class GatewayServiceTest { ResponseCreator responseCreator = r -> { String reqBody = StreamUtils.copyToString((ByteArrayOutputStream) r.getBody(), Charset.defaultCharset()); OutboundRequest request = mapper.readValue(reqBody, OutboundRequest.class); - if (HttpStatus.BAD_REQUEST.equals(responseStatus)){ + if (HttpStatus.BAD_REQUEST.equals(responseStatus)) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setId(request.getId()); errorResponse.setMessage(message); 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/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/index/SearchProxySession.java b/clearing-parent/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/index/SearchProxySession.java new file mode 100644 index 000000000..755783efe --- /dev/null +++ b/clearing-parent/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/index/SearchProxySession.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.historyimdg.index; + +import ru.spcex.clearing.historyimdg.index.field.SearchWithClearingDate; + +import java.time.LocalDate; + +public class SearchProxySession extends SearchProxy implements SearchWithClearingDate { + /** + * clearing_date или created_at + */ + private LocalDate clearingDate; + + @Override + public LocalDate getClearingDate() { + return clearingDate; + } + + @Override + public void setClearingDate(LocalDate clearingDate) { + this.clearingDate = clearingDate; + } +} diff --git a/clearing-parent/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/mapstores/SearchSessionMapStore.java b/clearing-parent/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/mapstores/SearchSessionMapStore.java new file mode 100644 index 000000000..ffc8051cf --- /dev/null +++ b/clearing-parent/imdg-hist/src/main/java/ru/spcex/clearing/historyimdg/mapstores/SearchSessionMapStore.java @@ -0,0 +1,53 @@ +package ru.spcex.clearing.historyimdg.mapstores; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.historyimdg.index.SearchProxySession; +import ru.spcex.clearing.imdg.IMDGDistributedNames; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +@Component +public class SearchSessionMapStore extends AbstractSliceMapLoader { + public SearchSessionMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + @Override + protected String getTableName() { + return "session"; + } + + @Override + protected String fieldOfDay() { + return "clearing_date"; // or "created_at" ; + } + + @Override + public Collection load(Collection keys) { + Map> paramMap = Collections.singletonMap("ids", keys); + return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, + (rs, rowNum) -> { + SearchProxySession proxyFond = new SearchProxySession(); + proxyFond.setId(rs.getObject("id", Long.class)); + LocalDate date = getLocalDateFromSqlDate(rs, "clearing_date"); + if (date == null) + date = getLocalDateFromSqlDate(rs, "created_at"); + proxyFond.setClearingDate(date); + return proxyFond; + }); + } + + @Override + public String getMapName() { + return IMDGDistributedNames.Map_SearchSession; + } + + @Override + public String[] getIndexingField() { + return new String[]{"clearingDate"}; + } +} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java index 76416ccfc..2566cf8f9 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/UpdateMapService.java @@ -65,10 +65,10 @@ public class UpdateMapService extends AbstractUpdateMapService { hazelcastServerInstance.getMap(IMDGDistributedNames.Map_Session).addLocalEntryListener(this, Predicates.alwaysTrue(), true); hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistry).addLocalEntryListener(this, Predicates.alwaysTrue(), true); hazelcastServerInstance.getMap(IMDGDistributedNames.Map_AccountSymbols).addLocalEntryListener(this, Predicates.alwaysTrue(), true); - hazelcastServerInstance.getMap(IMDGDistributedNames.Map_CurrencyPairSecurityHistory).addLocalEntryListener(this, Predicates.alwaysTrue(), true); - hazelcastServerInstance.getMap(IMDGDistributedNames.Map_ExecutionCurrencyHistory).addLocalEntryListener(this, Predicates.alwaysTrue(), true); - hazelcastServerInstance.getMap(IMDGDistributedNames.Map_SettlementHousePropertiesHistory).addLocalEntryListener(this, Predicates.alwaysTrue(), true); - hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistryListHistory).addLocalEntryListener(this, Predicates.alwaysTrue(), true); + hazelcastServerInstance.getMap(IMDGDistributedNames.Map_CurrencyPairSecurity).addLocalEntryListener(this, Predicates.alwaysTrue(), true); + hazelcastServerInstance.getMap(IMDGDistributedNames.Map_ExecutionCurrency).addLocalEntryListener(this, Predicates.alwaysTrue(), true); + hazelcastServerInstance.getMap(IMDGDistributedNames.Map_SettlementHouseProperties).addLocalEntryListener(this, Predicates.alwaysTrue(), true); + hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistryList).addLocalEntryListener(this, Predicates.alwaysTrue(), true); } @Override 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..e43786e2d 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,27 +16,27 @@ 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; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.InstrumentType; -import ru.spcex.platform.enumeration.UserRole; -import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -53,11 +53,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 +99,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 +133,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 +187,97 @@ 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; + Long securityId = 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); + } + securityId = security.getId(); + + + { + ListingNewRequest listingReq = new ListingNewRequest(); + listingReq.setSecurityId(securityId); + listingReq.setMarket(req.getTradeMode()); + listingReq.setLotSize(currencyPairRequest.getLotSize()); + listingReq.setSymbolCode(currencyPairRequest.getSecuritySymbol()); + listingReq.setMinStep(currencyPairRequest.getMinStep()); + listingReq.setPrecision(currencyPairRequest.getPrecision()); + listingReq.setSymbolName(security.getFullName()); + listingReq.setTradingCurrency(CurrencyCode.RUB.getKey()); + Listing existListing = findListing(listingReq); + if (existListing == null) { + log.trace("For currency pair security[{}] do new Listing", securityId); + Listing listing = listingService.newListing0(listingReq); + log.debug("New listing.id={}", listing.getId()); + } else { + log.trace("For currency pair security[{}] do update Listing[{}]", securityId, existListing.getId()); + ListingUpdateRequest partUpdateRequest = toUpdateRequest(existListing, listingReq); + Listing listing = listingService.updateListing0(partUpdateRequest); + log.debug("Has updated listing.id={}", listing.getId()); + } + } + } 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()); + } + } + + if (security == null) { + log.error("No new or update security."); + } else { + log.debug("Use security {}.id={} ({} {})", security.getClass().getSimpleName(), securityId, security.getInstrumentType(), security.getShortName()); + } + + log.debug("successfully processed, request id {}", + baseRequest.getId()); + return null; // default success + } + private RequestInfoUpdate newSecurities(BaseRequest baseRequest) { log.debug("SecurityFondGatewayRequest id={} received", baseRequest.getId()); SecurityFondGatewayRequest req = (SecurityFondGatewayRequest) baseRequest.getRequestPayload(); @@ -237,26 +332,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) { @@ -460,6 +536,8 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin updateRequest.setWorkflowStatus(newRequest.getWorkflowStatus()); updateRequest.setSymbolCode(newRequest.getSymbolCode()); updateRequest.setSymbolName(newRequest.getSymbolName()); + updateRequest.setMinStep(newRequest.getMinStep()); + updateRequest.setPrecision(newRequest.getPrecision()); return updateRequest; } @@ -536,4 +614,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/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java index 1ba0cd4e8..3840fe586 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java @@ -125,6 +125,8 @@ public class ListingService extends QueueConsumer implements InitializingBean { } else { listing.setWorkflowStatus(req.getWorkflowStatus()); } + listing.setMinStep(req.getMinStep()); + listing.setPrecision(req.getPrecision()); listingImdg.insert(listing); return listing; @@ -163,6 +165,8 @@ public class ListingService extends QueueConsumer implements InitializingBean { if (StringUtils.isNotEmpty(req.getWorkflowStatus())) { listing.setWorkflowStatus(req.getWorkflowStatus()); } + if (req.getMinStep() != null) listing.setMinStep(req.getMinStep()); + if (req.getPrecision() != null) listing.setPrecision(req.getPrecision()); listingImdg.update(listing); return listing; diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java index fef559a7f..12a1ff431 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java @@ -45,6 +45,11 @@ public class ImdgPredicateBuilderHazelcast implements ImdgPredicateBuilder { return new ImdgPredicateHazelcast(Predicates.not(Predicates.equal(key, null))); } + @Override + public ImdgPredicate isNull(String key) { + return new ImdgPredicateHazelcast(Predicates.equal(key, null)); + } + @Override public ImdgPredicate in(String key, Comparable[] values) { return new ImdgPredicateHazelcast(Predicates.in(key, values)); diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java index aa00b217f..0249ad7b1 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java @@ -223,6 +223,7 @@ public final class IMDGDistributedNames { public static final String Map_SearchExcludeLiabilitiesRegister = "Map_SearchExcludeLiabilitiesRegister"; public static final String Map_SearchLiabilitiesRegister = "Map_SearchLiabilitiesRegister"; public static final String Map_SearchExecutionRegister = "Map_SearchExecutionRegister"; + public static final String Map_SearchSession = "Map_SearchSession"; public static final String MAP_SEQUENCE_NAME = "MAP_SEQUENCE_NAME"; private IMDGDistributedNames() { diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java index bee080b38..4bd78cb41 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java @@ -7,6 +7,7 @@ public interface ImdgPredicateBuilder { ImdgPredicate greater(String key, Comparable value); ImdgPredicate less(String key, Comparable value); ImdgPredicate notNull(String key); + ImdgPredicate isNull(String key); ImdgPredicate in(String key, Comparable... values); diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/sql/ImdgPredicateBuilderSqlMock.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/sql/ImdgPredicateBuilderSqlMock.java index 5f7d50716..c24137c29 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/sql/ImdgPredicateBuilderSqlMock.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/sql/ImdgPredicateBuilderSqlMock.java @@ -47,6 +47,11 @@ public class ImdgPredicateBuilderSqlMock implements ImdgPredicateBuilder { return new SimpleSQLPredicate(key + " is not null"); } + @Override + public ImdgPredicate isNull(String key) { + return new SimpleSQLPredicate(key + " is null"); + } + @Override public ImdgPredicate in(String key, Comparable[] values) { String enumiration = Arrays.stream(values).map(this::escape).collect(Collectors.joining(", ")); 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/account/AccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java index 374e4b980..8792b191a 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java @@ -2,45 +2,6 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountNewRequest { - @JsonProperty - public Long companyId; - @JsonProperty - public String account; - @JsonProperty - public String status; - @JsonProperty - public String accountType; - - public Long getCompanyId() { - return companyId; - } - - public void setCompanyId(Long companyId) { - this.companyId = companyId; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getAccountType() { - return accountType; - } - - public void setAccountType(String accountType) { - this.accountType = accountType; - } +@Deprecated +public class AccountNewRequest extends CorrespondentAccountNewRequest { } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java index a3e5406e1..f68a8f6ad 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java @@ -2,55 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountUpdateRequest { - @JsonProperty - public Long id; - @JsonProperty - public Long companyId; - @JsonProperty - public String account; - @JsonProperty - public String status; - @JsonProperty - public String accountType; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Long getCompanyId() { - return companyId; - } - - public void setCompanyId(Long companyId) { - this.companyId = companyId; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getAccountType() { - return accountType; - } - - public void setAccountType(String accountType) { - this.accountType = accountType; - } +@Deprecated +public class AccountUpdateRequest extends CorrespondentAccountUpdateRequest{ } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java index dc33c7dbe..d27ab05a0 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java @@ -15,6 +15,9 @@ public class CorrespondentAccountNewRequest { @JsonProperty public String accountType; + @JsonProperty + public String currency; + public Long getCompanyId() { return companyId; } @@ -46,4 +49,12 @@ public class CorrespondentAccountNewRequest { public void setAccountType(String accountType) { this.accountType = accountType; } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java index 045cc8ebf..b1997fc06 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java @@ -12,6 +12,9 @@ public class InformationAccountNewRequest { @JsonProperty private String status; + @JsonProperty + private String currency; + @JsonProperty private String accountType; @@ -39,6 +42,14 @@ public class InformationAccountNewRequest { this.status = status; } + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + public String getAccountType() { return accountType; } 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/securitites/ListingNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingNewRequest.java index e410563a7..78f50f8ee 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingNewRequest.java @@ -19,6 +19,10 @@ public class ListingNewRequest { private String symbolCode; @JsonProperty private String symbolName; + @JsonProperty + private BigDecimal minStep; + @JsonProperty + private BigDecimal precision; public Long getSecurityId() { return securityId; @@ -75,4 +79,20 @@ public class ListingNewRequest { public void setSymbolName(String symbolName) { this.symbolName = symbolName; } + + public BigDecimal getMinStep() { + return minStep; + } + + public void setMinStep(BigDecimal minStep) { + this.minStep = minStep; + } + + public BigDecimal getPrecision() { + return precision; + } + + public void setPrecision(BigDecimal precision) { + this.precision = precision; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingUpdateRequest.java index c8e7ccc24..8b7a9edff 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/ListingUpdateRequest.java @@ -22,6 +22,10 @@ public class ListingUpdateRequest implements WithId { private String symbolCode; @JsonProperty private String symbolName; + @JsonProperty + private BigDecimal minStep; + @JsonProperty + private BigDecimal precision; @Override public Long getId() { @@ -87,4 +91,20 @@ public class ListingUpdateRequest implements WithId { public void setSymbolName(String symbolName) { this.symbolName = symbolName; } + + public BigDecimal getMinStep() { + return minStep; + } + + public void setMinStep(BigDecimal minStep) { + this.minStep = minStep; + } + + public BigDecimal getPrecision() { + return precision; + } + + public void setPrecision(BigDecimal precision) { + this.precision = precision; + } } 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..214b59d86 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,16 @@ 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 tradeMode; + @JsonProperty + private String lotCurrencyLetterCode; + @JsonProperty + private String matchedCurrencyLetterCode; public CurrencyPairSecurityNewRequest getCurrencySecurityNewRequest() { return currencySecurityNewRequest; @@ -23,4 +21,28 @@ public class CurrencyPairSecurityNewGatewayRequest { public void setCurrencySecurityNewRequest(CurrencyPairSecurityNewRequest currencySecurityNewRequest) { this.currencySecurityNewRequest = currencySecurityNewRequest; } + + public String getTradeMode() { + return tradeMode; + } + + public void setTradeMode(String tradeMode) { + this.tradeMode = tradeMode; + } + + 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; + } }