ExecutionDeposit company search by sec_code fix
ExecutionDeposit#contract fill fix
This commit is contained in:
parent
ad73909774
commit
0cba4f2dbb
4 changed files with 63 additions and 8 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue