создание PaymentInstruction при обработке сделок для итоговой сессии МКР - блокировка средств

This commit is contained in:
ialbert 2023-06-08 17:22:30 +03:00
parent af2c9fac0e
commit f759ce4d56

View file

@ -45,8 +45,8 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static ru.spcex.platform.enumeration.RegistryTradingParams.CM_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.LM_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@ -116,6 +116,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
private StageResult<?> formingPaymentInstructions(Long sessionId, Collection<PaymentInstruction> paymentInstructionReturns) {
Collection<Registry> registries = selectRegistries();
log.debug("found registries.size() = {}", registries.size());
//клиринговый счет, через который будут проводиться сделки
Account tranAcc = accountImdg.getSingleObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'"
.formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey()));
if (tranAcc == null) {
@ -124,6 +125,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
false);
}
log.debug("found tranAcc.id = {}", tranAcc.getId());
//группируем регистры по groupId
Map<Long, List<Registry>> groups = registries
.stream()
.collect(Collectors.groupingBy(Registry::getGroupId));
@ -136,20 +138,54 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
.filter(rgs -> equalsByRegistry(rgsCode, rgs))
.findFirst()
.orElse(null);
Registry rgsCmt = findByCode.apply(CM_T);
Registry rgsLmt = findByCode.apply(LM_T);
if (rgsCmt == null || rgsLmt == null) {
log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, rgsCmt, rgsLmt);
//интересуют обязательства и требования по деньгам
Registry cm_t = findByCode.apply(CM_T);
Registry lm_t = findByCode.apply(LM_T);
if (cm_t == null || lm_t == null) {
log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, cm_t, lm_t);
continue;
}
{
//изменение активов - блокируем средства беред отправкой sdf'ов
Optional<Registry> amfO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_F);
Optional<Registry> payerAmtO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_T);
Optional<Registry> ambO = findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_B);
Optional<Registry> receiverAmtO = findRelatedAsset(cm_t.getTradingClearingRegistryId(), cm_t.getCompanyId(), AM_B);
log.debug("changing A* registers based on LM_T {} and CM_T {} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}",
lm_t.getId(),
cm_t.getId(),
amfO.map(Registry::getId).orElse(null),
payerAmtO.map(Registry::getId).orElse(null),
ambO.map(Registry::getId).orElse(null),
receiverAmtO.map(Registry::getId).orElse(null)
);
Instant now = Instant.now();
amfO.ifPresent(amf -> {
amf.setBalance(safeBD(amf.getBalance()).subtract(safeBD(lm_t.getBalance())));
setUpdatedStoreInImdg(amf, now);
});
payerAmtO.ifPresent(amt -> {
amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(lm_t.getBalance())));
setUpdatedStoreInImdg(amt, now);
});
ambO.ifPresent(amb -> {
amb.setBalance(safeBD(amb.getBalance()).add(safeBD(lm_t.getBalance())));
setUpdatedStoreInImdg(amb, now);
});
receiverAmtO.ifPresent(amt -> {
// у отправителя и получателя одинаково, см. в FormingPaymentInstruction
amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(lm_t.getBalance())));
setUpdatedStoreInImdg(amt, now);
});
}
log.trace("generating payment instruction for groupId {} cmt_t {} lm_t {}",
groupId,
rgsCmt.getId(),
rgsLmt.getId());
cm_t.getId(),
lm_t.getId());
Pair<PaymentInstruction, PaymentInstruction> pmtInstrs = PaymentInstructionBuilderFinalMkrDeals
.builder(imdgProvider)
.cm_t(rgsCmt)
.lm_t(rgsLmt)
.cm_t(cm_t)
.lm_t(lm_t)
.tranAcc(tranAcc)
.sessionId(sessionId)
.build();
@ -173,6 +209,23 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
return stageResult;
}
private void setUpdatedStoreInImdg(Registry rgs, Instant now) {
rgs.setUpdated(now);
registryImdg.update(rgs);
}
private Optional<Registry> findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) {
ImdgPredicateBuilder rgsPrdBldr = registryImdg.predicateBuilder();
RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(rgsCode);
ImdgPredicate assetCondition = rgsPrdBldr.and(
rgsPrdBldr.equals("tradingClearingRegistryId", tradingClearingRegistryId),
rgsPrdBldr.equals("companyId", companyId),
rgsPrdBldr.sql(codeSql.build())
);
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(assetCondition));
}
private void sendSdfs(List<PaymentInstruction> formedPaymentInstructions) {
List<SDf03> sDf03Created = new ArrayList<>();
for (PaymentInstruction paymentInstruction : formedPaymentInstructions) {