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.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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue