From 5137ea40e116f91e9196fb8c7709c256254884aa Mon Sep 17 00:00:00 2001 From: gianmarcoplutino Date: Thu, 25 Jan 2024 11:48:16 +0100 Subject: [PATCH] feat: added new AdditionalInformations Object --- .../AdditionalInformationsRequest.java | 16 +++ .../request/OnboardingDefaultRequest.java | 3 +- .../AdditionalInformationsResponse.java | 16 +++ .../controller/response/OnboardingGet.java | 2 + .../entity/AdditionalInformations.java | 16 +++ .../onboarding/entity/Onboarding.java | 2 + .../service/OnboardingServiceDefault.java | 9 +- .../service/util/OnboardingUtils.java | 33 +++++ .../service/util/OnboardingUtilsTest.java | 129 ++++++++++++++++++ 9 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/AdditionalInformationsRequest.java create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/AdditionalInformationsResponse.java create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/AdditionalInformations.java create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtils.java create mode 100644 apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtilsTest.java diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/AdditionalInformationsRequest.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/AdditionalInformationsRequest.java new file mode 100644 index 000000000..a25f1cdd4 --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/AdditionalInformationsRequest.java @@ -0,0 +1,16 @@ +package it.pagopa.selfcare.onboarding.controller.request; + +import lombok.Data; + +@Data +public class AdditionalInformationsRequest { + private boolean belongRegulatedMarket; + private String regulatedMarketNote; + private boolean ipa; + private String ipaCode; + private boolean establishedByRegulatoryProvision; + private String establishedByRegulatoryProvisionNote; + private boolean agentOfPublicService; + private String agentOfPublicServiceNote; + private String otherNote; +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/OnboardingDefaultRequest.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/OnboardingDefaultRequest.java index c421202ca..761edac84 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/OnboardingDefaultRequest.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/request/OnboardingDefaultRequest.java @@ -16,5 +16,6 @@ public class OnboardingDefaultRequest extends OnboardingBaseRequest { @NotNull(message = "billing is required") @Valid private BillingRequest billing; - + @Valid + private AdditionalInformationsRequest additionalInformations; } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/AdditionalInformationsResponse.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/AdditionalInformationsResponse.java new file mode 100644 index 000000000..b446ebf5e --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/AdditionalInformationsResponse.java @@ -0,0 +1,16 @@ +package it.pagopa.selfcare.onboarding.controller.response; + +import lombok.Data; + +@Data +public class AdditionalInformationsResponse { + private boolean belongRegulatedMarket; + private String regulatedMarketNote; + private boolean ipa; + private String ipaCode; + private boolean establishedByRegulatoryProvision; + private String establishedByRegulatoryProvisionNote; + private boolean agentOfPublicService; + private String agentOfPublicServiceNote; + private String otherNote; +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingGet.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingGet.java index 6007b8c37..2a1bafd7e 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingGet.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingGet.java @@ -1,5 +1,6 @@ package it.pagopa.selfcare.onboarding.controller.response; +import it.pagopa.selfcare.onboarding.entity.AdditionalInformations; import lombok.Data; import java.util.List; @@ -14,6 +15,7 @@ public class OnboardingGet { private String pricingPlan; private BillingResponse billing; private Boolean signContract; + private AdditionalInformationsResponse additionalInformations; private String status; private String userRequestUid; diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/AdditionalInformations.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/AdditionalInformations.java new file mode 100644 index 000000000..a3658635a --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/AdditionalInformations.java @@ -0,0 +1,16 @@ +package it.pagopa.selfcare.onboarding.entity; + +import lombok.Data; + +@Data +public class AdditionalInformations { + private boolean belongRegulatedMarket; + private String regulatedMarketNote; + private boolean ipa; + private String ipaCode; + private boolean establishedByRegulatoryProvision; + private String establishedByRegulatoryProvisionNote; + private boolean agentOfPublicService; + private String agentOfPublicServiceNote; + private String otherNote; +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/Onboarding.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/Onboarding.java index 1d6cd03a8..b7bf13e4c 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/Onboarding.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/Onboarding.java @@ -4,6 +4,7 @@ import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity; import it.pagopa.selfcare.onboarding.common.OnboardingStatus; import it.pagopa.selfcare.onboarding.common.WorkflowType; +import it.pagopa.selfcare.onboarding.controller.request.AdditionalInformationsRequest; import it.pagopa.selfcare.onboarding.controller.request.ContractRequest; import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportContract; import lombok.Data; @@ -37,4 +38,5 @@ public class Onboarding extends ReactivePanacheMongoEntity { private LocalDateTime expiringDate; private OnboardingStatus status; private String userRequestUid; + private AdditionalInformations additionalInformations; } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java index cfbdbec17..dcd2a096c 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java @@ -8,10 +8,7 @@ import io.smallrye.mutiny.tuples.Tuple2; import io.smallrye.mutiny.unchecked.Unchecked; import it.pagopa.selfcare.azurestorage.AzureBlobClient; -import it.pagopa.selfcare.onboarding.common.InstitutionType; -import it.pagopa.selfcare.onboarding.common.OnboardingStatus; -import it.pagopa.selfcare.onboarding.common.PartyRole; -import it.pagopa.selfcare.onboarding.common.WorkflowType; +import it.pagopa.selfcare.onboarding.common.*; import it.pagopa.selfcare.onboarding.constants.CustomError; import it.pagopa.selfcare.onboarding.controller.request.*; import it.pagopa.selfcare.onboarding.controller.response.OnboardingGet; @@ -28,6 +25,7 @@ import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper; import it.pagopa.selfcare.onboarding.mapper.UserMapper; import it.pagopa.selfcare.onboarding.service.strategy.OnboardingValidationStrategy; +import it.pagopa.selfcare.onboarding.service.util.OnboardingUtils; import it.pagopa.selfcare.onboarding.util.InstitutionPaSubunitType; import it.pagopa.selfcare.onboarding.util.QueryUtils; import it.pagopa.selfcare.onboarding.util.SortEnum; @@ -75,7 +73,6 @@ public class OnboardingServiceDefault implements OnboardingService { private static final String INVALID_OBJECTID = "Given onboardingId [%s] has wrong format"; private static final String ONBOARDING_NOT_FOUND_OR_ALREADY_DELETED = "Onboarding with id %s not found or already deleted"; public static final String UNABLE_TO_COMPLETE_THE_ONBOARDING_FOR_INSTITUTION_FOR_PRODUCT_DISMISSED = "Unable to complete the onboarding for institution with taxCode '%s' to product '%s', the product is dismissed."; - public static final String USERS_FIELD_LIST = "fiscalCode,familyName,name,workContacts"; public static final String USERS_FIELD_TAXCODE = "fiscalCode"; public static final String UNABLE_TO_COMPLETE_THE_ONBOARDING_FOR_INSTITUTION_ALREADY_ONBOARDED = "Unable to complete the onboarding for institution with taxCode '%s' to product '%s' because is already onboarded."; @@ -161,12 +158,14 @@ private Uni fillUsersAndOnboarding(Onboarding onboarding, Li .onItem().transformToUni(onboardingPersisted -> checkRoleAndRetrieveUsers(userRequests, onboardingPersisted.id.toHexString()) .onItem().invoke(onboardingPersisted::setUsers).replaceWith(onboardingPersisted)) .onItem().transformToUni(this::checkProductAndReturnOnboarding) + .onItem().transformToUni(OnboardingUtils::customValidationOnboardingData) .onItem().transformToUni(this::addParentDescriptionForAooOrUo) .onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding, orchestrationApi.apiStartOnboardingOrchestrationGet(currentOnboarding.getId().toHexString(), timeout))) .onItem().transform(onboardingMapper::toResponse)); } + private Uni addParentDescriptionForAooOrUo(Onboarding onboarding) { if (InstitutionType.PA == onboarding.getInstitution().getInstitutionType()) { if (InstitutionPaSubunitType.AOO == onboarding.getInstitution().getSubunitType()) { diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtils.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtils.java new file mode 100644 index 000000000..cbec9d689 --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtils.java @@ -0,0 +1,33 @@ +package it.pagopa.selfcare.onboarding.service.util; + +import io.smallrye.mutiny.Uni; +import it.pagopa.selfcare.onboarding.common.InstitutionType; +import it.pagopa.selfcare.onboarding.common.ProductId; +import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; + +import java.util.Objects; + +public class OnboardingUtils { + + private static final String ADDITIONAL_INFORMATIONS_REQUIRED = "Additional Informations is required when institutionType is GSP and productId is pagopa"; + private static final String OTHER_NOTE_REQUIRED = "Other Note is required when other boolean are false"; + + public static Uni customValidationOnboardingData(Onboarding onboarding) { + if(InstitutionType.GSP == onboarding.getInstitution().getInstitutionType() && + ProductId.PROD_PAGOPA.getValue().equals(onboarding.getProductId())) { + if(Objects.isNull(onboarding.getAdditionalInformations())) { + return Uni.createFrom().failure(new InvalidRequestException(ADDITIONAL_INFORMATIONS_REQUIRED)); + } + else if (!onboarding.getAdditionalInformations().isIpa() && + !onboarding.getAdditionalInformations().isBelongRegulatedMarket() && + !onboarding.getAdditionalInformations().isEstablishedByRegulatoryProvision() && + !onboarding.getAdditionalInformations().isAgentOfPublicService() && + Objects.isNull(onboarding.getAdditionalInformations().getOtherNote())){ + return Uni.createFrom().failure(new InvalidRequestException(OTHER_NOTE_REQUIRED)); + } + } + return Uni.createFrom().item(onboarding); + } + +} diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtilsTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtilsTest.java new file mode 100644 index 000000000..98766a886 --- /dev/null +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/util/OnboardingUtilsTest.java @@ -0,0 +1,129 @@ +package it.pagopa.selfcare.onboarding.service.util; + +import io.quarkus.panache.mock.PanacheMock; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.mongodb.MongoTestResource; +import io.quarkus.test.vertx.UniAsserter; +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; +import it.pagopa.selfcare.onboarding.common.InstitutionType; +import it.pagopa.selfcare.onboarding.common.ProductId; +import it.pagopa.selfcare.onboarding.controller.response.OnboardingGet; +import it.pagopa.selfcare.onboarding.entity.AdditionalInformations; +import it.pagopa.selfcare.onboarding.entity.Institution; +import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.wildfly.common.Assert; + +import javax.inject.Inject; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@QuarkusTest +@QuarkusTestResource(MongoTestResource.class) +public class OnboardingUtilsTest { + + + @ParameterizedTest + @ValueSource(strings = {"ipa", "regulatedMarket", "establishedByRegulatoryProvision", "agentOfPublicService"}) + void shouldOnboardingInstitutionWithAdditionalInfo(String type) { + Onboarding onboarding = new Onboarding(); + Institution institution = new Institution(); + institution.setInstitutionType(InstitutionType.GSP); + onboarding.setInstitution(institution); + onboarding.setProductId(ProductId.PROD_PAGOPA.getValue()); + onboarding.setAdditionalInformations(createSimpleAdditionalInformations(type)); + + UniAssertSubscriber subscriber = OnboardingUtils + .customValidationOnboardingData(onboarding) + .subscribe() + .withSubscriber(UniAssertSubscriber.create()); + + Onboarding actual = subscriber.awaitItem().getItem(); + Assert.assertNotNull(actual); + } + + @Test + void shouldOnboardingInstitutionWithAdditionalInfoRequiredException() { + + Onboarding onboarding = new Onboarding(); + Institution institution = new Institution(); + institution.setInstitutionType(InstitutionType.GSP); + onboarding.setInstitution(institution); + onboarding.setProductId(ProductId.PROD_PAGOPA.getValue()); + onboarding.setAdditionalInformations(createSimpleAdditionalInformations("other")); + + UniAssertSubscriber subscriber = OnboardingUtils + .customValidationOnboardingData(onboarding) + .subscribe() + .withSubscriber(UniAssertSubscriber.create()); + + subscriber.assertFailedWith(InvalidRequestException.class); + + } + + @Test + void shouldOnboardingInstitutionWithOtherNoteRequiredException() { + + Onboarding onboarding = new Onboarding(); + Institution institution = new Institution(); + institution.setInstitutionType(InstitutionType.GSP); + onboarding.setInstitution(institution); + onboarding.setProductId(ProductId.PROD_PAGOPA.getValue()); + + UniAssertSubscriber subscriber = OnboardingUtils + .customValidationOnboardingData(onboarding) + .subscribe() + .withSubscriber(UniAssertSubscriber.create()); + + subscriber.assertFailedWith(InvalidRequestException.class); + + } + + + private static AdditionalInformations createSimpleAdditionalInformations(String type) { + AdditionalInformations additionalInformations = new AdditionalInformations(); + switch (type) { + case "ipa": + additionalInformations.setIpa(true); + additionalInformations.setBelongRegulatedMarket(false); + additionalInformations.setEstablishedByRegulatoryProvision(false); + additionalInformations.setAgentOfPublicService(false); + break; + case "regulatedMarket": + additionalInformations.setIpa(false); + additionalInformations.setBelongRegulatedMarket(true); + additionalInformations.setEstablishedByRegulatoryProvision(false); + additionalInformations.setAgentOfPublicService(false); + break; + case "establishedByRegulatoryProvision": + additionalInformations.setIpa(false); + additionalInformations.setBelongRegulatedMarket(false); + additionalInformations.setEstablishedByRegulatoryProvision(true); + additionalInformations.setAgentOfPublicService(false); + break; + case "agentOfPublicService": + additionalInformations.setIpa(false); + additionalInformations.setBelongRegulatedMarket(false); + additionalInformations.setEstablishedByRegulatoryProvision(false); + additionalInformations.setAgentOfPublicService(true); + break; + default: + additionalInformations.setIpa(false); + additionalInformations.setBelongRegulatedMarket(false); + additionalInformations.setEstablishedByRegulatoryProvision(false); + additionalInformations.setAgentOfPublicService(false); + } + + return additionalInformations; + } +}