diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ValidationConfig.java index 617eceff3..9ce392c5d 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ValidationConfig.java @@ -4,7 +4,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; +import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.clearing.platform.dictionary.ClearingCategoryDictionary; +import ru.clearing.platform.dictionary.DocumentTypeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -27,6 +29,8 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); addImdg.accept(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class); + addImdg.accept(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + addImdg.accept(IMDGDistributedNames.Map_DocumentTypeDictionary, DocumentTypeDictionary.class); return imdg; } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java index 28990c9f5..a5deb9f63 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java @@ -6,7 +6,9 @@ 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.lang.NonNull; +import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -14,10 +16,17 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.company.ProfileDocumentNewRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.validation.IValidator; +import java.util.function.Function; + +@Service public class ProfileDocumentService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private Imdg profileDocumentMap; @@ -25,14 +34,21 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin private ImdgProvider imdgProvider; private KafkaSender kafkaReqProducer; + private final Function profileDocumentNewRequestValidator; + private final ValidationHelper validationHelper; + @Autowired public ProfileDocumentService(Consumer kafkaQueue, Producer kafkaProducer, KafkaSender kafkaReqProducer, - ImdgProvider imdgProvider) { + ImdgProvider imdgProvider, + @Qualifier("profileDocumentNewRequestValidation") Function profileDocumentNewRequestValidator, + ValidationHelper validationHelper) { super(kafkaQueue, kafkaProducer); this.imdgProvider = imdgProvider; this.kafkaReqProducer = kafkaReqProducer; + this.profileDocumentNewRequestValidator = profileDocumentNewRequestValidator; + this.validationHelper = validationHelper; } @Override @@ -41,20 +57,22 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); callback(ProfileDocumentNewRequest.class) - .setConsumer(this::newProfileDocument) + .setConsumer(this::profileDocumentNew) .forDestination(Consts.DESTINATION_PROFILE_DOCUMENT_NEW, callbacks::put); init(); } @NonNull - private void newProfileDocument(BaseRequest profileDocumentNewRequestBaseRequest) { + private RequestInfoUpdate profileDocumentNew(BaseRequest profileDocumentNewRequestBaseRequest) { log.trace("Start processing ProfileDocumentNewRequest!"); + + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError( + profileDocumentNewRequestBaseRequest, + profileDocumentNewRequestValidator + ); + if (requestInfoUpdate != null) return requestInfoUpdate; + ProfileDocumentNewRequest profileDocumentNewRequest = profileDocumentNewRequestBaseRequest.getRequestPayload(); - Long companyId = profileDocumentNewRequest.getCompanyId(); - Company company = companyMap.getSingleObjectByID(companyId); - if (company != null && !company.getWorkflowStatus().equalsIgnoreCase("ACTV")) { - throw new IllegalStateException("Wrong company with ID " + companyId + " and workflow status " + company.getWorkflowStatus()); - } ProfileDocument profileDocument = new ProfileDocument(); profileDocument.setCompanyId(profileDocumentNewRequest.getCompanyId()); profileDocument.setDocumentType(profileDocumentNewRequest.getDocumentType()); @@ -69,9 +87,11 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin profileDocument.setValidToDate(profileDocumentNewRequest.getValidToDate()); profileDocument.setLink(profileDocumentNewRequest.getLink()); profileDocumentMap.insert(profileDocument); - if (profileDocument.getDocumentType().equalsIgnoreCase("XCNT")) { - //kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); + if (profileDocument.getDocumentType().equalsIgnoreCase(DocumentTypes.xcnt.getKey())) { +// kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); } + + return null; } } diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ProfileDocumentServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ProfileDocumentServiceTest.java index 491212001..89d058cef 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ProfileDocumentServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/ProfileDocumentServiceTest.java @@ -14,18 +14,25 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.clearing.platform.dictionary.DocumentTypeDictionary; +import ru.spcex.clearing.company.config.BeanConfiguration; import ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.company.config.KafkaConfigTest; +import ru.spcex.clearing.company.config.validation.ProfileDocumentValidationConfig; +import ru.spcex.clearing.company.config.validation.ValidationConfig; import ru.spcex.clearing.company.utils.MatcherFactory; 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.company.ProfileDocumentNewRequest; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import javax.annotation.PostConstruct; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import static ru.spcex.clearing.company.config.HazelcastServiceTestConfiguration.currentID; import static ru.spcex.clearing.company.utils.MatcherFactory.usingIgnoringFieldsComparator; @@ -33,8 +40,11 @@ import static ru.spcex.clearing.company.utils.TestUtils.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { + BeanConfiguration.class, + ValidationConfig.class, ProfileDocumentService.class, KafkaConfigTest.class, + ProfileDocumentValidationConfig.class, HazelcastServiceTestConfiguration.class}) class ProfileDocumentServiceTest { @@ -55,11 +65,32 @@ class ProfileDocumentServiceTest { @SpyBean private MockProducer mockProducer; + private final long COMPANY_ID = 777L; + private Company TEST_COMPANY; + + private DocumentTypes TEST_DOCUMENT_TYPE = DocumentTypes.cio; + private String TEST_DOCUMENT_TYPE_ID = TEST_DOCUMENT_TYPE.getKey(); + @PostConstruct private void init() { hazelcastServiceTest.waitAvailable(); this.profileDocumentMap = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); this.companyMap = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class); + + TEST_COMPANY = new Company(); + TEST_COMPANY.setId(COMPANY_ID); + TEST_COMPANY.setWorkflowStatus(WorkflowStatus.Active.getKey()); + companyMap.insert(TEST_COMPANY); + + DocumentTypeDictionary documentTypeDictionary = new DocumentTypeDictionary(); + documentTypeDictionary.setCode(TEST_DOCUMENT_TYPE.getKey()); + documentTypeDictionary.setName("test_name"); + Imdg documentTypeDictionaryImdg = hazelcastServiceTest.getImdg( + IMDGDistributedNames.Map_DocumentTypeDictionary, + DocumentTypeDictionary.class + ); + documentTypeDictionaryImdg.insert(documentTypeDictionary); + } /** @@ -70,10 +101,9 @@ class ProfileDocumentServiceTest { @Test void newProfileDocument() { //ARRANGE - Long companyId = 1234L; ProfileDocumentNewRequest profileDocumentNewRequest = new ProfileDocumentNewRequest(); - profileDocumentNewRequest.setCompanyId(companyId); - profileDocumentNewRequest.setDocumentType("doc"); + profileDocumentNewRequest.setCompanyId(COMPANY_ID); + profileDocumentNewRequest.setDocumentType(TEST_DOCUMENT_TYPE_ID); profileDocumentNewRequest.setIssueDate(LocalDate.now()); profileDocumentNewRequest.setIssuePlace("place"); profileDocumentNewRequest.setIssuer("issuer"); @@ -82,7 +112,7 @@ class ProfileDocumentServiceTest { profileDocumentNewRequest.setNumber("number"); profileDocumentNewRequest.setPlace("place"); profileDocumentNewRequest.setValidFromDate(LocalDate.now()); - profileDocumentNewRequest.setValidToDate(LocalDate.now()); + profileDocumentNewRequest.setValidToDate(LocalDate.now().plus(1, ChronoUnit.DAYS)); profileDocumentNewRequest.setLink("link"); ProfileDocument predictableProfileDocument = new ProfileDocument(); @@ -106,7 +136,7 @@ class ProfileDocumentServiceTest { //ASSERT waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord); - ProfileDocument resultNew = profileDocumentMap.getSingleObjectBySQL(String.format("companyId = %d", companyId)); + ProfileDocument resultNew = profileDocumentMap.getSingleObjectBySQL(String.format("companyId = %d", COMPANY_ID)); predictableProfileDocument.setId(resultNew.getId()); PROFILE_DOCUMENT_MATCHER.assertMatch(resultNew, predictableProfileDocument); }