ialbert 2026-05-06 14:04:36 +03:00
parent 206dd19aca
commit 8f505d5233
2 changed files with 42 additions and 2 deletions

View file

@ -1,12 +1,16 @@
package ru.spcex.clearing.dflt.management.config; package ru.spcex.clearing.dflt.management.config;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.company.Company; 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.Market;
import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.clearing.classes.statics.data.misc.OvernightSettings; 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.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.SpecialIdPresentRule; 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.OrderAffil;
import ru.spcex.platform.enumeration.OrderStatus; import ru.spcex.platform.enumeration.OrderStatus;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
@ -55,9 +60,11 @@ import ru.spcex.platform.utils.validation.ValidatorImpl;
@Configuration @Configuration
public class ValidationConfig { public class ValidationConfig {
private static final Logger log = LoggerFactory.getLogger(ValidationConfig.class);
private final Imdg<OvernightSettings> overnightSettingsImdg; private final Imdg<OvernightSettings> overnightSettingsImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<TradingClearingRegistry> tcrImdg; private final Imdg<TradingClearingRegistry> tcrImdg;
private final Imdg<CompanyRoleSet> cmpRoleImdg;
private final Imdg<Market> marketImdg; private final Imdg<Market> marketImdg;
private final Imdg<OvernightTypeDictionary> osTypeDictionaryImdg; private final Imdg<OvernightTypeDictionary> osTypeDictionaryImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg; private final Imdg<OrderCurrency> orderCurrencyImdg;
@ -77,6 +84,7 @@ public class ValidationConfig {
this.orderStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderStatusDictionary, OrderStatusDictionary.class); this.orderStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderStatusDictionary, OrderStatusDictionary.class);
this.tcrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tcrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.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); this.secSelector = new SecuritySelector<>(imdgProvider, Security.class);
} }
@ -325,6 +333,7 @@ public class ValidationConfig {
ctx.addImdg(IMDGDistributedNames.Map_OrderCurrency, orderCurrencyImdg); ctx.addImdg(IMDGDistributedNames.Map_OrderCurrency, orderCurrencyImdg);
ctx.addImdg(IMDGDistributedNames.Map_Company, companyImdg); ctx.addImdg(IMDGDistributedNames.Map_Company, companyImdg);
ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, tcrImdg); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, tcrImdg);
ctx.addImdg(IMDGDistributedNames.Map_CompanyRoleSet, cmpRoleImdg);
var orderCurrencyPresent = PresentByPredicate var orderCurrencyPresent = PresentByPredicate
.builder(new IdEqualPredicate<>(orderCurrencyImdg.predicateBuilder(), OrderCompanyNewRequest::getOrderId)) .builder(new IdEqualPredicate<>(orderCurrencyImdg.predicateBuilder(), OrderCompanyNewRequest::getOrderId))
.mapName(IMDGDistributedNames.Map_OrderCurrency) .mapName(IMDGDistributedNames.Map_OrderCurrency)
@ -332,6 +341,36 @@ public class ValidationConfig {
.store(OrderCurrencyValidationStored.OrderCurrency) .store(OrderCurrencyValidationStored.OrderCurrency)
.build(); .build();
var clccOrderOnly = new IValidationRule<ImdgValidationContext<OrderCompanyNewRequest>> () {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<OrderCompanyNewRequest> 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 var companyPresentRule = PresentByPredicate
.builder(new IdEqualPredicate<>( .builder(new IdEqualPredicate<>(
companyImdg.predicateBuilder(), companyImdg.predicateBuilder(),
@ -357,8 +396,7 @@ public class ValidationConfig {
OrderCurrency oc = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); OrderCurrency oc = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency);
ImdgPredicateBuilder pb = tcrImdg.predicateBuilder(); ImdgPredicateBuilder pb = tcrImdg.predicateBuilder();
return pb.and( return pb.and(
pb.equals("companyId", oc.getCounterPartyId()), pb.equals("companyId", oc.getCounterPartyId())
pb.equals("code", oc.getCounterTradingCode())
); );
}) })
.mapName(IMDGDistributedNames.Map_TradingClearingRegistry) .mapName(IMDGDistributedNames.Map_TradingClearingRegistry)
@ -370,6 +408,7 @@ public class ValidationConfig {
//fixme проверить что tcr.getCompanyId() = companyId из запроса? //fixme проверить что tcr.getCompanyId() = companyId из запроса?
return new ValidatorImpl<>(ctx, return new ValidatorImpl<>(ctx,
orderCurrencyPresent, orderCurrencyPresent,
clccOrderOnly,
companyPresentRule, companyPresentRule,
tcrPresent, tcrPresent,
QuantityLotGreaterThanZero.INSTANCE, QuantityLotGreaterThanZero.INSTANCE,

View file

@ -14,6 +14,7 @@ public enum DefaultManagementErrors implements IErrorEnumId {
IncorrectFieldValue(11005L), IncorrectFieldValue(11005L),
DictionaryNotFound(11006L), DictionaryNotFound(11006L),
RequiredFieldIsEmpty(11007L), RequiredFieldIsEmpty(11007L),
OperationNotAllowed(11008L),
; ;
private final Long id; private final Long id;