diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java index c8285e6ec..8f2c1770e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java @@ -1,40 +1,29 @@ package ru.spcex.clearing.account.config.validation; -import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.errors.AccountError; -import ru.spcex.clearing.account.validation.ClientCodeStoreObjects; +import ru.spcex.clearing.account.validation.BackendClientCodeValidationRule; +import ru.spcex.clearing.account.validation.GatewayClientCodeValidationRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.enumeration.CurrencyCode; -import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -50,6 +39,7 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); + addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl<>(context, FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty), @@ -80,11 +70,9 @@ public class ClientCodeValidationConfig { acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) ? null : AccountError.AccountNotFound ), - new ExistAllCurrencyAccountId<>("currencyAccountList", - ClientCodeNewRequest::getCurrencyAccountList - ), - - DictionaryPresentRule.instance("stauts", + BackendClientCodeValidationRule.AllAccountsPresent, + BackendClientCodeValidationRule.TcrIsNotPresentByAccount, + DictionaryPresentRule.instance("status", ClientCodeNewRequest::getStatus, IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class, @@ -106,7 +94,7 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); - return new ValidatorImpl>(context, + return new ValidatorImpl<>(context, IdPresentRule.instance("id", ClientCodeUpdateRequest::getId, IMDGDistributedNames.Map_ClientCode, @@ -143,10 +131,7 @@ public class ClientCodeValidationConfig { acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) ? null : AccountError.AccountNotFound ), - new ExistAllCurrencyAccountId<>("currencyAccountList", - ClientCodeUpdateRequest::getCurrencyAccountList - ), - + BackendClientCodeValidationRule.AllAccountsPresent, DictionaryPresentRule.instance("stauts", ClientCodeUpdateRequest::getStatus, IMDGDistributedNames.Map_ServiceStatusDictionary, @@ -166,7 +151,6 @@ public class ClientCodeValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_ClientCode); return new ValidatorImpl<>(context, -// FieldRequiredRule.instance("id", CommonDeleteRequest::getId, CompanyErrors.RequiredFieldEmpty), IdPresentRule.instance("id", CommonDeleteRequest::getId, IMDGDistributedNames.Map_ClientCode, @@ -189,208 +173,12 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); return new ValidatorImpl<>(context, FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty), - new ExistCompanyByTradingCode<>("trading_code", - TkrAccount::getTradingCode), - new ExistAccountByValue<>("money_account", - TkrAccount::getMoneyAccounts), - new ExistDepoAccountByValue<>("depo_account", - TkrAccount::getDepoAccount), - new ExistTcrByCode<>("tcr_code") + GatewayClientCodeValidationRule.CompanyPresent, + GatewayClientCodeValidationRule.AllAccountsPresent, + GatewayClientCodeValidationRule.DepoAccountsPresent, + GatewayClientCodeValidationRule.TcrIsNotPresent ); }; } - public static class ExistAllCurrencyAccountId implements IValidationRule> { - String fieldName; - Function> idGetter; - - public ExistAllCurrencyAccountId(String fieldName, Function> idGetter) { - this.fieldName = fieldName; - this.idGetter = idGetter; - } - - @Override - public Optional validate(ImdgValidationContext context) { - R validatedObject = context.getValidatedObject(); - List ids = idGetter.apply(validatedObject); - if (ids == null || ids.isEmpty()) { - return empty(); // необязательное поле - } - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - for (Long id : ids) { - if (id == null) { // null значения в массиве не ожидаются - return of(AccountError.RequiredFieldEmpty, fieldName); - } - Account byIdObject = imdg.getSingleObjectByID(id); - if (byIdObject == null) - return of(AccountError.AccountNotFound, id, fieldName); - } - - return empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } - - public static class ExistTcrByCode implements IValidationRule> { - String fieldName; - - public ExistTcrByCode(String fieldName) { - this.fieldName = fieldName; - } - - @Override - public Optional validate(ImdgValidationContext context) { - Map accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS); - Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey()); - if (moneyAccount == null) { - return of(AccountError.AccountNotFound, fieldName); - } - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, - TradingClearingRegistry.class); - - TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues( - Map.of( - "moneyAccountId", moneyAccount.getId(), - "status", Status.Active.getKey() - ) - ); - if (tcr != null) { - return of(AccountError.TCR_ALREADY_EXIST_GTW, fieldName); - } - return Optional.empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } - - public static class ExistCompanyByTradingCode implements IValidationRule> { - String fieldName; - Function tradingCodeGetter; - - public ExistCompanyByTradingCode(String fieldName, Function tradingCodeGetter) { - this.fieldName = fieldName; - this.tradingCodeGetter = tradingCodeGetter; - } - - @Override - public Optional validate(ImdgValidationContext context) { - R validatedObject = context.getValidatedObject(); - Long tradingCode = tradingCodeGetter.apply(validatedObject); - if (tradingCode == null) { - return of(AccountError.RequiredFieldEmpty, fieldName); - } - - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company company = companyImdg.getFirstObjectByFieldValues( - Map.of("trading_code", String.valueOf(tradingCode)) - ); - if (company == null) { - return of(AccountError.COMPANY_NOT_FOUND_GTW, fieldName); - } - - context.storeObject(ClientCodeStoreObjects.COMPANY, company); - return Optional.empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } - - public static class ExistAccountByValue implements IValidationRule> { - String fieldName; - Function> accountsListValueGetter; - - public ExistAccountByValue(String fieldName, Function> accountsListValueGetter) { - this.fieldName = fieldName; - this.accountsListValueGetter = accountsListValueGetter; - } - - @Override - public Optional validate(ImdgValidationContext context) { - R validatedObject = context.getValidatedObject(); - List accountList = accountsListValueGetter.apply(validatedObject); - if (accountList == null || accountList.isEmpty()) { - return of(AccountError.RequiredFieldEmpty, fieldName); - } - List currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList(); - if (!currencies.contains(CurrencyCode.RUB.getKey())) { - return of(AccountError.RequiredFieldEmpty, fieldName); - } - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Map accountByCurrency = new HashMap<>(); - for (MoneyAccountMsgRequest moneyAccountMsg : accountList) { - ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder(); - ImdgPredicate currencyPredicate; - ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount()); - if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) { - currencyPredicate = predicateBuilder.or( - predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()), - predicateBuilder.isNull("currency") - ); - } else { - currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode()); - } - Account account = imdg.getFirstObjectByPredicate( - predicateBuilder.and(accountPredicate, currencyPredicate) - ); - if (account == null) { - return of(AccountError.ACCOUNT_NOT_FOUND_GTW, moneyAccountMsg.getAccount(), fieldName); - } - accountByCurrency.put(account.getCurrency(), account); - } - context.storeObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS, accountByCurrency); - return Optional.empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } - - public static class ExistDepoAccountByValue implements IValidationRule> { - String fieldName; - Function depoAccountGetter; - - public ExistDepoAccountByValue(String fieldName, Function depoAccountGetter) { - this.fieldName = fieldName; - this.depoAccountGetter = depoAccountGetter; - } - - @Override - public Optional validate(ImdgValidationContext context) { - R validatedObject = context.getValidatedObject(); - String depoAccountVal = depoAccountGetter.apply(validatedObject); - if (!StringUtils.hasText(depoAccountVal)) { - context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT,Optional.empty()); - return empty(); - } - - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account depoAccount = imdg.getFirstObjectByFieldValues( - Map.of("account", depoAccountVal) - ); - if (depoAccount == null) { - context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT,Optional.empty()); - return of(AccountError.DEPO_ACCOUNT_NOT_FOUND_GTW, fieldName); - } - - context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, depoAccount); - return Optional.empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java index 034b52630..47031a218 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -31,6 +31,7 @@ public enum AccountError implements IErrorEnumId { COMPANY_NOT_FOUND_GTW(5030L), TCR_ALREADY_EXIST_GTW(5031L), DEPO_ACCOUNT_NOT_FOUND_GTW(5032L), + TCR_LIST_ALREADY_EXIST_GTW(5033L), TradingClearingRegistryNotFound(3022L), CurrencyNotFound(1016L), ; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java new file mode 100644 index 000000000..825f75c89 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.account.model; + +import java.util.List; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.platform.enumeration.Status; + +public class ClientCodeBusiness { + private Status code; + private Company company; + private Account moneyAccount; + private Account depoAccount; + private List currentAccounts; + private TradingClearingRegistry tradingClearingRegistry; + private Status status; + + public ClientCodeBusiness(Status code, + Company company, Account moneyAccount, Account depoAccount, List currentAccounts, TradingClearingRegistry tradingClearingRegistry, Status status) { + this.code = code; + this.company = company; + this.moneyAccount = moneyAccount; + this.depoAccount = depoAccount; + this.currentAccounts = currentAccounts; + this.tradingClearingRegistry = tradingClearingRegistry; + this.status = status; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java new file mode 100644 index 000000000..fb5c6b7ea --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.account.model; + +import java.util.Optional; +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.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; + +public class TradingClearingRegistryBusiness { + private Company company; + private Account moneyAccount; + private Status status; + private Optional depoAccount; + private Optional tradingClearingRegistryType; + + private TradingClearingRegistryBusiness() { + this.depoAccount = Optional.empty(); + this.tradingClearingRegistryType = Optional.empty(); + } + + public static TradingClearingRegistryBusiness builder() { + return new TradingClearingRegistryBusiness(); + } + + public TradingClearingRegistryBusiness company(Company company) { + this.company = company; + return this; + } + + public TradingClearingRegistryBusiness moneyAccount(Account moneyAccount) { + this.moneyAccount = moneyAccount; + return this; + } + + public TradingClearingRegistryBusiness depoAccount(DepoAccount depoAccount) { + this.depoAccount = Optional.of(depoAccount); + return this; + } + + public TradingClearingRegistryBusiness status(Status status) { + this.status = status; + return this; + } + public TradingClearingRegistryBusiness tradingClearingRegistryType(TradingClearingRegistryType type) { + this.tradingClearingRegistryType = Optional.of(type); + return this; + } + + public TradingClearingRegistryBusiness build() { + TradingClearingRegistryBusiness tradingClearingRegistryBusiness = new TradingClearingRegistryBusiness(); + tradingClearingRegistryBusiness.company = this.company; + tradingClearingRegistryBusiness.status = this.status; + tradingClearingRegistryBusiness.depoAccount = this.depoAccount; + tradingClearingRegistryBusiness.moneyAccount = this.moneyAccount; + tradingClearingRegistryBusiness.tradingClearingRegistryType = this.tradingClearingRegistryType; + return tradingClearingRegistryBusiness; + } + + public Company getCompany() { + return company; + } + + public Account getMoneyAccount() { + return moneyAccount; + } + + public Optional getDepoAccount() { + return depoAccount; + } + + public Status getStatus() { + return status; + } + + public Optional getTradingClearingRegistryType() { + return tradingClearingRegistryType; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java index a6457c252..e49dc9e21 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java @@ -9,7 +9,6 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.function.Function; -import java.util.stream.Collectors; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -21,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ConfigurableApplicationContext; 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.ClientCode; import ru.clearing.classes.statics.data.company.CompanySymbols; @@ -34,11 +32,9 @@ 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.account.ClientCodeUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; -import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; 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.SendTkrRequest; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest; @@ -52,16 +48,11 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; 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.CompanySymbol; -import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.TradingClearingRegistryType; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; @@ -131,9 +122,9 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean public void afterPropertiesSet() { imdgProvider.waitAvailable(); - callback(ClientCodeNewRequest.class) - .setFunction(this::clientCodeNew) - .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); +// callback(ClientCodeNewRequest.class) +// .setFunction(this::clientCodeNew) +// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); //note переехало в ClientCodeMessageListener[новая версия сервиса] // callback(TkrAccountsGatewayRequest.class) // .setFunction(this::clientCodeNewFromGateway) @@ -181,109 +172,6 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean return null; } - protected RequestInfoUpdate clientCodeNew(BaseRequest userRequest) { - return clientCodeNew0(userRequest, false); - } - - protected RequestInfoUpdate clientCodeNewFromGateway(BaseRequest tkrRequest) { - TkrAccountsGatewayRequest tkr = tkrRequest.getRequestPayload(); - RequestInfoUpdate requestInfoUpdate = null; - Tkr errorTkr = null; - List successTkr = new ArrayList<>(); - //Сначала нужно проверить на валидности все присланные счета на добавление - for (TkrAccount tkrAccount : tkr.getAccounts()) { - BaseRequest requestForValidation = new BaseRequest(); - requestForValidation.setRequestPayload(tkrAccount); - requestInfoUpdate = validationHelper.validateTillFirstError(requestForValidation, - tkrAccountsGatewayValidator); - if (requestInfoUpdate != null) { - errorTkr = crateErrorTkrToGateway(tkrAccount, Optional.of(requestInfoUpdate.getMessage())); - errorTkr.setMoneyAccounts(tkrAccount.getMoneyAccounts().stream() - .map(this::convertAccountToResponse) - .collect(Collectors.toList())); - break; - } - Tkr tkrToGateway = crateErrorTkrToGateway(tkrAccount, Optional.empty()); - tkrToGateway.setMoneyAccounts(tkrAccount.getMoneyAccounts().stream() - .map(this::convertAccountToResponse) - .collect(Collectors.toList())); - } - - //Если хоть в одном была ошибка, берем ее отправляем - if (errorTkr != null) { - log.debug("Send request to gateway with error tkr cause: {}", requestInfoUpdate.getMessage()); - SendTkrRequest sendTkrRequest = new SendTkrRequest(); - sendTkrRequest.getTkrs().add(errorTkr); - sendTkrRequest.getTkrs().addAll(successTkr); - kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); - return null; - } - - for (TkrAccount tkrAccount : tkr.getAccounts()) { - ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest(); - clientCodeNewRequest.setCode(tkrAccount.getClientCode()); - if (tkrAccount.getCompanyId() != null) { - CompanySymbols companySymbols = companySymbolsImdg.getFirstObjectByFieldValues( - Map.of( - "companySymbol", CompanySymbol.UUID.getKey(), - "companySymbolValue", tkrAccount.getCompanyId() - ) - ); - if (companySymbols != null) { - clientCodeNewRequest.setCompanyId(companySymbols.getCompanyId()); - } - } - if (StringUtils.hasText(tkrAccount.getDepoAccount())) { - Account account = accountImdg.getFirstObjectByFieldValues( - Map.of( - "account", tkrAccount.getDepoAccount(), - "accountType", AccountType.Depo.getKey() - ) - ); - if (account != null) { - clientCodeNewRequest.setDepoAccountId(account.getId()); - } - } - List currencyIds = new ArrayList<>(); - for (MoneyAccountMsgRequest moneyAccountMsg : tkrAccount.getMoneyAccounts()) { - ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder(); - ImdgPredicate currencyPredicate; - ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount()); - if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) { - currencyPredicate = predicateBuilder.or( - predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()), - predicateBuilder.isNull("currency") - ); - } else { - currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode()); - } - Account account = accountImdg.getFirstObjectByPredicate( - predicateBuilder.and(accountPredicate, currencyPredicate) - ); - if (account == null) { - log.warn("Account not found: currency: {}; account: {}", moneyAccountMsg.getCurrCode(), - moneyAccountMsg.getAccount()); - continue; - } - if (!StringUtils.hasText(account.getCurrency()) || CurrencyCode.RUB.equalsByKey(account.getCurrency())) { - clientCodeNewRequest.setMoneyAccountId(account.getId()); - } else { - currencyIds.add(account.getId()); - } - } - if (!currencyIds.isEmpty()) { - clientCodeNewRequest.setCurrencyAccountList(currencyIds); - } - BaseRequest request = new BaseRequest<>(); - request.setRequestPayload(clientCodeNewRequest); - requestInfoUpdate = clientCodeNew0(request, false); - if (requestInfoUpdate != null) { - log.debug("processing result is: {}", requestInfoUpdate.getMessage()); - } - } - return null; - } - protected RequestInfoUpdate clientCodeNew0(BaseRequest userRequest, boolean fromTCRList) { log.debug("ClientCodeNewRequest received {}", userRequest.getId()); 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 0b3242dd5..a0b7cd4ca 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 @@ -75,6 +75,41 @@ public class ClientCodeFacade implements IClearingFacade { } } +// public void createClientCode(ClientCodeBusiness businessRequest) { +// log.trace("Start process creating new client code"); +// TradingClearingRegistry tradingClearingRegistry; +// { +// log.debug("Trading Clearing Registry is not exist, creating..."); +// TradingClearingRegistryBusiness creationTcrRequest = new TradingClearingRegistryBusiness(); +// creationTcrRequest.setCompanyId(request.getCompanyId()); +// creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId()); +// creationTcrRequest.setDepoAccountId(request.getDepoAccountId()); +// creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey()); +// tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null); +// } +// { +// if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) { +// TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest(); +// tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId()); +// tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList()); +// List tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null); +// } +// } +// +// { +// ClientCode clientCode = new ClientCode(); +// clientCode.setCreated(Instant.now()); +// clientCode.setUpdated(clientCode.getCreated()); +// +// clientCode.setCompanyId(request.getCompanyId()); +// clientCode.setCode(request.getCode()); +// clientCode.setMoneyAccountId(request.getMoneyAccountId()); +// clientCode.setDepoAccountId(request.getDepoAccountId()); +// clientCode.setStatus(request.getStatus()); +// clientCodeImdg.insert(clientCode); +// log.debug("successfully processed, new clientCode id {}", clientCode.getId()); +// } +// } public void lock() { // tradingClearingRegistryFacade.lock() // tradingClearingRegistryListFacade.lock() diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java index 6fc946f8e..2a7b8c0f6 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java @@ -10,6 +10,7 @@ import ru.clearing.classes.statics.data.account.ClearingAccount; 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.TradingClearingRegistryBusiness; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; @@ -103,6 +104,66 @@ public class TradingClearingRegistryFacade { return tradingClearingRegistry; } + public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryBusiness businessRequest) { + Long id = tradingClearingRegistryImdg.nextIDSequenceFor(); + TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); + tradingClearingRegistry.setId(id); + tradingClearingRegistry.setCompanyId(businessRequest.getCompany().getId()); + tradingClearingRegistry.setMoneyAccountId(businessRequest.getMoneyAccount().getId()); + businessRequest.getDepoAccount().ifPresent(depoAccount -> + tradingClearingRegistry.setDepoAccountId(depoAccount.getId())); + ; + if (businessRequest.getTradingClearingRegistryType().isEmpty()){ + if (businessRequest.getDepoAccount().isPresent()){ + + } + } +// ClearingAccount clearingAccount = request.getMoneyAccountId() != null ? +// clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null; +// +// if (request.getStatus() == null) { +// tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); +// log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus()); +// } else { +// tradingClearingRegistry.setStatus(request.getStatus()); +// log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus()); +// } +// +// String tradingRegistryType; +// if (request.getTradingClearingRegistryType() != null) { +// tradingRegistryType = request.getTradingClearingRegistryType(); +// } else if (depoAccount != null) { +// tradingRegistryType = depoAccount.getDepoAccountType(); +// } else { +// if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType(); +// else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey(); +// } +// tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); + + //http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 + TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C; + tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); + + Company company = businessRequest.getCompany(); +// Long seqId = companySequenceNextId(company.getId(), registryPurpose, tradingRegistryType); +// String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId); +// log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, company.getId(), seqId, code); +// tradingClearingRegistry.setCode(code); + + Instant now = Instant.now(); + tradingClearingRegistry.setCreated(now); + tradingClearingRegistry.setUpdated(now); + + tradingClearingRegistryImdg.insert(tradingClearingRegistry); + + log.info("New TCR.id={} was created.", tradingClearingRegistry.getId()); + sendNotificationToReportSvc(tradingClearingRegistry); + sendNotificationToClearingSvc(tradingClearingRegistry); + + log.debug("successfully processed, id {}", id); + return tradingClearingRegistry; + } + private Long companySequenceNextId(Long companyId, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType) { 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 56e68d2c9..ee8a81f81 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 @@ -28,7 +28,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.TradingClearingRegistryType; import ru.spcex.platform.imdg.api.Imdg; @@ -43,6 +45,7 @@ public class ClientCodeMessageListener extends QueueConsumer implements Initiali private final ClientCodeFacade clientCodeFacade; private final ClientCodeValidator clientCodeValidator; private final GatewayRequestCreator gatewayRequestCreator; + private final UserRoleVerification userRoleVerification; public ClientCodeMessageListener(Consumer kafkaQueue, Producer kafkaProducer, @@ -50,22 +53,32 @@ public class ClientCodeMessageListener extends QueueConsumer implements Initiali ImdgProvider imdgProvider, ClientCodeFacade clientCodeFacade, ClientCodeValidator clientCodeValidator, - GatewayRequestCreator gatewayRequestCreator) { + GatewayRequestCreator gatewayRequestCreator, + UserRoleVerification userRoleVerification) { super(kafkaQueue, kafkaProducer); this.kafkaSender = kafkaSender; this.imdgProvider = imdgProvider; this.clientCodeFacade = clientCodeFacade; this.clientCodeValidator = clientCodeValidator; this.gatewayRequestCreator = gatewayRequestCreator; + this.userRoleVerification = userRoleVerification; } @Override public void afterPropertiesSet() { imdgProvider.waitAvailable(); + //from backend-api requests + callback(ClientCodeNewRequest.class) + .setFunction(this::clientCodeNewFromBackend) + .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); + //from gateway requests callback(TkrAccountsGatewayRequest.class) .setFunction(this::clientCodeNewFromGateway) .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put); + callback(TkrAccountsGatewayRequest.class) + .setFunction(this::clientCodeNewFromGateway) + .forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY, callbacks::put); init(); } @@ -139,6 +152,28 @@ public class ClientCodeMessageListener extends QueueConsumer implements Initiali return null; } + private RequestInfoUpdate clientCodeNewFromBackend(BaseRequest clientCodeNewRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(clientCodeNewRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + ClientCodeNewRequest request = clientCodeNewRequest.getRequestPayload(); + ValidationResult validationResult = clientCodeValidator.checkBackendNewRequest(request); + if (!validationResult.isValid()) { + return makeErrorResponse(clientCodeNewRequest, validationResult); + } + + clientCodeFacade.createClientCode(request, validationResult.validator()); + return null; + } + + private RequestInfoUpdate makeErrorResponse(BaseRequest clientCodeNewRequest, + ValidationResult validationResult) { + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(clientCodeNewRequest.getId()); + requestInfoUpdate.setStatus(Status.Error); + validationResult.errorMsg().ifPresent(requestInfoUpdate::setMessage); + return requestInfoUpdate; + } + private TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) { Map> query = new HashMap<>(); query.put("companyId", companyId); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java index dc3a46ead..89f2eed9d 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java @@ -11,6 +11,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequ import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; @@ -18,17 +19,20 @@ import ru.spcex.platform.utils.validation.IValidator; @Service public class ClientCodeValidator { private final Logger log = LoggerFactory.getLogger(getClass()); + private final UserRoleVerification userRoleVerification; private final Function clientCodeNewRequestValidator; private final Function clientCodeUpdateRequestValidator; private final Function clientCodeDeleteRequestValidator; private final Function tkrAccountsGatewayValidator; private final IMessageResolver messageResolver; - public ClientCodeValidator(Function clientCodeNewRequestValidator, + public ClientCodeValidator(UserRoleVerification userRoleVerification, + Function clientCodeNewRequestValidator, Function clientCodeUpdateRequestValidator, Function clientCodeDeleteRequestValidator, Function tkrAccountsGatewayValidator, IMessageResolver messageResolver) { + this.userRoleVerification = userRoleVerification; this.clientCodeNewRequestValidator = clientCodeNewRequestValidator; this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator; this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator; @@ -37,7 +41,15 @@ public class ClientCodeValidator { } public ValidationResult checkGatewayRequest(TkrAccount gatewayAccountRequest) { - IValidator validator = tkrAccountsGatewayValidator.apply(gatewayAccountRequest); + return standardValidation(tkrAccountsGatewayValidator, gatewayAccountRequest); + } + + public ValidationResult checkBackendNewRequest(ClientCodeNewRequest clientCodeNewRequest) { + return standardValidation(clientCodeNewRequestValidator, clientCodeNewRequest); + } + + private ValidationResult standardValidation(Function requestValidator, T request) { + IValidator validator = requestValidator.apply(request); Optional error = validator.tillFirstError(); AtomicReference> errorMsg = new AtomicReference<>(); error.ifPresent(err -> errorMsg.set(Optional.of(messageResolver.resolve(err)))); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java index 977c67a89..50eff5996 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.account.validation; +import java.util.Map; +import java.util.Optional; import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; @@ -12,9 +14,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.util.Map; -import java.util.Optional; - public enum AccountValidationRule implements IValidationRule> { CompanyPresent() { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java new file mode 100644 index 000000000..87d86b05c --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java @@ -0,0 +1,75 @@ +package ru.spcex.clearing.account.validation; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +public enum BackendClientCodeValidationRule implements IValidationRule> { + AllAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + ClientCodeNewRequest validatedObject = context.getValidatedObject(); + List ids = validatedObject.getCurrencyAccountList(); + if (ids == null || ids.isEmpty()) { + return empty(); // необязательное поле + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + for (Long id : ids) { + if (id == null) { // null значения в массиве не ожидаются + return of(AccountError.RequiredFieldEmpty, "accountId"); + } + Account byIdObject = imdg.getSingleObjectByID(id); + if (byIdObject == null) + return of(AccountError.AccountNotFound, id, "accountId"); + } + + return empty(); + } + }, + TcrIsNotPresentByAccount() { + @Override + public Optional validate(ImdgValidationContext context) { + ClientCodeNewRequest validatedObject = context.getValidatedObject(); + List currencyIds = validatedObject.getCurrencyAccountList(); + Long moneyAccountId = validatedObject.getMoneyAccountId(); + + Imdg tradingClearingRegistryImdg = + context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + Imdg tradingClearingRegistryListImdg = + context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + + TradingClearingRegistry tcrByMoneyAccount = tradingClearingRegistryImdg.getFirstObjectByFieldValues( + Map.of( + "moneyAccountId", moneyAccountId, + "status", Status.Active.getKey() + )); + if (tcrByMoneyAccount != null) { + return of(AccountError.TCR_ALREADY_EXIST_GTW); + } + + for (Long id : currencyIds) { + TradingClearingRegistryList tcrList = tradingClearingRegistryListImdg.getFirstObjectByFieldValues( + Map.of( + "accountId", id, + "status", Status.Active.getKey() + )); + if (tcrList != null) { + return of(AccountError.TCR_LIST_ALREADY_EXIST_GTW); + } + } + + return empty(); + } + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java new file mode 100644 index 000000000..040bb5893 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java @@ -0,0 +1,130 @@ +package ru.spcex.clearing.account.validation; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.springframework.util.StringUtils; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +public enum GatewayClientCodeValidationRule implements IValidationRule> { + CompanyPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + Long tradingCode = validatedObject.getTradingCode(); + if (tradingCode == null) { + return of(AccountError.RequiredFieldEmpty, "trading_code"); + } + + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getFirstObjectByFieldValues( + Map.of("trading_code", String.valueOf(tradingCode)) + ); + if (company == null) { + return of(AccountError.COMPANY_NOT_FOUND_GTW, "trading_code"); + } + + context.storeObject(ClientCodeStoreObjects.COMPANY, company); + return Optional.empty(); + } + }, + AllAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + List accountList = validatedObject.getMoneyAccounts(); + if (accountList == null || accountList.isEmpty()) { + return of(AccountError.RequiredFieldEmpty, "money_account"); + } + List currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList(); + if (!currencies.contains(CurrencyCode.RUB.getKey())) { + return of(AccountError.RequiredFieldEmpty, "money_account"); + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Map accountByCurrency = new HashMap<>(); + for (MoneyAccountMsgRequest moneyAccountMsg : accountList) { + ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder(); + ImdgPredicate currencyPredicate; + ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount()); + if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) { + currencyPredicate = predicateBuilder.or( + predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()), + predicateBuilder.isNull("currency") + ); + } else { + currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode()); + } + Account account = imdg.getFirstObjectByPredicate( + predicateBuilder.and(accountPredicate, currencyPredicate) + ); + if (account == null) { + return of(AccountError.ACCOUNT_NOT_FOUND_GTW, moneyAccountMsg.getAccount(), "money_account"); + } + accountByCurrency.put(account.getCurrency(), account); + } + context.storeObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS, accountByCurrency); + return Optional.empty(); + } + }, + DepoAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + String depoAccountVal = validatedObject.getDepoAccount(); + if (!StringUtils.hasText(depoAccountVal)) { + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); + return empty(); + } + + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account depoAccount = imdg.getFirstObjectByFieldValues( + Map.of("account", depoAccountVal) + ); + if (depoAccount == null) { + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); + return of(AccountError.DEPO_ACCOUNT_NOT_FOUND_GTW, "depo_account"); + } + + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, depoAccount); + return Optional.empty(); + } + }, + TcrIsNotPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + Map accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS); + Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey()); + if (moneyAccount == null) { + return of(AccountError.AccountNotFound); + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class); + + TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues( + Map.of( + "moneyAccountId", moneyAccount.getId(), + "status", Status.Active.getKey() + ) + ); + if (tcr != null) { + return of(AccountError.TCR_ALREADY_EXIST_GTW, tcr.getCode(), "code"); + } + return Optional.empty(); + } + } +} diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java index 40c1c7e1b..5681e0780 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java @@ -41,8 +41,7 @@ public class ValidationHelper { return new RequestInfoUpdate() .setId(userRequest.getId()) .setStatus(Status.Error) - .setMessage(errorMsg) - .setEnumMessage(validationError.get()); + .setMessage(errorMsg); } } return null; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java index 993c16154..77444032c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java @@ -1,12 +1,9 @@ package ru.spcex.clearing.platform.messaging.service; -import ru.spcex.platform.utils.enumeration.EnumMessage; - public class RequestInfoUpdate { private Long id; private Status status; private String message; - private EnumMessage enumMessage; public RequestInfoUpdate() {} @@ -43,15 +40,6 @@ public class RequestInfoUpdate { return this; } - public EnumMessage getEnumMessage() { - return enumMessage; - } - - public RequestInfoUpdate setEnumMessage(EnumMessage enumMessage) { - this.enumMessage = enumMessage; - return this; - } - @Override public String toString() { return "RequestInfoUpdate{" +