Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
ialbert
7156c57d98 sdf08 не создавать registry если не найден security
правки по промежуточной сессии
2023-07-17 15:10:56 +03:00
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.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; 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.STrades;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
@ -37,6 +39,9 @@ public class ValidationConfig {
Imdg<Relation> imdgRelation; Imdg<Relation> imdgRelation;
Imdg<Company> imdgCompany; Imdg<Company> imdgCompany;
Imdg<FixedIncomeSecurity> fixedIncomeSecurityImdg;
Imdg<EquitySecurity> equitySecurityImdg;
Imdg<CompanySymbols> imdgCompanySymbols; Imdg<CompanySymbols> imdgCompanySymbols;
Imdg<Registry> imdgRegistry; Imdg<Registry> imdgRegistry;
Imdg<Account> imdgAccount; Imdg<Account> imdgAccount;
@ -60,6 +65,8 @@ public class ValidationConfig {
this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.imdgSession = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); this.imdgSectionDictionary = imdgProvider.getImdg(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class);
this.imdgMoneyMarketSecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.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; this.imdgProvider = imdgProvider;
} }
@ -203,9 +210,11 @@ public class ValidationConfig {
context.setValidatedObject(sDf08); context.setValidatedObject(sDf08);
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity, equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, fixedIncomeSecurityImdg);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, 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))) { } 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()); 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())); log.error("sdf01.id={} error: {}", sdf08.getId(), messageResolver.resolve(error.get()));
//fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); //fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup));
// 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); statementImdg.insert(stmt);
Company company = companyImdg.getSingleObjectByID(account.getCompanyId()); Company company = companyImdg.getSingleObjectByID(account.getCompanyId());
Optional<EnumMessage> err = validateActiveness(company, account); if (error.isEmpty()) {
if (err.isEmpty()) { error = validateActiveness(company, account);
}
if (error.isEmpty()) {
Optional<Registry> reg = findReg(stmt); Optional<Registry> reg = findReg(stmt);
Registry rgs; Registry rgs;
if (reg.isPresent()) { if (reg.isPresent()) {
@ -163,7 +165,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
stmt.setOperationStatus(OperationStatus.Executed.getKey()); stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt); statementImdg.update(stmt);
} else { } else {
stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert
stmt.setOperationStatus(OperationStatus.Rejected.getKey()); stmt.setOperationStatus(OperationStatus.Rejected.getKey());
statementImdg.update(stmt); 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.account.Account;
import ru.clearing.classes.statics.data.company.Company; 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.sdf.SDf08;
import ru.clearing.classes.statics.data.security.Security;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.error.ClearingErrorInternal; import ru.spcex.clearing.error.ClearingErrorInternal;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -48,10 +51,26 @@ public enum Sdf08NewValidationRule implements IValidationRule<ImdgValidationCont
context.storeObject(ValidationStored.Sdf08Account, acc); context.storeObject(ValidationStored.Sdf08Account, acc);
return empty(); 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 @Override
public String ruleName() { 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.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.payment.PaymentInstruction; 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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.session.stage.impl.*; import ru.spcex.clearing.session.stage.impl.*;
import ru.spcex.clearing.session.stage.task.*; import ru.spcex.clearing.session.stage.task.*;
import ru.spcex.platform.classes.base.interfaces.ExecutionType; 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.Section;
import ru.spcex.platform.enumeration.SessionStatus; import ru.spcex.platform.enumeration.SessionStatus;
import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.enumeration.SessionType;
import ru.spcex.platform.imdg.api.Imdg; 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.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
@Service @Service
@ -36,15 +38,18 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
private final ObligationAdmission obligationsAdmission; private final ObligationAdmission obligationsAdmission;
private final InclusionObligations inclusionObligations; private final InclusionObligations inclusionObligations;
private final InspectionObligationsDepositReturn inspectionObligationsReturn;
private final InspectionObligations inspectionObligations; private final InspectionObligations inspectionObligations;
private final FormingRegistersOnOS formingRegistersOnOS; private final FormingRegistersOnOS formingRegistersOnOS;
private final FormingPaymentInstruction formingPaymentInstruction; private final FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn;
private final FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals;
private final UnlockResources unlockResources; private final UnlockResources unlockResources;
private final FinishingSession finishingSession; private final FinishingSession finishingSession;
private final EndStageNotification endStageNotification; private final EndStageNotification endStageNotification;
private final Imdg<ExecutionDeposit> executionDepositImdg; private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Supplier<List<String>> marketCodes; private final Supplier<List<String>> marketCodes;
private final Imdg<Registry> registryImdg;
public IntermediateMkrSession( public IntermediateMkrSession(
@ -54,13 +59,13 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
RequirementsAndObligationCreation requirementsAndObligationCreation, RequirementsAndObligationCreation requirementsAndObligationCreation,
ObligationAdmission obligationsAdmission, ObligationAdmission obligationsAdmission,
InclusionObligations inclusionObligations, InclusionObligations inclusionObligations,
FormingRegistersOnOS formingRegistersOnOS, InspectionObligations inspectionObligations, FormingRegistersOnOS formingRegistersOnOS,
FormingPaymentInstruction formingPaymentInstruction, FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn, FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals,
UnlockResources unlockResources, UnlockResources unlockResources,
FinishingSession finishingSession, FinishingSession finishingSession,
EndStageNotification endStageNotification, EndStageNotification endStageNotification,
IMessageResolver messageResolver, IMessageResolver messageResolver,
InspectionObligations inspectionObligations, InspectionObligationsDepositReturn inspectionObligationsReturn,
@Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) { @Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) {
super(imdgProvider, messageResolver); super(imdgProvider, messageResolver);
this.balanceRevise = balanceRevise; this.balanceRevise = balanceRevise;
@ -68,22 +73,35 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
this.requirementsAndObligationCreation = requirementsAndObligationCreation; this.requirementsAndObligationCreation = requirementsAndObligationCreation;
this.obligationsAdmission = obligationsAdmission; this.obligationsAdmission = obligationsAdmission;
this.inclusionObligations = inclusionObligations; this.inclusionObligations = inclusionObligations;
this.inspectionObligations = inspectionObligations;
this.formingRegistersOnOS = formingRegistersOnOS; this.formingRegistersOnOS = formingRegistersOnOS;
this.formingPaymentInstruction = formingPaymentInstruction; this.formingPaymentInstructionReturn = formingPaymentInstructionReturn;
this.formingPaymentInstructionDeals = formingPaymentInstructionDeals;
this.unlockResources = unlockResources; this.unlockResources = unlockResources;
this.finishingSession = finishingSession; this.finishingSession = finishingSession;
this.endStageNotification = endStageNotification; this.endStageNotification = endStageNotification;
this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
this.inspectionObligations = inspectionObligations; this.inspectionObligationsReturn = inspectionObligationsReturn;
this.marketCodes = marketCodes; this.marketCodes = marketCodes;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
} }
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
dealsPrepare.searchForExecutions(ExecutionType.ExecutionDeposit); dealsPrepare.searchForExecutions(ExecutionType.ExecutionDeposit);
// ImdgPredicateBuilder execFondPb = executionDepositImdg.predicateBuilder(); //fixme спросить у Кости нужны ли эти поправки
// dealsPrepare.addExecutionDepositCondition(execFondPb.regex("firstLegSettlementCode", "(^T0.*$)|(B[^0]\\d*$)")); ImdgPredicateBuilder rgsPrctBuilder = registryImdg.predicateBuilder();
// dealsPrepare.addExecutionDepositCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); 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(); imdgProvider.waitAvailable();
initSessionIfPresent(); initSessionIfPresent();
} }
@ -127,18 +145,6 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
DealsPreparePayload payload = new DealsPreparePayload(); DealsPreparePayload payload = new DealsPreparePayload();
payload.setSessionId(currSession.getId()); payload.setSessionId(currSession.getId());
dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, dealsPrepare); 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 //stage 2
runStage(TaskType.RequirementsAndObligationsCreate, dealsPreparationResult.getStageResult(), requirementsAndObligationCreation); runStage(TaskType.RequirementsAndObligationsCreate, dealsPreparationResult.getStageResult(), requirementsAndObligationCreation);
@ -155,20 +161,32 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
{ {
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsReturn);
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations); runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
} }
//stage 6
{ {
FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload(); FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload();
payload.setSessionId(currSession.getId()); payload.setSessionId(currSession.getId());
runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection<Registry> runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection<Registry>
} }
//stage 7 //stage 7
StageResult<Collection<PaymentInstruction>> paymentResult = null;
StageResult<Collection<PaymentInstruction>> returnsPayment = null;
{ {
FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload();
payload.setSessionId(currSession.getId()); payload.setSessionId(currSession.getId());
//stage 7 //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()) { if (paymentResult != null && paymentResult.getStageResult().isEmpty()) {
runStage(TaskType.FormingPaymentInstruction, balanceRevise); runStage(TaskType.FormingPaymentInstruction, balanceRevise);
@ -189,7 +207,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
{ {
FinishingSessionPayload payload = new FinishingSessionPayload(); FinishingSessionPayload payload = new FinishingSessionPayload();
payload.setSessionId(currSession.getId()); payload.setSessionId(currSession.getId());
payload.setPr("4"); payload.setPr("3");
runStage(TaskType.FinishingSession, payload, finishingSession); runStage(TaskType.FinishingSession, payload, finishingSession);
} }
//stage 11 //stage 11