SDF06 поиск по ANLT account

вынес поиск ТКР в валидацию
This commit is contained in:
ialbert 2023-08-15 15:10:41 +03:00
parent 38a0c7c0f8
commit 0b81edefbb
5 changed files with 67 additions and 12 deletions

View file

@ -253,12 +253,14 @@ public class ValidationConfig {
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
context.addImdg(IMDGDistributedNames.Map_Session, imdgSession); context.addImdg(IMDGDistributedNames.Map_Session, imdgSession);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
context.setLogPrefix(LogPrefixId.INSTANCE); context.setLogPrefix(LogPrefixId.INSTANCE);
return new ValidatorImpl<>(context, return new ValidatorImpl<>(context,
Sdf06NewValidationRule.CompanySymbolAndCompanyPresent, Sdf06NewValidationRule.CompanySymbolAndCompanyPresent,
Sdf06NewValidationRule.AccountPresent, Sdf06NewValidationRule.AccountPresent,
Sdf06NewValidationRule.Session, Sdf06NewValidationRule.Session,
Sdf06NewValidationRule.Balance Sdf06NewValidationRule.Balance,
Sdf06NewValidationRule.TcrPresent
); );
}; };

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.service;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
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;
@ -24,12 +25,19 @@ public class AnltSearcher {
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<Account> accountImdg; private final Imdg<Account> accountImdg;
@Autowired
public AnltSearcher(ImdgProvider imdgProvider) { public AnltSearcher(ImdgProvider imdgProvider) {
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
} }
public AnltSearcher(Imdg<TradingClearingRegistry> tcrImdg, Imdg<Company> companyImdg, Imdg<Account> accountImdg) {
this.tradingClearingRegistryImdg = tcrImdg;
this.companyImdg = companyImdg;
this.accountImdg = accountImdg;
}
@FunctionalInterface @FunctionalInterface
public interface AnltLogger { public interface AnltLogger {
void log(IEnumId subject, Object... args); void log(IEnumId subject, Object... args);

View file

@ -115,7 +115,7 @@ public class Sdf06Executor {
if (sdf06GroupId != null) { if (sdf06GroupId != null) {
log.warn("currently awaiting gateway response for groupId: {}. skipping groupId {}", sdf06GroupId, groupId); log.warn("currently awaiting gateway response for groupId: {}. skipping groupId {}", sdf06GroupId, groupId);
sdfs.forEach(sdf06 -> { sdfs.forEach(sdf06 -> {
SDf07 errorSdf07 = createSdf07(sdf06, now, errorResult2); SDf07 errorSdf07 = createSdf07(sdf06, now, errorResult2); //fixme "1"
errorSdf07.setGenerationId(sdf07GroupId); errorSdf07.setGenerationId(sdf07GroupId);
sdf07Imdg.insert(errorSdf07); sdf07Imdg.insert(errorSdf07);
}); });
@ -152,12 +152,9 @@ public class Sdf06Executor {
continue; continue;
} }
Company company = validator.getStored(ValidationStored.Sdf06Company); Company company = validator.getStored(ValidationStored.Sdf06Company);
Account account = validator.getStored(ValidationStored.Sdf06Account); TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(
Map.of("moneyAccountId", account.getId())
);
//проверка существует ли statement пока убрал //проверка существует ли statement пока убрал
Statement stmt = createStatementBySdf06(sDf06, company.getId(), account); Statement stmt = createStatementBySdf06(sDf06, company.getId(), validator.getStored(ValidationStored.Sdf06Account));
statementImdg.insert(stmt); statementImdg.insert(stmt);
log.debug("Statement created: {}", stmt.getId()); log.debug("Statement created: {}", stmt.getId());
if (InOutDirection.in.getKey().equals(stmt.getInOutDirection())) { if (InOutDirection.in.getKey().equals(stmt.getInOutDirection())) {
@ -197,10 +194,12 @@ public class Sdf06Executor {
} }
private boolean needToCreateStatement(EnumMessage err) { private boolean needToCreateStatement(EnumMessage err) {
return ClearingError.ActiveSessionIsPresent.equals(err.getSubject()) || ClearingError.BalanceInsufficient.equals(err.getSubject()); return ClearingError.ActiveSessionIsPresent.equals(err.getSubject()) || ClearingError.BalanceInsufficient.equals(err.getSubject())
|| ClearingError.TCRegistryNotFound.equals(err.getSubject());
} }
public void processGatewayResponse(BaseRequest<AssetOperationApprovalRequest> req) { public void processGatewayResponse(BaseRequest<AssetOperationApprovalRequest> req) {
//может прийти неограниченно позже 06го, после того как прошел клиринг например...
Instant now = Instant.now(); Instant now = Instant.now();
String fileName = null; String fileName = null;
for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) { for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) {

View file

@ -6,9 +6,11 @@ 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.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;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf06; import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.enumeration.WorkflowStatus;
@ -55,9 +57,16 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
return of(ClearingError.AccountNotFoundB, sdf06.getAccount()); return of(ClearingError.AccountNotFoundB, sdf06.getAccount());
} }
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account account = accountImdg.getFirstObjectByFieldValues(Map.of( ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
"account", sdf06.getAccount(), Account account = accountImdg.getFirstObjectByPredicate(
"accountType", AccountType.Clrn.getKey())); pb.and(
pb.equals("account", sdf06.getAccount()),
pb.or(
pb.equals("accountType", AccountType.Clrn.getKey()),
pb.equals("accountType", AccountType.Anlt.getKey())
)
)
);
if (account == null) { if (account == null) {
return of(ClearingError.AccountNotFoundB, sdf06.getAccount()); return of(ClearingError.AccountNotFoundB, sdf06.getAccount());
} }
@ -107,6 +116,43 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
} }
return empty(); return empty();
} }
},
TcrPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
SDf06 sdf06 = context.getValidatedObject();
Account account = context.getStoredObject(ValidationStored.Sdf06Account);
if (account == null) {
return of(ClearingError.TCRegistryNotFound, "<no account to search for>");
}
Imdg<TradingClearingRegistry> tcrImdg;
tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
if (AccountType.Anlt.getKey().equals(account.getAccountType())) {
log.debug("account.id={} is ANLT", account.getId());
if (TextUtil.isEmpty(sdf06.getSpec())) {
return of(ClearingError.TCRegistryNotFound, "<spec empty>");
}
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
AnltSearcher anltSearcher = new AnltSearcher(tcrImdg, companyImdg, accountImdg);
AnltSearcher.AnltSearch anltSrch = anltSearcher.loadByAnlt(sdf06.getSpec());
if (!anltSrch.isFound()) {
log.debug("account.id={} ANLT couldn't find account by spec {}", account.getId(), sdf06.getSpec());
return of(ClearingError.TCRegistryNotFound, sdf06.getSpec());
} else {
account = anltSrch.getAccount();
log.debug("account.id={} ANLT found account.id={} by spec {}", account.getId(), account.getId(), sdf06.getSpec());
}
}
TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues(
Map.of("moneyAccountId", account.getId())
);
if (tcr == null) {
return of(ClearingError.TCRegistryNotFound, "<moneyAccountId = " + account.getId() + ">");
}
context.storeObject(ValidationStored.Sdf06Tcr, tcr);
return empty();
}
} }
; ;
private final static Logger log = LoggerFactory.getLogger(Sdf06NewValidationRule.class); private final static Logger log = LoggerFactory.getLogger(Sdf06NewValidationRule.class);

View file

@ -14,7 +14,7 @@ public enum ValidationStored {
Sdf21Account, Sdf21Account,
Sdf06Company, Sdf06Account, Sdf06Company, Sdf06Account, Sdf06Tcr,
ReturnDepositDmx, ReturnDepositDmx,