From 12479c89b724dcffe7b03168fce28213fc0c382d Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 13 Jan 2023 14:00:27 +0300 Subject: [PATCH] fix crud operations on BankAccount --- clearing-parent/account-service/pom.xml | 4 + .../account/config/ErrorResolverConfig.java | 14 ++++ .../clearing/account/errors/AccountError.java | 17 ++++ .../account/service/BankAccountService.java | 80 +++++++++++++++++-- .../service/BankAccountServiceTest.java | 15 +++- .../platform/enumeration/AccountStatus.java | 18 +++++ .../spcex/platform/enumeration/Allowed.java | 18 +++++ .../spcex/platform/enumeration/Service.java | 18 +++++ .../cud/account/BankAccountNewRequest.java | 20 ++--- 9 files changed, 184 insertions(+), 20 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index ddbf3d9d1..aa06e621d 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -24,6 +24,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.platform + platform-enum + ru.spcex.clearing classes 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 new file mode 100644 index 000000000..7cf2db17a --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java @@ -0,0 +1,14 @@ +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/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java new file mode 100644 index 000000000..76dc0ac4b --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.account.errors; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum AccountError implements IEnumId { + AccountAlreadyExist(5010L); + private final Long id; + + AccountError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} 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 3c1ad9ed6..134d2cfc4 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 @@ -7,7 +7,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; 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.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; @@ -15,36 +18,67 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +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 java.time.Instant; +import java.util.Collection; @Service public class BankAccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg bankAccountMap; + private final Imdg accountMap; + private final Imdg relationMap; + private final IMessageResolver messageResolver; @Autowired - public BankAccountService(Consumer kafkaQueue, Producer kafkaProducer, ImdgProvider imdgProvider) { + public BankAccountService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + IMessageResolver messageResolver) { 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; } @Override public void afterPropertiesSet() { callback(BankAccountNewRequest.class) - .setConsumer(this::bankAccountNew) + .setFunction(this::bankAccountNew) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_NEW, callbacks::put); callback(BankAccountUpdateRequest.class) - .setConsumer(this::bankAccountUpdate) + .setFunction(this::bankAccountUpdate) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::bankAccountDelete) + .setFunction(this::bankAccountDelete) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_DELETE, callbacks::put); init(); } - private void bankAccountNew(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountNew(BaseRequest userRequest) { BankAccountNewRequest req = userRequest.getRequestPayload(); + + Collection accountsByKey = + accountMap.getCollectionObjectsBySQL(String.format("account = %s", req.account)); + if (!accountsByKey.isEmpty()) { + String errorMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist)); + log.error("cannot process MoneyMarketSecurityNewRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + log.debug("BankAccountNewRequest received"); BankAccount bankAccount = new BankAccount(); bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); @@ -57,11 +91,31 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); + Account account = new Account(); + account.setAccount(req.account); + account.setAccountType(AccountType.Bank.getKey()); + + String relationSqlCondition = String.format("consumerId = %s and service = %s", req.companyId, + ru.spcex.platform.enumeration.Service.MKR.getKey()); + Relation relationByCompany = relationMap.getSingleObjectBySQL(relationSqlCondition); + if (relationByCompany != null) { + account.setRelationId(relationByCompany.getId()); + account.setCompanyId(relationByCompany.getConsumerId()); + } else { + log.warn("Not found relation by condition: {}", relationSqlCondition); + } + account.setAccountStatus(AccountStatus.ACTIVE.getKey()); + account.setProcessingSign(Allowed.ALLOWED.getKey()); + account.setCreated(Instant.now()); + account.setUpdated(Instant.now()); + + accountMap.insert(account); bankAccountMap.insert(bankAccount); log.debug("successfully processed, new id {}", bankAccount.getId()); + return null; } - private void bankAccountUpdate(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountUpdate(BaseRequest userRequest) { BankAccountUpdateRequest req = userRequest.getRequestPayload(); log.debug("BankAccountUpdateRequest received id = {}", req.getId()); BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); @@ -75,17 +129,29 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); + Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); + account.setAccount(req.account); + account.setUpdated(Instant.now()); + + accountMap.update(account); bankAccountMap.update(bankAccount); log.debug("successfully update, existing bankAccount with id {}", bankAccount.getId()); + return null; } - private void bankAccountDelete(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountDelete(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); + Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); + account.setAccountStatus(AccountStatus.BLOCKED.getKey()); + account.setUpdated(Instant.now()); + + accountMap.update(account); bankAccountMap.delete(bankAccount); log.debug("successfully delete, existing bankAccount with id {}", bankAccount.getId()); + return null; } } diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 6060126ce..ed1a44667 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.spcex.clearing.account.config.ErrorResolverConfig; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.utils.MatcherFactory.Matcher; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -27,6 +28,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.util.Collections; import java.util.HashMap; @@ -35,7 +37,7 @@ import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFields @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { - HazelcastServiceTestConfiguration.class}) + HazelcastServiceTestConfiguration.class, ErrorResolverConfig.class}) public class BankAccountServiceTest { public static final Matcher BANK_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); private static final int PARTITION = 0; @@ -47,6 +49,8 @@ public class BankAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") private HazelcastService hazelcastServiceTest; + @Autowired + private IMessageResolver messageResolver; private MockConsumer mockConsumer; private MockProducer mockProducer; @@ -120,7 +124,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); @@ -221,7 +226,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); @@ -305,7 +311,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java new file mode 100644 index 000000000..d6bc9d22d --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum AccountStatus implements IEnumKey { + ACTIVE("ACTV"), BLOCKED("BLKD"), CLOSE("CLOS"); + + private final String key; + + AccountStatus(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java new file mode 100644 index 000000000..77cc2acac --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Allowed implements IEnumKey { + ALLOWED("ALWD"), DENIED("DEND"); + + private final String key; + + Allowed(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java new file mode 100644 index 000000000..2fd271c0a --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Service implements IEnumKey { + MKR("MKR"); + + private final String key; + + Service(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java index 527ed2ce4..4d7300722 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java @@ -4,23 +4,25 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class BankAccountNewRequest { @JsonProperty - public String bankIdentificationCode;//Банковский идентификационный код (БИК) + public String bankIdentificationCode; @JsonProperty - public String bankName;//Наименование банка + public String bankName; @JsonProperty - public String correspondentAccount;//Корреспондентский счет + public String correspondentAccount; @JsonProperty - public String correspondentAccountName;//Наименование корреспондентского счета + public String correspondentAccountName; @JsonProperty - public String currency;//Идентификатор валюты + public String currency; @JsonProperty - public String destination;//Назначение + public String destination; @JsonProperty - public String taxpayerIdentificationNumber;//Идентификационный номер налогоплательщика (ИНН) + public String taxpayerIdentificationNumber; @JsonProperty - public String taxRegistrationReasonCode;//Код причины постановки (КПП) + public String taxRegistrationReasonCode; @JsonProperty - public String account;//Номер счета + public String account; + @JsonProperty + public Long companyId; public String getBankIdentificationCode() { return bankIdentificationCode;