From 0cba4f2dbbae146376d1fcced3f3ca93b73e91ed Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 29 May 2023 12:05:53 +0300 Subject: [PATCH] ExecutionDeposit company search by sec_code fix ExecutionDeposit#contract fill fix --- .../clearing/config/ValidationConfig.java | 25 +++++++++++++++++-- .../execution/ExecutionDepositComponent.java | 23 ++++++++++++++--- .../execution/ExecutionFondComponent.java | 2 +- .../validation/STradesValidationRule.java | 21 +++++++++++++++- 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 3f46dca2e..f1f1d799f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -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 imdgAccount; Imdg imdgAccountBalance; Imdg imdgSecurity; + Imdg imdgMoneyMarketSecurity; Imdg imdgTradingClearingRegistry; Imdg imdgSession; Imdg 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 sTradesValidator() { return sTrades -> { ImdgValidationContext 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 sTradesValidatorDeposit() { + return sTrades -> { + ImdgValidationContext 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); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index e42996875..97b1b387f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -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 stradesValidator; private final KafkaSender kafkaSender; + private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyyyy"); + @Autowired public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer kafka, - @Qualifier("sTradesValidator") Function stradesValidator, + @Qualifier("sTradesValidatorDeposit") Function 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; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index 4f533e9fc..78fc59dcf 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -61,7 +61,7 @@ public class ExecutionFondComponent { @Autowired public ExecutionFondComponent(ImdgProvider imdgProvider, Producer kafka, - @Qualifier("sTradesValidator") Function stradesValidator, + @Qualifier("sTradesValidatorFond") Function stradesValidator, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java index 7673e340e..97c2ed117 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java @@ -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 validate(ImdgValidationContext context) { STrades validatedObject = context.getValidatedObject(); @@ -37,6 +38,24 @@ public enum STradesValidationRule implements IValidationRule validate(ImdgValidationContext 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 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() {