diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index 97125a334..2598d0054 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.account.config.validation; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; @@ -22,17 +27,12 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.rule.CurrencyCodeValidationRule; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Function; - @Configuration public class AccountValidationConfig { @@ -49,6 +49,7 @@ public class AccountValidationConfig { addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); + addImdg.accept(IMDGDistributedNames.Map_Currency); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", CorrespondentAccountNewRequest::getCompanyId, @@ -116,6 +117,7 @@ public class AccountValidationConfig { AccountError.DictionaryNotFound, false ), + CurrencyCodeValidationRule.get(AccountError.CurrencyNotFound), new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount) ); }; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java index 9e579812e..0b379cd29 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -25,6 +25,7 @@ public enum AccountError implements IErrorEnumId { AccountDepoTypeRequired(5025L), AccountIsNotACurrency(5026L), // Счет %S не валютный TradingClearingRegistryNotFound(3022L), + CurrencyNotFound(1016L), ; private final Long id; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index b9892998c..1856f6713 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.account.service; +import java.time.Instant; +import java.util.Collection; +import java.util.Map; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -29,22 +33,19 @@ import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; 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.Sender; +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.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +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 java.time.Instant; -import java.util.Collection; -import java.util.Map; -import java.util.function.Function; - @Service public class AccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -130,29 +131,26 @@ public class AccountService extends QueueConsumer implements InitializingBean { RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; - requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); + IValidator validator = accountNewRequestValidator.apply(userRequest.getRequestPayload()); + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, (r) -> validator); if (requestInfoUpdate != null) return requestInfoUpdate; CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); - String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); - Currency currencyByCode = currencyMap.getFirstObjectByPredicate( - currencyMap.predicateBuilder().equals("currencyCode", currency) - ); - Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currency) ? 810 : currencyByCode.getId(); + Currency currency = validator.getStored(Stored.currency); Instant now = Instant.now(); Account account = new Account(); account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); if (AccountType.Info.equalsByKey(req.getAccountType())) { - Long infoSequenceId = informationAccountService.accountNextId(currency, currencyCodeId); + Long infoSequenceId = informationAccountService.accountNextId(currency.getCurrencyCode(), currency.getId()); - String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId); + String accountValue = informationAccountService.generateInfoAccount(currency.getId(), infoSequenceId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); } account.setAccountType(req.getAccountType()); - account.setCurrency(currency); + account.setCurrency(currency.getCurrencyCode()); if (req.getStatus() == null) { account.setStatus(WorkflowStatus.Active.getKey()); log.trace("Status not set in request. Use default: {}", account.getStatus()); diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java index 8333fc162..af6a5d726 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf01.java @@ -2,9 +2,9 @@ package ru.clearing.classes.statics.data.sdf; import java.time.Instant; import ru.clearing.classes.ConstSerializable; -import ru.clearing.classes.statics.data.api.WithCurrency; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.interfaces.WithAccount; +import ru.spcex.platform.classes.base.interfaces.WithCurrency; import ru.spcex.platform.classes.base.interfaces.WithFileName; import ru.spcex.platform.classes.base.interfaces.WithMarket; diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java index a3549a408..dcc0c9bf0 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java @@ -3,8 +3,8 @@ package ru.clearing.classes.statics.data.sdf; import java.math.BigDecimal; import java.time.Instant; import ru.clearing.classes.ConstSerializable; -import ru.clearing.classes.statics.data.api.WithCurrency; import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.classes.base.interfaces.WithCurrency; import ru.spcex.platform.classes.base.interfaces.WithFileName; /** diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java index ca5627076..43b412a2b 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java @@ -2,8 +2,8 @@ package ru.clearing.classes.statics.data.sdf; import java.time.Instant; import ru.clearing.classes.ConstSerializable; -import ru.clearing.classes.statics.data.api.WithCurrency; import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.classes.base.interfaces.WithCurrency; /** * ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 55ffcb170..9271670e1 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -49,7 +49,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDep import ru.spcex.clearing.service.validation.AnltAccLoad; import ru.spcex.clearing.service.validation.ClrngValidationStored; import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule; -import ru.spcex.clearing.service.validation.CurrencyCodeValidationRule; import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule; import ru.spcex.clearing.service.validation.IdentificationFundsValidationRule; import ru.spcex.clearing.service.validation.MarketIsUValidationRule; @@ -80,6 +79,7 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.LogPrefixId; +import ru.spcex.platform.imdg.validation.rule.CurrencyCodeValidationRule; import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; @@ -279,7 +279,7 @@ public class ValidationConfig { Sdf57ValidationRule.CompanyDebOrCredPresent, Sdf57ValidationRule.AccountDebOrCredPresent, Sdf57ValidationRule.AccountAndCompanyMatch, - CurrencyCodeValidationRule.INSTANCE + CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck) ); }; } @@ -321,7 +321,7 @@ public class ValidationConfig { Sdf01NewValidationRule.CompanyPresent, Sdf01NewValidationRule.AccountType, Sdf01NewValidationRule.AccountPresent, - CurrencyCodeValidationRule.INSTANCE, + CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck), Sdf01NewValidationRule.DatIsCurrentDt ); }; @@ -365,9 +365,7 @@ public class ValidationConfig { Sdf06NewValidationRule.Session, Sdf06NewValidationRule.Balance, Sdf06NewValidationRule.TcrPresent, - CurrencyCodeValidationRule.INSTANCE - - + CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck) ); }; } @@ -506,6 +504,7 @@ public class ValidationConfig { ctx.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); ctx.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); + ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList); return new ValidatorImpl<>(ctx, PaymentOutboundValidationRule.RequiredFields, IdPresentRule.instance("senderId", 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 7b421a39a..97a0f1365 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 @@ -55,8 +55,12 @@ public class Sdf54Creator { public SDf54 create(PaymentInstruction paymentInstruction) { Instant now = Instant.now(); String c_acc_cred = null; - 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() + )); // c_acc_deb = c_acc_deb == null ? paymentInstruction.getCreditLeg_account() : c_acc_deb; c_acc_cred = c_acc_cred == null ? paymentInstruction.getDebitLeg_account() : c_acc_cred; @@ -125,8 +129,13 @@ public class Sdf54Creator { sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account()); { - Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s'" - .formatted(Sender.Prc.getId(), AccountType.Bank.getKey(), Status.Active.getKey())); + Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s' and currency = '%s'" + .formatted( + Sender.Prc.getId(), + AccountType.Bank.getKey(), + Status.Active.getKey(), + paymentInstruction.getCreditLeg_currencyCode() + )); if (prcCorrAcc == null) { log.warn("Account for PRC CORR not found"); } else { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index 858facfc0..fb495f785 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -51,6 +51,7 @@ 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.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -162,7 +163,7 @@ public class Sdf06Executor { } Company company = validator.getStored(ValidationStored.Sdf06Company); TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr); - Currency currency = validator.getStored(ValidationStored.currency); + Currency currency = validator.getStored(Stored.currency); //проверка существует ли statement пока убрал Statement stmt = createStatementBySdf06(sDf06, company.getId(), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/PaymentOutboundValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/PaymentOutboundValidationRule.java index 468308dad..a8f69ba60 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/PaymentOutboundValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/PaymentOutboundValidationRule.java @@ -1,13 +1,19 @@ package ru.spcex.clearing.service.validation; +import java.math.BigDecimal; +import java.util.Objects; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; 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.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest; +import ru.spcex.clearing.service.AnltSearcher; +import ru.spcex.clearing.service.TcrSearcher; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @@ -15,9 +21,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.math.BigDecimal; -import java.util.Optional; - public enum PaymentOutboundValidationRule implements IValidationRule> { RequiredFields() { @Override @@ -101,8 +104,20 @@ public enum PaymentOutboundValidationRule implements IValidationRule tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - TradingClearingRegistry tcr = tcrImdg.getFirstObjectBySQL("moneyAccountId = '%d' and companyId = %d" - .formatted(accCred.getId(), addressee.getId())); + Imdg tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + TcrSearcher tcrSearcher = new TcrSearcher(tcrImdg, tcrListImdg, companyImdg, accountImdg); + AnltSearcher.AnltSearch srchRes = tcrSearcher.searchByAccountId(accCred.getId(), accCred.getCurrency()); + if (!srchRes.isFound()) { + return Optional.of(srchRes.getError()); + } + if (srchRes.getCompany() != null) { + if (!Objects.equals(srchRes.getCompany().getId(), addressee.getId())) { + return of(ClearingError.AccountIsNotMatchedWithCompany, accCred.getId(), addressee.getId()); + } + } + TradingClearingRegistry tcr = srchRes.getTcr(); if (tcr == null) { return of(ClearingError.RecordNotFound, "TCR"); } diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithCurrency.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithCurrency.java new file mode 100644 index 000000000..b10ee2a87 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithCurrency.java @@ -0,0 +1,5 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface WithCurrency { + String currency(); +} \ No newline at end of file diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java index d52c0c27f..b4d6ebf4c 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java @@ -9,5 +9,7 @@ public enum Stored { */ PresentById, - AnltAccount + AnltAccount, + + currency } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java new file mode 100644 index 000000000..3f3e864da --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java @@ -0,0 +1,44 @@ +package ru.spcex.platform.imdg.validation.rule; + +import java.util.Optional; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.classes.base.interfaces.WithCurrency; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IErrorEnumId; +import ru.spcex.platform.utils.text.TextUtil; +import ru.spcex.platform.utils.validation.IValidationRule; + +public class CurrencyCodeValidationRule implements IValidationRule> { + public static CurrencyCodeValidationRule get(IErrorEnumId err) { + return new CurrencyCodeValidationRule(err); + } + + private final IErrorEnumId errEnum; + + public CurrencyCodeValidationRule(IErrorEnumId errEnum) { + this.errEnum = errEnum; + } + + @Override + public Optional validate(ImdgValidationContext context) { + WithCurrency obj = context.getValidatedObject(); + if (TextUtil.isEmpty(obj.currency())) { + return of(errEnum, "null"); + } + Imdg curImdg = context.obtainMap(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class); + ImdgPredicateBuilder pb = curImdg.predicateBuilder(); + SpcexObjectBase currency = curImdg.getFirstObjectByPredicate( + pb.equals("currencyCode", obj.currency()) + ); + if (currency == null) { + return of(errEnum, obj.currency()); + } + context.storeObject(Stored.currency, currency); + return empty(); + } +}