From 76c7c2176108cca14ca1a011e346aabba01222b9 Mon Sep 17 00:00:00 2001 From: flaminiaScarciofolo <113031535+flaminiaScarciofolo@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:23:41 +0200 Subject: [PATCH] [SELC-5683] Feat: Added county city and zipCode in verify csv for APP IO (#521) --- apps/onboarding-ms/pom.xml | 6 + apps/onboarding-ms/src/main/docs/openapi.json | 315 +-------------- apps/onboarding-ms/src/main/docs/openapi.yaml | 217 +--------- .../controller/AggregatesController.java | 31 +- .../onboarding/mapper/OnboardingMapper.java | 32 +- .../{AggregateAppIo.java => Aggregate.java} | 5 +- .../onboarding/model/AggregateSend.java | 20 - .../GeographicTaxonomyFromIstatCode.java | 14 + .../selfcare/onboarding/model/RowError.java | 28 +- .../model/VerifyAggregateAppIoResponse.java | 15 - .../model/VerifyAggregateResponse.java | 10 +- .../model/VerifyAggregateSendResponse.java | 17 - .../onboarding/service/AggregatesService.java | 9 +- .../service/AggregatesServiceDefault.java | 375 +++++------------- .../onboarding/service/CsvService.java | 85 ++++ .../src/main/resources/application.properties | 1 + .../controller/AggregatesControllerTest.java | 43 +- .../mapper/OnboardingMapperTest.java | 23 +- .../model/CsvAggregatePagoPaTest.java | 78 ---- .../model/CsvAggregateSendTest.java | 87 ---- .../VerifyAggregateSendResponseTest.java | 68 ---- .../service/AggregatesServiceDefaultTest.java | 278 ++++++------- .../profile/OnboardingTestProfile.java | 3 +- .../src/test/resources/aggregates-appio.csv | 20 +- .../src/test/resources/application.properties | 2 + 25 files changed, 375 insertions(+), 1407 deletions(-) rename apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/{AggregateAppIo.java => Aggregate.java} (81%) delete mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateSend.java create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/GeographicTaxonomyFromIstatCode.java delete mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateAppIoResponse.java delete mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponse.java create mode 100644 apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/CsvService.java delete mode 100644 apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregatePagoPaTest.java delete mode 100644 apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregateSendTest.java delete mode 100644 apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponseTest.java diff --git a/apps/onboarding-ms/pom.xml b/apps/onboarding-ms/pom.xml index 2d4fdc383..83f065b6b 100644 --- a/apps/onboarding-ms/pom.xml +++ b/apps/onboarding-ms/pom.xml @@ -55,6 +55,12 @@ quarkus-junit5 test + + net.jodah + expiringmap + 0.5.10 + compile + io.quarkus quarkus-junit5-mockito diff --git a/apps/onboarding-ms/src/main/docs/openapi.json b/apps/onboarding-ms/src/main/docs/openapi.json index 6556b6b42..04a268251 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.json +++ b/apps/onboarding-ms/src/main/docs/openapi.json @@ -47,51 +47,6 @@ } } }, - "responses" : { - "200" : { - "description" : "OK", - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/VerifyAggregateAppIoResponse" - } - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "403" : { - "description" : "Not Allowed" - } - }, - "security" : [ { - "SecurityScheme" : [ ] - } ] - } - }, - "/v1/aggregates/verification/prod-pagopa" : { - "post" : { - "tags" : [ "Aggregates Controller" ], - "summary" : "Validate the data related to the aggregated entities present in a CSV file", - "description" : "Validates aggregated entity data specific to the PROD-Pagopa environment by processing the provided CSV file. This ensures that all entries meet the required criteria before further processing.", - "operationId" : "verifyPagoPaAggregatesCsv", - "requestBody" : { - "content" : { - "multipart/form-data" : { - "schema" : { - "required" : [ "aggregates" ], - "type" : "object", - "properties" : { - "aggregates" : { - "format" : "binary", - "type" : "string" - } - } - } - } - } - }, "responses" : { "200" : { "description" : "OK", @@ -115,51 +70,6 @@ } ] } }, - "/v1/aggregates/verification/prod-pn" : { - "post" : { - "tags" : [ "Aggregates Controller" ], - "summary" : "Validate the data related to the aggregated entities present in a CSV file", - "description" : "Validates aggregated entity data specific to the PROD-PN environment by processing the provided CSV file. This ensures that all entries meet the required criteria before further processing.", - "operationId" : "verifySendAggregatesCsv", - "requestBody" : { - "content" : { - "multipart/form-data" : { - "schema" : { - "required" : [ "aggregates" ], - "type" : "object", - "properties" : { - "aggregates" : { - "format" : "binary", - "type" : "string" - } - } - } - } - } - }, - "responses" : { - "200" : { - "description" : "OK", - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/VerifyAggregateSendResponse" - } - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "403" : { - "description" : "Not Allowed" - } - }, - "security" : [ { - "SecurityScheme" : [ ] - } ] - } - }, "/v1/notification/resend" : { "post" : { "tags" : [ "Notification Controller" ], @@ -1442,7 +1352,7 @@ } } }, - "AggregateAppIo" : { + "Aggregate" : { "type" : "object", "properties" : { "subunitCode" : { @@ -1466,6 +1376,15 @@ "address" : { "type" : "string" }, + "city" : { + "type" : "string" + }, + "county" : { + "type" : "string" + }, + "zipCode" : { + "type" : "string" + }, "originId" : { "type" : "string" }, @@ -1547,67 +1466,6 @@ } } }, - "AggregateSend" : { - "type" : "object", - "properties" : { - "description" : { - "type" : "string" - }, - "pec" : { - "type" : "string" - }, - "taxCode" : { - "type" : "string" - }, - "vatNumber" : { - "type" : "string" - }, - "codeSDI" : { - "type" : "string" - }, - "address" : { - "type" : "string" - }, - "city" : { - "type" : "string" - }, - "province" : { - "type" : "string" - }, - "subunitType" : { - "type" : "string" - }, - "subunitCode" : { - "type" : "string" - }, - "users" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AggregateUser" - } - } - } - }, - "AggregateUser" : { - "type" : "object", - "properties" : { - "name" : { - "type" : "string" - }, - "surname" : { - "type" : "string" - }, - "taxCode" : { - "type" : "string" - }, - "email" : { - "type" : "string" - }, - "role" : { - "type" : "string" - } - } - }, "BillingPaRequest" : { "type" : "object", "properties" : { @@ -1653,20 +1511,6 @@ } } }, - "DataProtectionOfficer" : { - "type" : "object", - "properties" : { - "address" : { - "type" : "string" - }, - "email" : { - "type" : "string" - }, - "pec" : { - "type" : "string" - } - } - }, "DataProtectionOfficerRequest" : { "type" : "object", "properties" : { @@ -1703,89 +1547,6 @@ } } }, - "Institution" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "string" - }, - "institutionType" : { - "$ref" : "#/components/schemas/InstitutionType" - }, - "taxCode" : { - "type" : "string" - }, - "subunitCode" : { - "type" : "string" - }, - "subunitType" : { - "$ref" : "#/components/schemas/InstitutionPaSubunitType" - }, - "origin" : { - "$ref" : "#/components/schemas/Origin" - }, - "originId" : { - "type" : "string" - }, - "city" : { - "type" : "string" - }, - "country" : { - "type" : "string" - }, - "county" : { - "type" : "string" - }, - "istatCode" : { - "type" : "string" - }, - "description" : { - "type" : "string" - }, - "digitalAddress" : { - "type" : "string" - }, - "address" : { - "type" : "string" - }, - "zipCode" : { - "type" : "string" - }, - "geographicTaxonomies" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/GeographicTaxonomy" - } - }, - "rea" : { - "type" : "string" - }, - "shareCapital" : { - "type" : "string" - }, - "businessRegisterPlace" : { - "type" : "string" - }, - "supportEmail" : { - "type" : "string" - }, - "supportPhone" : { - "type" : "string" - }, - "imported" : { - "type" : "boolean" - }, - "paymentServiceProvider" : { - "$ref" : "#/components/schemas/PaymentServiceProvider" - }, - "dataProtectionOfficer" : { - "$ref" : "#/components/schemas/DataProtectionOfficer" - }, - "parentDescription" : { - "type" : "string" - } - } - }, "InstitutionBaseRequest" : { "required" : [ "institutionType", "digitalAddress" ], "type" : "object", @@ -2477,26 +2238,6 @@ "enum" : [ "MANAGER", "DELEGATE", "SUB_DELEGATE", "OPERATOR", "ADMIN_EA" ], "type" : "string" }, - "PaymentServiceProvider" : { - "type" : "object", - "properties" : { - "abiCode" : { - "type" : "string" - }, - "businessRegisterNumber" : { - "type" : "string" - }, - "legalRegisterNumber" : { - "type" : "string" - }, - "legalRegisterName" : { - "type" : "string" - }, - "vatNumberGroup" : { - "type" : "boolean" - } - } - }, "PaymentServiceProviderRequest" : { "type" : "object", "properties" : { @@ -2650,47 +2391,13 @@ } } }, - "VerifyAggregateAppIoResponse" : { - "type" : "object", - "properties" : { - "aggregates" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AggregateAppIo" - } - }, - "errors" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RowError" - } - } - } - }, "VerifyAggregateResponse" : { "type" : "object", "properties" : { "aggregates" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/Institution" - } - }, - "errors" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/RowError" - } - } - } - }, - "VerifyAggregateSendResponse" : { - "type" : "object", - "properties" : { - "aggregates" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/AggregateSend" + "$ref" : "#/components/schemas/Aggregate" } }, "errors" : { diff --git a/apps/onboarding-ms/src/main/docs/openapi.yaml b/apps/onboarding-ms/src/main/docs/openapi.yaml index ea22186e1..f0bca40be 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.yaml +++ b/apps/onboarding-ms/src/main/docs/openapi.yaml @@ -26,40 +26,6 @@ paths: by processing the provided CSV file. This ensures that all entries meet the required criteria before further processing. operationId: verifyAppIoAggregatesCsv - requestBody: - content: - multipart/form-data: - schema: - required: - - aggregates - type: object - properties: - aggregates: - format: binary - type: string - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/VerifyAggregateAppIoResponse" - "401": - description: Not Authorized - "403": - description: Not Allowed - security: - - SecurityScheme: [] - /v1/aggregates/verification/prod-pagopa: - post: - tags: - - Aggregates Controller - summary: Validate the data related to the aggregated entities present in a CSV - file - description: Validates aggregated entity data specific to the PROD-Pagopa environment - by processing the provided CSV file. This ensures that all entries meet the - required criteria before further processing. - operationId: verifyPagoPaAggregatesCsv requestBody: content: multipart/form-data: @@ -84,40 +50,6 @@ paths: description: Not Allowed security: - SecurityScheme: [] - /v1/aggregates/verification/prod-pn: - post: - tags: - - Aggregates Controller - summary: Validate the data related to the aggregated entities present in a CSV - file - description: Validates aggregated entity data specific to the PROD-PN environment - by processing the provided CSV file. This ensures that all entries meet the - required criteria before further processing. - operationId: verifySendAggregatesCsv - requestBody: - content: - multipart/form-data: - schema: - required: - - aggregates - type: object - properties: - aggregates: - format: binary - type: string - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/VerifyAggregateSendResponse" - "401": - description: Not Authorized - "403": - description: Not Allowed - security: - - SecurityScheme: [] /v1/notification/resend: post: tags: @@ -1058,7 +990,7 @@ components: type: string otherNote: type: string - AggregateAppIo: + Aggregate: type: object properties: subunitCode: @@ -1075,6 +1007,12 @@ components: type: string address: type: string + city: + type: string + county: + type: string + zipCode: + type: string originId: type: string origin: @@ -1130,46 +1068,6 @@ components: type: string syncAsyncMode: type: string - AggregateSend: - type: object - properties: - description: - type: string - pec: - type: string - taxCode: - type: string - vatNumber: - type: string - codeSDI: - type: string - address: - type: string - city: - type: string - province: - type: string - subunitType: - type: string - subunitCode: - type: string - users: - type: array - items: - $ref: "#/components/schemas/AggregateUser" - AggregateUser: - type: object - properties: - name: - type: string - surname: - type: string - taxCode: - type: string - email: - type: string - role: - type: string BillingPaRequest: type: object properties: @@ -1199,15 +1097,6 @@ components: type: string publicServices: type: boolean - DataProtectionOfficer: - type: object - properties: - address: - type: string - email: - type: string - pec: - type: string DataProtectionOfficerRequest: type: object properties: @@ -1231,61 +1120,6 @@ components: type: string desc: type: string - Institution: - type: object - properties: - id: - type: string - institutionType: - $ref: "#/components/schemas/InstitutionType" - taxCode: - type: string - subunitCode: - type: string - subunitType: - $ref: "#/components/schemas/InstitutionPaSubunitType" - origin: - $ref: "#/components/schemas/Origin" - originId: - type: string - city: - type: string - country: - type: string - county: - type: string - istatCode: - type: string - description: - type: string - digitalAddress: - type: string - address: - type: string - zipCode: - type: string - geographicTaxonomies: - type: array - items: - $ref: "#/components/schemas/GeographicTaxonomy" - rea: - type: string - shareCapital: - type: string - businessRegisterPlace: - type: string - supportEmail: - type: string - supportPhone: - type: string - imported: - type: boolean - paymentServiceProvider: - $ref: "#/components/schemas/PaymentServiceProvider" - dataProtectionOfficer: - $ref: "#/components/schemas/DataProtectionOfficer" - parentDescription: - type: string InstitutionBaseRequest: required: - institutionType @@ -1818,19 +1652,6 @@ components: - OPERATOR - ADMIN_EA type: string - PaymentServiceProvider: - type: object - properties: - abiCode: - type: string - businessRegisterNumber: - type: string - legalRegisterNumber: - type: string - legalRegisterName: - type: string - vatNumberGroup: - type: boolean PaymentServiceProviderRequest: type: object properties: @@ -1939,35 +1760,13 @@ components: $ref: "#/components/schemas/PartyRole" productRole: type: string - VerifyAggregateAppIoResponse: - type: object - properties: - aggregates: - type: array - items: - $ref: "#/components/schemas/AggregateAppIo" - errors: - type: array - items: - $ref: "#/components/schemas/RowError" VerifyAggregateResponse: type: object properties: aggregates: type: array items: - $ref: "#/components/schemas/Institution" - errors: - type: array - items: - $ref: "#/components/schemas/RowError" - VerifyAggregateSendResponse: - type: object - properties: - aggregates: - type: array - items: - $ref: "#/components/schemas/AggregateSend" + $ref: "#/components/schemas/Aggregate" errors: type: array items: diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/AggregatesController.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/AggregatesController.java index 08c401460..6bd9f5868 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/AggregatesController.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/AggregatesController.java @@ -2,9 +2,7 @@ import io.quarkus.security.Authenticated; import io.smallrye.mutiny.Uni; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateAppIoResponse; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateResponse; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateSendResponse; +import it.pagopa.selfcare.onboarding.model.*; import it.pagopa.selfcare.onboarding.service.AggregatesService; import jakarta.inject.Inject; import jakarta.validation.constraints.NotNull; @@ -34,36 +32,11 @@ public class AggregatesController { @Path("/verification/prod-io") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.MULTIPART_FORM_DATA) - public Uni verifyAppIoAggregatesCsv(@NotNull @RestForm("aggregates") File file){ + public Uni verifyAppIoAggregatesCsv(@NotNull @RestForm("aggregates") File file){ return aggregatesService.validateAppIoAggregatesCsv(file); } - @Operation( - summary = "Validate the data related to the aggregated entities present in a CSV file", - description = "Validates aggregated entity data specific to the PROD-PN environment by processing the provided CSV file. This ensures that all entries meet the required criteria before further processing." - ) - @POST - @Path("/verification/prod-pn") - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.MULTIPART_FORM_DATA) - public Uni verifySendAggregatesCsv(@NotNull @RestForm("aggregates") File file){ - - return aggregatesService.validateSendAggregatesCsv(file); - } - - @Operation( - summary = "Validate the data related to the aggregated entities present in a CSV file", - description = "Validates aggregated entity data specific to the PROD-Pagopa environment by processing the provided CSV file. This ensures that all entries meet the required criteria before further processing." - ) - @POST - @Path("/verification/prod-pagopa") - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.MULTIPART_FORM_DATA) - public Uni verifyPagoPaAggregatesCsv(@NotNull @RestForm("aggregates") File file){ - - return aggregatesService.validatePagoPaAggregatesCsv(file); - } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java index d13224d4b..66d5f8928 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java @@ -8,10 +8,7 @@ import it.pagopa.selfcare.onboarding.entity.Onboarding; import it.pagopa.selfcare.onboarding.entity.User; import it.pagopa.selfcare.onboarding.model.*; -import org.mapstruct.Context; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; +import org.mapstruct.*; import org.openapi.quarkus.onboarding_functions_json.model.PartyRole; import java.time.OffsetDateTime; @@ -117,33 +114,10 @@ default OffsetDateTime toOffsetDateTime(java.time.LocalDateTime localDateTime) { return localDateTime.atOffset(java.time.ZoneOffset.UTC); } - @Mapping(target = "errors", source = "rowErrorList") - @Mapping(target = "aggregates", source = "validAggregates") - VerifyAggregateResponse toVerifyAggregateResponse(AggregatesCsv aggregatesCsv); + Aggregate csvToAggregateAppIo(CsvAggregateAppIo csvAggregateAppIo); - @Mapping(target = "errors", source = "rowErrorList") - @Mapping(target = "aggregates", source = "validAggregates") - VerifyAggregateAppIoResponse toVerifyAggregateAppIoResponse(AggregatesCsv aggregatesCsv); - @Mapping(target = "errors", source = "rowErrorList") - @Mapping(target = "aggregates", source = "validAggregates") - VerifyAggregateSendResponse toVerifyAggregateSendResponse(AggregatesCsv aggregatesCsv); - - @Mapping(target = "users", source = ".") - AggregateSend csvToAggregateSend(CsvAggregateSend csvAggregateSend); - - AggregateAppIo csvToAggregateAppIo(CsvAggregateAppIo csvAggregateIo); - - default List mapCsvAggregatesToAggregates(List csvAggregateSendList) { - if (csvAggregateSendList == null) { - return null; - } - return csvAggregateSendList.stream() - .map(this::csvToAggregateSend) - .collect(Collectors.toList()); - } - - default List mapCsvAppIoAggregatesToAggregates(List csvAggregateAppIoList) { + default List mapCsvAppIoAggregatesToAggregates(List csvAggregateAppIoList) { if (csvAggregateAppIoList == null) { return Collections.emptyList(); } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateAppIo.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/Aggregate.java similarity index 81% rename from apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateAppIo.java rename to apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/Aggregate.java index 6d45daeb8..a96ab2369 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateAppIo.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/Aggregate.java @@ -4,7 +4,7 @@ import wiremock.com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Data -public class AggregateAppIo { +public class Aggregate { private String subunitCode; private String subunitType; private String description; @@ -12,6 +12,9 @@ public class AggregateAppIo { private String taxCode; private String vatNumber; private String address; + private String city; + private String county; + private String zipCode; private String originId; private String origin; diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateSend.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateSend.java deleted file mode 100644 index 8b3564ab5..000000000 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/AggregateSend.java +++ /dev/null @@ -1,20 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import lombok.Data; - -import java.util.List; - -@Data -public class AggregateSend { - private String description; - private String pec; - private String taxCode; - private String vatNumber; - private String codeSDI; - private String address; - private String city; - private String province; - private String subunitType; - private String subunitCode; - private List users; -} \ No newline at end of file diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/GeographicTaxonomyFromIstatCode.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/GeographicTaxonomyFromIstatCode.java new file mode 100644 index 000000000..b7323ed25 --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/GeographicTaxonomyFromIstatCode.java @@ -0,0 +1,14 @@ +package it.pagopa.selfcare.onboarding.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class GeographicTaxonomyFromIstatCode { + + private String city; + private String county; +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/RowError.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/RowError.java index 46ed9747b..db9514f7f 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/RowError.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/RowError.java @@ -1,7 +1,11 @@ package it.pagopa.selfcare.onboarding.model; import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.ToString; +@ToString +@Data public class RowError { @NotNull private Integer row; @@ -14,28 +18,4 @@ public RowError(Integer row, String cf, String reason) { this.cf = cf; this.reason = reason; } - - public Integer getRow() { - return row; - } - - public void setRow(Integer row) { - this.row = row; - } - - public String getCf() { - return cf; - } - - public void setCf(String cf) { - this.cf = cf; - } - - public String getReason() { - return reason; - } - - public void setReason(String reason) { - this.reason = reason; - } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateAppIoResponse.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateAppIoResponse.java deleted file mode 100644 index 8cc05eaf4..000000000 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateAppIoResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; -@Data -@AllArgsConstructor -@NoArgsConstructor - -public class VerifyAggregateAppIoResponse { - private List aggregates; - private List errors; -} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateResponse.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateResponse.java index e8a032d80..ff071a182 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateResponse.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateResponse.java @@ -1,18 +1,14 @@ package it.pagopa.selfcare.onboarding.model; -import it.pagopa.selfcare.onboarding.entity.Institution; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.List; @Data -@AllArgsConstructor -@NoArgsConstructor public class VerifyAggregateResponse { + private List aggregates = new ArrayList<>(); + private List errors = new ArrayList<>(); - private List aggregates; - private List errors; } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponse.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponse.java deleted file mode 100644 index e86dd5f86..000000000 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class VerifyAggregateSendResponse { - - private List aggregates; - private List errors; - -} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesService.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesService.java index c23d7932e..5716ebb2a 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesService.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesService.java @@ -1,17 +1,12 @@ package it.pagopa.selfcare.onboarding.service; import io.smallrye.mutiny.Uni; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateAppIoResponse; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateResponse; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateSendResponse; +import it.pagopa.selfcare.onboarding.model.*; import java.io.File; public interface AggregatesService { - Uni validateAppIoAggregatesCsv (File file); + Uni validateAppIoAggregatesCsv (File file); - Uni validateSendAggregatesCsv (File file); - - Uni validatePagoPaAggregatesCsv (File file); } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefault.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefault.java index c63ee21c6..4bfb7b27f 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefault.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefault.java @@ -1,8 +1,5 @@ package it.pagopa.selfcare.onboarding.service; -import com.opencsv.bean.CsvToBean; -import com.opencsv.bean.CsvToBeanBuilder; -import com.opencsv.enums.CSVReaderNullFieldIndicator; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType; @@ -14,26 +11,25 @@ import jakarta.inject.Inject; import jakarta.ws.rs.WebApplicationException; import lombok.extern.slf4j.Slf4j; +import net.jodah.expiringmap.ExpiringMap; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.jboss.logging.Logger; 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.AOOResource; import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource; import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; -import java.io.BufferedReader; import java.io.File; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.TimeUnit; -import static com.opencsv.ICSVParser.DEFAULT_QUOTE_CHARACTER; +import static it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType.UO; @ApplicationScoped @Slf4j @@ -41,10 +37,6 @@ public class AggregatesServiceDefault implements AggregatesService { private static final Logger LOG = Logger.getLogger(AggregatesServiceDefault.class); - - @Inject - OnboardingMapper onboardingMapper; - @RestClient @Inject AooApi aooApi; @@ -57,204 +49,161 @@ public class AggregatesServiceDefault implements AggregatesService { @Inject UoApi uoApi; - public static final String ERROR_READING_CSV = "Error reading CSV: "; - public static final String MALFORMED_ROW = "Riga malformata"; + @RestClient + @Inject + GeographicTaxonomiesApi geographicTaxonomiesApi; + + @Inject + OnboardingMapper onboardingMapper; + + @Inject + CsvService csvService; + + private final ExpiringMap expiringMap; + + public AggregatesServiceDefault (){ + this.expiringMap = ExpiringMap.builder() + .expiration(30, TimeUnit.MINUTES) + .build(); + } + + 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_DESCRIPTION = "La ragione sociale è obbligatoria"; 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_ADDRESS = "Indirizzo è obbligatorio"; - public static final String ERROR_CITY = "La città è obbligatoria"; - public static final String ERROR_PROVINCE = "La provincia è obbligatoria"; - public static final String ERROR_PEC = "Indirizzo PEC è obbligatorio"; - 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"; - public static final String ERROR_ADMIN_TAXCODE = "Codice Fiscale Amministratore Ente Aggregato è obbligatorio"; - public static final String ERROR_AGGREGATE_NAME_PT = "Ragine Sociale Partner Tecnologico è obbligatorio"; - public static final String ERROR_TAXCODE_PT = "Codice Fiscale Partner Tecnologico è obbligatorio"; - public static final String ERROR_IBAN = "IBAN è obbligatorio"; - public static final String ERROR_SERVICE = "Servizio è obbligatorio"; - public static final String ERROR_SYNC_ASYNC_MODE = "Modalità Sincrona/Asincrona è obbligatorio"; - private static final String ERROR_IPA_CODE = "Codice IPA è obbligatorio in caso di ente centrale"; + private static final String PEC = "Pec"; @Override - public Uni validateAppIoAggregatesCsv(File file) { - AggregatesCsv aggregatesCsv = readItemsFromCsv(file, CsvAggregateAppIo.class); + public Uni validateAppIoAggregatesCsv(File file) { + AggregatesCsv aggregatesCsv = csvService.readItemsFromCsv(file, CsvAggregateAppIo.class); List csvAggregates = aggregatesCsv.getCsvAggregateList(); - VerifyAggregateAppIoResponse verifyAggregateAppIoResponse = new VerifyAggregateAppIoResponse(); - verifyAggregateAppIoResponse.setAggregates(new ArrayList<>()); - verifyAggregateAppIoResponse.setErrors(new ArrayList<>()); + VerifyAggregateResponse verifyAggregateAppIoResponse = new VerifyAggregateResponse(); return Multi.createFrom().iterable(csvAggregates) - .onItem().transformToUniAndMerge(csvAggregateAppIo -> checkCsvAggregateAppIoAndFillAggregateOrErrorList(csvAggregateAppIo, verifyAggregateAppIoResponse)) + .onItem().transformToUniAndMerge(csvAggregateAppIo -> + checkCsvAggregateAppIoAndFillAggregateOrErrorList(csvAggregateAppIo, verifyAggregateAppIoResponse)) .collect().asList() .replaceWith(verifyAggregateAppIoResponse) - .onItem().invoke(() -> LOG.infof("CSV file validated end: %s valid row and %s invalid row", + .onItem().invoke(() -> LOG.infof(LOG_CSV_ROWS, verifyAggregateAppIoResponse.getAggregates().size(), verifyAggregateAppIoResponse.getErrors().size())); } - @Override - public Uni validateSendAggregatesCsv(File file) { - AggregatesCsv aggregatesCsv = readItemsFromCsv(file, CsvAggregateSend.class); - List csvAggregates = aggregatesCsv.getCsvAggregateList(); - return Multi.createFrom().iterable(csvAggregates) - .onItem().transformToUniAndMerge(csvAggregate -> checkCsvAggregateSendAndFillAggregateOrErrorList(csvAggregate, aggregatesCsv)) - .collect().asList() - .onItem().transform(list -> onboardingMapper.toVerifyAggregateSendResponse(aggregatesCsv)) - .onItem().invoke(() -> LOG.infof("CSV file validated end: %s valid row and %s invalid row", - aggregatesCsv.getValidAggregates().size(), - aggregatesCsv.getRowErrorList().size())); - } - @Override - public Uni validatePagoPaAggregatesCsv(File file) { - AggregatesCsv aggregatesCsv = readItemsFromCsv(file, CsvAggregatePagoPa.class); - List csvAggregates = aggregatesCsv.getCsvAggregateList(); - return Multi.createFrom().iterable(csvAggregates) - .onItem().transformToUniAndMerge(csvAggregate -> checkCsvAggregatePagoPaAndFillAggregateOrErrorList(csvAggregate, aggregatesCsv)) - .collect().asList() - .onItem().transform(list -> onboardingMapper.toVerifyAggregateResponse(aggregatesCsv)) - .onItem().invoke(() -> LOG.infof("CSV file validated end: %s valid row and %s invalid row", - aggregatesCsv.getValidAggregates().size(), - aggregatesCsv.getRowErrorList().size())); - } - - private Uni checkCsvAggregateAppIoAndFillAggregateOrErrorList(CsvAggregateAppIo csvAggregateAppIo, VerifyAggregateAppIoResponse verifyAggregateAppIoResponse) { + private Uni checkCsvAggregateAppIoAndFillAggregateOrErrorList(CsvAggregateAppIo csvAggregateAppIo, VerifyAggregateResponse verifyAggregateAppIoResponse) { return checkCsvAggregateAppIo(csvAggregateAppIo) .onItem().invoke(aggregateAppIo -> verifyAggregateAppIoResponse.getAggregates().add(aggregateAppIo)) .onFailure(ResourceNotFoundException.class) .recoverWithUni(throwable -> { - verifyAggregateAppIoResponse.getErrors().add(mapToAppIoErrorRow(csvAggregateAppIo, throwable)); + verifyAggregateAppIoResponse.getErrors().add(mapToErrorRow(csvAggregateAppIo.getRowNumber(), csvAggregateAppIo.getTaxCode(), throwable)); return Uni.createFrom().nullItem(); }) .onFailure(InvalidRequestException.class) .recoverWithUni(throwable -> { - verifyAggregateAppIoResponse.getErrors().add(mapToAppIoErrorRow(csvAggregateAppIo, throwable)); + verifyAggregateAppIoResponse.getErrors().add(mapToErrorRow(csvAggregateAppIo.getRowNumber(), csvAggregateAppIo.getTaxCode(), throwable)); return Uni.createFrom().nullItem(); }) .replaceWithVoid(); } - private Uni checkCsvAggregateSendAndFillAggregateOrErrorList(Csv csv, AggregatesCsv aggregatesCsvResponse) { - CsvAggregateSend csvAggregate = (CsvAggregateSend) csv; - return checkCsvAggregateSend(csvAggregate) - .onItem().invoke(() -> aggregatesCsvResponse.getValidAggregates().add(csvAggregate)) - .onFailure(ResourceNotFoundException.class).recoverWithUni(throwable -> mapToErrorRow(csvAggregate, throwable, aggregatesCsvResponse)) - .onFailure(InvalidRequestException.class).recoverWithUni(throwable -> mapToErrorRow(csvAggregate, throwable, aggregatesCsvResponse)); - } - - private Uni checkCsvAggregatePagoPaAndFillAggregateOrErrorList(Csv csv, AggregatesCsv aggregatesCsv) { - CsvAggregatePagoPa csvAggregate = (CsvAggregatePagoPa) csv; - - return checkCsvAggregatePagoPa(csvAggregate) - .onItem().invoke(() -> aggregatesCsv.getValidAggregates().add(csvAggregate)) - .onFailure(ResourceNotFoundException.class).recoverWithUni(throwable -> mapToErrorRow(csvAggregate, throwable, aggregatesCsv)) - .onFailure(InvalidRequestException.class).recoverWithUni(throwable -> mapToErrorRow(csvAggregate, throwable, aggregatesCsv)); - } - - private static RowError mapToAppIoErrorRow(CsvAggregateAppIo csvAggregateAppIo, Throwable throwable) { - return new RowError(csvAggregateAppIo.getRowNumber(), csvAggregateAppIo.getTaxCode(), throwable.getMessage()); + private static RowError mapToErrorRow(Integer rowNumber, String taxCode, Throwable throwable) { + return new RowError(rowNumber, taxCode, throwable.getMessage()); } - private static Uni mapToErrorRow(Csv csv, Throwable throwable, AggregatesCsv aggregatesCsv) { - CsvAggregateAppIo csvAggregateAppIo = (CsvAggregateAppIo) csv; - aggregatesCsv.getRowErrorList().add(new RowError(csvAggregateAppIo.getRowNumber(), csvAggregateAppIo.getTaxCode(), throwable.getMessage())); - return Uni.createFrom().voidItem(); - } - - private Uni checkCsvAggregateAppIo(CsvAggregateAppIo csvAggregateAppIo) { + private Uni checkCsvAggregateAppIo(CsvAggregateAppIo csvAggregateAppIo) { return checkRequiredFieldsAppIo(csvAggregateAppIo) - .onItem().transformToUni(unused -> retrieveDataFromIpa(csvAggregateAppIo)); - } - - private Uni checkCsvAggregateSend(CsvAggregateSend csvAggregate) { - return checkRequiredFieldsSend(csvAggregate) - .onItem().transformToUni(unused -> checkSubunitTypeSend(csvAggregate)); - } - - private Uni checkCsvAggregatePagoPa(CsvAggregatePagoPa csvAggregate) { - return checkRequiredFieldsPagoPa(csvAggregate); + .onItem().transformToUni(unused -> retrieveDataFromIpa(onboardingMapper.csvToAggregateAppIo(csvAggregateAppIo))); } - private Uni retrieveDataFromIpa(CsvAggregateAppIo csvAggregateAppIo) { - AggregateAppIo aggregateAppIo = onboardingMapper.csvToAggregateAppIo(csvAggregateAppIo); - aggregateAppIo.setOrigin(InstitutionResource.OriginEnum.IPA.value()); + private Uni retrieveDataFromIpa(Aggregate aggregate) { + aggregate.setOrigin(InstitutionResource.OriginEnum.IPA.value()); - if (StringUtils.isEmpty(aggregateAppIo.getSubunitType())) { - return institutionApi.findInstitutionUsingGET(csvAggregateAppIo.getTaxCode(), null, null) + if (Objects.isNull(aggregate.getSubunitType())){ + return institutionApi.findInstitutionUsingGET(aggregate.getTaxCode(), null, null) .onFailure(this::checkIfNotFound).recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .onItem().transform(institutionResource -> mapIpaFieldForPA(institutionResource, aggregateAppIo)); - } else if (InstitutionPaSubunitType.AOO.name().equals(aggregateAppIo.getSubunitType())) { - return aooApi.findByUnicodeUsingGET(aggregateAppIo.getSubunitCode(), null) + .onItem().transformToUni(institutionResource -> retrieveCityCountyAndMapIpaFieldForPA(institutionResource, aggregate)); + } else if (InstitutionPaSubunitType.AOO.name().equalsIgnoreCase(aggregate.getSubunitType())) { + return aooApi.findByUnicodeUsingGET(aggregate.getSubunitCode(), null) .onFailure(this::checkIfNotFound) .recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .onItem().transform(aooResource -> mapIpaFieldForAOO(aooResource, aggregateAppIo)); - } else if (InstitutionPaSubunitType.UO.name().equals(aggregateAppIo.getSubunitType())) { - return uoApi.findByUnicodeUsingGET1(aggregateAppIo.getSubunitCode(), null) + .onItem().transformToUni(aooResource -> retrieveCityCountyAndMapIpaFieldForAOO(aooResource, aggregate)); + } else if (UO.name().equalsIgnoreCase(aggregate.getSubunitType())) { + return uoApi.findByUnicodeUsingGET1(aggregate.getSubunitCode(), null) .onFailure(this::checkIfNotFound) .recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .onItem().transform(uoResource -> mapIpaFieldForUO(uoResource, aggregateAppIo)); + .onItem().transformToUni(uoResource -> retrieveCityCountyAndMapIpaFieldForUO(uoResource, aggregate)); } else { return Uni.createFrom().failure(new InvalidRequestException(ERROR_SUBUNIT_TYPE)); } } - private AggregateAppIo mapIpaFieldForUO(UOResource uoResource, AggregateAppIo aggregateAppIo) { - if (Objects.equals(uoResource.getTipoMail1(), "Pec")) { - aggregateAppIo.setDigitalAddress(uoResource.getMail1()); - } - aggregateAppIo.setDescription(uoResource.getDenominazioneEnte()); - aggregateAppIo.setAddress(uoResource.getIndirizzo()); - aggregateAppIo.setOriginId(uoResource.getCodiceIpa()); - return aggregateAppIo; + private Uni retrieveCityCountyAndMapIpaFieldForUO(UOResource uoResource, Aggregate aggregateAppIo) { + return retrieveGeographicTaxonomies(uoResource.getCodiceComuneISTAT()) + .onItem().transformToUni(geographicTaxonomyResource -> { + mapIpaField(uoResource.getDenominazioneEnte(), uoResource.getIndirizzo(), uoResource.getCap(), null, aggregateAppIo, geographicTaxonomyResource); + return retrieveDigitalAddress(uoResource.getTipoMail1(), uoResource.getMail1(), uoResource.getCodiceFiscaleEnte(), aggregateAppIo); + }); } - private AggregateAppIo mapIpaFieldForAOO(AOOResource aooResource, AggregateAppIo aggregateAppIo) { - if (Objects.equals(aooResource.getTipoMail1(), "Pec")) { - aggregateAppIo.setDigitalAddress(aooResource.getMail1()); - } - aggregateAppIo.setDescription(aooResource.getDenominazioneEnte()); - aggregateAppIo.setAddress(aooResource.getIndirizzo()); - aggregateAppIo.setOriginId(aooResource.getCodiceIpa()); - return aggregateAppIo; + private Uni retrieveCityCountyAndMapIpaFieldForAOO(AOOResource aooResource, Aggregate aggregateAppIo) { + return retrieveGeographicTaxonomies(aooResource.getCodiceComuneISTAT()) + .onItem().transformToUni(geographicTaxonomyResource -> { + mapIpaField(aooResource.getDenominazioneEnte(), aooResource.getIndirizzo(), aooResource.getCap(), null, aggregateAppIo, geographicTaxonomyResource); + return retrieveDigitalAddress(aooResource.getTipoMail1(), aooResource.getMail1(), aooResource.getCodiceFiscaleEnte(), aggregateAppIo); + }); } - private AggregateAppIo mapIpaFieldForPA(InstitutionResource institutionResource, AggregateAppIo aggregateAppIo) { - aggregateAppIo.setDigitalAddress(institutionResource.getDigitalAddress()); - aggregateAppIo.setDescription(institutionResource.getDescription()); - aggregateAppIo.setAddress(institutionResource.getAddress()); - aggregateAppIo.setOriginId(institutionResource.getOriginId()); - return aggregateAppIo; + private Uni retrieveCityCountyAndMapIpaFieldForPA(InstitutionResource institutionResource, Aggregate aggregateAppIo) { + return retrieveGeographicTaxonomies(institutionResource.getIstatCode()) + .onItem().transform(geographicTaxonomyResource -> { + mapIpaField(institutionResource.getDescription(), institutionResource.getAddress(), institutionResource.getZipCode(), institutionResource.getOriginId(), aggregateAppIo, geographicTaxonomyResource); + aggregateAppIo.setDigitalAddress(institutionResource.getDigitalAddress()); + return aggregateAppIo; + }); } - private Uni checkSubunitTypeSend(CsvAggregateSend csvAggregate) { - - if (StringUtils.isEmpty(csvAggregate.getSubunitType())) { - return institutionApi.findInstitutionUsingGET(csvAggregate.getTaxCode(), null, null) - .onFailure(this::checkIfNotFound).recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .replaceWith(Uni.createFrom().voidItem()); - } else if (InstitutionPaSubunitType.AOO.name().equals(csvAggregate.getSubunitType())) { - return aooApi.findByUnicodeUsingGET(csvAggregate.getSubunitCode(), null) - .onFailure(this::checkIfNotFound).recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .replaceWith(Uni.createFrom().voidItem()); - } else if (InstitutionPaSubunitType.UO.name().equals(csvAggregate.getSubunitType())) { - return uoApi.findByUnicodeUsingGET1(csvAggregate.getSubunitCode(), null) - .onFailure(this::checkIfNotFound).recoverWithUni(Uni.createFrom().failure(new ResourceNotFoundException(ERROR_IPA))) - .replaceWith(Uni.createFrom().voidItem()); + private Uni retrieveDigitalAddress(String mailType, String mail, String taxCode, Aggregate aggregateAppIo) { + if (Objects.equals(mailType, PEC)) { + aggregateAppIo.setDigitalAddress(mail); + return Uni.createFrom().item(aggregateAppIo); } else { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_SUBUNIT_TYPE)); + return institutionApi.findInstitutionUsingGET(taxCode, null, null) + .onItem().invoke(institutionResource -> aggregateAppIo.setDigitalAddress(institutionResource.getDigitalAddress())) + .replaceWith(aggregateAppIo); } } + private static void mapIpaField(String description, String address, String zipCode, String originId, Aggregate aggregateAppIo, GeographicTaxonomyFromIstatCode geographicTaxonomyFromIstatCode) { + if(Objects.nonNull(geographicTaxonomyFromIstatCode)) { + aggregateAppIo.setCounty(geographicTaxonomyFromIstatCode.getCounty()); + aggregateAppIo.setCity(geographicTaxonomyFromIstatCode.getCity()); + } + aggregateAppIo.setDescription(description); + aggregateAppIo.setAddress(address); + aggregateAppIo.setZipCode(zipCode); + aggregateAppIo.setOriginId(originId); + } + + private Uni retrieveGeographicTaxonomies(String codiceIstat) { + GeographicTaxonomyFromIstatCode geographicTaxonomyFromIstatCode = expiringMap.get(codiceIstat); + + if (Objects.isNull(geographicTaxonomyFromIstatCode)) { + return geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(codiceIstat) + .map(geographicTaxonomyResource -> GeographicTaxonomyFromIstatCode.builder() + .city(Optional.ofNullable(geographicTaxonomyResource.getDesc()).orElse("").replace(DESCRIPTION_TO_REPLACE_REGEX, "")) + .county(geographicTaxonomyResource.getProvinceAbbreviation()) + .build()) + .onItem().invoke(entity -> expiringMap.put(codiceIstat, entity)); + } + return Uni.createFrom().item(geographicTaxonomyFromIstatCode); + } + private boolean checkIfNotFound(Throwable throwable) { return throwable instanceof WebApplicationException webApplicationException && webApplicationException.getResponse().getStatus() == 404; } @@ -271,126 +220,4 @@ private Uni checkRequiredFieldsAppIo(CsvAggregateAppIo csvAggregateAppIo) } return Uni.createFrom().voidItem(); } - - private Uni checkRequiredFieldsSend(CsvAggregateSend csvAggregate) { - - if (StringUtils.isEmpty(csvAggregate.getDescription())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_DESCRIPTION)); - } else if (StringUtils.isEmpty(csvAggregate.getPec())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_PEC)); - } - if (StringUtils.isEmpty(csvAggregate.getTaxCode())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_TAXCODE)); - } else if (StringUtils.isEmpty(csvAggregate.getVatNumber())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_VATNUMBER)); - } else if (StringUtils.isEmpty(csvAggregate.getAddress())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADDRESS)); - } else if (StringUtils.isEmpty(csvAggregate.getCity())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_CITY)); - } else if (StringUtils.isEmpty(csvAggregate.getProvince())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_PROVINCE)); - } else if ((StringUtils.isEmpty(csvAggregate.getSubunitType()) && StringUtils.isNotEmpty(csvAggregate.getSubunitCode())) - || (StringUtils.isNotEmpty(csvAggregate.getSubunitType()) && StringUtils.isEmpty(csvAggregate.getSubunitCode()))) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_AOO_UO)); - } else if (StringUtils.isEmpty(csvAggregate.getAdminAggregateName())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_NAME)); - } else if (StringUtils.isEmpty(csvAggregate.getAdminAggregateSurname())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_SURNAME)); - } else if (StringUtils.isEmpty(csvAggregate.getAdminAggregateTaxCode())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_TAXCODE)); - } else if (StringUtils.isEmpty(csvAggregate.getAdminAggregateEmail())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADMIN_EMAIL)); - } else if ((StringUtils.isEmpty(csvAggregate.getSubunitType()) && StringUtils.isEmpty(csvAggregate.getSubunitCode())) - && (StringUtils.isEmpty(csvAggregate.getIpaCode()))) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_IPA_CODE)); - } - return Uni.createFrom().voidItem(); - } - - private Uni checkRequiredFieldsPagoPa(CsvAggregatePagoPa csvAggregate) { - - if (StringUtils.isEmpty(csvAggregate.getDescription())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_DESCRIPTION)); - } else if (StringUtils.isEmpty(csvAggregate.getPec())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_PEC)); - } - if (StringUtils.isEmpty(csvAggregate.getTaxCode())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_TAXCODE)); - } else if (StringUtils.isEmpty(csvAggregate.getVatNumber())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_VATNUMBER)); - } else if (StringUtils.isEmpty(csvAggregate.getAddress())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_ADDRESS)); - } else if (StringUtils.isEmpty(csvAggregate.getCity())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_CITY)); - } else if (StringUtils.isEmpty(csvAggregate.getProvince())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_PROVINCE)); - } else if (StringUtils.isEmpty(csvAggregate.getAggragateNamePT())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_AGGREGATE_NAME_PT)); - } else if (StringUtils.isEmpty(csvAggregate.getTaxCodePT())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_TAXCODE_PT)); - } else if (StringUtils.isEmpty(csvAggregate.getIban())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_IBAN)); - } else if (StringUtils.isEmpty(csvAggregate.getService())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_SERVICE)); - } else if (StringUtils.isEmpty(csvAggregate.getSyncAsyncMode())) { - return Uni.createFrom().failure(new InvalidRequestException(ERROR_SYNC_ASYNC_MODE)); - } - return Uni.createFrom().voidItem(); - } - - public AggregatesCsv readItemsFromCsv(File file, Class csv) { - List resultList = new ArrayList<>(); - List errors = new ArrayList<>(); - - try { - byte[] fileBytes = Files.readAllBytes(file.toPath()); - StringReader stringReader = new StringReader(new String(fileBytes, StandardCharsets.UTF_8)); - BufferedReader bufferedReader = new BufferedReader(stringReader); - String skip = bufferedReader.readLine(); - log.info("Skip header: " + skip); - int lineNumber = 1; - String nextLine; - - while ((nextLine = bufferedReader.readLine()) != null) { - if (!nextLine.startsWith("(*")) { - parseLine(nextLine, lineNumber, resultList, errors, csv); - lineNumber++; - } - } - - return new AggregatesCsv(resultList, errors); - - } catch (Exception e) { - log.error(ERROR_READING_CSV + e.getMessage(), e); - throw new InvalidRequestException(ERROR_READING_CSV + e.getMessage()); - } - } - - private void parseLine(String nextLine, int lineNumber, List resultList, List errors, Class csv) { - try { - StringReader lineReader = new StringReader(nextLine); - CsvToBean csvToBean = getAggregateCsvToBean(new BufferedReader(lineReader), csv); - List csvAggregateList = csvToBean.parse(); - if (!csvAggregateList.isEmpty()) { - Csv csvAggregate = csvAggregateList.get(0); - csvAggregate.setRowNumber(lineNumber); - resultList.add(csvAggregateList.get(0)); - } - log.debug("Row " + lineNumber + ": "); - } catch (Exception e) { - log.error("Error to the row " + lineNumber + ": " + e.getMessage()); - errors.add(new RowError(lineNumber, "", MALFORMED_ROW)); - } - } - - private CsvToBean getAggregateCsvToBean(BufferedReader bufferedReader, Class csv) { - CsvToBeanBuilder csvToBeanBuilder = new CsvToBeanBuilder<>(bufferedReader); - csvToBeanBuilder.withType(csv); - csvToBeanBuilder.withSeparator(';'); - csvToBeanBuilder.withQuoteChar(DEFAULT_QUOTE_CHARACTER); - csvToBeanBuilder.withOrderedResults(true); - csvToBeanBuilder.withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS); - csvToBeanBuilder.withThrowExceptions(false); - return csvToBeanBuilder.build(); - } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/CsvService.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/CsvService.java new file mode 100644 index 000000000..33483dba8 --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/CsvService.java @@ -0,0 +1,85 @@ +package it.pagopa.selfcare.onboarding.service; + +import com.opencsv.bean.CsvToBean; +import com.opencsv.bean.CsvToBeanBuilder; +import com.opencsv.enums.CSVReaderNullFieldIndicator; +import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; +import it.pagopa.selfcare.onboarding.model.AggregatesCsv; +import it.pagopa.selfcare.onboarding.model.Csv; +import it.pagopa.selfcare.onboarding.model.RowError; +import jakarta.enterprise.context.ApplicationScoped; +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.File; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; + +import static com.opencsv.ICSVParser.DEFAULT_QUOTE_CHARACTER; + +@ApplicationScoped +@Slf4j +public class CsvService { + + public static final String ERROR_READING_CSV = "Error reading CSV: "; + public static final String MALFORMED_ROW = "Riga malformata"; + + public AggregatesCsv readItemsFromCsv(File file, Class csv) { + List resultList = new ArrayList<>(); + List errors = new ArrayList<>(); + + try { + byte[] fileBytes = Files.readAllBytes(file.toPath()); + StringReader stringReader = new StringReader(new String(fileBytes, StandardCharsets.UTF_8)); + BufferedReader bufferedReader = new BufferedReader(stringReader); + String skip = bufferedReader.readLine(); + log.info("Skip header: " + skip); + int lineNumber = 1; + String nextLine; + + while ((nextLine = bufferedReader.readLine()) != null) { + if (!nextLine.startsWith("(*")) { + parseLine(nextLine, lineNumber, resultList, errors, csv); + lineNumber++; + } + } + + return new AggregatesCsv(resultList, errors); + + } catch (Exception e) { + log.error(ERROR_READING_CSV + e.getMessage(), e); + throw new InvalidRequestException(ERROR_READING_CSV + e.getMessage()); + } + } + + private void parseLine(String nextLine, int lineNumber, List resultList, List errors, Class csv) { + try { + StringReader lineReader = new StringReader(nextLine); + CsvToBean csvToBean = getAggregateCsvToBean(new BufferedReader(lineReader), csv); + List csvAggregateList = csvToBean.parse(); + if (!csvAggregateList.isEmpty()) { + Csv csvAggregate = csvAggregateList.get(0); + csvAggregate.setRowNumber(lineNumber); + resultList.add(csvAggregateList.get(0)); + } + log.debug("Row " + lineNumber + ": "); + } catch (Exception e) { + log.error("Error to the row " + lineNumber + ": " + e.getMessage()); + errors.add(new RowError(lineNumber, "", MALFORMED_ROW)); + } + } + + private CsvToBean getAggregateCsvToBean(BufferedReader bufferedReader, Class csv) { + CsvToBeanBuilder csvToBeanBuilder = new CsvToBeanBuilder<>(bufferedReader); + csvToBeanBuilder.withType(csv); + csvToBeanBuilder.withSeparator(';'); + csvToBeanBuilder.withQuoteChar(DEFAULT_QUOTE_CHARACTER); + csvToBeanBuilder.withOrderedResults(true); + csvToBeanBuilder.withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS); + csvToBeanBuilder.withThrowExceptions(false); + return csvToBeanBuilder.build(); + } +} diff --git a/apps/onboarding-ms/src/main/resources/application.properties b/apps/onboarding-ms/src/main/resources/application.properties index 7adc529c6..245639580 100644 --- a/apps/onboarding-ms/src/main/resources/application.properties +++ b/apps/onboarding-ms/src/main/resources/application.properties @@ -74,6 +74,7 @@ quarkus.rest-client."org.openapi.quarkus.party_registry_proxy_json.api.UoApi".ur quarkus.rest-client."org.openapi.quarkus.party_registry_proxy_json.api.AooApi".url=${MS_PARTY_REGISTRY_URL:http://localhost:8080} quarkus.rest-client."org.openapi.quarkus.party_registry_proxy_json.api.InfocamerePdndApi".url=${MS_PARTY_REGISTRY_URL:http://localhost:8080} quarkus.rest-client."org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi".url=${MS_PARTY_REGISTRY_URL:http://localhost:8080} +quarkus.rest-client."org.openapi.quarkus.party_registry_proxy_json.api.GeographicTaxonomiesApi".url=${MS_PARTY_REGISTRY_URL:http://localhost:8080} quarkus.rest-client."org.openapi.quarkus.core_json.api.InstitutionApi".url=${MS_CORE_URL:http://localhost:8080} quarkus.rest-client."org.openapi.quarkus.core_json.api.InstitutionApi".read-timeout=60000 diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/AggregatesControllerTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/AggregatesControllerTest.java index 072a13e39..89ac6a37a 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/AggregatesControllerTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/AggregatesControllerTest.java @@ -8,9 +8,7 @@ import io.quarkus.test.security.TestSecurity; import io.restassured.http.ContentType; import io.smallrye.mutiny.Uni; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateAppIoResponse; import it.pagopa.selfcare.onboarding.model.VerifyAggregateResponse; -import it.pagopa.selfcare.onboarding.model.VerifyAggregateSendResponse; import it.pagopa.selfcare.onboarding.service.AggregatesService; import org.junit.jupiter.api.Test; @@ -29,12 +27,13 @@ class AggregatesControllerTest { @InjectMock AggregatesService aggregatesService; + @TestSecurity(user = "userJwt") @Test void verifyAggregatesCsv_succeeds() { File testFile = new File("src/test/resources/aggregates-appio.csv"); when(aggregatesService.validateAppIoAggregatesCsv(any())) - .thenReturn(Uni.createFrom().item(new VerifyAggregateAppIoResponse())); + .thenReturn(Uni.createFrom().item(new VerifyAggregateResponse())); given() .when() @@ -48,42 +47,4 @@ void verifyAggregatesCsv_succeeds() { .validateAppIoAggregatesCsv(any()); } - @Test - void verifyAggregatesPagoPaCsv_succeeds() { - File testFile = new File("src/test/resources/aggregates-pagopa.csv"); - - when(aggregatesService.validatePagoPaAggregatesCsv(any())) - .thenReturn(Uni.createFrom().item(new VerifyAggregateResponse())); - - given() - .when() - .contentType(ContentType.MULTIPART) - .multiPart("aggregates", testFile) - .post("/verification/prod-pagopa") - .then() - .statusCode(200); - - verify(aggregatesService, times(1)) - .validatePagoPaAggregatesCsv(any()); - } - - @TestSecurity(user = "userJwt") - @Test - void verifyAggregatesSendCsv_succeeds() { - File testFile = new File("src/test/resources/aggregates-send.csv"); - - when(aggregatesService.validateSendAggregatesCsv(any())) - .thenReturn(Uni.createFrom().item(new VerifyAggregateSendResponse())); - - given() - .when() - .contentType(ContentType.MULTIPART) - .multiPart("aggregates", testFile) - .post("/verification/prod-pn") - .then() - .statusCode(200); - - verify(aggregatesService, times(1)) - .validateSendAggregatesCsv(any()); - } } diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java index 5b0910f1b..83b196119 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java @@ -104,32 +104,17 @@ void toOffsetDateTime_withNullLocalDateTime_returnsNull() { } @Test - void mapCsvAggregatesToAggregates_withValidList_returnsMappedList() { - List input = List.of(new CsvAggregateSend()); - List result = mapper.mapCsvAggregatesToAggregates(input); - assertNotNull(result); - assertEquals(1, result.size()); - } - - @Test - void mapCsvAggregatesToAggregates_withNullList_returnsNull() { - List input = null; - List result = mapper.mapCsvAggregatesToAggregates(input); - assertNull(result); - } - - @Test - void mapCsvAppIoAggregatesToAggregates_withValidList_returnsMappedList() { + void mapCsvAppIoAggregateToAggregates_withValidList_returnsMappedList() { List input = List.of(new CsvAggregateAppIo()); - List result = mapper.mapCsvAppIoAggregatesToAggregates(input); + List result = mapper.mapCsvAppIoAggregatesToAggregates(input); assertNotNull(result); assertEquals(1, result.size()); } @Test - void mapCsvAppIoAggregatesToAggregates_withNullList_returnsEmptyList() { + void mapCsvAppIoAggregateToAggregates_withNullList_returnsEmptyList() { List input = null; - List result = mapper.mapCsvAppIoAggregatesToAggregates(input); + List result = mapper.mapCsvAppIoAggregatesToAggregates(input); assertNotNull(result); assertTrue(result.isEmpty()); } diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregatePagoPaTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregatePagoPaTest.java deleted file mode 100644 index ed99bae8b..000000000 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregatePagoPaTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - -class CsvAggregatePagoPaTest { - - @Test - void testCsvAggregatePagoPaConstructorAndGetters() { - String description = "PagoPa Description"; - String pec = "pagopa@example.com"; - String taxCode = "PAGOTAX12345"; - String vatNumber = "PAGOVAT12345678"; - String address = "PagoPa Address"; - String city = "PagoPa City"; - String province = "PagoPa Province"; - String aggragateNamePT = "PagoPa Name PT"; - String taxCodePT = "PTTAXCODE123"; - String iban = "IT60X0542811101000000123456"; - String service = "PagoPa Service"; - String syncAsyncMode = "SYNC"; - Integer rowNumber = 2; - - CsvAggregatePagoPa csvAggregatePagoPa = new CsvAggregatePagoPa(); - csvAggregatePagoPa.setDescription(description); - csvAggregatePagoPa.setPec(pec); - csvAggregatePagoPa.setTaxCode(taxCode); - csvAggregatePagoPa.setVatNumber(vatNumber); - csvAggregatePagoPa.setAddress(address); - csvAggregatePagoPa.setCity(city); - csvAggregatePagoPa.setProvince(province); - csvAggregatePagoPa.setAggragateNamePT(aggragateNamePT); - csvAggregatePagoPa.setTaxCodePT(taxCodePT); - csvAggregatePagoPa.setIban(iban); - csvAggregatePagoPa.setService(service); - csvAggregatePagoPa.setSyncAsyncMode(syncAsyncMode); - csvAggregatePagoPa.setRowNumber(rowNumber); - - assertEquals(description, csvAggregatePagoPa.getDescription()); - assertEquals(pec, csvAggregatePagoPa.getPec()); - assertEquals(taxCode, csvAggregatePagoPa.getTaxCode()); - assertEquals(vatNumber, csvAggregatePagoPa.getVatNumber()); - assertEquals(address, csvAggregatePagoPa.getAddress()); - assertEquals(city, csvAggregatePagoPa.getCity()); - assertEquals(province, csvAggregatePagoPa.getProvince()); - assertEquals(aggragateNamePT, csvAggregatePagoPa.getAggragateNamePT()); - assertEquals(taxCodePT, csvAggregatePagoPa.getTaxCodePT()); - assertEquals(iban, csvAggregatePagoPa.getIban()); - assertEquals(service, csvAggregatePagoPa.getService()); - assertEquals(syncAsyncMode, csvAggregatePagoPa.getSyncAsyncMode()); - assertEquals(rowNumber, csvAggregatePagoPa.getRowNumber()); - } - - @Test - void testSetRowNumber() { - CsvAggregatePagoPa csvAggregatePagoPa = new CsvAggregatePagoPa(); - int expectedRowNumber = 15; - - csvAggregatePagoPa.setRowNumber(expectedRowNumber); - - assertEquals(expectedRowNumber, csvAggregatePagoPa.getRowNumber()); - } - - @Test - void testCsvBindByPositionAnnotations() { - CsvAggregatePagoPa csvAggregatePagoPa = new CsvAggregatePagoPa(); - csvAggregatePagoPa.setDescription("Test Description"); - csvAggregatePagoPa.setPec("test@pagopa.it"); - csvAggregatePagoPa.setTaxCode("TESTTAXCODE"); - csvAggregatePagoPa.setIban("IT60X0542811101000000123456"); - - assertNotNull(csvAggregatePagoPa); - assertEquals("Test Description", csvAggregatePagoPa.getDescription()); - assertEquals("test@pagopa.it", csvAggregatePagoPa.getPec()); - assertEquals("TESTTAXCODE", csvAggregatePagoPa.getTaxCode()); - assertEquals("IT60X0542811101000000123456", csvAggregatePagoPa.getIban()); - } -} diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregateSendTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregateSendTest.java deleted file mode 100644 index 18ae8267d..000000000 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/CsvAggregateSendTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - -class CsvAggregateSendTest { - - @Test - void testCsvAggregateSendConstructorAndGetters() { - String description = "Test Description"; - String pec = "test@example.com"; - String taxCode = "TAX12345"; - String vatNumber = "VAT12345678"; - String codeSDI = "SDI123456"; - String address = "Test Address"; - String city = "Test City"; - String province = "Test Province"; - String ipaCode = "IPA12345"; - String subunitType = "Department"; - String subunitCode = "DEP001"; - String adminAggregateName = "Admin Name"; - String adminAggregateSurname = "Admin Surname"; - String adminAggregateTaxCode = "ADMIN12345"; - String adminAggregateEmail = "admin@example.com"; - Integer rowNumber = 5; - - CsvAggregateSend csvAggregateSend = new CsvAggregateSend(); - csvAggregateSend.setDescription(description); - csvAggregateSend.setPec(pec); - csvAggregateSend.setTaxCode(taxCode); - csvAggregateSend.setVatNumber(vatNumber); - csvAggregateSend.setCodeSDI(codeSDI); - csvAggregateSend.setAddress(address); - csvAggregateSend.setCity(city); - csvAggregateSend.setProvince(province); - csvAggregateSend.setIpaCode(ipaCode); - csvAggregateSend.setSubunitType(subunitType); - csvAggregateSend.setSubunitCode(subunitCode); - csvAggregateSend.setAdminAggregateName(adminAggregateName); - csvAggregateSend.setAdminAggregateSurname(adminAggregateSurname); - csvAggregateSend.setAdminAggregateTaxCode(adminAggregateTaxCode); - csvAggregateSend.setAdminAggregateEmail(adminAggregateEmail); - csvAggregateSend.setRowNumber(rowNumber); - - assertEquals(description, csvAggregateSend.getDescription()); - assertEquals(pec, csvAggregateSend.getPec()); - assertEquals(taxCode, csvAggregateSend.getTaxCode()); - assertEquals(vatNumber, csvAggregateSend.getVatNumber()); - assertEquals(codeSDI, csvAggregateSend.getCodeSDI()); - assertEquals(address, csvAggregateSend.getAddress()); - assertEquals(city, csvAggregateSend.getCity()); - assertEquals(province, csvAggregateSend.getProvince()); - assertEquals(ipaCode, csvAggregateSend.getIpaCode()); - assertEquals(subunitType, csvAggregateSend.getSubunitType()); - assertEquals(subunitCode, csvAggregateSend.getSubunitCode()); - assertEquals(adminAggregateName, csvAggregateSend.getAdminAggregateName()); - assertEquals(adminAggregateSurname, csvAggregateSend.getAdminAggregateSurname()); - assertEquals(adminAggregateTaxCode, csvAggregateSend.getAdminAggregateTaxCode()); - assertEquals(adminAggregateEmail, csvAggregateSend.getAdminAggregateEmail()); - assertEquals(rowNumber, csvAggregateSend.getRowNumber()); - } - - @Test - void testSetRowNumber() { - CsvAggregateSend csvAggregateSend = new CsvAggregateSend(); - int expectedRowNumber = 10; - - csvAggregateSend.setRowNumber(expectedRowNumber); - - assertEquals(expectedRowNumber, csvAggregateSend.getRowNumber()); - } - - @Test - void testCsvBindByPositionAnnotations() { - CsvAggregateSend csvAggregateSend = new CsvAggregateSend(); - csvAggregateSend.setDescription("Sample Description"); - csvAggregateSend.setPec("sample@example.com"); - csvAggregateSend.setTaxCode("SAMPLETAXCODE"); - csvAggregateSend.setAdminAggregateEmail("admin@example.com"); - - assertNotNull(csvAggregateSend); - assertEquals("Sample Description", csvAggregateSend.getDescription()); - assertEquals("sample@example.com", csvAggregateSend.getPec()); - assertEquals("SAMPLETAXCODE", csvAggregateSend.getTaxCode()); - assertEquals("admin@example.com", csvAggregateSend.getAdminAggregateEmail()); - } -} diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponseTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponseTest.java deleted file mode 100644 index a02c8fbca..000000000 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/model/VerifyAggregateSendResponseTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package it.pagopa.selfcare.onboarding.model; - -import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.ArrayList; - -import static org.junit.jupiter.api.Assertions.*; - -class VerifyAggregateSendResponseTest { - - @Test - void testVerifyAggregateSendResponseConstructorAndGetters() { - - List aggregates = new ArrayList<>(); - List errors = new ArrayList<>(); - - AggregateSend aggregateSend = new AggregateSend(); - aggregateSend.setDescription("Description"); - aggregateSend.setPec("example@pec.it"); - aggregateSend.setTaxCode("XYZ12345"); - aggregateSend.setVatNumber("IT123456789"); - aggregateSend.setCodeSDI("AB123CD"); - aggregateSend.setAddress("Street 123"); - aggregateSend.setCity("Rome"); - aggregateSend.setProvince("RM"); - aggregateSend.setSubunitType("Subunit Type"); - aggregateSend.setSubunitCode("Subunit Code"); - - AggregateUser user = new AggregateUser(); - user.setName("John"); - user.setSurname("Doe"); - user.setTaxCode("JD12345"); - user.setEmail("john.doe@example.com"); - user.setRole("Admin"); - - aggregateSend.setUsers(List.of(user)); - aggregates.add(aggregateSend); - - VerifyAggregateSendResponse response = new VerifyAggregateSendResponse(aggregates, errors); - - assertNotNull(response.getAggregates()); - assertEquals(1, response.getAggregates().size()); - assertEquals("Description", response.getAggregates().get(0).getDescription()); - assertEquals("example@pec.it", response.getAggregates().get(0).getPec()); - assertEquals("XYZ12345", response.getAggregates().get(0).getTaxCode()); - assertEquals("IT123456789", response.getAggregates().get(0).getVatNumber()); - assertEquals("AB123CD", response.getAggregates().get(0).getCodeSDI()); - assertEquals("Street 123", response.getAggregates().get(0).getAddress()); - assertEquals("Rome", response.getAggregates().get(0).getCity()); - assertEquals("RM", response.getAggregates().get(0).getProvince()); - assertEquals("Subunit Type", response.getAggregates().get(0).getSubunitType()); - assertEquals("Subunit Code", response.getAggregates().get(0).getSubunitCode()); - assertEquals(1, response.getAggregates().get(0).getUsers().size()); - assertEquals("John", response.getAggregates().get(0).getUsers().get(0).getName()); - assertEquals("Doe", response.getAggregates().get(0).getUsers().get(0).getSurname()); - assertEquals("JD12345", response.getAggregates().get(0).getUsers().get(0).getTaxCode()); - assertEquals("john.doe@example.com", response.getAggregates().get(0).getUsers().get(0).getEmail()); - assertEquals("Admin", response.getAggregates().get(0).getUsers().get(0).getRole()); - } - - @Test - void testNoArgsConstructor() { - VerifyAggregateSendResponse response = new VerifyAggregateSendResponse(); - - assertNull(response.getAggregates()); - assertNull(response.getErrors()); - } -} diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java index b129d1e7a..76b486120 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java @@ -2,34 +2,38 @@ import io.quarkus.test.InjectMock; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.quarkus.test.vertx.RunOnVertxContext; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; -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.model.Aggregate; +import it.pagopa.selfcare.onboarding.model.RowError; +import it.pagopa.selfcare.onboarding.model.VerifyAggregateResponse; +import it.pagopa.selfcare.onboarding.service.profile.OnboardingTestProfile; import jakarta.inject.Inject; import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.jboss.resteasy.reactive.client.api.WebClientApplicationException; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; 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.AOOResource; +import org.openapi.quarkus.party_registry_proxy_json.model.GeographicTaxonomyResource; import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource; import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; import java.io.File; -import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.*; @QuarkusTest +@TestProfile(OnboardingTestProfile.class) class AggregatesServiceDefaultTest { @Inject @@ -38,6 +42,10 @@ class AggregatesServiceDefaultTest { @Inject OnboardingMapper onboardingMapper; + @RestClient + @InjectMock + GeographicTaxonomiesApi geographicTaxonomiesApi; + @RestClient @InjectMock AooApi aooApi; @@ -46,198 +54,134 @@ class AggregatesServiceDefaultTest { @InjectMock InstitutionApi institutionApi; + @Inject + CsvService csvService; + @RestClient @InjectMock UoApi uoApi; @Test @RunOnVertxContext - void validateAggregatesAppIo(){ - File testFile = new File("src/test/resources/aggregates-appio.csv"); - - UOResource uoResource = new UOResource(); - uoResource.setMail1("pec@Pec"); - uoResource.setTipoMail1("Pec"); - uoResource.setDenominazioneEnte("denominazione"); - uoResource.setIndirizzo("Palazzo Vecchio Piazza Della Signoria"); - - AOOResource aooResource = new AOOResource(); - aooResource.setTipoMail1("Pec"); - aooResource.setMail1("pec@Pec"); - aooResource.setCodiceUniAoo("18SU3R"); - aooResource.setIndirizzo("Palazzo Vecchio Piazza Della Signoria"); - - when(aooApi.findByUnicodeUsingGET("18SU3R", null)).thenReturn(Uni.createFrom().item(aooResource)); - when(institutionApi.findInstitutionUsingGET("1307110484", null, null)).thenReturn(Uni.createFrom().item(new InstitutionResource())); - when(uoApi.findByUnicodeUsingGET1("18SU3R", null)).thenReturn(Uni.createFrom().item(uoResource)); - - aggregatesServiceDefault.validateAppIoAggregatesCsv(testFile) - .subscribe().withSubscriber(UniAssertSubscriber.create()) - .assertCompleted(); - } - - @Test - @RunOnVertxContext - void validatePagoPaAggregates(){ - File testFile = new File("src/test/resources/aggregates-pagopa.csv"); - - when(aooApi.findByUnicodeUsingGET("1437190414", null)).thenReturn(Uni.createFrom().item(new AOOResource())); - when(institutionApi.findInstitutionUsingGET("00297110389", null, null)).thenReturn(Uni.createFrom().item(new InstitutionResource())); - when(uoApi.findByUnicodeUsingGET1("4551120274", null)).thenReturn(Uni.createFrom().item(new UOResource())); - - when(aooApi.findByUnicodeUsingGET("AQ66",null)).thenThrow(ResourceNotFoundException.class); - when(institutionApi.findInstitutionUsingGET("345645", null, null)).thenThrow(ResourceNotFoundException.class); - when(uoApi.findByUnicodeUsingGET1("AQ66",null)).thenThrow(ResourceNotFoundException.class); - - aggregatesServiceDefault.validatePagoPaAggregatesCsv(testFile) - .subscribe().withSubscriber(UniAssertSubscriber.create()) - .assertCompleted(); - } - - @Test - @RunOnVertxContext - void validateSendAggregates(){ - File testFile = new File("src/test/resources/aggregates-send.csv"); - - when(aooApi.findByUnicodeUsingGET("1437190414", null)).thenReturn(Uni.createFrom().item(new AOOResource())); - when(institutionApi.findInstitutionUsingGET("00297110389", null, null)).thenReturn(Uni.createFrom().item(new InstitutionResource())); - when(uoApi.findByUnicodeUsingGET1("4551120274", null)).thenReturn(Uni.createFrom().item(new UOResource())); - - when(aooApi.findByUnicodeUsingGET("AQ66",null)).thenThrow(ResourceNotFoundException.class); - when(institutionApi.findInstitutionUsingGET("345645", null, null)).thenThrow(ResourceNotFoundException.class); - when(uoApi.findByUnicodeUsingGET1("AQ66",null)).thenThrow(ResourceNotFoundException.class); - - aggregatesServiceDefault.validateSendAggregatesCsv(testFile) - .subscribe().withSubscriber(UniAssertSubscriber.create()) - .assertCompleted(); - } - - - @Test void testValidateAppIoAggregatesCsv() { - File file = new File("src/test/resources/aggregates-appio.csv"); - CsvAggregateAppIo csvAggregate = new CsvAggregateAppIo(); - csvAggregate.setSubunitType("AOO"); - csvAggregate.setSubunitCode("AOO_CODE"); - - List csvAggregateList = new ArrayList<>(); - csvAggregateList.add(csvAggregate); - UOResource uoResource = new UOResource(); uoResource.setMail1("pec@Pec"); uoResource.setTipoMail1("Pec"); + uoResource.setCodiceUniAoo("18SU3S"); + uoResource.setCap("00100"); uoResource.setDenominazioneEnte("denominazione"); uoResource.setIndirizzo("Palazzo Vecchio Piazza Della Signoria"); + uoResource.setCodiceComuneISTAT("123"); AOOResource aooResource = new AOOResource(); - aooResource.setTipoMail1("Pec"); + aooResource.setTipoMail1("Altro"); aooResource.setMail1("pec@Pec"); - aooResource.setCodiceUniAoo("18SU3R"); + aooResource.setCodiceUniAoo("18SU3S"); + aooResource.setDenominazioneEnte("denominazione"); + aooResource.setCap("00100"); + aooResource.setCodiceFiscaleEnte("1307110484"); aooResource.setIndirizzo("Palazzo Vecchio Piazza Della Signoria"); + aooResource.setCodiceComuneISTAT("123"); + + InstitutionResource institutionResource = mock(InstitutionResource.class); + when(institutionResource.getIstatCode()).thenReturn("123"); + when(institutionResource.getOriginId()).thenReturn("test"); + when(institutionResource.getDigitalAddress()).thenReturn("pec@Pec"); + + GeographicTaxonomyResource geographicTaxonomyResource = new GeographicTaxonomyResource(); + geographicTaxonomyResource.setCode("123"); + geographicTaxonomyResource.setDesc("città"); + geographicTaxonomyResource.setProvinceAbbreviation("Provincia"); WebClientApplicationException webClientApplicationException = mock(WebClientApplicationException.class); Response response = mock(Response.class); when(webClientApplicationException.getResponse()).thenReturn(response); when(response.getStatus()).thenReturn(404); - AggregatesCsv aggregatesCsv = aggregatesServiceDefault.readItemsFromCsv(file, CsvAggregateAppIo.class); + when(aooApi.findByUnicodeUsingGET("18SU3S", null)).thenReturn(Uni.createFrom().item(aooResource)); when(aooApi.findByUnicodeUsingGET("18SU3R", null)).thenReturn(Uni.createFrom().failure(webClientApplicationException)); - when(institutionApi.findInstitutionUsingGET("1307110484", null, null)).thenReturn(Uni.createFrom().item(new InstitutionResource())); + when(institutionApi.findInstitutionUsingGET("1307110484", null, null)).thenReturn(Uni.createFrom().item(institutionResource)); when(uoApi.findByUnicodeUsingGET1("18SU3R", null)).thenReturn(Uni.createFrom().item(uoResource)); + when(geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET("123")).thenReturn(Uni.createFrom().item(geographicTaxonomyResource)); - Uni result = aggregatesServiceDefault.validateAppIoAggregatesCsv(file); - - VerifyAggregateAppIoResponse verifyAggregateResponse = result.await().indefinitely(); - assertNotNull(verifyAggregateResponse.getAggregates()); - assertNotNull(aggregatesCsv.getValidAggregates()); - - assertTrue(!aggregatesCsv.getCsvAggregateList().isEmpty()); - assertTrue(aggregatesCsv.getRowErrorList().isEmpty()); - - assertNotNull(aggregatesCsv.getCsvAggregateList().get(0).getRowNumber()); - assertNotNull(aggregatesCsv.getCsvAggregateList().get(0).getSubunitCode()); - assertNotNull(aggregatesCsv.getCsvAggregateList().get(0).getTaxCode()); - assertNotNull(aggregatesCsv.getCsvAggregateList().get(0).getSubunitType()); - assertNotNull(aggregatesCsv.getCsvAggregateList().get(0).getVatNumber()); - - verify(aooApi,times(0)).findByUnicodeUsingGET("1437190414", null); - verify(institutionApi,times(0)).findInstitutionUsingGET("00297110389", null, null); - - } - - @Test - void testValidateSendAggregatesCsv() { - - File file = new File("src/test/resources/aggregates-send.csv"); + VerifyAggregateResponse verifyAggregateResponse = mockResponseForIO(); - CsvAggregateSend csvAggregate = new CsvAggregateSend(); - csvAggregate.setSubunitType("AOO"); - csvAggregate.setSubunitCode("AOO_CODE"); - - List csvAggregateList = new ArrayList<>(); - csvAggregateList.add(csvAggregate); - - AggregatesCsv aggregatesCsv = aggregatesServiceDefault.readItemsFromCsv(file, CsvAggregateSend.class); - when(aooApi.findByUnicodeUsingGET("1437190414", null)).thenReturn(Uni.createFrom().item(new AOOResource())); - when(institutionApi.findInstitutionUsingGET("00297110389", null, null)).thenReturn(Uni.createFrom().item(new InstitutionResource())); - when(uoApi.findByUnicodeUsingGET1("4551120274", null)).thenReturn(Uni.createFrom().item(new UOResource())); - - Uni result = aggregatesServiceDefault.validateSendAggregatesCsv(file); - - VerifyAggregateSendResponse verifyAggregateResponse = result.await().indefinitely(); - assertNotNull(verifyAggregateResponse); - assertNotNull(aggregatesCsv.getValidAggregates()); - - assertTrue(!aggregatesCsv.getCsvAggregateList().isEmpty()); - assertTrue(aggregatesCsv.getRowErrorList().isEmpty()); - - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getAddress()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getCity()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getPec()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getDescription()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getRowNumber()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getSubunitCode()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getTaxCode()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getProvince()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getSubunitType()); - assertNotNull(((CsvAggregateSend) aggregatesCsv.getCsvAggregateList().get(0)).getVatNumber()); + UniAssertSubscriber resp = aggregatesServiceDefault.validateAppIoAggregatesCsv(file) + .subscribe().withSubscriber(UniAssertSubscriber.create()) + .assertCompleted(); - verify(aooApi,times(0)).findByUnicodeUsingGET("1437190414", null); - verify(institutionApi,times(0)).findInstitutionUsingGET("00297110389", null, null); - verify(uoApi,times(0)).findByUnicodeUsingGET1("4551120274", null); + Assertions.assertEquals(3, resp.getItem().getAggregates().size()); + Assertions.assertEquals(verifyAggregateResponse.getAggregates().get(0), resp.getItem().getAggregates().get(0)); + Assertions.assertEquals(verifyAggregateResponse.getAggregates().get(1), resp.getItem().getAggregates().get(1)); + Assertions.assertEquals(verifyAggregateResponse.getAggregates().get(2), resp.getItem().getAggregates().get(2)); + Assertions.assertEquals(6, resp.getItem().getErrors().size()); + Assertions.assertEquals(verifyAggregateResponse.getErrors().get(0), resp.getItem().getErrors().get(0)); + Assertions.assertEquals(verifyAggregateResponse.getErrors().get(1), resp.getItem().getErrors().get(1)); + Assertions.assertEquals(verifyAggregateResponse.getErrors().get(2), resp.getItem().getErrors().get(2)); + Assertions.assertEquals(verifyAggregateResponse.getErrors().get(3), resp.getItem().getErrors().get(3)); + + verify(geographicTaxonomiesApi,times(1)).retrieveGeoTaxonomiesByCodeUsingGET("123"); + verify(aooApi,times(1)).findByUnicodeUsingGET("18SU3R", null); + verify(aooApi,times(1)).findByUnicodeUsingGET("18SU3S", null); + verify(institutionApi,times(2)).findInstitutionUsingGET("1307110484", null, null); } - @Test - void testValidatePagoPaAggregatesCsv() { - - File file = new File("src/test/resources/aggregates-pagopa.csv"); - - CsvAggregatePagoPa csvAggregate = new CsvAggregatePagoPa(); - - List csvAggregateList = new ArrayList<>(); - csvAggregateList.add(csvAggregate); - - AggregatesCsv aggregatesCsv = aggregatesServiceDefault.readItemsFromCsv(file, CsvAggregatePagoPa.class); - Uni result = aggregatesServiceDefault.validatePagoPaAggregatesCsv(file); - - VerifyAggregateResponse verifyAggregateResponse = result.await().indefinitely(); - assertNotNull(verifyAggregateResponse); - assertNotNull(aggregatesCsv.getValidAggregates()); - - assertTrue(!aggregatesCsv.getCsvAggregateList().isEmpty()); - assertTrue(aggregatesCsv.getRowErrorList().isEmpty()); - - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getAddress()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getCity()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getPec()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getDescription()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getRowNumber()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getTaxCode()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getProvince()); - assertNotNull(((CsvAggregatePagoPa) aggregatesCsv.getCsvAggregateList().get(0)).getVatNumber()); - + private static VerifyAggregateResponse mockResponseForIO() { + VerifyAggregateResponse verifyAggregateResponse = new VerifyAggregateResponse(); + Aggregate aggregateUO = new Aggregate(); + aggregateUO.setSubunitCode("18SU3R"); + aggregateUO.setSubunitType("UO"); + aggregateUO.setDescription("denominazione"); + aggregateUO.setDigitalAddress("pec@Pec"); + aggregateUO.setTaxCode("1307110484"); + aggregateUO.setVatNumber("1307110484"); + aggregateUO.setAddress("Palazzo Vecchio Piazza Della Signoria"); + aggregateUO.setCity("città"); + aggregateUO.setCounty("Provincia"); + aggregateUO.setZipCode("00100"); + aggregateUO.setOrigin("IPA"); + aggregateUO.setRowNumber(1); + + Aggregate aggregateAOO = new Aggregate(); + aggregateAOO.setSubunitCode("18SU3S"); + aggregateAOO.setSubunitType("AOO"); + aggregateAOO.setDescription("denominazione"); + aggregateAOO.setDigitalAddress("pec@Pec"); + aggregateAOO.setTaxCode("1307110484"); + aggregateAOO.setVatNumber("1307110484"); + aggregateAOO.setAddress("Palazzo Vecchio Piazza Della Signoria"); + aggregateAOO.setCity("città"); + aggregateAOO.setCounty("Provincia"); + aggregateAOO.setZipCode("00100"); + aggregateAOO.setOrigin("IPA"); + aggregateAOO.setRowNumber(5); + + Aggregate aggregate = new Aggregate(); + aggregate.setSubunitCode(null); + aggregate.setSubunitType(null); + aggregate.setDescription(null); + aggregate.setDigitalAddress("pec@Pec"); + aggregate.setTaxCode("1307110484"); + aggregate.setVatNumber("1307110484"); + aggregate.setAddress(null); + aggregate.setCity("città"); + aggregate.setCounty("Provincia"); + aggregate.setZipCode(null); + aggregate.setOriginId(null); + aggregate.setOrigin("IPA"); + aggregate.setOriginId("test"); + aggregate.setRowNumber(6); + + verifyAggregateResponse.setAggregates(List.of(aggregateUO, aggregateAOO, aggregate)); + + RowError error0 = new RowError(2,"1307110484","SubunitType non valido"); + RowError error1 = new RowError(3,"1307110484","La partita IVA è obbligatoria"); + RowError error2 = new RowError(7,null,"Il codice fiscale è obbligatorio"); + RowError error4 = new RowError(4,"1307110484","Codice fiscale non presente su IPA"); + RowError error3 = new RowError(8,"1307110484","In caso di AOO/UO è necessario specificare la tipologia e il codice univoco IPA AOO/UO"); + verifyAggregateResponse.setErrors(List.of(error0, error1,error4,error2, error3)); + return verifyAggregateResponse; } - } diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/profile/OnboardingTestProfile.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/profile/OnboardingTestProfile.java index 5a031e919..f4b94310e 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/profile/OnboardingTestProfile.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/profile/OnboardingTestProfile.java @@ -7,6 +7,7 @@ public class OnboardingTestProfile implements QuarkusTestProfile { @Override public Map getConfigOverrides() { - return Map.of("onboarding-ms.signature.verify-enabled", "true"); + return Map.of("onboarding-ms.signature.verify-enabled", "true", + "onboarding-ms.istat-cache-duration-days","30"); } } diff --git a/apps/onboarding-ms/src/test/resources/aggregates-appio.csv b/apps/onboarding-ms/src/test/resources/aggregates-appio.csv index 30ef88972..86e90b2e8 100644 --- a/apps/onboarding-ms/src/test/resources/aggregates-appio.csv +++ b/apps/onboarding-ms/src/test/resources/aggregates-appio.csv @@ -1,10 +1,10 @@ -Codice Fiscale*;P.IVA*;AOO/UO**;Codice Univoco**;PEC;Sede legale - Indirizzo; -1307110484;1307110484;UO;18SU3R;pec@Pec;Palazzo Vecchio Piazza Della Signoria -1307110484;;;;pec@Pec;Palazzo Vecchio Piazza Della Signoria -1307110484;1307110484;AOO;18SU3R;pec@Pec;Palazzo Vecchio Piazza Della Signoria -1307110484;1307110484;;;pec@Pec;Palazzo Vecchio Piazza Della Signoria -;;;;pec@Pec;Palazzo Vecchio Piazza Della Signoria -1307110484;1307110484;UO;;pec@Pec;Palazzo Vecchio Piazza Della Signoria -;;;;; -(*) campo obbligatorio;;;; -(**) campo obbligatorio in caso di AOO/UO;;;; \ No newline at end of file +Codice Fiscale*;P.IVA*;AOO/UO**;Codice Univoco**; +1307110484;1307110484;UO;18SU3R +1307110484;1307110484;UOO;18SU3R +1307110484;;; +1307110484;1307110484;AOO;18SU3R +1307110484;1307110484;AOO;18SU3S +1307110484;1307110484;; +;;; +1307110484;1307110484;UO; +1307110484;1307110484;UOAOO; \ No newline at end of file diff --git a/apps/onboarding-ms/src/test/resources/application.properties b/apps/onboarding-ms/src/test/resources/application.properties index b3c706a8a..2f24bed44 100644 --- a/apps/onboarding-ms/src/test/resources/application.properties +++ b/apps/onboarding-ms/src/test/resources/application.properties @@ -2,3 +2,5 @@ mp.jwt.verify.publickey="" mp.jwt.verify.issuer=SPID onboarding-ms.signature.verify-enabled=false +onboarding-ms.istat-cache-duration-minute=30 +