создание PaymentInstruction при обработке сделок для итоговой сессии МКР - блокировка средств
This commit is contained in:
parent
af2c9fac0e
commit
f759ce4d56
1 changed files with 63 additions and 10 deletions
|
|
@ -45,8 +45,8 @@ import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.CM_T;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.LM_T;
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
|
@ -116,6 +116,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
|
||||||
private StageResult<?> formingPaymentInstructions(Long sessionId, Collection<PaymentInstruction> paymentInstructionReturns) {
|
private StageResult<?> formingPaymentInstructions(Long sessionId, Collection<PaymentInstruction> paymentInstructionReturns) {
|
||||||
Collection<Registry> registries = selectRegistries();
|
Collection<Registry> registries = selectRegistries();
|
||||||
log.debug("found registries.size() = {}", registries.size());
|
log.debug("found registries.size() = {}", registries.size());
|
||||||
|
//клиринговый счет, через который будут проводиться сделки
|
||||||
Account tranAcc = accountImdg.getSingleObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'"
|
Account tranAcc = accountImdg.getSingleObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'"
|
||||||
.formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey()));
|
.formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey()));
|
||||||
if (tranAcc == null) {
|
if (tranAcc == null) {
|
||||||
|
|
@ -124,6 +125,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
log.debug("found tranAcc.id = {}", tranAcc.getId());
|
log.debug("found tranAcc.id = {}", tranAcc.getId());
|
||||||
|
//группируем регистры по groupId
|
||||||
Map<Long, List<Registry>> groups = registries
|
Map<Long, List<Registry>> groups = registries
|
||||||
.stream()
|
.stream()
|
||||||
.collect(Collectors.groupingBy(Registry::getGroupId));
|
.collect(Collectors.groupingBy(Registry::getGroupId));
|
||||||
|
|
@ -136,20 +138,54 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
|
||||||
.filter(rgs -> equalsByRegistry(rgsCode, rgs))
|
.filter(rgs -> equalsByRegistry(rgsCode, rgs))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
Registry rgsCmt = findByCode.apply(CM_T);
|
//интересуют обязательства и требования по деньгам
|
||||||
Registry rgsLmt = findByCode.apply(LM_T);
|
Registry cm_t = findByCode.apply(CM_T);
|
||||||
if (rgsCmt == null || rgsLmt == null) {
|
Registry lm_t = findByCode.apply(LM_T);
|
||||||
log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, rgsCmt, rgsLmt);
|
if (cm_t == null || lm_t == null) {
|
||||||
|
log.error("groupId {} cmt_t {} lm_t {} - both must be present", groupId, cm_t, lm_t);
|
||||||
continue;
|
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 {}",
|
log.trace("generating payment instruction for groupId {} cmt_t {} lm_t {}",
|
||||||
groupId,
|
groupId,
|
||||||
rgsCmt.getId(),
|
cm_t.getId(),
|
||||||
rgsLmt.getId());
|
lm_t.getId());
|
||||||
Pair<PaymentInstruction, PaymentInstruction> pmtInstrs = PaymentInstructionBuilderFinalMkrDeals
|
Pair<PaymentInstruction, PaymentInstruction> pmtInstrs = PaymentInstructionBuilderFinalMkrDeals
|
||||||
.builder(imdgProvider)
|
.builder(imdgProvider)
|
||||||
.cm_t(rgsCmt)
|
.cm_t(cm_t)
|
||||||
.lm_t(rgsLmt)
|
.lm_t(lm_t)
|
||||||
.tranAcc(tranAcc)
|
.tranAcc(tranAcc)
|
||||||
.sessionId(sessionId)
|
.sessionId(sessionId)
|
||||||
.build();
|
.build();
|
||||||
|
|
@ -173,6 +209,23 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
|
||||||
return stageResult;
|
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) {
|
private void sendSdfs(List<PaymentInstruction> formedPaymentInstructions) {
|
||||||
List<SDf03> sDf03Created = new ArrayList<>();
|
List<SDf03> sDf03Created = new ArrayList<>();
|
||||||
for (PaymentInstruction paymentInstruction : formedPaymentInstructions) {
|
for (PaymentInstruction paymentInstruction : formedPaymentInstructions) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue