diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TrkCreationResult.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TrkCreationResult.java new file mode 100644 index 000000000..3812cc54c --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TrkCreationResult.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.account.model; + +import ru.clearing.classes.statics.data.account.ClientCode; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; + +public record TrkCreationResult(ClientCode clientCode, TradingClearingRegistry tradingClearingRegistry) { +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java index 9ab1f9844..8bd5c738a 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; @@ -19,7 +20,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.enumeration.TradingClearingRegistryType; import ru.spcex.platform.imdg.api.Imdg; @@ -29,9 +32,21 @@ import ru.spcex.platform.imdg.api.ImdgProvider; public class GatewayRequestCreator { private final Logger log = LoggerFactory.getLogger(getClass()); private final ImdgProvider imdgProvider; + private final Imdg companyImdg; + private final Imdg companySymbolsImdg; + private final Imdg clientCodeImdg; + private final Imdg accountImdg; + private final Imdg accountSymbolsImdg; + private final Imdg tradingClearingRegistryListImdg; public GatewayRequestCreator(ImdgProvider imdgProvider) { this.imdgProvider = imdgProvider; + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class); + this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); } public Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional errorMsg) { @@ -48,16 +63,9 @@ public class GatewayRequestCreator { return tkr; } - public Tkr createTkrGatewayReq(TradingClearingRegistry tradingClearingRegistry) { + public Optional createTkrGatewayReq(TradingClearingRegistry tradingClearingRegistry) { Tkr tkr = new Tkr(); log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode()); - Imdg companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - Imdg companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - Imdg clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); - Imdg accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - Imdg tradingClearingRegistryListImdg = imdgProvider. - getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); - Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId()); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues( Map.of( @@ -65,7 +73,10 @@ public class GatewayRequestCreator { "companyId", company.getId() ) ); - + if (companySymbols == null) { + log.warn("CompanySymbols is null, searched by company.id: {}, skip this tkr", company.getId()); + return Optional.empty(); + } ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues( Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId()) ); @@ -88,9 +99,11 @@ public class GatewayRequestCreator { } tkr.setAccountTypeName(accountType); if (tradingClearingRegistry.getDepoAccountId() != null) { - Account depoAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getDepoAccountId()); - if (depoAccount != null) { - tkr.setDepoAccount(depoAccount.getAccount()); + AccountSymbols depoAccountSymbol = accountSymbolsImdg.getFirstObjectByFieldValues( + Map.of("accountId", tradingClearingRegistry.getDepoAccountId()) + ); + if (depoAccountSymbol != null) { + tkr.setDepoAccount(depoAccountSymbol.getAccountSymbolValue()); } } { @@ -99,6 +112,7 @@ public class GatewayRequestCreator { MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); moneyAccountMsg.setAccount(moneyAccount.getAccount()); moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB"); + getEksAccount(moneyAccount).ifPresent(moneyAccountMsg::setEksAccount); moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus())); tkr.getMoneyAccounts().add(moneyAccountMsg); } @@ -113,12 +127,29 @@ public class GatewayRequestCreator { Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId()); MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); moneyAccountMsg.setAccount(additionalAcc.getAccount()); + getEksAccount(additionalAcc).ifPresent(moneyAccountMsg::setEksAccount); moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB"); moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus())); tkr.getMoneyAccounts().add(moneyAccountMsg); } } - return tkr; + return Optional.of(tkr); + } + + private Optional getEksAccount(Account account) { + if (AccountType.Info.equalsByKey(account.getAccountType())) { + String currency = StringUtils.hasText(account.getCurrency()) ? account.getCurrency() : CurrencyCode.RUB.getKey(); + Account anltAcc = accountImdg.getFirstObjectByFieldValues( + Map.of( + "currency", currency, + "accountType", AccountType.Anlt.getKey() + ) + ); + if (anltAcc != null) { + return Optional.of(anltAcc.getAccount()); + } + } + return Optional.empty(); } private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java index dcab2fce2..cfca09ca2 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.model.TrkCreationResult; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; @@ -41,7 +42,7 @@ public class ClientCodeFacade implements IClearingFacade { /** * Создает clientCode, TCR и опционально TCRList, если указаны валюты. */ - public void createClientCodeWithTkr(ClientCodeNewRequest request, IValidator validator, boolean isClearingAcc) { + public TrkCreationResult createClientCodeWithTkr(ClientCodeNewRequest request, IValidator validator, boolean isClearingAcc) { log.trace("Start process creating new client code"); TradingClearingRegistry tradingClearingRegistry; { @@ -62,9 +63,10 @@ public class ClientCodeFacade implements IClearingFacade { } } + ClientCode clientCode; { ImdgPredicateBuilder predicateBuilder = clientCodeImdg.predicateBuilder(); - ClientCode clientCode = clientCodeImdg.getFirstObjectByPredicate( + clientCode = clientCodeImdg.getFirstObjectByPredicate( predicateBuilder.and( predicateBuilder.equals("companyId", request.getCompanyId()), predicateBuilder.equals("code", request.getCode()), @@ -85,6 +87,7 @@ public class ClientCodeFacade implements IClearingFacade { log.debug("successfully processed, new clientCode id {}", clientCode.getId()); } } + return new TrkCreationResult(clientCode, tradingClearingRegistry); } public void createClientCode(ClientCodeNewRequest request) { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java index 6591a865d..53c15e5a2 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java @@ -17,6 +17,7 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.DepoAccount; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.model.TrkCreationResult; import ru.spcex.clearing.account.model.ValidationResult; import ru.spcex.clearing.account.service.TradingClearingRegistryService; import ru.spcex.clearing.account.service.v2.GatewayRequestCreator; @@ -131,15 +132,12 @@ public class ClientCodeMessageListener extends QueueConsumer implements Initiali kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); return null; } - processEksAccount(eksAccountsAfterValidation, gatewayRequest); + processEksAccount(eksAccountsAfterValidation, sendTkrRequest); kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); return null; } - private void processEksAccount(Map accountsAfterValidation, TkrAccountsGatewayRequest gatewayRequest) { - SendTkrRequest sendTkrRequest = new SendTkrRequest(); - sendTkrRequest.setRequestId(gatewayRequest.getRequestId()); - + private void processEksAccount(Map accountsAfterValidation, SendTkrRequest tkrRequest) { for (Map.Entry entry : accountsAfterValidation.entrySet()) { TkrAccount tkrAccount = entry.getKey(); ValidationResult validationResult = entry.getValue(); @@ -176,7 +174,9 @@ public class ClientCodeMessageListener extends QueueConsumer implements Initiali clientCodeNewRequest.setMoneyAccountId(rubMoneyAcc); clientCodeNewRequest.setDepoAccountId(depoAccountId); clientCodeNewRequest.setCurrencyAccountList(accIds); - clientCodeFacade.createClientCodeWithTkr(clientCodeNewRequest, validator, false); + TrkCreationResult result = clientCodeFacade.createClientCodeWithTkr(clientCodeNewRequest, validator, false); + Optional tkrReq = gatewayRequestCreator.createTkrGatewayReq(result.tradingClearingRegistry()); + tkrReq.ifPresent(tkr -> tkrRequest.getTkrs().add(tkr)); } }