From 7156c57d981dfe90aac62f50559506da875fa812 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 17 Jul 2023 12:57:07 +0300 Subject: [PATCH] =?UTF-8?q?sdf08=20=D0=BD=D0=B5=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=B2=D0=B0=D1=82=D1=8C=20registry=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=20?= =?UTF-8?q?security=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/config/ValidationConfig.java | 11 ++- .../service/executors/Sdf08Executor.java | 10 +-- .../validation/Sdf08NewValidationRule.java | 21 +++++- .../session/stage/IntermediateMkrSession.java | 68 ++++++++++++------- 4 files changed, 79 insertions(+), 31 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 47f20719c..63b1b8523 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 @@ -8,6 +8,8 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.STrades; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; @@ -37,6 +39,9 @@ public class ValidationConfig { Imdg imdgRelation; Imdg imdgCompany; + Imdg fixedIncomeSecurityImdg; + Imdg equitySecurityImdg; + Imdg imdgCompanySymbols; Imdg imdgRegistry; Imdg imdgAccount; @@ -60,6 +65,8 @@ public class ValidationConfig { 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); + this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); + this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.imdgProvider = imdgProvider; } @@ -203,9 +210,11 @@ public class ValidationConfig { context.setValidatedObject(sDf08); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); + context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg); + context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, - Sdf08NewValidationRule.AccountPresent + Sdf08NewValidationRule.AccountPresent, Sdf08NewValidationRule.InstrumentPresent ); }; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java index 963aebea6..2cbd31a8f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java @@ -132,7 +132,7 @@ public class Sdf08Executor extends AbstractExecutor { } else if (ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf08.getId()); } - if (error.isPresent()) { + if (error.isPresent() && !ClearingError.SecurityNotFound.equals(error.get().getSubject())) { log.error("sdf01.id={} error: {}", sdf08.getId(), messageResolver.resolve(error.get())); //fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); // sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); @@ -146,8 +146,10 @@ public class Sdf08Executor extends AbstractExecutor { statementImdg.insert(stmt); Company company = companyImdg.getSingleObjectByID(account.getCompanyId()); - Optional err = validateActiveness(company, account); - if (err.isEmpty()) { + if (error.isEmpty()) { + error = validateActiveness(company, account); + } + if (error.isEmpty()) { Optional reg = findReg(stmt); Registry rgs; if (reg.isPresent()) { @@ -163,7 +165,7 @@ public class Sdf08Executor extends AbstractExecutor { stmt.setOperationStatus(OperationStatus.Executed.getKey()); statementImdg.update(stmt); } else { - stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert + stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert stmt.setOperationStatus(OperationStatus.Rejected.getKey()); statementImdg.update(stmt); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf08NewValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf08NewValidationRule.java index 9f21f02da..19722ccf8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf08NewValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf08NewValidationRule.java @@ -2,7 +2,10 @@ package ru.spcex.clearing.service.validation; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.sdf.SDf08; +import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingErrorInternal; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -48,10 +51,26 @@ public enum Sdf08NewValidationRule implements IValidationRule validate(ImdgValidationContext context) { + SDf08 sdf08 = context.getValidatedObject(); + Imdg fxIncmSecImdg = context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); + Imdg equityImdg = context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + + Security security = fxIncmSecImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", sdf08.getSecurityCode())); + if (security == null) { + security = equityImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", sdf08.getSecurityCode())); + } + if (security == null) { + return of(ClearingError.SecurityNotFound, sdf08.getSecurityCode()); + } + return empty(); + } }; @Override public String ruleName() { - return "Sdf01NewValidationRule." + name(); + return "Sdf08NewValidationRule." + name(); } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java index 513e7ec46..833e4e8a1 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java @@ -9,22 +9,24 @@ import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.session.stage.impl.*; import ru.spcex.clearing.session.stage.task.*; import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionStatus; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.time.LocalDate; import java.util.Collection; import java.util.List; -import java.util.function.Function; import java.util.function.Supplier; @Service @@ -36,15 +38,18 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ private final ObligationAdmission obligationsAdmission; private final InclusionObligations inclusionObligations; + private final InspectionObligationsDepositReturn inspectionObligationsReturn; private final InspectionObligations inspectionObligations; private final FormingRegistersOnOS formingRegistersOnOS; - private final FormingPaymentInstruction formingPaymentInstruction; + private final FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn; + private final FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals; private final UnlockResources unlockResources; private final FinishingSession finishingSession; private final EndStageNotification endStageNotification; private final Imdg executionDepositImdg; private final Supplier> marketCodes; + private final Imdg registryImdg; public IntermediateMkrSession( @@ -54,13 +59,13 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ RequirementsAndObligationCreation requirementsAndObligationCreation, ObligationAdmission obligationsAdmission, InclusionObligations inclusionObligations, - FormingRegistersOnOS formingRegistersOnOS, - FormingPaymentInstruction formingPaymentInstruction, + InspectionObligations inspectionObligations, FormingRegistersOnOS formingRegistersOnOS, + FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn, FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals, UnlockResources unlockResources, FinishingSession finishingSession, EndStageNotification endStageNotification, IMessageResolver messageResolver, - InspectionObligations inspectionObligations, + InspectionObligationsDepositReturn inspectionObligationsReturn, @Qualifier("marketCodesForBn") Supplier> marketCodes) { super(imdgProvider, messageResolver); this.balanceRevise = balanceRevise; @@ -68,22 +73,35 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ this.requirementsAndObligationCreation = requirementsAndObligationCreation; this.obligationsAdmission = obligationsAdmission; this.inclusionObligations = inclusionObligations; + this.inspectionObligations = inspectionObligations; this.formingRegistersOnOS = formingRegistersOnOS; - this.formingPaymentInstruction = formingPaymentInstruction; + this.formingPaymentInstructionReturn = formingPaymentInstructionReturn; + this.formingPaymentInstructionDeals = formingPaymentInstructionDeals; this.unlockResources = unlockResources; this.finishingSession = finishingSession; this.endStageNotification = endStageNotification; this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); - this.inspectionObligations = inspectionObligations; + this.inspectionObligationsReturn = inspectionObligationsReturn; this.marketCodes = marketCodes; + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @Override public void afterPropertiesSet() throws Exception { dealsPrepare.searchForExecutions(ExecutionType.ExecutionDeposit); -// ImdgPredicateBuilder execFondPb = executionDepositImdg.predicateBuilder(); -// dealsPrepare.addExecutionDepositCondition(execFondPb.regex("firstLegSettlementCode", "(^T0.*$)|(B[^0]\\d*$)")); -// dealsPrepare.addExecutionDepositCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); + //fixme спросить у Кости нужны ли эти поправки + ImdgPredicateBuilder rgsPrctBuilder = registryImdg.predicateBuilder(); + inclusionObligations.addRegistryCondition( + rgsPrctBuilder.and( + rgsPrctBuilder.or( + rgsPrctBuilder.equals("registryStatus", RegistryStatus.PROC.getKey()), + rgsPrctBuilder.equals("registryStatus", RegistryStatus.MNG.getKey()) + ), + rgsPrctBuilder.lessEqual("valueDate", LocalDate.now()) + ) + ); + inspectionObligationsReturn.setSessionType(sessionType()); + inspectionObligations.setSessionType(sessionType()); imdgProvider.waitAvailable(); initSessionIfPresent(); } @@ -127,18 +145,6 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ DealsPreparePayload payload = new DealsPreparePayload(); payload.setSessionId(currSession.getId()); dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, dealsPrepare); - //Сначала обрабатываются записи, у которых settlementCode = значению, у которого первый символ ="T", второй =0, - // а после settlementCode = значению, у которого первый символ ="B", второй ≠0, последующие =любые цифры - dealsPreparationResult.getStageResult().sort((o1, o2) -> { - String o1SettlementCode = ((ExecutionDeposit) o1).getFirstLegSettlementCode(); - String o2SettlementCode = ((ExecutionDeposit) o2).getSecondLegSettlementCode(); - Function mapper = (settlementCode) -> { - if (settlementCode.startsWith("T")) return -1; - else if (settlementCode.startsWith("B")) return 1; - else return 0; - }; - return mapper.apply(o1SettlementCode).compareTo(mapper.apply(o2SettlementCode)); - }); } //stage 2 runStage(TaskType.RequirementsAndObligationsCreate, dealsPreparationResult.getStageResult(), requirementsAndObligationCreation); @@ -155,20 +161,32 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ { InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); + runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsReturn); runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations); } + //stage 6 { FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload(); payload.setSessionId(currSession.getId()); runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection } //stage 7 - StageResult> paymentResult = null; + + StageResult> returnsPayment = null; { FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); payload.setSessionId(currSession.getId()); //stage 7 - paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstruction); + returnsPayment = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionReturn); + } + + StageResult> paymentResult = null; + { + FormingPaymentInstructionDealsMkrPayload payload = new FormingPaymentInstructionDealsMkrPayload(); + payload.setSessionId(currSession.getId()); + payload.setPaymentInstructionReturns(returnsPayment.getStageResult()); + //stage 7 + paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionDeals); } if (paymentResult != null && paymentResult.getStageResult().isEmpty()) { runStage(TaskType.FormingPaymentInstruction, balanceRevise); @@ -189,7 +207,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ { FinishingSessionPayload payload = new FinishingSessionPayload(); payload.setSessionId(currSession.getId()); - payload.setPr("4"); + payload.setPr("3"); runStage(TaskType.FinishingSession, payload, finishingSession); } //stage 11