diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java index cef013209..0b0ac0a40 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java @@ -1,12 +1,16 @@ package ru.spcex.clearing.dflt.management.config; import java.util.Arrays; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanyRoleSet; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OvernightSettings; @@ -34,6 +38,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyUpdate import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.clearing.validation.common.rules.SpecialIdPresentRule; +import ru.spcex.platform.enumeration.CompanyRole; import ru.spcex.platform.enumeration.OrderAffil; import ru.spcex.platform.enumeration.OrderStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -55,9 +60,11 @@ import ru.spcex.platform.utils.validation.ValidatorImpl; @Configuration public class ValidationConfig { + private static final Logger log = LoggerFactory.getLogger(ValidationConfig.class); private final Imdg overnightSettingsImdg; private final Imdg companyImdg; private final Imdg tcrImdg; + private final Imdg cmpRoleImdg; private final Imdg marketImdg; private final Imdg osTypeDictionaryImdg; private final Imdg orderCurrencyImdg; @@ -77,6 +84,7 @@ public class ValidationConfig { this.orderStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderStatusDictionary, OrderStatusDictionary.class); this.tcrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.cmpRoleImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class); this.secSelector = new SecuritySelector<>(imdgProvider, Security.class); } @@ -325,6 +333,7 @@ public class ValidationConfig { ctx.addImdg(IMDGDistributedNames.Map_OrderCurrency, orderCurrencyImdg); ctx.addImdg(IMDGDistributedNames.Map_Company, companyImdg); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, tcrImdg); + ctx.addImdg(IMDGDistributedNames.Map_CompanyRoleSet, cmpRoleImdg); var orderCurrencyPresent = PresentByPredicate .builder(new IdEqualPredicate<>(orderCurrencyImdg.predicateBuilder(), OrderCompanyNewRequest::getOrderId)) .mapName(IMDGDistributedNames.Map_OrderCurrency) @@ -332,6 +341,36 @@ public class ValidationConfig { .store(OrderCurrencyValidationStored.OrderCurrency) .build(); + var clccOrderOnly = new IValidationRule> () { + + @Override + public Optional validate(ImdgValidationContext context) { + ImdgPredicateBuilder cmpRolePb = cmpRoleImdg.predicateBuilder(); + CompanyRoleSet companyRoleSet = cmpRoleImdg.getFirstObjectByPredicate( + cmpRolePb.equals("companyRole", CompanyRole.CLCC.getKey()) + ); + if (companyRoleSet == null) { + log.error("couldn't find companyRole CLCC"); + return of(DefaultManagementErrors.RecordNotFound, "companyRole[CLCC]"); + } + Company clccCmp = companyImdg.getSingleObjectByID(companyRoleSet.getCompanyId()); + if (clccCmp == null) { + log.error("couldn't find company CLCC"); + return of(DefaultManagementErrors.RecordNotFound, "company[CLCC]"); + } + OrderCurrency order = context.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); + if (!Objects.equals(order.getCounterPartyId(), clccCmp.getId())) { + return of(DefaultManagementErrors.OperationNotAllowed); + } + return empty(); + } + + @Override + public String ruleName() { + return "clccOrderOnly"; + } + }; + var companyPresentRule = PresentByPredicate .builder(new IdEqualPredicate<>( companyImdg.predicateBuilder(), @@ -357,8 +396,7 @@ public class ValidationConfig { OrderCurrency oc = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); ImdgPredicateBuilder pb = tcrImdg.predicateBuilder(); return pb.and( - pb.equals("companyId", oc.getCounterPartyId()), - pb.equals("code", oc.getCounterTradingCode()) + pb.equals("companyId", oc.getCounterPartyId()) ); }) .mapName(IMDGDistributedNames.Map_TradingClearingRegistry) @@ -370,6 +408,7 @@ public class ValidationConfig { //fixme проверить что tcr.getCompanyId() = companyId из запроса? return new ValidatorImpl<>(ctx, orderCurrencyPresent, + clccOrderOnly, companyPresentRule, tcrPresent, QuantityLotGreaterThanZero.INSTANCE, diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java index 57de6ebe2..29f4fb022 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java @@ -14,6 +14,7 @@ public enum DefaultManagementErrors implements IErrorEnumId { IncorrectFieldValue(11005L), DictionaryNotFound(11006L), RequiredFieldIsEmpty(11007L), + OperationNotAllowed(11008L), ; private final Long id;