From 6707e361d93ef8e812915db1bee356dc09c0eee5 Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 7 Apr 2023 20:58:58 +0300 Subject: [PATCH 01/39] FieldRequiredRule, add additional checks --- .../common/rules/FieldRequiredRule.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java index eaa468190..ca46f4519 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java @@ -15,7 +15,8 @@ import java.util.function.Function; * @param fieldName Название поля * @param getter Метод получения значения * @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если поле пустое - * @param additionalChecks Дополнительные проверки, связанные с этим полем + * @param additionalChecks Дополнительные проверки, связанные с этим полем. Выполняются при required == true + * @param required Флаг обязательности поля * @param Класс проверяемого объекта * @param Класс проверяемого значения */ @@ -23,9 +24,29 @@ public record FieldRequiredRule( String fieldName, Function getter, IErrorEnumId errorEmptyRequiredValue, + boolean required, Function[] additionalChecks ) implements IValidationRule> { + /** + * @param fieldName Название поля + * @param getter Метод получения значения + * @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если поле пустое + * @param additionalChecks Дополнительные проверки, связанные с этим полем. Выполняются при required == true + * @param required Флаг обязательности поля + * @param Класс проверяемого объекта + * @param Класс проверяемого значения + */ + @SafeVarargs + public static FieldRequiredRule instance(String fieldName, + Function getter, + IErrorEnumId errorEmptyRequiredValue, + boolean required, + Function... additionalChecks) { + if (errorEmptyRequiredValue == null) throw new IllegalArgumentException("Empty errorEmptyRequiredValue"); + return new FieldRequiredRule<>(fieldName, getter, errorEmptyRequiredValue, required, additionalChecks); + } + /** * @param fieldName Название поля * @param getter Метод получения значения @@ -40,18 +61,20 @@ public record FieldRequiredRule( IErrorEnumId errorEmptyRequiredValue, Function... additionalChecks) { if (errorEmptyRequiredValue == null) throw new IllegalArgumentException("Empty errorEmptyRequiredValue"); - return new FieldRequiredRule<>(fieldName, getter, errorEmptyRequiredValue, additionalChecks); + return new FieldRequiredRule<>(fieldName, getter, errorEmptyRequiredValue, true, additionalChecks); } @Override public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); V value = getter.apply(validatedObject); - if (value == null) return of(errorEmptyRequiredValue, fieldName); - for (Function additionalCheck : additionalChecks) { - IErrorEnumId validationError = additionalCheck.apply(value); - if (validationError != null) - return of(validationError, fieldName); + if (required) { + if (value == null) return of(errorEmptyRequiredValue, fieldName); + for (Function additionalCheck : additionalChecks) { + IErrorEnumId validationError = additionalCheck.apply(value); + if (validationError != null) + return of(validationError, fieldName); + } } return empty(); } From c00ea6be31abcbff2ec51a4f16a11e7d7f60ebdd Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 10 Apr 2023 11:49:23 +0300 Subject: [PATCH 02/39] BankAccountValidationConfig --- clearing-parent/account-service/pom.xml | 8 + .../account/config/BeanConfiguration.java | 26 +++ .../account/config/ErrorResolverConfig.java | 14 -- .../BankAccountValidationConfig.java | 214 ++++++++++++++++++ .../config/validation/ValidationConfig.java | 43 ++++ .../clearing/account/errors/AccountError.java | 6 +- .../account/service/AccountService.java | 8 +- 7 files changed, 300 insertions(+), 19 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java delete mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index f2bfdaf25..a9fae56b7 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -65,6 +65,14 @@ spring-boot-test test + + ru.spcex.clearing + security-util + + + ru.spcex.clearing + clearing-validation + diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java new file mode 100644 index 000000000..9a7793082 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java @@ -0,0 +1,26 @@ +package ru.spcex.clearing.account.config; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.enumeration.UserRole; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +@Configuration +public class BeanConfiguration { + @Bean + public IMessageResolver messageResolver() { + return new SimpleMessageResolver(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) { + return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, AccountError.UserVerifyDenial); + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java deleted file mode 100644 index 7cf2db17a..000000000 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.spcex.clearing.account.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; - -@Configuration -public class ErrorResolverConfig { - @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); - } -} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java new file mode 100644 index 000000000..9d0995c17 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -0,0 +1,214 @@ +package ru.spcex.clearing.account.config.validation; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.CurrencyCodeDictionary; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; +import ru.spcex.clearing.validation.common.rules.EnumPresentRule; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.WorkflowStatus; +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.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +@Configuration +public class BankAccountValidationConfig { + + @Bean("bankAccountNewRequestValidator") + public Function bankAccountNewRequestValidator( + Map> imdgForValidation + ) { + return bankAccountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(bankAccountNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_BankAccount); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + BankAccountNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), + FieldRequiredRule.instance("account", + BankAccountNewRequest::getAccount, + AccountError.RequiredFieldEmpty, + accountValue -> { + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); + ImdgPredicate accountStatusPredicate = pb.equals("accountStatus", Status.Active.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); + if (accounts.isEmpty()) return null; + return AccountError.AccountAlreadyExist; + }), + EnumPresentRule.instance("currency", + BankAccountNewRequest::getCurrency, + CurrencyCode.values(), + AccountError.WrongFieldValue, + AccountError.RequiredFieldEmpty), + DictionaryPresentRule.instance("currency", + BankAccountNewRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, + CurrencyCodeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue), + FieldRequiredRule.instance("bankIdentificationCode", + BankAccountNewRequest::getBankIdentificationCode, + AccountError.RequiredFieldEmpty), + FieldRequiredRule.instance("bankName", + BankAccountNewRequest::getBankName, + AccountError.RequiredFieldEmpty), + FieldRequiredRule.instance("destination", + BankAccountNewRequest::getDestination, + AccountError.RequiredFieldEmpty), + FieldRequiredRule.instance("correspondentAccount", + BankAccountNewRequest::getCorrespondentAccount, + AccountError.RequiredFieldEmpty, + false, + correspondentAccount -> { + String currency = bankAccountNewRequest.getCurrency(); + if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && correspondentAccount == null) + return AccountError.RequiredFieldEmpty; + return null; + }), + FieldRequiredRule.instance("correspondentAccountName", + BankAccountNewRequest::getCorrespondentAccountName, + AccountError.RequiredFieldEmpty, + false, + correspondentAccountName -> { + String currency = bankAccountNewRequest.getCurrency(); + if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && correspondentAccountName == null) + return AccountError.RequiredFieldEmpty; + return null; + }), + FieldRequiredRule.instance("taxpayerIdentificationNumber", + BankAccountNewRequest::getTaxpayerIdentificationNumber, + AccountError.RequiredFieldEmpty, + false, + taxpayerIdentificationNumber -> { + String currency = bankAccountNewRequest.getCurrency(); + if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && taxpayerIdentificationNumber == null) + return AccountError.RequiredFieldEmpty; + return null; + }), + FieldRequiredRule.instance("taxRegistrationReasonCode", + BankAccountNewRequest::getTaxRegistrationReasonCode, + AccountError.RequiredFieldEmpty, + false, + taxRegistrationReasonCode -> { + String currency = bankAccountNewRequest.getCurrency(); + if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && taxRegistrationReasonCode == null) + return AccountError.RequiredFieldEmpty; + return null; + }) + ); + }; + } + + @Bean("bankAccountUpdateRequestValidator") + public Function bankAccountUpdateRequestValidator( + Map> imdgForValidation + ) { + return bankAccountUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(bankAccountUpdateRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary); + addImdg.accept(IMDGDistributedNames.Map_BankAccount); + addImdg.accept(IMDGDistributedNames.Map_Company); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + BankAccountUpdateRequest::getId, + IMDGDistributedNames.Map_BankAccount, + BankAccount.class, + AccountError.RequiredFieldEmpty, + AccountError.BankAccountNotFound, + bankAccount -> { + Long accountId = bankAccount.getAccountId(); + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + Account account = accountImdg.getSingleObjectByID(accountId); + if (account == null) return AccountError.BankAccountNotFound; + if (!WorkflowStatus.Active.getKey().equalsIgnoreCase(account.getAccountStatus())) + return AccountError.AccountNotActive; + return null; + }), + EnumPresentRule.instance("currency", + BankAccountUpdateRequest::getCurrency, + CurrencyCode.values(), + false, + AccountError.WrongFieldValue, + AccountError.RequiredFieldEmpty), + DictionaryPresentRule.instance("currency", + BankAccountUpdateRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, + CurrencyCodeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue, + false) + ); + }; + } + + @Bean("bankAccountUpdateRequestValidator") + public Function bankAccountDeleteRequestValidator( + Map> imdgForValidation + ) { + return bankAccountDeleteRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(bankAccountDeleteRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_BankAccount); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + CommonDeleteRequest::getId, + IMDGDistributedNames.Map_BankAccount, + BankAccount.class, + AccountError.RequiredFieldEmpty, + AccountError.BankAccountNotFound, + bankAccount -> { + Long accountId = bankAccount.getAccountId(); + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + Account account = accountImdg.getSingleObjectByID(accountId); + if (account == null) return AccountError.BankAccountNotFound; + if (!WorkflowStatus.Active.getKey().equalsIgnoreCase(account.getAccountStatus())) + return AccountError.AccountNotActive; + return null; + }) + ); + }; + } + +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java new file mode 100644 index 000000000..879f5b85c --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.account.config.validation; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.CurrencyCodeDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +@Configuration +public class ValidationConfig { + + @Bean("imdgForValidation") + public Map> imdgForValidation(ImdgProvider imdgProvider) { + final Map> imdg = new HashMap<>(); + BiConsumer> addImdg = (s, aClass) -> imdg.put(s, imdgProvider.getImdg(s, aClass)); + + addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); + addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); + addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); + + return imdg; + } + + @Bean("validationHelper") + public ValidationHelper validationHelper(IMessageResolver messageResolver) { + return new ValidationHelper(messageResolver); + } + +} + 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 122609131..fef804c81 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 @@ -3,12 +3,16 @@ package ru.spcex.clearing.account.errors; import ru.spcex.platform.utils.enumeration.IErrorEnumId; public enum AccountError implements IErrorEnumId { + UserVerifyDenial(5001L), + RequiredFieldEmpty(5002L), WrongFieldValue(5004L), AccountAlreadyExist(5010L), + BankAccountNotFound(5011L), + AccountNotActive(5012L), CompanyNotFound(5013L), CompanyNotActive(5014L), - ; + private final Long id; AccountError(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 36fea1fe3..a3461b62b 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 @@ -43,7 +43,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { init(); } - private void accountNew(BaseRequest userRequest) { + public void accountNew(BaseRequest userRequest) { AccountSdf01Request req = userRequest.getRequestPayload(); log.debug("AccountSdf01Request received"); List accountToStatement = new ArrayList<>(); @@ -60,11 +60,11 @@ public class AccountService extends QueueConsumer implements InitializingBean { log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size()); } - private void accountUpdateWithBrake(BaseRequest userRequest) { + public void accountUpdateWithBrake(BaseRequest userRequest) { } - private AccountSdfToStatementRequestPart responsePart(Long sdf01Id) { + public AccountSdfToStatementRequestPart responsePart(Long sdf01Id) { AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart(); responsePart.setSdfId(sdf01Id); responsePart.setErrorCode(null); @@ -72,7 +72,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { return responsePart; } - private void sendStatementRequestBack(Long groupingSdf01Id, List results) { + public void sendStatementRequestBack(Long groupingSdf01Id, List results) { StatementRequest request = new StatementRequest(); request.setGroupId(groupingSdf01Id); request.setAccountCreationResults(results); From 0545a84229c8d6e17f10ca856a9a231a619ed340 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 10 Apr 2023 16:46:52 +0300 Subject: [PATCH 03/39] BankAccountServiceTest --- .../account/config/ValidationConfig.java | 70 ---------------- .../BankAccountValidationConfig.java | 37 +++++---- .../account/service/AccountService.java | 10 ++- .../account/service/BankAccountService.java | 80 ++++++++++--------- .../service/BankAccountServiceTest.java | 65 ++++++++++----- .../common/rules/FieldRequiredRule.java | 15 ++-- 6 files changed, 123 insertions(+), 154 deletions(-) delete mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ValidationConfig.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ValidationConfig.java deleted file mode 100644 index f6e0e1deb..000000000 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ValidationConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package ru.spcex.clearing.account.config; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.account.AccountBalance; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.spcex.clearing.account.validation.AccountValidationRule; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; -import ru.spcex.platform.classes.base.SpcexObjectBase; -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.utils.validation.IValidator; -import ru.spcex.platform.utils.validation.ValidatorImpl; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -@Configuration -public class ValidationConfig { - Logger log = LoggerFactory.getLogger(getClass()); - private final Map> imdgs; - - public ValidationConfig(ImdgProvider imdgProvider) { - log.debug("Init validator config"); - this.imdgs = new HashMap<>(); - BiConsumer> addImdg = (s, aClass) -> imdgs.put(s, imdgProvider.getImdg(s, aClass)); - addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); - addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); - addImdg.accept(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - addImdg.accept(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); - } - - /** - * чтобы во всех валидаторах был один экземпляр Imdg - */ - private Imdg getImdg(String key) { - return imdgs.get(key); - } - - @Bean("bankAccountNewRequestValidator") - public Function bankAccountNewRequestValidator() { - log.debug("Create validator bankAccountNewRequestValidator"); - return bankAccountNewRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(bankAccountNewRequest); - Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); - addImdg.accept(IMDGDistributedNames.Map_Account); - addImdg.accept(IMDGDistributedNames.Map_Company); - addImdg.accept(IMDGDistributedNames.Map_AccountBalance); - - return new ValidatorImpl<>(context, - AccountValidationRule.RequiredFields, - AccountValidationRule.RubRequiredFields, - AccountValidationRule.AccountIsNew, - AccountValidationRule.CompanyPresent - ); - }; - //todo после слияния ветки CLR_51_57 переписать на использование DictionaryPresentRule, FieldRequiredRule - } - -} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 9d0995c17..694ba7b33 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -5,13 +5,11 @@ import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; -import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; @@ -74,12 +72,14 @@ public class BankAccountValidationConfig { CurrencyCode.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), - DictionaryPresentRule.instance("currency", - BankAccountNewRequest::getCurrency, - IMDGDistributedNames.Map_CurrencyCodeDictionary, - CurrencyCodeDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.WrongFieldValue), +// todo currency codes not present in currency_code_dictionary, uncomment when present +// +// DictionaryPresentRule.instance("currency", +// BankAccountNewRequest::getCurrency, +// IMDGDistributedNames.Map_CurrencyCodeDictionary, +// CurrencyCodeDictionary.class, +// AccountError.RequiredFieldEmpty, +// AccountError.WrongFieldValue), FieldRequiredRule.instance("bankIdentificationCode", BankAccountNewRequest::getBankIdentificationCode, AccountError.RequiredFieldEmpty), @@ -168,19 +168,21 @@ public class BankAccountValidationConfig { CurrencyCode.values(), false, AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty), - DictionaryPresentRule.instance("currency", - BankAccountUpdateRequest::getCurrency, - IMDGDistributedNames.Map_CurrencyCodeDictionary, - CurrencyCodeDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.WrongFieldValue, - false) + AccountError.RequiredFieldEmpty) +// todo currency codes not present in currency_code_dictionary, uncomment when present +// +// DictionaryPresentRule.instance("currency", +// BankAccountUpdateRequest::getCurrency, +// IMDGDistributedNames.Map_CurrencyCodeDictionary, +// CurrencyCodeDictionary.class, +// AccountError.RequiredFieldEmpty, +// AccountError.WrongFieldValue, +// false) ); }; } - @Bean("bankAccountUpdateRequestValidator") + @Bean("bankAccountDeleteRequestValidator") public Function bankAccountDeleteRequestValidator( Map> imdgForValidation ) { @@ -189,6 +191,7 @@ public class BankAccountValidationConfig { context.setValidatedObject(bankAccountDeleteRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_BankAccount); + addImdg.accept(IMDGDistributedNames.Map_Account); return new ValidatorImpl<>(context, IdPresentRule.instance("id", CommonDeleteRequest::getId, 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 a3461b62b..b3885b9aa 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 @@ -15,6 +15,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfR import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; 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.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -43,9 +44,12 @@ public class AccountService extends QueueConsumer implements InitializingBean { init(); } - public void accountNew(BaseRequest userRequest) { - AccountSdf01Request req = userRequest.getRequestPayload(); + public RequestInfoUpdate accountNew(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); + + // todo add validation (create task for that?) + + AccountSdf01Request req = userRequest.getRequestPayload(); List accountToStatement = new ArrayList<>(); for (AccountSdfRequestPart accountReq : req.getAccounts()) { Account account = new Account(); @@ -58,6 +62,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { } sendStatementRequestBack(req.getGroupingSdf01Id(), accountToStatement); log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size()); + + return null; } public void accountUpdateWithBrake(BaseRequest userRequest) { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 992297cf5..5132eece9 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -19,18 +19,17 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdate import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; -import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; -import java.util.Optional; import java.util.function.Function; @Service @@ -41,27 +40,37 @@ public class BankAccountService extends QueueConsumer implements InitializingBea private final Imdg relationMap; private final IMessageResolver messageResolver; + private UserRoleVerification userRoleVerification; + private ValidationHelper validationHelper; // private final Imdg userImdg; // private final Imdg userRoleSessionImdg; private final Function bankAccountNewRequestValidator; + private final Function bankAccountUpdateRequestValidator; + private final Function bankAccountDeleteRequestValidator; @Autowired public BankAccountService(Consumer kafkaQueue, Producer kafkaProducer, ImdgProvider imdgProvider, IMessageResolver messageResolver, - + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper, @Qualifier("bankAccountNewRequestValidator") - Function bankAccountNewRequestValidator) { + Function bankAccountNewRequestValidator, + @Qualifier("bankAccountUpdateRequestValidator") + Function bankAccountUpdateRequestValidator, + @Qualifier("bankAccountDeleteRequestValidator") + Function bankAccountDeleteRequestValidator) { super(kafkaQueue, kafkaProducer); this.bankAccountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.relationMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); this.messageResolver = messageResolver; - -// this.userImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_User, User.class); -// this.userRoleSessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_UserRoleSession, UserRoleSession.class); + this.userRoleVerification = userRoleVerification; + this.validationHelper = validationHelper; this.bankAccountNewRequestValidator = bankAccountNewRequestValidator; + this.bankAccountUpdateRequestValidator = bankAccountUpdateRequestValidator; + this.bankAccountDeleteRequestValidator = bankAccountDeleteRequestValidator; } @Override @@ -78,36 +87,17 @@ public class BankAccountService extends QueueConsumer implements InitializingBea init(); } -// protected Optional checkUserRole(Long userId) { -// User user = userImdg.getSingleObjectByID(userId); -// if (user == null) { -// return Optional.of(new EnumMessage(AccountError.userNotFound(5007))); -// } -// UserRoleSession role=userRoleSessionImdg.getSingleObjectBySql("userId="+userId+" and userRoleSessions.userRole='ADMN'"); -// if (role == null) { -// return Optional.of(new EnumMessage(AccountError.userNotFound(5001))); // Нет прав на проведение данной операции». -// } -// return Optional.empty(); -// } - - private RequestInfoUpdate bankAccountNew(BaseRequest userRequest) { - BankAccountNewRequest req = userRequest.getRequestPayload(); - -// // проверка прав -// checkUserRole(req.getUserId()); - // валидация - IValidator validator = bankAccountNewRequestValidator.apply(req); - Optional error = validator.tillFirstError(); - if (error.isPresent()) { - log.warn("BankAccountNewRequest[{}] validation error: {}", userRequest.getId(), error.get()); - String errorMsg = messageResolver.resolve(error.get()); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); - } + public RequestInfoUpdate bankAccountNew(BaseRequest userRequest) { log.debug("BankAccountNewRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountNewRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + BankAccountNewRequest req = userRequest.getRequestPayload(); BankAccount bankAccount = new BankAccount(); bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); bankAccount.setBankName(req.getBankName()); @@ -141,14 +131,21 @@ public class BankAccountService extends QueueConsumer implements InitializingBea accountMap.insert(account); bankAccount.setAccountId(account.getId()); - bankAccountMap.insert(bankAccount); - log.debug("successfully processed, new id {}", bankAccount.getId()); + Long bankAccountId = bankAccountMap.insert(bankAccount); + log.debug("successfully processed, new id {}", bankAccountId); return null; } private RequestInfoUpdate bankAccountUpdate(BaseRequest userRequest) { BankAccountUpdateRequest req = userRequest.getRequestPayload(); log.debug("BankAccountUpdateRequest received id = {}", req.getId()); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountUpdateRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); bankAccount.setBankName(req.getBankName()); @@ -172,6 +169,13 @@ public class BankAccountService extends QueueConsumer implements InitializingBea private RequestInfoUpdate bankAccountDelete(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountDeleteRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + log.debug("CommonDeleteRequest received id = {}", req.getId()); BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 5bfb30923..5f12e42ed 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -16,10 +16,12 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; import ru.clearing.classes.statics.data.company.Company; -import ru.spcex.clearing.account.config.ErrorResolverConfig; +import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.config.KafkaConfigTest; -import ru.spcex.clearing.account.config.ValidationConfig; +import ru.spcex.clearing.account.config.validation.BankAccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ValidationConfig; +import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.account.utils.MatcherFactory.Matcher; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -32,8 +34,11 @@ import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; import javax.annotation.PostConstruct; import java.util.concurrent.atomic.AtomicInteger; @@ -47,9 +52,10 @@ import static ru.spcex.clearing.platform.messaging.service.Status.Error; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { - ErrorResolverConfig.class, BankAccountService.class, ValidationConfig.class, + BankAccountValidationConfig.class, + BeanConfiguration.class, HazelcastServiceTestConfiguration.class, KafkaConfigTest.class}) public class BankAccountServiceTest { @@ -78,6 +84,9 @@ public class BankAccountServiceTest { private Imdg bankAccountImdg; private Imdg accountImdg; + @Autowired + private IMessageResolver messageResolver; + @Autowired @Qualifier("hazelcastServiceTest") private HazelcastService hazelcastServiceTest; @@ -116,6 +125,7 @@ public class BankAccountServiceTest { public void bankAccountNew() { //ARRANGE BankAccount predictableBankAccount = getBankAccount(); + Company company = getTestCompany(); companyImdg.insert(company); Account predictableAccount = getTestAccount(accountId, acc); @@ -160,60 +170,77 @@ public class BankAccountServiceTest { companyImdg.insert(company); BankAccountNewRequest bankAccountNewRequest = getBankAccountNewRequest(predictableBankAccount); + String errMsg; //AccountValidationRule.RequiredFields //WrongFieldValue bankAccountNewRequest.setCurrency(null); - checkError("(5004) args [currency]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "currency")); + checkError(errMsg, bankAccountNewRequest); + + bankAccountNewRequest.setCurrency("TT0"); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "currency")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCurrency(currency); bankAccountNewRequest.setBankIdentificationCode(null); - checkError("(5004) args [bankIdentificationCode]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "bankIdentificationCode")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setBankIdentificationCode(bankIdentificationCode); bankAccountNewRequest.setBankName(null); - checkError("(5004) args [bankName]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "bankName")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setBankName(bankName); bankAccountNewRequest.setAccount(null); - checkError("(5004) args [account]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "account")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setAccount(acc); bankAccountNewRequest.setDestination(null); - checkError("(5004) args [destination]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "destination")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setDestination(destination); bankAccountNewRequest.setCompanyId(null); - checkError("(5004) args [companyId]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "companyId")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCompanyId(addresseeIdNew); //AccountValidationRule.RubRequiredFields - //WrongFieldValue + //RequiredFieldEmpty bankAccountNewRequest.setCorrespondentAccount(null); - checkError("(5004) args [correspondentAccount]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "correspondentAccount")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCorrespondentAccount(correspondentAccount); bankAccountNewRequest.setCorrespondentAccountName(null); - checkError("(5004) args [correspondentAccountName]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "correspondentAccountName")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCorrespondentAccountName(correspondentAccountName); bankAccountNewRequest.setTaxpayerIdentificationNumber(null); - checkError("(5004) args [taxpayerIdentificationNumber]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "taxpayerIdentificationNumber")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setTaxpayerIdentificationNumber(taxpayerIdentificationNumber); bankAccountNewRequest.setTaxRegistrationReasonCode(null); - checkError("(5004) args [taxRegistrationReasonCode]", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "taxRegistrationReasonCode")); + checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setTaxRegistrationReasonCode(taxRegistrationReasonCode); //AccountValidationRule.CompanyPresent //CompanyNotFound bankAccountNewRequest.setCompanyId(999924535239L); - checkError("(5013) args []", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotFound, "companyId")); + checkError(errMsg, bankAccountNewRequest); //CompanyNotActive company.setWorkflowStatus(Status.Blocked.getKey()); companyImdg.insert(company); bankAccountNewRequest.setCompanyId(company.getId()); - checkError("(5014) args []", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotActive, "companyId")); + checkError(errMsg, bankAccountNewRequest); //AccountValidationRule.AccountIsNew //AccountAlreadyExist @@ -221,7 +248,8 @@ public class BankAccountServiceTest { companyImdg.insert(company); Account existAccount = getTestAccount(accountId, acc); accountImdg.insert(existAccount); - checkError("(5010) args []", bankAccountNewRequest); + errMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist, "account")); + checkError(errMsg, bankAccountNewRequest); accountImdg.delete(existAccount); } @@ -282,7 +310,7 @@ public class BankAccountServiceTest { predictableUpdateBankAccount.setBankIdentificationCode("88888"); predictableUpdateBankAccount.setCorrespondentAccount("894984646541316"); predictableUpdateBankAccount.setCorrespondentAccountName("BIK OF NEW BUNK"); - predictableUpdateBankAccount.setCurrency("EU"); + predictableUpdateBankAccount.setCurrency("RUB"); predictableUpdateBankAccount.setDestination("OOO NEW BUNK"); predictableUpdateBankAccount.setTaxpayerIdentificationNumber("65468461321"); predictableUpdateBankAccount.setTaxRegistrationReasonCode("532137"); @@ -332,6 +360,7 @@ public class BankAccountServiceTest { bankAccountImdg.insert(bankAccountExists); Account account = new Account(); account.setId(accountId); + account.setAccountStatus(WorkflowStatus.Active.getKey()); accountImdg.insert(account); CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest(); diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java index ca46f4519..43c6e0e0a 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java @@ -15,7 +15,7 @@ import java.util.function.Function; * @param fieldName Название поля * @param getter Метод получения значения * @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если поле пустое - * @param additionalChecks Дополнительные проверки, связанные с этим полем. Выполняются при required == true + * @param additionalChecks Дополнительные проверки, связанные с этим полем * @param required Флаг обязательности поля * @param Класс проверяемого объекта * @param Класс проверяемого значения @@ -32,7 +32,7 @@ public record FieldRequiredRule( * @param fieldName Название поля * @param getter Метод получения значения * @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если поле пустое - * @param additionalChecks Дополнительные проверки, связанные с этим полем. Выполняются при required == true + * @param additionalChecks Дополнительные проверки, связанные с этим полем * @param required Флаг обязательности поля * @param Класс проверяемого объекта * @param Класс проверяемого значения @@ -68,13 +68,10 @@ public record FieldRequiredRule( public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); V value = getter.apply(validatedObject); - if (required) { - if (value == null) return of(errorEmptyRequiredValue, fieldName); - for (Function additionalCheck : additionalChecks) { - IErrorEnumId validationError = additionalCheck.apply(value); - if (validationError != null) - return of(validationError, fieldName); - } + if (required && value == null) return of(errorEmptyRequiredValue, fieldName); + for (Function additionalCheck : additionalChecks) { + IErrorEnumId validationError = additionalCheck.apply(value); + if (validationError != null) return of(validationError, fieldName); } return empty(); } From c01d1ba0c6f7c8ecf9149eff9675e06f03fdf1b7 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 11 Apr 2023 16:31:14 +0300 Subject: [PATCH 04/39] remove redundant validation rules --- .../BankAccountValidationConfig.java | 42 +------------------ 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 694ba7b33..6fe593523 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -88,47 +88,7 @@ public class BankAccountValidationConfig { AccountError.RequiredFieldEmpty), FieldRequiredRule.instance("destination", BankAccountNewRequest::getDestination, - AccountError.RequiredFieldEmpty), - FieldRequiredRule.instance("correspondentAccount", - BankAccountNewRequest::getCorrespondentAccount, - AccountError.RequiredFieldEmpty, - false, - correspondentAccount -> { - String currency = bankAccountNewRequest.getCurrency(); - if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && correspondentAccount == null) - return AccountError.RequiredFieldEmpty; - return null; - }), - FieldRequiredRule.instance("correspondentAccountName", - BankAccountNewRequest::getCorrespondentAccountName, - AccountError.RequiredFieldEmpty, - false, - correspondentAccountName -> { - String currency = bankAccountNewRequest.getCurrency(); - if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && correspondentAccountName == null) - return AccountError.RequiredFieldEmpty; - return null; - }), - FieldRequiredRule.instance("taxpayerIdentificationNumber", - BankAccountNewRequest::getTaxpayerIdentificationNumber, - AccountError.RequiredFieldEmpty, - false, - taxpayerIdentificationNumber -> { - String currency = bankAccountNewRequest.getCurrency(); - if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && taxpayerIdentificationNumber == null) - return AccountError.RequiredFieldEmpty; - return null; - }), - FieldRequiredRule.instance("taxRegistrationReasonCode", - BankAccountNewRequest::getTaxRegistrationReasonCode, - AccountError.RequiredFieldEmpty, - false, - taxRegistrationReasonCode -> { - String currency = bankAccountNewRequest.getCurrency(); - if (CurrencyCode.RUB.getKey().equalsIgnoreCase(currency) && taxRegistrationReasonCode == null) - return AccountError.RequiredFieldEmpty; - return null; - }) + AccountError.RequiredFieldEmpty) ); }; } From 44ee51994aca0acf5a2e45c750c3fc613c155bb8 Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 14 Apr 2023 14:14:09 +0300 Subject: [PATCH 05/39] AccountValidation (in progress) --- .../validation/AccountValidationConfig.java | 162 ++++++++++++++++++ .../BankAccountValidationConfig.java | 16 +- .../config/validation/ValidationConfig.java | 1 + .../clearing/account/errors/AccountError.java | 2 +- .../domain/cud/account/AccountNewRequest.java | 49 ++++++ .../cud/account/AccountUpdateRequest.java | 60 +++++++ 6 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java 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 new file mode 100644 index 000000000..5f54f0982 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -0,0 +1,162 @@ +package ru.spcex.clearing.account.config.validation; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; +import ru.spcex.clearing.validation.common.rules.EnumPresentRule; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.WorkflowStatus; +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.utils.enumeration.IErrorEnumId; +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 { + + @Bean("bankAccountNewRequestValidator") + public Function accountNewRequestValidator( + Map> imdgForValidation + ) { + return accountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + AccountNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), + FieldRequiredRule.instance("account", + AccountNewRequest::getAccount, + AccountError.RequiredFieldEmpty, + accountValue -> { + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); + if (accounts.isEmpty()) return null; + return AccountError.AccountAlreadyExist; + }), + FieldRequiredRule.instance("status", + AccountNewRequest::getStatus, + AccountError.RequiredFieldEmpty, + false, + statusValue -> { + if (statusValue == null || AccountStatus.ACTIVE.getKey().equalsIgnoreCase(statusValue)) + return null; + return AccountError.WrongFieldValue; + }), + EnumPresentRule.instance("accountType", + AccountNewRequest::getAccountType, + AccountType.values(), + AccountError.WrongFieldValue, + AccountError.RequiredFieldEmpty), + DictionaryPresentRule.instance("accountType", + AccountNewRequest::getAccountType, + IMDGDistributedNames.Map_AccountTypeDictionary, + AccountTypeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue) + ); + }; + } + + @Bean("bankAccountUpdateRequestValidator") + public Function accountUpdateRequestValidator( + Map> imdgForValidation + ) { + return accountUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountUpdateRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + AccountUpdateRequest::getId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound, + account -> { + String statusFromRequest = accountUpdateRequest.getStatus(); + if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus())) + return AccountError.WrongFieldValue; + return null; + }), + IdPresentRule.instance("companyId", + AccountUpdateRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + false, + company -> { + IErrorEnumId error = WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; + error = Objects.equals(company.getId(), accountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; + return error; + }), + EnumPresentRule.instance("status", + AccountUpdateRequest::getStatus, + AccountStatus.values(), + false, + AccountError.WrongFieldValue, + AccountError.RequiredFieldEmpty), + FieldRequiredRule.instance("status", + AccountUpdateRequest::getStatus, + AccountError.RequiredFieldEmpty, + false, + statusValue -> { + if (statusValue != null && !Status.Active.getKey().equalsIgnoreCase(statusValue)) + return AccountError.WrongFieldValue; + return null; + }), + EnumPresentRule.instance("accountType", + AccountUpdateRequest::getAccountType, + AccountType.values(), + AccountError.WrongFieldValue, + AccountError.RequiredFieldEmpty), + DictionaryPresentRule.instance("accountType", + AccountUpdateRequest::getAccountType, + IMDGDistributedNames.Map_AccountTypeDictionary, + AccountTypeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue) + ); + }; + } + +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 6fe593523..cce803501 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -14,8 +14,8 @@ import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.CurrencyCode; -import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -61,7 +61,7 @@ public class BankAccountValidationConfig { ); ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); - ImdgPredicate accountStatusPredicate = pb.equals("accountStatus", Status.Active.getKey()); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate); Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); if (accounts.isEmpty()) return null; @@ -111,15 +111,15 @@ public class BankAccountValidationConfig { IMDGDistributedNames.Map_BankAccount, BankAccount.class, AccountError.RequiredFieldEmpty, - AccountError.BankAccountNotFound, + AccountError.AccountNotFound, bankAccount -> { Long accountId = bankAccount.getAccountId(); Imdg accountImdg = context.obtainMap( IMDGDistributedNames.Map_Account, Account.class ); Account account = accountImdg.getSingleObjectByID(accountId); - if (account == null) return AccountError.BankAccountNotFound; - if (!WorkflowStatus.Active.getKey().equalsIgnoreCase(account.getAccountStatus())) + if (account == null) return AccountError.AccountNotFound; + if (!AccountStatus.ACTIVE.getKey().equalsIgnoreCase(account.getStatus())) return AccountError.AccountNotActive; return null; }), @@ -158,15 +158,15 @@ public class BankAccountValidationConfig { IMDGDistributedNames.Map_BankAccount, BankAccount.class, AccountError.RequiredFieldEmpty, - AccountError.BankAccountNotFound, + AccountError.AccountNotFound, bankAccount -> { Long accountId = bankAccount.getAccountId(); Imdg accountImdg = context.obtainMap( IMDGDistributedNames.Map_Account, Account.class ); Account account = accountImdg.getSingleObjectByID(accountId); - if (account == null) return AccountError.BankAccountNotFound; - if (!WorkflowStatus.Active.getKey().equalsIgnoreCase(account.getAccountStatus())) + if (account == null) return AccountError.AccountNotFound; + if (!AccountStatus.ACTIVE.getKey().equalsIgnoreCase(account.getStatus())) return AccountError.AccountNotActive; return null; }) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index 879f5b85c..a606cf3b0 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -28,6 +28,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); 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 fef804c81..39a7978ff 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 @@ -7,7 +7,7 @@ public enum AccountError implements IErrorEnumId { RequiredFieldEmpty(5002L), WrongFieldValue(5004L), AccountAlreadyExist(5010L), - BankAccountNotFound(5011L), + AccountNotFound(5011L), AccountNotActive(5012L), CompanyNotFound(5013L), CompanyNotActive(5014L), diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java new file mode 100644 index 000000000..f91db426e --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java @@ -0,0 +1,49 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AccountNewRequest { + @JsonProperty + public Long companyId; + + @JsonProperty + public String account; + + @JsonProperty + public String status; + + @JsonProperty + public String accountType; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java new file mode 100644 index 000000000..a3f29488e --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java @@ -0,0 +1,60 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AccountUpdateRequest { + @JsonProperty + public Long id; + + @JsonProperty + public Long companyId; + + @JsonProperty + public String account; + + @JsonProperty + public String status; + + @JsonProperty + public String accountType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } +} From c1c5ec4c9cbf2f37e58fa4b973554fc68df769e1 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 11:52:59 +0300 Subject: [PATCH 06/39] Account: new account request --- .../validation/AccountValidationConfig.java | 47 ++++-- .../config/validation/ValidationConfig.java | 2 + .../account/service/AccountService.java | 136 +++++++++++++++++- .../account/service/AccountServiceTest.java | 4 +- .../balance/service/StatementService.java | 2 +- .../service/StatementServiceServiceTest.java | 2 +- .../spcex/platform/enumeration/Service.java | 2 +- .../platform/messaging/domain/Consts.java | 7 +- 8 files changed, 178 insertions(+), 24 deletions(-) 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 5f54f0982..d545be8ab 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 @@ -9,6 +9,7 @@ import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; @@ -16,7 +17,6 @@ import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -35,7 +35,7 @@ import java.util.function.Function; @Configuration public class AccountValidationConfig { - @Bean("bankAccountNewRequestValidator") + @Bean("accountNewRequestValidator") public Function accountNewRequestValidator( Map> imdgForValidation ) { @@ -88,12 +88,16 @@ public class AccountValidationConfig { IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, - AccountError.WrongFieldValue) + AccountError.WrongFieldValue, + accountType -> { + if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null; + return AccountError.WrongFieldValue; + }) ); }; } - @Bean("bankAccountUpdateRequestValidator") + @Bean("accountUpdateRequestValidator") public Function accountUpdateRequestValidator( Map> imdgForValidation ) { @@ -135,15 +139,6 @@ public class AccountValidationConfig { false, AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), - FieldRequiredRule.instance("status", - AccountUpdateRequest::getStatus, - AccountError.RequiredFieldEmpty, - false, - statusValue -> { - if (statusValue != null && !Status.Active.getKey().equalsIgnoreCase(statusValue)) - return AccountError.WrongFieldValue; - return null; - }), EnumPresentRule.instance("accountType", AccountUpdateRequest::getAccountType, AccountType.values(), @@ -154,7 +149,31 @@ public class AccountValidationConfig { IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, - AccountError.WrongFieldValue) + AccountError.WrongFieldValue, + accountType -> { + if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null; + return AccountError.WrongFieldValue; + }) + ); + }; + } + + @Bean("accountBlockRequestValidator") + public Function accountBlockRequestValidator( + Map> imdgForValidation + ) { + return accountDeleteRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountDeleteRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + CommonDeleteRequest::getId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound) ); }; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index a606cf3b0..537073f68 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -27,6 +28,7 @@ public class ValidationConfig { BiConsumer> addImdg = (s, aClass) -> imdg.put(s, imdgProvider.getImdg(s, aClass)); addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); + addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); 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 b3885b9aa..96edca925 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 @@ -5,46 +5,174 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.account.errors.AccountError; 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.AccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +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.Allowed; +import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +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.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.function.Function; @Service public class AccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg accountMap; + private final Imdg clearingMemberCategoryMap; + private final Imdg relationMap; private final KafkaSender kafkaSender; + private final IMessageResolver messageResolver; + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + private final Function accountNewRequestValidator; + private final Function accountUpdateRequestValidator; + private final Function accountBlockRequestValidator; @Autowired - public AccountService(Consumer kafkaQueue, ImdgProvider imdgProvider, KafkaSender kafkaSender) { + public AccountService(Consumer kafkaQueue, + ImdgProvider imdgProvider, + KafkaSender kafkaSender, + IMessageResolver messageResolver, + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper, + @Qualifier("accountNewRequestValidator") + Function accountNewRequestValidator, + @Qualifier("accountUpdateRequestValidator") + Function accountUpdateRequestValidator, + @Qualifier("accountBlockRequestValidator") + Function accountBlockRequestValidator) { super(kafkaQueue); - this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.accountMap = imdgProvider.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + this.clearingMemberCategoryMap = imdgProvider.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + this.relationMap = imdgProvider.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); this.kafkaSender = kafkaSender; + this.messageResolver = messageResolver; + this.userRoleVerification = userRoleVerification; + this.validationHelper = validationHelper; + this.accountNewRequestValidator = accountNewRequestValidator; + this.accountUpdateRequestValidator = accountUpdateRequestValidator; + this.accountBlockRequestValidator = accountBlockRequestValidator; } @Override public void afterPropertiesSet() { callback(AccountSdf01Request.class) + .setConsumer(this::accountNewSdf01) + .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put); + callback(AccountNewRequest.class) .setConsumer(this::accountNew) - .forDestination(Consts.ACCOUNT_NEW, callbacks::put); + .forDestination(Consts.DESTINATION_ACCOUNT_NEW, callbacks::put); init(); } - public RequestInfoUpdate accountNew(BaseRequest userRequest) { + public RequestInfoUpdate accountNew(BaseRequest userRequest) { + log.debug("AccountNewRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + AccountNewRequest req = userRequest.getRequestPayload(); + + Long companyId = req.getCompanyId(); + ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); + ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); + Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); + + // todo выяснить у репортера, что делать в такой ситуации (нужна ли отдельная ошибка) + if (clearingMemberCategories.isEmpty()) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errMsg); + } + if (clearingMemberCategories.size() > 1) { + log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); + } + + ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); + ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); + ImdgPredicate servicePredicate = null; + ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); + String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); + if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); + } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); + } else { + // todo выяснить у репортера, что делать в такой ситуации + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errMsg); + } + ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); + Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); + if (relations.isEmpty()) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errMsg); + } + if (relations.size() > 1) { + log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); + } + Relation relation = relations.iterator().next(); + + Account account = new Account(); + account.setAccount(req.getAccount()); + account.setAccountType(req.getAccountType()); + account.setRelationId(relation.getId()); + account.setStatus(req.getStatus()); + account.setProcessingSign(Allowed.ALLOWED.getKey()); + account.setCompanyId(req.getCompanyId()); + Long id = accountMap.insert(account); + + log.debug("successfully processed, new account id {}", id); + return null; + } + + public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); // todo add validation (create task for that?) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 50e495b0b..89d62b90c 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -50,7 +50,7 @@ class AccountServiceTest { public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); public static final MatcherFactory.Matcher REQUEST_INFO_MATCHER_MATCHER = usingIgnoringFieldsComparator("created"); private static final int PARTITION = 0; - private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW; + private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01; private static final String account = "123456789123"; @Autowired AccountService accountService; @@ -64,7 +64,7 @@ class AccountServiceTest { private MockProducer producer; /** - * {@link AccountService#accountNew(BaseRequest)}
+ * {@link AccountService#accountNewSdf01(BaseRequest)}
* Тест проверяет создание сущности {@link BaseRequest} в Hazelcast при передаче из Apache Kafka.
* Входной запрос {@link AccountSdf01Request}:
* {@link AccountSdfRequestPart#setSdfId} - текущий Id
diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index 37495b876..c2125fe09 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -106,7 +106,7 @@ public class StatementService extends QueueConsumer implements InitializingBean exportRequest.setNameOfTable(service.exportTableName()); kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); } else { - kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); + kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); } } diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java index 5d39a8926..9759178f4 100644 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java @@ -130,7 +130,7 @@ class StatementServiceServiceTest extends AbstractServiceTest { BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); - assertEquals(Consts.ACCOUNT_NEW, producerRecord.getValue().topic()); + assertEquals(Consts.ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); assertNotNull(baseRequest); assertNotNull(resultRequestInfo); } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java index 2fd271c0a..b84fde000 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum Service implements IEnumKey { - MKR("MKR"); + MKR("MKR"), FOND("FOND"); private final String key; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index fddd74586..4eeca343f 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -57,6 +57,11 @@ public interface Consts { String DESTINATION_BANK_ACCOUNT_DELETE = "bank-account-delete"; String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; + + String DESTINATION_ACCOUNT_NEW = "account-new"; + String DESTINATION_ACCOUNT_UPDATE = "account-update"; + String DESTINATION_ACCOUNT_BLOCK = "account-block"; + String DESTINATION_RELATION_UPDATE = "relation-update"; String DESTINATION_PROFILE_DOCUMENT_NEW = "profile-document-new"; String DESTINATION_PROFILE_DOCUMENT_UPDATE = "profile-document-update"; @@ -75,7 +80,7 @@ public interface Consts { String SDF03_PROCESS = "sdf03-process"; String SDF11_PROCESS = "sdf11-process"; String EXPORT_PROCESS = "export-process"; - String ACCOUNT_NEW = "account-new"; + String ACCOUNT_NEW_SDF01 = "account-new-sdf01"; String ACCOUNT_TERMINATION = "account-termination"; String BALANCE_ACCOUNT_NEW = "balance-account-new"; String BALANCE_ACCOUNT_UPDATE = "balance-account-update"; From 54e828432dbc88cd773d4abfc14c103d3dc8d7f1 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 12:48:04 +0300 Subject: [PATCH 07/39] Account: update and block request --- .../validation/AccountValidationConfig.java | 52 ++++---- .../account/service/AccountService.java | 117 +++++++++++++----- .../platform/messaging/domain/Consts.java | 6 +- ...va => AccountCorrespondentNewRequest.java} | 2 +- ...=> AccountCorrespondentUpdateRequest.java} | 2 +- 5 files changed, 118 insertions(+), 61 deletions(-) rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountNewRequest.java => AccountCorrespondentNewRequest.java} (95%) rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountUpdateRequest.java => AccountCorrespondentUpdateRequest.java} (95%) 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 d545be8ab..0f8ef132d 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 @@ -7,8 +7,8 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.AccountTypeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; @@ -35,27 +35,27 @@ import java.util.function.Function; @Configuration public class AccountValidationConfig { - @Bean("accountNewRequestValidator") - public Function accountNewRequestValidator( + @Bean("accountCorrespondentNewRequestValidator") + public Function accountCorrespondentNewRequestValidator( Map> imdgForValidation ) { - return accountNewRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountNewRequest); + return accountCorrespondentNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountCorrespondentNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", - AccountNewRequest::getCompanyId, + AccountCorrespondentNewRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, AccountError.CompanyNotFound, company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), FieldRequiredRule.instance("account", - AccountNewRequest::getAccount, + AccountCorrespondentNewRequest::getAccount, AccountError.RequiredFieldEmpty, accountValue -> { Imdg accountImdg = context.obtainMap( @@ -70,7 +70,7 @@ public class AccountValidationConfig { return AccountError.AccountAlreadyExist; }), FieldRequiredRule.instance("status", - AccountNewRequest::getStatus, + AccountCorrespondentNewRequest::getStatus, AccountError.RequiredFieldEmpty, false, statusValue -> { @@ -79,12 +79,12 @@ public class AccountValidationConfig { return AccountError.WrongFieldValue; }), EnumPresentRule.instance("accountType", - AccountNewRequest::getAccountType, + AccountCorrespondentNewRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountNewRequest::getAccountType, + AccountCorrespondentNewRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -97,32 +97,32 @@ public class AccountValidationConfig { }; } - @Bean("accountUpdateRequestValidator") - public Function accountUpdateRequestValidator( + @Bean("accountCorrespondentUpdateRequestValidator") + public Function accountCorrespondentUpdateRequestValidator( Map> imdgForValidation ) { - return accountUpdateRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountUpdateRequest); + return accountCorrespondentUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(accountCorrespondentUpdateRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("id", - AccountUpdateRequest::getId, + AccountCorrespondentUpdateRequest::getId, IMDGDistributedNames.Map_Account, Account.class, AccountError.RequiredFieldEmpty, AccountError.AccountNotFound, account -> { - String statusFromRequest = accountUpdateRequest.getStatus(); + String statusFromRequest = accountCorrespondentUpdateRequest.getStatus(); if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus())) return AccountError.WrongFieldValue; return null; }), IdPresentRule.instance("companyId", - AccountUpdateRequest::getCompanyId, + AccountCorrespondentUpdateRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, @@ -130,22 +130,22 @@ public class AccountValidationConfig { false, company -> { IErrorEnumId error = WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; - error = Objects.equals(company.getId(), accountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; + error = Objects.equals(company.getId(), accountCorrespondentUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; return error; }), EnumPresentRule.instance("status", - AccountUpdateRequest::getStatus, + AccountCorrespondentUpdateRequest::getStatus, AccountStatus.values(), false, AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), EnumPresentRule.instance("accountType", - AccountUpdateRequest::getAccountType, + AccountCorrespondentUpdateRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountUpdateRequest::getAccountType, + AccountCorrespondentUpdateRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -158,8 +158,8 @@ public class AccountValidationConfig { }; } - @Bean("accountBlockRequestValidator") - public Function accountBlockRequestValidator( + @Bean("accountCorrespondentBlockRequestValidator") + public Function accountCorrespondentBlockRequestValidator( Map> imdgForValidation ) { return accountDeleteRequest -> { 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 96edca925..5c6f56581 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 @@ -14,8 +14,8 @@ import ru.spcex.clearing.account.errors.AccountError; 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.AccountNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; @@ -27,6 +27,7 @@ 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.AccountStatus; import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.imdg.api.Imdg; @@ -41,6 +42,7 @@ import ru.spcex.platform.utils.validation.IValidator; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.function.Function; @Service @@ -53,8 +55,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { private final IMessageResolver messageResolver; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; - private final Function accountNewRequestValidator; - private final Function accountUpdateRequestValidator; + private final Function accountNewRequestValidator; + private final Function accountUpdateRequestValidator; private final Function accountBlockRequestValidator; @Autowired @@ -64,11 +66,11 @@ public class AccountService extends QueueConsumer implements InitializingBean { IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, - @Qualifier("accountNewRequestValidator") - Function accountNewRequestValidator, - @Qualifier("accountUpdateRequestValidator") - Function accountUpdateRequestValidator, - @Qualifier("accountBlockRequestValidator") + @Qualifier("accountCorrespondentNewRequestValidator") + Function accountNewRequestValidator, + @Qualifier("accountCorrespondentUpdateRequestValidator") + Function accountUpdateRequestValidator, + @Qualifier("accountCorrespondentBlockRequestValidator") Function accountBlockRequestValidator) { super(kafkaQueue); this.accountMap = imdgProvider.getImdg( @@ -94,14 +96,20 @@ public class AccountService extends QueueConsumer implements InitializingBean { callback(AccountSdf01Request.class) .setConsumer(this::accountNewSdf01) .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put); - callback(AccountNewRequest.class) - .setConsumer(this::accountNew) - .forDestination(Consts.DESTINATION_ACCOUNT_NEW, callbacks::put); + callback(AccountCorrespondentNewRequest.class) + .setConsumer(this::accountCorrespondentNew) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_NEW, callbacks::put); + callback(AccountCorrespondentUpdateRequest.class) + .setConsumer(this::accountCorrespondentUpdate) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setConsumer(this::accountCorrespondentBlock) + .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK, callbacks::put); init(); } - public RequestInfoUpdate accountNew(BaseRequest userRequest) { - log.debug("AccountNewRequest received"); + public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) { + log.debug("AccountCorrespondentNewRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; @@ -109,7 +117,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; - AccountNewRequest req = userRequest.getRequestPayload(); + AccountCorrespondentNewRequest req = userRequest.getRequestPayload(); Long companyId = req.getCompanyId(); ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); @@ -118,11 +126,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { // todo выяснить у репортера, что делать в такой ситуации (нужна ли отдельная ошибка) if (clearingMemberCategories.isEmpty()) { - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } if (clearingMemberCategories.size() > 1) { log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); @@ -139,20 +143,12 @@ public class AccountService extends QueueConsumer implements InitializingBean { servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); } else { // todo выяснить у репортера, что делать в такой ситуации - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); if (relations.isEmpty()) { - String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "companyId")); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errMsg); + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); } if (relations.size() > 1) { log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); @@ -172,6 +168,58 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } + public RequestInfoUpdate accountCorrespondentUpdate(BaseRequest userRequest) { + log.debug("AccountCorrespondentUpdateRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountUpdateRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + AccountCorrespondentUpdateRequest request = userRequest.getRequestPayload(); + + Account account = accountMap.getSingleObjectByID(request.getId()); + + if (request.getAccount() != null && !account.getAccount().equalsIgnoreCase(request.getAccount())) + return makeError(AccountError.WrongFieldValue, "account", userRequest.getId()); + account.setAccount(request.getAccount()); + + if (request.getCompanyId() != null && !Objects.equals(account.getCompanyId(), request.getCompanyId())) + return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); + + if (request.getAccountType() != null && !account.getAccountType().equalsIgnoreCase(request.getAccountType())) + return makeError(AccountError.WrongFieldValue, "accountType", userRequest.getId()); + + if (request.getStatus() != null && !account.getStatus().equalsIgnoreCase(request.getStatus())) + return makeError(AccountError.WrongFieldValue, "status", userRequest.getId()); + + accountMap.update(account); + + log.debug("successfully processed, update account id {}", account.getId()); + return null; + } + + public RequestInfoUpdate accountCorrespondentBlock(BaseRequest userRequest) { + log.debug("AccountBlockRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountBlockRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + CommonDeleteRequest request = userRequest.getRequestPayload(); + + Account account = accountMap.getSingleObjectByID(request.getId()); + account.setStatus(AccountStatus.BLOCKED.getKey()); + + accountMap.update(account); + + log.debug("successfully processed, block account id {}", account.getId()); + return null; + } + public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); @@ -212,4 +260,13 @@ public class AccountService extends QueueConsumer implements InitializingBean { request.setAccountCreationResults(results); kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request); } + + private RequestInfoUpdate makeError(AccountError accountError, String fieldName, Long reqId) { + String errMsg = messageResolver.resolve(new EnumMessage(accountError, fieldName)); + return new RequestInfoUpdate() + .setId(reqId) + .setStatus(Status.Error) + .setMessage(errMsg); + } + } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 4eeca343f..baa420397 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -58,9 +58,9 @@ public interface Consts { String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; - String DESTINATION_ACCOUNT_NEW = "account-new"; - String DESTINATION_ACCOUNT_UPDATE = "account-update"; - String DESTINATION_ACCOUNT_BLOCK = "account-block"; + String DESTINATION_ACCOUNT_CORRESPONDENT_NEW = "account-correspondent-new"; + String DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE = "account-correspondent-update"; + String DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK = "account-correspondent-block"; String DESTINATION_RELATION_UPDATE = "relation-update"; String DESTINATION_PROFILE_DOCUMENT_NEW = "profile-document-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java index f91db426e..aa02bd1c6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountNewRequest { +public class AccountCorrespondentNewRequest { @JsonProperty public Long companyId; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java index a3f29488e..d3fb5eb9c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountUpdateRequest { +public class AccountCorrespondentUpdateRequest { @JsonProperty public Long id; From c442dfb1fecbb37217855bfaff3ea0d98c07df2b Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 12:56:08 +0300 Subject: [PATCH 08/39] AccountServiceTest --- .../account/service/AccountServiceTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 89d62b90c..b058fd211 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -63,6 +63,21 @@ class AccountServiceTest { @SpyBean private MockProducer producer; + @Test + void accountCorrespondentNew() { + + } + + @Test + void accountCorrespondentUpdate() { + + } + + @Test + void accountCorrespondentBlock() { + + } + /** * {@link AccountService#accountNewSdf01(BaseRequest)}
* Тест проверяет создание сущности {@link BaseRequest} в Hazelcast при передаче из Apache Kafka.
@@ -74,7 +89,7 @@ class AccountServiceTest { * {@link AccountSdf01Request#setAccounts} - Collections.singletonList(AccountSdfRequestPart)
*/ @Test - void accountNew() throws InterruptedException { + void accountSdf01New() throws InterruptedException { //ARRANGE Long firstID = currentID.getAndIncrement(); Long secondID = currentID.getAndIncrement(); From df9458b4ed9738fbe4204973f3beada1bcf0aa9c Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 16:19:37 +0300 Subject: [PATCH 09/39] AccountServiceTest (update/new) --- .../account/service/AccountService.java | 18 +-- .../account/service/AccountServiceTest.java | 126 +++++++++++++++++- .../service/BankAccountServiceTest.java | 2 +- 3 files changed, 135 insertions(+), 11 deletions(-) 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 5c6f56581..a91c7a791 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,6 +1,7 @@ package ru.spcex.clearing.account.service; import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -39,10 +40,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Function; @Service @@ -61,6 +59,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { @Autowired public AccountService(Consumer kafkaQueue, + Producer kafkaProducer, ImdgProvider imdgProvider, KafkaSender kafkaSender, IMessageResolver messageResolver, @@ -72,7 +71,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { Function accountUpdateRequestValidator, @Qualifier("accountCorrespondentBlockRequestValidator") Function accountBlockRequestValidator) { - super(kafkaQueue); + super(kafkaQueue, kafkaProducer); this.accountMap = imdgProvider.getImdg( IMDGDistributedNames.Map_Account, Account.class ); @@ -155,12 +154,15 @@ public class AccountService extends QueueConsumer implements InitializingBean { } Relation relation = relations.iterator().next(); + Collection companies = accountMap.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); + Account account = new Account(); account.setAccount(req.getAccount()); account.setAccountType(req.getAccountType()); account.setRelationId(relation.getId()); account.setStatus(req.getStatus()); - account.setProcessingSign(Allowed.ALLOWED.getKey()); + // todo выяснить у репортера, что писать в это поле если это не первый счет компании + account.setProcessingSign(companies.isEmpty() ? Allowed.ALLOWED.getKey() : null); account.setCompanyId(req.getCompanyId()); Long id = accountMap.insert(account); @@ -181,9 +183,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { Account account = accountMap.getSingleObjectByID(request.getId()); - if (request.getAccount() != null && !account.getAccount().equalsIgnoreCase(request.getAccount())) - return makeError(AccountError.WrongFieldValue, "account", userRequest.getId()); - account.setAccount(request.getAccount()); + if (request.getAccount() != null) account.setAccount(request.getAccount()); if (request.getCompanyId() != null && !Objects.equals(account.getCompanyId(), request.getCompanyId())) return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index b058fd211..6f58dae0c 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -15,34 +15,50 @@ import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.config.validation.AccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ValidationConfig; import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; 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.AccountCorrespondentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfo; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import javax.annotation.PostConstruct; import java.util.Collections; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration.currentID; import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; -import static ru.spcex.clearing.account.utils.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.account.utils.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, + AccountValidationConfig.class, AccountService.class, HazelcastServiceTestConfiguration.class, KafkaConfigTest.class}) @@ -52,6 +68,8 @@ class AccountServiceTest { private static final int PARTITION = 0; private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01; private static final String account = "123456789123"; + private static final Long companyId = 0L; + private static final Long relationId = 0L; @Autowired AccountService accountService; @Autowired @@ -63,14 +81,120 @@ class AccountServiceTest { @SpyBean private MockProducer producer; + private Imdg accountImdg; + private Imdg companyImdg; + private Imdg accountTypeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg relationImdg; + + @PostConstruct + private void init() { + hazelcastServiceTest.waitAvailable(); + accountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + companyImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Company, Company.class + ); + accountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class + ); + clearingMemberCategoryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + relationImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); + + Company company = new Company(); + company.setId(companyId); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + companyImdg.insert(company); + + AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); + accountTypeDictionary.setCode(AccountType.Corr.getKey()); + accountTypeDictionary.setName(AccountType.Corr.getKey()); + accountTypeDictionaryImdg.insert(accountTypeDictionary); + + ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); + clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey()); + clearingMemberCategory.setCompanyId(companyId); + clearingMemberCategoryImdg.insert(clearingMemberCategory); + + Relation relation = new Relation(); + relation.setId(relationId); + relation.setConsumerId(companyId); + relation.setService(Service.MKR.getKey()); + relationImdg.insert(relation); + } + @Test void accountCorrespondentNew() { + AccountCorrespondentNewRequest accountCorrespondentNewRequest = new AccountCorrespondentNewRequest(); + accountCorrespondentNewRequest.setAccount(account); + accountCorrespondentNewRequest.setAccountType(AccountType.Corr.getKey()); + accountCorrespondentNewRequest.setCompanyId(companyId); + accountCorrespondentNewRequest.setStatus(AccountStatus.ACTIVE.getKey()); + + Account predictableAccount = new Account(); + predictableAccount.setAccount(account); + predictableAccount.setAccountType(AccountType.Corr.getKey()); + predictableAccount.setCompanyId(companyId); + predictableAccount.setProcessingSign(Allowed.ALLOWED.getKey()); + predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); + predictableAccount.setRelationId(relationId); + + String jsonString = getJsonStringForNew(accountCorrespondentNewRequest, 0L); + + addRecordToKafka((MockConsumer) accountService.getConsumer(), + Consts.DESTINATION_ACCOUNT_CORRESPONDENT_NEW, + PARTITION, + 0, + jsonString); + + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account resultNew = accountImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)).iterator().next(); + predictableAccount.setId(resultNew.getId()); + ACCOUNT_MATCHER.assertMatch(resultNew, predictableAccount); } @Test void accountCorrespondentUpdate() { + String updatedAccount = account + "_updated"; + Account existAccount = new Account(); + existAccount.setAccount(account); + existAccount.setAccountType(AccountType.Corr.getKey()); + existAccount.setStatus(AccountStatus.ACTIVE.getKey()); + existAccount.setCompanyId(companyId); + Long accountId = accountImdg.insert(existAccount); + + AccountCorrespondentUpdateRequest accountCorrespondentUpdateRequest = new AccountCorrespondentUpdateRequest(); + accountCorrespondentUpdateRequest.setAccount(updatedAccount); + accountCorrespondentUpdateRequest.setAccountType(AccountType.Corr.getKey()); + accountCorrespondentUpdateRequest.setStatus(AccountStatus.ACTIVE.getKey()); + accountCorrespondentUpdateRequest.setCompanyId(companyId); + accountCorrespondentUpdateRequest.setId(accountId); + + + String jsonString = getJsonStringForUPDATE(accountCorrespondentUpdateRequest, 0); + + //ACT + addRecordToKafka((MockConsumer) accountService.getConsumer(), + Consts.DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE, + PARTITION, + 0, + jsonString); + + //ASSERT + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + existAccount.setAccount(updatedAccount); + + Account resultUpdating = accountImdg.getSingleObjectByID(accountId); + ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount); } @Test diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 7ac781af6..7e2cdd853 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -360,7 +360,7 @@ public class BankAccountServiceTest { bankAccountImdg.insert(bankAccountExists); Account account = new Account(); account.setId(accountId); - account.setAccountStatus(WorkflowStatus.Active.getKey()); + account.setStatus(WorkflowStatus.Active.getKey()); accountImdg.insert(account); CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest(); From 2716196bf7091d06f0773f53acce2944690b1202 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 16:44:39 +0300 Subject: [PATCH 10/39] AccountServiceTest (block) --- .../account/service/AccountServiceTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 6f58dae0c..6e661b11b 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -35,6 +35,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf0 import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfo; import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.platform.enumeration.*; @@ -199,7 +200,32 @@ class AccountServiceTest { @Test void accountCorrespondentBlock() { + Account existAccount = new Account(); + existAccount.setAccount(account); + existAccount.setAccountType(AccountType.Corr.getKey()); + existAccount.setStatus(AccountStatus.ACTIVE.getKey()); + existAccount.setCompanyId(companyId); + Long accountId = accountImdg.insert(existAccount); + CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest(); + commonDeleteRequest.setId(accountId); + + String jsonString = getJsonStringForDELETE(commonDeleteRequest, 0); + + //ACT + addRecordToKafka((MockConsumer) accountService.getConsumer(), + Consts.DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK, + PARTITION, + 0, + jsonString); + + //ASSERT + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account resultBlock = accountImdg.getSingleObjectByID(accountId); + existAccount.setStatus(AccountStatus.BLOCKED.getKey()); + + ACCOUNT_MATCHER.assertMatch(existAccount, resultBlock); } /** From 6e6d866445dd64f0a232edf13bd28faf23b3bc00 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 19:03:44 +0300 Subject: [PATCH 11/39] fix tests --- .../BankAccountValidationConfig.java | 34 +++++++------- .../account/service/AccountService.java | 9 +++- .../account/service/BankAccountService.java | 46 ++++++++++--------- .../account/service/AccountServiceTest.java | 33 +++++++------ .../service/BankAccountServiceTest.java | 39 ++++++---------- 5 files changed, 78 insertions(+), 83 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index cce803501..a95571cd6 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -5,11 +5,13 @@ import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; @@ -72,14 +74,12 @@ public class BankAccountValidationConfig { CurrencyCode.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), -// todo currency codes not present in currency_code_dictionary, uncomment when present -// -// DictionaryPresentRule.instance("currency", -// BankAccountNewRequest::getCurrency, -// IMDGDistributedNames.Map_CurrencyCodeDictionary, -// CurrencyCodeDictionary.class, -// AccountError.RequiredFieldEmpty, -// AccountError.WrongFieldValue), + DictionaryPresentRule.instance("currency", + BankAccountNewRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, + CurrencyCodeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue), FieldRequiredRule.instance("bankIdentificationCode", BankAccountNewRequest::getBankIdentificationCode, AccountError.RequiredFieldEmpty), @@ -128,16 +128,14 @@ public class BankAccountValidationConfig { CurrencyCode.values(), false, AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty) -// todo currency codes not present in currency_code_dictionary, uncomment when present -// -// DictionaryPresentRule.instance("currency", -// BankAccountUpdateRequest::getCurrency, -// IMDGDistributedNames.Map_CurrencyCodeDictionary, -// CurrencyCodeDictionary.class, -// AccountError.RequiredFieldEmpty, -// AccountError.WrongFieldValue, -// false) + AccountError.RequiredFieldEmpty), + DictionaryPresentRule.instance("currency", + BankAccountUpdateRequest::getCurrency, + IMDGDistributedNames.Map_CurrencyCodeDictionary, + CurrencyCodeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue, + false) ); }; } 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 a91c7a791..8253e19a9 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 @@ -40,6 +40,7 @@ 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.*; import java.util.function.Function; @@ -156,6 +157,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { Collection companies = accountMap.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); + Instant now = Instant.now(); Account account = new Account(); account.setAccount(req.getAccount()); account.setAccountType(req.getAccountType()); @@ -163,7 +165,9 @@ public class AccountService extends QueueConsumer implements InitializingBean { account.setStatus(req.getStatus()); // todo выяснить у репортера, что писать в это поле если это не первый счет компании account.setProcessingSign(companies.isEmpty() ? Allowed.ALLOWED.getKey() : null); - account.setCompanyId(req.getCompanyId()); + account.setCompanyId(relation.getConsumerId()); + account.setCreated(now); + account.setUpdated(now); Long id = accountMap.insert(account); log.debug("successfully processed, new account id {}", id); @@ -194,6 +198,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { if (request.getStatus() != null && !account.getStatus().equalsIgnoreCase(request.getStatus())) return makeError(AccountError.WrongFieldValue, "status", userRequest.getId()); + account.setUpdated(Instant.now()); + accountMap.update(account); log.debug("successfully processed, update account id {}", account.getId()); @@ -213,6 +219,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { Account account = accountMap.getSingleObjectByID(request.getId()); account.setStatus(AccountStatus.BLOCKED.getKey()); + account.setUpdated(Instant.now()); accountMap.update(account); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 847ca2f07..bc7f89230 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -98,6 +98,31 @@ public class BankAccountService extends QueueConsumer implements InitializingBea if (requestInfoUpdate != null) return requestInfoUpdate; BankAccountNewRequest req = userRequest.getRequestPayload(); + + Long relationId = null; + Long consumerId = null; + String relationSqlCondition = String.format("consumerId = %s and service = %s", req.companyId, + ru.spcex.platform.enumeration.Service.MKR.getKey()); + Relation relationByCompany = relationMap.getSingleObjectBySQL(relationSqlCondition); + if (relationByCompany != null) { + relationId = relationByCompany.getId(); + consumerId = relationByCompany.getConsumerId(); + } else { + log.warn("Not found relation by condition: {}", relationSqlCondition); + } + + Instant now = Instant.now(); + Account account = new Account(); + account.setAccount(req.getAccount()); + account.setAccountType(AccountType.Bank.getKey()); + account.setStatus(AccountStatus.ACTIVE.getKey()); + account.setRelationId(relationId); + account.setCompanyId(consumerId); + account.setProcessingSign(Allowed.ALLOWED.getKey()); + account.setCreated(now); + account.setUpdated(now); + accountMap.insert(account); + BankAccount bankAccount = new BankAccount(); bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); bankAccount.setBankName(req.getBankName()); @@ -109,27 +134,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); bankAccount.setCompanyId(req.getCompanyId()); - - Account account = new Account(); - account.setAccount(req.account); - account.setAccountType(AccountType.Bank.getKey()); - - String relationSqlCondition = String.format("consumerId = %s and service = %s", req.companyId, - ru.spcex.platform.enumeration.Service.MKR.getKey()); - Relation relationByCompany = relationMap.getSingleObjectBySQL(relationSqlCondition); - if (relationByCompany != null) { - account.setRelationId(relationByCompany.getId()); - account.setCompanyId(relationByCompany.getConsumerId()); - } else { - log.warn("Not found relation by condition: {}", relationSqlCondition); - } - account.setStatus(AccountStatus.ACTIVE.getKey()); - account.setProcessingSign(Allowed.ALLOWED.getKey()); - account.setCreated(Instant.now()); - account.setUpdated(Instant.now()); - - accountMap.insert(account); - bankAccount.setAccountId(account.getId()); Long bankAccountId = bankAccountMap.insert(bankAccount); log.debug("successfully processed, new id {}", bankAccountId); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 6e661b11b..92ec9ca2c 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -47,8 +47,8 @@ import javax.annotation.PostConstruct; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration.currentID; @@ -131,14 +131,16 @@ class AccountServiceTest { @Test void accountCorrespondentNew() { + String uniqueAccount = account + UUID.randomUUID(); + AccountCorrespondentNewRequest accountCorrespondentNewRequest = new AccountCorrespondentNewRequest(); - accountCorrespondentNewRequest.setAccount(account); + accountCorrespondentNewRequest.setAccount(uniqueAccount); accountCorrespondentNewRequest.setAccountType(AccountType.Corr.getKey()); accountCorrespondentNewRequest.setCompanyId(companyId); accountCorrespondentNewRequest.setStatus(AccountStatus.ACTIVE.getKey()); Account predictableAccount = new Account(); - predictableAccount.setAccount(account); + predictableAccount.setAccount(uniqueAccount); predictableAccount.setAccountType(AccountType.Corr.getKey()); predictableAccount.setCompanyId(companyId); predictableAccount.setProcessingSign(Allowed.ALLOWED.getKey()); @@ -155,10 +157,12 @@ class AccountServiceTest { waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); - Account resultNew = accountImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)).iterator().next(); + Account resultNew = accountImdg.getCollectionObjectsByFieldValues(Map.of("account", uniqueAccount)).iterator().next(); predictableAccount.setId(resultNew.getId()); + predictableAccount.setUpdated(resultNew.getUpdated()); + predictableAccount.setCreated(resultNew.getCreated()); ACCOUNT_MATCHER.assertMatch(resultNew, predictableAccount); - + accountImdg.delete(resultNew); } @Test @@ -195,7 +199,9 @@ class AccountServiceTest { existAccount.setAccount(updatedAccount); Account resultUpdating = accountImdg.getSingleObjectByID(accountId); + existAccount.setUpdated(resultUpdating.getUpdated()); ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount); + accountImdg.delete(resultUpdating); } @Test @@ -224,8 +230,10 @@ class AccountServiceTest { Account resultBlock = accountImdg.getSingleObjectByID(accountId); existAccount.setStatus(AccountStatus.BLOCKED.getKey()); + existAccount.setUpdated(resultBlock.getUpdated()); ACCOUNT_MATCHER.assertMatch(existAccount, resultBlock); + accountImdg.delete(resultBlock); } /** @@ -250,7 +258,6 @@ class AccountServiceTest { AccountSdf01Request accountSdf01Request = new AccountSdf01Request(); accountSdf01Request.setGroupingSdf01Id(firstID); accountSdf01Request.setAccounts(Collections.singletonList(accountSdfRequestPart)); - BaseRequest baseNewRequest = new BaseRequest<>(); baseNewRequest.setRequestPayload(accountSdf01Request); baseNewRequest.setId(firstID); @@ -279,33 +286,25 @@ class AccountServiceTest { Account predictableAccount = new Account(); predictableAccount.setAccount(account); - predictableAccount.setId(firstID); predictableAccount.setCompanyId(firstID); RequestInfo predictableRequestInfo = new RequestInfo(); predictableRequestInfo.setId(secondID); predictableRequestInfo.setStatus(Status.Processing); - //ACT - hazelcastServiceTest.waitTillReadyState(); - //KAFKA addRecordToKafka((MockConsumer) accountService.getConsumer(), TOPIC_ACCOUNT_NEW, PARTITION, 0, jsonBaseNewRequest); //waiting for kafka producer send message (finale event) - verify(producer, timeout(30_000L).times(1)) + verify(producer, timeout(30_000L).times(2)) .send(producerRecord.capture()); - BaseRequest baseRequestObject = (BaseRequest) producerRecord.getValue().value(); ImdgHazelcast accountImdg = (ImdgHazelcast) hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class); - ImdgHazelcast requestInfoImdg = (ImdgHazelcast) hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); //ASSERT Account accountResult = accountImdg.getSingleObjectBySQL(String.format("account = %s", account)); - RequestInfo requestInfoResult = requestInfoImdg.getSingleObjectByID(baseRequestObject.getId()); - - assertEquals(Consts.STATEMENT_PROCESS, producerRecord.getValue().topic()); + predictableAccount.setId(accountResult.getId()); ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); - REQUEST_INFO_MATCHER_MATCHER.assertMatch(requestInfoResult, predictableRequestInfo); + accountImdg.delete(accountResult); } } \ No newline at end of file diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 7e2cdd853..39ea8b887 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -16,6 +16,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.config.KafkaConfigTest; @@ -83,6 +84,7 @@ public class BankAccountServiceTest { protected Imdg companyImdg; private Imdg bankAccountImdg; private Imdg accountImdg; + private Imdg currencyCodeDictionaryImdg; @Autowired private IMessageResolver messageResolver; @@ -105,6 +107,13 @@ public class BankAccountServiceTest { companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class); bankAccountImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); accountImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class); + currencyCodeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class + ); + CurrencyCodeDictionary currencyCodeDictionary = new CurrencyCodeDictionary(); + currencyCodeDictionary.setCode("RUB"); + currencyCodeDictionary.setName("RUB"); + currencyCodeDictionaryImdg.insert(currencyCodeDictionary); } /** @@ -207,28 +216,6 @@ public class BankAccountServiceTest { checkError(errMsg, bankAccountNewRequest); bankAccountNewRequest.setCompanyId(addresseeIdNew); - //AccountValidationRule.RubRequiredFields - //RequiredFieldEmpty - bankAccountNewRequest.setCorrespondentAccount(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "correspondentAccount")); - checkError(errMsg, bankAccountNewRequest); - - bankAccountNewRequest.setCorrespondentAccount(correspondentAccount); - bankAccountNewRequest.setCorrespondentAccountName(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "correspondentAccountName")); - checkError(errMsg, bankAccountNewRequest); - - bankAccountNewRequest.setCorrespondentAccountName(correspondentAccountName); - bankAccountNewRequest.setTaxpayerIdentificationNumber(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "taxpayerIdentificationNumber")); - checkError(errMsg, bankAccountNewRequest); - - bankAccountNewRequest.setTaxpayerIdentificationNumber(taxpayerIdentificationNumber); - bankAccountNewRequest.setTaxRegistrationReasonCode(null); - errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "taxRegistrationReasonCode")); - checkError(errMsg, bankAccountNewRequest); - bankAccountNewRequest.setTaxRegistrationReasonCode(taxRegistrationReasonCode); - //AccountValidationRule.CompanyPresent //CompanyNotFound bankAccountNewRequest.setCompanyId(999924535239L); @@ -297,6 +284,7 @@ public class BankAccountServiceTest { */ @Test void bankAccountUpdate() { + clearImdg(accountImdg); //ARRANGE // Company company = getTestCompany(); // companyImdg.insert(company); @@ -337,12 +325,11 @@ public class BankAccountServiceTest { //ASSERT waitingWhenAddedRecordAndCheckIt(ID, producer, producerRecord); - Account accountResult = accountImdg.getSingleObjectBySQL(String.format("account = %s", acc)); - BankAccount resultUpdating = bankAccountImdg.getSingleObjectBySQL(String.format("account = %s or companyId = %s", acc, addresseeIdNew)); + Account accountResult = accountImdg.getSingleObjectByID(predictableAccount.getId()); + BankAccount resultUpdating = bankAccountImdg.getSingleObjectByID(predictableUpdateBankAccount.getId()); + predictableAccount.setUpdated(accountResult.getUpdated()); predictableUpdateBankAccount.setAccountId(resultUpdating.getAccountId()); predictableUpdateBankAccount.setCompanyId(resultUpdating.getCompanyId()); - predictableAccount.setUpdated(accountResult.getUpdated()); - BANK_ACCOUNT_MATCHER.assertMatch(resultUpdating, predictableUpdateBankAccount); ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); } From 0a20044d1e57265cb248d534afebafbc74cd45b4 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 19:06:38 +0300 Subject: [PATCH 12/39] fix account field filling: processedSign --- .../java/ru/spcex/clearing/account/service/AccountService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 8253e19a9..b8a20cc9b 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 @@ -163,8 +163,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { account.setAccountType(req.getAccountType()); account.setRelationId(relation.getId()); account.setStatus(req.getStatus()); - // todo выяснить у репортера, что писать в это поле если это не первый счет компании - account.setProcessingSign(companies.isEmpty() ? Allowed.ALLOWED.getKey() : null); + account.setProcessingSign(companies.isEmpty() ? Allowed.ALLOWED.getKey() : Allowed.DENIED.getKey()); account.setCompanyId(relation.getConsumerId()); account.setCreated(now); account.setUpdated(now); From 7193d7925635ff83d658d92688a093bbb9cf0e2a Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 19:21:34 +0300 Subject: [PATCH 13/39] fix accountService --- .../clearing/account/errors/AccountError.java | 1 + .../account/service/AccountService.java | 18 ++++++------------ 2 files changed, 7 insertions(+), 12 deletions(-) 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 39a7978ff..a777ac5af 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 @@ -11,6 +11,7 @@ public enum AccountError implements IErrorEnumId { AccountNotActive(5012L), CompanyNotFound(5013L), CompanyNotActive(5014L), + ClearingCategoryNotFound(5019L) ; 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 b8a20cc9b..09a966fa8 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 @@ -41,7 +41,10 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.function.Function; @Service @@ -126,7 +129,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { // todo выяснить у репортера, что делать в такой ситуации (нужна ли отдельная ошибка) if (clearingMemberCategories.isEmpty()) { - return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); + return makeError(AccountError.ClearingCategoryNotFound, "clearingMemberCategory[companyId]", userRequest.getId()); } if (clearingMemberCategories.size() > 1) { log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); @@ -143,7 +146,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); } else { // todo выяснить у репортера, что делать в такой ситуации - return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); + return makeError(AccountError.ClearingCategoryNotFound, "relation[consumerId = companyId].service", userRequest.getId()); } ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); @@ -188,15 +191,6 @@ public class AccountService extends QueueConsumer implements InitializingBean { if (request.getAccount() != null) account.setAccount(request.getAccount()); - if (request.getCompanyId() != null && !Objects.equals(account.getCompanyId(), request.getCompanyId())) - return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); - - if (request.getAccountType() != null && !account.getAccountType().equalsIgnoreCase(request.getAccountType())) - return makeError(AccountError.WrongFieldValue, "accountType", userRequest.getId()); - - if (request.getStatus() != null && !account.getStatus().equalsIgnoreCase(request.getStatus())) - return makeError(AccountError.WrongFieldValue, "status", userRequest.getId()); - account.setUpdated(Instant.now()); accountMap.update(account); From 70264061685fce3ab9eb95e59e0799142ed51e75 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 24 Apr 2023 19:22:33 +0300 Subject: [PATCH 14/39] fix accountService --- .../java/ru/spcex/clearing/account/service/AccountService.java | 1 + 1 file changed, 1 insertion(+) 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 09a966fa8..951ede5d4 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 @@ -190,6 +190,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { Account account = accountMap.getSingleObjectByID(request.getId()); if (request.getAccount() != null) account.setAccount(request.getAccount()); + if (request.getStatus() != null) account.setStatus(request.getStatus()); account.setUpdated(Instant.now()); From ff992e6812c528f218df653fdfcb7dc761f55341 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 25 Apr 2023 13:52:07 +0300 Subject: [PATCH 15/39] fix accountService --- .../java/ru/spcex/clearing/account/service/AccountService.java | 1 - 1 file changed, 1 deletion(-) 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 951ede5d4..3f56e5229 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 @@ -189,7 +189,6 @@ public class AccountService extends QueueConsumer implements InitializingBean { Account account = accountMap.getSingleObjectByID(request.getId()); - if (request.getAccount() != null) account.setAccount(request.getAccount()); if (request.getStatus() != null) account.setStatus(request.getStatus()); account.setUpdated(Instant.now()); From 67058ad32a05d8ace93d80c3dfe7bbe7fe00d47b Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 25 Apr 2023 15:20:06 +0300 Subject: [PATCH 16/39] fix names and add consts --- .../validation/AccountValidationConfig.java | 56 ++++++++-------- .../ClearingAccountValidationConfig.java | 8 +++ .../config/validation/ValidationConfig.java | 2 + .../account/service/AccountService.java | 66 +++++++++---------- .../service/ClearingAccountService.java | 47 +++++++++++++ .../account/service/AccountServiceTest.java | 38 +++++------ .../queue/account/AccountController.java | 6 +- .../queue/account/AccountControllerTest.java | 6 +- .../balance/service/StatementService.java | 2 +- .../service/StatementServiceServiceTest.java | 2 +- .../platform/messaging/domain/Consts.java | 14 ++-- ...va => CorrespondentAccountNewRequest.java} | 2 +- ...=> CorrespondentAccountUpdateRequest.java} | 2 +- 13 files changed, 151 insertions(+), 100 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountCorrespondentNewRequest.java => CorrespondentAccountNewRequest.java} (95%) rename platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/{AccountCorrespondentUpdateRequest.java => CorrespondentAccountUpdateRequest.java} (95%) 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 0f8ef132d..315021ac9 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 @@ -7,8 +7,8 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.AccountTypeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.EnumPresentRule; @@ -35,27 +35,27 @@ import java.util.function.Function; @Configuration public class AccountValidationConfig { - @Bean("accountCorrespondentNewRequestValidator") - public Function accountCorrespondentNewRequestValidator( + @Bean("correspondentAccountNewRequestValidator") + public Function correspondentAccountNewRequestValidator( Map> imdgForValidation ) { - return accountCorrespondentNewRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountCorrespondentNewRequest); + return correspondentAccountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(correspondentAccountNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", - AccountCorrespondentNewRequest::getCompanyId, + CorrespondentAccountNewRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, AccountError.CompanyNotFound, company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), FieldRequiredRule.instance("account", - AccountCorrespondentNewRequest::getAccount, + CorrespondentAccountNewRequest::getAccount, AccountError.RequiredFieldEmpty, accountValue -> { Imdg accountImdg = context.obtainMap( @@ -70,7 +70,7 @@ public class AccountValidationConfig { return AccountError.AccountAlreadyExist; }), FieldRequiredRule.instance("status", - AccountCorrespondentNewRequest::getStatus, + CorrespondentAccountNewRequest::getStatus, AccountError.RequiredFieldEmpty, false, statusValue -> { @@ -79,12 +79,12 @@ public class AccountValidationConfig { return AccountError.WrongFieldValue; }), EnumPresentRule.instance("accountType", - AccountCorrespondentNewRequest::getAccountType, + CorrespondentAccountNewRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountCorrespondentNewRequest::getAccountType, + CorrespondentAccountNewRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -97,32 +97,32 @@ public class AccountValidationConfig { }; } - @Bean("accountCorrespondentUpdateRequestValidator") - public Function accountCorrespondentUpdateRequestValidator( + @Bean("correspondentAccountUpdateRequestValidator") + public Function correspondentAccountUpdateRequestValidator( Map> imdgForValidation ) { - return accountCorrespondentUpdateRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountCorrespondentUpdateRequest); + return correspondentAccountUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(correspondentAccountUpdateRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("id", - AccountCorrespondentUpdateRequest::getId, + CorrespondentAccountUpdateRequest::getId, IMDGDistributedNames.Map_Account, Account.class, AccountError.RequiredFieldEmpty, AccountError.AccountNotFound, account -> { - String statusFromRequest = accountCorrespondentUpdateRequest.getStatus(); + String statusFromRequest = correspondentAccountUpdateRequest.getStatus(); if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus())) return AccountError.WrongFieldValue; return null; }), IdPresentRule.instance("companyId", - AccountCorrespondentUpdateRequest::getCompanyId, + CorrespondentAccountUpdateRequest::getCompanyId, IMDGDistributedNames.Map_Company, Company.class, AccountError.RequiredFieldEmpty, @@ -130,22 +130,22 @@ public class AccountValidationConfig { false, company -> { IErrorEnumId error = WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; - error = Objects.equals(company.getId(), accountCorrespondentUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; + error = Objects.equals(company.getId(), correspondentAccountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; return error; }), EnumPresentRule.instance("status", - AccountCorrespondentUpdateRequest::getStatus, + CorrespondentAccountUpdateRequest::getStatus, AccountStatus.values(), false, AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), EnumPresentRule.instance("accountType", - AccountCorrespondentUpdateRequest::getAccountType, + CorrespondentAccountUpdateRequest::getAccountType, AccountType.values(), AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", - AccountCorrespondentUpdateRequest::getAccountType, + CorrespondentAccountUpdateRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class, AccountError.RequiredFieldEmpty, @@ -158,13 +158,13 @@ public class AccountValidationConfig { }; } - @Bean("accountCorrespondentBlockRequestValidator") - public Function accountCorrespondentBlockRequestValidator( + @Bean("correspondentAccountBlockRequestValidator") + public Function correspondentAccountBlockRequestValidator( Map> imdgForValidation ) { - return accountDeleteRequest -> { + return correspondentAccountBlockRequest -> { ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(accountDeleteRequest); + context.setValidatedObject(correspondentAccountBlockRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Account); return new ValidatorImpl<>(context, diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java new file mode 100644 index 000000000..8586e5ff4 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -0,0 +1,8 @@ +package ru.spcex.clearing.account.config.validation; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ClearingAccountValidationConfig { + +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index 537073f68..063cc6cfd 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; @@ -33,6 +34,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); return imdg; } 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 3f56e5229..223f36603 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 @@ -15,8 +15,8 @@ import ru.spcex.clearing.account.errors.AccountError; 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.AccountCorrespondentNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; @@ -57,8 +57,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { private final IMessageResolver messageResolver; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; - private final Function accountNewRequestValidator; - private final Function accountUpdateRequestValidator; + private final Function accountNewRequestValidator; + private final Function accountUpdateRequestValidator; private final Function accountBlockRequestValidator; @Autowired @@ -69,11 +69,11 @@ public class AccountService extends QueueConsumer implements InitializingBean { IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, - @Qualifier("accountCorrespondentNewRequestValidator") - Function accountNewRequestValidator, - @Qualifier("accountCorrespondentUpdateRequestValidator") - Function accountUpdateRequestValidator, - @Qualifier("accountCorrespondentBlockRequestValidator") + @Qualifier("correspondentAccountNewRequestValidator") + Function accountNewRequestValidator, + @Qualifier("correspondentAccountUpdateRequestValidator") + Function accountUpdateRequestValidator, + @Qualifier("correspondentAccountBlockRequestValidator") Function accountBlockRequestValidator) { super(kafkaQueue, kafkaProducer); this.accountMap = imdgProvider.getImdg( @@ -98,21 +98,21 @@ public class AccountService extends QueueConsumer implements InitializingBean { public void afterPropertiesSet() { callback(AccountSdf01Request.class) .setConsumer(this::accountNewSdf01) - .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put); - callback(AccountCorrespondentNewRequest.class) + .forDestination(Consts.CLEARING_ACCOUNT_NEW_SDF01, callbacks::put); + callback(CorrespondentAccountNewRequest.class) .setConsumer(this::accountCorrespondentNew) - .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_NEW, callbacks::put); - callback(AccountCorrespondentUpdateRequest.class) - .setConsumer(this::accountCorrespondentUpdate) - .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE, callbacks::put); + .forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put); + callback(CorrespondentAccountUpdateRequest.class) + .setConsumer(this::correspondentAccountUpdate) + .forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::accountCorrespondentBlock) - .forDestination(Consts.DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK, callbacks::put); + .setConsumer(this::correspondentAccountBlock) + .forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put); init(); } - public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) { - log.debug("AccountCorrespondentNewRequest received"); + public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) { + log.debug("CorrespondentAccountNewRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; @@ -120,42 +120,36 @@ public class AccountService extends QueueConsumer implements InitializingBean { requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; - AccountCorrespondentNewRequest req = userRequest.getRequestPayload(); + CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); Long companyId = req.getCompanyId(); ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); - // todo выяснить у репортера, что делать в такой ситуации (нужна ли отдельная ошибка) - if (clearingMemberCategories.isEmpty()) { + if (clearingMemberCategories.isEmpty()) return makeError(AccountError.ClearingCategoryNotFound, "clearingMemberCategory[companyId]", userRequest.getId()); - } - if (clearingMemberCategories.size() > 1) { + if (clearingMemberCategories.size() > 1) log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); - } + ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); ImdgPredicate servicePredicate = null; - ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); } else { - // todo выяснить у репортера, что делать в такой ситуации return makeError(AccountError.ClearingCategoryNotFound, "relation[consumerId = companyId].service", userRequest.getId()); } ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); - if (relations.isEmpty()) { - return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); - } - if (relations.size() > 1) { + + if (relations.isEmpty()) return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); + if (relations.size() > 1) log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); - } Relation relation = relations.iterator().next(); Collection companies = accountMap.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); @@ -176,8 +170,8 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } - public RequestInfoUpdate accountCorrespondentUpdate(BaseRequest userRequest) { - log.debug("AccountCorrespondentUpdateRequest received"); + public RequestInfoUpdate correspondentAccountUpdate(BaseRequest userRequest) { + log.debug("CorrespondentAccountUpdateRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; @@ -185,7 +179,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountUpdateRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; - AccountCorrespondentUpdateRequest request = userRequest.getRequestPayload(); + CorrespondentAccountUpdateRequest request = userRequest.getRequestPayload(); Account account = accountMap.getSingleObjectByID(request.getId()); @@ -199,7 +193,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } - public RequestInfoUpdate accountCorrespondentBlock(BaseRequest userRequest) { + public RequestInfoUpdate correspondentAccountBlock(BaseRequest userRequest) { log.debug("AccountBlockRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); 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 new file mode 100644 index 000000000..78615dc4e --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java @@ -0,0 +1,47 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.validation.common.ValidationHelper; + +@Service +public class ClearingAccountService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + + @Autowired + public ClearingAccountService(Consumer kafkaQueue, + Producer kafkaResponseQueue, + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper) { + super(kafkaQueue, kafkaResponseQueue); + this.userRoleVerification = userRoleVerification; + this.validationHelper = validationHelper; + } + + @Override + public void afterPropertiesSet() throws Exception { + init(); + } + + public RequestInfoUpdate clearingAccountNew() { + + + return null; + } + + public RequestInfoUpdate clearingAccountUpdate() { + + + return null; + } +} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 92ec9ca2c..5d9ba3826 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -29,8 +29,8 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; 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.AccountCorrespondentNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountCorrespondentUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart; import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart; @@ -67,7 +67,7 @@ class AccountServiceTest { public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); public static final MatcherFactory.Matcher REQUEST_INFO_MATCHER_MATCHER = usingIgnoringFieldsComparator("created"); private static final int PARTITION = 0; - private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01; + private static final String TOPIC_ACCOUNT_NEW = Consts.CLEARING_ACCOUNT_NEW_SDF01; private static final String account = "123456789123"; private static final Long companyId = 0L; private static final Long relationId = 0L; @@ -133,11 +133,11 @@ class AccountServiceTest { void accountCorrespondentNew() { String uniqueAccount = account + UUID.randomUUID(); - AccountCorrespondentNewRequest accountCorrespondentNewRequest = new AccountCorrespondentNewRequest(); - accountCorrespondentNewRequest.setAccount(uniqueAccount); - accountCorrespondentNewRequest.setAccountType(AccountType.Corr.getKey()); - accountCorrespondentNewRequest.setCompanyId(companyId); - accountCorrespondentNewRequest.setStatus(AccountStatus.ACTIVE.getKey()); + CorrespondentAccountNewRequest correspondentAccountNewRequest = new CorrespondentAccountNewRequest(); + correspondentAccountNewRequest.setAccount(uniqueAccount); + correspondentAccountNewRequest.setAccountType(AccountType.Corr.getKey()); + correspondentAccountNewRequest.setCompanyId(companyId); + correspondentAccountNewRequest.setStatus(AccountStatus.ACTIVE.getKey()); Account predictableAccount = new Account(); predictableAccount.setAccount(uniqueAccount); @@ -147,10 +147,10 @@ class AccountServiceTest { predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); predictableAccount.setRelationId(relationId); - String jsonString = getJsonStringForNew(accountCorrespondentNewRequest, 0L); + String jsonString = getJsonStringForNew(correspondentAccountNewRequest, 0L); addRecordToKafka((MockConsumer) accountService.getConsumer(), - Consts.DESTINATION_ACCOUNT_CORRESPONDENT_NEW, + Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, PARTITION, 0, jsonString); @@ -176,19 +176,19 @@ class AccountServiceTest { existAccount.setCompanyId(companyId); Long accountId = accountImdg.insert(existAccount); - AccountCorrespondentUpdateRequest accountCorrespondentUpdateRequest = new AccountCorrespondentUpdateRequest(); - accountCorrespondentUpdateRequest.setAccount(updatedAccount); - accountCorrespondentUpdateRequest.setAccountType(AccountType.Corr.getKey()); - accountCorrespondentUpdateRequest.setStatus(AccountStatus.ACTIVE.getKey()); - accountCorrespondentUpdateRequest.setCompanyId(companyId); - accountCorrespondentUpdateRequest.setId(accountId); + CorrespondentAccountUpdateRequest correspondentAccountUpdateRequest = new CorrespondentAccountUpdateRequest(); + correspondentAccountUpdateRequest.setAccount(updatedAccount); + correspondentAccountUpdateRequest.setAccountType(AccountType.Corr.getKey()); + correspondentAccountUpdateRequest.setStatus(AccountStatus.ACTIVE.getKey()); + correspondentAccountUpdateRequest.setCompanyId(companyId); + correspondentAccountUpdateRequest.setId(accountId); - String jsonString = getJsonStringForUPDATE(accountCorrespondentUpdateRequest, 0); + String jsonString = getJsonStringForUPDATE(correspondentAccountUpdateRequest, 0); //ACT addRecordToKafka((MockConsumer) accountService.getConsumer(), - Consts.DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE, + Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, PARTITION, 0, jsonString); @@ -220,7 +220,7 @@ class AccountServiceTest { //ACT addRecordToKafka((MockConsumer) accountService.getConsumer(), - Consts.DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK, + Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, PARTITION, 0, jsonString); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountController.java index 12e0b79f9..1cebcb051 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountController.java @@ -55,7 +55,7 @@ public class AccountController extends AbstractQueueController { public CudResponse add( @ApiParam(value = "Параметры команды в JSON формате.", required = true) @RequestBody AccountNewAction accountNewAction) throws ExecutionException, InterruptedException { - return processRequest(Consts.DESTINATION_ACCOUNT_NEW, accountNewAction); + return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, accountNewAction); } @ApiOperation(value = "update account.") @@ -68,7 +68,7 @@ public class AccountController extends AbstractQueueController { @ApiParam(value = "Новые значения полей объекта.", required = true) @RequestBody AccountUpdateAction accountUpdateAction) throws ExecutionException, InterruptedException { accountUpdateAction.setId(id); - return processRequest(Consts.DESTINATION_ACCOUNT_UPDATE, accountUpdateAction); + return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, accountUpdateAction); } @ApiOperation(value = "delete account.") @@ -79,7 +79,7 @@ public class AccountController extends AbstractQueueController { @PathVariable("id") Long id) throws ExecutionException, InterruptedException { CommonDeleteAction deleteAction = new CommonDeleteAction(); deleteAction.setId(id); - return processRequest(Consts.DESTINATION_ACCOUNT_DELETE, deleteAction); + return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, deleteAction); } } diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountControllerTest.java index b00ffc9a0..38c4f02de 100644 --- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountControllerTest.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/AccountControllerTest.java @@ -46,7 +46,7 @@ class AccountControllerTest extends AbstractControllerTest { //ACT and ASSERT checkAddingByRestApi(REST_URL, accountNewAction); - checkSendedMessegeFromKafka(Consts.DESTINATION_ACCOUNT_NEW, accountNewAction); + checkSendedMessegeFromKafka(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, accountNewAction); } /** @@ -69,7 +69,7 @@ class AccountControllerTest extends AbstractControllerTest { //ACT and ASSERT checkUpdatingWithIdVolidationByRestApi(IMDGDistributedNames.Map_Account, account, REST_URL, accountUpdateAction, id); - checkSendedMessegeFromKafka(Consts.DESTINATION_ACCOUNT_UPDATE, accountUpdateAction); + checkSendedMessegeFromKafka(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, accountUpdateAction); } /** @@ -88,7 +88,7 @@ class AccountControllerTest extends AbstractControllerTest { //ACT and ASSERT checkDeletingWithIdVolidationByRestApi(IMDGDistributedNames.Map_Account, account, REST_URL, id); - checkSendedMessegeFromKafka(Consts.DESTINATION_ACCOUNT_DELETE, deleteAction); + checkSendedMessegeFromKafka(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, deleteAction); } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index c2125fe09..b01087991 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -106,7 +106,7 @@ public class StatementService extends QueueConsumer implements InitializingBean exportRequest.setNameOfTable(service.exportTableName()); kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); } else { - kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); + kafkaReqProducer.sendRequestToQueue(Consts.CLEARING_ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); } } diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java index 9759178f4..e84e4b9c3 100644 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java @@ -130,7 +130,7 @@ class StatementServiceServiceTest extends AbstractServiceTest { BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); - assertEquals(Consts.ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); + assertEquals(Consts.CLEARING_ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); assertNotNull(baseRequest); assertNotNull(resultRequestInfo); } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 7740702cf..379a3f0d2 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -54,16 +54,17 @@ public interface Consts { String DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE = "clearing-member-category-update"; String DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE = "clearing-member-category-delete"; - String DESTINATION_ACCOUNT_DELETE = "account-delete"; - String DESTINATION_ACCOUNT_UPDATE = "account-update"; - String DESTINATION_ACCOUNT_NEW = "account-new"; + + String DESTINATION_CORRESPONDENT_ACCOUNT_NEW = "correspondent-account-new"; + String DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE = "correspondent-account-update"; + String DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK = "correspondent-account-block"; + String DESTINATION_BANK_ACCOUNT_DELETE = "bank-account-delete"; String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; - String DESTINATION_ACCOUNT_CORRESPONDENT_NEW = "account-correspondent-new"; - String DESTINATION_ACCOUNT_CORRESPONDENT_UPDATE = "account-correspondent-update"; - String DESTINATION_ACCOUNT_CORRESPONDENT_BLOCK = "account-correspondent-block"; + String CLEARING_ACCOUNT_NEW_SDF01 = "clearing-account-new-sdf01"; + String CLEARING_ACCOUNT_UPDATE_SDF52 = "clearing-account-update-sdf52"; String DESTINATION_RELATION_UPDATE = "relation-update"; String DESTINATION_PROFILE_DOCUMENT_NEW = "profile-document-new"; @@ -91,7 +92,6 @@ public interface Consts { String SDF03_PROCESS = "sdf03-process"; String SDF11_PROCESS = "sdf11-process"; String EXPORT_PROCESS = "export-process"; - String ACCOUNT_NEW_SDF01 = "account-new-sdf01"; String ACCOUNT_TERMINATION = "account-termination"; String BALANCE_ACCOUNT_NEW = "balance-account-new"; String BALANCE_ACCOUNT_UPDATE = "balance-account-update"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java index aa02bd1c6..dc33c7dbe 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountCorrespondentNewRequest { +public class CorrespondentAccountNewRequest { @JsonProperty public Long companyId; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountUpdateRequest.java similarity index 95% rename from platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java rename to platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountUpdateRequest.java index d3fb5eb9c..24afc0ee5 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountCorrespondentUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountUpdateRequest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; -public class AccountCorrespondentUpdateRequest { +public class CorrespondentAccountUpdateRequest { @JsonProperty public Long id; From 202feebf0c3a5c991adf2c2dbcaa1656c3627147 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 27 Apr 2023 12:37:24 +0300 Subject: [PATCH 17/39] equals -> equals by key --- .../config/validation/AccountValidationConfig.java | 7 +++---- .../config/validation/BankAccountValidationConfig.java | 8 +++----- 2 files changed, 6 insertions(+), 9 deletions(-) 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 315021ac9..e1f279b10 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 @@ -53,7 +53,7 @@ public class AccountValidationConfig { Company.class, AccountError.RequiredFieldEmpty, AccountError.CompanyNotFound, - company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), + company -> WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), FieldRequiredRule.instance("account", CorrespondentAccountNewRequest::getAccount, AccountError.RequiredFieldEmpty, @@ -74,8 +74,7 @@ public class AccountValidationConfig { AccountError.RequiredFieldEmpty, false, statusValue -> { - if (statusValue == null || AccountStatus.ACTIVE.getKey().equalsIgnoreCase(statusValue)) - return null; + if (statusValue == null || AccountStatus.ACTIVE.equalsByKey(statusValue)) return null; return AccountError.WrongFieldValue; }), EnumPresentRule.instance("accountType", @@ -129,7 +128,7 @@ public class AccountValidationConfig { AccountError.CompanyNotFound, false, company -> { - IErrorEnumId error = WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; + IErrorEnumId error = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive; error = Objects.equals(company.getId(), correspondentAccountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue; return error; }), diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index a95571cd6..a6f997549 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -53,7 +53,7 @@ public class BankAccountValidationConfig { Company.class, AccountError.RequiredFieldEmpty, AccountError.CompanyNotFound, - company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), + company -> WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive), FieldRequiredRule.instance("account", BankAccountNewRequest::getAccount, AccountError.RequiredFieldEmpty, @@ -119,8 +119,7 @@ public class BankAccountValidationConfig { ); Account account = accountImdg.getSingleObjectByID(accountId); if (account == null) return AccountError.AccountNotFound; - if (!AccountStatus.ACTIVE.getKey().equalsIgnoreCase(account.getStatus())) - return AccountError.AccountNotActive; + if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive; return null; }), EnumPresentRule.instance("currency", @@ -164,8 +163,7 @@ public class BankAccountValidationConfig { ); Account account = accountImdg.getSingleObjectByID(accountId); if (account == null) return AccountError.AccountNotFound; - if (!AccountStatus.ACTIVE.getKey().equalsIgnoreCase(account.getStatus())) - return AccountError.AccountNotActive; + if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive; return null; }) ); From 2dc844ba3f576f8148048d96c292b781cf7cab3a Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 28 Apr 2023 16:31:24 +0300 Subject: [PATCH 18/39] add create info account, fix from TT, deprecate some methods --- .../InformationAccountValidationConfig.java | 60 +++++++ .../config/validation/ValidationConfig.java | 2 + .../clearing/account/errors/AccountError.java | 1 + .../account/service/AccountService.java | 89 ++++----- .../account/service/BankAccountService.java | 88 ++++----- .../service/InformationAccountService.java | 160 +++++++++++++++++ .../account/service/AccountServiceTest.java | 11 +- .../service/BankAccountServiceTest.java | 36 +++- .../InformationAccountServiceTest.java | 170 ++++++++++++++++++ .../balance/service/StatementService.java | 2 +- .../service/StatementServiceServiceTest.java | 2 +- .../platform/messaging/domain/Consts.java | 5 +- .../account/InformationAccountNewRequest.java | 16 ++ .../account/sdf01/AccountSdf01Request.java | 1 + .../account/sdf01/AccountSdfRequestPart.java | 1 + 15 files changed, 547 insertions(+), 97 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java new file mode 100644 index 000000000..37d2712f5 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/InformationAccountValidationConfig.java @@ -0,0 +1,60 @@ +package ru.spcex.clearing.account.config.validation; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.InformationAccount; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +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.function.Consumer; +import java.util.function.Function; + +@Configuration +public class InformationAccountValidationConfig { + + @Bean("informationAccountNewRequestValidator") + public Function informationAccountNewRequestValidator( + Map> imdgForValidation + ) { + return informationAccountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(informationAccountNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_InformationAccount); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + InformationAccountNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> { + if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) + return AccountError.CompanyNotActive; + Long companyId = company.getId(); + Imdg informationAccountImdg = context.obtainMap( + IMDGDistributedNames.Map_InformationAccount, InformationAccount.class + ); + Collection infoAccounts = informationAccountImdg.getCollectionObjectsByFieldValues( + Map.of("companyId", companyId) + ); + if (infoAccounts.isEmpty()) return null; + return AccountError.InfoAccountAlreadyExist; + }) + ); + }; + } + +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index 063cc6cfd..ccf3d40b1 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; @@ -31,6 +32,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); 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 a777ac5af..82789613d 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 @@ -11,6 +11,7 @@ public enum AccountError implements IErrorEnumId { AccountNotActive(5012L), CompanyNotFound(5013L), CompanyNotActive(5014L), + InfoAccountAlreadyExist(5015L), ClearingCategoryNotFound(5019L) ; 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 223f36603..59ff63df1 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 @@ -29,7 +29,6 @@ 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.AccountStatus; -import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -44,7 +43,6 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.function.Function; @Service @@ -98,7 +96,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { public void afterPropertiesSet() { callback(AccountSdf01Request.class) .setConsumer(this::accountNewSdf01) - .forDestination(Consts.CLEARING_ACCOUNT_NEW_SDF01, callbacks::put); + .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put); callback(CorrespondentAccountNewRequest.class) .setConsumer(this::accountCorrespondentNew) .forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put); @@ -111,6 +109,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { init(); } + public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) { log.debug("CorrespondentAccountNewRequest received"); @@ -122,51 +121,20 @@ public class AccountService extends QueueConsumer implements InitializingBean { CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); - Long companyId = req.getCompanyId(); - ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); - ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); - Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); - - if (clearingMemberCategories.isEmpty()) - return makeError(AccountError.ClearingCategoryNotFound, "clearingMemberCategory[companyId]", userRequest.getId()); - if (clearingMemberCategories.size() > 1) - log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); - ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); - - ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); - ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); - ImdgPredicate servicePredicate = null; - String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); - if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { - servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); - } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { - servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); - } else { - return makeError(AccountError.ClearingCategoryNotFound, "relation[consumerId = companyId].service", userRequest.getId()); - } - ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); - Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); - - if (relations.isEmpty()) return makeError(AccountError.WrongFieldValue, "companyId", userRequest.getId()); - if (relations.size() > 1) - log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); - Relation relation = relations.iterator().next(); - - Collection companies = accountMap.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); - Instant now = Instant.now(); Account account = new Account(); + account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); account.setAccountType(req.getAccountType()); - account.setRelationId(relation.getId()); account.setStatus(req.getStatus()); - account.setProcessingSign(companies.isEmpty() ? Allowed.ALLOWED.getKey() : Allowed.DENIED.getKey()); - account.setCompanyId(relation.getConsumerId()); account.setCreated(now); account.setUpdated(now); - Long id = accountMap.insert(account); - log.debug("successfully processed, new account id {}", id); + requestInfoUpdate = fillAccountFromRelation(account, userRequest.getId()); + if (requestInfoUpdate != null) return requestInfoUpdate; + + Long newId = accountMap.insert(account); + log.debug("successfully processed, new account id {}", newId); return null; } @@ -214,6 +182,7 @@ public class AccountService extends QueueConsumer implements InitializingBean { return null; } + @Deprecated public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); @@ -255,6 +224,46 @@ public class AccountService extends QueueConsumer implements InitializingBean { kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request); } + /** + * Заполняет поля relationId и companyId из соответствующей записи Relation + * + * @param requestId Идентификатор запроса для вывода лога + */ + public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId) { + Long companyId = account.getCompanyId(); + ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder(); + ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId); + Collection clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals); + + if (clearingMemberCategories.isEmpty()) + return makeError(AccountError.ClearingCategoryNotFound, "clearingMemberCategory[companyId]", requestId); + if (clearingMemberCategories.size() > 1) + log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId); + ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next(); + + ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder(); + ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId); + ImdgPredicate servicePredicate; + String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory(); + if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey()); + } else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) { + servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey()); + } else { + return makeError(AccountError.ClearingCategoryNotFound, "relation[consumerId = companyId].service", requestId); + } + ImdgPredicate finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate); + Collection relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate); + + if (relations.isEmpty()) return makeError(AccountError.WrongFieldValue, "companyId", requestId); + if (relations.size() > 1) + log.warn("Relation for consumerId {} contains multiply elements, use first", companyId); + Relation relation = relations.iterator().next(); + account.setRelationId(relation.getId()); + + return null; + } + private RequestInfoUpdate makeError(AccountError accountError, String fieldName, Long reqId) { String errMsg = messageResolver.resolve(new EnumMessage(accountError, fieldName)); return new RequestInfoUpdate() diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index bc7f89230..6147ed9fc 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; -import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -23,9 +22,9 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; @@ -37,13 +36,13 @@ public class BankAccountService extends QueueConsumer implements InitializingBea private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg bankAccountMap; private final Imdg accountMap; - private final Imdg relationMap; - private final IMessageResolver messageResolver; + private final ImdgProvider imdgProvider; + + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + + private final AccountService accountService; - private UserRoleVerification userRoleVerification; - private ValidationHelper validationHelper; - // private final Imdg userImdg; -// private final Imdg userRoleSessionImdg; private final Function bankAccountNewRequestValidator; private final Function bankAccountUpdateRequestValidator; private final Function bankAccountDeleteRequestValidator; @@ -55,6 +54,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, + AccountService accountService, @Qualifier("bankAccountNewRequestValidator") Function bankAccountNewRequestValidator, @Qualifier("bankAccountUpdateRequestValidator") @@ -64,10 +64,10 @@ public class BankAccountService extends QueueConsumer implements InitializingBea super(kafkaQueue, kafkaProducer); this.bankAccountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - this.relationMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); - this.messageResolver = messageResolver; + this.imdgProvider = imdgProvider; this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; + this.accountService = accountService; this.bankAccountNewRequestValidator = bankAccountNewRequestValidator; this.bankAccountUpdateRequestValidator = bankAccountUpdateRequestValidator; this.bankAccountDeleteRequestValidator = bankAccountDeleteRequestValidator; @@ -99,44 +99,52 @@ public class BankAccountService extends QueueConsumer implements InitializingBea BankAccountNewRequest req = userRequest.getRequestPayload(); - Long relationId = null; - Long consumerId = null; - String relationSqlCondition = String.format("consumerId = %s and service = %s", req.companyId, - ru.spcex.platform.enumeration.Service.MKR.getKey()); - Relation relationByCompany = relationMap.getSingleObjectBySQL(relationSqlCondition); - if (relationByCompany != null) { - relationId = relationByCompany.getId(); - consumerId = relationByCompany.getConsumerId(); - } else { - log.warn("Not found relation by condition: {}", relationSqlCondition); - } - Instant now = Instant.now(); Account account = new Account(); account.setAccount(req.getAccount()); account.setAccountType(AccountType.Bank.getKey()); account.setStatus(AccountStatus.ACTIVE.getKey()); - account.setRelationId(relationId); - account.setCompanyId(consumerId); - account.setProcessingSign(Allowed.ALLOWED.getKey()); + account.setCompanyId(req.getCompanyId()); account.setCreated(now); account.setUpdated(now); - accountMap.insert(account); + requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId()); + if (requestInfoUpdate != null) return requestInfoUpdate; - BankAccount bankAccount = new BankAccount(); - bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); - bankAccount.setBankName(req.getBankName()); - bankAccount.setCorrespondentAccount(req.getCorrespondentAccount()); - bankAccount.setCorrespondentAccountName(req.getCorrespondentAccountName()); - bankAccount.setCurrency(req.getCurrency()); - bankAccount.setDestination(req.getDestination()); - bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber()); - bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); - bankAccount.setAccount(req.getAccount()); - bankAccount.setCompanyId(req.getCompanyId()); - bankAccount.setAccountId(account.getId()); - Long bankAccountId = bankAccountMap.insert(bankAccount); - log.debug("successfully processed, new id {}", bankAccountId); + Long bankAccountId = -1L; + Long accountId = -1L; + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + boolean txOk = false; + imdgTransaction.beginTransaction(); + try { + accountId = accountMap.insert(account); + + BankAccount bankAccount = new BankAccount(); + bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); + bankAccount.setBankName(req.getBankName()); + bankAccount.setCorrespondentAccount(req.getCorrespondentAccount()); + bankAccount.setCorrespondentAccountName(req.getCorrespondentAccountName()); + bankAccount.setCurrency(req.getCurrency()); + bankAccount.setDestination(req.getDestination()); + bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber()); + bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); + bankAccount.setAccount(req.getAccount()); + bankAccount.setCompanyId(req.getCompanyId()); + bankAccount.setAccountId(account.getId()); + bankAccountId = bankAccountMap.insert(bankAccount); + + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed insert, new bank account id {}, new account id {} (if id = -1, insert is failed)", + bankAccountId, + accountId); + imdgTransaction.rollbackTransaction(); + } + } return null; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java new file mode 100644 index 000000000..619120fbb --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -0,0 +1,160 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.InformationAccount; +import ru.spcex.clearing.account.errors.AccountError; +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.InformationAccountNewRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +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.utils.enumeration.EnumMessage; +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.function.Function; + +@Service +public class InformationAccountService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final IMessageResolver messageResolver; + private final ImdgProvider imdgProvider; + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + private final AccountService accountService; + private final Function infoAccountNewRequestValidator; + private final Imdg informationAccountImdg; + private final Imdg accountImdg; + + @Autowired + public InformationAccountService(Consumer kafkaQueue, + Producer kafkaResponseQueue, + IMessageResolver messageResolver, + ImdgProvider imdgProvider, + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper, + AccountService accountService, + @Qualifier("informationAccountNewRequestValidator") + Function infoAccountNewRequestValidator) { + super(kafkaQueue, kafkaResponseQueue); + this.messageResolver = messageResolver; + this.imdgProvider = imdgProvider; + this.userRoleVerification = userRoleVerification; + this.validationHelper = validationHelper; + this.accountService = accountService; + this.infoAccountNewRequestValidator = infoAccountNewRequestValidator; + this.informationAccountImdg = imdgProvider.getImdg( + IMDGDistributedNames.Map_InformationAccount, InformationAccount.class + ); + this.accountImdg = imdgProvider.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(InformationAccountNewRequest.class) + .setConsumer(this::informationAccountNew) + .forDestination(Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, callbacks::put); + init(); + } + + public RequestInfoUpdate informationAccountNew(BaseRequest userRequest) { + log.debug("InformationAccountNewRequest received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + + Long newId = informationAccountImdg.nextIDSequenceFor(); + String accountValue = generateInfoAccount(newId); + + // todo уточнить у репортера + ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder(); + ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1); + ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()); + ImdgPredicate andPredicate = accountPredicateBuilder.and(companyIdPredicate, accountTypePredicate); + Collection accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate); + if (accountsAnlt.isEmpty()) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "clearingAccountId")); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errMsg); + } else if (accountsAnlt.size() > 1) { + log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first"); + } + Account anltAccount = accountsAnlt.iterator().next(); + + Instant now = Instant.now(); + Account account = new Account(); + account.setAccount(accountValue); + account.setAccountType(AccountType.Info.getKey()); + account.setStatus(AccountStatus.ACTIVE.getKey()); + account.setCompanyId(userRequest.getRequestPayload().getCompanyId()); + account.setCreated(now); + account.setUpdated(now); + requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId()); + if (requestInfoUpdate != null) return requestInfoUpdate; + + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + imdgTransaction.beginTransaction(); + boolean txOk = false; + Long informationAccountId = -1L; + Long accountId = -1L; + try { + accountId = accountImdg.insert(account); + + InformationAccount informationAccount = new InformationAccount(); + informationAccount.setId(newId); + informationAccount.setAccountId(accountId); + informationAccount.setClearingAccountId(anltAccount.getId()); + informationAccount.setCompanyId(userRequest.getRequestPayload().getCompanyId()); + informationAccountId = informationAccountImdg.insert(informationAccount); + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new information account id {}, new account id {}", + informationAccountId, + accountId); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed insert, new information account id {}, new account id {} (if id = -1, insert is failed)", + informationAccountId, + accountId); + imdgTransaction.rollbackTransaction(); + } + } + + return null; + } + + public String generateInfoAccount(Long id) { + return "%d%d%08d%d".formatted(39911, 810, id, 7000); + } + +} diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java index 5d9ba3826..b2d53c3dc 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/AccountServiceTest.java @@ -67,7 +67,7 @@ class AccountServiceTest { public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); public static final MatcherFactory.Matcher REQUEST_INFO_MATCHER_MATCHER = usingIgnoringFieldsComparator("created"); private static final int PARTITION = 0; - private static final String TOPIC_ACCOUNT_NEW = Consts.CLEARING_ACCOUNT_NEW_SDF01; + private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01; private static final String account = "123456789123"; private static final Long companyId = 0L; private static final Long relationId = 0L; @@ -143,7 +143,6 @@ class AccountServiceTest { predictableAccount.setAccount(uniqueAccount); predictableAccount.setAccountType(AccountType.Corr.getKey()); predictableAccount.setCompanyId(companyId); - predictableAccount.setProcessingSign(Allowed.ALLOWED.getKey()); predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); predictableAccount.setRelationId(relationId); @@ -167,17 +166,15 @@ class AccountServiceTest { @Test void accountCorrespondentUpdate() { - String updatedAccount = account + "_updated"; - Account existAccount = new Account(); existAccount.setAccount(account); existAccount.setAccountType(AccountType.Corr.getKey()); - existAccount.setStatus(AccountStatus.ACTIVE.getKey()); + existAccount.setStatus(AccountStatus.CLOSE.getKey()); existAccount.setCompanyId(companyId); Long accountId = accountImdg.insert(existAccount); CorrespondentAccountUpdateRequest correspondentAccountUpdateRequest = new CorrespondentAccountUpdateRequest(); - correspondentAccountUpdateRequest.setAccount(updatedAccount); + correspondentAccountUpdateRequest.setAccount(account); correspondentAccountUpdateRequest.setAccountType(AccountType.Corr.getKey()); correspondentAccountUpdateRequest.setStatus(AccountStatus.ACTIVE.getKey()); correspondentAccountUpdateRequest.setCompanyId(companyId); @@ -196,8 +193,6 @@ class AccountServiceTest { //ASSERT waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); - existAccount.setAccount(updatedAccount); - Account resultUpdating = accountImdg.getSingleObjectByID(accountId); existAccount.setUpdated(resultUpdating.getUpdated()); ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 39ea8b887..b75ad84dc 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -15,11 +15,14 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.account.config.BeanConfiguration; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.config.validation.AccountValidationConfig; import ru.spcex.clearing.account.config.validation.BankAccountValidationConfig; import ru.spcex.clearing.account.config.validation.ValidationConfig; import ru.spcex.clearing.account.errors.AccountError; @@ -32,10 +35,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Allowed; -import ru.spcex.platform.enumeration.Status; -import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import ru.spcex.platform.utils.enumeration.EnumMessage; @@ -53,9 +53,11 @@ import static ru.spcex.clearing.platform.messaging.service.Status.Error; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { + AccountService.class, BankAccountService.class, ValidationConfig.class, BankAccountValidationConfig.class, + AccountValidationConfig.class, BeanConfiguration.class, HazelcastServiceTestConfiguration.class, KafkaConfigTest.class}) @@ -85,6 +87,8 @@ public class BankAccountServiceTest { private Imdg bankAccountImdg; private Imdg accountImdg; private Imdg currencyCodeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg relationImdg; @Autowired private IMessageResolver messageResolver; @@ -110,6 +114,12 @@ public class BankAccountServiceTest { currencyCodeDictionaryImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class ); + clearingMemberCategoryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + relationImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); CurrencyCodeDictionary currencyCodeDictionary = new CurrencyCodeDictionary(); currencyCodeDictionary.setCode("RUB"); currencyCodeDictionary.setName("RUB"); @@ -136,9 +146,25 @@ public class BankAccountServiceTest { BankAccount predictableBankAccount = getBankAccount(); Company company = getTestCompany(); - companyImdg.insert(company); + Long companyId = companyImdg.insert(company); + Long relationId = 777L; Account predictableAccount = getTestAccount(accountId, acc); + predictableAccount.setProcessingSign(null); + predictableAccount.setCompanyId(companyId); + predictableAccount.setRelationId(relationId); clearImdg(accountImdg); + + ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); + clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey()); + clearingMemberCategory.setCompanyId(companyId); + clearingMemberCategoryImdg.insert(clearingMemberCategory); + + Relation relation = new Relation(); + relation.setId(relationId); + relation.setConsumerId(companyId); + relation.setService(Service.MKR.getKey()); + relationImdg.insert(relation); + BankAccountNewRequest bankAccountNewRequest = getBankAccountNewRequest(predictableBankAccount); String jsonString = getJsonStringForNew(bankAccountNewRequest, ID); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java new file mode 100644 index 000000000..5d8b6b124 --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -0,0 +1,170 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.InformationAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.spcex.clearing.account.config.BeanConfiguration; +import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.config.validation.AccountValidationConfig; +import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ValidationConfig; +import ru.spcex.clearing.account.utils.MatcherFactory; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +import javax.annotation.PostConstruct; +import java.util.Map; + +import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.account.utils.TestUtils.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, + InformationAccountValidationConfig.class, + AccountValidationConfig.class, + AccountService.class, + InformationAccountService.class, + HazelcastServiceTestConfiguration.class, + KafkaConfigTest.class}) +class InformationAccountServiceTest { + public static final MatcherFactory.Matcher INFORMATION_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); + public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated"); + private static final int PARTITION = 0; + private static final String account = "123456789123"; + private static final Long companyId = 0L; + private static final Long relationId = 0L; + private Long anltAccountId; + + @Autowired + InformationAccountService informationAccountService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + + @Captor + private ArgumentCaptor producerRecord; + @SpyBean + private MockProducer producer; + + private Imdg informationAccountImdg; + private Imdg accountImdg; + private Imdg companyImdg; + private Imdg accountTypeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg relationImdg; + + + @PostConstruct + private void init() { + hazelcastServiceTest.waitAvailable(); + informationAccountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_InformationAccount, InformationAccount.class + ); + accountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + + companyImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Company, Company.class + ); + accountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class + ); + clearingMemberCategoryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + relationImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); + + Company company = new Company(); + company.setId(companyId); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + companyImdg.insert(company); + + AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); + accountTypeDictionary.setCode(AccountType.Corr.getKey()); + accountTypeDictionary.setName(AccountType.Corr.getKey()); + accountTypeDictionaryImdg.insert(accountTypeDictionary); + + ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); + clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey()); + clearingMemberCategory.setCompanyId(companyId); + clearingMemberCategoryImdg.insert(clearingMemberCategory); + + Relation relation = new Relation(); + relation.setId(relationId); + relation.setConsumerId(companyId); + relation.setService(Service.MKR.getKey()); + relationImdg.insert(relation); + + Account accountAnlt = new Account(); + accountAnlt.setAccountType(AccountType.Anlt.getKey()); + accountAnlt.setCompanyId(1L); + anltAccountId = accountImdg.insert(accountAnlt); + } + + @Test + void accountInformationNew() { + InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest(); + InformationAccountNewRequest.setCompanyId(companyId); + + String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L); + + addRecordToKafka((MockConsumer) informationAccountService.getConsumer(), + Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, + PARTITION, + 0, + jsonString); + + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account predictableAccount = new Account(); + predictableAccount.setAccountType(AccountType.Info.getKey()); + predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); + predictableAccount.setRelationId(relationId); + predictableAccount.setCompanyId(companyId); + + InformationAccount predictableInfoAccount = new InformationAccount(); + predictableInfoAccount.setCompanyId(companyId); + predictableInfoAccount.setClearingAccountId(anltAccountId); + + Account resultAccountNew = accountImdg.getSingleObjectByFieldValues(Map.of("accountType", AccountType.Info.getKey())); + InformationAccount resultInfoAccountNew = informationAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", resultAccountNew.getId())); + + predictableAccount.setId(resultAccountNew.getId()); + predictableAccount.setAccount(informationAccountService.generateInfoAccount(resultInfoAccountNew.getId())); + predictableInfoAccount.setAccountId(resultAccountNew.getId()); + predictableInfoAccount.setId(resultInfoAccountNew.getId()); + + ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount); + INFORMATION_ACCOUNT_MATCHER.assertMatch(resultInfoAccountNew, predictableInfoAccount); + + informationAccountImdg.delete(resultInfoAccountNew); + accountImdg.delete(resultAccountNew); + } + +} \ No newline at end of file diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index b01087991..c2125fe09 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -106,7 +106,7 @@ public class StatementService extends QueueConsumer implements InitializingBean exportRequest.setNameOfTable(service.exportTableName()); kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); } else { - kafkaReqProducer.sendRequestToQueue(Consts.CLEARING_ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); + kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF01, createAccountsRequest(statementRequest.getGroupId(), res.getAccountRequests())); } } diff --git a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java index e84e4b9c3..9759178f4 100644 --- a/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java +++ b/clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/service/StatementServiceServiceTest.java @@ -130,7 +130,7 @@ class StatementServiceServiceTest extends AbstractServiceTest { BaseRequest baseRequest = (BaseRequest) producerRecord.getValue().value(); RequestInfo resultRequestInfo = requestInfoImdg.getSingleObjectByID(baseRequest.getId()); - assertEquals(Consts.CLEARING_ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); + assertEquals(Consts.ACCOUNT_NEW_SDF01, producerRecord.getValue().topic()); assertNotNull(baseRequest); assertNotNull(resultRequestInfo); } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 379a3f0d2..986752d29 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -54,6 +54,7 @@ public interface Consts { String DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE = "clearing-member-category-update"; String DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE = "clearing-member-category-delete"; + String DESTINATION_INFORMATION_ACCOUNT_NEW = "information-account-new"; String DESTINATION_CORRESPONDENT_ACCOUNT_NEW = "correspondent-account-new"; String DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE = "correspondent-account-update"; @@ -63,8 +64,8 @@ public interface Consts { String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; - String CLEARING_ACCOUNT_NEW_SDF01 = "clearing-account-new-sdf01"; - String CLEARING_ACCOUNT_UPDATE_SDF52 = "clearing-account-update-sdf52"; + @Deprecated + String ACCOUNT_NEW_SDF01 = "account-new-sdf01"; String DESTINATION_RELATION_UPDATE = "relation-update"; String DESTINATION_PROFILE_DOCUMENT_NEW = "profile-document-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java new file mode 100644 index 000000000..6b7b9636f --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/InformationAccountNewRequest.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InformationAccountNewRequest { + @JsonProperty + public Long companyId; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java index 2e9cb13a2..ac51a7e37 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +@Deprecated public class AccountSdf01Request { private Long groupingSdf01Id; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java index 863d1a974..987235af7 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdfRequestPart.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01; import com.fasterxml.jackson.annotation.JsonProperty; +@Deprecated public class AccountSdfRequestPart { @JsonProperty private Long sdfId; From 441546dd18f7be963f26a73d7b387af21656e0b5 Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 28 Apr 2023 18:23:29 +0300 Subject: [PATCH 19/39] ClearingAccount in progress --- .../BankAccountValidationConfig.java | 6 +- .../ClearingAccountValidationConfig.java | 108 +++++++++++++++++ .../account/service/BankAccountService.java | 2 +- .../service/ClearingAccountService.java | 111 ++++++++++++++++-- .../service/InformationAccountService.java | 9 +- .../platform/messaging/domain/Consts.java | 3 + .../account/ClearingAccountNewRequest.java | 39 ++++++ .../account/ClearingAccountUpdateRequest.java | 28 +++++ 8 files changed, 289 insertions(+), 17 deletions(-) create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountNewRequest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index a6f997549..64bb37a9a 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -64,7 +65,10 @@ public class BankAccountValidationConfig { ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); - ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate); + ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Bank.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, + accountStatusPredicate, + accountTypePredicate); Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); if (accounts.isEmpty()) return null; return AccountError.AccountAlreadyExist; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java index 8586e5ff4..021d76558 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -1,8 +1,116 @@ package ru.spcex.clearing.account.config.validation; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.WorkflowStatus; +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.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; @Configuration public class ClearingAccountValidationConfig { + @Bean("clearingAccountNewRequestValidator") + public Function clearingAccountNewRequestValidator( + Map> imdgForValidation + ) { + return clearingAccountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(clearingAccountNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccount); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + ClearingAccountNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null), + FieldRequiredRule.instance("account", + ClearingAccountNewRequest::getAccount, + AccountError.RequiredFieldEmpty, + accountValue -> { + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); + ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, + accountStatusPredicate, + accountTypePredicate); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); + if (!accounts.isEmpty()) return null; + return AccountError.AccountAlreadyExist; + }), + FieldRequiredRule.instance("clearingAccountType", + ClearingAccountNewRequest::getClearingAccountType, + AccountError.RequiredFieldEmpty) + ); + }; + } + + + @Bean("clearingAccountUpdateRequestValidator") + public Function clearingAccountUpdateRequestValidator( + Map> imdgForValidation + ) { + return clearingAccountUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(clearingAccountUpdateRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccount); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + ClearingAccountUpdateRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null), + FieldRequiredRule.instance("account", + ClearingAccountUpdateRequest::getAccount, + AccountError.RequiredFieldEmpty, + accountValue -> { + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); + ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, + accountStatusPredicate, + accountTypePredicate); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); + if (accounts.isEmpty()) return AccountError.AccountNotFound; + return null; + }) + ); + }; + } + } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 6147ed9fc..b48060945 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -129,7 +129,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); bankAccount.setCompanyId(req.getCompanyId()); - bankAccount.setAccountId(account.getId()); + bankAccount.setAccountId(accountId); bankAccountId = bankAccountMap.insert(bankAccount); txOk = true; 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 78615dc4e..5471dbcdf 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 @@ -6,41 +6,138 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.ClearingAccount; +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.ClearingAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; -import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +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.utils.validation.IValidator; + +import java.time.Instant; +import java.util.Map; +import java.util.function.Function; @Service public class ClearingAccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); - private final UserRoleVerification userRoleVerification; + private final AccountService accountService; private final ValidationHelper validationHelper; + private final ImdgProvider imdgProvider; + private final Imdg accountImdg; + private final Imdg clearingAccountImdg; + private final Function clearingAccountNewRequestValidator; + private final Function clearingAccountUpdateRequestValidator; @Autowired public ClearingAccountService(Consumer kafkaQueue, Producer kafkaResponseQueue, - UserRoleVerification userRoleVerification, - ValidationHelper validationHelper) { + AccountService accountService, + ValidationHelper validationHelper, + ImdgProvider imdgProvider, + @Qualifier("clearingAccountNewRequestValidator") + Function clearingAccountNewRequestValidator, + @Qualifier("clearingAccountUpdateRequestValidator") + Function clearingAccountUpdateRequestValidator) { super(kafkaQueue, kafkaResponseQueue); - this.userRoleVerification = userRoleVerification; + this.accountService = accountService; this.validationHelper = validationHelper; + this.imdgProvider = imdgProvider; + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); + this.clearingAccountNewRequestValidator = clearingAccountNewRequestValidator; + this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator; } @Override public void afterPropertiesSet() throws Exception { init(); + callback(ClearingAccountNewRequest.class) + .setFunction(this::clearingAccountNew) + .forDestination(Consts.DESTINATION_CLEARING_ACCOUNT_NEW, callbacks::put); + callback(ClearingAccountUpdateRequest.class) + .setFunction(this::clearingAccountUpdate) + .forDestination(Consts.DESTINATION_CLEARING_ACCOUNT_UPDATE, callbacks::put); } - public RequestInfoUpdate clearingAccountNew() { + public RequestInfoUpdate clearingAccountNew(BaseRequest userRequest) { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError( + userRequest, clearingAccountNewRequestValidator + ); + if (requestInfoUpdate != null) return requestInfoUpdate; + ClearingAccountNewRequest req = userRequest.getRequestPayload(); + Instant now = Instant.now(); + Account account = new Account(); + account.setAccount(req.getAccount()); + account.setAccountType(AccountType.Clrn.getKey()); + account.setStatus(AccountStatus.ACTIVE.getKey()); + account.setCompanyId(req.getCompanyId()); + account.setCreated(now); + account.setUpdated(now); + requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId()); + if (requestInfoUpdate != null) return requestInfoUpdate; + + Long clearingAccountId = -1L; + Long accountId = -1L; + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + boolean txOk = false; + imdgTransaction.beginTransaction(); + try { + accountId = accountImdg.insert(account); + + ClearingAccount clearingAccount = new ClearingAccount(); + clearingAccount.setCompanyId(req.getCompanyId()); + clearingAccount.setAccountId(accountId); + clearingAccountId = clearingAccountImdg.insert(clearingAccount); + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new clearing account id {}, account id {}", clearingAccountId, accountId); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed insert, new clearing account id {}, new account id {} (if id = -1, insert is failed)", + clearingAccountId, + accountId); + imdgTransaction.rollbackTransaction(); + } + } return null; } - public RequestInfoUpdate clearingAccountUpdate() { + public RequestInfoUpdate clearingAccountUpdate(BaseRequest userRequest) { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError( + userRequest, clearingAccountUpdateRequestValidator + ); + if (requestInfoUpdate != null) return requestInfoUpdate; + ClearingAccountUpdateRequest req = userRequest.getRequestPayload(); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", req.getAccount()); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); + ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, + accountStatusPredicate, + accountTypePredicate); + Account account = accountImdg.getCollectionObjectsByPredicate(finalPredicate).iterator().next(); + Long accountId = account.getId(); + + ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", accountId)); return null; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 619120fbb..b01d8d389 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -18,7 +18,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccoun import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; -import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; @@ -40,7 +39,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali private final Logger log = LoggerFactory.getLogger(getClass()); private final IMessageResolver messageResolver; private final ImdgProvider imdgProvider; - private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; private final AccountService accountService; private final Function infoAccountNewRequestValidator; @@ -52,7 +50,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali Producer kafkaResponseQueue, IMessageResolver messageResolver, ImdgProvider imdgProvider, - UserRoleVerification userRoleVerification, ValidationHelper validationHelper, AccountService accountService, @Qualifier("informationAccountNewRequestValidator") @@ -60,7 +57,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali super(kafkaQueue, kafkaResponseQueue); this.messageResolver = messageResolver; this.imdgProvider = imdgProvider; - this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; this.accountService = accountService; this.infoAccountNewRequestValidator = infoAccountNewRequestValidator; @@ -83,10 +79,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali public RequestInfoUpdate informationAccountNew(BaseRequest userRequest) { log.debug("InformationAccountNewRequest received"); - RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); - if (requestInfoUpdate != null) return requestInfoUpdate; - - requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator); + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; Long newId = informationAccountImdg.nextIDSequenceFor(); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 986752d29..fc050f1f2 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -54,6 +54,9 @@ public interface Consts { String DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE = "clearing-member-category-update"; String DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE = "clearing-member-category-delete"; + String DESTINATION_CLEARING_ACCOUNT_NEW = "clearing-account-new"; + String DESTINATION_CLEARING_ACCOUNT_UPDATE = "clearing-account-update"; + String DESTINATION_INFORMATION_ACCOUNT_NEW = "information-account-new"; String DESTINATION_CORRESPONDENT_ACCOUNT_NEW = "correspondent-account-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountNewRequest.java new file mode 100644 index 000000000..2de9404db --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountNewRequest.java @@ -0,0 +1,39 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ClearingAccountNewRequest { + @JsonProperty + public String account; + + @JsonProperty + public String clearingAccountType; + + @JsonProperty + public Long companyId; + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getClearingAccountType() { + return clearingAccountType; + } + + public void setClearingAccountType(String clearingAccountType) { + this.clearingAccountType = clearingAccountType; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java new file mode 100644 index 000000000..87d927ca9 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ClearingAccountUpdateRequest { + @JsonProperty + public String account; + + @JsonProperty + public Long companyId; + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +} From 84e737083f74986ffbeec0473ed0106ddb2cd85f Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 2 May 2023 10:53:17 +0300 Subject: [PATCH 20/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D1=83=20sTrades=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=A2=D0=BE=D1=80=D0=B3=D0=BE=D0=B2=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/pom.xml | 1 + clearing-parent/trade-importer/pom.xml | 127 ++++++++++++++++++ .../importer/TradeImporterApplication.java | 12 ++ .../importer/config/DbConnectionConfig.java | 62 +++++++++ .../trade/importer/config/ImdgConfig.java | 47 +++++++ .../trade/importer/config/KafkaConfig.java | 29 ++++ .../importer/config/TradeImporterConfig.java | 20 +++ .../trade/importer/config/settings/Cron.java | 14 ++ .../config/settings/DatabaseSettings.java | 31 +++++ .../settings/ImportTradeServiceSettings.java | 60 +++++++++ .../error/ModuleInitializeException.java | 19 +++ .../services/LauncherCommandReceiver.java | 32 +++++ .../services/TradeImporterService.java | 72 ++++++++++ .../src/main/resources/application.properties | 28 ++++ .../trade/importer/AbstractServiceTest.java | 61 +++++++++ .../config/config/DbTestConnectionConfig.java | 55 ++++++++ .../services/TradeImporterServiceTest.java | 68 ++++++++++ .../platform/messaging/domain/Consts.java | 1 + .../cud/utilities/STradesImportedRequest.java | 4 + 19 files changed, 743 insertions(+) create mode 100644 clearing-parent/trade-importer/pom.xml create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/TradeImporterApplication.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ImdgConfig.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/KafkaConfig.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/TradeImporterConfig.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/Cron.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/ImportTradeServiceSettings.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ModuleInitializeException.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java create mode 100644 clearing-parent/trade-importer/src/main/resources/application.properties create mode 100644 clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java create mode 100644 clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/config/config/DbTestConnectionConfig.java create mode 100644 clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/STradesImportedRequest.java diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 9ff3b6aab..f879cdf1e 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -36,6 +36,7 @@ registry-service test-clearing cleaning-builders + trade-importer diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml new file mode 100644 index 000000000..7ea41af25 --- /dev/null +++ b/clearing-parent/trade-importer/pom.xml @@ -0,0 +1,127 @@ + + 4.0.0 + + ru.spcex.clearing + clearing-parent + SPCEX-1.0.0.0 + + trade-importer + trade-importer + Trade importer module + SPCEX-1.0.0.0 + jar + + + 17 + 17 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.fasterxml.jackson.core + jackson-databind + + + + + + org.springframework + spring-jdbc + + + com.microsoft.sqlserver + mssql-jdbc + + + com.mchange + c3p0 + + + + ru.spcex.clearing + classes + SPCEX-1.0.0.0 + compile + + + ru.spcex.platform + platform-messaging + + + ru.spcex.platform + platform-imdg-api-hazelcast-impl + + + ru.spcex.platform + platform-enum + + + + + org.springframework.boot + spring-boot-starter-test + test + + + ru.spcex.clearing + test-clearing + test + + + + + + + src/main/resources + + application.properties + + false + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.platform + junit-platform-surefire-provider + 1.2.0-M1 + + + org.junit.jupiter + junit-jupiter-engine + 5.2.0-M1 + + + + + + diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/TradeImporterApplication.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/TradeImporterApplication.java new file mode 100644 index 000000000..fe1e53e01 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/TradeImporterApplication.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.trade.importer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TradeImporterApplication { + public static void main(String[] args) { + SpringApplication app = new SpringApplication(TradeImporterApplication.class); + app.run(args); + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java new file mode 100644 index 000000000..3afddae6b --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java @@ -0,0 +1,62 @@ +package ru.spcex.clearing.trade.importer.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import ru.spcex.clearing.trade.importer.config.settings.DatabaseSettings; +import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; +import ru.spcex.clearing.trade.importer.error.ModuleInitializeException; + +import javax.sql.DataSource; +import java.sql.Connection; + +@SuppressWarnings("UnnecessaryLocalVariable") +@Configuration +public class DbConnectionConfig { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + private final DatabaseSettings settings; + + public DbConnectionConfig(ImportTradeServiceSettings settings) { + this.settings = settings.getDatabase(); + } + + @Bean(destroyMethod = "destroy") + public SingleConnectionDataSource dataSource() { + String login = settings.getLogin(); + String password = settings.getPassword(); + String dbUrl = settings.getUrl(); + + SingleConnectionDataSource cpds = new SingleConnectionDataSource(); + try { + cpds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + } catch (Exception ue) { + throw new RuntimeException(ue); + } + cpds.setUrl(dbUrl); + cpds.setUsername(login); + cpds.setPassword(password); + + String OPERATION_DATABASE_CONNECTION_CHECK = String.format("Database [%s] connection check", dbUrl); + try { + Connection conn = cpds.getConnection(); +// conn.close(); + log.info("{}: success", OPERATION_DATABASE_CONNECTION_CHECK); + return cpds; + } catch (Throwable e) { + String msg = String.format("%s: failed: %s -> %s", + OPERATION_DATABASE_CONNECTION_CHECK, e.getClass().getSimpleName(), e.getMessage()); + log.error(msg); + throw new ModuleInitializeException(msg, e); + } + } + + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return jdbcTemplate; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ImdgConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ImdgConfig.java new file mode 100644 index 000000000..b5910ee3f --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ImdgConfig.java @@ -0,0 +1,47 @@ +package ru.spcex.clearing.trade.importer.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +@Configuration +public class ImdgConfig { + private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + if (maxPoolSz > 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + + @Bean(name = "taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Autowired + @Bean + public ImdgProvider imdgProvider( + @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, + @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, + ImportTradeServiceSettings settings + ) { + return new HazelcastService(taskExecutorHazelcastClientInitializer, + taskExecutorIdGeneratorAwaiter, + settings.getHazelcast()); + } + +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/KafkaConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/KafkaConfig.java new file mode 100644 index 000000000..0708fa158 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/KafkaConfig.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.trade.importer.config; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; + +@Configuration +public class KafkaConfig { + + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(ImportTradeServiceSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } + + @Autowired + @Bean + public Producer createProducer(ImportTradeServiceSettings settings) { + return KafkaProducerFactory.producer(settings.getKafkaProducer()); + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/TradeImporterConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/TradeImporterConfig.java new file mode 100644 index 000000000..f6ae24622 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/TradeImporterConfig.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.trade.importer.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; + +@Configuration +@EnableConfigurationProperties +@ComponentScan(basePackages = {"ru.spcex.clearing.trade.importer"}) +public class TradeImporterConfig { + private final ImportTradeServiceSettings settings; + private final ApplicationContext context; + + public TradeImporterConfig(ImportTradeServiceSettings settings, ApplicationContext context) { + this.settings = settings; + this.context = context; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/Cron.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/Cron.java new file mode 100644 index 000000000..08284dba5 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/Cron.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.trade.importer.config.settings; + +public class Cron { + + private String checkSrcDirCron; + + public String getCheckSrcDirCron() { + return checkSrcDirCron; + } + + public void setCheckSrcDirCron(String checkSrcDirCron) { + this.checkSrcDirCron = checkSrcDirCron; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java new file mode 100644 index 000000000..c019613e1 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.trade.importer.config.settings; + +public class DatabaseSettings { + private String login; + private String password; + private String url; + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/ImportTradeServiceSettings.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/ImportTradeServiceSettings.java new file mode 100644 index 000000000..4a864d328 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/ImportTradeServiceSettings.java @@ -0,0 +1,60 @@ +package ru.spcex.clearing.trade.importer.config.settings; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; + +@Component +@PropertySource("file:${spring.config.location}/application.properties") +@ConfigurationProperties("trade-importer") +public class ImportTradeServiceSettings { + private HazelcastClientParams hazelcast; + private KafkaProducerSettings kafkaProducer; + private KafkaConsumerSettings kafkaConsumer; + private DatabaseSettings database; + private Cron cron; + + public HazelcastClientParams getHazelcast() { + return hazelcast; + } + + public void setHazelcast(HazelcastClientParams hazelcast) { + this.hazelcast = hazelcast; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; + } + + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; + } + + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + + public DatabaseSettings getDatabase() { + return database; + } + + public void setDatabase(DatabaseSettings database) { + this.database = database; + } + + public Cron getCron() { + return cron; + } + + public void setCron(Cron cron) { + this.cron = cron; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ModuleInitializeException.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ModuleInitializeException.java new file mode 100644 index 000000000..e6b7f5cc5 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ModuleInitializeException.java @@ -0,0 +1,19 @@ +package ru.spcex.clearing.trade.importer.error; + +public class ModuleInitializeException extends RuntimeException { + public ModuleInitializeException() { + } + + public ModuleInitializeException(String message) { + super(message); + } + + public ModuleInitializeException(String message, Throwable cause) { + super(message, cause); + } + + public ModuleInitializeException(Throwable cause) { + super(cause); + } + +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java new file mode 100644 index 000000000..074343102 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.trade.importer.services; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.enumeration.Task; + +@Service +public class LauncherCommandReceiver extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final TradeImporterService importer; + + @Autowired + public LauncherCommandReceiver(Consumer kafkaQueue, + TradeImporterService importer) { + super(kafkaQueue); + this.importer = importer; + } + + @Override + public void afterPropertiesSet() { + callback(LauncherCommandRequest.class) + .setConsumer(action -> importer.process()) + .forDestination(Task.getOfTrades.topic(), callbacks::put); // GTRD + init(); + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java new file mode 100644 index 000000000..22a023f7f --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -0,0 +1,72 @@ +package ru.spcex.clearing.trade.importer.services; + +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import ru.clearing.classes.statics.data.misc.STrades; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Collection; +import java.util.Map; + +import static ru.spcex.clearing.platform.messaging.domain.Consts.S_TRADES_IMPORTED; + +@Service +@EnableScheduling +public class TradeImporterService { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg sTradesImdg; + private final JdbcTemplate jdbcTemplate; + private final Producer producer; + private static final RowMapper ROW_MAPPER = BeanPropertyRowMapper.newInstance(STrades.class); + + + public TradeImporterService(ImdgProvider imdgProvider, JdbcTemplate jdbcTemplate, Producer producer) { + this.sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); + this.jdbcTemplate = jdbcTemplate; + this.producer = producer; + } + + @Scheduled(cron = "${trade-importer.cron.load-from-db-cron}") + public void run() { + process(); + } + + public void process() { + Collection tradesFromDB = jdbcTemplate.query("SELECT * FROM Trades", ROW_MAPPER); + + for (STrades tradesDb : tradesFromDB) { + if (isValidTrades(tradesDb)) { + STrades sTrades = sTradesImdg.getSingleObjectByFieldValues(Map.of("tradeDate", tradesDb.getTradeDate(), + "tradeNum", tradesDb.getTradeNum(), + "operation", tradesDb.getOperation(), + "classCode", tradesDb.getClassCode())); + if (sTrades != null) tradesDb.setId(sTrades.getId()); + sTradesImdg.insert(tradesDb); + } else { + log.warn(String.format("(10001) \"Сделка с номером в ТС = %s некорректна\"", tradesDb.getTradeNum())); + } + } + + STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); + producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); + } + + private boolean isValidTrades(STrades trades) { + return trades.getTradeDate() != null + && trades.getTradeNum() != null + && StringUtils.hasText(trades.getOperation()) + && trades.getTradeNum() != null; + } +} diff --git a/clearing-parent/trade-importer/src/main/resources/application.properties b/clearing-parent/trade-importer/src/main/resources/application.properties new file mode 100644 index 000000000..fb9ca6cef --- /dev/null +++ b/clearing-parent/trade-importer/src/main/resources/application.properties @@ -0,0 +1,28 @@ +spring.main.web-application-type=none + +#trade-importer.cron.load-from-db-cron=0 0/5 * * * ? - каждые 5 минут +trade-importer.cron.load-from-db-cron=0 0/5 * * * ? + +trade-importer.database.login=sa +trade-importer.database.password=Aa123456 +trade-importer.database.url=jdbc:sqlserver://localhost:1433;database=SPVB_TS;schema=dbo + +trade-importer.hazelcast.cluster-members=127.0.0.1:5701 +trade-importer.hazelcast.login=dev +trade-importer.hazelcast.password=dev-pass + +trade-importer.kafka-consumer.bootstrap-servers=localhost:9092 +trade-importer.kafka-consumer.group-id=dev-group- trade-importer +trade-importer.kafka-consumer.enable-auto-commit=false +trade-importer.kafka-consumer.session-timeout-ms=30000 +trade-importer.kafka-consumer.auto-offset-reset=latest +trade-importer.kafka-consumer.linger-ms=1 +trade-importer.kafka-consumer.buffer-memory=33554432 + +trade-importer.kafka-producer.bootstrap-servers=localhost:9092 +trade-importer.kafka-producer.acks=all +trade-importer.kafka-producer.retries=0 +trade-importer.kafka-producer.batch-size=16384 +trade-importer.kafka-producer.linger-ms=1 +trade-importer.kafka-producer.buffer-memory=33554432 + diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java new file mode 100644 index 000000000..3e1e33c3d --- /dev/null +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java @@ -0,0 +1,61 @@ +package ru.spcex.clearing.trade.importer; + +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.misc.STrades; +import ru.clearing.classes.statics.data.scheduler.PlannerAllToday; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.test.MatcherFactory; +import ru.spcex.clearing.test.TestUtils; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.clearing.trade.importer.config.config.DbTestConnectionConfig; +import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; +import ru.spcex.clearing.trade.importer.services.LauncherCommandReceiver; +import ru.spcex.clearing.trade.importer.services.TradeImporterService; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; +import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + DbTestConnectionConfig.class, + ImportTradeServiceSettings.class, + LauncherCommandReceiver.class, + TradeImporterService.class, + ImdgTestConfig.class, + KafkaTestConfig.class}) +public abstract class AbstractServiceTest { + protected static final MatcherFactory.Matcher PLANNER_ALL_TODAY_MATCHER = usingIgnoringFieldsComparator("created", "updated"); + protected static final long id = currentID.getAndIncrement(); + protected Imdg sTradesImdg; + + @Captor + protected ArgumentCaptor producerRecord; + @MockBean + protected MockProducer mockProducer; + @Autowired + @Qualifier("hazelcastServiceTest") + protected ImdgProvider imdgProvider; + + protected void init() { + waitAvailableImdgProviderAndAddAdminWithDefaultId(); + this.sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); + + TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); + doReturn(future).when(mockProducer).send(producerRecord.capture()); + } +} diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/config/config/DbTestConnectionConfig.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/config/config/DbTestConnectionConfig.java new file mode 100644 index 000000000..c5a0b68cb --- /dev/null +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/config/config/DbTestConnectionConfig.java @@ -0,0 +1,55 @@ +package ru.spcex.clearing.trade.importer.config.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import ru.spcex.clearing.trade.importer.error.ModuleInitializeException; + +import javax.sql.DataSource; +import java.sql.Connection; + +@SuppressWarnings("UnnecessaryLocalVariable") +@Configuration +public class DbTestConnectionConfig { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + @Bean(destroyMethod = "destroy") + public SingleConnectionDataSource dataSource() { + String login = "sa"; + String password = "Aa123456"; + String dbUrl = "jdbc:sqlserver://localhost:1433;database=SPVB_TS;schema=dbo"; + + + SingleConnectionDataSource cpds = new SingleConnectionDataSource(); + try { + cpds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + } catch (Exception ue) { + throw new RuntimeException(ue); + } + cpds.setUrl(dbUrl); + cpds.setUsername(login); + cpds.setPassword(password); + + String OPERATION_DATABASE_CONNECTION_CHECK = String.format("Database [%s] connection check", dbUrl); + try { + Connection conn = cpds.getConnection(); +// conn.close(); + log.info("{}: success", OPERATION_DATABASE_CONNECTION_CHECK); + return cpds; + } catch (Throwable e) { + String msg = String.format("%s: failed: %s -> %s", + OPERATION_DATABASE_CONNECTION_CHECK, e.getClass().getSimpleName(), e.getMessage()); + log.error(msg); + throw new ModuleInitializeException(msg, e); + } + } + + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return jdbcTemplate; + } +} diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java new file mode 100644 index 000000000..615339e94 --- /dev/null +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.trade.importer.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.junit.jupiter.api.BeforeAll; +import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.misc.STrades; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.trade.importer.AbstractServiceTest; +import ru.spcex.platform.enumeration.Task; + +import javax.annotation.PostConstruct; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; + +class TradeImporterServiceTest extends AbstractServiceTest { + @Autowired + LauncherCommandReceiver launcherCommandReceiver; + + @PostConstruct + public void init() { + super.init(); + } + + @BeforeAll + static void setProperty() { + Path path = Paths.get("src", "main", "resources"); + String currentPath = path.toAbsolutePath().toString(); + System.setProperty("spring.config.location", currentPath); +// Hazelcast.shutdownAll(); + } + + /** + * {@link TradeImporterService#process()}
+ * Тест проверяет обновление сущности {@link STrades}.
+ * Входной запрос {@link LauncherCommandRequest}:
+ */ +// @Test для работы теста нужна тестовая база Microsoft SQL с данными + void process() { + STrades trades = new STrades(); + trades.setId(22L); + trades.setTradeDate(LocalDate.of(2023,4,19)); + trades.setTradeNum(661486L); + trades.setOperation("operation20"); + trades.setClassCode("UESC"); + Long id = sTradesImdg.insert(trades); + + addRecordToKafka((MockConsumer) launcherCommandReceiver.getConsumer(), Task.getOfTrades.topic(), 0, 1, getJsonStringForNew(new LauncherCommandRequest(),0)); + + //waiting for kafka producer send message + verify(mockProducer, timeout(30_000L).times(1)) + .send(producerRecord.capture()); + + STrades sTrades = sTradesImdg.getSingleObjectByFieldValues(Map.of("tradeDate", trades.getTradeDate(), + "tradeNum", trades.getTradeNum(), + "operation", trades.getOperation(), + "classCode", trades.getClassCode())); + + assertEquals(sTrades.getId(), id); + } +} \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index f07a3033e..04ec6af5c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -86,6 +86,7 @@ public interface Consts { String SDF03_PROCESS = "sdf03-process"; String SDF11_PROCESS = "sdf11-process"; String EXPORT_PROCESS = "export-process"; + String S_TRADES_IMPORTED = "s_trades-imported"; String ACCOUNT_NEW = "account-new"; String ACCOUNT_TERMINATION = "account-termination"; String BALANCE_ACCOUNT_NEW = "balance-account-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/STradesImportedRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/STradesImportedRequest.java new file mode 100644 index 000000000..348527aae --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/STradesImportedRequest.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.utilities; + +public class STradesImportedRequest { +} From 7e4f7788e65f2ae7956a1d645d3aed804956c4ab Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 2 May 2023 10:55:31 +0300 Subject: [PATCH 21/39] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=BE=D0=B2,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=20destroyMe?= =?UTF-8?q?thod=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=91=D0=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imdg/config/DbConnectionConfig.java | 10 +- .../spcex/clearing/imdg/AllMapStoreTest.java | 22 +- ...tore.java => CheckerBusinessMapStore.java} | 9 +- ...re.java => CheckerDictionaryMapStore.java} | 4 +- .../structure/RunnableMapNamesForTesting.java | 300 +++++++++--------- 5 files changed, 172 insertions(+), 173 deletions(-) rename clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/{BusinessObjectAndBusinessEventForCheckMapStore.java => CheckerBusinessMapStore.java} (89%) rename clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/{DictionaryObjectForCheckMapStore.java => CheckerDictionaryMapStore.java} (89%) diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java index ef8328659..db2334114 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java @@ -24,9 +24,8 @@ public class DbConnectionConfig { this.settings = settings.getDatabase(); } - @Bean - public DataSource dataSource() { - DataSource result; + @Bean(destroyMethod = "close") + public ComboPooledDataSource dataSource() { String login = settings.getLogin(); String password = settings.getPassword(); String logTimeoutPart = ""; @@ -49,14 +48,13 @@ public class DbConnectionConfig { cpds.setNumHelperThreads(numHelperThreads); cpds.setCheckoutTimeout(timeoutSec * 1000); logTimeoutPart = String.format(" (timeout=%ds)", timeoutSec); - result = cpds; String OPERATION_DATABASE_CONNECTION_CHECK = String.format("Database [%s] connection check", dbPath); try { - Connection conn = result.getConnection(); + Connection conn = cpds.getConnection(); conn.close(); log.info("{}: success", OPERATION_DATABASE_CONNECTION_CHECK); - return result; + return cpds; } catch (Throwable e) { String msg = String.format("%s%s: failed: %s -> %s", OPERATION_DATABASE_CONNECTION_CHECK, logTimeoutPart, e.getClass().getSimpleName(), e.getMessage()); diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java index e6c26ef2f..7886fe7b1 100644 --- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java +++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java @@ -26,8 +26,8 @@ import ru.clearing.platform.dictionary.CompanySymbolDictionary; import ru.spcex.clearing.imdg.base.*; import ru.spcex.clearing.imdg.config.DbTestConnectionConfig; import ru.spcex.clearing.imdg.config.TestConfiguration; -import ru.spcex.clearing.imdg.structure.BusinessObjectAndBusinessEventForCheckMapStore; -import ru.spcex.clearing.imdg.structure.DictionaryObjectForCheckMapStore; +import ru.spcex.clearing.imdg.structure.CheckerBusinessMapStore; +import ru.spcex.clearing.imdg.structure.CheckerDictionaryMapStore; import ru.spcex.clearing.imdg.utils.BusinessEventRowMapper; import ru.spcex.clearing.imdg.utils.DbDataUtils; import ru.spcex.clearing.imdg.utils.SpcexObjectBaseRowMapper; @@ -43,8 +43,8 @@ import java.sql.*; import java.util.*; import java.util.stream.Collectors; -import static ru.spcex.clearing.imdg.structure.RunnableMapNamesForTesting.businessObjectAndBusinessEventForCheckMapStores; -import static ru.spcex.clearing.imdg.structure.RunnableMapNamesForTesting.dictionaryObjectForCheckMapStores; +import static ru.spcex.clearing.imdg.structure.RunnableMapNamesForTesting.checkerBusinessMapStores; +import static ru.spcex.clearing.imdg.structure.RunnableMapNamesForTesting.checkerDictionaryMapStores; import static ru.spcex.clearing.imdg.utils.DbDataUtils.generatingRandomString; @ContextConfiguration(classes = { @@ -77,7 +77,7 @@ public class AllMapStoreTest { @PostConstruct public void initTestObjects() { try { - for (BusinessObjectAndBusinessEventForCheckMapStore objectForCheck : businessObjectAndBusinessEventForCheckMapStores) { + for (CheckerBusinessMapStore objectForCheck : checkerBusinessMapStores) { SpcexObjectBase object = objectForCheck.getClazz().getDeclaredConstructor().newInstance(); DbDataUtils.fillObjectDefaultValues(object, object.getClass()); if (objectForCheck.getClazz().equals(CompanyHistory.class)) { @@ -112,7 +112,7 @@ public class AllMapStoreTest { objectForCheck.setPredictableObj(object); } } - for (DictionaryObjectForCheckMapStore objectForCheck : dictionaryObjectForCheckMapStores) { + for (CheckerDictionaryMapStore objectForCheck : checkerDictionaryMapStores) { AbstractDictionary object = objectForCheck.getClazz().getDeclaredConstructor().newInstance(); DbDataUtils.fillObjectDefaultValues(object, object.getClass()); objectForCheck.setPredictableObj(object); @@ -178,7 +178,7 @@ public class AllMapStoreTest { testConfig.shutDownHazelcast(); testConfig.reinitHazlecastInstance(); - for (BusinessObjectAndBusinessEventForCheckMapStore objectForCheck : businessObjectAndBusinessEventForCheckMapStores) { + for (CheckerBusinessMapStore objectForCheck : checkerBusinessMapStores) { String mapName = objectForCheck.getMapName(); SpcexObjectBase actual; if (getMapStore(mapName) instanceof TemplateEventMapStore) { @@ -200,7 +200,7 @@ public class AllMapStoreTest { } objectForCheck.getMATCHER().assertMatch(actual, objectForCheck.getPredictableObj()); } - for (DictionaryObjectForCheckMapStore objectForCheck : dictionaryObjectForCheckMapStores) { + for (CheckerDictionaryMapStore objectForCheck : checkerDictionaryMapStores) { String mapName = objectForCheck.getMapName(); AbstractDictionary actual; IMap map = testConfig.getHazelcastInstance().getMap(mapName); @@ -215,7 +215,7 @@ public class AllMapStoreTest { Assumptions.assumeTrue(false, "todo удалить если будет не нужна, пока не работает из-за \"deleteIsSupported() return false\" в SimpleObjectMapStore."); saveBusinessObjectAndBusinessEventToMaps(); - for (BusinessObjectAndBusinessEventForCheckMapStore objectForCheck : businessObjectAndBusinessEventForCheckMapStores) { + for (CheckerBusinessMapStore objectForCheck : checkerBusinessMapStores) { IMap map = testConfig.getHazelcastInstance().getMap(objectForCheck.getMapName()); map.remove(ID); String sql = String.format("SELECT * FROM %s WHERE id = %d", getTableNameFromMapStore(objectForCheck.getMapName()), ID); @@ -250,7 +250,7 @@ public class AllMapStoreTest { } private void saveBusinessObjectAndBusinessEventToMaps() { - for (BusinessObjectAndBusinessEventForCheckMapStore objectForCheck : businessObjectAndBusinessEventForCheckMapStores) { + for (CheckerBusinessMapStore objectForCheck : checkerBusinessMapStores) { String mapName = objectForCheck.getMapName(); SpcexObjectBase spcexObjectBase = objectForCheck.getPredictableObj(); spcexObjectBase.setId(ID); @@ -261,7 +261,7 @@ public class AllMapStoreTest { } private void saveDictionaryObjectToMaps() { - for (DictionaryObjectForCheckMapStore objectForCheck : dictionaryObjectForCheckMapStores) { + for (CheckerDictionaryMapStore objectForCheck : checkerDictionaryMapStores) { String mapName = objectForCheck.getMapName(); AbstractDictionary dictionaryObj = objectForCheck.getPredictableObj(); dictionaryObj.setId(ID); diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/BusinessObjectAndBusinessEventForCheckMapStore.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerBusinessMapStore.java similarity index 89% rename from clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/BusinessObjectAndBusinessEventForCheckMapStore.java rename to clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerBusinessMapStore.java index 9e02734db..bec21d209 100644 --- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/BusinessObjectAndBusinessEventForCheckMapStore.java +++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerBusinessMapStore.java @@ -11,7 +11,8 @@ import java.lang.reflect.Method; import static ru.spcex.clearing.imdg.utils.MatcherFactory.usingIgnoringFieldsComparator; -public class BusinessObjectAndBusinessEventForCheckMapStore { + +public class CheckerBusinessMapStore { public final Matcher MATCHER; private final Logger log = LoggerFactory.getLogger(this.getClass()); @@ -21,20 +22,20 @@ public class BusinessObjectAndBusinessEventForCheckMapStore { private SpcexObjectBase predictableObj; - public BusinessObjectAndBusinessEventForCheckMapStore(String mapName, Class clazz) { + public CheckerBusinessMapStore(String mapName, Class clazz) { this.mapName = mapName; this.clazz = clazz; this.MATCHER = usingIgnoringFieldsComparator(); } - public BusinessObjectAndBusinessEventForCheckMapStore(String mapName, Class clazz, SettingOperation... settingOperations) { + public CheckerBusinessMapStore(String mapName, Class clazz, SettingOperation... settingOperations) { this.mapName = mapName; this.clazz = clazz; this.settingOperations = settingOperations; this.MATCHER = usingIgnoringFieldsComparator(); } - public BusinessObjectAndBusinessEventForCheckMapStore(String mapName, Class clazz, Matcher MATCHER) { + public CheckerBusinessMapStore(String mapName, Class clazz, Matcher MATCHER) { this.mapName = mapName; this.clazz = clazz; this.MATCHER = MATCHER; diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/DictionaryObjectForCheckMapStore.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerDictionaryMapStore.java similarity index 89% rename from clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/DictionaryObjectForCheckMapStore.java rename to clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerDictionaryMapStore.java index 8f34e25d7..aeb3ac75b 100644 --- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/DictionaryObjectForCheckMapStore.java +++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/CheckerDictionaryMapStore.java @@ -8,7 +8,7 @@ import java.lang.reflect.InvocationTargetException; import static ru.spcex.clearing.imdg.utils.MatcherFactory.usingIgnoringFieldsComparator; -public class DictionaryObjectForCheckMapStore { +public class CheckerDictionaryMapStore { public final Matcher MATCHER = usingIgnoringFieldsComparator(); private final String mapName; @@ -16,7 +16,7 @@ public class DictionaryObjectForCheckMapStore { private AbstractDictionary predictableObj; - public DictionaryObjectForCheckMapStore(String mapName, Class clazz) { + public CheckerDictionaryMapStore(String mapName, Class clazz) { this.mapName = mapName; this.clazz = clazz; } diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java index 48446bb52..61480d59f 100644 --- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java +++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/structure/RunnableMapNamesForTesting.java @@ -28,7 +28,7 @@ import ru.clearing.classes.statics.data.statement.Statement; import ru.clearing.classes.statics.data.user.*; import ru.clearing.platform.dictionary.*; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.imdg.structure.BusinessObjectAndBusinessEventForCheckMapStore.SettingOperation; +import ru.spcex.clearing.imdg.structure.CheckerBusinessMapStore.SettingOperation; import java.math.BigDecimal; import java.time.Instant; @@ -40,24 +40,24 @@ import static ru.spcex.clearing.imdg.utils.DbDataUtils.generatingRandomInstant; import static ru.spcex.clearing.imdg.utils.MatcherFactory.usingIgnoringFieldsComparator; public class RunnableMapNamesForTesting { - public static List businessObjectAndBusinessEventForCheckMapStores; - public static List dictionaryObjectForCheckMapStores; + public static List checkerBusinessMapStores; + public static List checkerDictionaryMapStores; static { init(); } private static void init() { - businessObjectAndBusinessEventForCheckMapStores = new LinkedList<>(); - dictionaryObjectForCheckMapStores = new LinkedList<>(); + checkerBusinessMapStores = new LinkedList<>(); + checkerDictionaryMapStores = new LinkedList<>(); //business event // businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_AccountBalanceHistory, AccountBalanceHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_AccountHistory, AccountHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_BankAccountHistory, BankAccountHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CompanyHistory, CompanyHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_AccountHistory, AccountHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_BankAccountHistory, BankAccountHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CompanyHistory, CompanyHistory.class, usingIgnoringFieldsComparator("object.profile.clearingCode", "object.profile.fullName", "object.profile.registrationCode", "object.profile.shortName", "object.profile.tradingCode"))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ExecutionDepositHistory, ExecutionDepositHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ExecutionDepositHistory, ExecutionDepositHistory.class, usingIgnoringFieldsComparator( "object.firstLegAmount", "object.interestAmount", @@ -70,7 +70,7 @@ public class RunnableMapNamesForTesting { new SettingOperation("object.quantity", new Object[]{new BigDecimal("853.640000000000000000")}), new SettingOperation("object.secondLegAmount", new Object[]{new BigDecimal("854.640000000000000000")})*/ )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ExecutionFondHistory, ExecutionFondHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ExecutionFondHistory, ExecutionFondHistory.class, usingIgnoringFieldsComparator( "object.interestAmount", "object.lots", @@ -80,22 +80,22 @@ public class RunnableMapNamesForTesting { new SettingOperation("object.lots", new Object[]{new BigDecimal("851.640000000000000000")}), new SettingOperation("object.quantity", new Object[]{new BigDecimal("852.640000000000000000")}), new SettingOperation("object.settlementAmount", new Object[]{new BigDecimal("853.640000000000000000")})*/)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_InformationAccountHistory, InformationAccountHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_RelationHistory, RelationHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SessionHistory, SessionHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_InformationAccountHistory, InformationAccountHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_RelationHistory, RelationHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SessionHistory, SessionHistory.class)); // businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SecurityHistory, SecurityHistory.class)); // parent table - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UserConnectHistory, UserConnectHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UserHistory, UserHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CurrencyHistory, CurrencyHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ListingHistory, ListingHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UserConnectHistory, UserConnectHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UserHistory, UserHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CurrencyHistory, CurrencyHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ListingHistory, ListingHistory.class, usingIgnoringFieldsComparator( "object.lotSize") /*new SettingOperation("object.lotSize", new Object[]{new BigDecimal("850.640000000000000000")}),*/)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_MarketHistory, MarketHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CompanySymbolsHistory, CompanySymbolsHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ProfileDocumentHistory, ProfileDocumentHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ClearingMemberCategoryHistory, ClearingMemberCategoryHistory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_MoneyMarketSecurityHistory, MoneyMarketSecurityHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_MarketHistory, MarketHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CompanySymbolsHistory, CompanySymbolsHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ProfileDocumentHistory, ProfileDocumentHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ClearingMemberCategoryHistory, ClearingMemberCategoryHistory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_MoneyMarketSecurityHistory, MoneyMarketSecurityHistory.class, usingIgnoringFieldsComparator( // todo поправить тест для ASecurityHistoryMapStore "object.created", "object.updated", "object.fullName", "object.fullNameEng", @@ -106,7 +106,7 @@ public class RunnableMapNamesForTesting { "object.shortName", "object.shortNameEng", "object.uuid", "object.workflowStatus" ))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_EquitySecurityHistory, EquitySecurityHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_EquitySecurityHistory, EquitySecurityHistory.class, usingIgnoringFieldsComparator( // todo поправить тест для ASecurityHistoryMapStore "object.created", "object.updated", "object.fullName", "object.fullNameEng", @@ -117,7 +117,7 @@ public class RunnableMapNamesForTesting { "object.shortName", "object.shortNameEng", "object.uuid", "object.workflowStatus" ))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_FixedIncomeSecurityHistory, FixedIncomeSecurityHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_FixedIncomeSecurityHistory, FixedIncomeSecurityHistory.class, usingIgnoringFieldsComparator( // todo поправить тест для ASecurityHistoryMapStore "object.created", "object.updated", "object.fullName", "object.fullNameEng", @@ -128,43 +128,43 @@ public class RunnableMapNamesForTesting { "object.shortName", "object.shortNameEng", "object.uuid", "object.workflowStatus" ))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_FixedIncomeCashFlowHistory, FixedIncomeCashFlowHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_FixedIncomeCashFlowHistory, FixedIncomeCashFlowHistory.class, usingIgnoringFieldsComparator("object.accruedCoupon") /* new SettingOperation("getObject.setAccruedCoupon", new Object[]{new BigDecimal("870.680000000000000000")})*/)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CouponPeriodHistory, CouponPeriodHistory.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CouponPeriodHistory, CouponPeriodHistory.class, usingIgnoringFieldsComparator("object.couponRate") /* new SettingOperation("getObject.setCouponRate", new Object[]{new BigDecimal("870.680000000000000000")})*/)); //business object // businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Account, Account.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ClearingCalendar, ClearingCalendar.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Company, Company.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Account, Account.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ClearingCalendar, ClearingCalendar.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Company, Company.class, usingIgnoringFieldsComparator("profile.clearingCode", "profile.fullName", "profile.registrationCode", "profile.shortName", "profile.tradingCode"))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ErrorText, ErrorText.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ErrorText, ErrorText.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, new SettingOperation("setInterestAmount", new Object[]{new BigDecimal("850.64")}), new SettingOperation("setLots", new Object[]{new BigDecimal("851.64")}), new SettingOperation("setQuantity", new Object[]{new BigDecimal("852.64")}), new SettingOperation("setSettlementAmount", new Object[]{new BigDecimal("853.64")}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Launcher, Launcher.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_LiabilitiesClaimsMoney, LiabilitiesClaimsMoney.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Launcher, Launcher.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_LiabilitiesClaimsMoney, LiabilitiesClaimsMoney.class, new SettingOperation("setClaimsAmount", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("04.92")}), new SettingOperation("setLiabilitiesAmount", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("06.26")}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Listing, Listing.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Listing, Listing.class, new SettingOperation("setLotSize", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("21.11")}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ManagementJournal, ManagementJournal.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Market, Market.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Planner, Planner.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_PlannerTemplate, PlannerTemplate.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Relation, Relation.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ManagementJournal, ManagementJournal.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Market, Market.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Planner, Planner.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_PlannerTemplate, PlannerTemplate.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Relation, Relation.class)); // businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Security, Security.class)); // класс наследуется - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Statement, Statement.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Statement, Statement.class, new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("23.22")}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UserConnect, UserConnect.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_User, User.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UserConnect, UserConnect.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_User, User.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class , usingIgnoringFieldsComparator( // todo поправить тест для ASecurityMapStore - проблема в заполнении securityId "created", "updated", "fullName", "fullNameEng", @@ -176,7 +176,7 @@ public class RunnableMapNamesForTesting { "uuid", "workflowStatus" ) )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class, usingIgnoringFieldsComparator( // todo поправить тест для ASecurityMapStore "created", "updated", "fullName", "fullNameEng", @@ -189,88 +189,88 @@ public class RunnableMapNamesForTesting { ))); //dictionary - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_BalanceAccountTypeDictionary, BalanceAccountTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ChargeDirectionDictionary, ChargeDirectionDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CompanyRoleDictionary, CompanyRoleDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ConnectionStateDictionary, ConnectionStateDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ContactTypeDictionary, ContactTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, CorporationSoleTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CountryCodeDictionary, CountryCodeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CourierTypeDictionary, CourierTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_DayStatusDictionary, DayStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_DocumentTypeDictionary, DocumentTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_InstrumentTypeDictionary, InstrumentTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_LegalKindDictionary, LegalKindDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ManagementJournalPurposeDictionary, ManagementJournalPurposeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ManagementJournalStatusDictionary, ManagementJournalStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ManagementJournalTypeDictionary, ManagementJournalTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_MoneyFlowSideDictionary, MoneyFlowSideDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_MarketCodeDictionary, MarketCodeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_OperationStatusDictionary, OperationStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_OperationTypeDictionary, OperationTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_OrganizationTypeDictionary, OrganizationTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ParentDictionary, ParentDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ResultStatusDictionary, ResultStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_SessionStatusDictionary, SessionStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ServiceDictionary, ServiceDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ServiceProductDictionary, ServiceProductDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_StatementTypeDictionary, StatementTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_SideDictionary, SideDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TaskDictionary, TaskDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TaskStatusDictionary, TaskStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TermTypeDictionary, TermTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_UserRoleDictionary, UserRoleDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_WorkflowStatusDictionary, WorkflowStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ShareTypeDictionary, ShareTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_BondTypeDictionary, BondTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary, TradingClearingRegistryTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryLevelDictionary, TradingClearingRegistryLevelDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryPurposeDictionary, TradingClearingRegistryPurposeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryDesignationDictionary, RegistryDesignationDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryInstrumentTypeDictionary, RegistryInstrumentTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryCapacityDictionary, RegistryCapacityDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryUnitDictionary, RegistryUnitDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_RegistryStatusDictionary, RegistryStatusDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_BalanceDimensionDictionary, BalanceDimensionDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_DepoAccountTypeDictionary, DepoAccountTypeDictionary.class)); - dictionaryObjectForCheckMapStores.add(new DictionaryObjectForCheckMapStore<>(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_BalanceAccountTypeDictionary, BalanceAccountTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ChargeDirectionDictionary, ChargeDirectionDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CompanyRoleDictionary, CompanyRoleDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ConnectionStateDictionary, ConnectionStateDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ContactTypeDictionary, ContactTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, CorporationSoleTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CountryCodeDictionary, CountryCodeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CourierTypeDictionary, CourierTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_DayStatusDictionary, DayStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_DocumentTypeDictionary, DocumentTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_InstrumentTypeDictionary, InstrumentTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_LegalKindDictionary, LegalKindDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ManagementJournalPurposeDictionary, ManagementJournalPurposeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ManagementJournalStatusDictionary, ManagementJournalStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ManagementJournalTypeDictionary, ManagementJournalTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_MoneyFlowSideDictionary, MoneyFlowSideDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_MarketCodeDictionary, MarketCodeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_OperationStatusDictionary, OperationStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_OperationTypeDictionary, OperationTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_OrganizationTypeDictionary, OrganizationTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ParentDictionary, ParentDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ResultStatusDictionary, ResultStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_SessionStatusDictionary, SessionStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ServiceDictionary, ServiceDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ServiceProductDictionary, ServiceProductDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_StatementTypeDictionary, StatementTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_SideDictionary, SideDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TaskDictionary, TaskDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TaskStatusDictionary, TaskStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TermTypeDictionary, TermTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_UserRoleDictionary, UserRoleDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_WorkflowStatusDictionary, WorkflowStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ShareTypeDictionary, ShareTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_BondTypeDictionary, BondTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary, TradingClearingRegistryTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryLevelDictionary, TradingClearingRegistryLevelDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_TradingClearingRegistryPurposeDictionary, TradingClearingRegistryPurposeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryDesignationDictionary, RegistryDesignationDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryInstrumentTypeDictionary, RegistryInstrumentTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryCapacityDictionary, RegistryCapacityDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryUnitDictionary, RegistryUnitDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryCodeDictionary, RegistryCodeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_RegistryStatusDictionary, RegistryStatusDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_BalanceDimensionDictionary, BalanceDimensionDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_DepoAccountTypeDictionary, DepoAccountTypeDictionary.class)); + checkerDictionaryMapStores.add(new CheckerDictionaryMapStore<>(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class)); //object - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_AdmittedDealRegister, AdmittedDealRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_AdmittedDealRegister, AdmittedDealRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_BankAccount, BankAccount.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ClearMemberRegister, ClearMemberRegister.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Contact, Contact.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ContractRegister, ContractRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_BankAccount, BankAccount.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ClearMemberRegister, ClearMemberRegister.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Contact, Contact.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ContractRegister, ContractRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CoveredDealRegister, CoveredDealRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CoveredDealRegister, CoveredDealRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Currency, Currency.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_DealRegister, DealRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Currency, Currency.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_DealRegister, DealRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setFirstLegAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), @@ -278,11 +278,11 @@ public class RunnableMapNamesForTesting { new SettingOperation("setInterestAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setLots", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setQuantity", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_InDocumentJournal, InDocumentJournal.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_InDocumentJournal, InDocumentJournal.class, new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_KeyRate, KeyRate.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_KeyRate, KeyRate.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class, usingIgnoringFieldsComparator( // todo поправить тест для ASecurityHistoryMapStore "created", "updated", "fullName", "fullNameEng", @@ -297,58 +297,58 @@ public class RunnableMapNamesForTesting { )//, //new SettingOperation("setNominalValue", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("25.25")}) )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Notification, Notification.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_OrderRegister, OrderRegister.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_OutDocumentJournal, OutDocumentJournal.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Notification, Notification.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_OrderRegister, OrderRegister.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_OutDocumentJournal, OutDocumentJournal.class, new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{new BigDecimal("28.28")}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_ReportRegister, ReportRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_ReportRegister, ReportRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf01, SDf01.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf02, SDf02.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf03, SDf03.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf04, SDf04.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf05, SDf05.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf08, SDf08.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf09, SDf09.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf10, SDf10.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf11, SDf11.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf12, SDf12.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf13, SDf13.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf16, SDf16.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf17, SDf17.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf18, SDf18.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_Session, Session.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_STrades, STrades.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf01, SDf01.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf02, SDf02.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf03, SDf03.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf04, SDf04.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf05, SDf05.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf08, SDf08.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf09, SDf09.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf10, SDf10.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf11, SDf11.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf12, SDf12.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf13, SDf13.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf16, SDf16.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf17, SDf17.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf18, SDf18.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_Session, Session.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_STrades, STrades.class, new SettingOperation("setQty", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setValue", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setExchangeCommission", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(18)}), new SettingOperation("setQty", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(18)}), new SettingOperation("setValue", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(18)}) )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UncoveredDealRegister, UncoveredDealRegister.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UncoveredDealRegister, UncoveredDealRegister.class, new SettingOperation("setCreated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setUpdated", new Class[]{Instant.class}, new Object[]{generatingRandomInstant(true)}), new SettingOperation("setAmount", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UserRoleSession, UserRoleSession.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_UserSettings, UserSettings.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_VerificationResult, VerificationResult.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UserRoleSession, UserRoleSession.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_UserSettings, UserSettings.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_VerificationResult, VerificationResult.class, new SettingOperation("setDiffSum", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setInSum", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setOutExtSum", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}), new SettingOperation("setOutIntSum", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}))); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class, new SettingOperation("setAccruedCoupon", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}) )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class, + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class, new SettingOperation("setCouponRate", new Class[]{BigDecimal.class}, new Object[]{generatingRandomBigDecimal(2)}) )); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf51, SDf51.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf52, SDf52.class)); - businessObjectAndBusinessEventForCheckMapStores.add(new BusinessObjectAndBusinessEventForCheckMapStore<>(IMDGDistributedNames.Map_SDf53, SDf53.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf51, SDf51.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf52, SDf52.class)); + checkerBusinessMapStores.add(new CheckerBusinessMapStore<>(IMDGDistributedNames.Map_SDf53, SDf53.class)); //todo other... } From 32d95c175fd9889eb9c997548c593af2984557f0 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 2 May 2023 12:39:40 +0300 Subject: [PATCH 22/39] ClearingAccountUpdateRequest, update clearing account, fix some names --- .../BankAccountValidationConfig.java | 8 +-- .../ClearingAccountValidationConfig.java | 25 +++++-- .../account/service/BankAccountService.java | 70 ++++++++++++++----- .../service/ClearingAccountService.java | 25 ++++++- .../service/InformationAccountService.java | 2 +- .../service/BankAccountServiceTest.java | 2 +- .../queue/account/BankAccountController.java | 2 +- .../account/BankAccountControllerTest.java | 2 +- .../platform/messaging/domain/Consts.java | 2 +- .../account/ClearingAccountUpdateRequest.java | 20 ++++-- 10 files changed, 119 insertions(+), 39 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 64bb37a9a..55b02c206 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -143,13 +143,13 @@ public class BankAccountValidationConfig { }; } - @Bean("bankAccountDeleteRequestValidator") - public Function bankAccountDeleteRequestValidator( + @Bean("bankAccountBlockRequestValidator") + public Function bankAccountBlockRequestValidator( Map> imdgForValidation ) { - return bankAccountDeleteRequest -> { + return bankAccountBlockRequest -> { ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(bankAccountDeleteRequest); + context.setValidatedObject(bankAccountBlockRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_BankAccount); addImdg.accept(IMDGDistributedNames.Map_Account); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java index 021d76558..3c1b42b0b 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -84,13 +84,6 @@ public class ClearingAccountValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_ClearingAccount); return new ValidatorImpl<>(context, - IdPresentRule.instance("companyId", - ClearingAccountUpdateRequest::getCompanyId, - IMDGDistributedNames.Map_Company, - Company.class, - AccountError.RequiredFieldEmpty, - AccountError.CompanyNotFound, - company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null), FieldRequiredRule.instance("account", ClearingAccountUpdateRequest::getAccount, AccountError.RequiredFieldEmpty, @@ -108,6 +101,24 @@ public class ClearingAccountValidationConfig { Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); if (accounts.isEmpty()) return AccountError.AccountNotFound; return null; + }), + FieldRequiredRule.instance("status", + ClearingAccountUpdateRequest::getStatus, + AccountError.RequiredFieldEmpty, + statusValue -> { + if (statusValue == 0 || statusValue == 1 || statusValue == 2) return null; + return AccountError.WrongFieldValue; + }), + FieldRequiredRule.instance("deal", + ClearingAccountUpdateRequest::getDeal, + AccountError.RequiredFieldEmpty, + dealValue -> { + Imdg companyImdg = context.obtainMap( + IMDGDistributedNames.Map_Company, Company.class + ); + Company company = companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", dealValue)); + if (company == null) return AccountError.WrongFieldValue; + return null; }) ); }; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index b48060945..7b42723c9 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -25,7 +25,6 @@ import ru.spcex.platform.enumeration.AccountType; 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.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; @@ -45,13 +44,12 @@ public class BankAccountService extends QueueConsumer implements InitializingBea private final Function bankAccountNewRequestValidator; private final Function bankAccountUpdateRequestValidator; - private final Function bankAccountDeleteRequestValidator; + private final Function bankAccountBlockRequestValidator; @Autowired public BankAccountService(Consumer kafkaQueue, Producer kafkaProducer, ImdgProvider imdgProvider, - IMessageResolver messageResolver, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, AccountService accountService, @@ -59,8 +57,8 @@ public class BankAccountService extends QueueConsumer implements InitializingBea Function bankAccountNewRequestValidator, @Qualifier("bankAccountUpdateRequestValidator") Function bankAccountUpdateRequestValidator, - @Qualifier("bankAccountDeleteRequestValidator") - Function bankAccountDeleteRequestValidator) { + @Qualifier("bankAccountBlockRequestValidator") + Function bankAccountBlockRequestValidator) { super(kafkaQueue, kafkaProducer); this.bankAccountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); @@ -70,7 +68,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea this.accountService = accountService; this.bankAccountNewRequestValidator = bankAccountNewRequestValidator; this.bankAccountUpdateRequestValidator = bankAccountUpdateRequestValidator; - this.bankAccountDeleteRequestValidator = bankAccountDeleteRequestValidator; + this.bankAccountBlockRequestValidator = bankAccountBlockRequestValidator; } @Override @@ -82,8 +80,8 @@ public class BankAccountService extends QueueConsumer implements InitializingBea .setFunction(this::bankAccountUpdate) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setFunction(this::bankAccountDelete) - .forDestination(Consts.DESTINATION_BANK_ACCOUNT_DELETE, callbacks::put); + .setFunction(this::bankAccountBlock) + .forDestination(Consts.DESTINATION_BANK_ACCOUNT_BLOCK, callbacks::put); init(); } @@ -139,7 +137,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId); } else { // todo выяснить, что возвращать из метода в этой ситуации - log.debug("failed insert, new bank account id {}, new account id {} (if id = -1, insert is failed)", + log.debug("failed insert, new bank account id {}, new account id {} (if id = -1 then insert is failed)", bankAccountId, accountId); imdgTransaction.rollbackTransaction(); @@ -173,19 +171,38 @@ public class BankAccountService extends QueueConsumer implements InitializingBea account.setAccount(req.account); account.setUpdated(Instant.now()); - accountMap.update(account); - bankAccountMap.update(bankAccount); + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + boolean txOk = false; + imdgTransaction.beginTransaction(); + try { + accountMap.update(account); + bankAccountMap.update(bankAccount); + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new bank account id {}, account id {}", + bankAccount.getId(), + account.getId()); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed update, bank account id {}, new account id {}", + bankAccount.getId(), + account.getId()); + imdgTransaction.rollbackTransaction(); + } + } log.debug("successfully update, existing bankAccount with id {}", bankAccount.getId()); return null; } - private RequestInfoUpdate bankAccountDelete(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountBlock(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; - requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountDeleteRequestValidator); + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountBlockRequestValidator); if (requestInfoUpdate != null) return requestInfoUpdate; log.debug("CommonDeleteRequest received id = {}", req.getId()); @@ -194,10 +211,29 @@ public class BankAccountService extends QueueConsumer implements InitializingBea Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); account.setStatus(AccountStatus.BLOCKED.getKey()); account.setUpdated(Instant.now()); - - accountMap.update(account); - bankAccountMap.delete(bankAccount); - log.debug("successfully delete, existing bankAccount with id {}", bankAccount.getId()); + + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + boolean txOk = false; + imdgTransaction.beginTransaction(); + try { + accountMap.update(account); + bankAccountMap.delete(bankAccount); + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new bank account id {}, account id {}", + bankAccount.getId(), + account.getId()); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed block, bank account id {}, new account id {}", + bankAccount.getId(), + account.getId()); + imdgTransaction.rollbackTransaction(); + } + } + log.debug("successfully block, existing bankAccount with id {}", bankAccount.getId()); return null; } 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 5471dbcdf..96e509797 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 @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -17,6 +18,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNe import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; @@ -25,6 +27,8 @@ 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.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; @@ -39,6 +43,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin private final ImdgProvider imdgProvider; private final Imdg accountImdg; private final Imdg clearingAccountImdg; + private final IMessageResolver messageResolver; private final Function clearingAccountNewRequestValidator; private final Function clearingAccountUpdateRequestValidator; @@ -48,6 +53,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin AccountService accountService, ValidationHelper validationHelper, ImdgProvider imdgProvider, + IMessageResolver messageResolver, @Qualifier("clearingAccountNewRequestValidator") Function clearingAccountNewRequestValidator, @Qualifier("clearingAccountUpdateRequestValidator") @@ -58,6 +64,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin this.imdgProvider = imdgProvider; this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); + this.messageResolver = messageResolver; this.clearingAccountNewRequestValidator = clearingAccountNewRequestValidator; this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator; } @@ -111,7 +118,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin log.debug("successfully processed, new clearing account id {}, account id {}", clearingAccountId, accountId); } else { // todo выяснить, что возвращать из метода в этой ситуации - log.debug("failed insert, new clearing account id {}, new account id {} (if id = -1, insert is failed)", + log.debug("failed insert, new clearing account id {}, new account id {} (if id = -1 then insert is failed)", clearingAccountId, accountId); imdgTransaction.rollbackTransaction(); @@ -134,10 +141,26 @@ public class ClearingAccountService extends QueueConsumer implements Initializin ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate, accountTypePredicate); + Account account = accountImdg.getCollectionObjectsByPredicate(finalPredicate).iterator().next(); Long accountId = account.getId(); ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", accountId)); + if (clearingAccount == null) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountNotFound, account.getAccount())); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errMsg); + } + + Integer statusValue = req.getStatus(); + if (statusValue == 0) account.setStatus(AccountStatus.BLOCKED.getKey()); + else if (statusValue == 1) account.setStatus(AccountStatus.ACTIVE.getKey()); + else if (statusValue == 2) account.setStatus(AccountStatus.CLOSE.getKey()); + account.setUpdated(Instant.now()); + + accountImdg.update(account); return null; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index b01d8d389..0a059b28e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -136,7 +136,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali accountId); } else { // todo выяснить, что возвращать из метода в этой ситуации - log.debug("failed insert, new information account id {}, new account id {} (if id = -1, insert is failed)", + log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)", informationAccountId, accountId); imdgTransaction.rollbackTransaction(); diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index b75ad84dc..31d54b627 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -68,7 +68,7 @@ public class BankAccountServiceTest { private static final int PARTITION = 0; private static final String TOPIC_ACCOUNT_NEW = Consts.DESTINATION_BANK_ACCOUNT_NEW; private static final String TOPIC_ACCOUNT_UPDATE = Consts.DESTINATION_BANK_ACCOUNT_UPDATE; - private static final String TOPIC_ACCOUNT_DELETE = Consts.DESTINATION_BANK_ACCOUNT_DELETE; + private static final String TOPIC_ACCOUNT_DELETE = Consts.DESTINATION_BANK_ACCOUNT_BLOCK; private static final Long ID = 0L; private static final AtomicInteger countRun = new AtomicInteger(1); private static final Long accountId = 12L; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountController.java index 662624850..fd927a33b 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountController.java @@ -69,7 +69,7 @@ public class BankAccountController extends AbstractQueueController { @PathVariable("id") Long id) throws ExecutionException, InterruptedException { CommonDeleteAction deleteAction = new CommonDeleteAction(); deleteAction.setId(id); - return processRequest(Consts.DESTINATION_BANK_ACCOUNT_DELETE, deleteAction); + return processRequest(Consts.DESTINATION_BANK_ACCOUNT_BLOCK, deleteAction); } @ApiOperation(value = "get bank account.") diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java index 6c60d38e8..4ddd90e6e 100644 --- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java @@ -134,7 +134,7 @@ class BankAccountControllerTest extends AbstractControllerTest { deleteAction.setId(id); //ACT and ASSERT checkDeletingByRestApi(REST_URL, id); - checkSendedMessegeFromKafka(Consts.DESTINATION_BANK_ACCOUNT_DELETE, deleteAction); + checkSendedMessegeFromKafka(Consts.DESTINATION_BANK_ACCOUNT_BLOCK, deleteAction); } /** diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index fc050f1f2..91d2551b6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -63,7 +63,7 @@ public interface Consts { String DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE = "correspondent-account-update"; String DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK = "correspondent-account-block"; - String DESTINATION_BANK_ACCOUNT_DELETE = "bank-account-delete"; + String DESTINATION_BANK_ACCOUNT_BLOCK = "bank-account-block"; String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java index 87d927ca9..bfbb51211 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClearingAccountUpdateRequest.java @@ -7,8 +7,10 @@ public class ClearingAccountUpdateRequest { public String account; @JsonProperty - public Long companyId; + public Integer status; + @JsonProperty + public String deal; public String getAccount() { return account; @@ -18,11 +20,19 @@ public class ClearingAccountUpdateRequest { this.account = account; } - public Long getCompanyId() { - return companyId; + public Integer getStatus() { + return status; } - public void setCompanyId(Long companyId) { - this.companyId = companyId; + public void setStatus(Integer status) { + this.status = status; + } + + public String getDeal() { + return deal; + } + + public void setDeal(String deal) { + this.deal = deal; } } From a42f767698d7e3504f921b103572319e858fddbc Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 2 May 2023 14:57:15 +0300 Subject: [PATCH 23/39] DepoAccountNewRequest, new depo account --- .../DepoAccountValidationConfig.java | 75 ++++++++++++ .../account/service/DepoAccountService.java | 111 ++++++++++++++++++ .../platform/enumeration/AccountType.java | 2 +- .../platform/messaging/domain/Consts.java | 2 + .../cud/account/DepoAccountNewRequest.java | 39 ++++++ 5 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/DepoAccountNewRequest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java new file mode 100644 index 000000000..9f41be340 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java @@ -0,0 +1,75 @@ +package ru.spcex.clearing.account.config.validation; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.WorkflowStatus; +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.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +@Configuration +public class DepoAccountValidationConfig { + + @Bean("depoAccountNewRequestValidator") + public Function depoAccountNewRequestValidator( + Map> imdgForValidation + ) { + return depoAccountNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(depoAccountNewRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_DepoAccount); + return new ValidatorImpl<>(context, + IdPresentRule.instance("companyId", + DepoAccountNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound, + company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null), + FieldRequiredRule.instance("account", + DepoAccountNewRequest::getAccount, + AccountError.RequiredFieldEmpty, + accountValue -> { + Imdg accountImdg = context.obtainMap( + IMDGDistributedNames.Map_Account, Account.class + ); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + ImdgPredicate accountValuePredicate = pb.equals("account", accountValue); + ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey()); + ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey()); + ImdgPredicate finalPredicate = pb.and(accountValuePredicate, + accountStatusPredicate, + accountTypePredicate); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); + if (!accounts.isEmpty()) return null; + return AccountError.AccountAlreadyExist; + }), + FieldRequiredRule.instance("depoAccountType", + DepoAccountNewRequest::getDepoAccountType, + AccountError.RequiredFieldEmpty) + ); + }; + } + + +} 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 new file mode 100644 index 000000000..dcffe05f9 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.DepoAccount; +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.DepoAccountNewRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +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.function.Function; + +@Service +public class DepoAccountService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final ValidationHelper validationHelper; + private final ImdgProvider imdgProvider; + private final AccountService accountService; + private final Function depoAccountNewRequestValidator; + private final Imdg accountImdg; + private final Imdg depoAccountImdg; + + public DepoAccountService(Consumer kafkaQueue, + Producer kafkaProducer, + ValidationHelper validationHelper, + ImdgProvider imdgProvider, + AccountService accountService, + @Qualifier("depoAccountNewRequestValidator") + Function depoAccountNewRequestValidator) { + super(kafkaQueue, kafkaProducer); + this.validationHelper = validationHelper; + this.imdgProvider = imdgProvider; + this.accountService = accountService; + this.depoAccountNewRequestValidator = depoAccountNewRequestValidator; + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(DepoAccountNewRequest.class) + .setConsumer(this::depoAccountNew) + .forDestination(Consts.DESTINATION_DEPO_ACCOUNT_NEW, callbacks::put); + init(); + } + + public RequestInfoUpdate depoAccountNew(BaseRequest userRequest) { + log.debug("DepoAccountNewRequest received"); + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError( + userRequest, depoAccountNewRequestValidator + ); + if (requestInfoUpdate != null) return requestInfoUpdate; + + DepoAccountNewRequest req = userRequest.getRequestPayload(); + + Instant now = Instant.now(); + Account account = new Account(); + account.setAccount(req.getAccount()); + account.setAccountType(AccountType.Depo.getKey()); + account.setStatus(AccountStatus.ACTIVE.getKey()); + account.setCompanyId(req.getCompanyId()); + account.setCreated(now); + account.setUpdated(now); + requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId()); + if (requestInfoUpdate != null) return requestInfoUpdate; + + Long depoAccountId = -1L; + Long accountId = -1L; + ImdgTransaction imdgTransaction = imdgProvider.newTransaction(); + boolean txOk = false; + imdgTransaction.beginTransaction(); + try { + accountId = accountImdg.insert(account); + + DepoAccount depoAccount = new DepoAccount(); + depoAccount.setCompanyId(req.getCompanyId()); + depoAccount.setAccountId(accountId); + depoAccountId = depoAccountImdg.insert(depoAccount); + txOk = true; + } finally { + if (txOk) { + imdgTransaction.commitTransaction(); + log.debug("successfully processed, new depo account id {}, account id {}", depoAccountId, accountId); + } else { + // todo выяснить, что возвращать из метода в этой ситуации + log.debug("failed insert, new depo account id {}, new account id {} (if id = -1 then insert is failed)", + depoAccountId, + accountId); + imdgTransaction.rollbackTransaction(); + } + } + return null; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountType.java index 51184296e..8f8ad6fdb 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountType.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum AccountType implements IEnumKey { - Clrn("CLRN"), Bank("BANK"), Info("INFO"), Tran("TRAN"), Corr("CORR"), Anlt("ANLT"); + Clrn("CLRN"), Bank("BANK"), Info("INFO"), Tran("TRAN"), Corr("CORR"), Anlt("ANLT"), Depo("DEPO"); private final String key; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 91d2551b6..9842d71ef 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -54,6 +54,8 @@ public interface Consts { String DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE = "clearing-member-category-update"; String DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE = "clearing-member-category-delete"; + String DESTINATION_DEPO_ACCOUNT_NEW = "depo-account-new"; + String DESTINATION_CLEARING_ACCOUNT_NEW = "clearing-account-new"; String DESTINATION_CLEARING_ACCOUNT_UPDATE = "clearing-account-update"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/DepoAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/DepoAccountNewRequest.java new file mode 100644 index 000000000..efc416b62 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/DepoAccountNewRequest.java @@ -0,0 +1,39 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DepoAccountNewRequest { + @JsonProperty + public String account; + + @JsonProperty + public String depoAccountType; + + @JsonProperty + public Long companyId; + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getDepoAccountType() { + return depoAccountType; + } + + public void setDepoAccountType(String depoAccountType) { + this.depoAccountType = depoAccountType; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +} From b5592ad39395960f47e9af254d284b86edb266f0 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 2 May 2023 15:42:52 +0300 Subject: [PATCH 24/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/imdg/object/STradesMapStore.java | 5 ++ .../importer/config/DbConnectionConfig.java | 19 +++--- .../importer/config/ErrorResolverConfig.java | 14 +++++ .../config/settings/DatabaseSettings.java | 9 +++ .../trade/importer/error/ValidationError.java | 20 ++++++ .../services/LauncherCommandReceiver.java | 2 +- .../services/TradeImporterService.java | 31 ++++++--- .../src/main/resources/application.properties | 1 + .../trade/importer/AbstractServiceTest.java | 2 + .../services/TradeImporterServiceTest.java | 63 ++++++++++++++----- 10 files changed, 131 insertions(+), 35 deletions(-) create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java create mode 100644 clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java index 22f0b37b1..1c7c4a923 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java @@ -23,6 +23,11 @@ public class STradesMapStore extends TemplateMapStore { return IMDGDistributedNames.Map_STrades; } + @Override + public String[] getIndexingField() { + return new String[]{"tradeNum"};// список индексируемых полей + } + @Override public String getTableName() { return "S_TRADES"; diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java index 3afddae6b..103dd0497 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java @@ -13,6 +13,8 @@ import ru.spcex.clearing.trade.importer.error.ModuleInitializeException; import javax.sql.DataSource; import java.sql.Connection; +import static org.springframework.jdbc.datasource.DataSourceUtils.doCloseConnection; + @SuppressWarnings("UnnecessaryLocalVariable") @Configuration public class DbConnectionConfig { @@ -29,23 +31,24 @@ public class DbConnectionConfig { String login = settings.getLogin(); String password = settings.getPassword(); String dbUrl = settings.getUrl(); + String driver = settings.getDriver(); - SingleConnectionDataSource cpds = new SingleConnectionDataSource(); + SingleConnectionDataSource ds = new SingleConnectionDataSource(); try { - cpds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + ds.setDriverClassName(driver); } catch (Exception ue) { throw new RuntimeException(ue); } - cpds.setUrl(dbUrl); - cpds.setUsername(login); - cpds.setPassword(password); + ds.setUrl(dbUrl); + ds.setUsername(login); + ds.setPassword(password); String OPERATION_DATABASE_CONNECTION_CHECK = String.format("Database [%s] connection check", dbUrl); try { - Connection conn = cpds.getConnection(); -// conn.close(); + Connection conn = ds.getConnection(); + doCloseConnection(conn, ds); log.info("{}: success", OPERATION_DATABASE_CONNECTION_CHECK); - return cpds; + return ds; } catch (Throwable e) { String msg = String.format("%s: failed: %s -> %s", OPERATION_DATABASE_CONNECTION_CHECK, e.getClass().getSimpleName(), e.getMessage()); diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java new file mode 100644 index 000000000..8c838d4ed --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.trade.importer.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +@Configuration +public class ErrorResolverConfig { + @Bean + public IMessageResolver messageResolver() { + return new SimpleMessageResolver(); + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java index c019613e1..1c84d9ec7 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/settings/DatabaseSettings.java @@ -4,6 +4,7 @@ public class DatabaseSettings { private String login; private String password; private String url; + private String driver; public String getLogin() { return login; @@ -28,4 +29,12 @@ public class DatabaseSettings { public void setUrl(String url) { this.url = url; } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } } diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java new file mode 100644 index 000000000..dbbbbb8c3 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.trade.importer.error; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +public enum ValidationError implements IErrorEnumId { + sTradesNotValid(10001L), + ; + + private final Long id; + + ValidationError(Long id) { + this.id = id; + } + + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java index 074343102..0d92824f2 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java @@ -25,7 +25,7 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi @Override public void afterPropertiesSet() { callback(LauncherCommandRequest.class) - .setConsumer(action -> importer.process()) + .setConsumer(action -> importer.process(true)) .forDestination(Task.getOfTrades.topic(), callbacks::put); // GTRD init(); } diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 22a023f7f..08f00d9cf 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -16,11 +16,14 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest; 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 java.util.Collection; import java.util.Map; import static ru.spcex.clearing.platform.messaging.domain.Consts.S_TRADES_IMPORTED; +import static ru.spcex.clearing.trade.importer.error.ValidationError.sTradesNotValid; @Service @EnableScheduling @@ -29,38 +32,46 @@ public class TradeImporterService { private final Imdg sTradesImdg; private final JdbcTemplate jdbcTemplate; private final Producer producer; + private final IMessageResolver messageResolver; private static final RowMapper ROW_MAPPER = BeanPropertyRowMapper.newInstance(STrades.class); - public TradeImporterService(ImdgProvider imdgProvider, JdbcTemplate jdbcTemplate, Producer producer) { + public TradeImporterService(ImdgProvider imdgProvider, JdbcTemplate jdbcTemplate, Producer producer, IMessageResolver messageResolver) { this.sTradesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.jdbcTemplate = jdbcTemplate; this.producer = producer; + this.messageResolver = messageResolver; } @Scheduled(cron = "${trade-importer.cron.load-from-db-cron}") public void run() { - process(); + process(false); } - public void process() { + public void process(boolean byCommand) { Collection tradesFromDB = jdbcTemplate.query("SELECT * FROM Trades", ROW_MAPPER); for (STrades tradesDb : tradesFromDB) { if (isValidTrades(tradesDb)) { - STrades sTrades = sTradesImdg.getSingleObjectByFieldValues(Map.of("tradeDate", tradesDb.getTradeDate(), - "tradeNum", tradesDb.getTradeNum(), - "operation", tradesDb.getOperation(), - "classCode", tradesDb.getClassCode())); + STrades sTrades = getSTradesFromImdg(tradesDb, sTradesImdg); if (sTrades != null) tradesDb.setId(sTrades.getId()); sTradesImdg.insert(tradesDb); } else { - log.warn(String.format("(10001) \"Сделка с номером в ТС = %s некорректна\"", tradesDb.getTradeNum())); + log.warn(messageResolver.resolve(new EnumMessage(sTradesNotValid, tradesDb.getTradeNum()))); } } - STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); - producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); + if (byCommand) { + STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); + producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); + } + } + + public STrades getSTradesFromImdg(STrades tradesDb, Imdg sTradesImdg) { + return sTradesImdg.getSingleObjectByFieldValues(Map.of("tradeDate", tradesDb.getTradeDate(), + "tradeNum", tradesDb.getTradeNum(), + "operation", tradesDb.getOperation(), + "classCode", tradesDb.getClassCode())); } private boolean isValidTrades(STrades trades) { diff --git a/clearing-parent/trade-importer/src/main/resources/application.properties b/clearing-parent/trade-importer/src/main/resources/application.properties index fb9ca6cef..dc8f7ba47 100644 --- a/clearing-parent/trade-importer/src/main/resources/application.properties +++ b/clearing-parent/trade-importer/src/main/resources/application.properties @@ -6,6 +6,7 @@ trade-importer.cron.load-from-db-cron=0 0/5 * * * ? trade-importer.database.login=sa trade-importer.database.password=Aa123456 trade-importer.database.url=jdbc:sqlserver://localhost:1433;database=SPVB_TS;schema=dbo +trade-importer.database.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver trade-importer.hazelcast.cluster-members=127.0.0.1:5701 trade-importer.hazelcast.login=dev diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java index 3e1e33c3d..84949d3e3 100644 --- a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/AbstractServiceTest.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.test.TestUtils; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.clearing.trade.importer.config.ErrorResolverConfig; import ru.spcex.clearing.trade.importer.config.config.DbTestConnectionConfig; import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; import ru.spcex.clearing.trade.importer.services.LauncherCommandReceiver; @@ -33,6 +34,7 @@ import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProv @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { DbTestConnectionConfig.class, + ErrorResolverConfig.class, ImportTradeServiceSettings.class, LauncherCommandReceiver.class, TradeImporterService.class, diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java index 615339e94..49068bcb9 100644 --- a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java @@ -2,9 +2,12 @@ package ru.spcex.clearing.trade.importer.services; import org.apache.kafka.clients.consumer.MockConsumer; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import ru.clearing.classes.statics.data.misc.STrades; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.test.MatcherFactory; import ru.spcex.clearing.trade.importer.AbstractServiceTest; import ru.spcex.platform.enumeration.Task; @@ -12,18 +15,23 @@ import javax.annotation.PostConstruct; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; -import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; -import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; -import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.test.TestUtils.*; class TradeImporterServiceTest extends AbstractServiceTest { + public static final MatcherFactory.Matcher S_TRADES_MATCHER = usingIgnoringFieldsComparator(); + @Autowired LauncherCommandReceiver launcherCommandReceiver; + @Autowired + TradeImporterService tradeImporterService; + @PostConstruct public void init() { super.init(); @@ -37,20 +45,20 @@ class TradeImporterServiceTest extends AbstractServiceTest { // Hazelcast.shutdownAll(); } + @BeforeEach + private void prepare(){ + clearAllInImdg(sTradesImdg); + } + /** - * {@link TradeImporterService#process()}
+ * {@link TradeImporterService#process(boolean)}
* Тест проверяет обновление сущности {@link STrades}.
* Входной запрос {@link LauncherCommandRequest}:
*/ -// @Test для работы теста нужна тестовая база Microsoft SQL с данными + @Test //для работы теста нужна тестовая база Microsoft SQL с данными void process() { - STrades trades = new STrades(); - trades.setId(22L); - trades.setTradeDate(LocalDate.of(2023,4,19)); - trades.setTradeNum(661486L); - trades.setOperation("operation20"); - trades.setClassCode("UESC"); - Long id = sTradesImdg.insert(trades); + STrades sTrade = getSTrade(); + Long id = sTradesImdg.insert(sTrade); addRecordToKafka((MockConsumer) launcherCommandReceiver.getConsumer(), Task.getOfTrades.topic(), 0, 1, getJsonStringForNew(new LauncherCommandRequest(),0)); @@ -58,11 +66,34 @@ class TradeImporterServiceTest extends AbstractServiceTest { verify(mockProducer, timeout(30_000L).times(1)) .send(producerRecord.capture()); - STrades sTrades = sTradesImdg.getSingleObjectByFieldValues(Map.of("tradeDate", trades.getTradeDate(), - "tradeNum", trades.getTradeNum(), - "operation", trades.getOperation(), - "classCode", trades.getClassCode())); + STrades sTrades = tradeImporterService.getSTradesFromImdg(sTrade, sTradesImdg); assertEquals(sTrades.getId(), id); } + + /** + * {@link TradeImporterService#process(boolean)}
+ * Тест проверяет обновление сущности {@link STrades}.
+ * Входной запрос {@link LauncherCommandRequest}:
+ */ + @Test + void getSTradesFromImdg(){ + STrades sTrade = getSTrade(); + Long id = sTradesImdg.insert(sTrade); + STrades sTradeRes = tradeImporterService.getSTradesFromImdg(sTrade, sTradesImdg); + S_TRADES_MATCHER.assertMatch(sTradeRes, sTrade); + + sTrade.setTradeNum(23L); + sTradeRes = tradeImporterService.getSTradesFromImdg(sTrade, sTradesImdg); + assertNull(sTradeRes); + } + + private STrades getSTrade(){ + STrades trades = new STrades(); + trades.setTradeDate(LocalDate.of(2023,4,19)); + trades.setTradeNum(661486L); + trades.setOperation("operation20"); + trades.setClassCode("UESC"); + return trades; + } } \ No newline at end of file From 09b65585c450cc4eb48e42b2bd0109138bf348bb Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 2 May 2023 16:00:39 +0300 Subject: [PATCH 25/39] clearingAccountNew test --- .../ClearingAccountValidationConfig.java | 14 +- .../config/validation/ValidationConfig.java | 2 + .../service/ClearingAccountService.java | 1 + .../service/ClearingAccountServiceTest.java | 178 ++++++++++++++++++ .../InformationAccountServiceTest.java | 4 +- 5 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java index 3c1b42b0b..29b3a3e98 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -4,10 +4,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -29,6 +31,7 @@ import java.util.function.Function; @Configuration public class ClearingAccountValidationConfig { + // todo add validation for clearingAccountType from dictionary @Bean("clearingAccountNewRequestValidator") public Function clearingAccountNewRequestValidator( Map> imdgForValidation @@ -37,8 +40,10 @@ public class ClearingAccountValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(clearingAccountNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_ClearingAccount); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", ClearingAccountNewRequest::getCompanyId, @@ -62,12 +67,15 @@ public class ClearingAccountValidationConfig { accountStatusPredicate, accountTypePredicate); Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); - if (!accounts.isEmpty()) return null; + if (accounts.isEmpty()) return null; return AccountError.AccountAlreadyExist; }), - FieldRequiredRule.instance("clearingAccountType", + DictionaryPresentRule.instance("clearingAccountType", ClearingAccountNewRequest::getClearingAccountType, - AccountError.RequiredFieldEmpty) + IMDGDistributedNames.Map_ClearingAccountTypeDictionary, + ClearingAccountTypeDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.WrongFieldValue) ); }; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index ccf3d40b1..36cebc49d 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.validation.common.ValidationHelper; @@ -31,6 +32,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); addImdg.accept(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class); addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); 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 96e509797..03f148353 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 @@ -110,6 +110,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin ClearingAccount clearingAccount = new ClearingAccount(); clearingAccount.setCompanyId(req.getCompanyId()); clearingAccount.setAccountId(accountId); + clearingAccount.setClearingAccountType(req.getClearingAccountType()); clearingAccountId = clearingAccountImdg.insert(clearingAccount); txOk = true; } finally { diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java new file mode 100644 index 000000000..c50e7b194 --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java @@ -0,0 +1,178 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; +import ru.spcex.clearing.account.config.BeanConfiguration; +import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.config.validation.AccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ClearingAccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ValidationConfig; +import ru.spcex.clearing.account.utils.MatcherFactory; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +import javax.annotation.PostConstruct; +import java.util.Map; + +import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.account.utils.TestUtils.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, + ClearingAccountValidationConfig.class, + AccountValidationConfig.class, + AccountService.class, + ClearingAccountService.class, + HazelcastServiceTestConfiguration.class, + KafkaConfigTest.class}) +class ClearingAccountServiceTest { + public static final MatcherFactory.Matcher INFORMATION_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); + public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated"); + private static final int PARTITION = 0; + private static final Long companyId = 0L; + private static final Long relationId = 0L; + private static final String CLEARING_ACCOUNT_TYPE_DICT = "A"; + private static final String ACCOUNT_VALUE = "account-value"; + + @Autowired + ClearingAccountService clearingAccountService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + + @Captor + private ArgumentCaptor producerRecord; + @SpyBean + private MockProducer producer; + + private Imdg clearingAccountImdg; + private Imdg accountImdg; + private Imdg companyImdg; + private Imdg clearingAccountTypeDictionaryImdg; + private Imdg accountTypeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg relationImdg; + + + @PostConstruct + private void init() { + hazelcastServiceTest.waitAvailable(); + clearingAccountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class + ); + accountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + + companyImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Company, Company.class + ); + accountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class + ); + clearingAccountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class + ); + clearingMemberCategoryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + relationImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); + + Company company = new Company(); + company.setId(companyId); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + companyImdg.insert(company); + + AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); + accountTypeDictionary.setCode(AccountType.Clrn.getKey()); + accountTypeDictionary.setName(AccountType.Clrn.getKey()); + accountTypeDictionaryImdg.insert(accountTypeDictionary); + + ClearingAccountTypeDictionary clearingAccountTypeDictionary = new ClearingAccountTypeDictionary(); + clearingAccountTypeDictionary.setName(CLEARING_ACCOUNT_TYPE_DICT); + clearingAccountTypeDictionary.setCode(CLEARING_ACCOUNT_TYPE_DICT); + clearingAccountTypeDictionaryImdg.insert(clearingAccountTypeDictionary); + + ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); + clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey()); + clearingMemberCategory.setCompanyId(companyId); + clearingMemberCategoryImdg.insert(clearingMemberCategory); + + Relation relation = new Relation(); + relation.setId(relationId); + relation.setConsumerId(companyId); + relation.setService(Service.MKR.getKey()); + relationImdg.insert(relation); + + } + + @Test + void clearingAccountNew() { + ClearingAccountNewRequest clearingAccountNewRequest = new ClearingAccountNewRequest(); + clearingAccountNewRequest.setAccount(ACCOUNT_VALUE); + clearingAccountNewRequest.setCompanyId(companyId); + clearingAccountNewRequest.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT); + + String jsonString = getJsonStringForNew(clearingAccountNewRequest, 0L); + + addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(), + Consts.DESTINATION_CLEARING_ACCOUNT_NEW, + PARTITION, + 0, + jsonString); + + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account predictableAccount = new Account(); + predictableAccount.setAccount(ACCOUNT_VALUE); + predictableAccount.setAccountType(AccountType.Clrn.getKey()); + predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); + predictableAccount.setRelationId(relationId); + predictableAccount.setCompanyId(companyId); + + ClearingAccount predictableClearingAccount = new ClearingAccount(); + predictableClearingAccount.setCompanyId(companyId); + predictableClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT); + + Account resultAccountNew = accountImdg.getSingleObjectByFieldValues(Map.of("accountType", AccountType.Clrn.getKey())); + ClearingAccount resultClearingAccountNew = clearingAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", resultAccountNew.getId())); + + predictableAccount.setId(resultAccountNew.getId()); + predictableClearingAccount.setAccountId(resultAccountNew.getId()); + predictableClearingAccount.setId(resultClearingAccountNew.getId()); + + ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount); + INFORMATION_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount); + + clearingAccountImdg.delete(resultClearingAccountNew); + accountImdg.delete(resultAccountNew); + } + +} \ No newline at end of file diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java index 5d8b6b124..176245ab5 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/InformationAccountServiceTest.java @@ -106,8 +106,8 @@ class InformationAccountServiceTest { companyImdg.insert(company); AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); - accountTypeDictionary.setCode(AccountType.Corr.getKey()); - accountTypeDictionary.setName(AccountType.Corr.getKey()); + accountTypeDictionary.setCode(AccountType.Info.getKey()); + accountTypeDictionary.setName(AccountType.Info.getKey()); accountTypeDictionaryImdg.insert(accountTypeDictionary); ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); From 2fc7c7e18046fe795df5897aa938846cfaac373e Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 2 May 2023 16:19:51 +0300 Subject: [PATCH 26/39] clearingAccountUpdate test --- .../ClearingAccountValidationConfig.java | 2 + .../service/ClearingAccountServiceTest.java | 44 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java index 29b3a3e98..1c8c88154 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -89,8 +89,10 @@ public class ClearingAccountValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(clearingAccountUpdateRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_ClearingAccount); + addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary); return new ValidatorImpl<>(context, FieldRequiredRule.instance("account", ClearingAccountUpdateRequest::getAccount, diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java index c50e7b194..da67ac384 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClearingAccountServiceTest.java @@ -29,6 +29,7 @@ import ru.spcex.clearing.account.utils.MatcherFactory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @@ -50,13 +51,14 @@ import static ru.spcex.clearing.account.utils.TestUtils.*; HazelcastServiceTestConfiguration.class, KafkaConfigTest.class}) class ClearingAccountServiceTest { - public static final MatcherFactory.Matcher INFORMATION_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); + public static final MatcherFactory.Matcher CLEARING_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated"); private static final int PARTITION = 0; private static final Long companyId = 0L; private static final Long relationId = 0L; private static final String CLEARING_ACCOUNT_TYPE_DICT = "A"; private static final String ACCOUNT_VALUE = "account-value"; + private static final String TRADING_CODE = "trading-code"; @Autowired ClearingAccountService clearingAccountService; @@ -108,6 +110,7 @@ class ClearingAccountServiceTest { Company company = new Company(); company.setId(companyId); company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + company.setTradingCode(TRADING_CODE); companyImdg.insert(company); AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); @@ -169,10 +172,47 @@ class ClearingAccountServiceTest { predictableClearingAccount.setId(resultClearingAccountNew.getId()); ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount); - INFORMATION_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount); + CLEARING_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount); clearingAccountImdg.delete(resultClearingAccountNew); accountImdg.delete(resultAccountNew); } + @Test + void clearingAccountUpdate() { + Account existAccount = new Account(); + existAccount.setAccount(ACCOUNT_VALUE); + existAccount.setStatus(AccountStatus.ACTIVE.getKey()); + existAccount.setAccountType(AccountType.Clrn.getKey()); + Long accountId = accountImdg.insert(existAccount); + + ClearingAccount existClearingAccount = new ClearingAccount(); + existClearingAccount.setAccountId(accountId); + existClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT); + existClearingAccount.setCompanyId(companyId); + + Account predictableAccount = new Account(); + predictableAccount.setAccount(ACCOUNT_VALUE); + predictableAccount.setStatus(AccountStatus.BLOCKED.getKey()); + predictableAccount.setAccountType(AccountType.Clrn.getKey()); + + clearingAccountImdg.insert(existClearingAccount); + + ClearingAccountUpdateRequest clearingAccountUpdateRequest = new ClearingAccountUpdateRequest(); + clearingAccountUpdateRequest.setAccount(ACCOUNT_VALUE); + clearingAccountUpdateRequest.setStatus(0); + clearingAccountUpdateRequest.setDeal(TRADING_CODE); + + String jsonString = getJsonStringForUPDATE(clearingAccountUpdateRequest, 0L); + + addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(), Consts.DESTINATION_CLEARING_ACCOUNT_UPDATE, PARTITION, 0, jsonString); + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account accountResult = accountImdg.getSingleObjectByID(accountId); + predictableAccount.setId(accountResult.getId()); + predictableAccount.setUpdated(accountResult.getUpdated()); + + ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount); + } + } \ No newline at end of file From 804b6592272ec0421da516e550c372792ad7cbd4 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 2 May 2023 16:41:39 +0300 Subject: [PATCH 27/39] depoAccountNew test --- .../DepoAccountValidationConfig.java | 3 +- .../account/service/DepoAccountService.java | 1 + .../service/DepoAccountServiceTest.java | 180 ++++++++++++++++++ 3 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java index 9f41be340..10277912b 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java @@ -37,6 +37,7 @@ public class DepoAccountValidationConfig { context.setValidatedObject(depoAccountNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_DepoAccount); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", @@ -61,7 +62,7 @@ public class DepoAccountValidationConfig { accountStatusPredicate, accountTypePredicate); Collection accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate); - if (!accounts.isEmpty()) return null; + if (accounts.isEmpty()) return null; return AccountError.AccountAlreadyExist; }), FieldRequiredRule.instance("depoAccountType", 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 dcffe05f9..625e909f5 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 @@ -92,6 +92,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea DepoAccount depoAccount = new DepoAccount(); depoAccount.setCompanyId(req.getCompanyId()); depoAccount.setAccountId(accountId); + depoAccount.setDepoAccountType(req.getDepoAccountType()); depoAccountId = depoAccountImdg.insert(depoAccount); txOk = true; } finally { diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java new file mode 100644 index 000000000..0d6ea0bcb --- /dev/null +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/DepoAccountServiceTest.java @@ -0,0 +1,180 @@ +package ru.spcex.clearing.account.service; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.DepoAccount; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.clearing.platform.dictionary.DepoAccountTypeDictionary; +import ru.spcex.clearing.account.config.BeanConfiguration; +import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; +import ru.spcex.clearing.account.config.KafkaConfigTest; +import ru.spcex.clearing.account.config.validation.AccountValidationConfig; +import ru.spcex.clearing.account.config.validation.DepoAccountValidationConfig; +import ru.spcex.clearing.account.config.validation.ValidationConfig; +import ru.spcex.clearing.account.utils.MatcherFactory; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +import javax.annotation.PostConstruct; +import java.util.Map; + +import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFieldsComparator; +import static ru.spcex.clearing.account.utils.TestUtils.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, + DepoAccountValidationConfig.class, + AccountValidationConfig.class, + AccountService.class, + DepoAccountService.class, + HazelcastServiceTestConfiguration.class, + KafkaConfigTest.class}) +class DepoAccountServiceTest { + public static final MatcherFactory.Matcher CLEARING_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); + public static final MatcherFactory.Matcher ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated"); + private static final int PARTITION = 0; + private static final Long companyId = 0L; + private static final Long relationId = 0L; + private static final String DEPO_ACCOUNT_TYPE_DICT = "A"; + private static final String ACCOUNT_VALUE = "account-value"; + private static final String TRADING_CODE = "trading-code"; + + @Autowired + DepoAccountService depoAccountService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + + @Captor + private ArgumentCaptor producerRecord; + @SpyBean + private MockProducer producer; + + private Imdg depoAccountImdg; + private Imdg accountImdg; + private Imdg companyImdg; + private Imdg depoAccountTypeDictionaryImdg; + private Imdg accountTypeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg relationImdg; + + + @PostConstruct + private void init() { + hazelcastServiceTest.waitAvailable(); + depoAccountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_DepoAccount, DepoAccount.class + ); + accountImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Account, Account.class + ); + + companyImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Company, Company.class + ); + accountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class + ); + depoAccountTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_DepoAccountTypeDictionary, DepoAccountTypeDictionary.class + ); + clearingMemberCategoryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class + ); + relationImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_Relation, Relation.class + ); + + Company company = new Company(); + company.setId(companyId); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + company.setTradingCode(TRADING_CODE); + companyImdg.insert(company); + + AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary(); + accountTypeDictionary.setCode(AccountType.Depo.getKey()); + accountTypeDictionary.setName(AccountType.Depo.getKey()); + accountTypeDictionaryImdg.insert(accountTypeDictionary); + + DepoAccountTypeDictionary depoAccountTypeDictionary = new DepoAccountTypeDictionary(); + depoAccountTypeDictionary.setName(DEPO_ACCOUNT_TYPE_DICT); + depoAccountTypeDictionary.setCode(DEPO_ACCOUNT_TYPE_DICT); + depoAccountTypeDictionaryImdg.insert(depoAccountTypeDictionary); + + ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory(); + clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey()); + clearingMemberCategory.setCompanyId(companyId); + clearingMemberCategoryImdg.insert(clearingMemberCategory); + + Relation relation = new Relation(); + relation.setId(relationId); + relation.setConsumerId(companyId); + relation.setService(Service.MKR.getKey()); + relationImdg.insert(relation); + + } + + @Test + void depoAccountNew() { + DepoAccountNewRequest depoAccountNewRequest = new DepoAccountNewRequest(); + depoAccountNewRequest.setAccount(ACCOUNT_VALUE); + depoAccountNewRequest.setCompanyId(companyId); + depoAccountNewRequest.setDepoAccountType(DEPO_ACCOUNT_TYPE_DICT); + + String jsonString = getJsonStringForNew(depoAccountNewRequest, 0L); + + addRecordToKafka((MockConsumer) depoAccountService.getConsumer(), + Consts.DESTINATION_DEPO_ACCOUNT_NEW, + PARTITION, + 0, + jsonString); + + waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord); + + Account predictableAccount = new Account(); + predictableAccount.setAccount(ACCOUNT_VALUE); + predictableAccount.setAccountType(AccountType.Depo.getKey()); + predictableAccount.setStatus(AccountStatus.ACTIVE.getKey()); + predictableAccount.setRelationId(relationId); + predictableAccount.setCompanyId(companyId); + + DepoAccount predictableDepoAccount = new DepoAccount(); + predictableDepoAccount.setCompanyId(companyId); + predictableDepoAccount.setDepoAccountType(DEPO_ACCOUNT_TYPE_DICT); + + Account resultAccountNew = accountImdg.getSingleObjectByFieldValues(Map.of("accountType", AccountType.Depo.getKey())); + DepoAccount resultDepoAccountNew = depoAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", resultAccountNew.getId())); + + predictableAccount.setId(resultAccountNew.getId()); + predictableDepoAccount.setAccountId(resultAccountNew.getId()); + predictableDepoAccount.setId(resultDepoAccountNew.getId()); + + ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount); + CLEARING_ACCOUNT_MATCHER.assertMatch(resultDepoAccountNew, predictableDepoAccount); + + depoAccountImdg.delete(resultDepoAccountNew); + accountImdg.delete(resultAccountNew); + } + +} \ No newline at end of file From bb396b71d5d6810fd4b34e999acc030f719bddca Mon Sep 17 00:00:00 2001 From: psemenkov Date: Tue, 2 May 2023 16:44:22 +0300 Subject: [PATCH 28/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/importer/config/DbConnectionConfig.java | 8 ++++---- .../{ValidationError.java => TradeImporterError.java} | 4 ++-- .../trade/importer/services/LauncherCommandReceiver.java | 1 + .../trade/importer/services/TradeImporterService.java | 3 ++- 4 files changed, 9 insertions(+), 7 deletions(-) rename clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/{ValidationError.java => TradeImporterError.java} (74%) diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java index 103dd0497..e04bab31d 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/DbConnectionConfig.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.springframework.jdbc.datasource.DriverManagerDataSource; import ru.spcex.clearing.trade.importer.config.settings.DatabaseSettings; import ru.spcex.clearing.trade.importer.config.settings.ImportTradeServiceSettings; import ru.spcex.clearing.trade.importer.error.ModuleInitializeException; @@ -26,14 +26,14 @@ public class DbConnectionConfig { this.settings = settings.getDatabase(); } - @Bean(destroyMethod = "destroy") - public SingleConnectionDataSource dataSource() { + @Bean + public DataSource dataSource() { String login = settings.getLogin(); String password = settings.getPassword(); String dbUrl = settings.getUrl(); String driver = settings.getDriver(); - SingleConnectionDataSource ds = new SingleConnectionDataSource(); + DriverManagerDataSource ds = new DriverManagerDataSource(); try { ds.setDriverClassName(driver); } catch (Exception ue) { diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/TradeImporterError.java similarity index 74% rename from clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java rename to clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/TradeImporterError.java index dbbbbb8c3..6ccf7ac8a 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/ValidationError.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/error/TradeImporterError.java @@ -2,13 +2,13 @@ package ru.spcex.clearing.trade.importer.error; import ru.spcex.platform.utils.enumeration.IErrorEnumId; -public enum ValidationError implements IErrorEnumId { +public enum TradeImporterError implements IErrorEnumId { sTradesNotValid(10001L), ; private final Long id; - ValidationError(Long id) { + TradeImporterError(Long id) { this.id = id; } diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java index 0d92824f2..5c37e06be 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java @@ -27,6 +27,7 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi callback(LauncherCommandRequest.class) .setConsumer(action -> importer.process(true)) .forDestination(Task.getOfTrades.topic(), callbacks::put); // GTRD + importer.process(true); init(); } } diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 08f00d9cf..12ff78487 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -23,7 +23,7 @@ import java.util.Collection; import java.util.Map; import static ru.spcex.clearing.platform.messaging.domain.Consts.S_TRADES_IMPORTED; -import static ru.spcex.clearing.trade.importer.error.ValidationError.sTradesNotValid; +import static ru.spcex.clearing.trade.importer.error.TradeImporterError.sTradesNotValid; @Service @EnableScheduling @@ -64,6 +64,7 @@ public class TradeImporterService { if (byCommand) { STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); + log.debug("successfully import STrades from DB by command"); } } From 2f2835cc91935e084e29d74ca6b9a137f1d1a089 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 3 May 2023 11:18:55 +0300 Subject: [PATCH 29/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B2=20=D0=BB=D0=BE=D0=B3=20=D0=B8?= =?UTF-8?q?=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=20=D0=91?= =?UTF-8?q?=D0=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/LauncherCommandReceiver.java | 1 - .../services/TradeImporterService.java | 75 +++++++++++++++++-- .../services/TradeImporterServiceTest.java | 2 +- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java index 5c37e06be..0d92824f2 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/LauncherCommandReceiver.java @@ -27,7 +27,6 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi callback(LauncherCommandRequest.class) .setConsumer(action -> importer.process(true)) .forDestination(Task.getOfTrades.topic(), callbacks::put); // GTRD - importer.process(true); init(); } } diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 12ff78487..84dd75c82 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -4,9 +4,7 @@ import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -19,6 +17,13 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import java.math.BigDecimal; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDate; import java.util.Collection; import java.util.Map; @@ -33,7 +38,6 @@ public class TradeImporterService { private final JdbcTemplate jdbcTemplate; private final Producer producer; private final IMessageResolver messageResolver; - private static final RowMapper ROW_MAPPER = BeanPropertyRowMapper.newInstance(STrades.class); public TradeImporterService(ImdgProvider imdgProvider, JdbcTemplate jdbcTemplate, Producer producer, IMessageResolver messageResolver) { @@ -49,8 +53,10 @@ public class TradeImporterService { } public void process(boolean byCommand) { - Collection tradesFromDB = jdbcTemplate.query("SELECT * FROM Trades", ROW_MAPPER); + log.debug("start process import STrades from DB"); + Collection tradesFromDB = jdbcTemplate.query("SELECT * FROM Trades", (resultSet, i) -> readSTrades(resultSet)); + log.debug(String.format("load from DB STrades: %d", tradesFromDB.size())); for (STrades tradesDb : tradesFromDB) { if (isValidTrades(tradesDb)) { STrades sTrades = getSTradesFromImdg(tradesDb, sTradesImdg); @@ -65,7 +71,7 @@ public class TradeImporterService { STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); log.debug("successfully import STrades from DB by command"); - } + }else log.debug("successfully import STrades from DB by scheduled"); } public STrades getSTradesFromImdg(STrades tradesDb, Imdg sTradesImdg) { @@ -81,4 +87,63 @@ public class TradeImporterService { && StringUtils.hasText(trades.getOperation()) && trades.getTradeNum() != null; } + + public STrades readSTrades(ResultSet resultSet) throws SQLException { + STrades sTrades = new STrades(); + sTrades.setTradeNum(resultSet.getObject("TradeNum", Long.class)); + sTrades.setOperation(resultSet.getObject("Operation", String.class)); + sTrades.setClassCode(resultSet.getObject("ClassCode", String.class)); + sTrades.setTradeDate(getLocalDateFromSqlDate(resultSet, "TradeDate")); + sTrades.setSecCode(resultSet.getObject("SecCode", String.class)); + sTrades.setAccruedint(resultSet.getObject("Accruedint", BigDecimal.class)); + sTrades.setAccruedint2(resultSet.getObject("Accruedint2", BigDecimal.class)); + sTrades.setLowerDiscount(resultSet.getObject("LowerDiscount", BigDecimal.class)); + sTrades.setOrderNum(resultSet.getObject("OrderNum", Long.class)); + sTrades.setPrice(resultSet.getObject("Price", BigDecimal.class)); + sTrades.setPrice2(resultSet.getObject("Price2", BigDecimal.class)); + sTrades.setRepoRate(resultSet.getObject("RepoRate", BigDecimal.class)); + sTrades.setRepoValue(resultSet.getObject("RepoValue", BigDecimal.class)); + sTrades.setRepo2Value(resultSet.getObject("Repo2Value", BigDecimal.class)); + sTrades.setStartDiscount(resultSet.getObject("StartDiscount", BigDecimal.class)); + sTrades.setTsCommission(resultSet.getObject("TSCommission", BigDecimal.class)); + sTrades.setUpperDiscount(resultSet.getObject("UpperDiscount", BigDecimal.class)); + sTrades.setValue(resultSet.getObject("Value", BigDecimal.class)); + sTrades.setYield(resultSet.getObject("Yield", BigDecimal.class)); + sTrades.setQty(resultSet.getObject("Qty", BigDecimal.class)); + sTrades.setQtyPcs(resultSet.getObject("Qty_pcs", BigDecimal.class)); + sTrades.setTradeDateTime(getInstantFromTimestamp(resultSet, "TradeDateTime")); + sTrades.setRepoTerm(resultSet.getObject("RepoTerm", Long.class)); + sTrades.setClearingCommission(resultSet.getObject("ClearingCommission", BigDecimal.class)); + sTrades.setExchangeCommission(resultSet.getObject("ExchangeCommission", BigDecimal.class)); + sTrades.setTechCenterCommission(resultSet.getObject("TechCenterCommission", BigDecimal.class)); + sTrades.setAccount(resultSet.getObject("Account", String.class)); + sTrades.setBrokerRef(resultSet.getObject("BrokerRef", String.class)); + sTrades.setClientCode(resultSet.getObject("ClientCode", String.class)); + sTrades.setSettleCode(resultSet.getObject("SettleCode", String.class)); + sTrades.setUserId(resultSet.getObject("UserId", String.class)); + sTrades.setExchangeCode(resultSet.getObject("ExchangeCode", String.class)); + sTrades.setFirmId(resultSet.getObject("FirmId", String.class)); + sTrades.setFirmName(resultSet.getObject("FirmName", String.class)); + sTrades.setCpFirmId(resultSet.getObject("CPFirmId", String.class)); + sTrades.setCpFirmName(resultSet.getObject("CPFirmName", String.class)); + sTrades.setClassName(resultSet.getObject("ClassName", String.class)); + sTrades.setSecName(resultSet.getObject("SecName", String.class)); + sTrades.setSettleDate(getLocalDateFromSqlDate(resultSet, "SettleDate")); + sTrades.setSettleCurrency(resultSet.getObject("SettleCurrency", String.class)); + sTrades.setTradeCurrency(resultSet.getObject("TradeCurrency", String.class)); + sTrades.setTradeTimeMs(resultSet.getObject("TradeTimeMs", Long.class)); + sTrades.setBankAccId(resultSet.getObject("BankAccId", String.class)); + sTrades.setSection(resultSet.getObject("Section", String.class)); + return sTrades; + } + + private Instant getInstantFromTimestamp(ResultSet rs, String column) throws SQLException { + Timestamp date = rs.getTimestamp(column); + return date != null ? date.toInstant() : null; + } + + private LocalDate getLocalDateFromSqlDate(ResultSet rs, String column) throws SQLException { + Date date = rs.getDate(column); + return date != null ? date.toLocalDate() : null; + } } diff --git a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java index 49068bcb9..fdd014270 100644 --- a/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java +++ b/clearing-parent/trade-importer/src/test/java/ru/spcex/clearing/trade/importer/services/TradeImporterServiceTest.java @@ -55,7 +55,7 @@ class TradeImporterServiceTest extends AbstractServiceTest { * Тест проверяет обновление сущности {@link STrades}.
* Входной запрос {@link LauncherCommandRequest}:
*/ - @Test //для работы теста нужна тестовая база Microsoft SQL с данными +// @Test //для работы теста нужна тестовая база Microsoft SQL с данными void process() { STrades sTrade = getSTrade(); Long id = sTradesImdg.insert(sTrade); From 948b8187bcb24f281d4ea2ca15642623a1cf0960 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 3 May 2023 12:22:01 +0300 Subject: [PATCH 30/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/importer/services/TradeImporterService.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 84dd75c82..2d8134533 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -53,10 +53,10 @@ public class TradeImporterService { } public void process(boolean byCommand) { - log.debug("start process import STrades from DB"); + log.debug("Start process import STrades from DB"); Collection tradesFromDB = jdbcTemplate.query("SELECT * FROM Trades", (resultSet, i) -> readSTrades(resultSet)); - log.debug(String.format("load from DB STrades: %d", tradesFromDB.size())); + log.debug("load from DB STrades: {}", tradesFromDB.size()); for (STrades tradesDb : tradesFromDB) { if (isValidTrades(tradesDb)) { STrades sTrades = getSTradesFromImdg(tradesDb, sTradesImdg); @@ -70,8 +70,10 @@ public class TradeImporterService { if (byCommand) { STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); - log.debug("successfully import STrades from DB by command"); - }else log.debug("successfully import STrades from DB by scheduled"); + log.debug("Successfully import STrades from DB by command. Send to kafka command, topic={}", S_TRADES_IMPORTED); + } else { + log.debug("Successfully import STrades from DB by scheduled"); + } } public STrades getSTradesFromImdg(STrades tradesDb, Imdg sTradesImdg) { From bca9879cc920990bcc6992934a77f44e2fc8b424 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 15:04:44 +0300 Subject: [PATCH 31/39] =?UTF-8?q?company-service=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE=20enum,=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=20dictionary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/common/rules/EnumPresentRule.java | 1 + .../ClearingMemberCategoryValidationConfig.java | 6 ------ .../config/validation/CompanyValidationConfig.java | 5 ----- .../config/validation/ContactValidationConfig.java | 11 ----------- .../validation/ProfileDocumentValidationConfig.java | 11 ----------- 5 files changed, 1 insertion(+), 33 deletions(-) diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/EnumPresentRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/EnumPresentRule.java index 5b503aedf..06df4e777 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/EnumPresentRule.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/EnumPresentRule.java @@ -11,6 +11,7 @@ import java.util.function.Function; /** * Проверка поля со значением из множества (enum) + * Рекомендуется использовать не эту валидацию, а DictionaryPresentRule * @param Класс проверяемого объекта * @param Enum */ diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java index 573a2793c..23270a5d8 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java @@ -81,12 +81,6 @@ public class ClearingMemberCategoryValidationConfig { return CompanyErrors.CompanyDisabled; return null; }), - EnumPresentRule.instance("clearingMemberCategory", - ClearingMemberCategoryUpdateRequest::getClearingMemberCategory, - ClearingCategory.values(), - false, - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("clearingMemberCategory", ClearingMemberCategoryUpdateRequest::getClearingMemberCategory, IMDGDistributedNames.Map_ClearingCategoryDictionary, diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanyValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanyValidationConfig.java index b31127875..5a890d5b1 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanyValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/CompanyValidationConfig.java @@ -49,11 +49,6 @@ public class CompanyValidationConfig { WorkflowStatusDictionary.class, CompanyErrors.RequiredFieldEmpty, CompanyErrors.WrongFieldValue), - EnumPresentRule.instance("companySymbol", - CompanyNewRequest::getCompanySymbol, - CompanySymbol.values(), - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("companySymbol", CompanyNewRequest::getCompanySymbol, IMDGDistributedNames.Map_CompanySymbolDictionary, diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java index 3cb98b376..f92635d78 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java @@ -44,11 +44,6 @@ public class ContactValidationConfig { Company.class, CompanyErrors.RequiredFieldEmpty, CompanyErrors.CompanyNotFound), - EnumPresentRule.instance("contactType", - ContactNewRequest::getContactType, - ContactTypes.values(), - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("contactType", ContactNewRequest::getContactType, IMDGDistributedNames.Map_ContactTypeDictionary, @@ -86,12 +81,6 @@ public class ContactValidationConfig { } return null; }), - EnumPresentRule.instance("contactType", - ContactUpdateRequest::getContactType, - ContactTypes.values(), - false, - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("contactType", ContactUpdateRequest::getContactType, IMDGDistributedNames.Map_ContactTypeDictionary, diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java index 098c6a550..9fe82a927 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java @@ -45,11 +45,6 @@ public class ProfileDocumentValidationConfig { CompanyErrors.RequiredFieldEmpty, CompanyErrors.CompanyNotFound, company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled), - EnumPresentRule.instance("documentType", - ProfileDocumentNewRequest::getDocumentType, - DocumentTypes.values(), - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("documentType", ProfileDocumentNewRequest::getDocumentType, IMDGDistributedNames.Map_DocumentTypeDictionary, @@ -109,12 +104,6 @@ public class ProfileDocumentValidationConfig { CompanyErrors.CompanyNotFound, false, company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled), - EnumPresentRule.instance("documentType", - ProfileDocumentUpdateRequest::getDocumentType, - DocumentTypes.values(), - false, - CompanyErrors.WrongFieldValue, - CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("documentType", ProfileDocumentUpdateRequest::getDocumentType, IMDGDistributedNames.Map_DocumentTypeDictionary, From bf8454062e35542c7a0892f4b4db7c76ecea43a1 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 15:11:35 +0300 Subject: [PATCH 32/39] =?UTF-8?q?validateRoleAndGetResult=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20log=20info?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/util/security/UserRoleVerification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java b/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java index 565d10bc0..857550147 100644 --- a/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java +++ b/clearing-parent/security-util/src/main/java/ru/spcex/clearing/util/security/UserRoleVerification.java @@ -90,8 +90,8 @@ public class UserRoleVerification { Objects.requireNonNull(roleForVerification); Long requesterId = req.getUserId(); if (requesterId != null && !userHasRole(requesterId, roleForVerification)) { - log.debug("User {} has no role to allow this action", requesterId); String errMsg = messageResolver.resolve(new EnumMessage(roleVerificationError, requesterId)); + log.info("User {} has no role: {}", requesterId, errMsg); return new RequestInfoUpdate() .setId(req.getId()) .setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error) From d901d9fca745e697ba0b79454954c7fc092fe59e Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 15:54:29 +0300 Subject: [PATCH 33/39] =?UTF-8?q?trade-importer=20http://jira.mfd.msk:8088?= =?UTF-8?q?/browse/CLS-276=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=20z=5Fdistr,=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 2 +- .../src/main/resources/logback.xml | 38 +++++++++++++++++++ pom.xml | 1 + z-distr/pom.xml | 19 ++++++++++ .../src/main/resources/distr/bin/kill_all.sh | 1 + .../main/resources/distr/bin/launch_all.sh | 1 + .../resources/distr/bin/trade-importer.sh | 9 +++++ 7 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/trade-importer/src/main/resources/logback.xml create mode 100644 z-distr/src/main/resources/distr/bin/trade-importer.sh diff --git a/clearing-parent/trade-importer/src/main/resources/application.properties b/clearing-parent/trade-importer/src/main/resources/application.properties index dc8f7ba47..e2cfdbd94 100644 --- a/clearing-parent/trade-importer/src/main/resources/application.properties +++ b/clearing-parent/trade-importer/src/main/resources/application.properties @@ -13,7 +13,7 @@ trade-importer.hazelcast.login=dev trade-importer.hazelcast.password=dev-pass trade-importer.kafka-consumer.bootstrap-servers=localhost:9092 -trade-importer.kafka-consumer.group-id=dev-group- trade-importer +trade-importer.kafka-consumer.group-id=dev-group-trade-importer trade-importer.kafka-consumer.enable-auto-commit=false trade-importer.kafka-consumer.session-timeout-ms=30000 trade-importer.kafka-consumer.auto-offset-reset=latest diff --git a/clearing-parent/trade-importer/src/main/resources/logback.xml b/clearing-parent/trade-importer/src/main/resources/logback.xml new file mode 100644 index 000000000..c49a8bbd0 --- /dev/null +++ b/clearing-parent/trade-importer/src/main/resources/logback.xml @@ -0,0 +1,38 @@ + + + + + + %date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n + utf-8 + + + + ./logs/trade-importer.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n + utf8 + + + + ./logs/trade-importer.%i.log + + 1 + 10 + + + 500MB + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index e21bc656f..ce3a0c7c7 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ ${folder_root_clearing}/clearing-parent/imdg ${folder_root_clearing}/clearing-parent/dbf-exporter ${folder_root_clearing}/clearing-parent/dbf-importer + ${folder_root_clearing}/clearing-parent/trade-importer ${folder_root_clearing}/clearing-parent/account-service ${folder_root_clearing}/clearing-parent/balance-service ${folder_root_clearing}/clearing-parent/company-service diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 2414ad7fb..819183670 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -191,6 +191,25 @@ + + copy-trade-importer-bin + prepare-package + + copy + + + + + ${folder_root_trade-importer}/target/trade-importer.jar + ${folder.clearing.distr.modules}/trade-importer/trade-importer.jar + + + ${folder_root_trade-importer}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/trade-importer/application.properties + + + + copy-account-service-bin prepare-package diff --git a/z-distr/src/main/resources/distr/bin/kill_all.sh b/z-distr/src/main/resources/distr/bin/kill_all.sh index 4e9010ebd..f4da3e400 100644 --- a/z-distr/src/main/resources/distr/bin/kill_all.sh +++ b/z-distr/src/main/resources/distr/bin/kill_all.sh @@ -7,6 +7,7 @@ kill -9 $(ps -ef | grep java | grep company-service.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep clearing-service.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep dbf-exporter.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep dbf-importer.jar | awk '{print $2}') +kill -9 $(ps -ef | grep java | grep trade-importer.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep imdg.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep securities-service.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep utility-service.jar | awk '{print $2}') diff --git a/z-distr/src/main/resources/distr/bin/launch_all.sh b/z-distr/src/main/resources/distr/bin/launch_all.sh index 6e5336f8c..18e90c4b0 100644 --- a/z-distr/src/main/resources/distr/bin/launch_all.sh +++ b/z-distr/src/main/resources/distr/bin/launch_all.sh @@ -8,6 +8,7 @@ cd /opt/mfd/clearing/bin /opt/mfd/clearing/bin/clearing-service.sh /opt/mfd/clearing/bin/dbf-exporter.sh /opt/mfd/clearing/bin/dbf-importer.sh +/opt/mfd/clearing/bin/trade-importer.sh /opt/mfd/clearing/bin/securities-service.sh /opt/mfd/clearing/bin/utility-service.sh /opt/mfd/clearing/bin/scheduler-service.sh diff --git a/z-distr/src/main/resources/distr/bin/trade-importer.sh b/z-distr/src/main/resources/distr/bin/trade-importer.sh new file mode 100644 index 000000000..3e4a60f8c --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/trade-importer.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +CLEARING_HOME=/opt/mfd/clearing/ +cd $CLEARING_HOME/bin + +CMD="java -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7100 -jar trade-importer.jar --spring.config.location=$CLEARING_HOME/settings/trade-importer/" + +$CMD >/dev/null 2>&1 & + From 342db96a1e386d4f84110fea3064c9ee9a3b9661 Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 3 May 2023 16:30:19 +0300 Subject: [PATCH 34/39] fixes EnumPresentRule --- .../validation/AccountValidationConfig.java | 20 +++++++------------ .../BankAccountValidationConfig.java | 13 ------------ 2 files changed, 7 insertions(+), 26 deletions(-) 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 e1f279b10..cb654bc0e 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 @@ -77,11 +77,6 @@ public class AccountValidationConfig { if (statusValue == null || AccountStatus.ACTIVE.equalsByKey(statusValue)) return null; return AccountError.WrongFieldValue; }), - EnumPresentRule.instance("accountType", - CorrespondentAccountNewRequest::getAccountType, - AccountType.values(), - AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", CorrespondentAccountNewRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, @@ -89,7 +84,7 @@ public class AccountValidationConfig { AccountError.RequiredFieldEmpty, AccountError.WrongFieldValue, accountType -> { - if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null; + if (AccountType.Corr.equalsByKey(accountType.getCode())) return null; return AccountError.WrongFieldValue; }) ); @@ -138,11 +133,6 @@ public class AccountValidationConfig { false, AccountError.WrongFieldValue, AccountError.RequiredFieldEmpty), - EnumPresentRule.instance("accountType", - CorrespondentAccountUpdateRequest::getAccountType, - AccountType.values(), - AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("accountType", CorrespondentAccountUpdateRequest::getAccountType, IMDGDistributedNames.Map_AccountTypeDictionary, @@ -150,7 +140,7 @@ public class AccountValidationConfig { AccountError.RequiredFieldEmpty, AccountError.WrongFieldValue, accountType -> { - if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null; + if (AccountType.Corr.equalsByKey(accountType.getCode())) return null; return AccountError.WrongFieldValue; }) ); @@ -172,7 +162,11 @@ public class AccountValidationConfig { IMDGDistributedNames.Map_Account, Account.class, AccountError.RequiredFieldEmpty, - AccountError.AccountNotFound) + AccountError.AccountNotFound, + account -> { + if (AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return null; + return AccountError.AccountNotActive; + }) ); }; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java index 55b02c206..1c2ca6ab6 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java @@ -12,13 +12,11 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; -import ru.spcex.clearing.validation.common.rules.EnumPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -73,11 +71,6 @@ public class BankAccountValidationConfig { if (accounts.isEmpty()) return null; return AccountError.AccountAlreadyExist; }), - EnumPresentRule.instance("currency", - BankAccountNewRequest::getCurrency, - CurrencyCode.values(), - AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("currency", BankAccountNewRequest::getCurrency, IMDGDistributedNames.Map_CurrencyCodeDictionary, @@ -126,12 +119,6 @@ public class BankAccountValidationConfig { if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive; return null; }), - EnumPresentRule.instance("currency", - BankAccountUpdateRequest::getCurrency, - CurrencyCode.values(), - false, - AccountError.WrongFieldValue, - AccountError.RequiredFieldEmpty), DictionaryPresentRule.instance("currency", BankAccountUpdateRequest::getCurrency, IMDGDistributedNames.Map_CurrencyCodeDictionary, From 8ff70f65cf035f88531d7933db5907704bd7c8c2 Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 3 May 2023 17:54:27 +0300 Subject: [PATCH 35/39] http://jira.mfd.msk:8088/browse/CLS-265 fix after review --- .../config/validation/ClearingAccountValidationConfig.java | 1 - .../clearing/account/config/validation/ValidationConfig.java | 3 ++- .../java/ru/spcex/clearing/account/service/AccountService.java | 2 -- .../ru/spcex/clearing/account/service/BankAccountService.java | 2 -- .../clearing/account/service/InformationAccountService.java | 1 - 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java index 1c8c88154..cb3c2368e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java @@ -31,7 +31,6 @@ import java.util.function.Function; @Configuration public class ClearingAccountValidationConfig { - // todo add validation for clearingAccountType from dictionary @Bean("clearingAccountNewRequestValidator") public Function clearingAccountNewRequestValidator( Map> imdgForValidation diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index 36cebc49d..d6189008f 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.platform.dictionary.AccountTypeDictionary; import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; import ru.clearing.platform.dictionary.CurrencyCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -35,7 +36,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); addImdg.accept(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class); - addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class); + addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class); addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class); addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); addImdg.accept(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); 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 59ff63df1..81df09673 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 @@ -186,8 +186,6 @@ public class AccountService extends QueueConsumer implements InitializingBean { public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) { log.debug("AccountSdf01Request received"); - // todo add validation (create task for that?) - AccountSdf01Request req = userRequest.getRequestPayload(); List accountToStatement = new ArrayList<>(); for (AccountSdfRequestPart accountReq : req.getAccounts()) { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 7b42723c9..1940cc5a9 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -136,7 +136,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea imdgTransaction.commitTransaction(); log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId); } else { - // todo выяснить, что возвращать из метода в этой ситуации log.debug("failed insert, new bank account id {}, new account id {} (if id = -1 then insert is failed)", bankAccountId, accountId); @@ -185,7 +184,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.getId(), account.getId()); } else { - // todo выяснить, что возвращать из метода в этой ситуации log.debug("failed update, bank account id {}, new account id {}", bankAccount.getId(), account.getId()); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 0a059b28e..2c74b2086 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -85,7 +85,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali Long newId = informationAccountImdg.nextIDSequenceFor(); String accountValue = generateInfoAccount(newId); - // todo уточнить у репортера ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder(); ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1); ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()); From 29b47b8b96d3d4a507bff49c8ea6fda5020a73db Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 19:02:00 +0300 Subject: [PATCH 36/39] =?UTF-8?q?QueueConsumer=20=D0=B7=D0=B0=D1=89=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BE=D1=82=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B0?= =?UTF-8?q?=D0=BC=D0=BE=D0=BC=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/platform/messaging/domain/Consts.java | 1 - .../platform/messaging/service/QueueConsumer.java | 11 +++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 51410a656..c6c9f0d28 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -99,7 +99,6 @@ public interface Consts { String SDF11_PROCESS = "sdf11-process"; String EXPORT_PROCESS = "export-process"; String S_TRADES_IMPORTED = "s_trades-imported"; - String ACCOUNT_NEW = "account-new"; String ACCOUNT_TERMINATION = "account-termination"; String BALANCE_ACCOUNT_NEW = "balance-account-new"; String BALANCE_ACCOUNT_UPDATE = "balance-account-update"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/QueueConsumer.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/QueueConsumer.java index 83a2d7ca5..0b26d5c03 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/QueueConsumer.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/QueueConsumer.java @@ -80,6 +80,7 @@ public class QueueConsumer implements AutoCloseable { consumer.subscribe(callbacks.keySet()); } Object o = null; + int lastErrors = 0; while (!closed.get()) { try { ConsumerRecords records = consumer.poll(Duration.of(10, ChronoUnit.SECONDS)); @@ -95,11 +96,21 @@ public class QueueConsumer implements AutoCloseable { } } } + lastErrors = 0; } catch (Throwable e) { log.error(ExceptionUtils.getStackTrace(e)); if (producer != null && o != null) { sendErrorResponse((BaseRequest) o); } + if (lastErrors++ > 20) { + log.warn("Too many error at row, {}. Sleep.", lastErrors); + try { + Thread.sleep(1000L); + } catch (InterruptedException ie) { + log.info("Thread interrupted. {}", ExceptionUtils.getStackTrace(ie)); + break; + } + } } } } catch (WakeupException e) { From 819a1afd22dbb73bfe62c967ee4e28bc64e3473f Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 20:00:43 +0300 Subject: [PATCH 37/39] http://git.mfd.msk/mfd/clearing/-/issues/10 IMessageResolver + IMDG --- .../account/config/BeanConfiguration.java | 6 +-- clearing-parent/balance-service/pom.xml | 4 ++ .../balance/config/MessagesConfig.java | 22 ++--------- .../main/resources/messages/error.properties | 2 - .../resources/messages/error_ru.properties | 2 - clearing-parent/clearing-service/pom.xml | 4 ++ .../config/MessageResolverConfig.java | 7 ++-- .../util/services/IMDGMessageResolver.java | 37 +++++++++++++++++++ .../company/config/BeanConfiguration.java | 6 +-- .../scheduler/config/ErrorResolverConfig.java | 7 ++-- .../config/ErrorResolverConfig.java | 7 ++-- clearing-parent/trade-importer/pom.xml | 4 ++ .../importer/config/ErrorResolverConfig.java | 7 ++-- 13 files changed, 75 insertions(+), 40 deletions(-) delete mode 100644 clearing-parent/balance-service/src/main/resources/messages/error.properties delete mode 100644 clearing-parent/balance-service/src/main/resources/messages/error_ru.properties create mode 100644 clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java index 9a7793082..c219ed4c1 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/BeanConfiguration.java @@ -9,13 +9,13 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; @Configuration public class BeanConfiguration { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } @Bean diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index f4d1145bb..9f1706733 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -24,6 +24,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.clearing + clearing-validation + ru.spcex.clearing classes diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/MessagesConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/MessagesConfig.java index 1b8fea101..19cefe06e 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/MessagesConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/MessagesConfig.java @@ -1,30 +1,16 @@ package ru.spcex.clearing.balance.config; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SpringPropertiesMessageResolver; - -import java.util.Locale; @Configuration public class MessagesConfig { - @Bean("validation-error-messages") - public ResourceBundleMessageSource messages() { - ResourceBundleMessageSource source = new ResourceBundleMessageSource(); - source.setBasenames("messages/error"); - source.setUseCodeAsDefaultMessage(true); - source.setDefaultEncoding("utf8"); - source.setDefaultLocale(Locale.ROOT); - return source; - } @Bean - public IMessageResolver errorResolver(@Qualifier("validation-error-messages") ResourceBundleMessageSource messageBundle) { - SpringPropertiesMessageResolver resolver = new SpringPropertiesMessageResolver(messageBundle); - resolver.setLocale("ru"); - return resolver; + public IMessageResolver errorResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } } diff --git a/clearing-parent/balance-service/src/main/resources/messages/error.properties b/clearing-parent/balance-service/src/main/resources/messages/error.properties deleted file mode 100644 index 3f2dc2393..000000000 --- a/clearing-parent/balance-service/src/main/resources/messages/error.properties +++ /dev/null @@ -1,2 +0,0 @@ -5211=Company not found -5213=Currency not found diff --git a/clearing-parent/balance-service/src/main/resources/messages/error_ru.properties b/clearing-parent/balance-service/src/main/resources/messages/error_ru.properties deleted file mode 100644 index 1820f1d6e..000000000 --- a/clearing-parent/balance-service/src/main/resources/messages/error_ru.properties +++ /dev/null @@ -1,2 +0,0 @@ -5211=Компания не найдена -5213=Валюта не найдена \ No newline at end of file diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index 5728c07ef..fe421bfb5 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -25,6 +25,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.clearing + clearing-validation + ru.spcex.clearing classes diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java index 6ef39cec8..cf3d8356a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java @@ -3,12 +3,13 @@ package ru.spcex.clearing.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; @Configuration public class MessageResolverConfig { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } } diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java new file mode 100644 index 000000000..97dfbf8cf --- /dev/null +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/util/services/IMDGMessageResolver.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.util.services; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.platform.dictionary.ErrorCodeDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +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 java.util.Arrays; + +/** + * Использует ErrorCodeDictionary для расшифровки текста кодов ошибок. + */ +public class IMDGMessageResolver implements IMessageResolver { + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected final Imdg errorCodeDictionaryIMDG; + + public IMDGMessageResolver(ImdgProvider imdgProvider) { + this.errorCodeDictionaryIMDG = imdgProvider.getImdg(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class); + } + + @Override + public String resolve(EnumMessage errorMessage) { + if (errorMessage == null) return "null"; + + ErrorCodeDictionary errorDictionary = errorCodeDictionaryIMDG.getSingleObjectByID(errorMessage.getSubject().getId()); + if (errorDictionary == null) { + log.warn("ERROR_CODE_DICTIONARY not found fo id={}", errorMessage.getSubject().getId()); + return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs())); + } + String textTemplate = errorDictionary.getName(); + return String.format(textTemplate, errorMessage.getArgs()); + } +} diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/BeanConfiguration.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/BeanConfiguration.java index d0189af7a..d6248d708 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/BeanConfiguration.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/BeanConfiguration.java @@ -10,13 +10,13 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; @Configuration public class BeanConfiguration { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } @Bean diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ErrorResolverConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ErrorResolverConfig.java index c64e7c10e..f9de0dbfb 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ErrorResolverConfig.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/ErrorResolverConfig.java @@ -3,12 +3,13 @@ package ru.spcex.clearing.scheduler.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; @Configuration public class ErrorResolverConfig { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java index 38d1bdd66..327fe9182 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java @@ -3,12 +3,13 @@ package ru.spcex.clearing.securities.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; @Configuration public class ErrorResolverConfig { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } } diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 7ea41af25..fec21cae1 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -62,6 +62,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.clearing + clearing-validation + ru.spcex.platform platform-enum diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java index 8c838d4ed..12ed6d5dc 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/config/ErrorResolverConfig.java @@ -3,12 +3,13 @@ package ru.spcex.clearing.trade.importer.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; @Configuration public class ErrorResolverConfig { @Bean - public IMessageResolver messageResolver() { - return new SimpleMessageResolver(); + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); } } From e95b816f549d4dd9c4469a921deef55b7c2f68df Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 3 May 2023 20:08:18 +0300 Subject: [PATCH 38/39] backend-api http://jira.mfd.msk:8088/browse/CLS-288 --- .../queue/account/InformationAccountController.java | 2 +- .../queue/account/InformationAccountControllerTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountController.java index a9d221ad3..5c2943cd2 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountController.java @@ -17,7 +17,7 @@ import java.util.Collection; import java.util.Map; @Controller -@RequestMapping("/accounting/information-account") +@RequestMapping("/accounting/information-accounts") public class InformationAccountController { private final IStateLoader stateLoader; diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountControllerTest.java index 4131c8f96..d352d259b 100644 --- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountControllerTest.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/account/InformationAccountControllerTest.java @@ -7,12 +7,12 @@ import ru.spcex.clearing.backendapi.controller.queue.account.InformationAccountC import ru.spcex.clearing.imdg.IMDGDistributedNames; class InformationAccountControllerTest extends AbstractControllerTest { - public static final String REST_URL = "/accounting/information-account/"; + public static final String REST_URL = "/accounting/information-accounts/"; /** * {@link InformationAccountController#getAll()}
* Тест проверяет получение запроса по REST API.
- * Входной запрос /accounting/information-account/
+ * Входной запрос /accounting/information-accounts/
* Ответ CommonGetAllResponse
*/ @Test From f53d05ba6cc3b69e43fb7763a991e3555a6ab3ff Mon Sep 17 00:00:00 2001 From: psemenkov Date: Thu, 4 May 2023 13:22:38 +0300 Subject: [PATCH 39/39] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-276?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/importer/services/TradeImporterService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 2d8134533..551119d24 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -68,12 +68,12 @@ public class TradeImporterService { } if (byCommand) { - STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); - producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); log.debug("Successfully import STrades from DB by command. Send to kafka command, topic={}", S_TRADES_IMPORTED); } else { - log.debug("Successfully import STrades from DB by scheduled"); + log.debug("Successfully import STrades from DB by scheduled. Send to kafka command, topic={}", S_TRADES_IMPORTED); } + STradesImportedRequest sTradesImportedRequest = new STradesImportedRequest(); + producer.send(new ProducerRecord<>(S_TRADES_IMPORTED, sTradesImportedRequest)); } public STrades getSTradesFromImdg(STrades tradesDb, Imdg sTradesImdg) {