From 5dd85d742ff2cc0eecd4698289fe733442b2aed4 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 3 Aug 2023 21:12:16 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20D***=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/service/RegistryManager.java | 36 +++++++++++++++++++ ...ormingPaymentInstructionDepositReturn.java | 15 +++++--- .../FormingPaymentInstructionReturnMkr.java | 10 ++++-- .../InspectionObligationsDepositReturn.java | 6 ++-- 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryManager.java index 7b023bf4d..5cfe94d4c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryManager.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryManager.java @@ -43,6 +43,17 @@ public class RegistryManager { return Optional.ofNullable(dmx); } + public Optional searchDmxByCounterPartyNotOk(Registry rgs) { + if (TextUtil.isEmpty(rgs.getContract())) return Optional.empty(); + String sqlCondition = String.format("(%s) and companyId = %d and contract = '%s' and registryStatus != '%s'", + RegistryCodeSqlBuilder.getInstance(DM_X).build(), + rgs.getCounterPartyId(), + rgs.getContract(), + RegistryStatus.OK.getKey()); + Registry dmx = rgsImdg.getFirstObjectBySQL(sqlCondition); + return Optional.ofNullable(dmx); + } + public Optional searchDmxByCompanyId(Registry rgs) { if (TextUtil.isEmpty(rgs.getContract())) return Optional.empty(); String sqlCondition = String.format("(%s) and companyId = %d and contract = '%s'", @@ -65,6 +76,19 @@ public class RegistryManager { return Optional.ofNullable(dmt); } + public Optional searchDmtInfoNotOk(Registry rgs) { + if (TextUtil.isEmpty(rgs.getContract())) return Optional.empty(); + String sqlCondition = String.format("(%s) and accountType='%s' and companyId = %d and counterPartyId = %d and contract = '%s' and registryStatus != '%s'", + RegistryCodeSqlBuilder.getInstance(DM_T).build(), + AccountType.Info.getKey(), + rgs.getCompanyId(), + rgs.getCounterPartyId(), + rgs.getContract(), + RegistryStatus.OK.getKey()); + Registry dmt = rgsImdg.getFirstObjectBySQL(sqlCondition); + return Optional.ofNullable(dmt); + } + public Optional searchDmtClrn(Registry rgs) { ImdgPredicate dmtClrnPrdct = RegistryDm_tClrnPredicate .instance(rgs.getCompanyId(), rgs.getCounterPartyId()) @@ -75,6 +99,18 @@ public class RegistryManager { return Optional.ofNullable(dmt); } + public Optional searchDmtClrnNotOk(Registry rgs) { + ImdgPredicate dmtClrnPrdct = RegistryDm_tClrnPredicate + .instance(rgs.getCompanyId(), rgs.getCounterPartyId()) + .apply(rgsImdg); + ImdgPredicateBuilder rgsPb = rgsImdg.predicateBuilder(); + dmtClrnPrdct = rgsPb.and(dmtClrnPrdct, + rgsPb.equals("contract", rgs.getContract()), + rgsPb.not(rgsPb.equals("registryStatus", RegistryStatus.OK.getKey()))); + Registry dmt = rgsImdg.getSingleObjectByPredicate(dmtClrnPrdct); + return Optional.ofNullable(dmt); + } + public Optional findRelatedAsset(Long tradingClearingRegistryId, Long companyId, String securitySymbol, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java index b4bbacd5b..d95fdc627 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java @@ -30,6 +30,7 @@ import ru.spcex.clearing.session.stage.task.FormingPaymentInstructionPayload; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.Allowed; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -98,6 +99,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { //CM_T LM_T CS_T LS_T private StageResult formingPaymentInstruction(Long sessionId) { + Instant now = Instant.now(); RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(LM_T,CM_T, LS_T, CS_T); String registryCodeCondition = registryCodeSqlBuilder.build(); @@ -125,24 +127,28 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { } Registry lm_t = lmtO.get(); //obligation by money Registry cm_t = cmtO.get(); - Optional dmx = rgsMng.searchDmxByCounterParty(lm_t); + Optional dmx = rgsMng.searchDmxByCounterPartyNotOk(lm_t); if (dmx.isPresent()) { log.debug("LM*T#id={}, DM*X#id={} found, no action needed for group {}, skipping liability", lm_t.getId(), dmx.get().getId(), lm_t.getGroupId()); + dmx.get().setRegistryStatus(RegistryStatus.OK.getKey()); + setUpdatedStoreInImdg(dmx.get(), now); continue; } - Optional dmtInfo = rgsMng.searchDmtInfo(lm_t); + Optional dmtInfo = rgsMng.searchDmtInfoNotOk(lm_t); if (dmtInfo.isPresent()) { BigDecimal balance = safeBD(lm_t.getBalance()).add(safeBD(cm_t.getBalance())); //fixme???? PaymentInstruction payInstr = createPaymentInstruction(List.of(lm_t, cm_t), balance, sessionId); lm_t.setPaymentId(payInstr.getId()); lm_t.setUpdated(Instant.now()); registryImdg.update(lm_t); + dmtInfo.get().setRegistryStatus(RegistryStatus.OK.getKey()); + setUpdatedStoreInImdg(dmtInfo.get(), now); continue; } - Optional dmtClnr = rgsMng.searchDmtClrn(lm_t); + Optional dmtClnr = rgsMng.searchDmtClrnNotOk(lm_t); if (dmtClnr.isPresent()) { Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); @@ -165,7 +171,6 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { 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); @@ -197,6 +202,8 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { lm_t.getId(), cm_t.getId(), pmts.getFirst().getId(), pmts.getSecond().getId()); pmtCreated.add(pmts.getFirst()); pmtCreated.add(pmts.getSecond()); + dmtClnr.get().setRegistryStatus(RegistryStatus.OK.getKey()); + setUpdatedStoreInImdg(dmtClnr.get(), now); } } sendSdfs(pmtCreated); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java index deb84c365..a1d9c24ba 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java @@ -96,6 +96,7 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { private StageResult formingPaymentInstruction(Long sessionId) { + Instant now = Instant.now(); RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(LM_T, CM_T); String registryCodeCondition = registryCodeSqlBuilder.build(); @@ -142,13 +143,15 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { } Registry lm_t = lmtO.get(); //obligation by money Registry cm_t = cmtO.get(); - Optional dmx = rgsMng.searchDmxByCounterParty(lm_t); + Optional dmx = rgsMng.searchDmxByCounterPartyNotOk(lm_t); if (dmx.isPresent()) { log.debug("LM*T#id={}, DM*X#id={} found, no action needed for group {}, skipping liability", lm_t.getId(), dmx.get().getId(), lm_t.getGroupId()); + dmx.get().setRegistryStatus(RegistryStatus.OK.getKey()); + setUpdatedStoreInImdg(dmx.get(), now); continue; } - Optional dmtClnr = rgsMng.searchDmtClrn(lm_t); + Optional dmtClnr = rgsMng.searchDmtClrnNotOk(lm_t); if (dmtClnr.isPresent()) { Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); @@ -171,7 +174,6 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { 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); @@ -203,6 +205,8 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { lm_t.getId(), cm_t.getId(), pmts.getFirst().getId(), pmts.getSecond().getId()); pmtCreated.add(pmts.getFirst()); pmtCreated.add(pmts.getSecond()); + dmtClnr.get().setRegistryStatus(RegistryStatus.OK.getKey()); + setUpdatedStoreInImdg(dmtClnr.get(), now); } } StageResult> stageResult = new StageResult(null, true); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java index 9b4fb04cc..d27179b60 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java @@ -97,7 +97,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { ); if (dmxBalance.compareTo(omtBalance) >= 0) { group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); - updateStatus(dmx.get(), RegistryStatus.OK); +// updateStatus(dmx.get(), RegistryStatus.POOL); } else { //для OM*T uncovered остальным фейл group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); @@ -126,7 +126,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { ); if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >=0) { group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); - updateStatus(dmtInfo.get(), RegistryStatus.OK); +// updateStatus(dmtInfo.get(), RegistryStatus.POOL); } else { group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); updateStatus(dmtInfo.get(), RegistryStatus.UNCV); @@ -143,7 +143,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { ); if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); - updateStatus(dmtClnr.get(), RegistryStatus.OK); +// updateStatus(dmtClnr.get(), RegistryStatus.POOL); } else { group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); updateStatus(dmtClnr.get(), RegistryStatus.UNCV); From b10d6bb0c3c7c32a91fc1ab7d1a51067498a86b2 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 4 Aug 2023 12:58:17 +0300 Subject: [PATCH 2/2] Inclusion to pool fix --- .../clearing/session/stage/impl/InclusionObligations.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java index 38f582907..0127c4a2c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java @@ -137,10 +137,11 @@ public class InclusionObligations implements ISessionStage { private ImdgPredicate sessionTypePredicate() { if (this.sessionType != null) { - if (SessionType.FINL.equals(sessionType)) { + if (SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) { return rgsPb.or( - rgsPb.equals("sessionType", sessionType.getKey()), - rgsPb.equals("sessionType", SessionType.MEDM.getKey()) + rgsPb.equals("sessionType", SessionType.FINL.getKey()), + rgsPb.equals("sessionType", SessionType.MEDM.getKey()), + rgsPb.equals("sessionType", SessionType.XDEP.getKey()) ); } else { return rgsPb.equals("sessionType", sessionType.getKey());