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..cd8817ca8 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,33 @@ 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);
+
+ bankAccount.setAccountId(account.getId());
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 +131,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/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java
index f5429d6c9..a6e7bb993 100644
--- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java
+++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java
@@ -81,7 +81,7 @@ public class LauncherController extends AbstractQueueController {
}
launcherCommand.setTask(dictionaryName);
launcherCommand.setUserId(user.getId());
- //пока здесь
+ // пока здесь, это требуется для сохранения истории
saveLauncher(dictionaryName, user.getId());
//топики ограничиваются наличием в taskDictionary
//подписываются на разные топики в разных модулях, см. ru.spcex.platform.enumeration.Task#topic
diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java
index 76b301904..ce810d0e8 100644
--- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java
+++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java
@@ -6,14 +6,16 @@ import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
+import ru.spcex.platform.enumeration.Task;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-public class LauncherNew implements IAction {
+public class LauncherNew implements IAction