Skip to content

Commit

Permalink
feat: added new AdditionalInformations Object
Browse files Browse the repository at this point in the history
  • Loading branch information
gianmarcoplutino committed Jan 25, 2024
1 parent d554876 commit 5137ea4
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ public class OnboardingDefaultRequest extends OnboardingBaseRequest {
@NotNull(message = "billing is required")
@Valid
private BillingRequest billing;

@Valid
private AdditionalInformationsRequest additionalInformations;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -37,4 +38,5 @@ public class Onboarding extends ReactivePanacheMongoEntity {
private LocalDateTime expiringDate;
private OnboardingStatus status;
private String userRequestUid;
private AdditionalInformations additionalInformations;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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.";
Expand Down Expand Up @@ -161,12 +158,14 @@ private Uni<OnboardingResponse> 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<Onboarding> addParentDescriptionForAooOrUo(Onboarding onboarding) {
if (InstitutionType.PA == onboarding.getInstitution().getInstitutionType()) {
if (InstitutionPaSubunitType.AOO == onboarding.getInstitution().getSubunitType()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Onboarding> 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);
}

}
Original file line number Diff line number Diff line change
@@ -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<Onboarding> 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<Onboarding> 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<Onboarding> 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;
}
}

0 comments on commit 5137ea4

Please sign in to comment.