Skip to content

Commit

Permalink
Merge branch 'main' into feature/SELC-6056
Browse files Browse the repository at this point in the history
  • Loading branch information
giampieroferrara committed Jan 16, 2025
2 parents 99f1676 + 34db8f8 commit 2e8ee17
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException;
import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper;
import it.pagopa.selfcare.onboarding.model.*;
import it.pagopa.selfcare.onboarding.util.Utils;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.WebApplicationException;
Expand Down Expand Up @@ -66,6 +67,9 @@ public class AggregatesServiceDefault implements AggregatesService {
@Inject
CsvService csvService;

@Inject
Utils utils;

private final AzureBlobClient azureBlobClient;
private final OnboardingMsConfig onboardingMsConfig;
private final ExpiringMap<String, GeographicTaxonomyFromIstatCode> expiringMap;
Expand All @@ -81,11 +85,11 @@ public AggregatesServiceDefault(AzureBlobClient azureBlobClient, OnboardingMsCon

public static final String LOG_CSV_ROWS = "CSV file validated end: %s valid row and %s invalid row";
protected static final String DESCRIPTION_TO_REPLACE_REGEX = " - COMUNE";
public static final String ERROR_IPA = "Codice fiscale non presente su IPA";
public static final String ERROR_TAXCODE = "Il codice fiscale è obbligatorio";
public static final String ERROR_IPA = "Codice Fiscale non presente su IPA";
public static final String ERROR_TAXCODE = "Il Codice Fiscale è obbligatorio";
public static final String ERROR_SUBUNIT_TYPE = "SubunitType non valido";
public static final String ERROR_AOO_UO = "In caso di AOO/UO è necessario specificare la tipologia e il codice univoco IPA AOO/UO";
public static final String ERROR_VATNUMBER = "La partita IVA è obbligatoria";
public static final String ERROR_VATNUMBER = "La Partita IVA è obbligatoria";
public static final String ERROR_ADMIN_NAME = "Nome Amministratore Ente Aggregato è obbligatorio";
public static final String ERROR_ADMIN_SURNAME = "Cognome Amministratore Ente Aggregato è obbligatorio";
public static final String ERROR_ADMIN_EMAIL = "Email Amministratore Ente Aggregato è obbligatorio";
Expand All @@ -95,6 +99,10 @@ public AggregatesServiceDefault(AzureBlobClient azureBlobClient, OnboardingMsCon
public static final String ERROR_SERVICE = "Servizio è obbligatorio";
public static final String ERROR_SYNC_ASYNC_MODE = "Modalità Sincrona/Asincrona è obbligatorio";
public static final String ERROR_CODICE_SDI = "Codice SDI è obbligatorio";
private static final String ERROR_ADMIN_NAME_MISMATCH = "Nome non corretto o diverso dal Codice Fiscale";
private static final String ERROR_ADMIN_SURNAME_MISMATCH = "Cognome non corretto o diverso dal Codice Fiscale";
private static final String ERROR_TAXCODE_LENGTH = "Il Codice Fiscale non è valido";
private static final String ERROR_VATNUMBER_LENGTH = "La Partita IVA non è valida";
private static final String PEC = "Pec";
private static final String FILE_NAME_AGGREGATES_CSV = "aggregates.csv";

Expand Down Expand Up @@ -211,16 +219,20 @@ private static RowError mapToErrorRow(Integer rowNumber, String taxCode, Throwab

private Uni<Aggregate> checkCsvAggregateAppIo(CsvAggregateAppIo csvAggregateAppIo) {
return checkRequiredFieldsAppIo(csvAggregateAppIo)
.onItem().transformToUni(unused -> formalCheckTaxCodeAndVatNumber(csvAggregateAppIo.getTaxCode(), csvAggregateAppIo.getVatNumber()))
.onItem().transformToUni(unused -> retrieveDataFromIpa(onboardingMapper.csvToAggregateAppIo(csvAggregateAppIo)));
}

private Uni<Aggregate> checkCsvAggregateSend(CsvAggregateSend csvAggregateSend) {
return checkRequiredFieldsSend(csvAggregateSend)
.onItem().transformToUni(unused -> formalCheckTaxCodeAndVatNumber(csvAggregateSend.getTaxCode(), csvAggregateSend.getVatNumber()))
.onItem().transformToUni(unused -> checkAdminTaxCode(csvAggregateSend))
.onItem().transformToUni(unused -> retrieveDataFromIpa(onboardingMapper.csvToAggregateSend(csvAggregateSend)));
}

private Uni<Aggregate> checkCsvAggregatePagoPa(CsvAggregatePagoPa csvAggregatePagoPa) {
return checkRequiredFieldsPagoPa(csvAggregatePagoPa)
.onItem().transformToUni(unused -> formalCheckTaxCodeAndVatNumber(csvAggregatePagoPa.getTaxCode(), csvAggregatePagoPa.getVatNumber()))
.onItem().transformToUni(unused -> retrieveDataFromIpa(onboardingMapper.csvToAggregatePagoPa(csvAggregatePagoPa)));
}

Expand Down Expand Up @@ -372,4 +384,37 @@ private Uni<Void> checkRequiredFieldsSend(CsvAggregateSend csvAggregate) {
}
return Uni.createFrom().voidItem();
}

private Uni<Void> checkAdminTaxCode(CsvAggregateSend csvAggregate) {

String expectedSurnamePart = utils.extractSurnamePart(csvAggregate.getAdminAggregateSurname());
String expectedNamePart = utils.extractNamePart(csvAggregate.getAdminAggregateName());

String taxCode = csvAggregate.getAdminAggregateTaxCode();
String taxCodeSurnamePart = taxCode.substring(0, 3).toUpperCase();
String taxCodeNamePart = taxCode.substring(3, 6).toUpperCase();

if (!taxCodeSurnamePart.equals(expectedSurnamePart)) {
return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_SURNAME_MISMATCH));
}

if (!taxCodeNamePart.equals(expectedNamePart)) {
return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_NAME_MISMATCH));
}

return Uni.createFrom().voidItem();
}

private Uni<Void> formalCheckTaxCodeAndVatNumber(String taxCode, String vatNumber) {

if (taxCode.length() < 11) {
return Uni.createFrom().failure(new InvalidRequestException(ERROR_TAXCODE_LENGTH));
}

if (vatNumber.length() < 11) {
return Uni.createFrom().failure(new InvalidRequestException(ERROR_VATNUMBER_LENGTH));
}

return Uni.createFrom().voidItem();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import it.pagopa.selfcare.onboarding.constants.CustomError;
import it.pagopa.selfcare.onboarding.exception.InvalidRequestException;
import it.pagopa.selfcare.onboarding.model.FormItem;
import jakarta.enterprise.context.ApplicationScoped;
import org.apache.commons.lang3.StringUtils;
import org.jboss.resteasy.reactive.server.core.multipart.FormData;
import org.jboss.resteasy.reactive.server.multipart.FormValue;
Expand All @@ -11,6 +12,7 @@
import java.util.Deque;
import java.util.function.BinaryOperator;

@ApplicationScoped
public class Utils {
private static final String DEFAULT_CONTRACT_FORM_DATA_NAME = "contract";

Expand All @@ -32,4 +34,31 @@ public static FormItem retrieveContractFromFormData(FormData formData, File file
String.format(filename, StringUtils.stripAccents(productName.replaceAll("\\s+", "_")));



public String extractSurnamePart(String surname) {
String consonants = surname.replaceAll("[AEIOUaeiou]", "");
String vowels = surname.replaceAll("[^AEIOUaeiou]", "");
String part = (consonants + vowels).toUpperCase();
return part.length() >= 3 ? part.substring(0, 3) : padWithX(part);
}

public String extractNamePart(String name) {
String consonants = name.replaceAll("[AEIOUaeiou]", "");
String vowels = name.replaceAll("[^AEIOUaeiou]", "");
if (consonants.length() > 3) {
consonants = String.format("%s%s%s", consonants.charAt(0), consonants.charAt(2), consonants.charAt(3));
}
String part = (consonants + vowels).toUpperCase();
return part.length() >= 3 ? part.substring(0, 3) : padWithX(part);
}

private String padWithX(String input) {
StringBuilder sb = new StringBuilder(input);
while (sb.length() < 3) {
sb.append("X");
}
return sb.toString();
}


}
Loading

0 comments on commit 2e8ee17

Please sign in to comment.