identification funds
refund date sessions error after revision
This commit is contained in:
parent
633f34ee51
commit
0f5feb3c7e
17 changed files with 273 additions and 51 deletions
|
|
@ -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)
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<PaymentInstruction> pmtImdg;
|
||||
private final Function<RegistryReturnDepositRequest, IValidator> returnDepositVal;
|
||||
private final Function<RegistryChangeRefundDateRequest, IValidator> refundDateVal;
|
||||
private final Function<RegistryChangeStatusExtractRequest, IValidator> 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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ImdgVal
|
|||
@Override
|
||||
public Optional<EnumMessage> validate(ImdgValidationContext<IdentificationFundsRequest> context) {
|
||||
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);
|
||||
TradingClearingRegistry tcr = tcrImdg.getSingleObjectByID(validatedObject.getTradingClearingRegistryId());
|
||||
|
|
@ -130,6 +128,22 @@ public enum IdentificationFundsValidationRule implements IValidationRule<ImdgVal
|
|||
context.storeObject(ValidationStored.IdentificationFundsAssetTrio, assetTrio.get());
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -41,10 +41,15 @@ public enum RefundDateValidationRule implements IValidationRule<ImdgValidationCo
|
|||
pb.equals("groupId", validatedObject.getGroupId()),
|
||||
pb.or(
|
||||
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.getValueDate()))
|
||||
.filter(rgs -> rgs.getRefundDate().equals(rgs.getSettlementDate()))
|
||||
|
|
|
|||
|
|
@ -63,8 +63,15 @@ public abstract class AbstractSession {
|
|||
return runStage(type, null, stage);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
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);
|
||||
log.info("session.id={} step {} started", currSession.getId(), currStage.get());
|
||||
Task<T> 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;
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<Registry> 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<Registry> 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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,5 +7,7 @@ public enum Stored {
|
|||
/**
|
||||
* если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById)
|
||||
*/
|
||||
PresentById
|
||||
PresentById,
|
||||
|
||||
AnltAccount
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue