diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 4c6c5a857..9883ce49a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -268,6 +268,7 @@ public class ValidationConfig { Sdf06NewValidationRule.Fields, Sdf06NewValidationRule.CompanySymbolAndCompanyPresent, Sdf06NewValidationRule.AccountPresent, + Sdf06NewValidationRule.CompanyAndAccountMatch, Sdf06NewValidationRule.Session, Sdf06NewValidationRule.Balance, Sdf06NewValidationRule.TcrPresent diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index a723241c3..b6c013d99 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -161,9 +161,7 @@ public class Sdf06Executor { requests.add(GatewayRequestCreator.gatewayRequestPart(stmt, company.getTradingCode(), tcr.getCode())); } else { processedApproved(stmt, sDf06, now, sdf07GroupId); - dmiService.setProc(stmt.getAccountId(), - company.getId(), - tcr.getId(), + dmiService.setProc(tcr.getId(), CurrencyCode.RUB.getKey(), safeBD(sDf06.getSum()), sDf06.getNumber()); @@ -261,9 +259,7 @@ public class Sdf06Executor { Instant updatedTime = Instant.now(); if (gatewayMsg.isApproved()) { processedApproved(stmt, sdf06, updatedTime); - dmiService.setProc(stmt.getAccountId(), - stmt.getAddresseeId(), - searchTcrOnGatewayResponse(sdf06).map(SpcexObjectBase::getId).orElse(null), + dmiService.setProc(searchTcrOnGatewayResponse(sdf06).map(SpcexObjectBase::getId).orElse(null), CurrencyCode.RUB.getKey(), safeBD(sdf06.getSum()), sdf06.getNumber() diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java index 2eaab8e12..fbd68fbfc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -189,7 +189,7 @@ public class Sdf57Executor extends AbstractExecutor { statementDeb.map(SpcexObjectBase::getId).orElse(null), statementCred.map(SpcexObjectBase::getId).orElse(null)); - Consumer createRegistryIfNeeded = stmtCmpAcc -> { + Function> createRegistryIfNeeded = stmtCmpAcc -> { Statement stmt = stmtCmpAcc.statement(); Company company = stmtCmpAcc.company(); Account account = stmtCmpAcc.account(); @@ -327,18 +327,20 @@ public class Sdf57Executor extends AbstractExecutor { amtCached.get().getTradingClearingRegistry())); } + return Optional.ofNullable(amtCached.get().getTradingClearingRegistryId()); } else { log.debug("statement.id={} activness validation failed {}", stmt.getId(), messageResolver.resolve(err.get())); stmt.setErrorCodeId(err.get().getSubject().getId()); // fixme ErrorText insert stmt.setOperationStatus(OperationStatus.Rejected.getKey()); statementImdg.update(stmt); + return Optional.empty(); } }; Consumer registersUpdate = stmtCmpAcc -> { Statement stmt = stmtCmpAcc.statement(); Company cmp = stmtCmpAcc.company(); Account acc = stmtCmpAcc.account(); - createRegistryIfNeeded.accept(stmtCmpAcc); + Optional tcrId = createRegistryIfNeeded.apply(stmtCmpAcc); if (accountIsAnlt(acc)) { AnltSearcher.AnltSearch searchResult = anltSearcher.loadByAnlt(stmt.getComment()); if (searchResult.isFound()) { @@ -347,11 +349,12 @@ public class Sdf57Executor extends AbstractExecutor { stmt.getComment(), searchResult.getAccount().getId(), searchResult.getCompany().getId()); - createRegistryIfNeeded.accept(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount())); - dmiService.setOk(searchResult.getAccount().getId(), - searchResult.getCompany().getId(), - CurrencyCode.RUB.getKey(), - sdf57.getDbfId().toString()); + createRegistryIfNeeded.apply(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount())); + if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { + dmiService.setOk(searchResult.getTcr().getId(), + CurrencyCode.RUB.getKey(), + sdf57.getDbfId().toString()); + } } else { log.debug("stmt.id={} comment='{}' error: {}. Operating through DMAU registry", stmt.getId(), @@ -382,11 +385,16 @@ public class Sdf57Executor extends AbstractExecutor { }); //DMAU подразумевает увеличение остатка поля balance и credit registry.code=DMAU } - } else { - dmiService.setOk(acc.getId(), - cmp.getId(), - CurrencyCode.RUB.getKey(), - sdf57.getDbfId().toString()); + } else if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { + if (tcrId.isPresent()) { + dmiService.setOk(tcrId.get(), + CurrencyCode.RUB.getKey(), + sdf57.getDbfId().toString()); + } else { + log.error("stmt.id={} operationStatus={} but couldn't extract TCR.id for DM*I update", + stmt.getId(), + stmt.getOperationStatus()); + } } }; statementDeb.map(stmt -> new StmtCmpAcc(stmt, companyDeb, accountDeb)).ifPresent(registersUpdate); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java index aa84bcaef..e91f087c3 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java @@ -31,43 +31,39 @@ public class DmiService { this.rgsMng = rgsMng; } - public void setProc(Long accountId, - Long companyId, - Long tcrId, + public void setProc(Long tcrId, String securitySymbol, BigDecimal balance, BigDecimal contract) { - findDmi(companyId, accountId, securitySymbol, contract.toString()).ifPresentOrElse(d__i -> { + findDmi(tcrId, securitySymbol, contract.toString()).ifPresentOrElse(d__i -> { d__i.setRegistryStatus(RegistryStatus.PROC.getKey()); d__i.setUpdated(Instant.now()); log.trace("updating D**I status to {}", d__i.getRegistryStatus()); rgsImdg.update(d__i); - }, () -> createDmi(companyId, tcrId, securitySymbol, balance, contract.toString())); + }, () -> createDmi(tcrId, securitySymbol, balance, contract.toString())); } - public void setOk(Long accountId, - Long companyId, + public void setOk(Long tcrId, String securitySymbol, String contract) { - findDmi(companyId, accountId, securitySymbol, contract).ifPresentOrElse(d__i -> { + findDmi(tcrId, securitySymbol, contract).ifPresentOrElse(d__i -> { d__i.setRegistryStatus(RegistryStatus.OK.getKey()); d__i.setUpdated(Instant.now()); log.trace("updating {} status to {}", d__i.getRegistryCode(), d__i.getRegistryStatus()); rgsImdg.update(d__i); }, () -> { - log.trace("didn't find DM*I by companyId={} accountId={} securitySymbol={} contract={}", - companyId, accountId, securitySymbol, contract); + log.trace("didn't find DM*I by tcr.id={} securitySymbol={} contract={}", + tcrId, securitySymbol, contract); }); } - private Optional findDmi(Long companyId, Long accountId, String securitySymbol, String contract) { + private Optional findDmi(Long tcrId, String securitySymbol, String contract) { ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); RegistryTradingParams rgsCde = RegistryTradingParams.D__I; ImdgPredicate prdct = pb.and( pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCde).build()), - pb.equals("companyId", companyId), - pb.equals("accountId", accountId), + pb.equals("tradingClearingRegistryId", tcrId), pb.equals("securitySymbol", securitySymbol), pb.equals("contract", contract) ); @@ -76,22 +72,24 @@ public class DmiService { return Optional.ofNullable(d__i); } - private void createDmi(Long companyId, - Long tcrId, + private void createDmi(Long tcrId, String securitySymbol, BigDecimal summ, String outDocument) { RegistryTradingParams rgsCde = RegistryTradingParams.AM_T; - Optional am_t = rgsMng.findRelatedAsset(tcrId, - companyId, - securitySymbol, - rgsCde); - if (am_t.isEmpty()) { - log.error("AM*T not found for tcr.id={} company.id={} security.symbol={}", - tcrId, companyId, securitySymbol); - return;// Optional.empty(); + ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("tradingClearingRegistryId", tcrId), + pb.equals("securitySymbol", securitySymbol), + pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCde).build()) + ); + Registry am_t = rgsImdg.getSingleObjectByPredicate(prdct); + if (am_t == null) { + log.error("AM*T not found for tcr.id={} security.symbol={}", + tcrId, securitySymbol); + return; } - Registry rgsD = am_t.get().clone(); + Registry rgsD = am_t.clone(); rgsD.setRegistryDesignation(RegistryDesignation.D.getKey()); rgsD.setRegistryUnit(RegistryUnit.I.getKey()); rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD)); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java index a7e990f5f..e78d74c20 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java @@ -27,6 +27,7 @@ import ru.spcex.platform.utils.validation.IValidationRule; import java.math.BigDecimal; import java.util.Collection; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; @@ -84,6 +85,17 @@ public enum Sdf06NewValidationRule implements IValidationRule validate(ImdgValidationContext context) { + Company company = context.getStoredObject(ValidationStored.Sdf06Company); + Account account = context.getStoredObject(ValidationStored.Sdf06Account); + if (!Objects.equals(account.getCompanyId(), company.getId())) { + return of(ClearingError.WrongField, "account/tradingCode"); + } + return empty(); + } + }, Session() { @Override public Optional validate(ImdgValidationContext context) {