TradingClearingRegistryList -> Registry

This commit is contained in:
ialbert 2024-05-02 15:57:32 +03:00
parent d1c9227b58
commit 1ff7fb4b23
4 changed files with 75 additions and 19 deletions

View file

@ -25,7 +25,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryByTCRListRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
@ -131,6 +131,10 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
} }
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator); requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(userRequest
.getRequestPayload()
.getTradingClearingRegistryId());
if (requestInfoUpdate != null) { if (requestInfoUpdate != null) {
return requestInfoUpdate; return requestInfoUpdate;
} }
@ -165,7 +169,6 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
if (!innerCall) { if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов. // Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
try { try {
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest(); ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
cCodeReq.setDepoAccountId(tcr.getDepoAccountId()); cCodeReq.setDepoAccountId(tcr.getDepoAccountId());
@ -187,7 +190,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
} }
sendNotificationToClearingSvc(newIds); sendNotificationToClearingSvc(newIds, tcr);
log.debug("successfully processed, id {}", newIds); log.debug("successfully processed, id {}", newIds);
return null; return null;
@ -207,6 +210,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
} }
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload(); TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
Account account = accountImdg.getSingleObjectByID(req.getAccountId()); Account account = accountImdg.getSingleObjectByID(req.getAccountId());
Instant now = Instant.now(); Instant now = Instant.now();
@ -253,7 +257,8 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
} }
sendNotificationToClearingSvc(id);
sendNotificationToClearingSvc(id, tcr);
log.debug("successfully processed, id {}", id); log.debug("successfully processed, id {}", id);
return null; return null;
@ -292,18 +297,20 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
@Deprecated @Deprecated
protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries) { protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries, TradingClearingRegistry tcr) {
for (Long tradingClearingRegistryId:tradingClearingRegistries) for (Long tradingClearingRegistryId:tradingClearingRegistries)
sendNotificationToClearingSvc(tradingClearingRegistryId); sendNotificationToClearingSvc(tradingClearingRegistryId, tcr);
} }
/** /**
* clearing-service сообщение на открытие клиринговых регистров; * clearing-service сообщение на открытие клиринговых регистров;
*/ */
protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId) { protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryByTCRListRequest request = new CreateRegistryByTCRListRequest(); CreateRegistryRequest request = new CreateRegistryRequest();
request.setTradingClearingRegistryListId(tradingClearingRegistryId); request.setTcrListId(tradingClearingRegistryId);
log.debug("Send message to kafka \"{}\": {}", Consts.DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW, LogFormatter.toStringWrapper(request)); request.setCompanyId(tcr.getCompanyId());
kafkaSender.sendRequestToQueue(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW, request); request.setTradingClearingRegistryId(tcr.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
} }

View file

@ -21,6 +21,7 @@ import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.notification.NotificationSender;
@ -70,8 +71,8 @@ import ru.spcex.platform.imdg.validation.Stored;
import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.validation.IValidator;
@Service @Service
public class RegistryService { public class RegistryService {
@ -79,6 +80,7 @@ public class RegistryService {
private final ImdgProvider imdgProvider; private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg; private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tcrListImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Account> accImdg; private final Imdg<Account> accImdg;
private final Imdg<Currency> currImdg; private final Imdg<Currency> currImdg;
@ -115,6 +117,7 @@ public class RegistryService {
AssetTBFProcessing assets) { AssetTBFProcessing assets) {
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.tcrListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
@ -165,13 +168,36 @@ public class RegistryService {
} }
public void updateRegistryIfNeeded(CreateRegistryRequest requestPayload) { public void updateRegistryIfNeeded(CreateRegistryRequest requestPayload) {
//RUB зашиты в регистр?
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(requestPayload.getTradingClearingRegistryId()); TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(requestPayload.getTradingClearingRegistryId());
var ref = new Object() {
TradingClearingRegistryList tcrList = null;
Currency currency = null;
};
if (requestPayload.getTcrListId() != null) {
ref.tcrList = tcrListImdg.getSingleObjectByID(requestPayload.getTcrListId());
if (ref.tcrList == null) {
log.error("TradingClearingRegistryList with id: {} not found", requestPayload.getTcrListId());
return;
}
ref.currency = currImdg.getFirstObjectByFieldValues(
Map.of("currencyCode", ref.tcrList.getCurrency())
);
if (ref.currency == null) {
log.error("currency with currencyCode: {} not found", ref.tcrList.getCurrency());
return;
}
}
if (tcr == null) { if (tcr == null) {
log.error("TradingClearingRegistry with id: {} not found", requestPayload.getTradingClearingRegistryId()); log.error("TradingClearingRegistry with id: {} not found", requestPayload.getTradingClearingRegistryId());
return; return;
} }
log.debug("TCR new event, TCR#id={}", tcr.getId()); log.debug("TCR new event, TCR#id={}", tcr.getId());
Optional<ImdgPredicate> registriesCondition = registsryPredicate(tcr.getCompanyId(), tcr.getMoneyAccountId(), tcr.getDepoAccountId()); Optional<ImdgPredicate> registriesCondition = registsryPredicate(tcr.getCompanyId(),
tcr.getMoneyAccountId(),
tcr.getDepoAccountId(),
ref.tcrList
);
if (registriesCondition.isEmpty()) { if (registriesCondition.isEmpty()) {
log.debug("TCR#id={} couldn't construct registry search condition", tcr.getId()); log.debug("TCR#id={} couldn't construct registry search condition", tcr.getId());
return; return;
@ -183,6 +209,10 @@ public class RegistryService {
rgs.setTradingClearingRegistryId(tcr.getId()); rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode()); rgs.setTradingClearingRegistry(tcr.getCode());
rgs.setRegistryCapacity(tcr.getTradingClearingRegistryType()); rgs.setRegistryCapacity(tcr.getTradingClearingRegistryType());
if (ref.tcrList != null) {
rgs.setSecurityId(ref.currency.getId());
rgs.setSecuritySymbol(ref.currency.getCurrencyCode());
}
rgs.setUpdated(Instant.now()); rgs.setUpdated(Instant.now());
registryImdg.update(rgs); registryImdg.update(rgs);
log.trace("TCR#id={} registry#id={} updated", tcr.getId(), rgs.getId()); log.trace("TCR#id={} registry#id={} updated", tcr.getId(), rgs.getId());
@ -201,8 +231,10 @@ public class RegistryService {
registries.size(), tcr.getId(), tcr.getMoneyAccountId()); registries.size(), tcr.getId(), tcr.getMoneyAccountId());
} }
Account acc = accImdg.getSingleObjectByID(tcr.getMoneyAccountId()); Account acc = ref.tcrList == null ? accImdg.getSingleObjectByID(tcr.getMoneyAccountId())
Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())); : accImdg.getSingleObjectByID(ref.tcrList.getAccountId());
Currency currency = ref.tcrList == null ? currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey()))
: ref.currency;
Company cmp = cmpImdg.getSingleObjectByID(tcr.getCompanyId()); Company cmp = cmpImdg.getSingleObjectByID(tcr.getCompanyId());
if (acc == null) { if (acc == null) {
@ -220,7 +252,7 @@ public class RegistryService {
log.debug("TCR#id={} account#id={} company#id={}, creating assets", tcr.getId(), acc.getId(), cmp.getId()); log.debug("TCR#id={} account#id={} company#id={}, creating assets", tcr.getId(), acc.getId(), cmp.getId());
AssetTrio assets = this.assets.createMAssets(acc, AssetTrio assets = this.assets.createMAssets(acc,
CurrencyCode.RUB.getKey(), currency.getCurrencyCode(),
currency.getId(), currency.getId(),
tcr.getTradingClearingRegistryType(), tcr.getTradingClearingRegistryType(),
tcr.getId(), tcr.getId(),
@ -425,13 +457,21 @@ public class RegistryService {
/** /**
* находим все регистры AM__/AS__ по пришедшему ТКР * находим все регистры AM__/AS__ по пришедшему ТКР
*/ */
private Optional<ImdgPredicate> registsryPredicate(Long companyId, Long moneyAccountId, Long depoAccountId) { private Optional<ImdgPredicate> registsryPredicate(Long companyId,
Long moneyAccountId,
Long depoAccountId, TradingClearingRegistryList tcrList) {
ImdgPredicateBuilder prdBldr = registryImdg.predicateBuilder(); ImdgPredicateBuilder prdBldr = registryImdg.predicateBuilder();
Function<RegistryTradingParams, String> sql = p -> RegistryCodeSqlBuilder.getInstance(p).build(); Function<RegistryTradingParams, String> sql = p -> RegistryCodeSqlBuilder.getInstance(p).build();
Optional<ImdgPredicate> moneyPredicate = Optional.ofNullable(moneyAccountId) Optional<ImdgPredicate> moneyPredicate = Optional.ofNullable(moneyAccountId)
.map(accId -> sql.apply(RegistryTradingParams.AM__)) .map(accId -> sql.apply(RegistryTradingParams.AM__))
.map(prdBldr::sql) .map(prdBldr::sql)
.map(codePredicate -> prdBldr.and(codePredicate, prdBldr.equals("accountId", moneyAccountId))); .map(codePredicate -> prdBldr.and(
codePredicate,
prdBldr.or(
prdBldr.equals("accountId", moneyAccountId),
tcrList != null ? prdBldr.equals("accountId", tcrList.getAccountId()) : prdBldr.alwaysFalse()
)
));
Optional<ImdgPredicate> depoPredicate = Optional.ofNullable(depoAccountId) Optional<ImdgPredicate> depoPredicate = Optional.ofNullable(depoAccountId)
.map(accId -> sql.apply(RegistryTradingParams.AS__)) .map(accId -> sql.apply(RegistryTradingParams.AS__))
.map(prdBldr::sql) .map(prdBldr::sql)

View file

@ -37,7 +37,6 @@
<dependency> <dependency>
<groupId>com.fasterxml.jackson.datatype</groupId> <groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId> <artifactId>jackson-datatype-jsr310</artifactId>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.spcex.platform</groupId> <groupId>ru.spcex.platform</groupId>

View file

@ -7,6 +7,16 @@ public class CreateRegistryRequest {
private Long companyId; private Long companyId;
@JsonProperty @JsonProperty
private Long tradingClearingRegistryId; private Long tradingClearingRegistryId;
@JsonProperty
private Long tcrListId;
public Long getTcrListId() {
return tcrListId;
}
public void setTcrListId(Long tcrListId) {
this.tcrListId = tcrListId;
}
public Long getCompanyId() { public Long getCompanyId() {
return companyId; return companyId;