InspectionObligations 5й шаг
This commit is contained in:
parent
5b82083596
commit
1deb4337cb
6 changed files with 79 additions and 20 deletions
|
|
@ -204,10 +204,16 @@ public class Registry extends BusinessObject implements Cloneable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal getBalance() {
|
public BigDecimal getBalance() {
|
||||||
|
if (balance == null) {
|
||||||
|
balance = BigDecimal.ZERO;
|
||||||
|
}
|
||||||
return balance;
|
return balance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBalance(BigDecimal balance) {
|
public void setBalance(BigDecimal balance) {
|
||||||
|
if (balance == null) {
|
||||||
|
balance = BigDecimal.ZERO;
|
||||||
|
}
|
||||||
this.balance = balance;
|
this.balance = balance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -108,6 +108,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligationsReturn.setSessionType(sessionType());
|
inspectionObligationsReturn.setSessionType(sessionType());
|
||||||
inspectionObligations.setSessionType(sessionType());
|
inspectionObligations.setSessionType(sessionType());
|
||||||
|
inspectionObligations.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSection(section());
|
formingPaymentInstructionDeals.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSessionType(sessionType());
|
formingPaymentInstructionDeals.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
|
||||||
);
|
);
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligations.setSessionType(sessionType());
|
inspectionObligations.setSessionType(sessionType());
|
||||||
|
inspectionObligations.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSection(section());
|
formingPaymentInstructionDeals.setSection(section());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
import ru.spcex.clearing.error.ClearingError;
|
import ru.spcex.clearing.error.ClearingError;
|
||||||
|
import ru.spcex.clearing.error.RgsError;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
||||||
import ru.spcex.clearing.service.registry.RegistryManager;
|
import ru.spcex.clearing.service.registry.RegistryManager;
|
||||||
|
|
@ -35,6 +36,7 @@ import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
||||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
@ -98,6 +100,7 @@ public class InspectionObligations implements ISessionStage {
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition);
|
log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition);
|
||||||
|
GROUP:
|
||||||
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) {
|
for (Map.Entry<Long, List<Registry>> entry : registriesByGroupSorted) {
|
||||||
List<Registry> group = entry.getValue();
|
List<Registry> group = entry.getValue();
|
||||||
List<Registry> obligationsInGroup = group.stream().filter(registry ->
|
List<Registry> obligationsInGroup = group.stream().filter(registry ->
|
||||||
|
|
@ -141,6 +144,27 @@ public class InspectionObligations implements ISessionStage {
|
||||||
.ifPresent(chk -> chk.isUncovered = true);
|
.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);
|
defineStatusAndUpdateRegistry(checkResults, group);
|
||||||
if (checkResults.stream().noneMatch(checkResult -> checkResult.isUncovered)) {
|
if (checkResults.stream().noneMatch(checkResult -> checkResult.isUncovered)) {
|
||||||
Instant now = Instant.now();
|
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__t = assets.searchByTcrCompanyAccount(registry, A__T.type(mOrS));
|
||||||
Optional<Registry> a__b = a__t.map(a__tFound -> assets
|
Optional<Registry> a__b = a__t.map(a__tFound -> assets
|
||||||
.searchByTcrCompanyAccount(a__tFound, A__B.type(mOrS))
|
.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
|
Optional<Registry> a__f = a__t.map(a__tFound -> assets
|
||||||
.searchByTcrCompanyAccount(a__tFound, A__F.type(mOrS))
|
.searchByTcrCompanyAccount(a__tFound, A__F.type(mOrS))
|
||||||
.orElse(copyF(a__tFound)));
|
.orElseGet(() -> copyF(a__tFound)));
|
||||||
log.debug("registry {}.id={}: {}", registry.getRegistryCode(), registry.getId(),
|
log.debug("registry {}.id={}: {}", registry.getRegistryCode(), registry.getId(),
|
||||||
a__t.map(r -> "A**T.id=%d/A**B.id=%d/A**F.id=%d"
|
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()))
|
.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()) {
|
if (a__t.isPresent()) {
|
||||||
BigDecimal amount = safeBD(registry.getBalance());
|
BigDecimal amount = safeBD(registry.getBalance());
|
||||||
if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) {
|
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)) {
|
getRefundDateRgsIfPresent(registries).forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.FAIL));
|
||||||
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));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
registries.forEach(registry -> updateRegistryStatus(registry, RegistryStatus.OK));
|
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) {
|
private void updateRegistryStatus(Registry registry, RegistryStatus registryStatus) {
|
||||||
log.debug("Update registry.id: {} to {}", registry.getId(), registryStatus.getKey());
|
log.debug("Update registry.id: {} to {}", registry.getId(), registryStatus.getKey());
|
||||||
registry.setRegistryStatus(registryStatus.getKey());
|
registry.setRegistryStatus(registryStatus.getKey());
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,7 @@ package ru.spcex.platform.utils.enumeration;
|
||||||
|
|
||||||
public interface IMessageResolver {
|
public interface IMessageResolver {
|
||||||
String resolve(EnumMessage errorMessage);
|
String resolve(EnumMessage errorMessage);
|
||||||
|
default String resolve(IEnumId subject, Object... args) {
|
||||||
|
return resolve(new EnumMessage(subject, args));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue