Skip to content

Commit

Permalink
[SELC-6082] feat: added logic to retrieve institution and billing dat…
Browse files Browse the repository at this point in the history
…a in import API (#618)
  • Loading branch information
empassaro authored Nov 27, 2024
1 parent b9bbd48 commit ef5b4e6
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 38 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}

Expand All @@ -44,4 +53,42 @@ private boolean originIPA(Onboarding onboarding, InstitutionResource institution
onboarding.getInstitution().getDescription().equals(institutionResource.getDescription());
}

@Override
public RegistryManager<IPAEntity> 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);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -62,7 +63,7 @@ public Uni<UOResource> getUoFromRecipientCode(String recipientCode) {
}

protected Uni<Void> checkRecipientCode() {
if (isInvoiceablePA(onboarding)) {
if (isInvoiceablePA(onboarding) && !onboarding.getInstitution().isImported()) {
final String recipientCode = onboarding.getBilling().getRecipientCode();
return getUoFromRecipientCode(recipientCode)
.onItem().transformToUni(this::validateRecipientCode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,6 +22,7 @@ public abstract class ClientRegistryIPA extends BaseRegistryManager<IPAEntity> {
protected InstitutionApi institutionApi;
protected final UoApi uoClient;
protected AooApi aooClient;
protected GeographicTaxonomiesApi geographicTaxonomiesApi;
protected String originIdEC;
protected String resourceTaxCode;

Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down Expand Up @@ -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.";
Expand Down Expand Up @@ -415,8 +414,6 @@ private Uni<OnboardingResponse> fillUsersAndOnboardingForImport(
.onItem()
.invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem()
.transformToUni(current -> setInstitutionTypeAndBillingData(current, forceImport))
.onItem()
.transformToUni(
current -> persistOnboarding(onboarding, userRequests, product, null))
.onItem()
Expand Down Expand Up @@ -1532,28 +1529,6 @@ private Uni<List<UserResponse>> toUserResponseWithUserInfo(List<User> users) {
.asList();
}

private Uni<Onboarding> 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<Long> updateReasonForRejectAndUpdateStatus(
String onboardingId, String reasonForReject) {
Map<String, Object> queryParameter =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ class OnboardingServiceDefaultTest {
@RestClient
OrchestrationApi orchestrationApi;

@InjectMock
@RestClient
GeographicTaxonomiesApi geographicTaxonomiesApi;

@InjectMock
OnboardingValidationStrategy onboardingValidationStrategy;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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(() -> {
Expand Down

0 comments on commit ef5b4e6

Please sign in to comment.