updateProfileDocument

This commit is contained in:
akulikov 2023-04-04 15:56:24 +03:00
parent 30485d7104
commit adf57e7b00
5 changed files with 207 additions and 9 deletions

View file

@ -48,8 +48,8 @@ public record DictionaryPresentRule<R, D extends AbstractDictionary>(String fiel
getter,
dictionaryName,
dictionaryClass,
errorWrongDictionaryValue,
errorEmptyRequiredValue,
errorWrongDictionaryValue,
required);
}

View file

@ -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));
};
}

View file

@ -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<ProfileDocumentUpdateRequest, IValidator> profileDocumentUpdateRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return profileDocumentUpdateRequest -> {
ImdgValidationContext<ProfileDocumentUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(profileDocumentUpdateRequest);
Consumer<String> 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)
);
};
}
}

View file

@ -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<ProfileDocumentNewRequest, IValidator> profileDocumentNewRequestValidator;
private final Function<ProfileDocumentUpdateRequest, IValidator> profileDocumentUpdateRequestValidator;
private final ValidationHelper validationHelper;
@Autowired
@ -43,11 +44,13 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin
KafkaSender kafkaReqProducer,
ImdgProvider imdgProvider,
@Qualifier("profileDocumentNewRequestValidation") Function<ProfileDocumentNewRequest, IValidator> profileDocumentNewRequestValidator,
@Qualifier("profileDocumentUpdateRequestValidation") Function<ProfileDocumentUpdateRequest, IValidator> 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<ProfileDocumentUpdateRequest> 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;
}

View file

@ -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<ProfileDocument> 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<DocumentTypeDictionary> 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);
}
}