SDF08 executor skip error sdf08

This commit is contained in:
ialbert 2023-08-01 16:53:32 +03:00
parent d0eef0b15f
commit b6e19b9f8d

View file

@ -33,6 +33,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator;
@ -118,78 +119,94 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId();
result.setGenerationId(generationIdForGroup);
for (SDf08 sdf08 : sdf) {
IValidator validator = sDf08Validator.apply(sdf08);
Optional<EnumMessage> error = validator.tillFirstError();
Account account = validator.getStored(ValidationStored.Sdf08Account);
if (statementRequest.getAccountCreationResults().size() == 0
&& ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) {
Company company = searchCompany(sdf08.getDepoCode()); // validator.getStored(ValidationStored.Sdf08Company);
Long companyId = company == null ? null : company.getId(); // account == null сегда, т.к. кейс AccountNotPresent
if (companyId == null) {
log.warn("account {} for sdf08.id={} not found. Can not send request for creation, cause company not found too", sdf08.getDepoCode(), sdf08.getId());
} else {
result.getAccountRequests().add(createAccountRequestPart(sdf08.getId(), sdf08.getDepoCode(), companyId));
log.info("account {} for sdf08.id={} not found - send request for creation", sdf08.getDepoCode(), sdf08.getId());
}
continue;
} 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() && !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));
continue;
}
Statement stmt = createSdf08Statement(sdf08, account);
SDf09 sdf09New = createSuccessSdf09(sdf08, generationIdForGroup); //fixme тоже мб убрать
sdf09Imdg.insert(sdf09New);
stmt.setOutSDfId(sdf09New.getId());
statementImdg.insert(stmt);
Company company = companyImdg.getSingleObjectByID(account.getCompanyId());
if (error.isEmpty()) {
error = validateActiveness(company, account);
}
if (error.isEmpty()) {
Optional<Registry> reg = findReg(stmt);
Registry rgs;
if (reg.isPresent()) {
rgs = reg.get();
updateReg(stmt, rgs);
Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs));
Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs, null)); //передаю null т.к. отнимется ниже по коду
registryUnitF.setBalance(rgs.getBalance().subtract(registryUnitB.getBalance()));
registryUnitF.setUpdated(Instant.now());
if (registryUnitF.getId() == null) {
registryImdg.insert(registryUnitF);
log.debug("stmt.id={}, new AM*F.id={}", stmt.getId(), registryUnitF.getId());
Statement stmt = null;
try {
IValidator validator = sDf08Validator.apply(sdf08);
Optional<EnumMessage> error = validator.tillFirstError();
Account account = validator.getStored(ValidationStored.Sdf08Account);
if (statementRequest.getAccountCreationResults().size() == 0
&& ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) {
Company company = searchCompany(sdf08.getDepoCode()); // validator.getStored(ValidationStored.Sdf08Company);
Long companyId = company == null ? null : company.getId(); // account == null сегда, т.к. кейс AccountNotPresent
if (companyId == null) {
log.warn("account {} for sdf08.id={} not found. Can not send request for creation, cause company not found too", sdf08.getDepoCode(), sdf08.getId());
} else {
registryImdg.update(registryUnitF);
log.debug("stmt.id={}, updated AM*F.id={}", stmt.getId(), registryUnitF.getId());
result.getAccountRequests().add(createAccountRequestPart(sdf08.getId(), sdf08.getDepoCode(), companyId));
log.info("account {} for sdf08.id={} not found - send request for creation", sdf08.getDepoCode(), sdf08.getId());
}
//нужно сохранить registry B только если его не было
if (registryUnitB.getId() == null) {
registryImdg.insert(registryUnitB);
log.debug("stmt.id={}, new AM*B.id={}", stmt.getId(), registryUnitB.getId());
}
registryImdg.update(rgs);
} else {
rgs = createRegistryByStatement(stmt, company, account);
Registry registryB = copyRegB(rgs);
Registry registryF = copyRegF(rgs, registryB.getBalance());
registryImdg.insert(rgs);
registryImdg.insert(registryB);
registryImdg.insert(registryF);
continue;
} 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() && !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));
continue;
}
stmt = createSdf08Statement(sdf08, account);
SDf09 sdf09New = createSuccessSdf09(sdf08, generationIdForGroup); //fixme тоже мб убрать
sdf09Imdg.insert(sdf09New);
stmt.setOutSDfId(sdf09New.getId());
statementImdg.insert(stmt);
Company company = companyImdg.getSingleObjectByID(account.getCompanyId());
if (error.isEmpty()) {
error = validateActiveness(company, account);
}
if (error.isEmpty()) {
Optional<Registry> reg = findReg(stmt);
Registry rgs;
if (reg.isPresent()) {
rgs = reg.get();
updateReg(stmt, rgs);
Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getSecurityId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs));
Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getSecurityId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs, null)); //передаю null т.к. отнимется ниже по коду
registryUnitF.setBalance(rgs.getBalance().subtract(registryUnitB.getBalance()));
registryUnitF.setUpdated(Instant.now());
if (registryUnitF.getId() == null) {
registryImdg.insert(registryUnitF);
log.debug("stmt.id={}, new AM*F.id={}", stmt.getId(), registryUnitF.getId());
} else {
registryImdg.update(registryUnitF);
log.debug("stmt.id={}, updated AM*F.id={}", stmt.getId(), registryUnitF.getId());
}
//нужно сохранить registry B только если его не было
if (registryUnitB.getId() == null) {
registryImdg.insert(registryUnitB);
log.debug("stmt.id={}, new AM*B.id={}", stmt.getId(), registryUnitB.getId());
}
registryImdg.update(rgs);
} else {
rgs = createRegistryByStatement(stmt, company, account);
Registry registryB = copyRegB(rgs);
Registry registryF = copyRegF(rgs, registryB.getBalance());
registryImdg.insert(rgs);
registryImdg.insert(registryB);
registryImdg.insert(registryF);
}
//2. отправить notification на backend
stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt);
} else {
stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert
stmt.setOperationStatus(OperationStatus.Rejected.getKey());
statementImdg.update(stmt);
}
} catch (Exception e) {
log.error("error for sdf08.id={} (statement {}) stacktrace {}",
sdf08.getId(),
stmt == null ? null : stmt.getId(),
ExceptionUtils.getStackTrace(e));
try {
if (stmt != null && stmt.getId() != null) {
log.debug("rejecting statement.id={}", stmt.getId());
stmt.setOperationStatus(OperationStatus.Rejected.getKey());
statementImdg.update(stmt);
}
} catch (Exception e2) {
log.error("error while rejecting statement.id={} stacktrace {}", stmt.getId(), ExceptionUtils.getStackTrace(e2));
}
//2. отправить notification на backend
stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt);
} else {
stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert
stmt.setOperationStatus(OperationStatus.Rejected.getKey());
statementImdg.update(stmt);
}
}
return result;
@ -352,7 +369,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
return rgsF;
}
private Optional<Registry> findRegByUnit(Long companyId, Long accountId, String contract, Registry registry, RegistryUnit unit) {
private Optional<Registry> findRegByUnit(Long companyId, Long accountId, Long securityId, String contract, Registry registry, RegistryUnit unit) {
RegistryTradingParams p = new RegistryTradingParams(
IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()),
@ -364,8 +381,8 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
pb.sql(sql),
pb.equals("companyId", companyId), //fixme companyId?
pb.equals("accountId", accountId)
pb.equals("accountId", accountId),
pb.equals("securityId", securityId)
);
if (RegistryDesignation.D.equalsByKey(registry.getRegistryDesignation()) && !TextUtil.isEmpty(contract)) {
rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", contract));