diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java index f92635d78..a69e7731c 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ContactValidationConfig.java @@ -73,7 +73,7 @@ public class ContactValidationConfig { IMDGDistributedNames.Map_Contact, Contact.class, CompanyErrors.RequiredFieldEmpty, - CompanyErrors.CompanyNotFound, + CompanyErrors.ContactNotFound, contact -> { if (contactUpdateRequest.getContactType() == null) return null; if (!contactUpdateRequest.getContactType().equalsIgnoreCase(contact.getContactType())) { 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 9fe82a927..5449f8f9e 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 @@ -44,7 +44,7 @@ public class ProfileDocumentValidationConfig { Company.class, CompanyErrors.RequiredFieldEmpty, CompanyErrors.CompanyNotFound, - company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled), + company -> WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled), DictionaryPresentRule.instance("documentType", ProfileDocumentNewRequest::getDocumentType, IMDGDistributedNames.Map_DocumentTypeDictionary, @@ -138,7 +138,15 @@ public class ProfileDocumentValidationConfig { IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class, CompanyErrors.RequiredFieldEmpty, - CompanyErrors.RecordNotFound) + CompanyErrors.RecordNotFound, + profileDoc -> { + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByID(profileDoc.getCompanyId()); + if (company == null) { + return CompanyErrors.CompanyNotFound; + } + return null; + }) ); }; } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java index 7dd8ba584..0beb21c0a 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java @@ -22,14 +22,18 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.ImdgTransaction; +import ru.spcex.platform.utils.error.ValidationException; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; +import java.util.Objects; import java.util.function.Function; @Service public class CompanyInfoService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgProvider imdgProvider; private final Imdg companyMap; protected final CompanyService companyService; private final RequestHelper requestHelper; @@ -46,6 +50,7 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea Function companyInfoUpdateRequestValidator) { super(kafkaQueue, kafkaProducer); this.companyService = companyService; + this.imdgProvider = imdgProvider; this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.validationHelper = validationHelper; this.userRoleVerification = userRoleVerification; @@ -56,16 +61,16 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea @Override public void afterPropertiesSet() { callback(CompanyInfoUpdateRequest.class) - .setFunction(this::companyInfoUpdate) + .setFunction(request -> requestHelper.requestFunction(this::companyInfoUpdate, request)) .forDestination(Consts.DESTINATION_COMPANY_INFO_UPDATE, callbacks::put); callback(CompanyInfoUpdateRequest.class) - .setFunction(this::companyInfoUpdate) + .setFunction(request -> requestHelper.requestFunction(this::companyInfoUpdate, request)) .forDestination(Consts.DESTINATION_COMPANY_INFO_NEW, callbacks::put); // логика заполнения одинакова с companyInfoUpdate init(); } - public RequestInfoUpdate companyInfoUpdate(BaseRequest companyInfoReq) { + public RequestInfoUpdate companyInfoUpdate(BaseRequest companyInfoReq) throws ValidationException { CompanyInfoUpdateRequest req = companyInfoReq.getRequestPayload(); log.debug("{} received", req.getClass().getSimpleName()); { // Валидация, ValidationException @@ -81,6 +86,7 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea log.trace("Company {} not found", req.getId()); return requestHelper.makeErrorResponse(companyInfoReq, CompanyErrors.CompanyNotFound, companyInfoReq.getId()); } + company.setUpdated(Instant.now()); CompanyInfo companyInfo = company.getProfile(); companyInfo.setCorporationSoleType(req.getCorporationSoleType()); @@ -93,8 +99,39 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea companyInfo.setShortNameEng(req.getShortNameEng()); companyInfo.setFullNameEng(req.getFullNameEng()); - company.setUpdated(Instant.now()); - companyMap.update(company); + company.setShortName(req.getShortName()); + company.setFullName(req.getFullName()); + boolean simpleUpdate = true; + if (req.getWorkflowStatus() != null) { + String prevStatus = company.getWorkflowStatus(); + company.setWorkflowStatus(req.getWorkflowStatus()); + if (!Objects.equals(prevStatus, company.getWorkflowStatus())) { + simpleUpdate = false; + ImdgTransaction transaction = imdgProvider.newTransaction(); + transaction.beginTransaction(); + boolean txOk = false; + try { + companyService.relationHelper.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus()); + Imdg txCompanyMap = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class); + txCompanyMap.update(company); + log.trace("Company {} updated", company.getId()); + txOk = true; + } finally { + if (txOk) + transaction.commitTransaction(); + else + transaction.rollbackTransaction(); + } + } else { + log.trace("Status was not changed"); + } + } else { + log.trace("Null new WorkflowStatus"); + } + if (simpleUpdate) { + companyMap.update(company); + log.trace("Company {} updated", company.getId()); + } log.debug("successfully CompanyInfo processed, id {}", companyInfo.getId()); } return null; 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 411cfd669..adf51b4ed 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 @@ -174,8 +174,10 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin ProfileDocument profileDocument = profileDocumentMap.getSingleObjectByID(profileDocumentUpdateRequest.getId()); String prevDocType = profileDocument.getDocumentType(); - if (profileDocumentUpdateRequest.getCompanyId() != null) - profileDocument.setCompanyId(profileDocumentUpdateRequest.getCompanyId()); + if (profileDocumentUpdateRequest.getCompanyId() != null && !profileDocumentUpdateRequest.getCompanyId().equals(profileDocument.getCompanyId())) { + log.warn("profileDocumentUpdateRequest[{}] CompanyId {} not match", profileDocumentUpdateRequest.getId(), profileDocumentUpdateRequest.getCompanyId()); + return requestHelper.makeErrorResponse(profileDocumentUpdateRequestBaseRequest, CompanyErrors.WrongFieldValue, "companyId"); + } if (profileDocumentUpdateRequest.getDocumentType() != null) profileDocument.setDocumentType(profileDocumentUpdateRequest.getDocumentType()); diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java index e247fb26a..98383d456 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java @@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.mock.mockito.SpyBean; 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.company.CompanySymbols; import ru.clearing.platform.dictionary.CompanySymbolDictionary; import ru.spcex.clearing.company.config.BeanConfiguration; @@ -92,6 +93,14 @@ class CompanySymbolServiceTest { cioSymbol.setName(CompanySymbol.CIO.getKey()); companySymbolDictionaryImdg.insert(cioSymbol); } + Imdg companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class); + { + Company company = new Company(); + company.setId(ID); + company.setShortName("TST"); + company.setWorkflowStatus("ACTV"); + companyImdg.insert(company); + } TestUtils.FutureRecordMetadata future = spy(TestUtils.FutureRecordMetadata.class);