From 23604146f844f7ed72ab818c569ffed16f160920 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 8 May 2024 17:57:56 +0300 Subject: [PATCH] 1. Sessions currency (TRAN/ANLT accounts) fixes 2. ExecutionDeposit/ExecutionFond SettlementCurrency fix 3. payment-outbound dm*i search currency 4. TcrListNew validation - already present TcrList for specified currency 5. account-service do not create accounts for 'not-found' currencies --- ...gClearingRegistryListValidationConfig.java | 41 +++++++++++-- .../service/ClearingAccountService.java | 26 ++++++--- .../account/service/DepoAccountService.java | 18 ++++-- .../spcex/clearing/service/AnltSearcher.java | 2 +- .../clearing/service/RegistryService.java | 6 +- .../spcex/clearing/service/Sdf03Creator.java | 4 +- .../spcex/clearing/service/Sdf54Creator.java | 46 +++++++++++++-- ...aymentInstructionBuilderFinalMkrDeals.java | 47 +++++++++++---- .../execution/ExecutionDepositComponent.java | 23 ++++---- .../execution/ExecutionFondComponent.java | 4 +- .../service/executors/Sdf01Executor.java | 2 +- .../service/executors/Sdf55Executor.java | 13 +++-- .../PaymentInstructionOutboundService.java | 6 +- ...ormingPaymentInstructionDepositReturn.java | 46 +++++++++------ .../FormingPaymentInstructionReturnMkr.java | 49 +++++++++++----- .../FormingPaymentInstructionSecurities.java | 58 +++++++++++++------ .../statement/StatementServiceV2.java | 2 +- .../domain/cud/balance/StatementRequest.java | 15 ++++- 18 files changed, 286 insertions(+), 122 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java index 9ba14ec75..35581a678 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.account.config.validation; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -28,11 +35,6 @@ import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - @Configuration public class TradingClearingRegistryListValidationConfig { @@ -64,7 +66,8 @@ public class TradingClearingRegistryListValidationConfig { ServiceStatusDictionary.class, AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, - false) + false), + NotAlreadyPresent.instance ); }; } @@ -121,6 +124,32 @@ public class TradingClearingRegistryListValidationConfig { }; } + public static class NotAlreadyPresent implements IValidationRule> { + private static final NotAlreadyPresent instance = new NotAlreadyPresent(); + + @Override + public Optional validate(ImdgValidationContext ctx) { + TradingClearingRegistryListNewRequest tcrListReq = ctx.getValidatedObject(); + Long accountId = tcrListReq.getAccountId(); + Imdg tcrListImdg = ctx.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + ImdgPredicateBuilder pb = tcrListImdg.predicateBuilder(); + Collection tcrLists = tcrListImdg.getCollectionObjectsByPredicate( + pb.and( + pb.equals("tradingClearingRegistryId", tcrListReq.getTradingClearingRegistryId()), + pb.equals("status", WorkflowStatus.Active.getKey()) + ) + ); + if (tcrLists.stream().anyMatch(tcrList -> Objects.equals(accountId, tcrList.getAccountId()))) { + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, accountId); + } + return empty(); + } + + @Override + public String ruleName() { + return "TradingClearingRegistryList.AlreadyPresent"; + } + } public static class ExistAllAccountId implements IValidationRule> { String fieldName; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java index 1217f4870..c3a2664e9 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java @@ -275,18 +275,27 @@ public class ClearingAccountService extends QueueConsumer implements Initializin for (AccountSdfRequestPart accountReq : req.getAccounts()) { Instant now = Instant.now(); Account account = new Account(); + try { + Long currencyId = Long.valueOf(accountReq.getAccount().substring(5, 8)); + Currency currency = currImdg.getSingleObjectByID(currencyId); + account.setCurrency(currency.getCurrencyCode()); + } catch (Throwable e) { + AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart(); + responsePart.setSdfId(accountReq.getSdfId()); + responsePart.setErrorCode(AccountError.DictionaryNotFound.getId()); // see accountService.fillAccountFromRelation + responsePart.setErrorText("couldn't extract currency from '%s' account".formatted(accountReq.getAccount())); + accountToStatement.add(responsePart); + log.info("sdf.id={} companyId={} accountType={} couldn't find currency for account {}", + accountReq.getSdfId(), + accountReq.getCompanyId(), + accountReq.getAccountType(), + accountReq.getAccount()); + continue accountsLoop; + } account.setAccount(accountReq.getAccount()); account.setAccountType(AccountType.Clrn.getKey()); account.setStatus(ServiceStatus.Active.getKey()); account.setCompanyId(accountReq.getCompanyId()); - if (!TextUtil.isEmpty(accountReq.getAccount()) && accountReq.getAccount().length() >= 7) { - try { - Long currencyId = Long.valueOf(accountReq.getAccount().substring(5, 8)); - Currency currency = currImdg.getSingleObjectByID(currencyId); - account.setCurrency(currency.getCurrencyCode()); - } catch (Throwable e) { - } - } if (TextUtil.isEmpty(account.getCurrency())) { log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountReq.getAccount()); } @@ -621,6 +630,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin request.setGroupId(groupingSdf01Id); request.setChildGenerationId(groupSdf02Id); request.setAccountCreationResults(results); + request.setFromAccount(true); request.setContinueSdf(true); request.setTable(SdfTable.SDF_01); // по нему запрос получили log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request)); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java index 471ad6a0e..b3ab1e5ba 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.account.service; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -24,17 +28,18 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.validation.common.ValidationHelper; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.DepoAccountType; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; +import ru.spcex.platform.enumeration.SdfTable; +import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.utils.validation.IValidator; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - @Service public class DepoAccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -241,6 +246,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea request.setChildGenerationId(groupingSdf02Id); request.setContinueSdf(true); request.setAccountCreationResults(results); + request.setFromAccount(true); request.setTable(SdfTable.SDF_08); // по нему запрос получили log.debug("Send message to kafka \"{}\": {}", Consts.STATEMENT_PROCESS, LogFormatter.toStringWrapper(request)); kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java index 011595d90..f99423124 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java @@ -162,7 +162,7 @@ public class AnltSearcher { this.company = company; this.tcr = tcr; this.tcrList = tcrList; - this.currency = CurrencyCode.RUB.getKey(); + this.currency = currency; } public boolean isFound() { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index ebad3e196..7597cdf22 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -231,14 +231,14 @@ public class RegistryService { registries.size(), tcr.getId(), tcr.getMoneyAccountId()); } - Account acc = ref.tcrList == null ? accImdg.getSingleObjectByID(tcr.getMoneyAccountId()) - : accImdg.getSingleObjectByID(ref.tcrList.getAccountId()); + Long searchAccId = ref.tcrList == null ? tcr.getMoneyAccountId() : ref.tcrList.getAccountId(); + Account acc = accImdg.getSingleObjectByID(searchAccId); Currency currency = ref.tcrList == null ? currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())) : ref.currency; Company cmp = cmpImdg.getSingleObjectByID(tcr.getCompanyId()); if (acc == null) { - log.warn("TCR#id={} account {} not found", tcr.getId(), tcr.getMoneyAccountId()); + log.warn("TCR#id={} account {} not found", tcr.getId(), searchAccId); return; } if (currency == null) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java index 4ea98f2f6..80cb64d2f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf03Creator.java @@ -42,8 +42,8 @@ public class Sdf03Creator { String c_acc_deb = null; String c_acc_cred = null; if (AccountType.Info.equals(creditAccType) ^ AccountType.Info.equals(debAccType)) { - Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s'" - .formatted(AccountType.Anlt.getKey(), Status.Active.getKey())); + Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and currency = '%s'" + .formatted(AccountType.Anlt.getKey(), Status.Active.getKey(), paymentInstruction.getCreditLeg_currencyCode())); if (anltAcc == null) { throw new IllegalStateException("SDF03 creation error: paymentInstruction.creditLeg_accountId=" + paymentInstruction.getCreditLeg_accountId() + " accountType 'Info' but no 'ANLT' account found"); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java index 73859b442..b0c0d0485 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.service; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -11,18 +14,19 @@ import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.enumeration.Status; 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.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.time.TimeUtil; -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.Map; - @Component public class Sdf54Creator { private Logger log = LoggerFactory.getLogger(getClass()); @@ -30,6 +34,7 @@ public class Sdf54Creator { private final Imdg companyImdg; private final Imdg companySymbolImdg; private final Imdg accountImdg; + private final Imdg sdf54Imdg; private final Imdg bankAccountImdg; private final ImdgId idGenerator; private static DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); @@ -40,6 +45,7 @@ public class Sdf54Creator { this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.companySymbolImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.bankAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); + this.sdf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class); this.idGenerator = imdgProvider.getImdgIdGenerator(); } @@ -103,9 +109,17 @@ public class Sdf54Creator { sDf54.setInn_cred(bnkAcc.getTaxpayerIdentificationNumber()); sDf54.setKpp_cred(bnkAcc.getTaxRegistrationReasonCode()); c_acc_cred = bnkAcc.getCorrespondentAccount(); + sDf54.setSwift_ben(bnkAcc.getSwiftCode()); } else { log.warn("Bank account not found for DebitLeg_accountId={}", paymentInstruction.getDebitLeg_accountId()); } + sDf54.setDoc_Num(String.valueOf(nextDocNum())); + BankAccount prcBankAcc = bankAccountImdg.getFirstObjectBySQL("companyId = %d".formatted(Sender.Prc.getId())); + if (prcBankAcc != null) { + sDf54.setSwift_int(prcBankAcc.getSwiftCode()); + } + sDf54.setDoc_Date(null); + sDf54.setValue_date(null); sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account()); { @@ -161,7 +175,7 @@ public class Sdf54Creator { } sDf54.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(paymentInstruction.getPaymentDate()))); - sDf54.setPay_val(CurrencyCode.RUB.getKey()); + sDf54.setPay_val(paymentInstruction.getCreditLeg_currencyCode()); String sumDeb = paymentInstruction.getDebitLeg_amount() != null ? paymentInstruction.getDebitLeg_amount().toString() : ""; sDf54.setSum_deb(BigDecimalUtil.limitDecimalPlaces(sumDeb, 2)); sDf54.setSpecif_1(paymentInstruction.getPaymentPurpose()); @@ -175,6 +189,26 @@ public class Sdf54Creator { return IEnumKey.getEnumByKey(AccountType.class, account.getAccountType()); } + private int nextDocNum() { + ImdgPredicateBuilder pb = sdf54Imdg.predicateBuilder(); + SDf54 sDf54 = sdf54Imdg.aggregateByMax( + "id", pb.and( + pb.greatEqual("generationTime", TimeUtil.today()), + pb.notNull("Doc_Num") + ) + ); + if (sDf54 != null) { + try { + int num = Integer.parseInt(sDf54.getDoc_Num()); + return ++num; + } catch (Throwable e) { + log.error("couldn't parse sdf54.id={} doc_num {}", sDf54.getId(), sDf54.getDoc_Num()); + return 1; + } + } + return 1; + } + protected String selectSymbolValue(Long companyId, CompanySymbol symbol) { if (companyId == null) { return null; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderFinalMkrDeals.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderFinalMkrDeals.java index 3bffeaa54..36680c070 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderFinalMkrDeals.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderFinalMkrDeals.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.service.builder; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,19 +16,20 @@ import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.Allowed; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.InOutDirection; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.TransactionStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.collection.Pair; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.time.TimeUtil; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - /** * Builder для кейса итоговой сессии МКР, 7 шаг, кейс - по сделкам */ @@ -44,6 +51,7 @@ public class PaymentInstructionBuilderFinalMkrDeals { protected AtomicLong documentNumberId = new AtomicLong(0L); // порядковый номер (сквозной по всем компаниям за день private static final DateTimeFormatter DATE_FORMATTER_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy"); private String purpose; + private String currency; private String lmtPurpose = null; public static PaymentInstructionBuilderFinalMkrDeals builder(ImdgProvider imdgProvider) { @@ -92,6 +100,11 @@ public class PaymentInstructionBuilderFinalMkrDeals { return this; } + public PaymentInstructionBuilderFinalMkrDeals currency(String currency) { + this.currency = currency; + return this; + } + public Pair build() { PaymentInstruction payment1; @@ -165,8 +178,13 @@ public class PaymentInstructionBuilderFinalMkrDeals { } payment1.setDebit_csAccount(null); - payment1.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey()); - payment1.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey()); + if (TextUtil.isEmpty(currency)) { + payment1.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey()); + payment1.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey()); + } else { + payment1.setCreditLeg_currencyCode(currency); + payment1.setDebitLeg_currencyCode(currency); + } payment1.setTransactionStatus(TransactionStatus.stld.getKey()); payment1.setDocumentNumber(nextDocumentNumber(lm_t, payment1)); payment1.setCreditLeg_direction(InOutDirection.out.getKey()); @@ -221,8 +239,13 @@ public class PaymentInstructionBuilderFinalMkrDeals { payment2.setDocumentNumber(nextDocumentNumber(cm_t, payment2)); payment2.setCreditLeg_direction(InOutDirection.out.getKey()); payment2.setDebitLeg_direction(InOutDirection.in.getKey()); - payment2.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey()); - payment2.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey()); + if (TextUtil.isEmpty(currency)) { + payment2.setCreditLeg_currencyCode(CurrencyCode.RUB.getKey()); + payment2.setDebitLeg_currencyCode(CurrencyCode.RUB.getKey()); + } else { + payment2.setCreditLeg_currencyCode(currency); + payment2.setDebitLeg_currencyCode(currency); + } payment2.setCreditLeg_securityId(lm_t.getSecurityId()); payment2.setDebitLeg_securityId(lm_t.getSecurityId()); payment2.setSessionId(sessionId); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index 815bac8e1..e284bebac 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.service.execution; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +30,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewR import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.validation.ValidationStored; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @@ -34,15 +44,6 @@ import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - /** * 1.35. executionDeposit - Сделки * I - Изменение executionDeposit при получении новых сделок из ТС (s_trade) @@ -212,7 +213,7 @@ public class ExecutionDepositComponent { } } } - eDeposit.setSettlementCurrency(CurrencyCode.RUB.getKey()); + eDeposit.setSettlementCurrency(sTrades.getSettleCurrency()); eDeposit.setCompanyId(company.getId()); eDeposit.setDuration(sTrades.getRepoTerm()); eDeposit.setFirstLegSettlementDate(sTrades.getSettleDate()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index a4ce30d8a..d962c27fe 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -53,10 +53,10 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Component @EnableScheduling @@ -224,7 +224,7 @@ public class ExecutionFondComponent { } } //fixme символьный код по справочнику currencyCode, соответствующий значению из sTrades.settleCurrency - eFond.setSettlementCurrency(CurrencyCode.RUB.getKey()); + eFond.setSettlementCurrency(sTrades.getSettleCurrency()); //fixme micro vs milli eFond.setExchangeExecutionMicroseconds(Instant.ofEpochMilli(sTrades.getTradeTimeMs())); eFond.setCompanyId(company.getId()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java index ffd91e829..8dc6a5353 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf01Executor.java @@ -131,7 +131,7 @@ public class Sdf01Executor extends AbstractExecutor { Optional error = validator.tillFirstError(); Company company = validator.getStored(ValidationStored.Sdf01Company); Account account = validator.getStored(ValidationStored.Sdf01Account); - if (statementRequest.getAccountCreationResults().size() == 0 + if (!statementRequest.isFromAccount() && ClearingError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { //на данном шаге company существует -> getId ok //формируем пакетный запрос на добавление account diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java index b2e49539e..f7ac9ec83 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.service.executors; +import java.math.BigDecimal; +import java.time.Instant; +import java.util.Optional; +import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -21,13 +25,9 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Optional; -import java.util.function.Function; - @Service public class Sdf55Executor { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -68,7 +68,8 @@ public class Sdf55Executor { pmt.setTransactionStatus(TransactionStatus.ok.getKey()); pmt.setUpdated(Instant.now()); pmtImdg.update(pmt); - dmiService.setContract(tcr.getId(), CurrencyCode.RUB.getKey(), sDf54.getDocnm_ref(), sDf55.getDocnmprev()); + String curr = TextUtil.isEmpty(sDf55.getPay_val()) ? CurrencyCode.RUB.getKey() : sDf55.getPay_val(); + dmiService.setContract(tcr.getId(), curr, sDf54.getDocnm_ref(), sDf55.getDocnmprev()); assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index e111a3ae6..72cf231a4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -52,6 +52,7 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumId; import ru.spcex.platform.utils.enumeration.IMessageResolver; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; +import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; @Service @@ -151,7 +152,8 @@ public class PaymentInstructionOutboundService { pmt.setAddresseeBankName(bnkAcc.getBankName()); pmt.setDebit_csAccount(bnkAcc.getCorrespondentAccount()); } - Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(CurrencyCode.RUB.getKey())); + String curr = TextUtil.isEmpty(accCred.getCurrency()) ? CurrencyCode.RUB.getKey() : accCred.getCurrency(); + Currency currency = currImdg.getFirstObjectBySQL("currencyCode = '%s'".formatted(curr)); if (currency != null) { pmt.setCreditLeg_securityId(currency.getId()); pmt.setDebitLeg_securityId(currency.getId()); @@ -178,7 +180,7 @@ public class PaymentInstructionOutboundService { sdf54Imdg.insert(sDf54); log.debug("new sdf54.id: {}", sDf54.getId()); dmiService.setProcComment(tcr.getId(), - CurrencyCode.RUB.getKey(), + curr, safeBD(amount).negate(), sDf54.getDocnm_ref()); assetsMng.process(assets.get().a__b(), assets.get().a__t(), assets.get().a__f(), BigDecimal.ZERO); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java index 61e857492..2c9085cef 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java @@ -1,5 +1,14 @@ package ru.spcex.clearing.session.stage.impl; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +41,7 @@ import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.RegistryStatus; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -42,14 +52,6 @@ import ru.spcex.platform.utils.collection.Pair; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; 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; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Service @@ -107,13 +109,6 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { private StageResult formingPaymentInstruction(Long sessionId) { Instant now = Instant.now(); - Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" - .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); - if (tranAcc == null) { - return new StageResult<>( - new EnumMessage(ClearingError.AccountNotPresent, "accountType = " + AccountType.Tran.getKey()), - false); - } RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(LM_T,CM_T, LS_T, CS_T); String registryCodeCondition = registryCodeSqlBuilder.build(); @@ -145,6 +140,19 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { } Registry lm_t = lmtO.get(); //obligation by money Registry cm_t = cmtO.get(); + Account tranAcc = accountImdg.getFirstObjectBySQL(("accountType = '%s'" + + " and status = '%s'" + + " and processingSign = '%s'" + + " and currency = '%s'") + .formatted(AccountType.Tran.getKey(), + AccountStatus.ACTIVE.getKey(), + Allowed.ALLOWED.getKey(), + lm_t.getSecuritySymbol())); + if (tranAcc == null) { + return new StageResult<>( + new EnumMessage(ClearingError.AccountNotPresent, "accountType = " + AccountType.Tran.getKey()), + false); + } Optional dmx = rgsMng.searchDmxByCounterPartyNotOk(lm_t); if (dmx.isPresent()) { log.debug("groupId {} LM*T#id={}, DM*X#id={} found, no action needed, skipping liability", @@ -165,6 +173,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { .sessionId(sessionId) .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) + .currency(lm_t.getSecuritySymbol()) .build(); Pair.forEach(pmts, paymentInstructionImdg::insert); Pair.forEach(pmts, pmtCreated::add); @@ -224,13 +233,12 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { .sessionId(sessionId) .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) + .currency(lm_t.getSecuritySymbol()) .build(); - paymentInstructionImdg.insert(pmts.getFirst()); - paymentInstructionImdg.insert(pmts.getSecond()); + Pair.forEach(pmts, paymentInstructionImdg::insert); + Pair.forEach(pmts, pmtCreated::add); log.debug("groupId {} LM*T#id={}, CM*T#id={} found, PaymentInstruction id={} and id={} created", lm_t.getGroupId(), lm_t.getId(), cm_t.getId(), pmts.getFirst().getId(), pmts.getSecond().getId()); - pmtCreated.add(pmts.getFirst()); - pmtCreated.add(pmts.getSecond()); dmtClnr.get().setRegistryStatus(RegistryStatus.OK.getKey()); setUpdatedStoreInImdg(dmtClnr.get(), now); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java index 2e228364e..75b40ceee 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java @@ -1,5 +1,15 @@ package ru.spcex.clearing.session.stage.impl; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +38,17 @@ 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.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; +import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -41,14 +61,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.time.TimeUtil; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.stream.Collectors; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.*; - @Service @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class FormingPaymentInstructionReturnMkr implements ISessionStage { @@ -160,8 +172,14 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { continue; } Optional dmtClnr = rgsMng.searchDmtClrnNotOk(lm_t); - Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" - .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); + Account tranAcc = accountImdg.getFirstObjectBySQL(("accountType = '%s'" + + " and status = '%s'" + + " and processingSign = '%s'" + + " and currency = '%s'") + .formatted(AccountType.Tran.getKey(), + AccountStatus.ACTIVE.getKey(), + Allowed.ALLOWED.getKey(), + lm_t.getSecuritySymbol())); if (tranAcc == null) { return new StageResult<>( new EnumMessage(ClearingError.AccountNotPresent, "accountType = " + AccountType.Tran.getKey()), @@ -188,13 +206,12 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { .sessionId(sessionId) .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) - .build(); - paymentInstructionImdg.insert(pmts.getFirst()); - paymentInstructionImdg.insert(pmts.getSecond()); + .currency(lm_t.getSecuritySymbol()) + .build(); + Pair.forEach(pmts, paymentInstructionImdg::insert); + Pair.forEach(pmts, pmtCreated::add); log.debug("LM*T#id={}, CM*T#id={} found, PaymentInstruction id={} and id={} created", lm_t.getId(), cm_t.getId(), pmts.getFirst().getId(), pmts.getSecond().getId()); - pmtCreated.add(pmts.getFirst()); - pmtCreated.add(pmts.getSecond()); if (dmtClnr.isPresent()) { dmtClnr.get().setRegistryStatus(RegistryStatus.OK.getKey()); setUpdatedStoreInImdg(dmtClnr.get(), now); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java index fb11195b2..6a10d19fd 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionSecurities.java @@ -1,5 +1,16 @@ package ru.spcex.clearing.session.stage.impl; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +40,13 @@ import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.payment.group.PaymentGroup; import ru.spcex.clearing.session.stage.payment.group.RegistryLiabilitiesGroup; 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.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; +import ru.spcex.platform.enumeration.Sender; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -42,15 +59,6 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import ru.spcex.platform.utils.number.BigDecimalUtil; - -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Service @@ -231,21 +239,36 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { } { Collection registries = selectMoneyRegistries(sessionId); - Account tranAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" - .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); Account dtrnAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" .formatted(AccountType.Dtrn.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); - if (tranAcc == null || dtrnAcc == null) { + if (dtrnAcc == null) { return new StageResult<>( - new EnumMessage(ClearingError.AccountNotPresent, "accountType = %s/%s" - .formatted(AccountType.Tran.getKey(), AccountType.Dtrn.getKey())), + new EnumMessage(ClearingError.AccountNotPresent, "accountType = %s" + .formatted(AccountType.Dtrn.getKey())), false); } - log.debug("found AS*B.size() = {}", registries.size()); + log.debug("found AM*B.size() = {}", registries.size()); //группируем регистры по groupId for (Registry registry : registries) { + Account tranAcc = accountImdg.getFirstObjectBySQL(("accountType = '%s'" + + " and status = '%s'" + + " and processingSign = '%s'" + + " and currency = '%s'") + .formatted(AccountType.Tran.getKey(), + AccountStatus.ACTIVE.getKey(), + Allowed.ALLOWED.getKey(), + registry.getSecuritySymbol())); + + if (tranAcc == null) { + log.error("{} account not found for {}", AccountType.Tran.getKey(), registry.getSecuritySymbol()); + return new StageResult<>( + new EnumMessage(ClearingError.AccountNotPresent, "accountType = %s" + .formatted(AccountType.Tran.getKey())), + false); + } + if (registry.getBalance().compareTo(BigDecimal.ZERO) == 0) { log.debug("Skip creating paymentInstruction by registry with 0 balance"); continue; @@ -255,7 +278,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { if (AccountType.Clrn.equalsByKey(registry.getAccountType())) { counterAcc = accountImdg.getSingleObjectByID(registry.getAccountId()); } else if (AccountType.Info.equalsByKey(registry.getAccountType())) { - counterAcc = accountImdg.getFirstObjectByFieldValues(Map.of("companyId", 1L, "accountType", AccountType.Anlt.getKey())); + counterAcc = accountImdg.getFirstObjectByFieldValues(Map.of("companyId", 1L, "accountType", AccountType.Anlt.getKey(), "currency", registry.getSecuritySymbol())); } Long senderId; Long addresseeId; @@ -302,6 +325,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage { .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) + .currency(registry.getSecuritySymbol()) .purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry())); PaymentInstruction paymentInstruction = paymentInstructionBuilder.build(); log.debug("Created paymentInstruction by registry.id: {}", registry.getId()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java index 29b9aeb53..d36107498 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java @@ -239,7 +239,7 @@ public class StatementServiceV2 { } AbstractExecutor service = sdf01Executor; Result sdf01Res = service.execute(sdfGroup, sdf01); - if (sdf01Res.getAccountRequests().size() != 0) { + if (sdf01Res.getAccountRequests().size() != 0 && !sdf01.isFromAccount()) { kafkaSender.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, StatementService.createAccountsRequest(sdf01.getGroupId(), sdf01Res.getAccountRequests(), sdf01Res.getChildGenerationId())); } else if (service.isNeedToSendCommand()) { service.sendCommand(kafkaSender, sdf01Res); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java index 8f8b90c37..422500b72 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java @@ -1,10 +1,9 @@ package ru.spcex.clearing.platform.messaging.domain.cud.balance; -import com.fasterxml.jackson.annotation.JsonProperty; -import ru.spcex.platform.enumeration.SdfTable; - import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.enumeration.SdfTable; public class StatementRequest { @JsonProperty @@ -16,6 +15,8 @@ public class StatementRequest { @JsonProperty List accountCreationResults = new ArrayList<>(); @JsonProperty + boolean fromAccount = false; + @JsonProperty private Long childGenerationId; @JsonProperty private boolean continueSdf = false; @@ -59,4 +60,12 @@ public class StatementRequest { public void setChildGenerationId(Long childGenerationId) { this.childGenerationId = childGenerationId; } + + public boolean isFromAccount() { + return fromAccount; + } + + public void setFromAccount(boolean fromAccount) { + this.fromAccount = fromAccount; + } } \ No newline at end of file