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.sdf.SDf02;
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.spcex.clearing.error.ClearingError;
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.model.Result;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
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.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
@ -47,6 +54,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
private final ImdgProvider imdgProvider;
private final IMessageResolver errorResolver;
private final Imdg<AccountBalance> accountBalanceImdg;
private final Imdg<Security> securityImdg;
private final IMessageResolver messageResolver;
public Sdf57Executor(@Qualifier("sdf57Validator") Function<SDf57, IValidator> sDf57Validator,
@ -62,6 +70,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
this.imdgProvider = imdgProvider;
this.errorResolver = errorResolver;
this.messageResolver = messageResolver;
this.securityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
}
@Override
@ -123,14 +132,16 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
Consumer<StmtCmpAcc> createRegistryIfNeeded = stmtCmpAcc -> {
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()) {
Consumer<Registry> update = rgs -> {
updateReg(stmt, rgs);
registryImdg.update(rgs);
};
Runnable create = () -> {
Registry registry = createRegistryByStatement(stmt);
Registry registry = createRegistryByStatement(stmt, company, account);
registryImdg.insert(registry);
};
findReg(stmt, RegistryDesignation.A).ifPresentOrElse(update, create);
@ -169,8 +180,8 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
statement.setContract(getContractFromSpecif(sdf57.getSpecif()));
statement.setAccountId(accountDeb.getId());
statement.setAccount(accountDeb.getAccount());
statement.setInOutDirection(InOutDirection.out.getKey());
statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme pay_date format
statement.setInOutDirection(InOutDirection.out.getKey()); //fixme ! явно может быть разное
statement.setSettlementDate(payDate(sdf57.getPay_date())); //fixme ! pay_date format
statement.setAmount(TextUtil.isEmpty(sdf57.getSum_deb()) ? null : new BigDecimal(sdf57.getSum_deb()));
statement.setOperationStatus(OperationStatus.Pending.getKey());
statement.setInSDfId(sdf57.getId());
@ -178,31 +189,79 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return statement;
}
private Registry createRegistryByStatement(Statement statement) {
//todo
return new Registry();
private Registry createRegistryByStatement(Statement statement, Company company, Account account) {
Registry rgs = 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) {
//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) {
//todo add dependency on Registry search
// RegistryTradingParams p = new RegistryTradingParams(
// des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T
// );
// String sql = RegistryCodeSqlBuilder.getInstance(p).build();
// ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
// ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
// pb.sql(sql),
// pb.equals("companyId", s.getAddresseeId()) //fixme companyId?
// );
// if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) {
// rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract()));
// }
// return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate));
return Optional.empty();
RegistryTradingParams p = new RegistryTradingParams(
des, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T
);
String sql = RegistryCodeSqlBuilder.getInstance(p).build();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
pb.sql(sql),
pb.equals("companyId", s.getAddresseeId()) //fixme companyId?
);
if (des.equals(RegistryDesignation.D) && !TextUtil.isEmpty(s.getContract())) {
rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", s.getContract()));
}
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate));
}
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");