etreschenkov 2023-07-07 15:47:11 +03:00
parent a998f75ed9
commit a0de1d0afc
3 changed files with 174 additions and 104 deletions

View file

@ -0,0 +1,121 @@
package ru.spcex.clearing.service.builder;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
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 java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
public class RegistryBuilder {
private Statement statement;
private Company company;
private Account account;
private RegistryDesignation designation;
private final ImdgProvider imdgProvider;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Security> securityImdg;
public static RegistryBuilder builder(ImdgProvider imdgProvider) {
return new RegistryBuilder(imdgProvider);
}
private RegistryBuilder(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.securityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
}
public RegistryBuilder statement(Statement statement) {
this.statement = statement;
return this;
}
public RegistryBuilder company(Company company) {
this.company = company;
return this;
}
public RegistryBuilder account(Account account) {
this.account = account;
return this;
}
public RegistryBuilder designation(RegistryDesignation designation) {
this.designation = designation;
return this;
}
public Registry build() {
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(designation.getKey());
rgs.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
ClearingAccount accountForStatement = clearingAccountImdg.getSingleObjectByID(statement.getAccountId());
if (accountForStatement != null) {
rgs.setRegistryCapacity(accountForStatement.getClearingAccountType());
}
rgs.setRegistryUnit(RegistryUnit.T.getKey());
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
Collection<TradingClearingRegistry> tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of(
"moneyAccountId", statement.getAccountId(),
"companyId", statement.getAddresseeId(),
"status", ServiceStatus.Active.getKey()
));
if (!tcrsByAccount.isEmpty()) {
TradingClearingRegistry tcr = tcrsByAccount.iterator().next();
rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode());
}
rgs.setRegistryStatus(RegistryStatus.PROC.getKey());
rgs.setSecurityId(statement.getSecurityId());
if (statement.getSecurityId() != null) {
Security security = securityImdg.getSingleObjectByID(statement.getSecurityId());
if (security != null) {
rgs.setSecuritySymbol(security.getSecuritySymbol());
}
}
//fixme !rgs.setSettlementCode();
rgs.setTradingDate(statement.getSettlementDate()); //fixme ! today ?
rgs.setClearingDate(LocalDate.now());
//fixme rgs.setRefundDate();
//fixme rgs.setValueDate();
rgs.setContract(statement.getContract());
//создается на базе stmt, companyCred, accountDeb
rgs.setCounterPartyId(statement.getAddresseeId());
rgs.setCreated(Instant.now());
//по дефолту создаем с балансом 0, а потом пересчитываем по необходимости
rgs.setBalance(BigDecimal.ZERO);
rgs.setDebit(BigDecimal.ZERO);
rgs.setCredit(BigDecimal.ZERO);
rgs.setDiffBalance(BigDecimal.ZERO);
rgs.setCheckBalance(BigDecimal.ZERO);
return rgs;
}
}

View file

@ -23,6 +23,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileReque
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.LoggingService;
import ru.spcex.clearing.service.builder.RegistryBuilder;
import ru.spcex.clearing.service.model.Result;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
@ -156,7 +157,18 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
updateReg(stmt, rgs);
registryImdg.update(rgs);
} else {
rgs = createRegistryByStatement(stmt, company, account);
rgs = RegistryBuilder.builder(imdgProvider)
.statement(stmt)
.company(company)
.account(account)
.designation(RegistryDesignation.A)
.build();
calcBalance(rgs, stmt);
Registry registryB = copyRegB(rgs);
Registry registryF = copyRegF(rgs);
registryImdg.insert(registryF);
registryImdg.insert(registryB);
registryImdg.insert(rgs);
}
//if (!checkDiffBalance(rgs.getDiffBalance())) {
@ -189,7 +201,31 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
return BigDecimalUtil.safeBD(diffBalance).compareTo(BigDecimal.ZERO) == 0;
}
private Registry copyRegB(Registry rgs) {
Registry rgsB = rgs.clone();
rgsB.setRegistryUnit(RegistryUnit.B.getKey());
rgsB.setRegistryCode(RegistryUtil.clearingCode(rgsB));
rgsB.setBalance(BigDecimal.ZERO);
rgsB.setDebit(BigDecimal.ZERO);
rgsB.setCredit(BigDecimal.ZERO);
rgsB.setDiffBalance(BigDecimal.ZERO);
rgsB.setCheckBalance(BigDecimal.ZERO);
return rgsB;
}
private Registry copyRegF(Registry rgs) {
Registry rgsF = rgs.clone();
rgsF.setRegistryUnit(RegistryUnit.F.getKey());
rgsF.setRegistryCode(RegistryUtil.clearingCode(rgsF));
rgsF.setBalance(BigDecimal.ZERO);
rgsF.setCredit(BigDecimal.ZERO);
rgsF.setDiffBalance(BigDecimal.ZERO);
rgsF.setCheckBalance(BigDecimal.ZERO);
return rgsF;
}
private final static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yy");
private Statement createSdf01Statement(SDf01 sdf01, Company company, Account account) {
Statement stmt = new Statement();
stmt.setAddresseeId(company.getId());
@ -278,54 +314,9 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
return Optional.empty();
}
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());
ClearingAccount accountForStatement = clearingAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", statement.getAccountId()));
if (accountForStatement != null) {
rgs.setRegistryCapacity(accountForStatement.getClearingAccountType());
}
rgs.setRegistryUnit(RegistryUnit.T.getKey());
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
Collection<TradingClearingRegistry> tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of(
"moneyAccountId", statement.getAccountId(),
"companyId", statement.getAddresseeId()
));
if (!tcrsByAccount.isEmpty()) {
TradingClearingRegistry tcr = tcrsByAccount.iterator().next();
rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode());
}
rgs.setRegistryStatus(RegistryStatus.PROC.getKey());
rgs.setSecurityId(statement.getSecurityId());
if (statement.getSecurityId() != null) {
Security security = securityImdg.getSingleObjectByID(statement.getSecurityId());
if (security != null) {
rgs.setSecuritySymbol(security.getSecuritySymbol());
}
}
private void calcBalance(Registry rgs, Statement statement) {
rgs.setCheckBalance(BigDecimalUtil.safeBD(statement.getAmount()));
rgs.setDiffBalance(BigDecimalUtil.safeBD(rgs.getCheckBalance()).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();
//создается на базе stmt, companyCred, accountDeb
rgs.setCounterPartyId(statement.getAddresseeId());
rgs.setCreated(Instant.now());
return rgs;
}
private void updateReg(Statement s, Registry r) {

View file

@ -23,6 +23,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.ContinueSessionBnRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.LoggingService;
import ru.spcex.clearing.service.builder.RegistryBuilder;
import ru.spcex.clearing.service.model.Result;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
@ -202,7 +203,13 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
rgs.getDebit(),
rgs.getCredit());
}, () -> {
Registry registry = createRegistryByStatement(stmt, company, account, RegistryDesignation.A);
Registry registry = RegistryBuilder.builder(imdgProvider)
.statement(stmt)
.company(company)
.account(account)
.designation(RegistryDesignation.A)
.build();
calcBalance(registry, stmt);
Registry registryB = copyRegB(registry);
Registry registryF = copyRegF(registry, registryB.getBalance());
@ -242,12 +249,12 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
} else if (om_tFound.isPresent()) {
Registry om_t = om_tFound.get();
Registry registryD = copyRegD(om_t, stmt, RegistryUnit.T);
registryImdg.insert(registryD);
log.debug("stmt.id={}, sdf57.specif={}, found OM*T.id={} new DM*T.id={}",
stmt.getId(),
sdf57.getSpecif(),
om_t.getId(),
registryD.getId());
registryImdg.insert(registryD);
log.debug("stmt.id={}, sdf57.specif={}, found OM*T.id={} new DM*T.id={}",
stmt.getId(),
sdf57.getSpecif(),
om_t.getId(),
registryD.getId());
} else if (tm_tFound.isPresent()) {
Registry tm_t = tm_tFound.get();
Registry registryD = copyRegD(tm_t, stmt, RegistryUnit.X);
@ -345,45 +352,7 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
return statement;
}
private Registry createRegistryByStatement(Statement statement, Company company, Account account, RegistryDesignation designation) {
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(designation.getKey());
rgs.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
ClearingAccount accountForStatement = clearingAccountImdg.getSingleObjectByID(statement.getAccountId());
if (accountForStatement != null) {
rgs.setRegistryCapacity(accountForStatement.getClearingAccountType());
}
rgs.setRegistryUnit(RegistryUnit.T.getKey());
rgs.setRegistryCode(RegistryUtil.clearingCode(rgs));
Collection<TradingClearingRegistry> tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of(
"moneyAccountId", statement.getAccountId(),
"companyId", statement.getAddresseeId(),
"status", ServiceStatus.Active.getKey()
));
if (!tcrsByAccount.isEmpty()) {
TradingClearingRegistry tcr = tcrsByAccount.iterator().next();
rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode());
}
rgs.setRegistryStatus(RegistryStatus.PROC.getKey());
rgs.setSecurityId(statement.getSecurityId());
if (statement.getSecurityId() != null) {
Security security = securityImdg.getSingleObjectByID(statement.getSecurityId());
if (security != null) {
rgs.setSecuritySymbol(security.getSecuritySymbol());
}
}
private void calcBalance(Registry rgs, Statement statement) {
InOutDirection inOutDirection = IEnumKey.getEnumByKey(InOutDirection.class, statement.getInOutDirection());
//считаю balance при создании нулевым и исхожу из этого
//При добавлении (на базе изменения statement по sDf57):
@ -404,16 +373,6 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
}
rgs.setDiffBalance(safeBD(rgs.getBalance()).subtract(safeBD(rgs.getCheckBalance())));
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());
//создается на базе stmt, companyCred, accountDeb
rgs.setCounterPartyId(statement.getAddresseeId());
rgs.setCreated(Instant.now());
return rgs;
}
private void updateReg(Statement s, Registry r) {
@ -433,7 +392,6 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
}
private Optional<Registry> findRegByDesignation(Statement stmt,
RegistryTradingParams rgsCode,
boolean contractCondition,