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 93d33960a..8f9a4ba56 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 @@ -1,16 +1,27 @@ package ru.spcex.clearing.session.stage.impl; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.ExecutionCurrency; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf05; +import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithRegistryId; @@ -22,7 +33,12 @@ import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.task.FinishingSessionPayload; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.CoverageStatus; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -31,19 +47,8 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.collection.Pair; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.enumeration.IMessageResolver; - -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @@ -54,6 +59,7 @@ public class FinishingSession implements ISessionStage { private final Imdg registryImdg; private final Imdg executionFondImdg; private final Imdg executionDepositImdg; + private final Imdg executionCurrencyImdg; private final Imdg sessionImdg; private final Imdg sDf05Imdg; private final KafkaSender kafkaSender; @@ -70,6 +76,7 @@ public class FinishingSession implements ISessionStage { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); + this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class); this.sDf05Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf05, SDf05.class); this.kafkaSender = kafkaSender; this.msgResolver = msgResolver; @@ -138,7 +145,8 @@ public class FinishingSession implements ISessionStage { log.trace("obligations number with second leg in the past: {}", exchangeExecutionIdsPreviousDay.size()); int allowed = 0; int notAllowed = 0; - if (IEnumKey.contains(session.getSessionType(), SessionType.FINL, SessionType.MEDM)) { + SessionType sessionType = getEnumByKey(SessionType.class, session.getSessionType()); + if (IEnumKey.contains(sessionType, SessionType.FINL, SessionType.MEDM)) { Collection executions = findExecutionDepositBySessionId(sessionId); log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId); for (ExecutionDeposit execution : executions) { @@ -163,10 +171,10 @@ public class FinishingSession implements ISessionStage { allowed, notAllowed, executions.size() - (allowed + notAllowed)); - } else if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) { - Collection executions = findExecutionFondBySessionId(sessionId); - log.trace("loaded {} ExecutionFonds for sessionId {}", executions.size(), sessionId); - for (ExecutionFond execution : executions) { + } else if (IEnumKey.contains(sessionType, SessionType.CURR, SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) { + Collection executions = findExecutionFondBySessionId(sessionId, sessionType); + log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId); + for (ExecutionCommon execution : executions) { CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId()); if (toStatus == null) { log.trace("CoverageStatus not defined for execution.id={}", execution.getId()); @@ -180,7 +188,11 @@ public class FinishingSession implements ISessionStage { } execution.setCoverageStatus(toStatus.getKey()); execution.setUpdated(Instant.now()); - executionFondImdg.update(execution); + if (sessionType.equals(SessionType.CURR)) { + executionCurrencyImdg.update((ExecutionCurrency) execution); + } else { + executionFondImdg.update((ExecutionFond) execution); + } } log.trace("By sessionId={} processed {} ExecutionFond: allowed {}, denied {}, skipped {}", sessionId, @@ -297,22 +309,28 @@ public class FinishingSession implements ISessionStage { return result; } - protected Collection findExecutionFondBySessionId(Long sessionId) { - ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + protected Collection findExecutionFondBySessionId(Long sessionId, SessionType sessionType) { + Imdg excImdg; + if (sessionType.equals(SessionType.CURR)) { + excImdg = executionCurrencyImdg; + } else { + excImdg = executionFondImdg; + } + ImdgPredicateBuilder pb = excImdg.predicateBuilder(); ImdgPredicate prdct = pb.or( pb.equals("sessionId", sessionId), pb.equals("settlementDate", LocalDate.now()) ); - Collection result = executionFondImdg.getCollectionObjectsByPredicate(prdct) - .stream() - .filter(eFond -> Objects.nonNull(eFond.getSessionId())) - .filter(eFond -> { - if (sessionId.equals(eFond.getSessionId())) return true; - Session session = sessionImdg.getSingleObjectByID(eFond.getSessionId()); - return sessionType.equalsByKey(session.getSessionType()); - }) - .toList(); - log.trace("found {} ExecutionFond by sessionId={}", result.size(), sessionId); + Collection result = excImdg.getCollectionObjectsByPredicate(prdct) + .stream() + .filter(eFond -> Objects.nonNull(eFond.getSessionId())) + .filter(eFond -> { + if (sessionId.equals(eFond.getSessionId())) return true; + Session session = sessionImdg.getSingleObjectByID(eFond.getSessionId()); + return this.sessionType.equalsByKey(session.getSessionType()); + }) + .toList(); + log.trace("found {} Executions by sessionId={}", result.size(), sessionId); return result; }