diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml
index 4c4ff1026..cfc872733 100644
--- a/clearing-parent/reports-service/pom.xml
+++ b/clearing-parent/reports-service/pom.xml
@@ -93,6 +93,14 @@
mockito-core
test
+
+ ru.spcex.clearing
+ security-util
+
+
+ ru.spcex.clearing
+ clearing-validation
+
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java
new file mode 100644
index 000000000..da06a010e
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java
@@ -0,0 +1,27 @@
+package ru.spcex.clearing.reports.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.reports.errors.ReportError;
+import ru.spcex.clearing.util.security.UserRoleVerification;
+import ru.spcex.clearing.util.services.IMDGMessageResolver;
+import ru.spcex.platform.enumeration.UserRole;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+
+@Configuration
+public class BeanConfiguration {
+ @Bean
+ public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
+ return new IMDGMessageResolver(imdgProvider);
+ }
+
+ @Bean
+ @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) {
+ return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, ReportError.UserVerifyDenial);
+ }
+
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java
new file mode 100644
index 000000000..26513b3e3
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java
@@ -0,0 +1,103 @@
+package ru.spcex.clearing.reports.config.validation;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.clearing.classes.statics.data.company.Company;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromExecution;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromRegistry;
+import ru.spcex.clearing.reports.errors.ReportError;
+import ru.spcex.clearing.validation.common.ValidationHelper;
+import ru.spcex.clearing.validation.common.rules.EnumPresentRule;
+import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+import ru.spcex.platform.enumeration.ReportType;
+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.enumeration.IMessageResolver;
+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 {
+
+ @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);
+
+ return imdg;
+ }
+
+ @Bean("validationHelper")
+ public ValidationHelper validationHelper(IMessageResolver messageResolver) {
+ return new ValidationHelper(messageResolver);
+ }
+
+ @Bean("reportRequestFromExecutionValidator")
+ public Function reportRequestFromExecutionValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequestFromExecution -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequestFromExecution);
+
+ Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
+ // todo add dictionary for check reportId
+
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequestFromExecution::getReportId,
+ new ReportType[]{
+ ReportType.OPERATIONAL_LIABILITIES_CLAIMS,
+ ReportType.SUMMARY_LIABILITIES_CLAIMS,
+ ReportType.PERIOD_LIABILITIES_CLAIMS,
+ ReportType.EXECUTED_DEAL_REPORT,
+ ReportType.UNFULFILLED_DEAL_REPORT
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty),
+ FieldRequiredRule.instance("sessionId",
+ ReportRequestFromExecution::getSessionId,
+ ReportError.RequiredFieldEmpty)
+ );
+ };
+ }
+
+ @Bean("reportRequestFromRegistryValidator")
+ public Function reportRequestFromRegistryValidator(
+ Map> imdgForValidation
+ ) {
+ return reportRequestFromRegistry -> {
+ ImdgValidationContext context = new ImdgValidationContext<>();
+ context.setValidatedObject(reportRequestFromRegistry);
+
+ Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
+ // todo add dictionary for check reportId
+
+ return new ValidatorImpl<>(context,
+ EnumPresentRule.instance("reportId",
+ ReportRequestFromRegistry::getReportId,
+ new ReportType[]{
+ ReportType.OPERATIONAL_MONEY_CHANGE,
+ ReportType.SUMMARY_L_MONEY_CHANGE,
+ ReportType.PERIOD_MONEY_CHANGE
+ },
+ ReportError.WrongFieldValue,
+ ReportError.RequiredFieldEmpty)
+ );
+ };
+ }
+
+}
+
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java
new file mode 100644
index 000000000..55c3dfdbd
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java
@@ -0,0 +1,23 @@
+package ru.spcex.clearing.reports.errors;
+
+import ru.spcex.platform.utils.enumeration.IErrorEnumId;
+
+// todo codes
+public enum ReportError implements IErrorEnumId {
+ InternalError(99000L),
+ UserVerifyDenial(99001L),
+ RequiredFieldEmpty(99002L),
+ WrongFieldValue(99004L),
+ ;
+
+ private final Long id;
+
+ ReportError(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+}
diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java
new file mode 100644
index 000000000..4665d9d52
--- /dev/null
+++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java
@@ -0,0 +1,81 @@
+package ru.spcex.clearing.reports.services;
+
+import org.apache.kafka.clients.consumer.Consumer;
+import org.apache.kafka.clients.producer.Producer;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
+import ru.spcex.clearing.platform.messaging.domain.Consts;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromExecution;
+import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromRegistry;
+import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
+import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
+import ru.spcex.clearing.util.security.UserRoleVerification;
+import ru.spcex.clearing.validation.common.ValidationHelper;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+import ru.spcex.platform.utils.validation.IValidator;
+
+import java.util.function.Function;
+
+@Service
+public class ReportService extends QueueConsumer implements InitializingBean {
+ private final ImdgProvider imdgProvider;
+ private final IMessageResolver messageResolver;
+ private final UserRoleVerification userRoleVerification;
+ private final ValidationHelper validationHelper;
+ private final Function reportRequestFromExecutionValidator;
+ private final Function reportRequestFromRegistryValidator;
+
+ public ReportService(Consumer kafkaQueue,
+ Producer kafkaResponseQueue,
+ ImdgProvider imdgProvider,
+ IMessageResolver messageResolver,
+ UserRoleVerification userRoleVerification,
+ ValidationHelper validationHelper,
+ @Qualifier("reportRequestFromExecutionValidator")
+ Function reportRequestFromExecutionValidator,
+ @Qualifier("reportRequestFromRegistryValidator")
+ Function reportRequestFromRegistryValidator) {
+ super(kafkaQueue, kafkaResponseQueue);
+ this.imdgProvider = imdgProvider;
+ this.messageResolver = messageResolver;
+ this.userRoleVerification = userRoleVerification;
+ this.validationHelper = validationHelper;
+ this.reportRequestFromExecutionValidator = reportRequestFromExecutionValidator;
+ this.reportRequestFromRegistryValidator = reportRequestFromRegistryValidator;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ callback(ReportRequestFromRegistry.class)
+ .setConsumer(this::createReportFromRegistry)
+ .forDestination(Consts.DESTINATION_CREATE_REPORT_FROM_REGISTRY, callbacks::put);
+ callback(ReportRequestFromExecution.class)
+ .setConsumer(this::createReportFromExecution)
+ .forDestination(Consts.DESTINATION_CREATE_REPORT_FROM_EXECUTION, callbacks::put);
+ }
+
+ public RequestInfoUpdate createReportFromRegistry(BaseRequest userRequest) {
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestFromRegistryValidator);
+ if (requestInfoUpdate != null) return null;
+
+ return null;
+ }
+
+ public RequestInfoUpdate createReportFromExecution(BaseRequest userRequest) {
+ RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
+ if (requestInfoUpdate != null) return null;
+
+ requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestFromExecutionValidator);
+ if (requestInfoUpdate != null) return null;
+
+ return null;
+ }
+
+
+}
diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java
new file mode 100644
index 000000000..d35875401
--- /dev/null
+++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java
@@ -0,0 +1,30 @@
+package ru.spcex.platform.enumeration;
+
+import ru.spcex.platform.utils.enumeration.IEnumKey;
+
+/**
+ * Идентификатор отчета
+ * todo сделать для них dictionary
+ */
+public enum ReportType implements IEnumKey {
+ OPERATIONAL_LIABILITIES_CLAIMS("operational_liabilities_claims"),
+ OPERATIONAL_MONEY_CHANGE("operational_money_change"),
+ SUMMARY_LIABILITIES_CLAIMS("summary_liabilities_claims"),
+ SUMMARY_L_MONEY_CHANGE("summary_lmoney_change"), // todo check typo
+ PERIOD_LIABILITIES_CLAIMS("period_liabilities_claims"),
+ PERIOD_MONEY_CHANGE("period_money_change"),
+ EXECUTED_DEAL_REPORT("executed_deal_report"),
+ UNFULFILLED_DEAL_REPORT("unfulfilled_deal_report"),
+ ;
+
+ private final String key;
+
+ ReportType(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/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
index c00ea09a8..c6ef5edef 100644
--- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
+++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
@@ -69,6 +69,9 @@ public interface Consts {
String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update";
String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new";
+ String DESTINATION_CREATE_REPORT_FROM_REGISTRY = "destination-create-report-from-registry";
+ String DESTINATION_CREATE_REPORT_FROM_EXECUTION = "destination-create-report-from-execution";
+
@Deprecated
String ACCOUNT_NEW_SDF01 = "account-new-sdf01";
diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java
index 17952def1..4b1da114d 100644
--- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java
+++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java
@@ -1,6 +1,7 @@
package ru.spcex.clearing.platform.messaging.domain.cud.reports;
import com.fasterxml.jackson.annotation.JsonProperty;
+import ru.spcex.platform.enumeration.ReportType;
/**
* Запрос отчёта (без параметров) report-service
@@ -8,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
public class ReportRequest {
/**
* Идентификатор отчёта
- * см. {@link ru.spcex.clearing.reports.reports.ReportsEnum}
+ * см. {@link ReportType}
*/
@JsonProperty
protected String reportId;
diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java
new file mode 100644
index 000000000..0ed78564b
--- /dev/null
+++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java
@@ -0,0 +1,22 @@
+package ru.spcex.clearing.platform.messaging.domain.cud.reports;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Запрос на построение отчета на основе ExecutionDeposit/Fond
+ */
+public class ReportRequestFromExecution extends ReportRequest {
+ /**
+ * Идентификатор сессии
+ */
+ @JsonProperty
+ protected Long sessionId;
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+}
diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java
new file mode 100644
index 000000000..f35d0a717
--- /dev/null
+++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java
@@ -0,0 +1,7 @@
+package ru.spcex.clearing.platform.messaging.domain.cud.reports;
+
+/**
+ * Запрос на построение отчета на основе Registry
+ */
+public class ReportRequestFromRegistry extends ReportRequest {
+}