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 9ea38234e..cd9012151 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 @@ -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 { private final ImdgProvider imdgProvider; private final IMessageResolver errorResolver; private final Imdg accountBalanceImdg; + private final Imdg securityImdg; private final IMessageResolver messageResolver; public Sdf57Executor(@Qualifier("sdf57Validator") Function sDf57Validator, @@ -62,6 +70,7 @@ public class Sdf57Executor extends AbstractExecutor { 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 { Consumer createRegistryIfNeeded = stmtCmpAcc -> { Statement stmt = stmtCmpAcc.statement(); - Optional err = validateActiveness(stmtCmpAcc.company(), stmtCmpAcc.account(), stmt); + Company company = stmtCmpAcc.company(); + Account account = stmtCmpAcc.account(); + Optional err = validateActiveness(company, account, stmt); if (err.isEmpty()) { Consumer 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 { 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 { 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 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");