DM*I поиск по TCR#id
This commit is contained in:
parent
2f0d91574c
commit
d41edf57ff
5 changed files with 57 additions and 42 deletions
|
|
@ -268,6 +268,7 @@ public class ValidationConfig {
|
|||
Sdf06NewValidationRule.Fields,
|
||||
Sdf06NewValidationRule.CompanySymbolAndCompanyPresent,
|
||||
Sdf06NewValidationRule.AccountPresent,
|
||||
Sdf06NewValidationRule.CompanyAndAccountMatch,
|
||||
Sdf06NewValidationRule.Session,
|
||||
Sdf06NewValidationRule.Balance,
|
||||
Sdf06NewValidationRule.TcrPresent
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
statementDeb.map(SpcexObjectBase::getId).orElse(null),
|
||||
statementCred.map(SpcexObjectBase::getId).orElse(null));
|
||||
|
||||
Consumer<StmtCmpAcc> createRegistryIfNeeded = stmtCmpAcc -> {
|
||||
Function<StmtCmpAcc, Optional<Long>> createRegistryIfNeeded = stmtCmpAcc -> {
|
||||
Statement stmt = stmtCmpAcc.statement();
|
||||
Company company = stmtCmpAcc.company();
|
||||
Account account = stmtCmpAcc.account();
|
||||
|
|
@ -327,18 +327,20 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
|||
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<StmtCmpAcc> registersUpdate = stmtCmpAcc -> {
|
||||
Statement stmt = stmtCmpAcc.statement();
|
||||
Company cmp = stmtCmpAcc.company();
|
||||
Account acc = stmtCmpAcc.account();
|
||||
createRegistryIfNeeded.accept(stmtCmpAcc);
|
||||
Optional<Long> 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<SDf57> {
|
|||
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<SDf57> {
|
|||
});
|
||||
//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);
|
||||
|
|
|
|||
|
|
@ -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<Registry> findDmi(Long companyId, Long accountId, String securitySymbol, String contract) {
|
||||
private Optional<Registry> 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<Registry> 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));
|
||||
|
|
|
|||
|
|
@ -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<ImdgValidationCont
|
|||
return empty();
|
||||
}
|
||||
},
|
||||
CompanyAndAccountMatch() {
|
||||
@Override
|
||||
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> 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<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue