forming payment instruction refactoring: common registry searches

This commit is contained in:
ialbert 2023-07-12 16:17:23 +03:00
parent e184c68be2
commit 2d37a2ec95
6 changed files with 118 additions and 232 deletions

View file

@ -0,0 +1,73 @@
package ru.spcex.clearing.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryAssetPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryDm_tClrnPredicate;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.util.Optional;
import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_X;
@Component
public class RegistryManager {
private final Imdg<Registry> rgsImdg;
@Autowired
public RegistryManager(ImdgProvider imdgProvider) {
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
public Optional<Registry> searchDmx(Registry rgs) {
String sqlCondition = String.format("(%s) and companyId = %d",
RegistryCodeSqlBuilder.getInstance(DM_X).build(),
rgs.getCounterPartyId());
Registry dmx = rgsImdg.getFirstObjectBySQL(sqlCondition);
return Optional.ofNullable(dmx);
}
public Optional<Registry> searchDmtInfo(Registry rgs) {
String sqlCondition = String.format("(%s) and accountType='%s' and companyId = %d and counterPartyId = %d",
RegistryCodeSqlBuilder.getInstance(DM_T).build(),
AccountType.Info.getKey(),
rgs.getCompanyId(),
rgs.getCounterPartyId());
Registry dmt = rgsImdg.getFirstObjectBySQL(sqlCondition);
return Optional.ofNullable(dmt);
}
public Optional<Registry> searchDmtClrn(Registry rgs) {
ImdgPredicate dmtClrnPrdct = RegistryDm_tClrnPredicate
.instance(rgs.getCompanyId(), rgs.getCounterPartyId())
.apply(rgsImdg);
Registry dmt = rgsImdg.getSingleObjectByPredicate(dmtClrnPrdct);
return Optional.ofNullable(dmt);
}
public Optional<Registry> findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) {
ImdgPredicate prdct = RegistryAssetPredicate
.instance(tradingClearingRegistryId, companyId, rgsCode)
.apply(rgsImdg);
return Optional.ofNullable(rgsImdg.getSingleObjectByPredicate(prdct));
}
public static boolean equalsByCode(RegistryTradingParams code, Registry rgs) {
return code.equalByRegistry(
IEnumKey.getEnumByKey(RegistryDesignation.class, rgs.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()),
IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()),
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
);
}
}

View file

@ -38,7 +38,6 @@ import ru.spcex.platform.utils.number.BigDecimalUtil;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -353,7 +352,4 @@ public class FormingPaymentInstruction implements ISessionStage {
private BigDecimal safeBD(BigDecimal value) {
return value != null ? value : BigDecimal.ZERO;
}
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
}

View file

@ -19,6 +19,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.Sdf03Creator;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilderFinalMkrDeals;
import ru.spcex.clearing.session.stage.ISessionStage;
@ -31,7 +32,6 @@ import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryAssetPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
@ -42,7 +42,6 @@ import ru.spcex.platform.utils.number.BigDecimalUtil;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -68,10 +67,11 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
private final Sdf03Creator sdf03Creator;
private KafkaSender kafkaSender;
private final IMessageResolver msgResolver = new SimpleMessageResolver();
private final RegistryManager rgsMng;
@Autowired
public FormingPaymentInstructionDealsFinalMkr(ImdgProvider imdgProvider,
Sdf03Creator sdf03Creator, KafkaSender kafkaSender) {
Sdf03Creator sdf03Creator, KafkaSender kafkaSender, RegistryManager rgsMng) {
this.sdf03Creator = sdf03Creator;
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
@ -83,6 +83,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
this.sDf03Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf03, SDf03.class);
this.sDf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.rgsMng = rgsMng;
}
@Override
@ -145,7 +146,7 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
Long groupId = group.getKey();
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
.stream()
.filter(rgs -> equalsByRegistry(rgsCode, rgs))
.filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs))
.findFirst()
.orElse(null);
//интересуют обязательства и требования по деньгам
@ -157,10 +158,10 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
}
{
//изменение активов - блокируем средства беред отправкой 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);
Optional<Registry> amfO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_F);
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_T);
Optional<Registry> ambO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_B);
Optional<Registry> receiverAmtO = rgsMng.findRelatedAsset(cm_t.getTradingClearingRegistryId(), cm_t.getCompanyId(), AM_B);
log.debug("changing A* registers based on LM_T.id={} and CM_T.id={} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}",
lm_t.getId(),
cm_t.getId(),
@ -230,13 +231,6 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
registryImdg.update(rgs);
}
private Optional<Registry> findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) {
ImdgPredicate prdct = RegistryAssetPredicate
.instance(tradingClearingRegistryId, companyId, rgsCode)
.apply(registryImdg);
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(prdct));
}
private void sendSdfs(List<PaymentInstruction> formedPaymentInstructions) {
List<SDf03> sDf03Created = new ArrayList<>();
List<SDf12> sDf12Created = new ArrayList<>();
@ -306,16 +300,4 @@ public class FormingPaymentInstructionDealsFinalMkr implements ISessionStage {
sDf12.setGenerationTime(Instant.now());
return sDf12;
}
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
private static boolean equalsByRegistry(RegistryTradingParams code, Registry rgs) {
return code.equalByRegistry(
IEnumKey.getEnumByKey(RegistryDesignation.class, rgs.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()),
IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()),
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
);
}
}

View file

@ -18,6 +18,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.Sdf03Creator;
import ru.spcex.clearing.service.SpecifUtil;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilder;
@ -26,14 +27,13 @@ import ru.spcex.clearing.session.stage.ISessionStage;
import ru.spcex.clearing.session.stage.StageResult;
import ru.spcex.clearing.session.stage.Task;
import ru.spcex.clearing.session.stage.task.FormingPaymentInstructionPayload;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryAssetPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryDm_tClrnPredicate;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
@ -45,8 +45,7 @@ import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_B;
import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service
@ -64,75 +63,11 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
private final Imdg<SDf12> sDf12Imdg;
private final KafkaSender kafkaSender;
private final Sdf03Creator sdf03Creator;
private final static RegistryTradingParams OS_T;
private final static RegistryTradingParams OM_T;
private final static RegistryTradingParams TS_T;
private final static RegistryTradingParams TM_T;
private final static RegistryTradingParams DM_X;
private final static RegistryTradingParams DM_T;
private final static RegistryTradingParams AM_F;
private final static RegistryTradingParams CM_T;
private final static RegistryTradingParams LM_T;
private final static RegistryTradingParams CS_T;
private final static RegistryTradingParams LS_T;
static {
OS_T = new RegistryTradingParams(RegistryDesignation.O,
RegistryInstrumentType.S,
null,
RegistryUnit.T);
OM_T = new RegistryTradingParams(RegistryDesignation.O,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
TS_T = new RegistryTradingParams(RegistryDesignation.T,
RegistryInstrumentType.S,
null,
RegistryUnit.T);
TM_T = new RegistryTradingParams(RegistryDesignation.T,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
DM_X = new RegistryTradingParams(RegistryDesignation.D,
RegistryInstrumentType.M,
null,
RegistryUnit.X);
DM_T = new RegistryTradingParams(RegistryDesignation.D,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
AM_F = new RegistryTradingParams(RegistryDesignation.A,
RegistryInstrumentType.M,
null,
RegistryUnit.F);
CM_T = new RegistryTradingParams(RegistryDesignation.C,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
LM_T = new RegistryTradingParams(RegistryDesignation.L,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
CS_T = new RegistryTradingParams(RegistryDesignation.C,
RegistryInstrumentType.S,
null,
RegistryUnit.T);
LS_T = new RegistryTradingParams(RegistryDesignation.L,
RegistryInstrumentType.S,
null,
RegistryUnit.T);
}
private final RegistryManager rgsMng;
@Autowired
public FormingPaymentInstructionDepositReturn(ImdgProvider imdgProvider,
KafkaSender kafkaSender, Sdf03Creator sdf03Creator) {
KafkaSender kafkaSender, Sdf03Creator sdf03Creator, RegistryManager rgsMng) {
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
@ -144,6 +79,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
this.sDf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.sdf03Creator = sdf03Creator;
this.rgsMng = rgsMng;
}
@Override
@ -181,22 +117,22 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
ArrayList<PaymentInstruction> pmtCreated = new ArrayList<>();
for (Map.Entry<Long, List<Registry>> entry : registriesByGroup.entrySet()) {
List<Registry> groupRgs = entry.getValue();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> equalByRgs(LM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> equalByRgs(CM_T, rgs)).findFirst();
Optional<Registry> lmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(LM_T, rgs)).findFirst();
Optional<Registry> cmtO = groupRgs.stream().filter(rgs -> RegistryManager.equalsByCode(CM_T, rgs)).findFirst();
if (lmtO.isEmpty() || cmtO.isEmpty()) {
log.error("LM*T or CM*T not found for group {}", entry.getKey());
continue;
}
Registry lm_t = lmtO.get(); //obligation by money
Registry cm_t = cmtO.get();
Optional<Registry> dmx = searchDmx(lm_t);
Optional<Registry> dmx = rgsMng.searchDmx(lm_t);
if (dmx.isPresent()) {
log.debug("LM*T#id={}, DM*X#id={} found, no action needed for group {}, skipping liability",
lm_t.getId(), dmx.get().getId(), lm_t.getGroupId());
continue;
}
Optional<Registry> dmtInfo = searchDmtInfo(lm_t);
Optional<Registry> dmtInfo = rgsMng.searchDmtInfo(lm_t);
if (dmtInfo.isPresent()) {
BigDecimal balance = safeBD(lm_t.getBalance()).add(safeBD(cm_t.getBalance())); //fixme????
PaymentInstruction payInstr = createPaymentInstruction(List.of(lm_t, cm_t), balance, sessionId);
@ -206,7 +142,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
continue;
}
Optional<Registry> dmtClnr = searchDmtClrn(lm_t);
Optional<Registry> dmtClnr = rgsMng.searchDmtClrn(lm_t);
if (dmtClnr.isPresent()) {
Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'"
.formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey()));
@ -217,10 +153,10 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
}
{
//изменение активов - блокируем средства беред отправкой 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);
Optional<Registry> amfO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_F);
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_T);
Optional<Registry> ambO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_B);
Optional<Registry> receiverAmtO = rgsMng.findRelatedAsset(cm_t.getTradingClearingRegistryId(), cm_t.getCompanyId(), AM_B);
log.debug("changing A* registers based on LM_T.id={} and CM_T.id={} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}",
lm_t.getId(),
cm_t.getId(),
@ -270,51 +206,6 @@ public class FormingPaymentInstructionDepositReturn 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.getFirstObjectBySQL(sqlCondition);
return Optional.ofNullable(dmx);
}
/**
* fixme duplicate
* Если УК зачисляет средства на свой регистр на КС
*/
private Optional<Registry> searchDmtInfo(Registry rgs) {
String sqlCondition = String.format("(%s) and accountType='%s' and companyId = %d and counterPartyId = %d",
RegistryCodeSqlBuilder.getInstance(DM_T).build(),
AccountType.Info.getKey(),
rgs.getCompanyId(),
rgs.getCounterPartyId());
Registry dmt = registryImdg.getFirstObjectBySQL(sqlCondition);
return Optional.ofNullable(dmt);
}
/**
* fixme duplicate
* Если УК зачисляет средства на свой ТБС
*/
private Optional<Registry> searchDmtClrn(Registry rgs) {
ImdgPredicate dmtClrnPrdct = RegistryDm_tClrnPredicate
.instance(rgs.getCompanyId(), rgs.getCounterPartyId())
.apply(registryImdg);
Registry dmt = registryImdg.getSingleObjectByPredicate(dmtClrnPrdct);
return Optional.ofNullable(dmt);
}
private Optional<Registry> findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) {
ImdgPredicate prdct = RegistryAssetPredicate
.instance(tradingClearingRegistryId, companyId, rgsCode)
.apply(registryImdg);
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(prdct));
}
private void setUpdatedStoreInImdg(Registry rgs, Instant now) {
rgs.setUpdated(now);
registryImdg.update(rgs);
@ -426,14 +317,4 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage {
}
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
private static boolean equalByRgs(RegistryTradingParams rgsParams, Registry rgs) {
return rgsParams.equalByRegistry(
IEnumKey.getEnumByKey(RegistryDesignation.class, rgs.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()),
IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()),
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
);
}
}

View file

@ -19,6 +19,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.SpecifUtil;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilder;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilderFinalMkrDeals;
@ -32,9 +33,7 @@ import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryAssetPredicate;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryDm_tClrnPredicate;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
@ -64,10 +63,11 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
private Imdg<SDf03> sDf03Imdg;
private Imdg<SDf12> sDf12Imdg;
private KafkaSender kafkaSender;
private final RegistryManager rgsMng;
@Autowired
public FormingPaymentInstructionReturnMkr(ImdgProvider imdgProvider,
KafkaSender kafkaSender) {
KafkaSender kafkaSender, RegistryManager rgsMng) {
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
@ -78,6 +78,7 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
this.sDf03Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf03, SDf03.class);
this.sDf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.rgsMng = rgsMng;
}
@Override
@ -141,13 +142,13 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
}
Registry lm_t = lmtO.get(); //obligation by money
Registry cm_t = cmtO.get();
Optional<Registry> dmx = searchDmx(lm_t);
Optional<Registry> dmx = rgsMng.searchDmx(lm_t);
if (dmx.isPresent()) {
log.debug("LM*T#id={}, DM*X#id={} found, no action needed for group {}, skipping liability",
lm_t.getId(), dmx.get().getId(), lm_t.getGroupId());
continue;
}
Optional<Registry> dmtClnr = searchDmtClrn(lm_t);
Optional<Registry> dmtClnr = rgsMng.searchDmtClrn(lm_t);
if (dmtClnr.isPresent()) {
Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'"
.formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey()));
@ -158,10 +159,10 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage {
}
{
//изменение активов - блокируем средства беред отправкой 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);
Optional<Registry> amfO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_F);
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_T);
Optional<Registry> ambO = rgsMng.findRelatedAsset(lm_t.getTradingClearingRegistryId(), lm_t.getCompanyId(), AM_B);
Optional<Registry> receiverAmtO = rgsMng.findRelatedAsset(cm_t.getTradingClearingRegistryId(), cm_t.getCompanyId(), AM_B);
log.debug("changing A* registers based on LM_T.id={} and CM_T.id={} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}",
lm_t.getId(),
cm_t.getId(),
@ -209,32 +210,6 @@ 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.getFirstObjectBySQL(sqlCondition);
return Optional.ofNullable(dmx);
}
private Optional<Registry> searchDmtClrn(Registry rgs) {
ImdgPredicate dmtClrnPrdct = RegistryDm_tClrnPredicate
.instance(rgs.getCompanyId(), rgs.getCounterPartyId())
.apply(registryImdg);
Registry dmt = registryImdg.getSingleObjectByPredicate(dmtClrnPrdct);
return Optional.ofNullable(dmt);
}
private Optional<Registry> findRelatedAsset(Long tradingClearingRegistryId, Long companyId, RegistryTradingParams rgsCode) {
ImdgPredicate prdct = RegistryAssetPredicate
.instance(tradingClearingRegistryId, companyId, rgsCode)
.apply(registryImdg);
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(prdct));
}
private void setUpdatedStoreInImdg(Registry rgs, Instant now) {
rgs.setUpdated(now);
registryImdg.update(rgs);

View file

@ -19,6 +19,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.Sdf03Creator;
import ru.spcex.clearing.service.builder.PaymentInstructionBuilderFinalMkrDeals;
import ru.spcex.clearing.session.stage.ISessionStage;
@ -41,7 +42,6 @@ import ru.spcex.platform.utils.number.BigDecimalUtil;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -67,10 +67,11 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
private KafkaSender kafkaSender;
private final Sdf03Creator sdf03Creator;
private final IMessageResolver msgResolver = new SimpleMessageResolver();
private final RegistryManager rgsMng;
@Autowired
public FormingPaymentInstructionSecondaryT0(ImdgProvider imdgProvider,
KafkaSender kafkaSender, Sdf03Creator sdf03Creator) {
KafkaSender kafkaSender, Sdf03Creator sdf03Creator, RegistryManager rgsMng) {
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
@ -82,6 +83,7 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
this.sDf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.sdf03Creator = sdf03Creator;
this.rgsMng = rgsMng;
}
@Override
@ -142,7 +144,7 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
Long groupId = group.getKey();
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
.stream()
.filter(rgs -> equalsByRegistry(rgsCode, rgs))
.filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs))
.findFirst()
.orElse(null);
//интересуют обязательства и требования по деньгам
@ -154,10 +156,10 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
}
{
//изменение активов - блокируем средства беред отправкой sdf'ов
Optional<Registry> amfO = findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_F);
Optional<Registry> payerAmtO = findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_T);
Optional<Registry> ambO = findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_B);
Optional<Registry> receiverAmtO = findRelatedAsset(cs_t.getTradingClearingRegistryId(), cs_t.getCompanyId(), AS_B);
Optional<Registry> amfO = rgsMng.findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_F);
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_T);
Optional<Registry> ambO = rgsMng.findRelatedAsset(ls_t.getTradingClearingRegistryId(), ls_t.getCompanyId(), AS_B);
Optional<Registry> receiverAmtO = rgsMng.findRelatedAsset(cs_t.getTradingClearingRegistryId(), cs_t.getCompanyId(), AS_B);
log.debug("changing A* registers based on LM_T.id={} and CM_T.id={} found AM*F.id={}, AM*T.id={}, AM*B.id={}, AM*B.id={}",
ls_t.getId(),
cs_t.getId(),
@ -223,17 +225,6 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
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<>();
List<SDf12> sDf12Created = new ArrayList<>();
@ -302,16 +293,4 @@ public class FormingPaymentInstructionSecondaryT0 implements ISessionStage {
sDf12.setGenerationTime(Instant.now());
return sDf12;
}
DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
private static boolean equalsByRegistry(RegistryTradingParams code, Registry rgs) {
return code.equalByRegistry(
IEnumKey.getEnumByKey(RegistryDesignation.class, rgs.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType()),
IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()),
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
);
}
}