etreschenkov 2026-05-26 12:19:53 +03:00
parent 328573074c
commit b5ad5540c7

View file

@ -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<ImdgVa
@Override
public Optional<EnumMessage> validate (ImdgValidationContext < TkrAccount > context) {
Optional<DepoAccount> depoAccountOpt = context.getStoredObject(ClientCodeStoreObjects.DEPO_ACCOUNT);
if (depoAccountOpt.isEmpty()) {
List<Account> clrnAccs = context.getStoredObject(ClientCodeStoreObjects.CLRN_ACCS);
Optional<Account> ruClrnAcc = clrnAccs.stream()
.filter(ruAcc -> CurrencyCode.RUB.equalsByKey(ruAcc.getCurrency()))
.findFirst();
if (ruClrnAcc.isEmpty()) {
return empty();
}
DepoAccount depoAccount = depoAccountOpt.get();
Imdg<TradingClearingRegistry> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
Imdg<Account> 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<TradingClearingRegistry> 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();
}
}