diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPA.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPA.java index 83cba2e1d..1898067bc 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPA.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPA.java @@ -1,33 +1,42 @@ package it.pagopa.selfcare.onboarding.entity.registry; import io.smallrye.mutiny.Uni; +import it.pagopa.selfcare.onboarding.common.InstitutionType; +import it.pagopa.selfcare.onboarding.entity.Billing; import it.pagopa.selfcare.onboarding.entity.IPAEntity; import it.pagopa.selfcare.onboarding.entity.Onboarding; import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException; import jakarta.ws.rs.WebApplicationException; +import org.openapi.quarkus.party_registry_proxy_json.api.GeographicTaxonomiesApi; import org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi; import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; +import org.openapi.quarkus.party_registry_proxy_json.model.GeographicTaxonomyResource; import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource; import java.time.Duration; import java.time.temporal.ChronoUnit; +import java.util.Objects; + +import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.GSP_CATEGORY_INSTITUTION_TYPE; public class RegistryManagerIPA extends RegistryManagerIPAUo { - public RegistryManagerIPA(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi) { - super(onboarding, uoApi, institutionApi); + private static final String DESCRIPTION_TO_REPLACE_REGEX = " - COMUNE"; + + public RegistryManagerIPA(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi, GeographicTaxonomiesApi geographicTaxonomiesApi) { + super(onboarding, uoApi, institutionApi, geographicTaxonomiesApi); } @Override public IPAEntity retrieveInstitution() { super.originIdEC = onboarding.getInstitution().getOriginId(); InstitutionResource institutionResource = super.institutionApi.findInstitutionUsingGET(onboarding.getInstitution().getTaxCode(), null, null) - .onFailure().retry().atMost(MAX_NUMBER_ATTEMPTS) - .onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404 - ? Uni.createFrom().failure(new ResourceNotFoundException(String.format("Institution with taxCode %s not found", onboarding.getInstitution().getTaxCode()))) - : Uni.createFrom().failure(ex)) - .await().atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS)); + .onFailure().retry().atMost(MAX_NUMBER_ATTEMPTS) + .onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404 + ? Uni.createFrom().failure(new ResourceNotFoundException(String.format("Institution with taxCode %s not found", onboarding.getInstitution().getTaxCode()))) + : Uni.createFrom().failure(ex)) + .await().atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS)); return IPAEntity.builder().institutionResource(institutionResource).build(); } @@ -44,4 +53,42 @@ private boolean originIPA(Onboarding onboarding, InstitutionResource institution onboarding.getInstitution().getDescription().equals(institutionResource.getDescription()); } + @Override + public RegistryManager setResource(IPAEntity registryResource) { + this.registryResource = registryResource; + if (onboarding.getInstitution().isImported()) { + populateInstitution(); + populateBilling(); + } + return this; + } + + private void populateInstitution() { + InstitutionResource institutionResource = registryResource.getInstitutionResource(); + onboarding.getInstitution().setOriginId(institutionResource.getOriginId()); + onboarding.getInstitution().setTaxCode(institutionResource.getTaxCode()); + onboarding.getInstitution().setDigitalAddress(institutionResource.getDigitalAddress()); + onboarding.getInstitution().setAddress(institutionResource.getAddress()); + onboarding.getInstitution().setDescription(institutionResource.getDescription()); + InstitutionType institutionType = institutionResource.getCategory().equalsIgnoreCase(GSP_CATEGORY_INSTITUTION_TYPE) ? InstitutionType.GSP : InstitutionType.PA; + onboarding.getInstitution().setInstitutionType(institutionType); + onboarding.getInstitution().setZipCode(institutionResource.getZipCode()); + GeographicTaxonomyResource geographicTaxonomyResource = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(institutionResource.getIstatCode()) + .await().atMost(Duration.of(DURATION_TIMEOUT, ChronoUnit.SECONDS)); + + onboarding.getInstitution().setCounty(geographicTaxonomyResource.getProvinceAbbreviation()); + onboarding.getInstitution().setCountry(geographicTaxonomyResource.getCountryAbbreviation()); + onboarding.getInstitution().setCity(geographicTaxonomyResource.getDesc().replace(DESCRIPTION_TO_REPLACE_REGEX, "")); + } + + private void populateBilling() { + if (Objects.isNull(onboarding.getBilling()) || Objects.isNull(onboarding.getBilling().getRecipientCode())) { + InstitutionResource institutionResource = registryResource.getInstitutionResource(); + Billing billing = new Billing(); + billing.setVatNumber(institutionResource.getTaxCode()); + billing.setRecipientCode(institutionResource.getOriginId()); + onboarding.setBilling(billing); + } + } + } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPAUo.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPAUo.java index 8feb28295..0d047d627 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPAUo.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryManagerIPAUo.java @@ -10,6 +10,7 @@ import it.pagopa.selfcare.product.entity.Product; import jakarta.ws.rs.WebApplicationException; import org.openapi.quarkus.party_registry_proxy_json.api.AooApi; +import org.openapi.quarkus.party_registry_proxy_json.api.GeographicTaxonomiesApi; import org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi; import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; @@ -30,8 +31,8 @@ public RegistryManagerIPAUo(Onboarding onboarding, UoApi uoApi) { super(onboarding, uoApi); } - public RegistryManagerIPAUo(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi) { - super(onboarding, uoApi, institutionApi); + public RegistryManagerIPAUo(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi, GeographicTaxonomiesApi geographicTaxonomiesApi) { + super(onboarding, uoApi, institutionApi, geographicTaxonomiesApi); } @Override @@ -62,7 +63,7 @@ public Uni getUoFromRecipientCode(String recipientCode) { } protected Uni checkRecipientCode() { - if (isInvoiceablePA(onboarding)) { + if (isInvoiceablePA(onboarding) && !onboarding.getInstitution().isImported()) { final String recipientCode = onboarding.getBilling().getRecipientCode(); return getUoFromRecipientCode(recipientCode) .onItem().transformToUni(this::validateRecipientCode) diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryResourceFactory.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryResourceFactory.java index f8e54b421..feb1cc6fe 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryResourceFactory.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/RegistryResourceFactory.java @@ -34,6 +34,8 @@ public class RegistryResourceFactory { @RestClient @Inject StationsApi stationsApi; + @RestClient @Inject GeographicTaxonomiesApi geographicTaxonomiesApi; + public RegistryManager create(Onboarding onboarding) { return switch (onboarding.getInstitution().getOrigin() != null ? onboarding.getInstitution().getOrigin() @@ -69,6 +71,6 @@ private RegistryManager getResourceFromInstitutionType(Onboarding onboarding) if (GSP.equals(onboarding.getInstitution().getInstitutionType())) { new RegistryManagerIPAGps(onboarding, uoApi); } - return new RegistryManagerIPA(onboarding, uoApi, institutionApi); + return new RegistryManagerIPA(onboarding, uoApi, institutionApi, geographicTaxonomiesApi); } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/client/ClientRegistryIPA.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/client/ClientRegistryIPA.java index 6898f7a83..340294a4f 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/client/ClientRegistryIPA.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/entity/registry/client/ClientRegistryIPA.java @@ -7,6 +7,7 @@ import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException; import jakarta.ws.rs.WebApplicationException; import org.openapi.quarkus.party_registry_proxy_json.api.AooApi; +import org.openapi.quarkus.party_registry_proxy_json.api.GeographicTaxonomiesApi; import org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi; import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; @@ -21,6 +22,7 @@ public abstract class ClientRegistryIPA extends BaseRegistryManager { protected InstitutionApi institutionApi; protected final UoApi uoClient; protected AooApi aooClient; + protected GeographicTaxonomiesApi geographicTaxonomiesApi; protected String originIdEC; protected String resourceTaxCode; @@ -35,10 +37,11 @@ protected ClientRegistryIPA(Onboarding onboarding, UoApi uoApi) { this.uoClient = uoApi; } - protected ClientRegistryIPA(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi) { + protected ClientRegistryIPA(Onboarding onboarding, UoApi uoApi, InstitutionApi institutionApi, GeographicTaxonomiesApi geographicTaxonomiesApi) { super(onboarding); this.uoClient = uoApi; this.institutionApi = institutionApi; + this.geographicTaxonomiesApi = geographicTaxonomiesApi; } public IPAEntity retrieveInstitution() { 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 98d5bd543..433538c04 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 @@ -1,6 +1,5 @@ package it.pagopa.selfcare.onboarding.service; -import static it.pagopa.selfcare.onboarding.common.InstitutionType.PSP; import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP; import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_PAGOPA; import static it.pagopa.selfcare.onboarding.constants.CustomError.*; @@ -91,7 +90,7 @@ public class OnboardingServiceDefault implements OnboardingService { "Institution with external id '%s' is not allowed to onboard '%s' product"; private static final String ONBOARDING_NOT_FOUND_OR_ALREADY_DELETED = "Onboarding with id %s not found or already deleted"; - private static final String GSP_CATEGORY_INSTITUTION_TYPE = "L37"; + public static final String GSP_CATEGORY_INSTITUTION_TYPE = "L37"; 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."; @@ -415,8 +414,6 @@ private Uni fillUsersAndOnboardingForImport( .onItem() .invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds())) .onItem() - .transformToUni(current -> setInstitutionTypeAndBillingData(current, forceImport)) - .onItem() .transformToUni( current -> persistOnboarding(onboarding, userRequests, product, null)) .onItem() @@ -1532,28 +1529,6 @@ private Uni> toUserResponseWithUserInfo(List users) { .asList(); } - private Uni setInstitutionTypeAndBillingData(Onboarding onboarding, boolean forceImport) { - if (Objects.nonNull(onboarding.getInstitution()) - && !PSP.equals(onboarding.getInstitution().getInstitutionType()) - && !forceImport) { - return institutionRegistryProxyApi.findInstitutionUsingGET(onboarding.getInstitution().getTaxCode(), null, null) - .onItem() - .invoke(proxyInstitution -> { - if (Objects.nonNull(proxyInstitution)) { - InstitutionType institutionType = proxyInstitution.getCategory().equalsIgnoreCase(GSP_CATEGORY_INSTITUTION_TYPE) ? InstitutionType.GSP : InstitutionType.PA; - onboarding.getInstitution().setInstitutionType(institutionType); - Billing billing = new Billing(); - billing.setVatNumber(proxyInstitution.getTaxCode()); - billing.setRecipientCode(proxyInstitution.getOriginId()); - onboarding.setBilling(billing); - } else { - onboarding.getInstitution().setInstitutionType(InstitutionType.PA); - } - }).replaceWith(Uni.createFrom().item(onboarding)); - } - return Uni.createFrom().item(onboarding); - } - private static Uni updateReasonForRejectAndUpdateStatus( String onboardingId, String reasonForReject) { Map queryParameter = diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java index 827ce5621..ac24c55cb 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java @@ -146,6 +146,10 @@ class OnboardingServiceDefaultTest { @RestClient OrchestrationApi orchestrationApi; + @InjectMock + @RestClient + GeographicTaxonomiesApi geographicTaxonomiesApi; + @InjectMock OnboardingValidationStrategy onboardingValidationStrategy; @@ -1905,6 +1909,7 @@ void onboarding_Onboarding_importPA(UniAsserter asserter) { Institution institutionBaseRequest = new Institution(); institutionBaseRequest.setOrigin(Origin.IPA); institutionBaseRequest.setTaxCode("taxCode"); + institutionBaseRequest.setImported(true); institutionBaseRequest.setDescription(DESCRIPTION_FIELD); institutionBaseRequest.setDigitalAddress(DIGITAL_ADDRESS_FIELD); request.setInstitution(institutionBaseRequest); @@ -1935,9 +1940,17 @@ void onboarding_Onboarding_importPA(UniAsserter asserter) { institutionResource.setCategory("L37"); institutionResource.setDescription(DESCRIPTION_FIELD); institutionResource.setDigitalAddress(DIGITAL_ADDRESS_FIELD); + institutionResource.setIstatCode("istatCode"); asserter.execute(() -> when(institutionRegistryProxyApi.findInstitutionUsingGET(institutionBaseRequest.getTaxCode(), null, null)) .thenReturn(Uni.createFrom().item(institutionResource))); + GeographicTaxonomyResource geographicTaxonomyResource = new GeographicTaxonomyResource(); + geographicTaxonomyResource.setCountryAbbreviation("IT"); + geographicTaxonomyResource.setProvinceAbbreviation("RM"); + geographicTaxonomyResource.setDesc("desc"); + asserter.execute(() -> when(geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(any())) + .thenReturn(Uni.createFrom().item(geographicTaxonomyResource))); + asserter.assertThat(() -> onboardingService.onboardingImport(request, users, contractImported, false), Assertions::assertNotNull); asserter.execute(() -> {