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.sdf.SDf01;
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.platform.dictionary.SectionDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -35,6 +36,7 @@ public class ValidationConfig {
Imdg<Account> imdgAccount;
Imdg<AccountBalance> imdgAccountBalance;
Imdg<Security> imdgSecurity;
Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity;
Imdg<TradingClearingRegistry> imdgTradingClearingRegistry;
Imdg<Session> imdgSession;
Imdg<SectionDictionary> imdgSectionDictionary;
@ -48,6 +50,7 @@ public class ValidationConfig {
this.imdgTradingClearingRegistry = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class);
this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
}
@Bean("executionDepositValidator")
@ -68,16 +71,34 @@ public class ValidationConfig {
};
}
@Bean("sTradesValidator")
@Bean("sTradesValidatorFond")
public Function<STrades, IValidator> sTradesValidator() {
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.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.CounterCompanyPresent,
STradesValidationRule.TradingClearingRegistryPresent);

View file

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

View file

@ -61,7 +61,7 @@ public class ExecutionFondComponent {
@Autowired
public ExecutionFondComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
@Qualifier("sTradesValidator") Function<STrades, IValidator> stradesValidator,
@Qualifier("sTradesValidatorFond") Function<STrades, IValidator> stradesValidator,
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) {
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.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.misc.STrades;
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.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -21,7 +22,7 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
// 2.1. Найти в security запись, у которой security.securitySymbol=sTrades.secCode.
// Если такой записи нет, записать в лог ошибку (5416) "Инструмент %s не найден".
SecurityPresent() {
SecurityPresentFond() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<STrades> context) {
STrades validatedObject = context.getValidatedObject();
@ -37,6 +38,24 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
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.
// Если такой записи нет, записать в лог ошибку (5410) "Компания %s не найдена".
CompanyPresent() {