STrades validation: проверка security для Fond
This commit is contained in:
parent
6fbf4efa1c
commit
cf1db1b604
9 changed files with 83 additions and 55 deletions
|
|
@ -105,9 +105,11 @@ public class ValidationConfig {
|
||||||
ImdgValidationContext<STrades> context = new ImdgValidationContext<>();
|
ImdgValidationContext<STrades> context = new ImdgValidationContext<>();
|
||||||
context.setValidatedObject(sTrades);
|
context.setValidatedObject(sTrades);
|
||||||
context.addImdg(IMDGDistributedNames.Map_Security, imdgSecurity);
|
context.addImdg(IMDGDistributedNames.Map_Security, imdgSecurity);
|
||||||
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity);
|
|
||||||
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
|
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
|
||||||
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
|
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg);
|
||||||
context.setLogPrefix(LogPrefixId.INSTANCE);
|
context.setLogPrefix(LogPrefixId.INSTANCE);
|
||||||
return new ValidatorImpl<>(context,
|
return new ValidatorImpl<>(context,
|
||||||
STradesValidationRule.SecurityPresentFond,
|
STradesValidationRule.SecurityPresentFond,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import ru.spcex.clearing.error.ClearingError;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.platform.enumeration.ServiceStatus;
|
import ru.spcex.platform.enumeration.ServiceStatus;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
||||||
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
@ -29,8 +30,12 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
|
||||||
if (TextUtil.isEmpty(validatedObject.getSecCode())) {
|
if (TextUtil.isEmpty(validatedObject.getSecCode())) {
|
||||||
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
|
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
|
||||||
}
|
}
|
||||||
Imdg<Security> securityImdg = context.obtainMap(IMDGDistributedNames.Map_Security, Security.class);
|
SecuritySelector<Security> slctr = new SecuritySelector<>(
|
||||||
Security security = securityImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", validatedObject.getSecCode()));
|
context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class),
|
||||||
|
context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class),
|
||||||
|
context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class)
|
||||||
|
);
|
||||||
|
Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode());
|
||||||
if (security == null) {
|
if (security == null) {
|
||||||
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
|
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
import ru.spcex.clearing.securities.config.element.SecuritiesServiceSettings;
|
import ru.spcex.clearing.securities.config.element.SecuritiesServiceSettings;
|
||||||
import ru.spcex.clearing.util.security.SecuritySelector;
|
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
||||||
|
|
||||||
|
|
@ -45,10 +44,4 @@ public class SecuritiesServiceImdgConfig {
|
||||||
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
|
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
|
||||||
return pool;
|
return pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Bean
|
|
||||||
public SecuritySelector securitySelector(ImdgProvider imdgProvider) {
|
|
||||||
return new SecuritySelector(imdgProvider);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
package ru.spcex.clearing.securities.config;
|
||||||
|
|
||||||
|
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.security.Security;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class SecuritySelectorConfig {
|
||||||
|
@Autowired
|
||||||
|
@Bean
|
||||||
|
public SecuritySelector<Security> securitySelector(ImdgProvider imdgProvider) {
|
||||||
|
return new SecuritySelector<>(imdgProvider, Security.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,7 +19,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdate
|
||||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
import ru.spcex.clearing.securities.validation.ListingValidationProvider;
|
import ru.spcex.clearing.securities.validation.ListingValidationProvider;
|
||||||
import ru.spcex.clearing.util.security.SecuritySelector;
|
|
||||||
import ru.spcex.clearing.util.security.UserRoleVerification;
|
import ru.spcex.clearing.util.security.UserRoleVerification;
|
||||||
import ru.spcex.clearing.util.services.RequestHelper;
|
import ru.spcex.clearing.util.services.RequestHelper;
|
||||||
import ru.spcex.clearing.validation.common.ValidationHelper;
|
import ru.spcex.clearing.validation.common.ValidationHelper;
|
||||||
|
|
@ -28,6 +27,7 @@ import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgId;
|
import ru.spcex.platform.imdg.api.ImdgId;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
||||||
import ru.spcex.platform.utils.error.ValidationException;
|
import ru.spcex.platform.utils.error.ValidationException;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
@ -42,7 +42,7 @@ public class ListingService extends QueueConsumer implements InitializingBean {
|
||||||
private final ListingValidationProvider validation;
|
private final ListingValidationProvider validation;
|
||||||
private final UserRoleVerification userRoleVerification;
|
private final UserRoleVerification userRoleVerification;
|
||||||
private final ValidationHelper validationHelper;
|
private final ValidationHelper validationHelper;
|
||||||
private final SecuritySelector securitySelector;
|
private final SecuritySelector<Security> securitySelector;
|
||||||
private final RequestHelper requestHelper;
|
private final RequestHelper requestHelper;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -52,7 +52,7 @@ public class ListingService extends QueueConsumer implements InitializingBean {
|
||||||
ListingValidationProvider validation,
|
ListingValidationProvider validation,
|
||||||
UserRoleVerification userRoleVerification,
|
UserRoleVerification userRoleVerification,
|
||||||
ValidationHelper validationHelper,
|
ValidationHelper validationHelper,
|
||||||
SecuritySelector securitySelector,
|
SecuritySelector<Security> securitySelector,
|
||||||
RequestHelper requestHelper) {
|
RequestHelper requestHelper) {
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
this.validation = validation;
|
this.validation = validation;
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingNewRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdateRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdateRequest;
|
||||||
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
||||||
import ru.spcex.clearing.util.security.SecuritySelector;
|
|
||||||
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;
|
||||||
|
|
@ -19,6 +18,7 @@ import ru.spcex.platform.enumeration.InstrumentType;
|
||||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
||||||
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
import ru.spcex.platform.imdg.validation.rule.PresentById;
|
import ru.spcex.platform.imdg.validation.rule.PresentById;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
|
@ -36,10 +36,10 @@ public class ListingValidationProvider {
|
||||||
final Imdg<SpcexObjectBase> currencyCodeDictionaryImdg;
|
final Imdg<SpcexObjectBase> currencyCodeDictionaryImdg;
|
||||||
final Imdg<Listing> listingImdg;
|
final Imdg<Listing> listingImdg;
|
||||||
final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
|
final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
|
||||||
final SecuritySelector securitySelector;
|
final SecuritySelector<Security> securitySelector;
|
||||||
|
|
||||||
|
|
||||||
public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector securitySelector) {
|
public ListingValidationProvider(ImdgProvider imdgProvider, SecuritySelector<Security> securitySelector) {
|
||||||
this.securitySelector = securitySelector;
|
this.securitySelector = securitySelector;
|
||||||
this.workflowStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, SpcexObjectBase.class);
|
this.workflowStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, SpcexObjectBase.class);
|
||||||
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, SpcexObjectBase.class);
|
this.currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, SpcexObjectBase.class);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
||||||
import ru.clearing.platform.dictionary.*;
|
import ru.clearing.platform.dictionary.*;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.securities.config.ErrorResolverConfig;
|
import ru.spcex.clearing.securities.config.ErrorResolverConfig;
|
||||||
|
import ru.spcex.clearing.securities.config.SecuritySelectorConfig;
|
||||||
import ru.spcex.clearing.securities.config.ValidationConfig;
|
import ru.spcex.clearing.securities.config.ValidationConfig;
|
||||||
import ru.spcex.clearing.securities.service.cud.*;
|
import ru.spcex.clearing.securities.service.cud.*;
|
||||||
import ru.spcex.clearing.securities.validation.ListingValidationProvider;
|
import ru.spcex.clearing.securities.validation.ListingValidationProvider;
|
||||||
|
|
@ -23,7 +24,6 @@ import ru.spcex.clearing.securities.validation.ValidationProvider;
|
||||||
import ru.spcex.clearing.test.MatcherFactory;
|
import ru.spcex.clearing.test.MatcherFactory;
|
||||||
import ru.spcex.clearing.test.config.ImdgTestConfig;
|
import ru.spcex.clearing.test.config.ImdgTestConfig;
|
||||||
import ru.spcex.clearing.test.config.KafkaTestConfig;
|
import ru.spcex.clearing.test.config.KafkaTestConfig;
|
||||||
import ru.spcex.clearing.util.security.SecuritySelector;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProv
|
||||||
FixedIncomeSecurityService.class,
|
FixedIncomeSecurityService.class,
|
||||||
MoneyMarketSecurityService.class,
|
MoneyMarketSecurityService.class,
|
||||||
ListingService.class, ListingValidationProvider.class,
|
ListingService.class, ListingValidationProvider.class,
|
||||||
SecuritySelector.class,
|
SecuritySelectorConfig.class,
|
||||||
ImdgTestConfig.class,
|
ImdgTestConfig.class,
|
||||||
KafkaTestConfig.class,
|
KafkaTestConfig.class,
|
||||||
ValidationProvider.class,
|
ValidationProvider.class,
|
||||||
|
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
package ru.spcex.clearing.util.security;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
|
|
||||||
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
|
||||||
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
|
|
||||||
import ru.clearing.classes.statics.data.security.Security;
|
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class SecuritySelector {
|
|
||||||
|
|
||||||
private final Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
|
|
||||||
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
|
|
||||||
private final Imdg<EquitySecurity> equitySecurity;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public SecuritySelector(ImdgProvider imdgProvider) {
|
|
||||||
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
|
|
||||||
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
|
||||||
this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Security selectSecurityById(Long securityId) {
|
|
||||||
Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId);
|
|
||||||
if (security != null) return security;
|
|
||||||
security = moneyMarketSecurityImdg.getSingleObjectByID(securityId);
|
|
||||||
if (security != null) return security;
|
|
||||||
security = equitySecurity.getSingleObjectByID(securityId);
|
|
||||||
if (security != null) return security;
|
|
||||||
|
|
||||||
return security; // null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package ru.spcex.platform.imdg.api.predicate.specific;
|
||||||
|
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class SecuritySelector<T extends SpcexObjectBase> {
|
||||||
|
|
||||||
|
private final Imdg<T> fixedIncomeSecurityImdg;
|
||||||
|
private final Imdg<T> moneyMarketSecurityImdg;
|
||||||
|
private final Imdg<T> equitySecurity;
|
||||||
|
|
||||||
|
public SecuritySelector(ImdgProvider imdgProvider, Class<T> clazz) {
|
||||||
|
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, clazz);
|
||||||
|
this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, clazz);
|
||||||
|
this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecuritySelector(Imdg<T> fixedIncomeSecurityImdg,
|
||||||
|
Imdg<T> moneyMarketSecurityImdg,
|
||||||
|
Imdg<T> equitySecurity) {
|
||||||
|
this.fixedIncomeSecurityImdg = fixedIncomeSecurityImdg;
|
||||||
|
this.moneyMarketSecurityImdg = moneyMarketSecurityImdg;
|
||||||
|
this.equitySecurity = equitySecurity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T selectSecurityById(Long securityId) {
|
||||||
|
return selectSecurityByAnything(imdg -> imdg.getSingleObjectByID(securityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public T selectSecurityBySymbol(String securitySymbol) {
|
||||||
|
Map<String, String> fields = Map.of("securitySymbol", securitySymbol);
|
||||||
|
return selectSecurityByAnything(imdg -> imdg.getFirstObjectByFieldValues(fields));
|
||||||
|
}
|
||||||
|
|
||||||
|
private T selectSecurityByAnything(Function<Imdg<T>, T> retriever) {
|
||||||
|
T security = retriever.apply(fixedIncomeSecurityImdg);
|
||||||
|
if (security != null) return security;
|
||||||
|
security = retriever.apply(moneyMarketSecurityImdg);
|
||||||
|
if (security != null) return security;
|
||||||
|
security = retriever.apply(equitySecurity);
|
||||||
|
return security;// null
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue