From f759ce4d560a83b324bcb84f58dc488f58ab7edd Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 8 Jun 2023 17:22:30 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20PaymentInstruction=20=D0=BF=D1=80=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B5=20=D1=81=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2=D0=BE=D0=B9=20=D1=81=D0=B5=D1=81=D1=81=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=9C=D0=9A=D0=A0=20-=20=D0=B1=D0=BB=D0=BE=D0=BA?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=81=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ormingPaymentInstructionDealsFinalMkr.java | 73 ++++++++++++++++--- 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDealsFinalMkr.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDealsFinalMkr.java index e85f8240c..3a07e1021 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDealsFinalMkr.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDealsFinalMkr.java @@ -45,8 +45,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static ru.spcex.platform.enumeration.RegistryTradingParams.CM_T; -import static ru.spcex.platform.enumeration.RegistryTradingParams.LM_T; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @@ -116,6 +116,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage { private StageResult formingPaymentInstructions(Long sessionId, Collection paymentInstructionReturns) { Collection registries = selectRegistries(); log.debug("found registries.size() = {}", registries.size()); + //клиринговый счет, через который будут проводиться сделки Account tranAcc = accountImdg.getSingleObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); if (tranAcc == null) { @@ -124,6 +125,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage { false); } log.debug("found tranAcc.id = {}", tranAcc.getId()); + //группируем регистры по groupId Map> groups = registries .stream() .collect(Collectors.groupingBy(Registry::getGroupId)); @@ -136,20 +138,54 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage { .filter(rgs -> equalsByRegistry(rgsCode, rgs)) .findFirst() .orElse(null); - Registry rgsCmt = findByCode.apply(CM_T); - Registry rgsLmt = findByCode.apply(LM_T); - if (rgsCmt == null || rgsLmt == null) { - log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, rgsCmt, rgsLmt); + //интересуют обязательства и требования по деньгам + Registry cm_t = findByCode.apply(CM_T); + Registry lm_t = findByCode.apply(LM_T); + if (cm_t == null || lm_t == null) { + log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, cm_t, lm_t); continue; } + { + //изменение активов - блокируем средства беред отправкой sdf'ов + Optional amfO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_F); + Optional payerAmtO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_T); + Optional ambO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_B); + Optional receiverAmtO = findRelatedAsset(cm_t.getTradingClearingRegistryId(), cm_t.getCompanyId(), AM_B); + log.debug("changing A* registers based on LM_T {} and CM_T {} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}", + lm_t.getId(), + cm_t.getId(), + amfO.map(Registry::getId).orElse(null), + payerAmtO.map(Registry::getId).orElse(null), + ambO.map(Registry::getId).orElse(null), + receiverAmtO.map(Registry::getId).orElse(null) + ); + Instant now = Instant.now(); + amfO.ifPresent(amf -> { + amf.setBalance(safeBD(amf.getBalance()).subtract(safeBD(lm_t.getBalance()))); + setUpdatedStoreInImdg(amf, now); + }); + payerAmtO.ifPresent(amt -> { + amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(lm_t.getBalance()))); + setUpdatedStoreInImdg(amt, now); + }); + ambO.ifPresent(amb -> { + amb.setBalance(safeBD(amb.getBalance()).add(safeBD(lm_t.getBalance()))); + setUpdatedStoreInImdg(amb, now); + }); + receiverAmtO.ifPresent(amt -> { + // у отправителя и получателя одинаково, см. в FormingPaymentInstruction + amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(lm_t.getBalance()))); + setUpdatedStoreInImdg(amt, now); + }); + } log.trace("generating payment instruction for groupId {} cmt_t {} lm_t {}", groupId, - rgsCmt.getId(), - rgsLmt.getId()); + cm_t.getId(), + lm_t.getId()); Pair pmtInstrs = PaymentInstructionBuilderFinalMkrDeals .builder(imdgProvider) - .cm_t(rgsCmt) - .lm_t(rgsLmt) + .cm_t(cm_t) + .lm_t(lm_t) .tranAcc(tranAcc) .sessionId(sessionId) .build(); @@ -173,6 +209,23 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage { return stageResult; } + + private void setUpdatedStoreInImdg(Registry rgs, Instant now) { + rgs.setUpdated(now); + registryImdg.update(rgs); + } + + private Optional findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) { + ImdgPredicateBuilder rgsPrdBldr = registryImdg.predicateBuilder(); + RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(rgsCode); + ImdgPredicate assetCondition = rgsPrdBldr.and( + rgsPrdBldr.equals("tradingClearingRegistryId", tradingClearingRegistryId), + rgsPrdBldr.equals("companyId", companyId), + rgsPrdBldr.sql(codeSql.build()) + ); + return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(assetCondition)); + } + private void sendSdfs(List formedPaymentInstructions) { List sDf03Created = new ArrayList<>(); for (PaymentInstruction paymentInstruction : formedPaymentInstructions) {