Skip to content

Commit

Permalink
Added logic to value istatCode
Browse files Browse the repository at this point in the history
  • Loading branch information
pierpaolo.didato@emeal.nttdata.com authored and pierpaolo.didato@emeal.nttdata.com committed Sep 3, 2024
1 parent e07302b commit 47a73ad
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 58 deletions.
3 changes: 3 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1419,6 +1419,9 @@
"county" : {
"type" : "string"
},
"istatCode" : {
"type" : "string"
},
"description" : {
"type" : "string"
},
Expand Down
2 changes: 2 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,8 @@ components:
type: string
county:
type: string
istatCode:
type: string
description:
type: string
digitalAddress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class Institution {
private String city;
private String country;
private String county;
private String istatCode;
private String description;
private String digitalAddress;
private String address;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ public class Onboarding extends ReactivePanacheMongoEntityBase {
private AdditionalInformations additionalInformations;
private String reasonForReject;
private Boolean isAggregator;
private String city;
private String country;
private String county;

private String referenceOnboardingId;
private String previousManagerId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
import org.openapi.quarkus.onboarding_functions_json.model.OrchestrationResponse;
import org.openapi.quarkus.party_registry_proxy_json.api.AooApi;
import org.openapi.quarkus.party_registry_proxy_json.api.UoApi;
import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource;
import org.openapi.quarkus.party_registry_proxy_json.model.UOResource;
import org.openapi.quarkus.user_registry_json.api.UserApi;
import org.openapi.quarkus.user_registry_json.model.*;

Expand All @@ -63,6 +65,7 @@
import java.util.function.Supplier;
import java.util.stream.Collectors;

import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.*;
import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP;
import static it.pagopa.selfcare.onboarding.constants.CustomError.*;
import static it.pagopa.selfcare.onboarding.util.GenericError.*;
Expand Down Expand Up @@ -203,11 +206,12 @@ private Uni<OnboardingResponse> fillUsersAndOnboarding(Onboarding onboarding, Li
return getProductByOnboarding(onboarding)
.onItem().transformToUni(product -> verifyAlreadyOnboardingForProductAndProductParent(onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem().transformToUni(product -> onboardingUtils.customValidationOnboardingData(onboarding, product)
.onItem().transformToUni(product -> getRegistryResource(onboarding)
.onItem().transformToUni(proxyResource -> onboardingUtils.customValidationOnboardingData(onboarding, product, proxyResource)
.onItem().transformToUni(ignored -> setIstatCode(onboarding, proxyResource)))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds())).onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(this::addParentDescriptionForAooOrUo)
//.onItem().transformToUni(this::addLocationData)
.onItem().transformToUni(current -> persistOnboarding(onboarding, userRequests, product))
/* Update onboarding data with users and start orchestration */
.onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding,
Expand Down Expand Up @@ -243,17 +247,50 @@ private Uni<OnboardingResponse> fillUsersAndOnboarding(Onboarding onboarding, Li
return getProductByOnboarding(onboarding)
.onItem().transformToUni(product -> verifyAlreadyOnboardingForProductAndProductParent(onboarding.getInstitution(), product.getId(), product.getParentId())
.replaceWith(product))
.onItem().transformToUni(product -> onboardingUtils.customValidationOnboardingData(onboarding, product)
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(this::addParentDescriptionForAooOrUo)
.onItem().transformToUni(this::setInstitutionTypeAndBillingData)
.onItem().transformToUni(current -> persistOnboarding(onboarding, userRequests, product))
.onItem().call(onboardingPersisted -> Panache.withTransaction(() -> Token.persist(getToken(onboardingPersisted, product, contractImported))))
/* Update onboarding data with users and start orchestration */
.onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding,
orchestrationApi.apiStartOnboardingOrchestrationGet(currentOnboarding.getId(), timeout)))
.onItem().transform(onboardingMapper::toResponse));
.onItem().transformToUni(product -> getRegistryResource(onboarding)
.onItem().transformToUni(proxyResource -> onboardingUtils.customValidationOnboardingData(onboarding, product, proxyResource)
.onItem().transformToUni(ignored -> setIstatCode(onboarding, proxyResource)))
/* if product has some test environments, request must also onboard them (for ex. prod-interop-coll) */
.onItem().invoke(() -> onboarding.setTestEnvProductIds(product.getTestEnvProductIds()))
.onItem().transformToUni(this::addParentDescriptionForAooOrUo)
.onItem().transformToUni(this::setInstitutionTypeAndBillingData)
.onItem().transformToUni(current -> persistOnboarding(onboarding, userRequests, product))
.onItem().call(onboardingPersisted -> Panache.withTransaction(() -> Token.persist(getToken(onboardingPersisted, product, contractImported))))
/* Update onboarding data with users and start orchestration */
.onItem().transformToUni(currentOnboarding -> persistAndStartOrchestrationOnboarding(currentOnboarding,
orchestrationApi.apiStartOnboardingOrchestrationGet(currentOnboarding.getId(), timeout)))
.onItem().transform(onboardingMapper::toResponse));
}

private Uni<OnboardingUtils.ProxyResource> getRegistryResource(Onboarding onboarding) {

switch ((onboarding.getInstitution().getSubunitType() != null) ? onboarding.getInstitution().getSubunitType() : EC ) {
case AOO -> {
return aooApi.findByUnicodeUsingGET(onboarding.getInstitution().getSubunitCode(), null)
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format(AOO_NOT_FOUND.getMessage(), onboarding.getInstitution().getSubunitCode())))
: Uni.createFrom().failure(ex))
.onItem().transformToUni(aooResource -> Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.resource(aooResource)
.type(AOO)
.build()));
}
case UO -> {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.onFailure(WebApplicationException.class).recoverWithUni(ex -> ((WebApplicationException) ex).getResponse().getStatus() == 404
? Uni.createFrom().failure(new ResourceNotFoundException(String.format(UO_NOT_FOUND.getMessage(), onboarding.getInstitution().getSubunitCode())))
: Uni.createFrom().failure(ex))
.onItem().transformToUni(uoResource -> Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.resource(uoResource)
.type(UO)
.build()));
}
default -> {
return Uni.createFrom().item(OnboardingUtils.ProxyResource.builder()
.type(EC)
.build());
}
}
}

private Uni<Onboarding> persistOnboarding(Onboarding onboarding, List<UserRequest> userRequests, Product product) {
Expand Down Expand Up @@ -281,6 +318,22 @@ private Uni<Onboarding> addParentDescriptionForAooOrUo(Onboarding onboarding) {
return Uni.createFrom().item(onboarding);
}

private Uni<Onboarding> setIstatCode(Onboarding onboarding, OnboardingUtils.ProxyResource proxyResource) {
return switch (proxyResource.getType()) {
case AOO -> Uni.createFrom().item(() -> {
AOOResource resource = (AOOResource) proxyResource.getResource();
onboarding.getInstitution().setIstatCode(resource.getCodiceComuneISTAT());
return onboarding;
});
case UO -> Uni.createFrom().item(() -> {
UOResource resource = (UOResource) proxyResource.getResource();
onboarding.getInstitution().setIstatCode(resource.getCodiceComuneISTAT());
return onboarding;
});
default -> Uni.createFrom().item(onboarding);
};
}

private Uni<Onboarding> addParentDescriptionForUO(Onboarding onboarding) {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.onItem().invoke(uoResource -> LOG.infof("Founded parent %s for UO institution with subunitCode %s", uoResource.getDenominazioneEnte(), onboarding.getInstitution().getSubunitCode()))
Expand Down Expand Up @@ -315,11 +368,11 @@ private Uni<Onboarding> addReferencedOnboardingId(Onboarding onboarding) {
.invoke(previousOnboarding -> onboarding.setReferenceOnboardingId(previousOnboarding.getId()));
return current.onItem().transformToUni(ignored -> onboardings.collect().first()).onItem()
.invoke(lastOnboarding -> {
String previousManagerId = lastOnboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId).findFirst().orElse(null);
onboarding.setPreviousManagerId(previousManagerId);
}).replaceWith(onboarding);
String previousManagerId = lastOnboarding.getUsers().stream()
.filter(user -> user.getRole().equals(PartyRole.MANAGER))
.map(User::getId).findFirst().orElse(null);
onboarding.setPreviousManagerId(previousManagerId);
}).replaceWith(onboarding);
}

private Uni<Onboarding> addLocationData(Onboarding onboarding) {
Expand Down Expand Up @@ -1050,8 +1103,8 @@ public Uni<Long> updateOnboarding(String onboardingId, Onboarding onboarding) {
return Onboarding.findById(onboardingId)
.onItem().transform(Onboarding.class::cast)
.onItem().transformToUni(onboardingGet -> Objects.isNull(onboardingGet)
? Uni.createFrom().failure(new InvalidRequestException(String.format("Onboarding with id %s is not present!", onboardingId)))
: Uni.createFrom().item(onboardingGet))
? Uni.createFrom().failure(new InvalidRequestException(String.format("Onboarding with id %s is not present!", onboardingId)))
: Uni.createFrom().item(onboardingGet))
.onItem().transformToUni(id -> updateOnboardingValues(onboardingId, onboarding));

}
Expand Down Expand Up @@ -1093,9 +1146,9 @@ public Uni<Boolean> checkManager(OnboardingUserRequest onboardingUserRequest) {
}

public Uni<CustomError> checkRecipientCode(String recipientCode, String originId) {
return onboardingUtils.getUoFromRecipientCode(recipientCode).onItem()
.transformToUni(uoResource ->
onboardingUtils.getValidationRecipientCodeError(originId, uoResource));
return onboardingUtils.getUoFromRecipientCode(recipientCode).onItem()
.transformToUni(uoResource ->
onboardingUtils.getValidationRecipientCodeError(originId, uoResource));
}

private static Uni<Long> updateOnboardingValues(String onboardingId, Onboarding onboarding) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.WebApplicationException;
import lombok.Builder;
import lombok.Data;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.openapi.quarkus.party_registry_proxy_json.api.AooApi;
import org.openapi.quarkus.party_registry_proxy_json.api.UoApi;
import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource;
import org.openapi.quarkus.party_registry_proxy_json.model.UOResource;

import java.util.Objects;

import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.EC;
import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.UO;
import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.*;
import static it.pagopa.selfcare.onboarding.constants.CustomError.*;

@ApplicationScoped
Expand All @@ -41,21 +43,21 @@ public class OnboardingUtils {
private static final String PARENT_TAX_CODE_IS_INVALID = "The tax code of the parent entity of the request does not match the tax code of the parent entity retrieved by IPA";
private static final String TAX_CODE_INVOICING_IS_INVALID = "The tax code invoicing of the request does not match any tax code of institutions' hierarchy";

public Uni<Onboarding> customValidationOnboardingData(Onboarding onboarding, Product product) {
if (isUO(onboarding)) {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.flatMap(uoResource -> checkParentTaxCode(onboarding, uoResource))
.onItem().transformToUni(o -> checkTaxCodeInvoicing(onboarding, product));
}
return checkRecipientCode(onboarding)
.replaceWith(additionalChecksForProduct(onboarding, product));
public Uni<Onboarding> customValidationOnboardingData(Onboarding onboarding, Product product, ProxyResource proxyResource) {
if (isUOWithSfe(onboarding)) {
return checkParentTaxCode(onboarding, ((UOResource) proxyResource.getResource()).getCodiceFiscaleEnte())
.onItem().transformToUni(o -> checkTaxCodeInvoicing(onboarding, product));
} else {
return checkRecipientCode(onboarding, proxyResource)
.replaceWith(additionalChecksForProduct(onboarding, product));
}
}

private Uni<Void> checkRecipientCode(Onboarding onboarding) {
private Uni<Void> checkRecipientCode(Onboarding onboarding, ProxyResource proxyResource) {
if (isInvoiceablePA(onboarding)) {
final String recipientCode = onboarding.getBilling().getRecipientCode();
return getUoFromRecipientCode(recipientCode)
.onItem().transformToUni(uoResource -> validationRecipientCode(onboarding, uoResource))
.onItem().transformToUni(uoResource -> validationRecipientCode(onboarding, proxyResource, uoResource))
.onItem().transformToUni(customError -> {
if (Objects.nonNull(customError)) {
return Uni.createFrom().failure(new InvalidRequestException(customError.getMessage()));
Expand All @@ -66,16 +68,14 @@ private Uni<Void> checkRecipientCode(Onboarding onboarding) {
return Uni.createFrom().nullItem();
}

private Uni<CustomError> validationRecipientCode(Onboarding onboarding, UOResource uoResource) {
private Uni<CustomError> validationRecipientCode(Onboarding onboarding, ProxyResource proxyResource, UOResource uoResource) {

switch ((onboarding.getInstitution().getSubunitType() != null) ? onboarding.getInstitution().getSubunitType() : EC ) {
case AOO -> {
return aooApi.findByUnicodeUsingGET(onboarding.getInstitution().getSubunitCode(), null)
.onItem().transformToUni(aooResource -> getValidationRecipientCodeError(aooResource.getCodiceIpa(), uoResource));
return getValidationRecipientCodeError(((AOOResource) proxyResource.getResource()).getCodiceIpa(), uoResource);
}
case UO -> {
return uoApi.findByUnicodeUsingGET1(onboarding.getInstitution().getSubunitCode(), null)
.onItem().transformToUni(innerUoResource -> getValidationRecipientCodeError(innerUoResource.getCodiceIpa(), uoResource));
return getValidationRecipientCodeError(((UOResource) proxyResource.getResource()).getCodiceIpa(), uoResource);
}
default -> {
return getValidationRecipientCodeError(onboarding.getInstitution().getOriginId(), uoResource);
Expand Down Expand Up @@ -104,9 +104,9 @@ public Uni<CustomError> getValidationRecipientCodeError(String originIdEC, UORes
return Uni.createFrom().nullItem();
}

private Uni<Void> checkParentTaxCode(Onboarding onboarding, UOResource uoResource) {
private Uni<Void> checkParentTaxCode(Onboarding onboarding, String childTaxCode) {
/* if parent tax code is different from child tax code, throw an exception */
if (!onboarding.getInstitution().getTaxCode().equals(uoResource.getCodiceFiscaleEnte())) {
if (!onboarding.getInstitution().getTaxCode().equals(childTaxCode)) {
return Uni.createFrom().failure(new InvalidRequestException(PARENT_TAX_CODE_IS_INVALID));
}
return Uni.createFrom().voidItem();
Expand Down Expand Up @@ -154,7 +154,7 @@ private Uni<Onboarding> additionalChecksForProduct(Onboarding onboarding, Produc
return Uni.createFrom().item(onboarding);
}

private boolean isUO(Onboarding onboarding) {
private boolean isUOWithSfe(Onboarding onboarding) {
return Objects.nonNull(onboarding.getInstitution().getSubunitCode())
&& UO.equals(onboarding.getInstitution().getSubunitType())
&& Objects.nonNull(onboarding.getBilling())
Expand All @@ -168,4 +168,11 @@ private boolean isInvoiceablePA(Onboarding onboarding) {
&& Objects.nonNull(onboarding.getBilling())
&& Objects.nonNull(onboarding.getBilling().getRecipientCode());
}

@Data
@Builder
public static class ProxyResource<T> {
private InstitutionPaSubunitType type;
private T resource;
}
}
Loading

0 comments on commit 47a73ad

Please sign in to comment.