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/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/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java
new file mode 100644
index 000000000..cb654bc0e
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java
@@ -0,0 +1,174 @@
+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.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;
+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.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("correspondentAccountNewRequestValidator")
+ public Function correspondentAccountNewRequestValidator(
+ Map> imdgForValidation
+ ) {
+ 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",
+ CorrespondentAccountNewRequest::getCompanyId,
+ IMDGDistributedNames.Map_Company,
+ Company.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.CompanyNotFound,
+ company -> WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive),
+ FieldRequiredRule.instance("account",
+ CorrespondentAccountNewRequest::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",
+ CorrespondentAccountNewRequest::getStatus,
+ AccountError.RequiredFieldEmpty,
+ false,
+ statusValue -> {
+ if (statusValue == null || AccountStatus.ACTIVE.equalsByKey(statusValue)) return null;
+ return AccountError.WrongFieldValue;
+ }),
+ DictionaryPresentRule.instance("accountType",
+ CorrespondentAccountNewRequest::getAccountType,
+ IMDGDistributedNames.Map_AccountTypeDictionary,
+ AccountTypeDictionary.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.WrongFieldValue,
+ accountType -> {
+ if (AccountType.Corr.equalsByKey(accountType.getCode())) return null;
+ return AccountError.WrongFieldValue;
+ })
+ );
+ };
+ }
+
+ @Bean("correspondentAccountUpdateRequestValidator")
+ public Function correspondentAccountUpdateRequestValidator(
+ Map> imdgForValidation
+ ) {
+ 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",
+ CorrespondentAccountUpdateRequest::getId,
+ IMDGDistributedNames.Map_Account,
+ Account.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.AccountNotFound,
+ account -> {
+ String statusFromRequest = correspondentAccountUpdateRequest.getStatus();
+ if (statusFromRequest != null && !statusFromRequest.equalsIgnoreCase(account.getStatus()))
+ return AccountError.WrongFieldValue;
+ return null;
+ }),
+ IdPresentRule.instance("companyId",
+ CorrespondentAccountUpdateRequest::getCompanyId,
+ IMDGDistributedNames.Map_Company,
+ Company.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.CompanyNotFound,
+ false,
+ company -> {
+ IErrorEnumId error = WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive;
+ error = Objects.equals(company.getId(), correspondentAccountUpdateRequest.getCompanyId()) ? error : AccountError.WrongFieldValue;
+ return error;
+ }),
+ EnumPresentRule.instance("status",
+ CorrespondentAccountUpdateRequest::getStatus,
+ AccountStatus.values(),
+ false,
+ AccountError.WrongFieldValue,
+ AccountError.RequiredFieldEmpty),
+ DictionaryPresentRule.instance("accountType",
+ CorrespondentAccountUpdateRequest::getAccountType,
+ IMDGDistributedNames.Map_AccountTypeDictionary,
+ AccountTypeDictionary.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.WrongFieldValue,
+ accountType -> {
+ if (AccountType.Corr.equalsByKey(accountType.getCode())) return null;
+ return AccountError.WrongFieldValue;
+ })
+ );
+ };
+ }
+
+ @Bean("correspondentAccountBlockRequestValidator")
+ public Function correspondentAccountBlockRequestValidator(
+ Map> imdgForValidation
+ ) {
+ return correspondentAccountBlockRequest -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(correspondentAccountBlockRequest);
+ 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,
+ 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
new file mode 100644
index 000000000..1c2ca6ab6
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/BankAccountValidationConfig.java
@@ -0,0 +1,164 @@
+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.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 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.equalsByKey(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("status", AccountStatus.ACTIVE.getKey());
+ 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;
+ }),
+ 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)
+ );
+ };
+ }
+
+ @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.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.AccountNotFound;
+ if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive;
+ return null;
+ }),
+ DictionaryPresentRule.instance("currency",
+ BankAccountUpdateRequest::getCurrency,
+ IMDGDistributedNames.Map_CurrencyCodeDictionary,
+ CurrencyCodeDictionary.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.WrongFieldValue,
+ false)
+ );
+ };
+ }
+
+ @Bean("bankAccountBlockRequestValidator")
+ public Function bankAccountBlockRequestValidator(
+ Map> imdgForValidation
+ ) {
+ return bankAccountBlockRequest -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(bankAccountBlockRequest);
+ 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,
+ IMDGDistributedNames.Map_BankAccount,
+ BankAccount.class,
+ AccountError.RequiredFieldEmpty,
+ 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.AccountNotFound;
+ if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive;
+ return null;
+ })
+ );
+ };
+ }
+
+}
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..cb3c2368e
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClearingAccountValidationConfig.java
@@ -0,0 +1,136 @@
+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.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;
+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_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,
+ 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;
+ }),
+ DictionaryPresentRule.instance("clearingAccountType",
+ ClearingAccountNewRequest::getClearingAccountType,
+ IMDGDistributedNames.Map_ClearingAccountTypeDictionary,
+ ClearingAccountTypeDictionary.class,
+ AccountError.RequiredFieldEmpty,
+ AccountError.WrongFieldValue)
+ );
+ };
+ }
+
+
+ @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_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,
+ 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;
+ }),
+ 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/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..10277912b
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/DepoAccountValidationConfig.java
@@ -0,0 +1,76 @@
+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_Account);
+ 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/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
new file mode 100644
index 000000000..d6189008f
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java
@@ -0,0 +1,53 @@
+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.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;
+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_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, AccountTypeDictionary.class);
+ addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
+ addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
+ addImdg.accept(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.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..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
@@ -3,12 +3,18 @@ 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),
+ AccountNotFound(5011L),
+ AccountNotActive(5012L),
CompanyNotFound(5013L),
CompanyNotActive(5014L),
-
+ InfoAccountAlreadyExist(5015L),
+ ClearingCategoryNotFound(5019L)
;
+
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..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
@@ -1,51 +1,192 @@
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.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.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;
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.AccountStatus;
+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.time.Instant;
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) {
- super(kafkaQueue);
- this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
+ public AccountService(Consumer kafkaQueue,
+ Producer kafkaProducer,
+ ImdgProvider imdgProvider,
+ KafkaSender kafkaSender,
+ IMessageResolver messageResolver,
+ UserRoleVerification userRoleVerification,
+ ValidationHelper validationHelper,
+ @Qualifier("correspondentAccountNewRequestValidator")
+ Function accountNewRequestValidator,
+ @Qualifier("correspondentAccountUpdateRequestValidator")
+ Function accountUpdateRequestValidator,
+ @Qualifier("correspondentAccountBlockRequestValidator")
+ Function accountBlockRequestValidator) {
+ super(kafkaQueue, kafkaProducer);
+ 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::accountNew)
- .forDestination(Consts.ACCOUNT_NEW, callbacks::put);
+ .setConsumer(this::accountNewSdf01)
+ .forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put);
+ callback(CorrespondentAccountNewRequest.class)
+ .setConsumer(this::accountCorrespondentNew)
+ .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::correspondentAccountBlock)
+ .forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put);
init();
}
- private void accountNew(BaseRequest userRequest) {
- AccountSdf01Request req = userRequest.getRequestPayload();
+
+ public RequestInfoUpdate accountCorrespondentNew(BaseRequest userRequest) {
+ log.debug("CorrespondentAccountNewRequest received");
+
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
+ CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
+
+ Instant now = Instant.now();
+ Account account = new Account();
+ account.setCompanyId(req.getCompanyId());
+ account.setAccount(req.getAccount());
+ account.setAccountType(req.getAccountType());
+ account.setStatus(req.getStatus());
+ account.setCreated(now);
+ account.setUpdated(now);
+
+ 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;
+ }
+
+ public RequestInfoUpdate correspondentAccountUpdate(BaseRequest userRequest) {
+ log.debug("CorrespondentAccountUpdateRequest received");
+
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountUpdateRequestValidator);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
+ CorrespondentAccountUpdateRequest request = userRequest.getRequestPayload();
+
+ Account account = accountMap.getSingleObjectByID(request.getId());
+
+ if (request.getStatus() != null) account.setStatus(request.getStatus());
+
+ account.setUpdated(Instant.now());
+
+ accountMap.update(account);
+
+ log.debug("successfully processed, update account id {}", account.getId());
+ return null;
+ }
+
+ public RequestInfoUpdate correspondentAccountBlock(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());
+ account.setUpdated(Instant.now());
+
+ accountMap.update(account);
+
+ log.debug("successfully processed, block account id {}", account.getId());
+ return null;
+ }
+
+ @Deprecated
+ public RequestInfoUpdate accountNewSdf01(BaseRequest userRequest) {
log.debug("AccountSdf01Request received");
+
+ AccountSdf01Request req = userRequest.getRequestPayload();
List accountToStatement = new ArrayList<>();
for (AccountSdfRequestPart accountReq : req.getAccounts()) {
Account account = new Account();
@@ -58,13 +199,15 @@ 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;
}
- 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,10 +215,59 @@ 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);
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()
+ .setId(reqId)
+ .setStatus(Status.Error)
+ .setMessage(errMsg);
+ }
+
}
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 7cc642a92..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
@@ -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;
@@ -19,18 +18,16 @@ 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.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
-import java.util.Optional;
import java.util.function.Function;
@Service
@@ -38,30 +35,40 @@ 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 final Imdg userImdg;
-// private final Imdg userRoleSessionImdg;
private final Function bankAccountNewRequestValidator;
+ private final Function bankAccountUpdateRequestValidator;
+ private final Function bankAccountBlockRequestValidator;
@Autowired
public BankAccountService(Consumer kafkaQueue,
Producer kafkaProducer,
ImdgProvider imdgProvider,
- IMessageResolver messageResolver,
-
+ UserRoleVerification userRoleVerification,
+ ValidationHelper validationHelper,
+ AccountService accountService,
@Qualifier("bankAccountNewRequestValidator")
- Function bankAccountNewRequestValidator) {
+ Function bankAccountNewRequestValidator,
+ @Qualifier("bankAccountUpdateRequestValidator")
+ Function bankAccountUpdateRequestValidator,
+ @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);
- 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.imdgProvider = imdgProvider;
+ this.userRoleVerification = userRoleVerification;
+ this.validationHelper = validationHelper;
+ this.accountService = accountService;
this.bankAccountNewRequestValidator = bankAccountNewRequestValidator;
+ this.bankAccountUpdateRequestValidator = bankAccountUpdateRequestValidator;
+ this.bankAccountBlockRequestValidator = bankAccountBlockRequestValidator;
}
@Override
@@ -73,82 +80,81 @@ 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();
}
-// 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) {
+ 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();
-// // проверка прав
-// 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);
- }
-
- log.debug("BankAccountNewRequest received");
- 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());
-
+ Instant now = Instant.now();
Account account = new Account();
- account.setAccount(req.account);
+ account.setAccount(req.getAccount());
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());
+ account.setCompanyId(req.getCompanyId());
+ account.setCreated(now);
+ account.setUpdated(now);
+ requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId());
+ if (requestInfoUpdate != null) return requestInfoUpdate;
- accountMap.insert(account);
+ Long bankAccountId = -1L;
+ Long accountId = -1L;
+ ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
+ boolean txOk = false;
+ imdgTransaction.beginTransaction();
+ try {
+ accountId = accountMap.insert(account);
- bankAccount.setAccountId(account.getId());
- bankAccountMap.insert(bankAccount);
- log.debug("successfully processed, new id {}", bankAccount.getId());
+ 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(accountId);
+ bankAccountId = bankAccountMap.insert(bankAccount);
+
+ txOk = true;
+ } finally {
+ if (txOk) {
+ imdgTransaction.commitTransaction();
+ log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId);
+ } else {
+ log.debug("failed insert, new bank account id {}, new account id {} (if id = -1 then insert is failed)",
+ bankAccountId,
+ accountId);
+ imdgTransaction.rollbackTransaction();
+ }
+ }
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());
@@ -164,24 +170,68 @@ 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 {
+ 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, bankAccountBlockRequestValidator);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
log.debug("CommonDeleteRequest received id = {}", req.getId());
BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId());
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
new file mode 100644
index 000000000..03f148353
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java
@@ -0,0 +1,168 @@
+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.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;
+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.platform.messaging.service.Status;
+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.Map;
+import java.util.function.Function;
+
+@Service
+public class ClearingAccountService extends QueueConsumer implements InitializingBean {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final AccountService accountService;
+ private final ValidationHelper validationHelper;
+ private final ImdgProvider imdgProvider;
+ private final Imdg accountImdg;
+ private final Imdg clearingAccountImdg;
+ private final IMessageResolver messageResolver;
+ private final Function clearingAccountNewRequestValidator;
+ private final Function clearingAccountUpdateRequestValidator;
+
+ @Autowired
+ public ClearingAccountService(Consumer kafkaQueue,
+ Producer kafkaResponseQueue,
+ AccountService accountService,
+ ValidationHelper validationHelper,
+ ImdgProvider imdgProvider,
+ IMessageResolver messageResolver,
+ @Qualifier("clearingAccountNewRequestValidator")
+ Function clearingAccountNewRequestValidator,
+ @Qualifier("clearingAccountUpdateRequestValidator")
+ Function clearingAccountUpdateRequestValidator) {
+ super(kafkaQueue, kafkaResponseQueue);
+ 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.messageResolver = messageResolver;
+ 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(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);
+ clearingAccount.setClearingAccountType(req.getClearingAccountType());
+ 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 then insert is failed)",
+ clearingAccountId,
+ accountId);
+ imdgTransaction.rollbackTransaction();
+ }
+ }
+ return null;
+ }
+
+ 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));
+ 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/DepoAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java
new file mode 100644
index 000000000..625e909f5
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java
@@ -0,0 +1,112 @@
+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);
+ depoAccount.setDepoAccountType(req.getDepoAccountType());
+ 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/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..2c74b2086
--- /dev/null
+++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java
@@ -0,0 +1,152 @@
+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.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 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,
+ ValidationHelper validationHelper,
+ AccountService accountService,
+ @Qualifier("informationAccountNewRequestValidator")
+ Function infoAccountNewRequestValidator) {
+ super(kafkaQueue, kafkaResponseQueue);
+ this.messageResolver = messageResolver;
+ this.imdgProvider = imdgProvider;
+ 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 = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator);
+ if (requestInfoUpdate != null) return requestInfoUpdate;
+
+ Long newId = informationAccountImdg.nextIDSequenceFor();
+ String accountValue = generateInfoAccount(newId);
+
+ 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 then 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 50e495b0b..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
@@ -15,34 +15,51 @@ 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.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;
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.*;
+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 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;
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})
@@ -50,8 +67,10 @@ 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";
+ private static final Long companyId = 0L;
+ private static final Long relationId = 0L;
@Autowired
AccountService accountService;
@Autowired
@@ -63,8 +82,157 @@ 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() {
+ String uniqueAccount = account + UUID.randomUUID();
+
+ 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);
+ predictableAccount.setAccountType(AccountType.Corr.getKey());
+ predictableAccount.setCompanyId(companyId);
+ predictableAccount.setStatus(AccountStatus.ACTIVE.getKey());
+ predictableAccount.setRelationId(relationId);
+
+ String jsonString = getJsonStringForNew(correspondentAccountNewRequest, 0L);
+
+ addRecordToKafka((MockConsumer) accountService.getConsumer(),
+ Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW,
+ PARTITION,
+ 0,
+ jsonString);
+
+ waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord);
+
+ 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
+ void accountCorrespondentUpdate() {
+ Account existAccount = new Account();
+ existAccount.setAccount(account);
+ existAccount.setAccountType(AccountType.Corr.getKey());
+ existAccount.setStatus(AccountStatus.CLOSE.getKey());
+ existAccount.setCompanyId(companyId);
+ Long accountId = accountImdg.insert(existAccount);
+
+ CorrespondentAccountUpdateRequest correspondentAccountUpdateRequest = new CorrespondentAccountUpdateRequest();
+ correspondentAccountUpdateRequest.setAccount(account);
+ correspondentAccountUpdateRequest.setAccountType(AccountType.Corr.getKey());
+ correspondentAccountUpdateRequest.setStatus(AccountStatus.ACTIVE.getKey());
+ correspondentAccountUpdateRequest.setCompanyId(companyId);
+ correspondentAccountUpdateRequest.setId(accountId);
+
+
+ String jsonString = getJsonStringForUPDATE(correspondentAccountUpdateRequest, 0);
+
+ //ACT
+ addRecordToKafka((MockConsumer) accountService.getConsumer(),
+ Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE,
+ PARTITION,
+ 0,
+ jsonString);
+
+ //ASSERT
+ waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord);
+
+ Account resultUpdating = accountImdg.getSingleObjectByID(accountId);
+ existAccount.setUpdated(resultUpdating.getUpdated());
+ ACCOUNT_MATCHER.assertMatch(resultUpdating, existAccount);
+ accountImdg.delete(resultUpdating);
+ }
+
+ @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_CORRESPONDENT_ACCOUNT_BLOCK,
+ PARTITION,
+ 0,
+ jsonString);
+
+ //ASSERT
+ waitingWhenAddedRecordAndCheckIt(0L, producer, producerRecord);
+
+ Account resultBlock = accountImdg.getSingleObjectByID(accountId);
+ existAccount.setStatus(AccountStatus.BLOCKED.getKey());
+ existAccount.setUpdated(resultBlock.getUpdated());
+
+ ACCOUNT_MATCHER.assertMatch(existAccount, resultBlock);
+ accountImdg.delete(resultBlock);
+ }
+
/**
- * {@link AccountService#accountNew(BaseRequest)}
+ * {@link AccountService#accountNewSdf01(BaseRequest)}
* Тест проверяет создание сущности {@link BaseRequest} в Hazelcast при передаче из Apache Kafka.
* Входной запрос {@link AccountSdf01Request}:
* {@link AccountSdfRequestPart#setSdfId} - текущий Id
@@ -74,7 +242,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();
@@ -85,7 +253,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);
@@ -114,33 +281,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