sdf08 не создавать registry если не найден security

правки по промежуточной сессии
This commit is contained in:
ialbert 2023-07-17 12:57:07 +03:00 committed by etreschenkov
parent fb45dda0f5
commit 7156c57d98
4 changed files with 79 additions and 31 deletions

View file

@ -8,6 +8,8 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.misc.STrades;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
@ -37,6 +39,9 @@ public class ValidationConfig {
Imdg<Relation> imdgRelation;
Imdg<Company> imdgCompany;
Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
Imdg<EquitySecurity> equitySecurityImdg;
Imdg<CompanySymbols> imdgCompanySymbols;
Imdg<Registry> imdgRegistry;
Imdg<Account> imdgAccount;
@ -60,6 +65,8 @@ public class ValidationConfig {
this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class);
this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.imdgProvider = imdgProvider;
}
@ -203,9 +210,11 @@ public class ValidationConfig {
context.setValidatedObject(sDf08);
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg);
context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context,
Sdf08NewValidationRule.AccountPresent
Sdf08NewValidationRule.AccountPresent, Sdf08NewValidationRule.InstrumentPresent
);
};
}

View file

@ -132,7 +132,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
} else if (ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) {
log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf08.getId());
}
if (error.isPresent()) {
if (error.isPresent() && !ClearingError.SecurityNotFound.equals(error.get().getSubject())) {
log.error("sdf01.id={} error: {}", sdf08.getId(), messageResolver.resolve(error.get()));
//fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup));
// sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup));
@ -146,8 +146,10 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
statementImdg.insert(stmt);
Company company = companyImdg.getSingleObjectByID(account.getCompanyId());
Optional<EnumMessage> err = validateActiveness(company, account);
if (err.isEmpty()) {
if (error.isEmpty()) {
error = validateActiveness(company, account);
}
if (error.isEmpty()) {
Optional<Registry> reg = findReg(stmt);
Registry rgs;
if (reg.isPresent()) {
@ -163,7 +165,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt);
} else {
stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert
stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert
stmt.setOperationStatus(OperationStatus.Rejected.getKey());
statementImdg.update(stmt);
}

View file

@ -2,7 +2,10 @@ package ru.spcex.clearing.service.validation;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.sdf.SDf08;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.error.ClearingErrorInternal;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -48,10 +51,26 @@ public enum Sdf08NewValidationRule implements IValidationRule<ImdgValidationCont
context.storeObject(ValidationStored.Sdf08Account, acc);
return empty();
}
}, InstrumentPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf08> context) {
SDf08 sdf08 = context.getValidatedObject();
Imdg<FixedIncomeSecurity> fxIncmSecImdg = context.obtainMap(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
Imdg<EquitySecurity> equityImdg = context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
Security security = fxIncmSecImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", sdf08.getSecurityCode()));
if (security == null) {
security = equityImdg.getFirstObjectByFieldValues(Map.of("securitySymbol", sdf08.getSecurityCode()));
}
if (security == null) {
return of(ClearingError.SecurityNotFound, sdf08.getSecurityCode());
}
return empty();
}
};
@Override
public String ruleName() {
return "Sdf01NewValidationRule." + name();
return "Sdf08NewValidationRule." + name();
}
}

View file

@ -9,22 +9,24 @@ import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.session.stage.impl.*;
import ru.spcex.clearing.session.stage.task.*;
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.enumeration.SessionStatus;
import ru.spcex.platform.enumeration.SessionType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
@Service
@ -36,15 +38,18 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
private final ObligationAdmission obligationsAdmission;
private final InclusionObligations inclusionObligations;
private final InspectionObligationsDepositReturn inspectionObligationsReturn;
private final InspectionObligations inspectionObligations;
private final FormingRegistersOnOS formingRegistersOnOS;
private final FormingPaymentInstruction formingPaymentInstruction;
private final FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn;
private final FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals;
private final UnlockResources unlockResources;
private final FinishingSession finishingSession;
private final EndStageNotification endStageNotification;
private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Supplier<List<String>> marketCodes;
private final Imdg<Registry> registryImdg;
public IntermediateMkrSession(
@ -54,13 +59,13 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
RequirementsAndObligationCreation requirementsAndObligationCreation,
ObligationAdmission obligationsAdmission,
InclusionObligations inclusionObligations,
FormingRegistersOnOS formingRegistersOnOS,
FormingPaymentInstruction formingPaymentInstruction,
InspectionObligations inspectionObligations, FormingRegistersOnOS formingRegistersOnOS,
FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn, FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals,
UnlockResources unlockResources,
FinishingSession finishingSession,
EndStageNotification endStageNotification,
IMessageResolver messageResolver,
InspectionObligations inspectionObligations,
InspectionObligationsDepositReturn inspectionObligationsReturn,
@Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) {
super(imdgProvider, messageResolver);
this.balanceRevise = balanceRevise;
@ -68,22 +73,35 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
this.requirementsAndObligationCreation = requirementsAndObligationCreation;
this.obligationsAdmission = obligationsAdmission;
this.inclusionObligations = inclusionObligations;
this.inspectionObligations = inspectionObligations;
this.formingRegistersOnOS = formingRegistersOnOS;
this.formingPaymentInstruction = formingPaymentInstruction;
this.formingPaymentInstructionReturn = formingPaymentInstructionReturn;
this.formingPaymentInstructionDeals = formingPaymentInstructionDeals;
this.unlockResources = unlockResources;
this.finishingSession = finishingSession;
this.endStageNotification = endStageNotification;
this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
this.inspectionObligations = inspectionObligations;
this.inspectionObligationsReturn = inspectionObligationsReturn;
this.marketCodes = marketCodes;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
@Override
public void afterPropertiesSet() throws Exception {
dealsPrepare.searchForExecutions(ExecutionType.ExecutionDeposit);
// ImdgPredicateBuilder execFondPb = executionDepositImdg.predicateBuilder();
// dealsPrepare.addExecutionDepositCondition(execFondPb.regex("firstLegSettlementCode", "(^T0.*$)|(B[^0]\\d*$)"));
// dealsPrepare.addExecutionDepositCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
//fixme спросить у Кости нужны ли эти поправки
ImdgPredicateBuilder rgsPrctBuilder = registryImdg.predicateBuilder();
inclusionObligations.addRegistryCondition(
rgsPrctBuilder.and(
rgsPrctBuilder.or(
rgsPrctBuilder.equals("registryStatus", RegistryStatus.PROC.getKey()),
rgsPrctBuilder.equals("registryStatus", RegistryStatus.MNG.getKey())
),
rgsPrctBuilder.lessEqual("valueDate", LocalDate.now())
)
);
inspectionObligationsReturn.setSessionType(sessionType());
inspectionObligations.setSessionType(sessionType());
imdgProvider.waitAvailable();
initSessionIfPresent();
}
@ -127,18 +145,6 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
DealsPreparePayload payload = new DealsPreparePayload();
payload.setSessionId(currSession.getId());
dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, dealsPrepare);
//Сначала обрабатываются записи, у которых settlementCode = значению, у которого первый символ ="T", второй =0,
// а после settlementCode = значению, у которого первый символ ="B", второй 0, последующие =любые цифры
dealsPreparationResult.getStageResult().sort((o1, o2) -> {
String o1SettlementCode = ((ExecutionDeposit) o1).getFirstLegSettlementCode();
String o2SettlementCode = ((ExecutionDeposit) o2).getSecondLegSettlementCode();
Function<String, Integer> mapper = (settlementCode) -> {
if (settlementCode.startsWith("T")) return -1;
else if (settlementCode.startsWith("B")) return 1;
else return 0;
};
return mapper.apply(o1SettlementCode).compareTo(mapper.apply(o2SettlementCode));
});
}
//stage 2
runStage(TaskType.RequirementsAndObligationsCreate, dealsPreparationResult.getStageResult(), requirementsAndObligationCreation);
@ -155,20 +161,32 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
{
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsReturn);
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
}
//stage 6
{
FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload();
payload.setSessionId(currSession.getId());
runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection<Registry>
}
//stage 7
StageResult<Collection<PaymentInstruction>> paymentResult = null;
StageResult<Collection<PaymentInstruction>> returnsPayment = null;
{
FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload();
payload.setSessionId(currSession.getId());
//stage 7
paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstruction);
returnsPayment = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionReturn);
}
StageResult<Collection<PaymentInstruction>> paymentResult = null;
{
FormingPaymentInstructionDealsMkrPayload payload = new FormingPaymentInstructionDealsMkrPayload();
payload.setSessionId(currSession.getId());
payload.setPaymentInstructionReturns(returnsPayment.getStageResult());
//stage 7
paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionDeals);
}
if (paymentResult != null && paymentResult.getStageResult().isEmpty()) {
runStage(TaskType.FormingPaymentInstruction, balanceRevise);
@ -189,7 +207,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
{
FinishingSessionPayload payload = new FinishingSessionPayload();
payload.setSessionId(currSession.getId());
payload.setPr("4");
payload.setPr("3");
runStage(TaskType.FinishingSession, payload, finishingSession);
}
//stage 11