From 815631d5d2e57cf99f0aa0ff422a9f293e993826 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 4 Oct 2023 19:16:04 +0300 Subject: [PATCH 1/2] execution fond status denied --- .../session/stage/impl/FinishingSession.java | 45 ++++++++++++++----- .../reports/ks/KSRepTradesReportBuilder.java | 2 +- .../services/ReportServiceTest_KS.java | 2 +- .../platform/enumeration/CoverageStatus.java | 2 +- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java index d6ab2b6df..c34d454a3 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.misc.Session; @@ -34,11 +33,10 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.time.Instant; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; @@ -112,14 +110,20 @@ public class FinishingSession implements ISessionStage { .filter(rgs -> RegistryStatus.CLRD.equalsByKey(rgs.getRegistryStatus())) .map(Registry::getGroupId) // Registry::getGroupId == Execution.ExchangeExecutionId, см. RegistryFondBuilder/RegistryDepoBuilder .collect(Collectors.toSet()); + Set exchangeExecutionIdsPreviousDay = oRegs.stream() + .filter(rgs -> Objects.nonNull(rgs.getSettlementDate())) + .filter(rgs -> Objects.nonNull(rgs.getTradingDate())) + .filter(rgs -> rgs.getSettlementDate().compareTo(rgs.getTradingDate()) > 0) + .map(Registry::getGroupId) + .collect(Collectors.toSet()); if (IEnumKey.contains(session.getSessionType(), SessionType.FINL, SessionType.MEDM)) { Collection executions = findExecutionDepositBySessionId(sessionId); int notAllowed = 0; for (ExecutionDeposit execution : executions) { CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ? - CoverageStatus.ALWD : CoverageStatus.DNED; - if (toStatus == CoverageStatus.DNED) + CoverageStatus.ALWD : CoverageStatus.DEND; + if (toStatus == CoverageStatus.DEND) notAllowed++; execution.setCoverageStatus(toStatus.getKey()); execution.setUpdated(Instant.now()); @@ -128,12 +132,15 @@ public class FinishingSession implements ISessionStage { log.trace("By sessionId={} update {} ExecutionDeposit: {} allowed, {} denied", sessionId, executions.size(), exchangeExecutionIdAllowed.size(), notAllowed); } else if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) { - Collection executions = findExecutionFondBySessionId(sessionId); + List executions = Stream.concat( + findExecutionFondBySessionId(sessionId).stream(), + findExecutionFondBySessionId(exchangeExecutionIdsPreviousDay).stream()) + .toList(); int notAllowed = 0; for (ExecutionFond execution : executions) { CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ? - CoverageStatus.ALWD : CoverageStatus.DNED; - if (toStatus == CoverageStatus.DNED) + CoverageStatus.ALWD : CoverageStatus.DEND; + if (toStatus == CoverageStatus.DEND) notAllowed++; execution.setCoverageStatus(toStatus.getKey()); execution.setUpdated(Instant.now()); @@ -242,18 +249,32 @@ public class FinishingSession implements ISessionStage { Collection result = registryImdg.getCollectionObjectsByPredicate(prdct); log.trace("found {} liabilities by query {} ", result.size(), prdct); result = result.stream() + .filter(registry -> Objects.equals(registry.getSettlementDate(), LocalDate.now())) .filter(registry -> Objects.equals(registry.getValueDate(), registry.getSettlementDate())) - .collect(Collectors.toList()); + .collect(Collectors.toList()); log.debug("found {} liabilities 'O' by query {} and ValueDate==SettlementDate", result.size(), prdct); return result; } protected Collection findExecutionFondBySessionId(Long sessionId) { - Collection result = executionFondImdg.getCollectionObjectsByFieldValues(Map.of("sessionId", sessionId)); + ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("sessionId", sessionId), + pb.equals("settlementDate", LocalDate.now()) + ); + Collection result = executionFondImdg.getCollectionObjectsByPredicate(prdct); log.trace("found {} ExecutionFond by sessionId={}", result.size(), sessionId); return result; } + protected Collection findExecutionFondBySessionId(Set exchangeIds) { + ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + ImdgPredicate prdct = pb.in("exchangeExecutionId", exchangeIds.toArray(new Long[0])); + Collection result = executionFondImdg.getCollectionObjectsByPredicate(prdct); + log.trace("found {} ExecutionFond from first day", result.size()); + return result; + } + protected Collection findExecutionDepositBySessionId(Long sessionId) { Collection result = executionDepositImdg.getCollectionObjectsByFieldValues(Map.of("sessionId", sessionId)); log.trace("found {} ExecutionDeposit by sessionId={}", result.size(), sessionId); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java index e4102cf2a..54c0bde31 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepTradesReportBuilder.java @@ -175,7 +175,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder Date: Thu, 5 Oct 2023 14:41:35 +0300 Subject: [PATCH 2/2] return deposit contract condition SettlementDate/ValueDate/RefundDate clone --- .../java/ru/spcex/clearing/service/RegistryService.java | 4 ++++ .../service/validation/ReturnDepositValidationRule.java | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index bb15afb9b..bdfc7869d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -47,6 +47,7 @@ import ru.spcex.platform.utils.validation.IValidator; import java.math.BigDecimal; import java.time.Instant; +import java.time.LocalDate; import java.util.Collection; import java.util.List; import java.util.Map; @@ -244,6 +245,9 @@ public class RegistryService { dm__ = _m_t.clone(); dm__.setRegistryDesignation(RegistryDesignation.D.getKey()); RegistryManager.zeroState(dm__); + dm__.setSettlementDate(LocalDate.now()); + dm__.setValueDate(null); + dm__.setRefundDate(null); if (RegistryDesignation.T.equalsByKey(_m_t.getRegistryDesignation())) { dm__.setRegistryUnit(RegistryUnit.X.getKey()); } else { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java index 13b32dbe5..1117dcc1d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ReturnDepositValidationRule.java @@ -9,6 +9,8 @@ import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.Stored; @@ -64,7 +66,12 @@ public enum ReturnDepositValidationRule implements IValidationRule rgsImdg = context.obtainMap(IMDGDistributedNames.Map_Registry, Registry.class); - Collection group = rgsImdg.getCollectionObjectsBySQL("groupId = %d".formatted(rgs.getGroupId())); + ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("groupId", rgs.getGroupId()), + pb.equals("contract", rgs.getContract()) + ); + Collection group = rgsImdg.getCollectionObjectsByPredicate(prdct); Optional om_t = group.stream() .filter(r -> r.getSettlementDate() != null) .filter(r -> r.getValueDate() != null)