diff --git a/clearing-parent/clearing-utils/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java b/clearing-parent/clearing-utils/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java index 67b6586c9..8fed6e5ed 100644 --- a/clearing-parent/clearing-utils/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java +++ b/clearing-parent/clearing-utils/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java @@ -48,8 +48,8 @@ public record DictionaryPresentRule(String fiel getter, dictionaryName, dictionaryClass, - errorWrongDictionaryValue, errorEmptyRequiredValue, + errorWrongDictionaryValue, required); } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java index c41e4283d..d1c44aa66 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java @@ -84,6 +84,7 @@ public class ClearingMemberCategoryValidationConfig { EnumPresentRule.instance("clearingMemberCategory", ClearingMemberCategoryUpdateRequest::getClearingMemberCategory, ClearingCategory.values(), + false, CompanyErrors.WrongFieldValue, CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("clearingMemberCategory", @@ -91,7 +92,8 @@ public class ClearingMemberCategoryValidationConfig { IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class, CompanyErrors.RequiredFieldEmpty, - CompanyErrors.WrongFieldValue)); + CompanyErrors.WrongFieldValue, + false)); }; } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java index 00024133f..7dbbc420a 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java @@ -3,10 +3,12 @@ package ru.spcex.clearing.company.config.validation; 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.profile.ProfileDocument; import ru.clearing.platform.dictionary.DocumentTypeDictionary; import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.company.ProfileDocumentNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.ProfileDocumentUpdateRequest; import ru.spcex.clearing.validation.common.rules.*; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.DocumentTypes; @@ -79,4 +81,53 @@ public class ProfileDocumentValidationConfig { ); }; } + + @Bean("profileDocumentUpdateRequestValidation") + public Function profileDocumentUpdateRequestValidator( + Map> imdgForValidation + ) { + return profileDocumentUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(profileDocumentUpdateRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_DocumentTypeDictionary); + addImdg.accept(IMDGDistributedNames.Map_ProfileDocument); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + ProfileDocumentUpdateRequest::getId, + IMDGDistributedNames.Map_ProfileDocument, + ProfileDocument.class, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.RecordNotFound), + IdPresentRule.instance("companyId", + ProfileDocumentUpdateRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.CompanyNotFound, + false, + company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled), + EnumPresentRule.instance("documentType", + ProfileDocumentUpdateRequest::getDocumentType, + DocumentTypes.values(), + false, + CompanyErrors.WrongFieldValue, + CompanyErrors.RequiredFieldEmpty), + DictionaryPresentRule.instance("documentType", + ProfileDocumentUpdateRequest::getDocumentType, + IMDGDistributedNames.Map_DocumentTypeDictionary, + DocumentTypeDictionary.class, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.WrongFieldValue, + false), + EndDtAfterStartDtRule.instance("validFromDate", "validToDate", + ProfileDocumentUpdateRequest::getValidFromDate, + ProfileDocumentUpdateRequest::getValidToDate, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.WrongFieldValue, + false) + ); + }; + } } 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 a5deb9f63..8204af83a 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 @@ -15,11 +15,11 @@ 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.clearing.platform.messaging.domain.cud.company.ProfileDocumentUpdateRequest; 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; @@ -35,6 +35,7 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin private KafkaSender kafkaReqProducer; private final Function profileDocumentNewRequestValidator; + private final Function profileDocumentUpdateRequestValidator; private final ValidationHelper validationHelper; @Autowired @@ -43,11 +44,13 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin KafkaSender kafkaReqProducer, ImdgProvider imdgProvider, @Qualifier("profileDocumentNewRequestValidation") Function profileDocumentNewRequestValidator, + @Qualifier("profileDocumentUpdateRequestValidation") Function profileDocumentUpdateRequestValidator, ValidationHelper validationHelper) { super(kafkaQueue, kafkaProducer); this.imdgProvider = imdgProvider; this.kafkaReqProducer = kafkaReqProducer; this.profileDocumentNewRequestValidator = profileDocumentNewRequestValidator; + this.profileDocumentUpdateRequestValidator = profileDocumentUpdateRequestValidator; this.validationHelper = validationHelper; } @@ -59,6 +62,9 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin callback(ProfileDocumentNewRequest.class) .setConsumer(this::profileDocumentNew) .forDestination(Consts.DESTINATION_PROFILE_DOCUMENT_NEW, callbacks::put); + callback(ProfileDocumentUpdateRequest.class) + .setConsumer(this::profileDocumentUpdate) + .forDestination(Consts.DESTINATION_PROFILE_DOCUMENT_UPDATE, callbacks::put); init(); } @@ -88,9 +94,71 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin profileDocument.setLink(profileDocumentNewRequest.getLink()); profileDocumentMap.insert(profileDocument); - if (profileDocument.getDocumentType().equalsIgnoreCase(DocumentTypes.xcnt.getKey())) { -// kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); - } +// if (profileDocument.getDocumentType().equalsIgnoreCase(DocumentTypes.xcnt.getKey())) { + // todo create request for update and check request for new account (something wrong) +// kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_UPDATE, ) +// } + + return null; + } + + @NonNull + private RequestInfoUpdate profileDocumentUpdate(BaseRequest profileDocumentUpdateRequestBaseRequest) { + log.trace("Start processing ProfileDocumentUpdateRequest!"); + + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError( + profileDocumentUpdateRequestBaseRequest, + profileDocumentUpdateRequestValidator + ); + if (requestInfoUpdate != null) return requestInfoUpdate; + + ProfileDocumentUpdateRequest profileDocumentUpdateRequest = profileDocumentUpdateRequestBaseRequest.getRequestPayload(); + ProfileDocument profileDocument = profileDocumentMap.getSingleObjectByID(profileDocumentUpdateRequest.getId()); + + if (profileDocumentUpdateRequest.getCompanyId() != null) + profileDocument.setCompanyId(profileDocumentUpdateRequest.getCompanyId()); + + if (profileDocumentUpdateRequest.getDocumentType() != null) + profileDocument.setDocumentType(profileDocumentUpdateRequest.getDocumentType()); + + if (profileDocumentUpdateRequest.getIssueDate() != null) + profileDocument.setIssueDate(profileDocumentUpdateRequest.getIssueDate()); + + if (profileDocumentUpdateRequest.getIssuePlace() != null) + profileDocument.setIssuePlace(profileDocumentUpdateRequest.getIssuePlace()); + + if (profileDocumentUpdateRequest.getIssuer() != null) + profileDocument.setIssuer(profileDocumentUpdateRequest.getIssuer()); + + if (profileDocumentUpdateRequest.getIssuerCode() != null) + profileDocument.setIssuerCode(profileDocumentUpdateRequest.getIssuerCode()); + + if (profileDocumentUpdateRequest.getName() != null) + profileDocument.setName(profileDocumentUpdateRequest.getName()); + + if (profileDocumentUpdateRequest.getNumber() != null) + profileDocument.setNumber(profileDocumentUpdateRequest.getNumber()); + + if (profileDocumentUpdateRequest.getPlace() != null) + profileDocument.setPlace(profileDocumentUpdateRequest.getPlace()); + + if (profileDocumentUpdateRequest.getValidFromDate() != null) + profileDocument.setValidFromDate(profileDocumentUpdateRequest.getValidFromDate()); + + if (profileDocumentUpdateRequest.getValidToDate() != null) + profileDocument.setValidToDate(profileDocumentUpdateRequest.getValidToDate()); + + if (profileDocumentUpdateRequest.getLink() != null) + profileDocument.setLink(profileDocumentUpdateRequest.getLink()); + + profileDocumentMap.insert(profileDocument); + + log.trace("successfully processed, id {}", profileDocument.getId()); + +// if (profileDocument.getDocumentType().equalsIgnoreCase(DocumentTypes.xcnt.getKey())) { + // todo if update profileDocument with documentType == XCNT... need send? +// kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_UPDATE, ) +// } 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 89d058cef..c2ed53986 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 @@ -25,6 +25,7 @@ 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.clearing.platform.messaging.domain.cud.company.ProfileDocumentUpdateRequest; import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -51,6 +52,8 @@ class ProfileDocumentServiceTest { public static final MatcherFactory.Matcher PROFILE_DOCUMENT_MATCHER = usingIgnoringFieldsComparator(); private static final int PARTITION = 0; private static final String TOPIC_DESTINATION_PROFILE_DOCUMENT_NEW = Consts.DESTINATION_PROFILE_DOCUMENT_NEW; + private static final String TOPIC_DESTINATION_PROFILE_DOCUMENT_UPDATE = Consts.DESTINATION_PROFILE_DOCUMENT_UPDATE; + private static final Long ID = currentID.getAndIncrement(); @Autowired ProfileDocumentService profileDocumentService; @@ -71,6 +74,11 @@ class ProfileDocumentServiceTest { private DocumentTypes TEST_DOCUMENT_TYPE = DocumentTypes.cio; private String TEST_DOCUMENT_TYPE_ID = TEST_DOCUMENT_TYPE.getKey(); + private DocumentTypes NEW_TEST_DOCUMENT_TYPE = DocumentTypes.edoc; + private String NEW_TEST_DOCUMENT_TYPE_ID = NEW_TEST_DOCUMENT_TYPE.getKey(); + + private final long PROFILE_DOCUMENT_ID = ID; + @PostConstruct private void init() { hazelcastServiceTest.waitAvailable(); @@ -82,15 +90,22 @@ class ProfileDocumentServiceTest { 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 ); + + DocumentTypeDictionary documentTypeDictionary = new DocumentTypeDictionary(); + documentTypeDictionary.setCode(TEST_DOCUMENT_TYPE.getKey()); + documentTypeDictionary.setName("test_name"); documentTypeDictionaryImdg.insert(documentTypeDictionary); + DocumentTypeDictionary documentTypeDictionary1 = new DocumentTypeDictionary(); + documentTypeDictionary1.setCode(NEW_TEST_DOCUMENT_TYPE.getKey()); + documentTypeDictionary1.setName("new_test_name"); + documentTypeDictionaryImdg.insert(documentTypeDictionary1); + + } /** @@ -116,6 +131,7 @@ class ProfileDocumentServiceTest { profileDocumentNewRequest.setLink("link"); ProfileDocument predictableProfileDocument = new ProfileDocument(); + predictableProfileDocument.setId(PROFILE_DOCUMENT_ID); predictableProfileDocument.setCompanyId(profileDocumentNewRequest.getCompanyId()); predictableProfileDocument.setDocumentType(profileDocumentNewRequest.getDocumentType()); predictableProfileDocument.setIssueDate(profileDocumentNewRequest.getIssueDate()); @@ -140,4 +156,65 @@ class ProfileDocumentServiceTest { predictableProfileDocument.setId(resultNew.getId()); PROFILE_DOCUMENT_MATCHER.assertMatch(resultNew, predictableProfileDocument); } + + @Test + void updateProfileDocument() { + //ARRANGE + ProfileDocument existsProfileDocument = new ProfileDocument(); + existsProfileDocument.setId(ID); + existsProfileDocument.setCompanyId(COMPANY_ID); + existsProfileDocument.setDocumentType(TEST_DOCUMENT_TYPE_ID); + existsProfileDocument.setIssueDate(LocalDate.now()); + existsProfileDocument.setIssuePlace("place"); + existsProfileDocument.setIssuer("issuer"); + existsProfileDocument.setIssuerCode("issuerCode"); + existsProfileDocument.setName("name"); + existsProfileDocument.setNumber("number"); + existsProfileDocument.setPlace("place"); + existsProfileDocument.setValidFromDate(LocalDate.now()); + existsProfileDocument.setValidToDate(LocalDate.now().plus(1, ChronoUnit.DAYS)); + existsProfileDocument.setLink("link"); + profileDocumentMap.insert(existsProfileDocument); + + ProfileDocument predictableProfileDocument = new ProfileDocument(); + predictableProfileDocument.setId(PROFILE_DOCUMENT_ID); + predictableProfileDocument.setCompanyId(COMPANY_ID); + predictableProfileDocument.setDocumentType(NEW_TEST_DOCUMENT_TYPE_ID); + predictableProfileDocument.setIssueDate(LocalDate.now()); + predictableProfileDocument.setIssuePlace("new_place"); + predictableProfileDocument.setIssuer("new_issuer"); + predictableProfileDocument.setIssuerCode("new_issuerCode"); + predictableProfileDocument.setName("new_name"); + predictableProfileDocument.setNumber("new_number"); + predictableProfileDocument.setPlace("new_place"); + predictableProfileDocument.setValidFromDate(LocalDate.now()); + predictableProfileDocument.setValidToDate(LocalDate.now().plus(1, ChronoUnit.DAYS)); + predictableProfileDocument.setLink("new_link"); + + ProfileDocumentUpdateRequest profileDocumentUpdateRequest = new ProfileDocumentUpdateRequest(); + profileDocumentUpdateRequest.setId(PROFILE_DOCUMENT_ID); + profileDocumentUpdateRequest.setCompanyId(COMPANY_ID); + profileDocumentUpdateRequest.setDocumentType(NEW_TEST_DOCUMENT_TYPE_ID); + profileDocumentUpdateRequest.setIssueDate(LocalDate.now()); + profileDocumentUpdateRequest.setIssuePlace("new_place"); + profileDocumentUpdateRequest.setIssuer("new_issuer"); + profileDocumentUpdateRequest.setIssuerCode("new_issuerCode"); + profileDocumentUpdateRequest.setName("new_name"); + profileDocumentUpdateRequest.setNumber("new_number"); + profileDocumentUpdateRequest.setPlace("new_place"); + profileDocumentUpdateRequest.setValidFromDate(LocalDate.now()); + profileDocumentUpdateRequest.setValidToDate(LocalDate.now().plus(1, ChronoUnit.DAYS)); + profileDocumentUpdateRequest.setLink("new_link"); + + //ACT + String jsonString = getJsonStringForUPDATE(profileDocumentUpdateRequest, ID); + + addRecordToKafka((MockConsumer) profileDocumentService.getConsumer(), TOPIC_DESTINATION_PROFILE_DOCUMENT_UPDATE, PARTITION, 0, jsonString); + + //ASSERT + waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord); + ProfileDocument resultUpdate = profileDocumentMap.getSingleObjectBySQL(String.format("companyId = %d", COMPANY_ID)); +// predictableProfileDocument.setId(resultUpdate.getId()); + PROFILE_DOCUMENT_MATCHER.assertMatch(resultUpdate, predictableProfileDocument); + } } \ No newline at end of file