SDF57 processing
This commit is contained in:
parent
d6c951f638
commit
a32849351f
1 changed files with 82 additions and 23 deletions
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue