SDF57 processing

This commit is contained in:
ialbert 2023-05-24 17:50:44 +03:00
parent d6c951f638
commit a32849351f

View file

@ -10,6 +10,7 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.sdf.SDf02; import ru.clearing.classes.statics.data.sdf.SDf02;
import ru.clearing.classes.statics.data.sdf.SDf57; import ru.clearing.classes.statics.data.sdf.SDf57;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -17,15 +18,21 @@ import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.service.LoggingService; import ru.spcex.clearing.service.LoggingService;
import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.model.Result;
import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.platform.enumeration.*; import ru.spcex.platform.enumeration.*;
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.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage; 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.enumeration.IMessageResolver;
import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Collection; import java.util.Collection;
@ -47,6 +54,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
private final ImdgProvider imdgProvider; private final ImdgProvider imdgProvider;
private final IMessageResolver errorResolver; private final IMessageResolver errorResolver;
private final Imdg<AccountBalance> accountBalanceImdg; private final Imdg<AccountBalance> accountBalanceImdg;
private final Imdg<Security> securityImdg;
private final IMessageResolver messageResolver; private final IMessageResolver messageResolver;
public Sdf57Executor(@Qualifier("sdf57Validator") Function<SDf57, IValidator> sDf57Validator, public Sdf57Executor(@Qualifier("sdf57Validator") Function<SDf57, IValidator> sDf57Validator,
@ -62,6 +70,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
this.errorResolver = errorResolver; this.errorResolver = errorResolver;
this.messageResolver = messageResolver; this.messageResolver = messageResolver;
this.securityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
} }
@Override @Override
@ -123,14 +132,16 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
Consumer<StmtCmpAcc> createRegistryIfNeeded = stmtCmpAcc -> { Consumer<StmtCmpAcc> createRegistryIfNeeded = stmtCmpAcc -> {
Statement stmt = stmtCmpAcc.statement(); Statement stmt = stmtCmpAcc.statement();
Optional<EnumMessage> err = validateActiveness(stmtCmpAcc.company(), stmtCmpAcc.account(), stmt); Company company = stmtCmpAcc.company();
Account account = stmtCmpAcc.account();
Optional<EnumMessage> err = validateActiveness(company, account, stmt);
if (err.isEmpty()) { if (err.isEmpty()) {
Consumer<Registry> update = rgs -> { Consumer<Registry> update = rgs -> {
updateReg(stmt, rgs); updateReg(stmt, rgs);
registryImdg.update(rgs); registryImdg.update(rgs);
}; };
Runnable create = () -> { Runnable create = () -> {
Registry registry = createRegistryByStatement(stmt); Registry registry = createRegistryByStatement(stmt, company, account);
registryImdg.insert(registry); registryImdg.insert(registry);
}; };
findReg(stmt, RegistryDesignation.A).ifPresentOrElse(update, create); findReg(stmt, RegistryDesignation.A).ifPresentOrElse(update, create);
@ -169,8 +180,8 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
statement.setContract(getContractFromSpecif(sdf57.getSpecif())); statement.setContract(getContractFromSpecif(sdf57.getSpecif()));
statement.setAccountId(accountDeb.getId()); statement.setAccountId(accountDeb.getId());
statement.setAccount(accountDeb.getAccount()); statement.setAccount(accountDeb.getAccount());
statement.setInOutDirection(InOutDirection.out.getKey()); statement.setInOutDirection(InOutDirection.out.getKey()); //fixme ! явно может быть разное
statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme pay_date format statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme ! pay_date format
statement.setAmount(TextUtil.isEmpty(sdf57.getSum_deb()) ? null : new BigDecimal(sdf57.getSum_deb())); statement.setAmount(TextUtil.isEmpty(sdf57.getSum_deb()) ? null : new BigDecimal(sdf57.getSum_deb()));
statement.setOperationStatus(OperationStatus.Pending.getKey()); statement.setOperationStatus(OperationStatus.Pending.getKey());
statement.setInSDfId(sdf57.getId()); statement.setInSDfId(sdf57.getId());
@ -178,31 +189,79 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return statement; return statement;
} }
private Registry createRegistryByStatement(Statement statement) { private Registry createRegistryByStatement(Statement statement, Company company, Account account) {
//todo Registry rgs = new Registry();
return new Registry(); rgs.setCompanyId(statement.getAddresseeId());
rgs.setTradingCode(company.getTradingCode());
rgs.setClearingCode(company.getClearingCode());
rgs.setShortName(company.getShortName());
rgs.setFullName(company.getFullName());
rgs.setAccountId(account.getId());
rgs.setAccountType(account.getAccountType());
rgs.setAccount(account.getAccount());
rgs.setRegistryDesignation(RegistryDesignation.A.getKey());
rgs.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); //fixme ! а депозита быть не может??? искать то мы его ищем
rgs.setRegistryCapacity(RegistryCapacity.A.getKey());
rgs.setRegistryUnit(RegistryUnit.T.getKey());
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
//rgs.setTradingClearingRegistryId(); //todo !
//rgs.setTradingClearingRegistry(); //todo !
rgs.setRegistryStatus(RegistryStatus.PROC.getKey());
rgs.setSecurityId(statement.getSecurityId());
Security security = securityImdg.getSingleObjectByID(statement.getSecurityId());
if (security != null) {
rgs.setSecuritySymbol(security.getSecuritySymbol());
}
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
//fixme ! считаю balance при создании нулевым и исхожу из этого
//При добавлении (на базе изменения statement по sDf57):
//Если значение statement.inOutDirection=IN, то:
//= текущее значение registry.balance + statement.amount
//
//Если значение statement.inOutDirection=OUT, то:
//= текущее значение registry.balance - statement.amount
switch (inOutDirection) {
case in -> rgs.setBalance(statement.getAmount());
case out -> rgs.setBalance(statement.getAmount().negate());
}
rgs.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme ! смотри описание и ссылка на начало html'ки
//fixme !rgs.setSettlementCode();
rgs.setTradingDate(statement.getSettlementDate()); //fixme ! today ?
rgs.setClearingDate(LocalDate.now());
//fixme rgs.setRefundDate();
//fixme rgs.setValueDate();
rgs.setContract(statement.getContract());
//FIXME !!! я думал что создается на базе stmt, companyDeb, accountDeb
//получается на самом деле создается по четверке stmt, companyDeb, accountDeb, companyCred, accountCred
//половинка идет в CompanyId AccountId, вторая идет в counterPartyId???
rgs.setCounterPartyId(statement.getAccountId());
rgs.setCreated(Instant.now());
return rgs;
} }
private void updateReg(Statement s, Registry r) { private void updateReg(Statement s, Registry r) {
//todo InOutDirection direction = IEnumKey.getEnumByKey(InOutDirection.class, s.getInOutDirection());
switch (direction) {
case in -> r.setBalance(r.getBalance().add(s.getAmount()));
case out -> r.setBalance(r.getBalance().subtract(s.getAmount()));
}
r.setUpdated(Instant.now());
} }
private Optional<Registry> findReg(Statement s, RegistryDesignation des) { private Optional<Registry> findReg(Statement s, RegistryDesignation des) {
//todo add dependency on Registry search RegistryTradingParams p = new RegistryTradingParams(
// RegistryTradingParams p = new RegistryTradingParams( des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T
// des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T );
// ); String sql = RegistryCodeSqlBuilder.getInstance(p).build();
// String sql = RegistryCodeSqlBuilder.getInstance(p).build(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
// ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
// ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), pb.sql(sql),
// pb.sql(sql), pb.equals("companyId", s.getAddresseeId()) //fixme companyId?
// pb.equals("companyId", s.getAddresseeId()) //fixme companyId? );
// ); if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) {
// if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) { rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract()));
// rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract())); }
// } return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate));
// return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate));
return Optional.empty();
} }
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");