identification funds

refund date
sessions error after revision
This commit is contained in:
ialbert 2023-09-22 19:04:22 +03:00
parent 633f34ee51
commit 0f5feb3c7e
17 changed files with 273 additions and 51 deletions

View file

@ -37,6 +37,7 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.LogPrefixId; 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.imdg.validation.rule.PresentById;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
@ -374,6 +375,7 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
IdentificationFundsValidationRule.Fields, IdentificationFundsValidationRule.Fields,
@ -381,7 +383,8 @@ public class ValidationConfig {
IdentificationFundsValidationRule.RegistryCodeCheck, IdentificationFundsValidationRule.RegistryCodeCheck,
IdentificationFundsValidationRule.BalanceCheck, IdentificationFundsValidationRule.BalanceCheck,
IdentificationFundsValidationRule.TcrCheck, IdentificationFundsValidationRule.TcrCheck,
IdentificationFundsValidationRule.AssetsCheck IdentificationFundsValidationRule.AssetsCheck,
new AnltAccLoad(ClearingError.GeneralError)
); );
}; };
} }

View file

@ -31,6 +31,8 @@ public enum ClearingError implements IErrorEnumId {
ActiveSessionIsPresent(5428L), ActiveSessionIsPresent(5428L),
AccountIsNotMatchedWithCompany(5429L), AccountIsNotMatchedWithCompany(5429L),
RgsWrongCode(5430L), RgsWrongCode(5430L),
RefundDateCannotBeChanged(5431L),
PlanBalanceReviseError(5432L),
//ошибки "перенесенные" из balance-service, //ошибки "перенесенные" из balance-service,
CompanyNotFoundB(5211L), CompanyNotFoundB(5211L),
CurrencyNotFound(5213L), CurrencyNotFound(5213L),

View file

@ -4,6 +4,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; 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.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.error.ClearingError; 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.domain.cud.registry.*;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status; 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.integration.GatewayRequestCreator;
import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.schedule.TradingTimeService;
@ -54,6 +57,7 @@ public class RegistryService {
private final ImdgProvider imdgProvider; private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg; private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<PaymentInstruction> pmtImdg;
private final Function<RegistryReturnDepositRequest, IValidator> returnDepositVal; private final Function<RegistryReturnDepositRequest, IValidator> returnDepositVal;
private final Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal; private final Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal;
private final Function<RegistryChangeStatusExtractRequest, IValidator> statusExtractVal; private final Function<RegistryChangeStatusExtractRequest, IValidator> statusExtractVal;
@ -84,6 +88,7 @@ public class RegistryService {
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.returnDepositVal = returnDepositVal; this.returnDepositVal = returnDepositVal;
this.refundDateVal = refundDateVal; this.refundDateVal = refundDateVal;
this.identificationFundsVal = identificationFundsVal; this.identificationFundsVal = identificationFundsVal;
@ -247,7 +252,9 @@ public class RegistryService {
return reqHelp.error(req.getId(), err.get()); return reqHelp.error(req.getId(), err.get());
} }
Registry dmau = validator.getStored(Stored.PresentById); Registry dmau = validator.getStored(Stored.PresentById);
AnltSearcher.AnltSearch accCompTcr = validator.getStored(ValidationStored.IdentificationFundsTcrSearch);
AssetTrio asts = validator.getStored(ValidationStored.IdentificationFundsAssetTrio); AssetTrio asts = validator.getStored(ValidationStored.IdentificationFundsAssetTrio);
Account anltAcc = validator.getStored(Stored.AnltAccount);
BigDecimal dmauBalance = safeBD(dmau.getBalance()); BigDecimal dmauBalance = safeBD(dmau.getBalance());
BigDecimal reqBalance = payload.getBalance(); BigDecimal reqBalance = payload.getBalance();
BigDecimal am_tBalance = safeBD(asts.a__t().getBalance()); BigDecimal am_tBalance = safeBD(asts.a__t().getBalance());
@ -257,9 +264,35 @@ public class RegistryService {
Instant now = Instant.now(); Instant now = Instant.now();
dmau.setUpdated(now); dmau.setUpdated(now);
asts.a__t().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(dmau);
registryImdg.update(asts.a__t()); registryImdg.update(asts.a__t());
assets.process(asts.a__b(), asts.a__t(), asts.a__f(), BigDecimal.ZERO); 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()); return reqHelp.success(req.getId());
} }

View file

@ -16,6 +16,8 @@ import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg; 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.ImdgValidationContext;
import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
@ -76,10 +78,6 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) { public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) {
IdentificationFundsRequest validatedObject = context.getValidatedObject(); IdentificationFundsRequest validatedObject = context.getValidatedObject();
Registry rgs = context.getStoredObject(Stored.PresentById);
if (rgs == null) {
return of(ClearingError.GeneralError);
}
Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); Imdg<TradingClearingRegistry> tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId()); TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId());
@ -130,6 +128,22 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
context.storeObject(ValidationStored.IdentificationFundsAssetTrio, assetTrio.get()); context.storeObject(ValidationStored.IdentificationFundsAssetTrio, assetTrio.get());
return Optional.empty(); return Optional.empty();
} }
},
AnltLoad() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) {
Imdg<Account> 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); private final static Logger log = LoggerFactory.getLogger(IdentificationFundsValidationRule.class);

View file

@ -41,10 +41,15 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
pb.equals("groupId", validatedObject.getGroupId()), pb.equals("groupId", validatedObject.getGroupId()),
pb.or( pb.or(
pb.equals("registryStatus", RegistryStatus.PROC.getKey()), pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("registryStatus", RegistryStatus.MNG.getKey()) pb.equals("registryStatus", RegistryStatus.MNG.getKey()),
pb.equals("registryStatus", RegistryStatus.SPLT.getKey())
) )
); );
Collection<Registry> rgss = rgsImdg.getCollectionObjectsByPredicate(prdct).stream() Collection<Registry> group = rgsImdg.getCollectionObjectsByPredicate(prdct);
if (group.stream().anyMatch(r -> RegistryStatus.SPLT.equalsByKey(r.getRegistryStatus()))) {
return of(ClearingError.RefundDateCannotBeChanged);
}
Collection<Registry> rgss = group.stream()
.filter(rgs -> Objects.nonNull(rgs.getSettlementDate())) .filter(rgs -> Objects.nonNull(rgs.getSettlementDate()))
.filter(rgs -> Objects.nonNull(rgs.getValueDate())) .filter(rgs -> Objects.nonNull(rgs.getValueDate()))
.filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate())) .filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate()))

View file

@ -63,8 +63,15 @@ public abstract class AbstractSession {
return runStage(type, null, stage); return runStage(type, null, stage);
} }
@SuppressWarnings("unchecked")
protected <T, R> StageResult<R> runStage(TaskType type, T payload, ISessionStage stage) { protected <T, R> StageResult<R> runStage(TaskType type, T payload, ISessionStage stage) {
return runStage(type, payload, stage, true);
}
@SuppressWarnings("unchecked")
protected <T, R> StageResult<R> runStage(TaskType type,
T payload,
ISessionStage stage,
boolean stopSession) {
continueRunning(type); continueRunning(type);
log.info("session.id={} step {} started", currSession.getId(), currStage.get()); log.info("session.id={} step {} started", currSession.getId(), currStage.get());
Task<T> t = new Task<>(type, payload); Task<T> t = new Task<>(type, payload);
@ -73,7 +80,7 @@ public abstract class AbstractSession {
currSession.getId(), currSession.getId(),
currStage.get(), currStage.get(),
stgRes.success ? "success" : messageResolver.resolve(stgRes.error)); stgRes.success ? "success" : messageResolver.resolve(stgRes.error));
if (!stgRes.success) { if (!stgRes.success && stopSession) {
endSession(); endSession();
throw new StageException(); 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() { protected boolean isRunning() {
synchronized (this.currStage) { synchronized (this.currStage) {
return this.currStage.get() != null; return this.currStage.get() != null;

View file

@ -56,6 +56,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsSdf4Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public FinalMkrSession( public FinalMkrSession(
ImdgProvider imdgProvider, ImdgProvider imdgProvider,
@ -145,6 +146,12 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
} }
if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) {
afterPaymentsSdf4Monitor = null; afterPaymentsSdf4Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -235,13 +242,16 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -53,6 +53,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsSdf4Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public IntermediateMkrSession( public IntermediateMkrSession(
@ -138,6 +139,12 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
} }
if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) {
afterPaymentsSdf4Monitor = null; afterPaymentsSdf4Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -213,13 +220,16 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -53,6 +53,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsSdf4And13Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public PrimaryAuctionB0Session( public PrimaryAuctionB0Session(
@ -131,6 +132,12 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali
} }
if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
afterPaymentsSdf4And13Monitor = null; afterPaymentsSdf4And13Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -204,13 +211,16 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -53,6 +53,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsSdf4And13Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public PrimaryAuctionBnSession( public PrimaryAuctionBnSession(
@ -132,6 +133,12 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
} }
if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
afterPaymentsSdf4And13Monitor = null; afterPaymentsSdf4And13Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -206,13 +213,16 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -53,6 +53,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsSdf4And13Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public PrimaryAuctionT0Session( public PrimaryAuctionT0Session(
ImdgProvider imdgProvider, ImdgProvider imdgProvider,
@ -132,6 +133,12 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali
} }
if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
afterPaymentsSdf4And13Monitor = null; afterPaymentsSdf4And13Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -205,13 +212,16 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -45,6 +45,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4Monitor; private SessionMonitor afterPaymentsSdf4Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public ReturnDepositSession( public ReturnDepositSession(
@ -123,9 +124,16 @@ public class ReturnDepositSession extends AbstractSession implements Initializin
} }
if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4Monitor != null && isMonitorPassed(afterPaymentsSdf4Monitor, req.getRequestPayload())) {
afterPaymentsSdf4Monitor = null; afterPaymentsSdf4Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart(); finishPart();
return; return;
} }
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart();
return;
}
//if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) { //if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) {
// afterPaymentsReviseMonitor = null; // afterPaymentsReviseMonitor = null;
// finishPart(); // finishPart();
@ -184,13 +192,16 @@ public class ReturnDepositSession extends AbstractSession implements Initializin
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -50,6 +50,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
private SessionMonitor firstReviseMonitor; private SessionMonitor firstReviseMonitor;
private SessionMonitor afterPaymentsSdf4And13Monitor; private SessionMonitor afterPaymentsSdf4And13Monitor;
private SessionMonitor afterPaymentsReviseMonitor; private SessionMonitor afterPaymentsReviseMonitor;
private SessionMonitor afterReviseErrorMonitor;
public SecondaryAuctionT0Session( public SecondaryAuctionT0Session(
@ -126,6 +127,12 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
} }
if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
afterPaymentsSdf4And13Monitor = null; afterPaymentsSdf4And13Monitor = null;
checkStageAndThrow(TaskType.FormingPaymentInstruction);
finishPart();
return;
}
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
afterReviseErrorMonitor = null;
finishPart(); finishPart();
return; return;
} }
@ -200,13 +207,16 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
public void finishPart() { public void finishPart() {
try { try {
if (!checkStage(TaskType.FormingPaymentInstruction)) {
log.error("cannot continue session, current stage is {}", currStage.get());
throw new StageException();
}
//stage 9 continue revision //stage 9 continue revision
{ {
runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise); StageResult<Object> 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 //stage 10
{ {

View file

@ -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.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf56; import ru.clearing.classes.statics.data.sdf.SDf56;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; 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.Imdg;
import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider; 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.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.StatementRevisePredicate; 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.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Collection; import java.util.Collection;
@ -128,9 +131,19 @@ public class BalanceRevise implements ISessionStage {
} }
private StageResult<?> reviseStage3() { private StageResult<?> reviseStage3() {
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.A__T).build(); //clnr info depo
Collection<Registry> regsAT = registryImdg.getCollectionObjectsBySQL(sql); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
log.trace("Select {} registry's by query \"{}\" for revision step 3", regsAT.size(), sql); 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<Registry> regsAT = registryImdg.getCollectionObjectsByPredicate(prdct);
log.trace("Select {} registry's by query \"{}\" for revision step 3", regsAT.size(), prdct);
int errorRegs = 0; int errorRegs = 0;
for (Registry reg : regsAT) { for (Registry reg : regsAT) {
@ -152,12 +165,14 @@ public class BalanceRevise implements ISessionStage {
log.warn("После сверки обнаружена разница между плановым и фактическим балансом. Всего {} регистров не совпали.", errorRegs); log.warn("После сверки обнаружена разница между плановым и фактическим балансом. Всего {} регистров не совпали.", errorRegs);
NotificationNewRequest nRequest = new NotificationNewRequest(); NotificationNewRequest nRequest = new NotificationNewRequest();
nRequest.setObjectType(ObjectType.rgst.getKey()); nRequest.setObjectType(ObjectType.rgst.getKey());
nRequest.setPriority(Priority.LOW.getKey()); nRequest.setPriority(Priority.HIGH.getKey());
nRequest.setComment("После сверки обнаружена разница между плановым и фактическим балансом"); nRequest.setComment("После сверки обнаружена разница между плановым и фактическим балансом");
kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, nRequest); 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) { private void newSDf56(Statement statement) {

View file

@ -48,4 +48,22 @@ public class SessionMonitorFactory {
.addCondition(new SdfCondition(SdfTable.SDF_57)); .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);
}
}
} }

View file

@ -7,5 +7,7 @@ public enum Stored {
/** /**
* если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById) * если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById)
*/ */
PresentById PresentById,
AnltAccount
} }

View file

@ -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<ImdgValidationContext<Object>> {
private final IErrorEnumId errorEnum;
public AnltAccLoad(IErrorEnumId errorEnum) {
this.errorEnum = errorEnum;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<Object> context) {
Imdg<SpcexObjectBase> 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();
}
}