ExecutionDeposit company search by sec_code fix

ExecutionDeposit#contract fill fix
This commit is contained in:
ialbert 2023-05-29 12:05:53 +03:00
parent ad73909774
commit 0cba4f2dbb
4 changed files with 63 additions and 8 deletions

View file

@ -13,6 +13,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf01; import ru.clearing.classes.statics.data.sdf.SDf01;
import ru.clearing.classes.statics.data.sdf.SDf57; import ru.clearing.classes.statics.data.sdf.SDf57;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.platform.dictionary.SectionDictionary; import ru.clearing.platform.dictionary.SectionDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -35,6 +36,7 @@ public class ValidationConfig {
Imdg<Account> imdgAccount; Imdg<Account> imdgAccount;
Imdg<AccountBalance> imdgAccountBalance; Imdg<AccountBalance> imdgAccountBalance;
Imdg<Security> imdgSecurity; Imdg<Security> imdgSecurity;
Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity;
Imdg<TradingClearingRegistry> imdgTradingClearingRegistry; Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
Imdg<Session> imdgSession; Imdg<Session> imdgSession;
Imdg<SectionDictionary> imdgSectionDictionary; Imdg<SectionDictionary> imdgSectionDictionary;
@ -48,6 +50,7 @@ public class ValidationConfig {
this.imdgTradingClearingRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.imdgTradingClearingRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class);
this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
} }
@Bean("executionDepositValidator") @Bean("executionDepositValidator")
@ -68,16 +71,34 @@ public class ValidationConfig {
}; };
} }
@Bean("sTradesValidator") @Bean("sTradesValidatorFond")
public Function<STrades, IValidator> sTradesValidator() { public Function<STrades, IValidator> sTradesValidator() {
return sTrades -> { return sTrades -> {
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);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
STradesValidationRule.SecurityPresent, STradesValidationRule.SecurityPresentFond,
STradesValidationRule.CompanyPresent,
STradesValidationRule.CounterCompanyPresent,
STradesValidationRule.TradingClearingRegistryPresent);
};
}
@Bean("sTradesValidatorDeposit")
public Function<STrades, IValidator> sTradesValidatorDeposit() {
return sTrades -> {
ImdgValidationContext<STrades> context = new ImdgValidationContext<>();
context.setValidatedObject(sTrades);
context.addImdg(IMDGDistributedNames.Map_Security, imdgSecurity);
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, imdgMoneyMarketSecurity);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
return new ValidatorImpl<>(context,
STradesValidationRule.SecurityPresentDeposit,
STradesValidationRule.CompanyPresent, STradesValidationRule.CompanyPresent,
STradesValidationRule.CounterCompanyPresent, STradesValidationRule.CounterCompanyPresent,
STradesValidationRule.TradingClearingRegistryPresent); STradesValidationRule.TradingClearingRegistryPresent);

View file

@ -36,6 +36,7 @@ import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -60,11 +61,13 @@ public class ExecutionDepositComponent {
private final IMessageResolver msgResolver; private final IMessageResolver msgResolver;
private final Function<STrades, IValidator> stradesValidator; private final Function<STrades, IValidator> stradesValidator;
private final KafkaSender kafkaSender; private final KafkaSender kafkaSender;
private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyyyy");
@Autowired @Autowired
public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka, public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
@Qualifier("sTradesValidator") Function<STrades, IValidator> stradesValidator, @Qualifier("sTradesValidatorDeposit") Function<STrades, IValidator> stradesValidator,
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender,
IMessageResolver msgResolver) { IMessageResolver msgResolver) {
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
@ -192,12 +195,19 @@ public class ExecutionDepositComponent {
} }
eDeposit.setFirstLegAmount(sTrades.getValue()); eDeposit.setFirstLegAmount(sTrades.getValue());
eDeposit.setSecondLegAmount(sTrades.getValue()); eDeposit.setSecondLegAmount(sTrades.getValue());
String companyContract = null;
{ {
Side sTradeSide = IEnumKey.getEnumByKey(Side.class, sTrades.getOperation()); Side sTradeSide = IEnumKey.getEnumByKey(Side.class, sTrades.getOperation());
if (sTradeSide != null) { if (sTradeSide != null) {
switch (sTradeSide) { switch (sTradeSide) {
case BUY -> eDeposit.setSide(MoneyFlowSide.BUY.getKey()); case BUY -> {
case SELL -> eDeposit.setSide(MoneyFlowSide.SELL.getKey()); companyContract = sTrades.getFirmId();
eDeposit.setSide(MoneyFlowSide.BUY.getKey());
}
case SELL -> {
companyContract = sTrades.getCpFirmId();
eDeposit.setSide(MoneyFlowSide.SELL.getKey());
}
} }
} }
} }
@ -216,7 +226,12 @@ public class ExecutionDepositComponent {
eDeposit.setSecurityFullName(security.getFullName()); eDeposit.setSecurityFullName(security.getFullName());
eDeposit.setSecuritySymbol(security.getSecuritySymbol()); eDeposit.setSecuritySymbol(security.getSecuritySymbol());
eDeposit.setSecurityId(security.getId()); eDeposit.setSecurityId(security.getId());
eDeposit.setContract(sTrades.getClassCode()); String contract = String.format("%s/%s/%s/%s",
sTrades.getSecCode(),
LocalDate.now().format(contractFormatter),
companyContract,
sTrades.getTradeNum());
eDeposit.setContract(contract);
eDeposit.setCounterPartyId(counterCompany.getId()); eDeposit.setCounterPartyId(counterCompany.getId());
return eDeposit; return eDeposit;
} }

View file

@ -61,7 +61,7 @@ public class ExecutionFondComponent {
@Autowired @Autowired
public ExecutionFondComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka, public ExecutionFondComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
@Qualifier("sTradesValidator") Function<STrades, IValidator> stradesValidator, @Qualifier("sTradesValidatorFond") Function<STrades, IValidator> stradesValidator,
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) { @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) {
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);

View file

@ -3,6 +3,7 @@ package ru.spcex.clearing.service.validation;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.misc.STrades; import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -21,7 +22,7 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
// 2.1. Найти в security запись, у которой security.securitySymbol=sTrades.secCode. // 2.1. Найти в security запись, у которой security.securitySymbol=sTrades.secCode.
// Если такой записи нет, записать в лог ошибку (5416) "Инструмент %s не найден". // Если такой записи нет, записать в лог ошибку (5416) "Инструмент %s не найден".
SecurityPresent() { SecurityPresentFond() {
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<STrades> context) { public Optional<EnumMessage> validate(ImdgValidationContext<STrades> context) {
STrades validatedObject = context.getValidatedObject(); STrades validatedObject = context.getValidatedObject();
@ -37,6 +38,24 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
return empty(); return empty();
} }
}, },
SecurityPresentDeposit() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<STrades> context) {
STrades validatedObject = context.getValidatedObject();
if (TextUtil.isEmpty(validatedObject.getSecCode())) {
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
}
String secCode = validatedObject.getSecCode().trim();
secCode = secCode.substring(0, Math.min(7, secCode.length()));
Imdg<MoneyMarketSecurity> securityImdg = context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
Security security = securityImdg.getSingleObjectByFieldValues(Map.of("securitySymbol", secCode));
if (security == null) {
return of(ClearingError.SecurityNotFound, secCode);
}
context.storeObject(ValidationStored.STradesSecurity, security);
return empty();
}
},
// 2.2. Найти в company запись, у которой company.tradingCode=sTrades.firmId. // 2.2. Найти в company запись, у которой company.tradingCode=sTrades.firmId.
// Если такой записи нет, записать в лог ошибку (5410) "Компания %s не найдена". // Если такой записи нет, записать в лог ошибку (5410) "Компания %s не найдена".
CompanyPresent() { CompanyPresent() {