diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index 1982a15ac..9d1ba048a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -22,7 +22,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApprovalRequest; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.integration.GatewayRequestCreator; +import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.DmiService; import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.validation.Sdf06NewValidationRule; @@ -66,6 +68,7 @@ public class Sdf06Executor { private final KafkaSender kafkaSender; private final FilenameObtainer filenameObtainer; private final DmiService dmiService; + private final AssetTBFProcessing assets; private final static BigDecimal successResult = BigDecimal.ZERO; //идет сессия (не возвращаем такую ошибку) @@ -87,7 +90,7 @@ public class Sdf06Executor { public Sdf06Executor(ImdgProvider imdgProvider, IMessageResolver messageResolver, @Qualifier("sdf06ValidatorNew") Function sDf06Validator, - TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService) { + TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService, AssetTBFProcessing assets) { this.imdgProvider = imdgProvider; this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); this.tradingTimeService = tradingTimeService; @@ -102,6 +105,7 @@ public class Sdf06Executor { this.sdf07Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf07, SDf07.class); this.filenameObtainer = filenameObtainer; this.dmiService = dmiService; + this.assets = assets; } public void execute(BaseRequest systemRequest) { @@ -160,6 +164,8 @@ public class Sdf06Executor { CurrencyCode.RUB.getKey(), safeBD(sDf06.getSum()), sDf06.getNumber().toString()); + Optional asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId()); + asts.ifPresent(ast -> assets.process(ast.a__b(), ast.a__t(), ast.a__f(), BigDecimal.ZERO)); } sdf07WasCreated = true; } @@ -266,11 +272,16 @@ public class Sdf06Executor { Instant updatedTime = Instant.now(); if (gatewayMsg.isApproved()) { processedApproved(stmt, sdf06, updatedTime); - dmiService.setProcContract(searchTcrOnGatewayResponse(sdf06).map(SpcexObjectBase::getId).orElse(null), + Optional tcr = searchTcrOnGatewayResponse(sdf06); + dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null), CurrencyCode.RUB.getKey(), safeBD(sdf06.getSum()), sdf06.getNumber().toString() ); + if (tcr.isPresent()) { + Optional asts = assets.searchMoneyByAccAndCompany(tcr.get().getCompanyId(), tcr.get().getMoneyAccountId()); + asts.ifPresent(a -> assets.process(a.a__b(), a.a__t(), a.a__f(), BigDecimal.ZERO)); + } } else { log.trace("statement.id={}, sdf07.id={}, sdf06.id={} rejected (by gateway answer)", statementId, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java index 2ee0a33d3..3858ad2ec 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf10Executor.java @@ -25,6 +25,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApp import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse; import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.validation.ValidationStored; @@ -68,6 +69,7 @@ public class Sdf10Executor { private final TradingTimeService tradingTimeService; private final KafkaSender kafkaSender; private final SecuritySelector scrtSlct; + private final AssetTBFProcessing assets; private final static String OK = "OK"; private final static String SYNTAX_ERROR = "Синтаксическая ошибка (файл сформирован неверно)"; @@ -88,7 +90,7 @@ public class Sdf10Executor { public Sdf10Executor(ImdgProvider imdgProvider, RegistryManager rgsMng, IMessageResolver messageResolver, @Qualifier("sdf10Validator") Function sDf10Validator, - TradingTimeService tradingTimeService, KafkaSender kafkaSender) { + TradingTimeService tradingTimeService, KafkaSender kafkaSender, AssetTBFProcessing assets) { this.imdgProvider = imdgProvider; this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); @@ -102,6 +104,7 @@ public class Sdf10Executor { this.sdf11Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf11, SDf11.class); this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class); this.scrtSlct = new SecuritySelector<>(imdgProvider, Security.class); + this.assets = assets; } public void execute(BaseRequest systemRequest) { @@ -166,7 +169,11 @@ public class Sdf10Executor { SDf11 sDf11 = processedApproved(stmt, sDf10, now, sdf11GroupId); BigDecimal amount = InOutDirection.in.equalsByKey(stmt.getInOutDirection()) ? stmt.getAmount() : safeBD(stmt.getAmount()).negate(); - createDs_iWithoutGateway(tcr.getId(), company.getId(), security.getSecuritySymbol(), amount, sDf10.getOutDocument()); + createDs_iWithoutGateway(tcr.getId(), + company.getId(), + security.getSecuritySymbol(), + amount, + sDf10.getOutDocument()); sdf11WasCreated = true; } } @@ -190,6 +197,7 @@ public class Sdf10Executor { return; } createDs_i(as_t.get(), summ, outDocument); + assets.processByA__t(as_t.get(), BigDecimal.ZERO); } private void createDs_iWithoutGateway(Long tcrId, Long companyId, String securitySymobl, BigDecimal summ, String outDocument) { @@ -203,6 +211,7 @@ public class Sdf10Executor { return; } createDs_i(as_t.get(), summ, outDocument); + assets.processByA__t(as_t.get(), BigDecimal.ZERO); } private void createDs_i(Registry as_t, BigDecimal summ, String outDocument) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java index e1877d5de..3b6a8b741 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java @@ -134,6 +134,25 @@ public class AssetTBFProcessing { } } + public Optional processByA__t(Registry a__t, BigDecimal sum) { + Optional a__b = rgsMng.findRegByUnit(a__t.getCompanyId(), + a__t.getAccountId(), + a__t.getContract(), + a__t, + RegistryUnit.B); + Optional a__f = rgsMng.findRegByUnit(a__t.getCompanyId(), + a__t.getAccountId(), + a__t.getContract(), + a__t, + RegistryUnit.F); + if (a__b.isPresent() && a__f.isPresent()) { + process(a__b.get(), a__t, a__f.get(), sum); + return Optional.of(new AssetTrio(a__t, a__b.get(), a__f.get())); + } else { + return Optional.empty(); + } + } + public AssetTrio createSAssets(Account acc, String securitySymbol, Long securityId, @@ -244,6 +263,23 @@ public class AssetTBFProcessing { return Optional.empty(); } + public Optional searchSecurityByAccAndCompany(Long companyId, Long accountId, String securitySymbol) { + ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + Function prdct = rgsCode -> pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCode).build()), + pb.equals("companyId", companyId), + pb.equals("accountId", accountId), + pb.equals("securitySymbol", securitySymbol) + ); + Registry amf = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_F)); + Registry amb = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_B)); + Registry amt = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_T)); + if (amf != null && amb != null && amt != null) { + return Optional.of(new AssetTrio(amf, amb, amt)); + } + return Optional.empty(); + } + public boolean insufficientBalance(Registry registry, BigDecimal amount) { return safeBD(registry.getBalance()).compareTo(safeBD(amount)) < 0; }