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 bcb899dc5..ad64ae031 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 @@ -51,26 +51,27 @@ public class TradingClearingRegistryListValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl<>(context, - IdPresentRule.instance("tradingClearingRegistryId", - TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, - IMDGDistributedNames.Map_TradingClearingRegistry, - TradingClearingRegistry.class, - AccountError.RequiredFieldEmpty, - AccountError.TradingClearingRegistryNotFound, - false), - new ExistAllAccountId<>("accountId", - TradingClearingRegistryListNewRequest::getCurrencyAccountList, - TradingClearingRegistryListNewRequest::getAccountId, - false, - null), - DictionaryPresentRule.instance("stauts", - TradingClearingRegistryListNewRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - false), - NotAlreadyPresent.instance + IdPresentRule.instance("tradingClearingRegistryId", + TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, + IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class, + AccountError.RequiredFieldEmpty, + AccountError.TradingClearingRegistryNotFound, + false), + new ExistAllAccountId<>("accountId", + TradingClearingRegistryListNewRequest::getCurrencyAccountList, + TradingClearingRegistryListNewRequest::getAccountId, + TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, + false, + null), + DictionaryPresentRule.instance("stauts", + TradingClearingRegistryListNewRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + false), + NotAlreadyPresent.instance ); }; } @@ -86,43 +87,43 @@ public class TradingClearingRegistryListValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl>(context, - IdPresentRule.instance2("id", - TradingClearingRegistryListUpdateRequest::getId, - IMDGDistributedNames.Map_TradingClearingRegistryList, - TradingClearingRegistryList.class, - AccountError.RequiredFieldEmpty, - AccountError.RecordNotFound, - true, - (tcrList)-> { - Long accountId = tcrList.getAccountId(); - if (accountId==null) - return null; - if (!IEnumKey.contains(context.getValidatedObject().getStatus(), - ServiceStatus.Active, ServiceStatus.Reopened)) - return null; + IdPresentRule.instance2("id", + TradingClearingRegistryListUpdateRequest::getId, + IMDGDistributedNames.Map_TradingClearingRegistryList, + TradingClearingRegistryList.class, + AccountError.RequiredFieldEmpty, + AccountError.RecordNotFound, + true, + (tcrList) -> { + Long accountId = tcrList.getAccountId(); + if (accountId == null) + return null; + if (!IEnumKey.contains(context.getValidatedObject().getStatus(), + ServiceStatus.Active, ServiceStatus.Reopened)) + return null; - Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); - ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); - ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), - pb.equals("accountId", accountId)); - query = pb.and(query, pb.not(pb.equals("id", tcrList.getId()))); - Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); - if (!inOtherLists.isEmpty()) { - Collection duplicateAccounts = inOtherLists.stream() - .map(TradingClearingRegistryList::getAccountId) - .filter(accountId::equals) - .collect(Collectors.toSet()); - return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется» - } - return null; - }), - DictionaryPresentRule.instance("status", - TradingClearingRegistryListUpdateRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - true) + Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); + ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), + pb.equals("accountId", accountId)); + query = pb.and(query, pb.not(pb.equals("id", tcrList.getId()))); + Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); + if (!inOtherLists.isEmpty()) { + Collection duplicateAccounts = inOtherLists.stream() + .map(TradingClearingRegistryList::getAccountId) + .filter(accountId::equals) + .collect(Collectors.toSet()); + return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется» + } + return null; + }), + DictionaryPresentRule.instance("status", + TradingClearingRegistryListUpdateRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + true) ); }; } @@ -158,16 +159,19 @@ public class TradingClearingRegistryListValidationConfig { String fieldName; Function> accountIdListGetter; Function accountIdGetter; + Function tkrIdGetter; boolean required; Function idGetter; public ExistAllAccountId(String fieldName, Function> accountIdListGetter, Function accountIdGetter, + Function tkrIdGetter, boolean required, Function idGetter) { this.fieldName = fieldName; this.accountIdListGetter = accountIdListGetter; this.accountIdGetter = accountIdGetter; + this.tkrIdGetter = tkrIdGetter; this.required = required; this.idGetter = idGetter; } @@ -176,7 +180,7 @@ public class TradingClearingRegistryListValidationConfig { public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); List accounts = accountIdListGetter.apply(validatedObject); - if (accounts.isEmpty()){ + if (accounts == null) { accounts = new ArrayList<>(); } Long singleAccountId = accountIdGetter.apply(validatedObject); @@ -206,9 +210,12 @@ public class TradingClearingRegistryListValidationConfig { // Проверка отсутствия других TradingClearingRegistryList с этими счетами Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + Long tkrId = tkrIdGetter.apply(validatedObject); ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); - ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), - pb.equals("currency", byIdObject.getCurrency())); + ImdgPredicate query = pb.and( + pb.equals("status", WorkflowStatus.Active.getKey()), + pb.equals("currency", byIdObject.getCurrency()), + pb.equals("tradingClearingRegistryId", tkrId)); if (idGetter != null) { Long id = idGetter.apply(validatedObject); if (id == null) // never @@ -217,9 +224,9 @@ public class TradingClearingRegistryListValidationConfig { } Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); if (!inOtherLists.isEmpty()) { - Collection duplicateAccounts = inOtherLists.stream() - .map(TradingClearingRegistryList::getAccountId) - .filter(accountId::equals) + Collection duplicateAccounts = inOtherLists.stream() + .map(tradingClearingRegistryList -> + accountImdg.getSingleObjectByID(tradingClearingRegistryList.getAccountId()).getAccount()) .collect(Collectors.toSet()); return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, fieldName); // (5023) «Счет %s уже используется» }