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 00121368a..1c33fe8fa 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 @@ -37,6 +37,7 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.LogPrefixId; +import ru.spcex.platform.imdg.validation.rule.AnltAccLoad; import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; @@ -374,6 +375,7 @@ public class ValidationConfig { context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); + context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, IdentificationFundsValidationRule.Fields, @@ -381,7 +383,8 @@ public class ValidationConfig { IdentificationFundsValidationRule.RegistryCodeCheck, IdentificationFundsValidationRule.BalanceCheck, IdentificationFundsValidationRule.TcrCheck, - IdentificationFundsValidationRule.AssetsCheck + IdentificationFundsValidationRule.AssetsCheck, + new AnltAccLoad(ClearingError.GeneralError) ); }; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index 7f449a5ac..b3ca256ca 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -31,6 +31,8 @@ public enum ClearingError implements IErrorEnumId { ActiveSessionIsPresent(5428L), AccountIsNotMatchedWithCompany(5429L), RgsWrongCode(5430L), + RefundDateCannotBeChanged(5431L), + PlanBalanceReviseError(5432L), //ошибки "перенесенные" из balance-service, CompanyNotFoundB(5211L), CurrencyNotFound(5213L), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index cd3a090e1..5b7d00041 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -4,6 +4,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.error.ClearingError; @@ -15,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRe import ru.spcex.clearing.platform.messaging.domain.cud.registry.*; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.service.builder.PaymentInstructionBuilderV2; import ru.spcex.clearing.service.integration.GatewayRequestCreator; import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.schedule.TradingTimeService; @@ -54,6 +57,7 @@ public class RegistryService { private final ImdgProvider imdgProvider; private final Imdg tradingClearingRegistryImdg; private final Imdg registryImdg; + private final Imdg pmtImdg; private final Function returnDepositVal; private final Function refundDateVal; private final Function statusExtractVal; @@ -84,6 +88,7 @@ public class RegistryService { this.imdgProvider = imdgProvider; this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.returnDepositVal = returnDepositVal; this.refundDateVal = refundDateVal; this.identificationFundsVal = identificationFundsVal; @@ -247,7 +252,9 @@ public class RegistryService { return reqHelp.error(req.getId(), err.get()); } Registry dmau = validator.getStored(Stored.PresentById); + AnltSearcher.AnltSearch accCompTcr = validator.getStored(ValidationStored.IdentificationFundsTcrSearch); AssetTrio asts = validator.getStored(ValidationStored.IdentificationFundsAssetTrio); + Account anltAcc = validator.getStored(Stored.AnltAccount); BigDecimal dmauBalance = safeBD(dmau.getBalance()); BigDecimal reqBalance = payload.getBalance(); BigDecimal am_tBalance = safeBD(asts.a__t().getBalance()); @@ -257,9 +264,35 @@ public class RegistryService { Instant now = Instant.now(); dmau.setUpdated(now); asts.a__t().setUpdated(now); + //paymentInstruction + PaymentInstruction pmt = PaymentInstructionBuilderV2.builder(imdgProvider) + .registry(asts.a__b()) + .sender(Sender.One.getId()) + .addressee(accCompTcr.getCompany().getId()) + .debitLegAccount(accCompTcr.getAccount()) + .creditLegAccount(anltAcc) + .amount(payload.getBalance()) + .sessionId(null) + .purpose("purpose") + .build(); + pmt.setTransactionStatus(TransactionStatus.ok.getKey()); + pmtImdg.insert(pmt); + //BankAccount bnkAcc = bnkAccImdg.getFirstObjectBySQL("accountId = %d".formatted(accDeb.getId())); + // if (bnkAcc != null) { + // pmt.setAddresseeBankName(bnkAcc.getBankIdentificationCode()); + // pmt.setDebit_csAccount(bnkAcc.getCorrespondentAccount()); + // } + // Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())); + // if (currency != null) { + // pmt.setCreditLeg_securityId(currency.getId()); + // pmt.setDebitLeg_securityId(currency.getId()); + // } + // pmt.setTransactionStatus(TransactionStatus.stld.getKey()); registryImdg.update(dmau); registryImdg.update(asts.a__t()); assets.process(asts.a__b(), asts.a__t(), asts.a__f(), BigDecimal.ZERO); + log.debug("IdentificationFundsRequest.id={} dmau.id={} am*t.id={} payment_instruction.id={}", + req.getId(), dmau.getId(), asts.a__t().getId(), pmt.getId()); return reqHelp.success(req.getId()); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java index 31f29fafe..672acc2a8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/IdentificationFundsValidationRule.java @@ -16,6 +16,8 @@ import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; @@ -76,10 +78,6 @@ public enum IdentificationFundsValidationRule implements IValidationRule validate(ImdgValidationContext context) { IdentificationFundsRequest validatedObject = context.getValidatedObject(); - Registry rgs = context.getStoredObject(Stored.PresentById); - if (rgs == null) { - return of(ClearingError.GeneralError); - } Imdg tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId()); @@ -130,6 +128,22 @@ public enum IdentificationFundsValidationRule implements IValidationRule validate(ImdgValidationContext context) { + Imdg accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + ImdgPredicateBuilder pb = accImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("companyId", 1L), + pb.equals("accountType", AccountType.Anlt.getKey()) + ); + Account anltAcc = accImdg.getSingleObjectByPredicate(prdct); + if (anltAcc == null) { + return of(ClearingError.GeneralError); + } + return empty(); + } } ; private final static Logger log = LoggerFactory.getLogger(IdentificationFundsValidationRule.class); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java index 01a572572..97035600f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RefundDateValidationRule.java @@ -41,10 +41,15 @@ public enum RefundDateValidationRule implements IValidationRule rgss = rgsImdg.getCollectionObjectsByPredicate(prdct).stream() + Collection group = rgsImdg.getCollectionObjectsByPredicate(prdct); + if (group.stream().anyMatch(r -> RegistryStatus.SPLT.equalsByKey(r.getRegistryStatus()))) { + return of(ClearingError.RefundDateCannotBeChanged); + } + Collection rgss = group.stream() .filter(rgs -> Objects.nonNull(rgs.getSettlementDate())) .filter(rgs -> Objects.nonNull(rgs.getValueDate())) .filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate())) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java index 8171341d3..ae8f646b8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java @@ -63,8 +63,15 @@ public abstract class AbstractSession { return runStage(type, null, stage); } - @SuppressWarnings("unchecked") protected StageResult runStage(TaskType type, T payload, ISessionStage stage) { + return runStage(type, payload, stage, true); + } + + @SuppressWarnings("unchecked") + protected StageResult runStage(TaskType type, + T payload, + ISessionStage stage, + boolean stopSession) { continueRunning(type); log.info("session.id={} step {} started", currSession.getId(), currStage.get()); Task t = new Task<>(type, payload); @@ -73,7 +80,7 @@ public abstract class AbstractSession { currSession.getId(), currStage.get(), stgRes.success ? "success" : messageResolver.resolve(stgRes.error)); - if (!stgRes.success) { + if (!stgRes.success && stopSession) { endSession(); throw new StageException(); } @@ -111,6 +118,15 @@ public abstract class AbstractSession { } } + protected void checkStageAndThrow(TaskType t) { + synchronized (this.currStage) { + if (!t.equals(this.currStage.get())) { + log.error("cannot continue session, expected stage {} current stage is {}", t, currStage.get()); + throw new StageException(); + } + } + } + protected boolean isRunning() { synchronized (this.currStage) { return this.currStage.get() != null; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java index 008940e5e..3a02ffa88 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java @@ -56,6 +56,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public FinalMkrSession( ImdgProvider imdgProvider, @@ -145,6 +146,12 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean } if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { afterPaymentsSdf4Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -235,13 +242,16 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { 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 d5df17ed8..269d0553c 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 @@ -53,6 +53,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public IntermediateMkrSession( @@ -138,6 +139,12 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ } if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { afterPaymentsSdf4Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -213,13 +220,16 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java index 79d2148f9..94b627840 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java @@ -53,6 +53,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public PrimaryAuctionB0Session( @@ -131,6 +132,12 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali } if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { afterPaymentsSdf4And13Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -204,13 +211,16 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java index 81b2cd3bb..e0577eab0 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java @@ -53,6 +53,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public PrimaryAuctionBnSession( @@ -132,6 +133,12 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali } if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { afterPaymentsSdf4And13Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -206,13 +213,16 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java index 77534c8d1..3fa6566d1 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java @@ -53,6 +53,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public PrimaryAuctionT0Session( ImdgProvider imdgProvider, @@ -132,6 +133,12 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali } if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { afterPaymentsSdf4And13Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -205,13 +212,16 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java index a6fbf2c89..4eadca2cb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java @@ -45,6 +45,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public ReturnDepositSession( @@ -123,9 +124,16 @@ public class ReturnDepositSession extends AbstractSession implements Initializin } if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { afterPaymentsSdf4Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); finishPart(); return; } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; + finishPart(); + return; + } + //if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) { // afterPaymentsReviseMonitor = null; // finishPart(); @@ -184,13 +192,16 @@ public class ReturnDepositSession extends AbstractSession implements Initializin public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java index 61148f3a2..c41448168 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java @@ -50,6 +50,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia private SessionMonitor firstReviseMonitor; private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; public SecondaryAuctionT0Session( @@ -126,6 +127,12 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia } if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { afterPaymentsSdf4And13Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; finishPart(); return; } @@ -200,13 +207,16 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia public void finishPart() { try { - if (!checkStage(TaskType.FormingPaymentInstruction)) { - log.error("cannot continue session, current stage is {}", currStage.get()); - throw new StageException(); - } //stage 9 continue revision { - runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } } //stage 10 { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java index c2a17fe40..3d2bf6605 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java @@ -10,6 +10,7 @@ import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf56; import ru.clearing.classes.statics.data.statement.Statement; +import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; @@ -22,10 +23,12 @@ import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.StatementRevisePredicate; +import ru.spcex.platform.utils.enumeration.EnumMessage; -import java.math.BigDecimal; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Collection; @@ -128,9 +131,19 @@ public class BalanceRevise implements ISessionStage { } private StageResult reviseStage3() { - String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.A__T).build(); - Collection regsAT = registryImdg.getCollectionObjectsBySQL(sql); - log.trace("Select {} registry's by query \"{}\" for revision step 3", regsAT.size(), sql); + //clnr info depo + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.A__T).build()), + pb.or( + pb.equals("accountType", AccountType.Clrn.getKey()), + pb.equals("accountType", AccountType.Info.getKey()), + pb.equals("accountType", AccountType.Depo.getKey()) + ) + + ); + Collection regsAT = registryImdg.getCollectionObjectsByPredicate(prdct); + log.trace("Select {} registry's by query \"{}\" for revision step 3", regsAT.size(), prdct); int errorRegs = 0; for (Registry reg : regsAT) { @@ -152,12 +165,14 @@ public class BalanceRevise implements ISessionStage { log.warn("После сверки обнаружена разница между плановым и фактическим балансом. Всего {} регистров не совпали.", errorRegs); NotificationNewRequest nRequest = new NotificationNewRequest(); nRequest.setObjectType(ObjectType.rgst.getKey()); - nRequest.setPriority(Priority.LOW.getKey()); + nRequest.setPriority(Priority.HIGH.getKey()); nRequest.setComment("После сверки обнаружена разница между плановым и фактическим балансом"); kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, nRequest); + return new StageResult<>(new EnumMessage(ClearingError.PlanBalanceReviseError), false); + } else { + return new StageResult<>(null, true); } - return new StageResult<>(null, true); } private void newSDf56(Statement statement) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java index 5ee0e3804..16ac67947 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java @@ -48,4 +48,22 @@ public class SessionMonitorFactory { .addCondition(new SdfCondition(SdfTable.SDF_57)); } + + public static SessionMonitor waitReviseError(Section section) { + switch (section) { + case MKR -> { + return SessionMonitor.create() + .addCondition(new SdfCondition(SdfTable.SDF_01)) + .addCondition(new SdfCondition(SdfTable.SDF_57)); + } + case FOND -> { + return SessionMonitor.create() + .addCondition(new SdfCondition(SdfTable.SDF_08)) + .addCondition(new SdfCondition(SdfTable.SDF_21)) + .addCondition(new SdfCondition(SdfTable.SDF_01)) + .addCondition(new SdfCondition(SdfTable.SDF_57)); + } + default -> throw new IllegalStateException("unknown wait conditions for section " + section); + } + } } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java index c9f6ff542..d52c0c27f 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java @@ -7,5 +7,7 @@ public enum Stored { /** * если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById) */ - PresentById + PresentById, + + AnltAccount } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/AnltAccLoad.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/AnltAccLoad.java new file mode 100644 index 000000000..de655ef5b --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/AnltAccLoad.java @@ -0,0 +1,43 @@ +package ru.spcex.platform.imdg.validation.rule; + +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IErrorEnumId; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +/** + * В рексевте необходим интерфейс WithId + */ +public class AnltAccLoad implements IValidationRule> { + private final IErrorEnumId errorEnum; + + public AnltAccLoad(IErrorEnumId errorEnum) { + this.errorEnum = errorEnum; + } + + @Override + public Optional validate(ImdgValidationContext context) { + Imdg accImdg = context.obtainMap(IMDGDistributedNames.Map_Account, SpcexObjectBase.class); + ImdgPredicateBuilder pb = accImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("companyId", Sender.One.getId()), + pb.equals("accountType", AccountType.Anlt.getKey()) + ); + Object anltAcc = accImdg.getSingleObjectByPredicate(prdct); + if (anltAcc == null) { + return of(errorEnum); + } + context.storeObject(Stored.AnltAccount, anltAcc); + return empty(); + } +}