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 864f759a9..7c8961025 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 @@ -31,6 +31,7 @@ import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf55; import ru.clearing.classes.statics.data.sdf.SDf57; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; +import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.statement.Statement; @@ -91,6 +92,7 @@ public class ValidationConfig { Imdg fixedIncomeSecurityImdg; Imdg equitySecurityImdg; Imdg currencyPairSecurityImdg; + Imdg digitalCertificateSecurityImdg; Imdg imdgCompanySymbols; Imdg imdgRegistry; @@ -138,6 +140,7 @@ public class ValidationConfig { this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.ctgrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); this.currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class); + this.digitalCertificateSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class); this.imdgProvider = imdgProvider; } @@ -216,6 +219,7 @@ public class ValidationConfig { context.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_SDf20, imdgSdf20); + context.addImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, digitalCertificateSecurityImdg); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, CompanyByTradingCodeValidationRule.instance(SDf21::getDepoCodeCl), @@ -305,6 +309,7 @@ public class ValidationConfig { context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Session, imdgSession); + context.addImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, digitalCertificateSecurityImdg); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, Sdf10ValidationRule.DepoAccountPresent, @@ -458,6 +463,7 @@ public class ValidationConfig { ctx.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity); ctx.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg); ctx.addImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, currencyPairSecurityImdg); + ctx.addImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, digitalCertificateSecurityImdg); return new ValidatorImpl<>(ctx, Sdf20ValidationRule.Fields, Sdf20ValidationRule.AccountPresent, 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 deleted file mode 100644 index 3a97965e6..000000000 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/STradesValidationRule.java +++ /dev/null @@ -1,167 +0,0 @@ -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.CurrencyPairSecurity; -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; -import ru.spcex.platform.enumeration.ServiceStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.text.TextUtil; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Map; -import java.util.Optional; - -public enum STradesValidationRule implements IValidationRule> { - - // 2.1. Найти в security запись, у которой security.securitySymbol=sTrades.secCode. - // Если такой записи нет, записать в лог ошибку (5416) "Инструмент %s не найден". - SecurityPresentFond() { - @Override - public Optional validate(ImdgValidationContext context) { - STrades validatedObject = context.getValidatedObject(); - if (TextUtil.isEmpty(validatedObject.getSecCode())) { - return of(ClearingError.SecurityNotFound, validatedObject.getSecCode()); - } - SecuritySelector slctr = new SecuritySelector<>( - context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class) - ); - Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode().trim()); - if (security == null) { - return of(ClearingError.SecurityNotFound, validatedObject.getSecCode()); - } - context.storeObject(ValidationStored.STradesSecurity, security); - return empty(); - } - }, - SecurityPresentDeposit() { - @Override - public Optional 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.getFirstObjectByFieldValues(Map.of("securitySymbol", secCode)); - if (security == null) { - return of(ClearingError.SecurityNotFound, secCode); - } - context.storeObject(ValidationStored.STradesSecurity, security); - return empty(); - } - }, - SecurityPresentCurrencyPair() { - @Override - public Optional validate(ImdgValidationContext context) { - STrades validatedObject = context.getValidatedObject(); - if (TextUtil.isEmpty(validatedObject.getSecCode())) { - return of(ClearingError.SecurityNotFound, validatedObject.getSecCode()); - } - - String secCode = validatedObject.getSecCode().trim(); - SecuritySelector slctr = new SecuritySelector<>( - context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class) - ); - Security security = slctr.selectSecurityBySymbol(secCode); - /* - Imdg securityImdg = context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class); - String secCode = validatedObject.getSecCode(); - Security security = securityImdg.getFirstObjectByFieldValues(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() { - @Override - public Optional validate(ImdgValidationContext context) { - STrades validatedObject = context.getValidatedObject(); - if (TextUtil.isEmpty(validatedObject.getFirmId())) { - return of(ClearingError.CompanyNotFound, validatedObject.getFirmId()); - } - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company company = companyImdg.getFirstObjectByFieldValues(Map.of("tradingCode", validatedObject.getFirmId())); - if (company == null) { - return of(ClearingError.CompanyNotFound, validatedObject.getFirmId()); - } - context.storeObject(ValidationStored.STradesCompany, company); - return empty(); - } - }, - CounterCompanyPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - STrades validatedObject = context.getValidatedObject(); - if (TextUtil.isEmpty(validatedObject.getCpFirmId())) { - return of(ClearingError.CompanyNotFound, validatedObject.getCpFirmId()); - } - Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - Company company = companyImdg.getFirstObjectByFieldValues(Map.of("tradingCode", validatedObject.getCpFirmId())); - if (company == null) { - return of(ClearingError.CompanyNotFound, validatedObject.getCpFirmId()); - } - context.storeObject(ValidationStored.STradesCounterCompany, company); - return empty(); - } - - }, - // 2.3. Найти в tradingClearingRegistry запись, у которой tradingClearingRegistry.code=sTrades.account - // и tradingClearingRegistry.companyId=companyId, найденому в предыдущем пункте. - // Если такой записи нет, записать в лог ошибку (5418) "Торгово-клиринговый регистр %s не найден для компании %s". - TradingClearingRegistryPresent() { - @Override - public Optional validate(ImdgValidationContext context) { - STrades validatedObject = context.getValidatedObject(); - if (TextUtil.isEmpty(validatedObject.getAccount())) { - return of(ClearingError.TradingClearingRegistryNotFound, "", validatedObject.getAccount()); - } - if (context.getStoredObject(ValidationStored.STradesCompany) == null) { //maybe unnecessary - return of(ClearingError.CompanyNotFound, validatedObject.getSecCode()); - } - Imdg registryImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - TradingClearingRegistry tcRegister = registryImdg.getFirstObjectByFieldValues( - Map.of("code", validatedObject.getAccount().trim(), - "companyId", ((Company) context.getStoredObject(ValidationStored.STradesCompany)).getId() - )); - if (tcRegister == null) { - return of(ClearingError.TradingClearingRegistryNotFound, "", validatedObject.getAccount()); - } - // 2.4. Проверить, что найденный торгово-клиринговый регистр в активном состоянии: - // tradingClearingRegistry.status≠BLKD/SSPD/CLOS (см. справочник serviceStatus). - // Иначе записать в лог ошибку (5419) "Торгово-клиринговый регистр %s неактивен". - ServiceStatus status = IEnumKey.getEnumByKey(ServiceStatus.class, tcRegister.getStatus()); - if (IEnumKey.contains(status, ServiceStatus.Blocked, ServiceStatus.Suspended, ServiceStatus.Closed)) { - return of(ClearingError.TradingClearingRegistryNotActive, validatedObject.getAccount()); - } - context.storeObject(ValidationStored.STradesTradingClearingRegistry, tcRegister); - return empty(); - } - }; - - @Override - public String ruleName() { - return "STradesValidationRule." + name(); - } -} \ No newline at end of file diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf20ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf20ValidationRule.java index ce411bc43..f80377443 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf20ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf20ValidationRule.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.service.validation; +import java.math.BigDecimal; +import java.util.Map; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.account.Account; @@ -7,13 +10,17 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf20; -import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.registry.RegistryManager; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.NoRef; +import ru.spcex.platform.enumeration.OperationCode; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; +import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @@ -22,16 +29,10 @@ import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.text.TextUtil; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.math.BigDecimal; -import java.util.Map; -import java.util.Optional; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import static ru.spcex.platform.utils.number.BigDecimalUtil.parseLeadingZeroes; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; +import ru.spcex.platform.utils.text.TextUtil; +import ru.spcex.platform.utils.validation.IValidationRule; public enum Sdf20ValidationRule implements IValidationRule> { Fields() { @@ -109,7 +110,8 @@ public enum Sdf20ValidationRule implements IValidationRule implements IValidationRule> { private final Function securitySymbolExtractor; @@ -37,7 +36,8 @@ public class SecurityBySecurityCodeValidationRule implements IValidationRule< context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class), - context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class) + context.obtainMap(IMDGDistributedNames.Map_CurrencyPairSecurity, Security.class), + context.obtainMap(IMDGDistributedNames.Map_DigitalCertificateSecurity, Security.class) ); Security security = secSel.selectSecurityBySymbol(securitySymbol); if (security == null) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index 6c8661729..2aa2cd40f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -31,6 +31,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; +import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; import ru.clearing.platform.dictionary.CurrencyPairDictionary; @@ -88,6 +89,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { private final Imdg clAccImdg; private final Imdg dpAccImdg; private final Imdg currPairSecImdg; + private final Imdg digitCertSecImdg; private final Imdg fixIncSecImdg; private final Imdg monMrktSecImdg; private final Imdg eqtySecImdg; @@ -118,6 +120,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { this.clAccImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class, null); this.dpAccImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class, null); this.currPairSecImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class, cash.currPairCash); + this.digitCertSecImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class, cash.digitCertSecCash); this.fixIncSecImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class, cash.fixIncSecCash); this.monMrktSecImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class, cash.monMrktSecCash); this.eqtySecImdg = imdgProvider.getCashingImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class, cash.eqtySecCash); @@ -130,7 +133,8 @@ public class RequirementsAndObligationCreation implements ISessionStage { this.secSelector = new SecuritySelector<>(castSecImdg(fixIncSecImdg), castSecImdg(monMrktSecImdg), castSecImdg(eqtySecImdg), - castSecImdg(currPairSecImdg)); + castSecImdg(currPairSecImdg), + castSecImdg(digitCertSecImdg)); } private static Imdg castSecImdg(Imdg m) { @@ -497,6 +501,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { protected final CashV2 clrAccCash; protected final CashV2 ssnCash; protected final CashV2 currPairCash; + protected final CashV2 digitCertSecCash; protected final CashV2 fixIncSecCash; protected final CashV2 monMrktSecCash; protected final CashV2 eqtySecCash; @@ -513,6 +518,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { clrAccCash = add(new CashV2ById<>("clrAccCash")); ssnCash = add(new CashV2ById<>("ssnCash")); currPairCash = add(new CashV2ById<>("currPairCash")); + digitCertSecCash = add(new CashV2ById<>("digitCertSecCash")); fixIncSecCash = add(new CashV2ById<>("fixIncSecCash")); monMrktSecCash = add(new CashV2ById<>("monMrktSecCash")); eqtySecCash = add(new CashV2ById<>("eqtySecCash")); diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java index 5193ee919..3a9e7fda5 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/SecuritySelector.java @@ -21,7 +21,7 @@ public class SecuritySelector { private CashV2ByString equitySecurityCash = null; private final Imdg currencyPairSecurity; private CashV2ByString currencyPairSecurityCash = null; - private Imdg digitCertSecurity; + private final Imdg digitCertSecurity; private CashV2ByString digitCertSecCash = null; public SecuritySelector(ImdgProvider imdgProvider, Class clazz) { @@ -35,20 +35,12 @@ public class SecuritySelector { public SecuritySelector(Imdg fixedIncomeSecurityImdg, Imdg moneyMarketSecurityImdg, Imdg equitySecurity, - Imdg currencyPairSecurity) { + Imdg currencyPairSecurity, + Imdg digitCertSecurity) { this.fixedIncomeSecurityImdg = fixedIncomeSecurityImdg; this.moneyMarketSecurityImdg = moneyMarketSecurityImdg; this.equitySecurity = equitySecurity; this.currencyPairSecurity = currencyPairSecurity; - this.digitCertSecurity = null; - } - - public SecuritySelector(Imdg fixedIncomeSecurityImdg, - Imdg moneyMarketSecurityImdg, - Imdg equitySecurity, - Imdg currencyPairSecurity, - Imdg digitCertSecurity) { - this(fixedIncomeSecurityImdg, moneyMarketSecurityImdg, equitySecurity, currencyPairSecurity); this.digitCertSecurity = digitCertSecurity; } @@ -89,7 +81,9 @@ public class SecuritySelector { security = retriever.apply(equitySecurity); if (security != null) return security; security = retriever.apply(currencyPairSecurity); - return security;// null + if (security != null) return security; + security = retriever.apply(digitCertSecurity); + return security; } private T selectSecurityByAnything(BiFunction, CashV2ByString, T> retriever) {