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.Consts;
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.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
@ -131,6 +131,10 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(userRequest
.getRequestPayload()
.getTradingClearingRegistryId());
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
@ -165,7 +169,6 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
try {
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
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);
return null;
@ -207,6 +210,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
}
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
Account account = accountImdg.getSingleObjectByID(req.getAccountId());
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);
return null;
@ -292,18 +297,20 @@ public class TradingClearingRegistryListService extends QueueConsumer implements
@Deprecated
protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries) {
protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries, TradingClearingRegistry tcr) {
for (Long tradingClearingRegistryId:tradingClearingRegistries)
sendNotificationToClearingSvc(tradingClearingRegistryId);
sendNotificationToClearingSvc(tradingClearingRegistryId, tcr);
}
/**
* clearing-service сообщение на открытие клиринговых регистров;
*/
protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId) {
CreateRegistryByTCRListRequest request = new CreateRegistryByTCRListRequest();
request.setTradingClearingRegistryListId(tradingClearingRegistryId);
log.debug("Send message to kafka \"{}\": {}", Consts.DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW, request);
protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setTcrListId(tradingClearingRegistryId);
request.setCompanyId(tcr.getCompanyId());
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.registry.Registry;
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.imdg.IMDGDistributedNames;
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.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class RegistryService {
@ -79,6 +80,7 @@ public class RegistryService {
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tcrListImdg;
private final Imdg<Registry> registryImdg;
private final Imdg<Account> accImdg;
private final Imdg<Currency> currImdg;
@ -115,6 +117,7 @@ public class RegistryService {
AssetTBFProcessing assets) {
this.imdgProvider = imdgProvider;
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.pmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
this.accImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
@ -165,13 +168,36 @@ public class RegistryService {
}
public void updateRegistryIfNeeded(CreateRegistryRequest requestPayload) {
//RUB зашиты в регистр?
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) {
log.error("TradingClearingRegistry with id: {} not found", requestPayload.getTradingClearingRegistryId());
return;
}
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()) {
log.debug("TCR#id={} couldn't construct registry search condition", tcr.getId());
return;
@ -183,6 +209,10 @@ public class RegistryService {
rgs.setTradingClearingRegistryId(tcr.getId());
rgs.setTradingClearingRegistry(tcr.getCode());
rgs.setRegistryCapacity(tcr.getTradingClearingRegistryType());
if (ref.tcrList != null) {
rgs.setSecurityId(ref.currency.getId());
rgs.setSecuritySymbol(ref.currency.getCurrencyCode());
}
rgs.setUpdated(Instant.now());
registryImdg.update(rgs);
log.trace("TCR#id={} registry#id={} updated", tcr.getId(), rgs.getId());
@ -201,8 +231,10 @@ public class RegistryService {
registries.size(), tcr.getId(), tcr.getMoneyAccountId());
}
Account acc = accImdg.getSingleObjectByID(tcr.getMoneyAccountId());
Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey()));
Account acc = ref.tcrList == null ? accImdg.getSingleObjectByID(tcr.getMoneyAccountId())
: 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());
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());
AssetTrio assets = this.assets.createMAssets(acc,
CurrencyCode.RUB.getKey(),
currency.getCurrencyCode(),
currency.getId(),
tcr.getTradingClearingRegistryType(),
tcr.getId(),
@ -425,13 +457,21 @@ public class RegistryService {
/**
* находим все регистры 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();
Function<RegistryTradingParams, String> sql = p -> RegistryCodeSqlBuilder.getInstance(p).build();
Optional<ImdgPredicate> moneyPredicate = Optional.ofNullable(moneyAccountId)
.map(accId -> sql.apply(RegistryTradingParams.AM__))
.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)
.map(accId -> sql.apply(RegistryTradingParams.AS__))
.map(prdBldr::sql)

View file

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

View file

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