изменения по финальной МКР сессии:

1. перенесен шаг 5 из сессии по возврату депозитов. (отличие: при невыполнении условия на DM*X статус FAIL вместо MNG)
2. шаг 7 форм. PaymentInstruction: выпилил редактирование активов по обязательствам LM*T
3. шаг 7 форм. PaymentInstruction: пропускаем формирование если найден DM*X по обязательству
This commit is contained in:
ialbert 2023-06-30 15:45:12 +03:00
parent ef94bdc2fe
commit 19184c3a4a
3 changed files with 63 additions and 29 deletions

View file

@ -38,7 +38,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
private final ObligationAdmission obligationsAdmission;
private final InclusionObligations inclusionObligations;
private final InspectionObligations inspectionObligations;
private final InspectionObligationsDepositReturn inspectionObligations;
private final FormingRegistersOnOS formingRegistersOnOS;
private final FormingPaymentInstructionReturnMkr formingPaymentInstructionReturn;
private final FormingPaymentInstructionDealsFinalMkr formingPaymentInstructionDeals;
@ -64,7 +64,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
FinishingSession finishingSession,
EndStageNotification endStageNotification,
IMessageResolver messageResolver,
InspectionObligations inspectionObligations,
InspectionObligationsDepositReturn inspectionObligations,
@Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) {
super(imdgProvider, messageResolver);
this.balanceRevise = balanceRevise;

View file

@ -99,32 +99,32 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
.toList();
log.debug("LM*T and CM*T size = {}", rgsAll.size());
List<Registry> obligationsByMoney = rgsAll.stream()
.filter(registry -> equalsByRegistry(LM_T, registry))
.toList();
log.debug("changing assets by LM*T");
// List<Registry> obligationsByMoney = rgsAll.stream()
// .filter(registry -> equalsByRegistry(LM_T, registry))
// .toList();
//
// log.debug("changing assets by LM*T");
//изменяем активы по обязательствам по деньгам (LM_T)
for (Registry obligationByMoney : obligationsByMoney) {
String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
obligationByMoney.getTradingClearingRegistryId(), obligationByMoney.getCompanyId());
Collection<Registry> relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
log.trace("found {} related registries (by tcrId&companyId) for LM*T.id={}",
relatedRegistries.size(),
obligationByMoney.getId());
for (Registry relatedRegistry : relatedRegistries) {
if (equalsByRegistry(AM_F, relatedRegistry)) {
relatedRegistry.setBalance(safeBD(relatedRegistry.getBalance()).subtract(safeBD(obligationByMoney.getBalance())));
} else if (equalsByRegistry(AM_T, relatedRegistry)) {
relatedRegistry.setSettledDebit(safeBD(relatedRegistry.getSettledDebit()).add(safeBD(obligationByMoney.getBalance())));
} else if (equalsByRegistry(AM_B, relatedRegistry)) {
relatedRegistry.setBalance(safeBD(relatedRegistry.getBalance()).add(safeBD(obligationByMoney.getBalance())));
}
log.trace("updated related registry.id={} for LM*T.id={}", relatedRegistry.getId(), obligationByMoney.getId());
registryImdg.update(relatedRegistry);
}
}
// for (Registry obligationByMoney : obligationsByMoney) {
// String sql = String.format("tradingClearingRegistryId = %s and companyId = %s",
// obligationByMoney.getTradingClearingRegistryId(), obligationByMoney.getCompanyId());
// Collection<Registry> relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql);
// log.trace("found {} related registries (by tcrId&companyId) for LM*T.id={}",
// relatedRegistries.size(),
// obligationByMoney.getId());
//
// for (Registry relatedRegistry : relatedRegistries) {
// if (equalsByRegistry(AM_F, relatedRegistry)) {
// relatedRegistry.setBalance(safeBD(relatedRegistry.getBalance()).subtract(safeBD(obligationByMoney.getBalance())));
// } else if (equalsByRegistry(AM_T, relatedRegistry)) {
// relatedRegistry.setSettledDebit(safeBD(relatedRegistry.getSettledDebit()).add(safeBD(obligationByMoney.getBalance())));
// } else if (equalsByRegistry(AM_B, relatedRegistry)) {
// relatedRegistry.setBalance(safeBD(relatedRegistry.getBalance()).add(safeBD(obligationByMoney.getBalance())));
// }
// log.trace("updated related registry.id={} for LM*T.id={}", relatedRegistry.getId(), obligationByMoney.getId());
// registryImdg.update(relatedRegistry);
// }
// }
log.debug("changing assets by CM*T");
List<Registry> requirementsByMoney = rgsAll.stream()
.filter(registry -> equalsByRegistry(CM_T, registry))
@ -149,9 +149,19 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
List<Registry> allLiabilities = rgsAll
.stream()
.filter(registry -> RegistryDesignation.L.equalsByKey(registry.getRegistryDesignation()))
.filter(obligation -> {
Optional<Registry> dmx = searchDmx(obligation);
if (dmx.isPresent()) {
log.debug("LM*T#id={}, DM*X#id={} found, no action needed for group {}, skipping liability",
obligation.getId(),
obligation.getId(),
obligation.getGroupId());
}
return dmx.isEmpty();
})
.toList();
//todo сортировка if needed
for (int i = 0; i < allLiabilities.size(); i++) {
//сортировка чтобы найти сделки с одинаковыми направлениями и адресатами и схлопнуть в одну
Registry lm_t = allLiabilities.get(i);
if (lm_t == null) continue;
LinkedList<Registry> relatedRegistries = new LinkedList<>();
@ -194,6 +204,17 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
return stageResult;
}
/**
* fixme duplicate
*/
private Optional<Registry> searchDmx(Registry rgs) {
String sqlCondition = String.format("(%s) and companyId = %d",
RegistryCodeSqlBuilder.getInstance(DM_X).build(),
rgs.getCounterPartyId());
Registry dmx = registryImdg.getSingleObjectBySQL(sqlCondition);
return Optional.ofNullable(dmx);
}
private void sendSdfs(List<PaymentInstruction> formedPaymentInstructions) {
List<SDf03> sDf03Created = new ArrayList<>();
List<SDf12> sDf12Created = new ArrayList<>();

View file

@ -29,6 +29,7 @@ import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
public class InspectionObligationsDepositReturn implements ISessionStage {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> registryImdg;
private SessionType sessionType;
private final static RegistryTradingParams OS_T;
private final static RegistryTradingParams OM_T;
@ -122,7 +123,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
if (dmxBalance.compareTo(omtBalance) >= 0) {
group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK));
} else {
group.forEach(rgs -> updateStatus(rgs, RegistryStatus.MNG));
group.forEach(rgs -> updateStatus(rgs, registryStatusForDmxCheckFailed()));
}
continue;
}
@ -236,4 +237,16 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
);
}
private RegistryStatus registryStatusForDmxCheckFailed() {
if (SessionType.FINL.equals(sessionType)) {
return RegistryStatus.FAIL;
} else {
return RegistryStatus.MNG;
}
}
public void setSessionType(SessionType sessionType) {
this.sessionType = sessionType;
}
}