InspectionObligations 5й шаг

This commit is contained in:
ialbert 2023-09-15 18:59:36 +03:00
parent 5b82083596
commit 1deb4337cb
6 changed files with 79 additions and 20 deletions

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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();

View file

@ -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();

View file

@ -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<Long, List<Registry>> entry : registriesByGroupSorted) {
List<Registry> group = entry.getValue();
List<Registry> 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<Registry> 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<Registry> a__t = assets.searchByTcrCompanyAccount(registry, A__T.type(mOrS));
Optional<Registry> a__b = a__t.map(a__tFound -> assets
.searchByTcrCompanyAccount(a__tFound, A__B.type(mOrS))
.orElse(copyB(a__tFound)));
.orElseGet(() -> copyB(a__tFound)));
Optional<Registry> 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<Pair<Long, LocalDate>> 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<Registry> 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<Registry> getRefundDateRgsIfPresent(List<Registry> registries) {
if (registries.stream().anyMatch(rgs -> rgs.getRefundDate() != null) && !SessionType.MEDM.equals(sessionType)) {
Optional<Pair<Long, LocalDate>> 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());

View file

@ -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));
}
}