diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java index 5085d924d..06768c456 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java @@ -1,8 +1,10 @@ package ru.spcex.clearing.account.validation; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,8 +20,8 @@ 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.AccountType; 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; @@ -124,25 +126,45 @@ public enum GatewayEksClientCodeValidationRule implements IValidationRule validate (ImdgValidationContext < TkrAccount > context) { Optional depoAccountOpt = context.getStoredObject(ClientCodeStoreObjects.DEPO_ACCOUNT); - if (depoAccountOpt.isEmpty()) { + List clrnAccs = context.getStoredObject(ClientCodeStoreObjects.CLRN_ACCS); + Optional ruClrnAcc = clrnAccs.stream() + .filter(ruAcc -> CurrencyCode.RUB.equalsByKey(ruAcc.getCurrency())) + .findFirst(); + + if (ruClrnAcc.isEmpty()) { return empty(); } - DepoAccount depoAccount = depoAccountOpt.get(); Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues( - Map.of( - "depoAccountId", depoAccount.getAccountId(), - "status", Status.Active.getKey() - ) - ); - if (tcr != null) { - Account account = accountImdg.getSingleObjectByID(depoAccount.getAccountId()); - return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount(), "account"); + + ImdgPredicateBuilder pb = imdg.predicateBuilder(); + ImdgPredicate query = pb.equals("moneyAccountId", ruClrnAcc.get().getId()); + if (depoAccountOpt.isPresent()) { + query = pb.or(query, pb.equals("depoAccountId", depoAccountOpt.get().getAccountId())); + } + Collection tcr = imdg.getCollectionObjectsByPredicate(query); + + if (tcr.isEmpty()) { + return empty(); + } else { + Account dubAcc = null; + for (TradingClearingRegistry duplicate : tcr) { + if (Objects.equals(duplicate.getMoneyAccountId(), ruClrnAcc.get().getId())) { + dubAcc = ruClrnAcc.get(); + } + if (depoAccountOpt.isPresent() && + depoAccountOpt.get().getAccountId().equals(duplicate.getDepoAccountId())) { + dubAcc = accountImdg.getSingleObjectByID(depoAccountOpt.get().getAccountId()); + } + if (dubAcc != null) { + break; + } + } + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, + dubAcc != null ? dubAcc.getAccount() : "null"); } - return Optional.empty(); } }