From a0de1d0afc8d3cfe53ba51a6804ac490182edce4 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 7 Jul 2023 15:47:11 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-409 --- .../service/builder/RegistryBuilder.java | 121 ++++++++++++++++++ .../service/executors/Sdf01Executor.java | 85 ++++++------ .../service/executors/Sdf57Executor.java | 72 +++-------- 3 files changed, 174 insertions(+), 104 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java new file mode 100644 index 000000000..d0bff81c1 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistryBuilder.java @@ -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 clearingAccountImdg; + private final Imdg tradingClearingRegistryImdg; + private final Imdg 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 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; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java index bc9c2e049..0042d7afe 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java @@ -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 { 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 { 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 { 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 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) { 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 a3cb0c71d..5a2712fc6 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 @@ -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 { 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 { } 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 { 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 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 { } 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 { } - private Optional findRegByDesignation(Statement stmt, RegistryTradingParams rgsCode, boolean contractCondition,