From 1deb4337cb12a3dd018208cd31a096ca6e0fcd8f Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 15 Sep 2023 18:59:36 +0300 Subject: [PATCH] =?UTF-8?q?InspectionObligations=205=D0=B9=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statics/data/registry/Registry.java | 6 ++ .../ru/spcex/clearing/error/RgsError.java | 20 ++++++ .../session/stage/FinalMkrSession.java | 1 + .../session/stage/IntermediateMkrSession.java | 1 + .../stage/impl/InspectionObligations.java | 68 +++++++++++++------ .../utils/enumeration/IMessageResolver.java | 3 + 6 files changed, 79 insertions(+), 20 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/RgsError.java diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java index 8e80869b4..d4c92bbc2 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java @@ -204,10 +204,16 @@ public class Registry extends BusinessObject implements Cloneable { } public BigDecimal getBalance() { + if (balance == null) { + balance = BigDecimal.ZERO; + } return balance; } public void setBalance(BigDecimal balance) { + if (balance == null) { + balance = BigDecimal.ZERO; + } this.balance = balance; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/RgsError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/RgsError.java new file mode 100644 index 000000000..6952ed995 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/RgsError.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.error; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +public enum RgsError implements IErrorEnumId { + + A__tNotFound(5700L) + + ; + private final Long id; + + RgsError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java index b3692dae2..008940e5e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java @@ -108,6 +108,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean inclusionObligations.setSessionType(sessionType()); inspectionObligationsReturn.setSessionType(sessionType()); inspectionObligations.setSessionType(sessionType()); + inspectionObligations.setSection(section()); formingPaymentInstructionDeals.setSection(section()); formingPaymentInstructionDeals.setSessionType(sessionType()); imdgProvider.waitAvailable(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java index 7ac9e372c..d5df17ed8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java @@ -102,6 +102,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ ); inclusionObligations.setSessionType(sessionType()); inspectionObligations.setSessionType(sessionType()); + inspectionObligations.setSection(section()); formingPaymentInstructionDeals.setSection(section()); imdgProvider.waitAvailable(); initSessionIfPresent(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java index 0e6cbc444..cf75aaaa6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.error.ClearingError; +import ru.spcex.clearing.error.RgsError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.RegistryManager; @@ -35,6 +36,7 @@ import java.time.Instant; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -98,6 +100,7 @@ public class InspectionObligations implements ISessionStage { .toList(); log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition); + GROUP: for (Map.Entry> entry : registriesByGroupSorted) { List group = entry.getValue(); List obligationsInGroup = group.stream().filter(registry -> @@ -141,6 +144,27 @@ public class InspectionObligations implements ISessionStage { .ifPresent(chk -> chk.isUncovered = true); } } + for (Registry rgs : group) { + RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()); + if (mOrS == null) { + log.error("RegistryInstrumentType is null for {}.id={}", rgs.getRegistryCode(), rgs.getId()); + continue; + } + if (Section.MKR.equals(section) && mOrS.equals(RegistryInstrumentType.S)) { + continue; + } + Optional a__t = assets.searchByTcrCompanyAccount(rgs, A__T.type(mOrS)); + if (a__t.isEmpty()) { + log.debug("groupId {}, {}.id={} - A**T not found. settings FAIL to group", + entry.getKey(), rgs.getRegistryCode(), rgs.getId()); + Stream.concat(group.stream(), getRefundDateRgsIfPresent(group).stream()) + .forEach(r -> { + r.setComment(msgResolver.resolve(RgsError.A__tNotFound)); + updateRegistryStatus(r, RegistryStatus.FAIL); + }); + continue GROUP; + } + } defineStatusAndUpdateRegistry(checkResults, group); if (checkResults.stream().noneMatch(checkResult -> checkResult.isUncovered)) { Instant now = Instant.now(); @@ -152,14 +176,14 @@ public class InspectionObligations implements ISessionStage { Optional a__t = assets.searchByTcrCompanyAccount(registry, A__T.type(mOrS)); Optional a__b = a__t.map(a__tFound -> assets .searchByTcrCompanyAccount(a__tFound, A__B.type(mOrS)) - .orElse(copyB(a__tFound))); + .orElseGet(() -> copyB(a__tFound))); Optional a__f = a__t.map(a__tFound -> assets .searchByTcrCompanyAccount(a__tFound, A__F.type(mOrS)) - .orElse(copyF(a__tFound))); + .orElseGet(() -> copyF(a__tFound))); log.debug("registry {}.id={}: {}", registry.getRegistryCode(), registry.getId(), a__t.map(r -> "A**T.id=%d/A**B.id=%d/A**F.id=%d" .formatted(a__t.get().getId(), a__b.get().getId(), a__f.get().getId())) - .orElse("not found")); + .orElse("A**T/A**B/A**F not found")); if (a__t.isPresent()) { BigDecimal amount = safeBD(registry.getBalance()); if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) { @@ -283,28 +307,32 @@ foreach( at: rgsAT) } } //проверяем есть ли второй день для сделки (он не входит в пул, поэтому ищем отдельно) - if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { - Optional> groupIdAndSettleDate = registries.stream() - .map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) - .filter(pair -> pair.getFirst() != null) - .filter(pair -> pair.getSecond() != null) - .findFirst(); - if (groupIdAndSettleDate.isEmpty()) - return; - ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); - Collection refundRgs = registryImdg.getCollectionObjectsByPredicate( - pb.and( - pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), - pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) - ) - ); - refundRgs.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.FAIL)); - } + getRefundDateRgsIfPresent(registries).forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.FAIL)); } else { registries.forEach(registry -> updateRegistryStatus(registry, RegistryStatus.OK)); } } + private Collection getRefundDateRgsIfPresent(List registries) { + if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) { + Optional> groupIdAndSettleDate = registries.stream() + .map(rgs -> new Pair<>(rgs.getGroupId(), rgs.getSettlementDate())) + .filter(pair -> pair.getFirst() != null) + .filter(pair -> pair.getSecond() != null) + .findFirst(); + if (groupIdAndSettleDate.isEmpty()) { + return Collections.emptyList(); + } + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + return registryImdg.getCollectionObjectsByPredicate( + pb.and( + pb.equals("groupId", groupIdAndSettleDate.get().getFirst()), + pb.not(pb.equals("settlementDate", groupIdAndSettleDate.get().getSecond())) + ) + ); + } else return Collections.emptyList(); + } + private void updateRegistryStatus(Registry registry, RegistryStatus registryStatus) { log.debug("Update registry.id: {} to {}", registry.getId(), registryStatus.getKey()); registry.setRegistryStatus(registryStatus.getKey()); diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IMessageResolver.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IMessageResolver.java index 4c1059bfc..d492999df 100644 --- a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IMessageResolver.java +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/IMessageResolver.java @@ -2,4 +2,7 @@ package ru.spcex.platform.utils.enumeration; public interface IMessageResolver { String resolve(EnumMessage errorMessage); + default String resolve(IEnumId subject, Object... args) { + return resolve(new EnumMessage(subject, args)); + } }