From 5329bbaa9453421462b22aaa746234d9a8a90abe Mon Sep 17 00:00:00 2001 From: RiccardoGiuliani <144138935+RiccardoGiuliani@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:26:58 +0100 Subject: [PATCH] feat: P4ADEV-1725, P4ADEV-2031 invoke workflow api createDebtPosition (#41) --- build.gradle.kts | 185 ++-- openapi/generated.openapi.json | 849 +++++++++--------- openapi/p4pa-debt-position.openapi.yaml | 66 ++ ...debt-positions-E2E.postman_collection.json | 443 +++++++++ .../citizen/model/PersonalData.java | 5 +- .../client/BrokerSearchClient.java | 21 + .../config/OrganizationApisHolder.java | 8 + .../organization/service/BrokerService.java | 10 + .../service/BrokerServiceImpl.java | 24 + .../{ => service}/OrganizationService.java | 2 +- .../OrganizationServiceImpl.java | 2 +- .../{ => service}/TaxonomyService.java | 2 +- .../{ => service}/TaxonomyServiceImpl.java | 2 +- .../workflow/client/WorkflowApiClient.java | 42 + .../workflow/config/WorkflowApisHolder.java | 44 + .../workflow/service/WorkflowService.java | 17 + .../workflow/service/WorkflowServiceImpl.java | 40 + .../mapper/InstallmentPIIMapper.java | 4 +- .../debtpositions/model/InstallmentNoPII.java | 4 +- .../pu/debtpositions/model/PaymentOption.java | 5 +- .../pu/debtpositions/model/Transfer.java | 5 +- .../DebtPositionTypeOrgRepository.java | 2 + .../create/GenerateIuvServiceImpl.java | 2 +- .../ValidateDebtPositionServiceImpl.java | 2 +- .../CreateDebtPositionServiceImpl.java | 24 +- .../DebtPositionProcessorService.java | 7 + .../DebtPositionProcessorServiceImpl.java | 29 + .../workflow/DebtPositionSyncService.java | 9 + .../workflow/DebtPositionSyncServiceImpl.java | 58 ++ src/main/resources/application.yml | 6 +- .../client/BrokerSearchClientTest.java | 54 ++ .../config/OrganizationApisHolderTest.java | 10 + .../service/BrokerServiceTest.java | 65 ++ .../OrganizationServiceTest.java | 2 +- .../{ => service}/TaxonomyServiceTest.java | 2 +- .../workflow/client/WorflowApiClientTest.java | 131 +++ .../config/WorkflowApisHolderTest.java | 51 ++ .../workflow/service/WorkflowServiceTest.java | 108 +++ .../mapper/InstallmentPIIMapperTest.java | 4 +- .../create/GenerateIuvServiceTest.java | 4 +- .../service/create/IuvServiceTest.java | 4 + .../ValidateDebtPositionServiceImplTest.java | 2 +- .../CreateDebtPositionServiceImplTest.java | 81 +- .../DebtPositionProcessorServiceImplTest.java | 62 ++ .../DebtPositionSyncServiceImplTest.java | 172 ++++ .../util/faker/DebtPositionTypeOrgFaker.java | 30 + .../util/faker/InstallmentFaker.java | 8 +- 47 files changed, 2195 insertions(+), 514 deletions(-) create mode 100644 postman/p4pa-debt-positions-E2E.postman_collection.json create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClient.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerService.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceImpl.java rename src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/OrganizationService.java (84%) rename src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/OrganizationServiceImpl.java (94%) rename src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/TaxonomyService.java (75%) rename src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/TaxonomyServiceImpl.java (91%) create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorkflowApiClient.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolder.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowService.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceImpl.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorService.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImpl.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncService.java create mode 100644 src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImpl.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClientTest.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceTest.java rename src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/OrganizationServiceTest.java (98%) rename src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/{ => service}/TaxonomyServiceTest.java (96%) create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorflowApiClientTest.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolderTest.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceTest.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImplTest.java create mode 100644 src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImplTest.java diff --git a/build.gradle.kts b/build.gradle.kts index 57238035..942dabe1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,13 @@ import org.openapitools.generator.gradle.plugin.tasks.GenerateTask plugins { - java - id("org.springframework.boot") version "3.4.1" - id("io.spring.dependency-management") version "1.1.7" - jacoco - id("org.sonarqube") version "6.0.1.5171" - id("com.github.ben-manes.versions") version "0.51.0" - id("org.openapi.generator") version "7.10.0" + java + id("org.springframework.boot") version "3.4.1" + id("io.spring.dependency-management") version "1.1.7" + jacoco + id("org.sonarqube") version "6.0.1.5171" + id("com.github.ben-manes.versions") version "0.51.0" + id("org.openapi.generator") version "7.10.0" id("org.ajoberstar.grgit") version "5.3.0" } @@ -16,19 +16,19 @@ version = "0.0.1" description = "p4pa-debt-positions" java { - toolchain { - languageVersion = JavaLanguageVersion.of(21) - } + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } configurations { - compileOnly { - extendsFrom(configurations.annotationProcessor.get()) - } + compileOnly { + extendsFrom(configurations.annotationProcessor.get()) + } } repositories { - mavenCentral() + mavenCentral() } dependencyManagement { @@ -56,67 +56,59 @@ dependencies { implementation("org.springframework.cloud:spring-cloud-starter-stream-kafka") implementation("io.micrometer:micrometer-tracing-bridge-otel:$micrometerVersion") implementation("io.micrometer:micrometer-registry-prometheus") - implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:$springDocOpenApiVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") - implementation("org.openapitools:jackson-databind-nullable:$openApiToolsVersion") - + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:$springDocOpenApiVersion") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("org.openapitools:jackson-databind-nullable:$openApiToolsVersion") + implementation("org.mapstruct:mapstruct:$mapStructVersion") //security implementation("org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion") - - //postgres jdbc implementation("org.postgresql:postgresql:$postgresJdbcVersion") - compileOnly("org.projectlombok:lombok") - annotationProcessor("org.projectlombok:lombok") + compileOnly("org.projectlombok:lombok") - /** - * Mapstruct - * https://mapstruct.org/ - * mapstruct dependencies must always be placed after the lombok dependency - * or the generated mappers will return an empty object - **/ - implementation("org.mapstruct:mapstruct:$mapStructVersion") - annotationProcessor("org.mapstruct:mapstruct-processor:$mapStructVersion") - - // Testing - testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.mockito:mockito-core") - testImplementation ("org.projectlombok:lombok") - testAnnotationProcessor("org.projectlombok:lombok") + // Testing + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.mockito:mockito-core") + testImplementation("org.projectlombok:lombok") testImplementation("com.h2database:h2") testImplementation("uk.co.jemos.podam:podam:$podamVersion") + + testAnnotationProcessor("org.projectlombok:lombok") + + annotationProcessor("org.mapstruct:mapstruct-processor:$mapStructVersion") + annotationProcessor("org.projectlombok:lombok") } tasks.withType { - useJUnitPlatform() - finalizedBy(tasks.jacocoTestReport) + useJUnitPlatform() + finalizedBy(tasks.jacocoTestReport) } tasks.jacocoTestReport { - dependsOn(tasks.test) - reports { - xml.required = true - } + dependsOn(tasks.test) + reports { + xml.required = true + } } val projectInfo = mapOf( - "artifactId" to project.name, - "version" to project.version + "artifactId" to project.name, + "version" to project.version ) tasks { - val processResources by getting(ProcessResources::class) { - filesMatching("**/application.yml") { - expand(projectInfo) - } - } + val processResources by getting(ProcessResources::class) { + filesMatching("**/application.yml") { + expand(projectInfo) + } + } } configurations { - compileClasspath { - resolutionStrategy.activateDependencyLocking() - } + compileClasspath { + resolutionStrategy.activateDependencyLocking() + } } tasks.compileJava { @@ -130,7 +122,8 @@ tasks.register("dependenciesBuild") { dependsOn( "openApiGenerate", "openApiGenerateORGANIZATION", - "openApiGenerateP4PAAUTH" + "openApiGenerateP4PAAUTH", + "openApiGenerateWORKFLOWHUB" ) } @@ -141,7 +134,7 @@ configure { } springBoot { - mainClass.value("it.gov.pagopa.pu.debtpositions.DebtPositionsApplication") + mainClass.value("it.gov.pagopa.pu.debtpositions.DebtPositionsApplication") } openApiGenerate { @@ -180,19 +173,21 @@ tasks.register("openApiGenerateORGANIZATION") { invokerPackage.set("it.gov.pagopa.pu.organization.generated") apiPackage.set("it.gov.pagopa.pu.organization.client.generated") modelPackage.set("it.gov.pagopa.pu.organization.dto.generated") - configOptions.set(mapOf( - "swaggerAnnotations" to "false", - "openApiNullable" to "false", - "dateLibrary" to "java8", - "serializableModel" to "true", - "useSpringBoot3" to "true", - "useJakartaEe" to "true", - "serializationLibrary" to "jackson", - "generateSupportingFiles" to "true", - "generateConstructorWithAllArgs" to "true", - "generatedConstructorWithRequiredArgs" to "true", - "additionalModelTypeAnnotations" to "@lombok.experimental.SuperBuilder(toBuilder = true)" - )) + configOptions.set( + mapOf( + "swaggerAnnotations" to "false", + "openApiNullable" to "false", + "dateLibrary" to "java8", + "serializableModel" to "true", + "useSpringBoot3" to "true", + "useJakartaEe" to "true", + "serializationLibrary" to "jackson", + "generateSupportingFiles" to "true", + "generateConstructorWithAllArgs" to "true", + "generatedConstructorWithRequiredArgs" to "true", + "additionalModelTypeAnnotations" to "@lombok.experimental.SuperBuilder(toBuilder = true)" + ) + ) library.set("resttemplate") } @@ -206,19 +201,51 @@ tasks.register("openApiGenerateP4PAAUTH") { invokerPackage.set("it.gov.pagopa.pu.auth.generated") apiPackage.set("it.gov.pagopa.pu.auth.controller.generated") modelPackage.set("it.gov.pagopa.pu.auth.dto.generated") - configOptions.set(mapOf( - "swaggerAnnotations" to "false", - "openApiNullable" to "false", - "dateLibrary" to "java8", - "serializableModel" to "true", - "useSpringBoot3" to "true", - "useJakartaEe" to "true", - "serializationLibrary" to "jackson", - "generateSupportingFiles" to "true", - "generateConstructorWithAllArgs" to "true", - "generatedConstructorWithRequiredArgs" to "true", - "additionalModelTypeAnnotations" to "@lombok.experimental.SuperBuilder(toBuilder = true)" + configOptions.set( + mapOf( + "swaggerAnnotations" to "false", + "openApiNullable" to "false", + "dateLibrary" to "java8", + "serializableModel" to "true", + "useSpringBoot3" to "true", + "useJakartaEe" to "true", + "serializationLibrary" to "jackson", + "generateSupportingFiles" to "true", + "generateConstructorWithAllArgs" to "true", + "generatedConstructorWithRequiredArgs" to "true", + "additionalModelTypeAnnotations" to "@lombok.experimental.SuperBuilder(toBuilder = true)" + ) ) + library.set("resttemplate") +} + +tasks.register("openApiGenerateWORKFLOWHUB") { + group = "AutomaticallyGeneratedCode" + description = "openapi" + + generatorName.set("java") + remoteInputSpec.set("https://raw.githubusercontent.com/pagopa/p4pa-workflow-hub/refs/heads/$targetEnv/openapi/p4pa-workflow-hub.openapi.yaml") + outputDir.set("$projectDir/build/generated") + invokerPackage.set("it.gov.pagopa.pu.workflowhub.generated") + apiPackage.set("it.gov.pagopa.pu.workflowhub.controller.generated") + modelPackage.set("it.gov.pagopa.pu.workflowhub.dto.generated") + typeMappings.set(mapOf( + "DebtPositionDTO" to "it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO" + )) + configOptions.set( + mapOf( + "swaggerAnnotations" to "false", + "openApiNullable" to "false", + "dateLibrary" to "java8", + "serializableModel" to "true", + "useSpringBoot3" to "true", + "useJakartaEe" to "true", + "serializationLibrary" to "jackson", + "generateSupportingFiles" to "true", + "generateConstructorWithAllArgs" to "true", + "generatedConstructorWithRequiredArgs" to "true", + "additionalModelTypeAnnotations" to "@lombok.experimental.SuperBuilder(toBuilder = true)" + ) ) library.set("resttemplate") } diff --git a/openapi/generated.openapi.json b/openapi/generated.openapi.json index c6866118..72d85179 100644 --- a/openapi/generated.openapi.json +++ b/openapi/generated.openapi.json @@ -367,6 +367,41 @@ } } }, + "/crud/debt-position-type-orgs/search/findByOrganizationIdAndCode" : { + "get" : { + "tags" : [ "debt-position-type-org-search-controller" ], + "operationId" : "crud-debt-position-type-orgs-findByOrganizationIdAndCode", + "parameters" : [ { + "name" : "organizationId", + "in" : "query", + "schema" : { + "type" : "integer", + "format" : "int64" + } + }, { + "name" : "code", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/hal+json" : { + "schema" : { + "$ref" : "#/components/schemas/DebtPositionTypeOrg" + } + } + } + }, + "404" : { + "description" : "Not Found" + } + } + } + }, "/crud/debt-position-type-orgs/search/findByOrganizationIdAndDebtPositionTypeOrgId" : { "get" : { "tags" : [ "debt-position-type-org-search-controller" ], @@ -3647,22 +3682,8 @@ } } }, - "Stamp" : { - "type" : "object", - "properties" : { - "stampType" : { - "type" : "string" - }, - "stampHashDocument" : { - "type" : "string" - }, - "stampProvincialResidence" : { - "type" : "string" - } - } - }, - "Transfer" : { - "required" : [ "amountCents", "category", "installmentId", "orgFiscalCode", "remittanceInformation", "transferIndex" ], + "DebtPositionTypeOrgOperators" : { + "required" : [ "debtPositionTypeOrgId", "operatorExternalUserId" ], "type" : "object", "properties" : { "creationDate" : { @@ -3676,43 +3697,17 @@ "updateOperatorExternalId" : { "type" : "string" }, - "transferId" : { - "type" : "integer", - "format" : "int64" - }, - "installmentId" : { + "debtPositionTypeOrgOperatorId" : { "type" : "integer", "format" : "int64" }, - "orgFiscalCode" : { - "type" : "string" - }, - "orgName" : { - "type" : "string" - }, - "amountCents" : { + "debtPositionTypeOrgId" : { "type" : "integer", "format" : "int64" }, - "remittanceInformation" : { - "type" : "string" - }, - "stamp" : { - "$ref" : "#/components/schemas/Stamp" - }, - "iban" : { - "type" : "string" - }, - "postalIban" : { - "type" : "string" - }, - "category" : { + "operatorExternalUserId" : { "type" : "string" }, - "transferIndex" : { - "type" : "integer", - "format" : "int32" - }, "_links" : { "$ref" : "#/components/schemas/Links" } @@ -3739,16 +3734,16 @@ } } }, - "PagedModelTransfer" : { + "PagedModelDebtPositionTypeOrgOperators" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "transfers" : { + "debtPositionTypeOrgOperatorses" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/Transfer" + "$ref" : "#/components/schemas/DebtPositionTypeOrgOperators" } } } @@ -3761,46 +3756,80 @@ } } }, - "DebtPositionTypeWithCount" : { + "PaymentOption" : { + "required" : [ "debtPositionId", "description", "paymentOptionType", "status", "totalAmountCents" ], "type" : "object", "properties" : { - "debtPositionTypeId" : { - "type" : "integer", - "format" : "int64" - }, - "code" : { - "type" : "string" - }, - "description" : { - "type" : "string" + "creationDate" : { + "type" : "string", + "format" : "date-time" }, "updateDate" : { "type" : "string", "format" : "date-time" }, - "activeOrganizations" : { + "updateOperatorExternalId" : { + "type" : "string" + }, + "paymentOptionId" : { "type" : "integer", - "format" : "int32" + "format" : "int64" }, - "brokerId" : { + "debtPositionId" : { "type" : "integer", "format" : "int64" }, + "totalAmountCents" : { + "type" : "integer", + "format" : "int64" + }, + "status" : { + "type" : "string", + "enum" : [ "TO_SYNC", "REPORTED", "PAID", "PARTIALLY_PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] + }, + "multiDebtor" : { + "type" : "boolean" + }, + "dueDate" : { + "type" : "string", + "format" : "date-time" + }, + "description" : { + "type" : "string" + }, + "paymentOptionType" : { + "type" : "string", + "enum" : [ "SINGLE_INSTALLMENT", "INSTALLMENTS", "DOWN_PAYMENT" ] + }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelDebtPositionTypeWithCount" : { + "InstallmentSyncStatus" : { + "required" : [ "syncStatusFrom", "syncStatusTo" ], + "type" : "object", + "properties" : { + "syncStatusFrom" : { + "type" : "string", + "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] + }, + "syncStatusTo" : { + "type" : "string", + "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] + } + } + }, + "PagedModelPaymentOption" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "debtPositionTypeWithCounts" : { + "paymentOptions" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/DebtPositionTypeWithCount" + "$ref" : "#/components/schemas/PaymentOption" } } } @@ -3813,61 +3842,60 @@ } } }, - "DebtPositionTypeOrgOperators" : { - "required" : [ "debtPositionTypeOrgId", "operatorExternalUserId" ], + "Stamp" : { "type" : "object", "properties" : { - "creationDate" : { - "type" : "string", - "format" : "date-time" - }, - "updateDate" : { - "type" : "string", - "format" : "date-time" - }, - "updateOperatorExternalId" : { + "stampType" : { "type" : "string" }, - "debtPositionTypeOrgOperatorId" : { - "type" : "integer", - "format" : "int64" - }, - "debtPositionTypeOrgId" : { - "type" : "integer", - "format" : "int64" + "stampHashDocument" : { + "type" : "string" }, - "operatorExternalUserId" : { + "stampProvincialResidence" : { "type" : "string" + } + } + }, + "CollectionModelInstallmentNoPII" : { + "type" : "object", + "properties" : { + "_embedded" : { + "type" : "object", + "properties" : { + "installmentNoPIIs" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/InstallmentNoPIIResponse" + } + } + } }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelDebtPositionTypeOrgOperators" : { + "CollectionModelObject" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "debtPositionTypeOrgOperatorses" : { + "objects" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/DebtPositionTypeOrgOperators" + "type" : "object" } } } }, "_links" : { "$ref" : "#/components/schemas/Links" - }, - "page" : { - "$ref" : "#/components/schemas/PageMetadata" } } }, - "DebtPositionType" : { - "required" : [ "brokerId", "code", "collectingReason", "description", "macroArea", "orgType", "serviceType", "taxonomyCode" ], + "InstallmentNoPII" : { + "required" : [ "amountCents", "debtorEntityType", "debtorFiscalCodeHash", "iud", "legacyPaymentMetadata", "paymentOptionId", "paymentTypeCode", "personalDataId", "remittanceInformation", "status" ], "type" : "object", "properties" : { "creationDate" : { @@ -3881,202 +3909,93 @@ "updateOperatorExternalId" : { "type" : "string" }, - "debtPositionTypeId" : { + "installmentId" : { "type" : "integer", "format" : "int64" }, - "brokerId" : { + "paymentOptionId" : { "type" : "integer", "format" : "int64" }, - "code" : { + "status" : { + "type" : "string", + "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] + }, + "iupdPagopa" : { "type" : "string" }, - "description" : { + "iud" : { "type" : "string" }, - "orgType" : { + "iuv" : { "type" : "string" }, - "macroArea" : { + "iur" : { "type" : "string" }, - "serviceType" : { + "iuf" : { "type" : "string" }, - "collectingReason" : { + "nav" : { "type" : "string" }, - "taxonomyCode" : { + "dueDate" : { + "type" : "string", + "format" : "date-time" + }, + "paymentTypeCode" : { "type" : "string" }, - "flagAnonymousFiscalCode" : { - "type" : "boolean" + "amountCents" : { + "type" : "integer", + "format" : "int64" }, - "flagMandatoryDueDate" : { - "type" : "boolean" + "notificationFeeCents" : { + "type" : "integer", + "format" : "int64" }, - "flagNotifyIo" : { - "type" : "boolean" + "remittanceInformation" : { + "type" : "string" }, - "ioTemplateMessage" : { + "humanFriendlyRemittanceInformation" : { "type" : "string" }, - "_links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "PagedModelDebtPositionType" : { - "type" : "object", - "properties" : { - "_embedded" : { - "type" : "object", - "properties" : { - "debtPositionTypes" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/DebtPositionType" - } - } - } - }, - "_links" : { - "$ref" : "#/components/schemas/Links" - }, - "page" : { - "$ref" : "#/components/schemas/PageMetadata" - } - } - }, - "ReceiptNoPII" : { - "required" : [ "channelDescription", "companyName", "creditorReferenceId", "debtorEntityType", "debtorFiscalCodeHash", "description", "idChannel", "idPsp", "noticeNumber", "orgFiscalCode", "outcome", "paymentAmountCents", "paymentReceiptId", "personalDataId", "pspCompanyName", "receiptOrigin" ], - "type" : "object", - "properties" : { - "creationDate" : { - "type" : "string", - "format" : "date-time" - }, - "updateDate" : { - "type" : "string", - "format" : "date-time" - }, - "updateOperatorExternalId" : { - "type" : "string" - }, - "receiptId" : { - "type" : "integer", - "format" : "int64" - }, - "installmentId" : { - "type" : "integer", - "format" : "int64" - }, - "ingestionFlowFileId" : { - "type" : "integer", - "format" : "int64" - }, - "receiptOrigin" : { - "type" : "string" - }, - "paymentReceiptId" : { - "type" : "string" - }, - "noticeNumber" : { - "type" : "string" - }, - "paymentNote" : { - "type" : "string" - }, - "orgFiscalCode" : { - "type" : "string" - }, - "outcome" : { - "type" : "string" - }, - "creditorReferenceId" : { - "type" : "string" - }, - "paymentAmountCents" : { - "type" : "integer", - "format" : "int64" - }, - "description" : { - "type" : "string" - }, - "companyName" : { - "type" : "string" - }, - "officeName" : { - "type" : "string" - }, - "idPsp" : { - "type" : "string" - }, - "pspFiscalCode" : { - "type" : "string" - }, - "pspPartitaIva" : { - "type" : "string" - }, - "pspCompanyName" : { - "type" : "string" - }, - "idChannel" : { - "type" : "string" - }, - "channelDescription" : { + "balance" : { "type" : "string" }, - "paymentMethod" : { + "legacyPaymentMetadata" : { "type" : "string" }, - "feeCents" : { + "personalDataId" : { "type" : "integer", "format" : "int64" }, - "paymentDateTime" : { - "type" : "string", - "format" : "date-time" - }, - "applicationDate" : { - "type" : "string", - "format" : "date-time" - }, - "transferDate" : { - "type" : "string", - "format" : "date-time" - }, - "standin" : { - "type" : "boolean" - }, "debtorEntityType" : { "type" : "string", "enum" : [ "F", "G" ] }, - "personalDataId" : { - "type" : "integer", - "format" : "int64" - }, "debtorFiscalCodeHash" : { "type" : "string", "format" : "byte" }, + "syncStatus" : { + "$ref" : "#/components/schemas/InstallmentSyncStatus" + }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelReceiptNoPII" : { + "PagedModelInstallmentNoPII" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "receiptNoPIIs" : { + "installmentNoPIIs" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/ReceiptNoPII" + "$ref" : "#/components/schemas/InstallmentNoPII" } } } @@ -4089,49 +4008,65 @@ } } }, - "ReceiptView" : { + "CollectionModelTransfer" : { "type" : "object", "properties" : { - "receiptId" : { - "type" : "integer", - "format" : "int64" + "_embedded" : { + "type" : "object", + "properties" : { + "transfers" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/TransferResponse" + } + } + } }, - "paymentAmountCents" : { + "_links" : { + "$ref" : "#/components/schemas/Links" + } + } + }, + "DebtPositionTypeWithCount" : { + "type" : "object", + "properties" : { + "debtPositionTypeId" : { "type" : "integer", "format" : "int64" }, - "paymentDateTime" : { + "code" : { + "type" : "string" + }, + "description" : { + "type" : "string" + }, + "updateDate" : { "type" : "string", "format" : "date-time" }, - "installmentId" : { + "activeOrganizations" : { "type" : "integer", - "format" : "int64" - }, - "receiptOrigin" : { - "type" : "string" - }, - "iuv" : { - "type" : "string" + "format" : "int32" }, - "description" : { - "type" : "string" + "brokerId" : { + "type" : "integer", + "format" : "int64" }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelReceiptView" : { + "PagedModelDebtPositionTypeWithCount" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "receiptViews" : { + "debtPositionTypeWithCounts" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/ReceiptView" + "$ref" : "#/components/schemas/DebtPositionTypeWithCount" } } } @@ -4144,22 +4079,8 @@ } } }, - "InstallmentSyncStatus" : { - "required" : [ "syncStatusFrom", "syncStatusTo" ], - "type" : "object", - "properties" : { - "syncStatusFrom" : { - "type" : "string", - "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] - }, - "syncStatusTo" : { - "type" : "string", - "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] - } - } - }, - "InstallmentNoPII" : { - "required" : [ "amountCents", "debtorEntityType", "debtorFiscalCodeHash", "iud", "legacyPaymentMetadata", "paymentOptionId", "paymentTypeCode", "personalDataId", "remittanceInformation", "status" ], + "Transfer" : { + "required" : [ "amountCents", "category", "installmentId", "orgFiscalCode", "remittanceInformation", "transferIndex" ], "type" : "object", "properties" : { "creationDate" : { @@ -4173,93 +4094,58 @@ "updateOperatorExternalId" : { "type" : "string" }, - "installmentId" : { + "transferId" : { "type" : "integer", "format" : "int64" }, - "paymentOptionId" : { + "installmentId" : { "type" : "integer", "format" : "int64" }, - "status" : { - "type" : "string", - "enum" : [ "TO_SYNC", "REPORTED", "PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] - }, - "iupdPagopa" : { - "type" : "string" - }, - "iud" : { - "type" : "string" - }, - "iuv" : { - "type" : "string" - }, - "iur" : { - "type" : "string" - }, - "iuf" : { - "type" : "string" - }, - "nav" : { + "orgFiscalCode" : { "type" : "string" }, - "dueDate" : { - "type" : "string", - "format" : "date-time" - }, - "paymentTypeCode" : { + "orgName" : { "type" : "string" }, "amountCents" : { "type" : "integer", "format" : "int64" }, - "notificationFeeCents" : { - "type" : "integer", - "format" : "int64" - }, "remittanceInformation" : { "type" : "string" }, - "humanFriendlyRemittanceInformation" : { + "stamp" : { + "$ref" : "#/components/schemas/Stamp" + }, + "iban" : { "type" : "string" }, - "balance" : { + "postalIban" : { "type" : "string" }, - "legacyPaymentMetadata" : { + "category" : { "type" : "string" }, - "personalDataId" : { + "transferIndex" : { "type" : "integer", - "format" : "int64" - }, - "debtorEntityType" : { - "type" : "string", - "enum" : [ "F", "G" ] - }, - "debtorFiscalCodeHash" : { - "type" : "string", - "format" : "byte" - }, - "syncStatus" : { - "$ref" : "#/components/schemas/InstallmentSyncStatus" + "format" : "int32" }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelInstallmentNoPII" : { + "PagedModelTransfer" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "installmentNoPIIs" : { + "transfers" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/InstallmentNoPII" + "$ref" : "#/components/schemas/Transfer" } } } @@ -4272,46 +4158,8 @@ } } }, - "CollectionModelTransfer" : { - "type" : "object", - "properties" : { - "_embedded" : { - "type" : "object", - "properties" : { - "transfers" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/TransferResponse" - } - } - } - }, - "_links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "CollectionModelObject" : { - "type" : "object", - "properties" : { - "_embedded" : { - "type" : "object", - "properties" : { - "objects" : { - "type" : "array", - "items" : { - "type" : "object" - } - } - } - }, - "_links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "PaymentOption" : { - "required" : [ "debtPositionId", "description", "paymentOptionType", "status", "totalAmountCents" ], + "DebtPositionType" : { + "required" : [ "brokerId", "code", "collectingReason", "description", "macroArea", "orgType", "serviceType", "taxonomyCode" ], "type" : "object", "properties" : { "creationDate" : { @@ -4322,54 +4170,65 @@ "type" : "string", "format" : "date-time" }, - "updateOperatorExternalId" : { + "updateOperatorExternalId" : { + "type" : "string" + }, + "debtPositionTypeId" : { + "type" : "integer", + "format" : "int64" + }, + "brokerId" : { + "type" : "integer", + "format" : "int64" + }, + "code" : { + "type" : "string" + }, + "description" : { + "type" : "string" + }, + "orgType" : { + "type" : "string" + }, + "macroArea" : { "type" : "string" }, - "paymentOptionId" : { - "type" : "integer", - "format" : "int64" + "serviceType" : { + "type" : "string" }, - "debtPositionId" : { - "type" : "integer", - "format" : "int64" + "collectingReason" : { + "type" : "string" }, - "totalAmountCents" : { - "type" : "integer", - "format" : "int64" + "taxonomyCode" : { + "type" : "string" }, - "status" : { - "type" : "string", - "enum" : [ "TO_SYNC", "REPORTED", "PAID", "PARTIALLY_PAID", "CANCELLED", "INVALID", "EXPIRED", "UNPAID", "DRAFT" ] + "flagAnonymousFiscalCode" : { + "type" : "boolean" }, - "multiDebtor" : { + "flagMandatoryDueDate" : { "type" : "boolean" }, - "dueDate" : { - "type" : "string", - "format" : "date-time" + "flagNotifyIo" : { + "type" : "boolean" }, - "description" : { + "ioTemplateMessage" : { "type" : "string" }, - "paymentOptionType" : { - "type" : "string", - "enum" : [ "SINGLE_INSTALLMENT", "INSTALLMENTS", "DOWN_PAYMENT" ] - }, "_links" : { "$ref" : "#/components/schemas/Links" } } }, - "PagedModelPaymentOption" : { + "PagedModelDebtPositionType" : { "type" : "object", "properties" : { "_embedded" : { "type" : "object", "properties" : { - "paymentOptions" : { + "debtPositionTypes" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/PaymentOption" + "$ref" : "#/components/schemas/DebtPositionType" } } } @@ -4382,25 +4241,6 @@ } } }, - "CollectionModelInstallmentNoPII" : { - "type" : "object", - "properties" : { - "_embedded" : { - "type" : "object", - "properties" : { - "installmentNoPIIs" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/InstallmentNoPIIResponse" - } - } - } - }, - "_links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, "DebtPositionTypeOrg" : { "required" : [ "code", "debtPositionTypeId", "description", "iban", "organizationId" ], "type" : "object", @@ -4524,6 +4364,201 @@ } } }, + "ReceiptNoPII" : { + "required" : [ "channelDescription", "companyName", "creditorReferenceId", "debtorEntityType", "debtorFiscalCodeHash", "description", "idChannel", "idPsp", "noticeNumber", "orgFiscalCode", "outcome", "paymentAmountCents", "paymentReceiptId", "personalDataId", "pspCompanyName", "receiptOrigin" ], + "type" : "object", + "properties" : { + "creationDate" : { + "type" : "string", + "format" : "date-time" + }, + "updateDate" : { + "type" : "string", + "format" : "date-time" + }, + "updateOperatorExternalId" : { + "type" : "string" + }, + "receiptId" : { + "type" : "integer", + "format" : "int64" + }, + "installmentId" : { + "type" : "integer", + "format" : "int64" + }, + "ingestionFlowFileId" : { + "type" : "integer", + "format" : "int64" + }, + "receiptOrigin" : { + "type" : "string" + }, + "paymentReceiptId" : { + "type" : "string" + }, + "noticeNumber" : { + "type" : "string" + }, + "paymentNote" : { + "type" : "string" + }, + "orgFiscalCode" : { + "type" : "string" + }, + "outcome" : { + "type" : "string" + }, + "creditorReferenceId" : { + "type" : "string" + }, + "paymentAmountCents" : { + "type" : "integer", + "format" : "int64" + }, + "description" : { + "type" : "string" + }, + "companyName" : { + "type" : "string" + }, + "officeName" : { + "type" : "string" + }, + "idPsp" : { + "type" : "string" + }, + "pspFiscalCode" : { + "type" : "string" + }, + "pspPartitaIva" : { + "type" : "string" + }, + "pspCompanyName" : { + "type" : "string" + }, + "idChannel" : { + "type" : "string" + }, + "channelDescription" : { + "type" : "string" + }, + "paymentMethod" : { + "type" : "string" + }, + "feeCents" : { + "type" : "integer", + "format" : "int64" + }, + "paymentDateTime" : { + "type" : "string", + "format" : "date-time" + }, + "applicationDate" : { + "type" : "string", + "format" : "date-time" + }, + "transferDate" : { + "type" : "string", + "format" : "date-time" + }, + "standin" : { + "type" : "boolean" + }, + "debtorEntityType" : { + "type" : "string", + "enum" : [ "F", "G" ] + }, + "personalDataId" : { + "type" : "integer", + "format" : "int64" + }, + "debtorFiscalCodeHash" : { + "type" : "string", + "format" : "byte" + }, + "_links" : { + "$ref" : "#/components/schemas/Links" + } + } + }, + "PagedModelReceiptNoPII" : { + "type" : "object", + "properties" : { + "_embedded" : { + "type" : "object", + "properties" : { + "receiptNoPIIs" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ReceiptNoPII" + } + } + } + }, + "_links" : { + "$ref" : "#/components/schemas/Links" + }, + "page" : { + "$ref" : "#/components/schemas/PageMetadata" + } + } + }, + "ReceiptView" : { + "type" : "object", + "properties" : { + "receiptId" : { + "type" : "integer", + "format" : "int64" + }, + "paymentAmountCents" : { + "type" : "integer", + "format" : "int64" + }, + "paymentDateTime" : { + "type" : "string", + "format" : "date-time" + }, + "installmentId" : { + "type" : "integer", + "format" : "int64" + }, + "receiptOrigin" : { + "type" : "string" + }, + "iuv" : { + "type" : "string" + }, + "description" : { + "type" : "string" + }, + "_links" : { + "$ref" : "#/components/schemas/Links" + } + } + }, + "PagedModelReceiptView" : { + "type" : "object", + "properties" : { + "_embedded" : { + "type" : "object", + "properties" : { + "receiptViews" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ReceiptView" + } + } + } + }, + "_links" : { + "$ref" : "#/components/schemas/Links" + }, + "page" : { + "$ref" : "#/components/schemas/PageMetadata" + } + } + }, "DebtPosition" : { "required" : [ "debtPositionOrigin", "debtPositionTypeOrgId", "iupdOrg", "organizationId", "status" ], "type" : "object", @@ -4555,7 +4590,7 @@ }, "debtPositionOrigin" : { "type" : "string", - "enum" : [ "ORDINARY", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] + "enum" : [ "ORDINARY", "ORDINARY_SIL", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] }, "ingestionFlowFileId" : { "type" : "integer", @@ -4845,7 +4880,7 @@ }, "debtPositionOrigin" : { "type" : "string", - "enum" : [ "ORDINARY", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] + "enum" : [ "ORDINARY", "ORDINARY_SIL", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] }, "ingestionFlowFileId" : { "type" : "integer", @@ -5409,7 +5444,7 @@ }, "debtPositionOrigin" : { "type" : "string", - "enum" : [ "ORDINARY", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] + "enum" : [ "ORDINARY", "ORDINARY_SIL", "SPONTANEOUS", "SECONDARY_ORG", "RECEIPT_FILE", "RECEIPT_PAGOPA", "REPORTING_PAGOPA" ] }, "ingestionFlowFileId" : { "type" : "integer", diff --git a/openapi/p4pa-debt-position.openapi.yaml b/openapi/p4pa-debt-position.openapi.yaml index 5467e28c..253cc3cd 100644 --- a/openapi/p4pa-debt-position.openapi.yaml +++ b/openapi/p4pa-debt-position.openapi.yaml @@ -608,6 +608,7 @@ components: type: string enum: - ORDINARY + - ORDINARY_SIL - SPONTANEOUS - SECONDARY_ORG - RECEIPT_FILE @@ -673,3 +674,68 @@ components: - DEBT_POSITION_NOT_FOUND message: type: string + DebtPositionTypeOrgDTO: + required: + - debtPositionTypeId + - organizationId + - code + - description + - iban + type: object + properties: + debtPositionTypeOrgId: + type: integer + format: int64 + debtPositionTypeId: + type: integer + format: int64 + organizationId: + type: integer + format: int64 + balance: + type: string + code: + type: string + description: + type: string + iban: + type: string + postalIban: + type: string + postalAccountCode: + type: string + holderPostalCc: + type: string + orgSector: + type: string + xsdDefinitionRef: + type: string + amountCents: + type: integer + format: int64 + externalPaymentUrl: + type: string + flagAnonymousFiscalCode: + type: boolean + flagMandatoryDueDate: + type: boolean + flagSpontaneous: + type: boolean + flagNotifyIo: + type: boolean + ioTemplateMessage: + type: string + flagActive: + type: boolean + flagNotifyOutcomePush: + type: boolean + notifyOutcomePushOrgSilServiceId: + type: integer + format: int64 + flagAmountActualization: + type: boolean + amountActualizationOrgSilServiceId: + type: integer + format: int64 + flagExternal: + type: boolean diff --git a/postman/p4pa-debt-positions-E2E.postman_collection.json b/postman/p4pa-debt-positions-E2E.postman_collection.json new file mode 100644 index 00000000..4bd8d60e --- /dev/null +++ b/postman/p4pa-debt-positions-E2E.postman_collection.json @@ -0,0 +1,443 @@ +{ + "info": { + "_postman_id": "24f9f82c-273a-4ae3-9a9c-c02c0d86b094", + "name": "p4pa-debt-positions-E2E.postman_collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "29646859" + }, + "item": [ + { + "name": "00_login", + "item": [ + { + "name": "00_getAuthToken", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm=instrumentPmMethod(pm);\r", + "\r", + "pm.test(\"DebtPosition - 00_getAuthtoken - Responses with 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "pm.test(\"DebtPosition - 00_getAuthtoken - Verify response body\", function () {\r", + " let jsonResponse = pm.response.json();\r", + "\r", + " pm.expect(jsonResponse).have.property(\"access_token\")\r", + " pm.expect(jsonResponse).have.property(\"token_type\")\r", + " pm.expect(jsonResponse).have.property(\"expires_in\")\r", + "});\r", + "\r", + "let jsonResponse = pm.response.json();\r", + "pm.collectionVariables.set(\"accessToken\", jsonResponse.access_token);\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{p4paAuthBaseUrl}}/auth/token?client_id=piattaforma-unitaria&grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token={{tokenExchange_subjectToken}}&subject_issuer={{tokenExchange_issuer}}&scope=openid&subject_token_type=urn:ietf:params:oauth:token-type:jwt", + "host": [ + "{{p4paAuthBaseUrl}}" + ], + "path": [ + "auth", + "token" + ], + "query": [ + { + "key": "client_id", + "value": "piattaforma-unitaria" + }, + { + "key": "grant_type", + "value": "urn:ietf:params:oauth:grant-type:token-exchange" + }, + { + "key": "subject_token", + "value": "{{tokenExchange_subjectToken}}" + }, + { + "key": "subject_issuer", + "value": "{{tokenExchange_issuer}}" + }, + { + "key": "scope", + "value": "openid" + }, + { + "key": "subject_token_type", + "value": "urn:ietf:params:oauth:token-type:jwt" + } + ] + } + }, + "response": [] + }, + { + "name": "00_findOrganizationByIpaCode", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm=instrumentPmMethod(pm);\r", + "\r", + "pm.test(\"DebtPosition - 00_findOrganizationByIpaCode - Responses with 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "pm.test(\"DebtPosition - 00_getAuthtoken - Verify response body\", function () {\r", + " let jsonResponse = pm.response.json();\r", + "\r", + " pm.expect(jsonResponse).have.property(\"organizationId\")\r", + " pm.expect(jsonResponse).have.property(\"orgFiscalCode\")\r", + "});\r", + "\r", + "let jsonResponse = pm.response.json();\r", + "pm.collectionVariables.set(\"organizationId\", jsonResponse.organizationId);\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{accessToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{organizationBaseUrl}}/crud/organizations/search/findByIpaCode?ipaCode={{codIpaEnte}}", + "host": [ + "{{organizationBaseUrl}}" + ], + "path": [ + "crud", + "organizations", + "search", + "findByIpaCode" + ], + "query": [ + { + "key": "ipaCode", + "value": "{{codIpaEnte}}" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "01_createDp", + "item": [ + { + "name": "01_findDebtPositionTypeOrgByOrgIdAndCode", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm=instrumentPmMethod(pm);\r", + "\r", + "pm.test(\"DebtPosition - 01_findDebtPositionTypeOrgByOrgIdAndCode - Responses with 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "pm.test(\"DebtPosition - 01_findDebtPositionTypeOrgByOrgIdAndCode - Verify response body\", function () {\r", + " let jsonResponse = pm.response.json();\r", + "\r", + " pm.expect(jsonResponse).have.property(\"debtPositionTypeOrgId\")\r", + " pm.expect(jsonResponse).have.property(\"code\")\r", + "});\r", + "\r", + "let jsonResponse = pm.response.json();\r", + "pm.collectionVariables.set(\"debtPositionTypeOrgId\", jsonResponse.debtPositionTypeOrgId);\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{accessToken}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "{{debtPositionBaseUrl}}/crud/debt-position-type-orgs/search/findByOrganizationIdAndCode?organizationId={{organizationId}}&code={{debtPositionTypeOrgCode}}", + "host": [ + "{{debtPositionBaseUrl}}" + ], + "path": [ + "crud", + "debt-position-type-orgs", + "search", + "findByOrganizationIdAndCode" + ], + "query": [ + { + "key": "organizationId", + "value": "{{organizationId}}" + }, + { + "key": "code", + "value": "{{debtPositionTypeOrgCode}}" + } + ] + } + }, + "response": [] + }, + { + "name": "01_createDebtPosition", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm=instrumentPmMethod(pm);\r", + "\r", + "pm.test(\"DebtPositions - 01_create_dp - Responses with 200\", function () {\r", + " pm.response.to.have.status(200);\r", + "});\r", + "\r", + "/*pm.test(\"DebtPositions - 01_create_dp - Verify response body\", function () {\r", + " let jsonResponse = pm.response.json();\r", + "\r", + " pm.expect(jsonResponse).have.property(\"workflowId\")\r", + "});\r", + "\r", + "let jsonResponse = pm.response.json();\r", + "pm.collectionVariables.set(\"workflowId\", jsonResponse.workflowId);*/\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "\r", + "\r", + "function generateRandomNumber() {\r", + " let randomNumber = '';\r", + " for (let i = 0; i < 10; i++) {\r", + " randomNumber += Math.floor(Math.random() * 10).toString();\r", + " }\r", + " return randomNumber;\r", + "}\r", + "\r", + "let randomNumber = generateRandomNumber();\r", + "\r", + "pm.collectionVariables.set(\"randomNumber\", randomNumber);\r", + "pm.collectionVariables.set(\"fiscalCode\", `AAAAAA69A45A602A`);\r", + "pm.collectionVariables.set(\"debtPositionId\", `${randomNumber}`);" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{accessToken}}", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"iupdOrg\": \"iupdOrg\",\r\n \"description\": \"description\",\r\n \"status\": \"TO_SYNC\",\r\n \"debtPositionOrigin\": \"SPONTANEOUS\",\r\n \"ingestionFlowFileId\": 1,\r\n \"ingestionFlowFileLineNumber\": 1,\r\n \"organizationId\": {{organizationId}},\r\n \"debtPositionTypeOrgId\": {{debtPositionTypeOrgId}},\r\n \"notificationDate\": \"2024-05-15T10:30:00+02:00\",\r\n \"validityDate\": \"2024-05-15T10:30:00+02:00\",\r\n \"flagIuvVolatile\": false,\r\n \"creationDate\": \"2024-05-15T10:30:00+02:00\",\r\n \"updateDate\": \"2024-05-15T10:30:00+02:00\",\r\n \"paymentOptions\": [\r\n {\r\n \"totalAmountCents\": 1,\r\n \"status\": \"TO_SYNC\",\r\n \"multiDebtor\": false,\r\n \"dueDate\": \"2026-05-15T10:30:00+02:00\",\r\n \"description\": \"description\",\r\n \"paymentOptionType\": \"DOWN_PAYMENT\",\r\n \"installments\": [\r\n {\r\n \"status\": \"TO_SYNC\",\r\n \"syncStatus\": {\r\n \"syncStatusFrom\": \"TO_SYNC\",\r\n \"syncStatusTo\": \"TO_SYNC\"\r\n },\r\n \"iupdPagopa\": \"iupdPagopa\",\r\n \"iud\": \"iud\",\r\n \"iuv\": \"\",\r\n \"iur\": \"iur\",\r\n \"iuf\": \"iuf\",\r\n \"nav\": \"\",\r\n \"dueDate\": \"2026-05-15T10:30:00+02:00\",\r\n \"paymentTypeCode\": \"paymentTypeCode\",\r\n \"amountCents\": 10000,\r\n \"notificationFeeCents\": 100,\r\n \"remittanceInformation\": \"remittanceInformation\",\r\n \"humanFriendlyRemittanceInformation\": \"humanFriendlyRemittanceInformation\",\r\n \"balance\": \"balance\",\r\n \"legacyPaymentMetadata\": \"legacyPaymentMetadata\",\r\n \"debtor\": {\r\n \"entityType\": \"F\",\r\n \"fiscalCode\": \"{{fiscalCode}}\",\r\n \"fullName\": \"fullName\",\r\n \"address\": \"address\",\r\n \"civic\": \"civic\",\r\n \"postalCode\": \"postalCode\",\r\n \"location\": \"location\",\r\n \"province\": \"province\",\r\n \"nation\": \"nation\",\r\n \"email\": \"email@test.it\"\r\n },\r\n \"transfers\": [\r\n {\r\n \"orgFiscalCode\": \"99999999912\",\r\n \"orgName\": \"test_ente_50\",\r\n \"amountCents\": 100,\r\n \"remittanceInformation\": \"remittanceInformation\",\r\n \"stampType\": \"stampType\",\r\n \"stampHashDocument\": \"stampHashDocument\",\r\n \"stampProvincialResidence\": \"stampProvincialResidence\",\r\n \"iban\": \"iban\",\r\n \"postalIban\": \"postalIban\",\r\n \"category\": \"category\",\r\n \"transferIndex\": 1\r\n }\r\n ],\r\n \"creationDate\": \"2024-05-15T10:30:00+02:00\",\r\n \"updateDate\": \"2024-05-15T10:30:00+02:00\"\r\n }\r\n ]\r\n }\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{debtPositionBaseUrl}}/debt-positions?massive=false&pagopaPayment=true", + "host": [ + "{{debtPositionBaseUrl}}" + ], + "path": [ + "debt-positions" + ], + "query": [ + { + "key": "massive", + "value": "false" + }, + { + "key": "pagopaPayment", + "value": "true" + } + ] + } + }, + "response": [] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "packages": {}, + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "packages": {}, + "exec": [ + "// START COMMON UTILITIES\r", + "\r", + "// global variable to use in order to skip tests\r", + "skipTests=false;\r", + "\r", + "// method to be invoked as first thing inside tests in order to instrument the \"pm\" variable:\r", + "// eg: pm = pm=instrumentPmMethod(pm);\r", + "instrumentPmMethod = (pm) => {\r", + " const pmProxy = {\r", + " get: function(pm, key) {\r", + " if (key == 'test') {\r", + " return (skipTests ? pm.test.skip : pm.test);\r", + " }\r", + " return pm[key];\r", + " }\r", + " };\r", + "\r", + " return new Proxy(pm, pmProxy);\r", + "}\r", + "\r", + "// function to be used in order to retry the current request, configuring a maximum number of attempts and a fixed delay between each invoke\r", + "retryRequest = (pm, setTimeout, waitingMillis = 1000, maxAttempts = 30) => {\r", + " if(!pm || !setTimeout){\r", + " throw new Error(\"Invalid invoke to retryRequest function! Some required parameters are undefined: pm=\" + pm + \", setTimeout=\" + setTimeout)\r", + " }\r", + "\r", + " const retryVariableName = \"retry_\" + pm.info.requestId\r", + " const attempt = (pm.variables.get(retryVariableName) ?? 0) + 1;\r", + " if(attempt < maxAttempts) {\r", + " console.info(pm.info.requestName + \" not ready, retrying [attempt \" + attempt + \"/\" + maxAttempts + \"] after \" + waitingMillis + \" ms\");\r", + " pm.variables.set(retryVariableName, attempt)\r", + " pm.execution.setNextRequest(pm.info.requestId);\r", + " return setTimeout(()=>{}, waitingMillis);\r", + " } else {\r", + " pm.test(pm.info.requestName + \" not ready\", () => pm.expect.fail(attempt + \" attempts\"));\r", + " }\r", + "}\r", + "\r", + "// function to be used in order to retry the current request until it returns a known response HTTP status code\r", + "retryWhenStatusCode = (pm, setTimeout, statusCode, waitingMillis, maxAttempts) => {\r", + " if(pm.response.code == statusCode){\r", + " console.log(\"Obtained \" + statusCode + \"! Performing retry...\")\r", + " skipTests=true;\r", + " return retryRequest(pm, setTimeout, waitingMillis, maxAttempts)\r", + " }\r", + "}\r", + "\r", + "// XML utilities\r", + "xml2js = require('xml2js');\r", + "\r", + "parseXmlResponse = (response) => {\r", + " let body;\r", + " xml2js.parseString(response.text(), {\r", + " ignoreAttrs: true, \r", + " explicitArray: false,\r", + " }, function (err, result) {\r", + " if(err){\r", + " console.error(err)\r", + " }\r", + " body = result;\r", + " });\r", + " return body;\r", + "};" + ] + } + } + ], + "variable": [ + { + "key": "accessToken", + "value": "" + }, + { + "key": "randomNumber", + "value": "" + }, + { + "key": "fiscalCode", + "value": "" + }, + { + "key": "debtPositionId", + "value": "" + }, + { + "key": "organizationId", + "value": "" + }, + { + "key": "debtPositionTypeOrgId", + "value": "" + }, + { + "key": "debtPositionTypeOrgCode", + "value": "CODE001", + "type": "string" + } + ] +} \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/citizen/model/PersonalData.java b/src/main/java/it/gov/pagopa/pu/debtpositions/citizen/model/PersonalData.java index f88ceae8..90bda6a1 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/citizen/model/PersonalData.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/citizen/model/PersonalData.java @@ -1,7 +1,6 @@ package it.gov.pagopa.pu.debtpositions.citizen.model; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -14,6 +13,8 @@ @Builder public class PersonalData { @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "personal_data_generator") + @SequenceGenerator(name = "personal_data_generator", sequenceName = "personal_data_id_seq", allocationSize = 1) private Long id; private String type; private byte[] data; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClient.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClient.java new file mode 100644 index 00000000..c71e26fb --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClient.java @@ -0,0 +1,21 @@ +package it.gov.pagopa.pu.debtpositions.connector.organization.client; + +import it.gov.pagopa.pu.debtpositions.connector.organization.config.OrganizationApisHolder; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import org.springframework.stereotype.Service; + +@Service +public class BrokerSearchClient { + + private final OrganizationApisHolder organizationApisHolder; + + public BrokerSearchClient(OrganizationApisHolder organizationApisHolder) { + this.organizationApisHolder = organizationApisHolder; + } + + public Broker findByOrganizationId(Long orgId, String accessToken) { + return organizationApisHolder.getBrokerSearchControllerApi(accessToken) + .crudBrokersFindByBrokeredOrganizationId(String.valueOf(orgId)); + } + +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolder.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolder.java index 78b10f17..81799e0e 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolder.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolder.java @@ -1,5 +1,6 @@ package it.gov.pagopa.pu.debtpositions.connector.organization.config; +import it.gov.pagopa.pu.organization.client.generated.BrokerSearchControllerApi; import it.gov.pagopa.pu.organization.client.generated.OrganizationEntityControllerApi; import it.gov.pagopa.pu.organization.client.generated.OrganizationSearchControllerApi; import it.gov.pagopa.pu.organization.client.generated.TaxonomySearchControllerApi; @@ -20,6 +21,8 @@ public class OrganizationApisHolder { private final TaxonomySearchControllerApi taxonomySearchControllerApi; + private final BrokerSearchControllerApi brokerSearchControllerApi; + private final ThreadLocal bearerTokenHolder = new ThreadLocal<>(); public OrganizationApisHolder( @@ -34,6 +37,7 @@ public OrganizationApisHolder( this.organizationSearchControllerApi = new OrganizationSearchControllerApi(apiClient); this.taxonomySearchControllerApi = new TaxonomySearchControllerApi(apiClient); this.organizationEntityControllerApi = new OrganizationEntityControllerApi(apiClient); + this.brokerSearchControllerApi = new BrokerSearchControllerApi(apiClient); } @PreDestroy @@ -56,6 +60,10 @@ public OrganizationEntityControllerApi getOrganizationEntityControllerApi(String return getApi(accessToken, organizationEntityControllerApi); } + public BrokerSearchControllerApi getBrokerSearchControllerApi(String accessToken) { + return getApi(accessToken, brokerSearchControllerApi); + } + private T getApi(String accessToken, T api) { bearerTokenHolder.set(accessToken); return api; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerService.java new file mode 100644 index 00000000..1233ee17 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerService.java @@ -0,0 +1,10 @@ +package it.gov.pagopa.pu.debtpositions.connector.organization.service; + +import it.gov.pagopa.pu.organization.dto.generated.Broker; + +import java.util.Optional; + +public interface BrokerService { + + Optional getBrokerByOrganizationId(Long organizationId, String accessToken); +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceImpl.java new file mode 100644 index 00000000..5aa83095 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceImpl.java @@ -0,0 +1,24 @@ +package it.gov.pagopa.pu.debtpositions.connector.organization.service; + +import it.gov.pagopa.pu.debtpositions.connector.organization.client.BrokerSearchClient; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class BrokerServiceImpl implements BrokerService { + + private final BrokerSearchClient brokerSearchClient; + + public BrokerServiceImpl(BrokerSearchClient brokerSearchClient) { + this.brokerSearchClient = brokerSearchClient; + } + + @Override + public Optional getBrokerByOrganizationId(Long organizationId, String accessToken) { + return Optional.ofNullable( + brokerSearchClient.findByOrganizationId(organizationId, accessToken) + ); + } +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationService.java similarity index 84% rename from src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationService.java rename to src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationService.java index e877d931..c203d175 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationService.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationService.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.organization.dto.generated.Organization; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceImpl.java similarity index 94% rename from src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceImpl.java rename to src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceImpl.java index f8e36d8e..b88f7ce4 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceImpl.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.debtpositions.connector.organization.client.OrganizationSearchClient; import it.gov.pagopa.pu.organization.dto.generated.Organization; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyService.java similarity index 75% rename from src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyService.java rename to src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyService.java index 77ebe9b8..050f867d 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyService.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyService.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.organization.dto.generated.Taxonomy; import java.util.Optional; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceImpl.java similarity index 91% rename from src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceImpl.java rename to src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceImpl.java index 8d30ad4c..1b3a13f4 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceImpl.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.debtpositions.connector.organization.client.TaxonomySearchClient; import it.gov.pagopa.pu.organization.dto.generated.Taxonomy; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorkflowApiClient.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorkflowApiClient.java new file mode 100644 index 00000000..8a75f42d --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorkflowApiClient.java @@ -0,0 +1,42 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.client; + +import it.gov.pagopa.pu.debtpositions.connector.workflow.config.WorkflowApisHolder; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.springframework.stereotype.Service; + +@Service +public class WorkflowApiClient { + + private final WorkflowApisHolder workflowApisHolder; + + public WorkflowApiClient(WorkflowApisHolder workflowApisHolder) { + this.workflowApisHolder = workflowApisHolder; + } + + public WorkflowCreatedDTO handleDpSync(DebtPositionDTO debtPositionDTO, String accessToken) { + return workflowApisHolder.getDebtPositionApi(accessToken) + .handleDpSync(debtPositionDTO); + } + + public WorkflowCreatedDTO alignDpSyncAca(DebtPositionDTO debtPositionDTO, String accessToken) { + return workflowApisHolder.getDebtPositionApi(accessToken) + .alignDpSyncAca(debtPositionDTO); + } + + public WorkflowCreatedDTO alignDpSyncGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken) { + return workflowApisHolder.getDebtPositionApi(accessToken) + .alignDpSyncGpdPreload(debtPositionDTO); + } + + public WorkflowCreatedDTO alignDpSyncAcaGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken) { + return workflowApisHolder.getDebtPositionApi(accessToken) + .alignDpSyncAcaGpdPreload(debtPositionDTO); + } + + public WorkflowCreatedDTO alignDpGPD(DebtPositionDTO debtPositionDTO, String accessToken) { + return workflowApisHolder.getDebtPositionApi(accessToken) + .alignDpGPD(debtPositionDTO); + } + +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolder.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolder.java new file mode 100644 index 00000000..835edbef --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolder.java @@ -0,0 +1,44 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.config; + +import it.gov.pagopa.pu.workflowhub.controller.generated.DebtPositionApi; +import it.gov.pagopa.pu.workflowhub.generated.ApiClient; +import it.gov.pagopa.pu.workflowhub.generated.BaseApi; +import jakarta.annotation.PreDestroy; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +public class WorkflowApisHolder { + + private final DebtPositionApi debtPositionApi; + + private final ThreadLocal bearerTokenHolder = new ThreadLocal<>(); + + public WorkflowApisHolder( + @Value("${rest.workflow-hub.base-url}") String baseUrl, + + RestTemplateBuilder restTemplateBuilder) { + RestTemplate restTemplate = restTemplateBuilder.build(); + ApiClient apiClient = new ApiClient(restTemplate); + apiClient.setBasePath(baseUrl); + apiClient.setBearerToken(bearerTokenHolder::get); + + this.debtPositionApi = new DebtPositionApi(apiClient); + } + + @PreDestroy + public void unload() { + bearerTokenHolder.remove(); + } + + public DebtPositionApi getDebtPositionApi(String accessToken) { + return getApi(accessToken, debtPositionApi); + } + + private T getApi(String accessToken, T api) { + bearerTokenHolder.set(accessToken); + return api; + } +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowService.java new file mode 100644 index 00000000..2bb01c43 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowService.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.service; + +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; + +public interface WorkflowService { + + WorkflowCreatedDTO handleDpSync(DebtPositionDTO debtPositionDTO, String accessToken); + + WorkflowCreatedDTO alignDpSyncAca(DebtPositionDTO debtPositionDTO, String accessToken); + + WorkflowCreatedDTO alignDpSyncGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken); + + WorkflowCreatedDTO alignDpSyncAcaGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken); + + WorkflowCreatedDTO alignDpGPD(DebtPositionDTO debtPositionDTO, String accessToken); +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceImpl.java new file mode 100644 index 00000000..67ace6fc --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceImpl.java @@ -0,0 +1,40 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.service; + +import it.gov.pagopa.pu.debtpositions.connector.workflow.client.WorkflowApiClient; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.springframework.stereotype.Service; + +@Service +public class WorkflowServiceImpl implements WorkflowService { + private final WorkflowApiClient workflowApiClient; + + public WorkflowServiceImpl(WorkflowApiClient workflowApiClient) { + this.workflowApiClient = workflowApiClient; + } + + @Override + public WorkflowCreatedDTO handleDpSync(DebtPositionDTO debtPositionDTO, String accessToken) { + return this.workflowApiClient.handleDpSync(debtPositionDTO, accessToken); + } + + @Override + public WorkflowCreatedDTO alignDpSyncAca(DebtPositionDTO debtPositionDTO, String accessToken) { + return this.workflowApiClient.alignDpSyncAca(debtPositionDTO, accessToken); + } + + @Override + public WorkflowCreatedDTO alignDpSyncGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken) { + return this.workflowApiClient.alignDpSyncGpdPreload(debtPositionDTO, accessToken); + } + + @Override + public WorkflowCreatedDTO alignDpSyncAcaGpdPreload(DebtPositionDTO debtPositionDTO, String accessToken) { + return this.workflowApiClient.alignDpSyncAcaGpdPreload(debtPositionDTO, accessToken); + } + + @Override + public WorkflowCreatedDTO alignDpGPD(DebtPositionDTO debtPositionDTO, String accessToken) { + return this.workflowApiClient.alignDpGPD(debtPositionDTO, accessToken); + } +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapper.java b/src/main/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapper.java index 4fb8467b..5b53db4b 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapper.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapper.java @@ -9,8 +9,7 @@ import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Optional; +import java.util.*; @Service public class InstallmentPIIMapper { @@ -48,6 +47,7 @@ public Pair map(Installment installment) { installmentNoPII.setCreationDate(installment.getCreationDate()); installmentNoPII.setUpdateDate(installment.getUpdateDate()); installmentNoPII.setUpdateOperatorExternalId(installment.getUpdateOperatorExternalId()); + installmentNoPII.setTransfers(new TreeSet<>(installment.getTransfers())); if (installment.getNoPII() != null) { installmentNoPII.setPersonalDataId(installment.getNoPII().getPersonalDataId()); diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/model/InstallmentNoPII.java b/src/main/java/it/gov/pagopa/pu/debtpositions/model/InstallmentNoPII.java index 82c00142..b4f11768 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/model/InstallmentNoPII.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/model/InstallmentNoPII.java @@ -68,6 +68,8 @@ public class InstallmentNoPII extends BaseEntity implements Serializable, Compar @Override public int compareTo(@Nonnull InstallmentNoPII o) { - return Comparator.comparing(InstallmentNoPII::getInstallmentId).compare(this, o); + return Comparator + .comparing(InstallmentNoPII::getInstallmentId, Comparator.nullsFirst(Comparator.naturalOrder())) + .compare(this, o); } } diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/model/PaymentOption.java b/src/main/java/it/gov/pagopa/pu/debtpositions/model/PaymentOption.java index 91f360c8..7bd7e2c3 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/model/PaymentOption.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/model/PaymentOption.java @@ -45,6 +45,9 @@ public class PaymentOption extends BaseEntity implements Serializable, Comparabl @Override public int compareTo(@Nonnull PaymentOption o) { - return Comparator.comparing(PaymentOption::getPaymentOptionId).compare(this, o); + return Comparator + .comparing(PaymentOption::getPaymentOptionId, Comparator.nullsFirst(Comparator.naturalOrder())) + .compare(this, o); } + } diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/model/Transfer.java b/src/main/java/it/gov/pagopa/pu/debtpositions/model/Transfer.java index a37ae5a4..d698aac4 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/model/Transfer.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/model/Transfer.java @@ -45,6 +45,9 @@ public class Transfer extends BaseEntity implements Serializable, Comparable { Optional findByOrganizationIdAndDebtPositionTypeOrgId(Long organizationId, Long debtPositionTypeOrgId); + + Optional findByOrganizationIdAndCode(Long organizationId, String code); } diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceImpl.java index 851ef344..093e32d1 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceImpl.java @@ -1,7 +1,7 @@ package it.gov.pagopa.pu.debtpositions.service.create; import it.gov.pagopa.pu.debtpositions.exception.custom.InvalidValueException; -import it.gov.pagopa.pu.debtpositions.connector.organization.OrganizationService; +import it.gov.pagopa.pu.debtpositions.connector.organization.service.OrganizationService; import it.gov.pagopa.pu.organization.dto.generated.Organization; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImpl.java index a7512f97..9de3c360 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImpl.java @@ -1,6 +1,6 @@ package it.gov.pagopa.pu.debtpositions.service.create; -import it.gov.pagopa.pu.debtpositions.connector.organization.TaxonomyService; +import it.gov.pagopa.pu.debtpositions.connector.organization.service.TaxonomyService; import it.gov.pagopa.pu.debtpositions.exception.custom.InvalidValueException; import it.gov.pagopa.pu.debtpositions.util.Utilities; import it.gov.pagopa.pu.debtpositions.dto.generated.*; diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImpl.java index 19cbab9a..3dd5d091 100644 --- a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImpl.java +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImpl.java @@ -7,6 +7,9 @@ import it.gov.pagopa.pu.debtpositions.service.DebtPositionService; import it.gov.pagopa.pu.debtpositions.service.create.GenerateIuvService; import it.gov.pagopa.pu.debtpositions.service.create.ValidateDebtPositionService; +import it.gov.pagopa.pu.debtpositions.service.create.debtposition.workflow.DebtPositionSyncService; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -18,19 +21,25 @@ public class CreateDebtPositionServiceImpl implements CreateDebtPositionService private final ValidateDebtPositionService validateDebtPositionService; private final DebtPositionService debtPositionService; private final GenerateIuvService generateIuvService; + private final DebtPositionSyncService debtPositionSyncService; private final InstallmentNoPIIRepository installmentNoPIIRepository; + private final DebtPositionProcessorService debtPositionProcessorService; public CreateDebtPositionServiceImpl(AuthorizeOperatorOnDebtPositionTypeService authorizeOperatorOnDebtPositionTypeService, ValidateDebtPositionService validateDebtPositionService, DebtPositionService debtPositionService, GenerateIuvService generateIuvService, - InstallmentNoPIIRepository installmentNoPIIRepository) { + DebtPositionSyncService debtPositionSyncService, + InstallmentNoPIIRepository installmentNoPIIRepository, DebtPositionProcessorService debtPositionProcessorService) { this.authorizeOperatorOnDebtPositionTypeService = authorizeOperatorOnDebtPositionTypeService; this.validateDebtPositionService = validateDebtPositionService; this.debtPositionService = debtPositionService; this.generateIuvService = generateIuvService; + this.debtPositionSyncService = debtPositionSyncService; this.installmentNoPIIRepository = installmentNoPIIRepository; + this.debtPositionProcessorService = debtPositionProcessorService; } + @Transactional @Override public DebtPositionDTO createDebtPosition(DebtPositionDTO debtPositionDTO, Boolean massive, Boolean pagopaPayment, String accessToken, String operatorExternalUserId) { log.info("Creating a DebtPosition having organizationId {}, debtPositionTypeOrgId {}, iupdOrg {}, ingestionFlowFileId {}, rowNumber {}", debtPositionDTO.getOrganizationId(), @@ -40,8 +49,10 @@ public DebtPositionDTO createDebtPosition(DebtPositionDTO debtPositionDTO, Boole validateDebtPositionService.validate(debtPositionDTO, accessToken); verifyInstallmentUniqueness(debtPositionDTO); generateIuv(debtPositionDTO, pagopaPayment, accessToken); + DebtPositionDTO debtPositionUpdated = debtPositionProcessorService.updateAmounts(debtPositionDTO); - DebtPositionDTO savedDebtPosition = debtPositionService.saveDebtPosition(debtPositionDTO); + DebtPositionDTO savedDebtPosition = debtPositionService.saveDebtPosition(debtPositionUpdated); + invokeWorkflow(savedDebtPosition, pagopaPayment, accessToken, massive); log.info("DebtPosition created with id {}", debtPositionDTO.getDebtPositionId()); return savedDebtPosition; @@ -72,4 +83,13 @@ private void generateIuv(DebtPositionDTO debtPositionDTO, Boolean pagopaPayment, }); } } + + private void invokeWorkflow(DebtPositionDTO debtPositionDTO, Boolean pagopaPayment, String accessToken, Boolean massive) { + WorkflowCreatedDTO workflow = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, accessToken, pagopaPayment, massive); + if (workflow != null) { + log.info("Workflow created with id {}", workflow.getWorkflowId()); + } else { + log.info("Workflow creation was not executed for debtPositionId {}, origin {}, pagopaPayment {}, massive {}: received null response", debtPositionDTO.getDebtPositionId(), debtPositionDTO.getDebtPositionOrigin(), pagopaPayment, massive); + } + } } diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorService.java new file mode 100644 index 00000000..c126e3d1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorService.java @@ -0,0 +1,7 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition; + +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; + +public interface DebtPositionProcessorService { + DebtPositionDTO updateAmounts(DebtPositionDTO debtPositionDTO); +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImpl.java new file mode 100644 index 00000000..924e6306 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImpl.java @@ -0,0 +1,29 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition; + +import it.gov.pagopa.pu.debtpositions.dto.generated.*; +import org.springframework.stereotype.Service; + +@Service +public class DebtPositionProcessorServiceImpl implements DebtPositionProcessorService { + + @Override + public DebtPositionDTO updateAmounts(DebtPositionDTO debtPositionDTO) { + debtPositionDTO.getPaymentOptions().forEach(paymentOption -> { + long totalPaymentOptionAmount = paymentOption.getInstallments().stream() + .filter(installment -> installment.getStatus() != InstallmentStatus.CANCELLED) + .mapToLong(installment -> { + long totalInstallmentAmount = installment.getTransfers().stream() + .mapToLong(TransferDTO::getAmountCents) + .sum(); + installment.setAmountCents(totalInstallmentAmount); + return totalInstallmentAmount; + }) + .sum(); + + paymentOption.setTotalAmountCents(totalPaymentOptionAmount); + }); + + return debtPositionDTO; + } + +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncService.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncService.java new file mode 100644 index 00000000..86ac6c59 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncService.java @@ -0,0 +1,9 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition.workflow; + +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; + +public interface DebtPositionSyncService { + + WorkflowCreatedDTO invokeWorkFlow(DebtPositionDTO debtPositionDTO, String accessToken, Boolean pagopaPayment, Boolean massive); +} diff --git a/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImpl.java b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImpl.java new file mode 100644 index 00000000..60f12873 --- /dev/null +++ b/src/main/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImpl.java @@ -0,0 +1,58 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition.workflow; + +import it.gov.pagopa.pu.debtpositions.connector.organization.service.BrokerService; +import it.gov.pagopa.pu.debtpositions.connector.workflow.service.WorkflowService; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionOrigin; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.Set; + +@Service +public class DebtPositionSyncServiceImpl implements DebtPositionSyncService { + + private final BrokerService brokerService; + private final WorkflowService workflowService; + + private static final Set DEBT_POSITION_ORIGIN_TO_SYNC = Set.of( + DebtPositionOrigin.ORDINARY, + DebtPositionOrigin.ORDINARY_SIL, + DebtPositionOrigin.SPONTANEOUS + ); + + public DebtPositionSyncServiceImpl(BrokerService brokerService, WorkflowService workflowService) { + this.brokerService = brokerService; + this.workflowService = workflowService; + } + + @Override + public WorkflowCreatedDTO invokeWorkFlow(DebtPositionDTO debtPositionDTO, String accessToken, Boolean pagopaPayment, Boolean massive) { + if (Boolean.TRUE.equals(pagopaPayment) && DEBT_POSITION_ORIGIN_TO_SYNC.contains(debtPositionDTO.getDebtPositionOrigin())) { + Optional optBroker = brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), accessToken); + WorkflowCreatedDTO workflowCreatedDTO = null; + + if (optBroker.isPresent()) { + Broker broker = optBroker.get(); + workflowCreatedDTO = switch (broker.getPagoPaInteractionModel()) { + case SYNC -> + workflowService.handleDpSync(debtPositionDTO, accessToken); + case SYNC_ACA -> + workflowService.alignDpSyncAca(debtPositionDTO, accessToken); + case SYNC_GPDPRELOAD -> + workflowService.alignDpSyncGpdPreload(debtPositionDTO, accessToken); + case SYNC_ACA_GPDPRELOAD -> + Boolean.TRUE.equals(massive) ? null : workflowService.alignDpSyncAcaGpdPreload(debtPositionDTO, accessToken); + case ASYNC_GPD -> + Boolean.TRUE.equals(massive) ? null : workflowService.alignDpGPD(debtPositionDTO, accessToken); + }; + } + + return workflowCreatedDTO; + } + return null; + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7397c55d..bf2f819e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -128,7 +128,9 @@ rest: connect-millis: "\${DEFAULT_REST_CONNECT_TIMEOUT_MILLIS:60000}" read-millis: "\${DEFAULT_REST_READ_TIMEOUT_MILLIS:60000}" organization: - base-url: "\${ORGANIZATION_BASE_URL:http://p4pa-organization-microservice-chart:8080}" + base-url: "\${ORGANIZATION_BASE_URL:http://localhost:8081}" + workflow-hub: + base-url: "\${WORKFLOW_HUB_BASE_URL:http://localhost:8082}/workflowhub" iuv: - informationSystemId: 00 + informationSystemId: "00" diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClientTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClientTest.java new file mode 100644 index 00000000..4bfa2023 --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/client/BrokerSearchClientTest.java @@ -0,0 +1,54 @@ +package it.gov.pagopa.pu.debtpositions.connector.organization.client; + +import it.gov.pagopa.pu.debtpositions.connector.organization.config.OrganizationApisHolder; +import it.gov.pagopa.pu.organization.client.generated.BrokerSearchControllerApi; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class BrokerSearchClientTest { + @Mock + private OrganizationApisHolder organizationApisHolderMock; + @Mock + private BrokerSearchControllerApi brokerSearchControllerApiMock; + + private BrokerSearchClient brokerSearchClient; + + @BeforeEach + void setUp() { + brokerSearchClient = new BrokerSearchClient(organizationApisHolderMock); + } + + @AfterEach + void verifyNoMoreInteractions() { + Mockito.verifyNoMoreInteractions( + organizationApisHolderMock + ); + } + + @Test + void whenFindByIdThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + String orgId = "1"; + Broker expectedResult = new Broker(); + + Mockito.when(organizationApisHolderMock.getBrokerSearchControllerApi(accessToken)) + .thenReturn(brokerSearchControllerApiMock); + Mockito.when(brokerSearchControllerApiMock.crudBrokersFindByBrokeredOrganizationId(orgId)) + .thenReturn(expectedResult); + + // When + Broker result = brokerSearchClient.findByOrganizationId(Long.valueOf(orgId), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolderTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolderTest.java index 1d58cb76..abb9a55c 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolderTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/config/OrganizationApisHolderTest.java @@ -1,6 +1,7 @@ package it.gov.pagopa.pu.debtpositions.connector.organization.config; import it.gov.pagopa.pu.debtpositions.connector.BaseApiHolderTest; +import it.gov.pagopa.pu.organization.dto.generated.Broker; import it.gov.pagopa.pu.organization.dto.generated.Organization; import it.gov.pagopa.pu.organization.dto.generated.Taxonomy; import it.gov.pagopa.pu.organization.generated.ApiClient; @@ -66,4 +67,13 @@ void whenGetOrganizationEntityControllerApiThenAuthenticationShouldBeSetInThread organizationApisHolder::unload); } + @Test + void whenGetBrokerSearchControllerApiThenAuthenticationShouldBeSetInThreadSafeMode() throws InterruptedException { + assertAuthenticationShouldBeSetInThreadSafeMode( + accessToken -> organizationApisHolder.getBrokerSearchControllerApi(accessToken) + .crudBrokersFindByBrokeredOrganizationId("ORGID"), + Broker.class, + organizationApisHolder::unload); + } + } diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceTest.java new file mode 100644 index 00000000..cd676c17 --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/BrokerServiceTest.java @@ -0,0 +1,65 @@ +package it.gov.pagopa.pu.debtpositions.connector.organization.service; + +import it.gov.pagopa.pu.debtpositions.connector.organization.client.BrokerSearchClient; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +@ExtendWith(MockitoExtension.class) +class BrokerServiceTest { + + @Mock + private BrokerSearchClient brokerSearchClientMock; + + private BrokerService brokerService; + + private final String accessToken = "ACCESSTOKEN"; + + @BeforeEach + void init() { + brokerService = new BrokerServiceImpl(brokerSearchClientMock); + } + + @AfterEach + void verifyNoMoreInteractions() { + Mockito.verifyNoMoreInteractions(brokerSearchClientMock); + } + + @Test + void givenNotExistentOrgIdWhenGetOrganizationByIdThenEmpty() { + // Given + Long orgId = 1L; + Mockito.when(brokerSearchClientMock.findByOrganizationId(orgId, accessToken)) + .thenReturn(null); + + // When + Optional result = brokerService.getBrokerByOrganizationId(orgId, accessToken); + + // Then + Assertions.assertTrue(result.isEmpty()); + } + + @Test + void givenExistentOrgIdWhenGetOrganizationByIdThenEmpty() { + // Given + Long orgId = 1L; + Broker expectedResult = new Broker(); + Mockito.when(brokerSearchClientMock.findByOrganizationId(orgId, accessToken)) + .thenReturn(expectedResult); + + // When + Optional result = brokerService.getBrokerByOrganizationId(orgId, accessToken); + + // Then + Assertions.assertTrue(result.isPresent()); + Assertions.assertSame(expectedResult, result.get()); + } +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceTest.java similarity index 98% rename from src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceTest.java rename to src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceTest.java index 4f43775b..958b0ea1 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/OrganizationServiceTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/OrganizationServiceTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.debtpositions.connector.organization.client.OrganizationSearchClient; import it.gov.pagopa.pu.organization.dto.generated.Organization; diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceTest.java similarity index 96% rename from src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceTest.java rename to src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceTest.java index 5e54b83e..4082165a 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/TaxonomyServiceTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/organization/service/TaxonomyServiceTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.pu.debtpositions.connector.organization; +package it.gov.pagopa.pu.debtpositions.connector.organization.service; import it.gov.pagopa.pu.debtpositions.connector.organization.client.TaxonomySearchClient; import it.gov.pagopa.pu.organization.dto.generated.Taxonomy; diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorflowApiClientTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorflowApiClientTest.java new file mode 100644 index 00000000..d23ef88e --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/client/WorflowApiClientTest.java @@ -0,0 +1,131 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.client; + +import it.gov.pagopa.pu.debtpositions.connector.workflow.config.WorkflowApisHolder; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.controller.generated.DebtPositionApi; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class WorflowApiClientTest { + @Mock + private WorkflowApisHolder workflowApisHolderMock; + @Mock + private DebtPositionApi debtPositionApiMock; + + private WorkflowApiClient workflowApiClient; + + @BeforeEach + void setUp() { + workflowApiClient = new WorkflowApiClient(workflowApisHolderMock); + } + + @AfterEach + void verifyNoMoreInteractions() { + Mockito.verifyNoMoreInteractions( + workflowApisHolderMock + ); + } + + @Test + void whenHandleDpSyncThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + DebtPositionDTO debtPositionDTO = new DebtPositionDTO(); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + + Mockito.when(workflowApisHolderMock.getDebtPositionApi(accessToken)) + .thenReturn(debtPositionApiMock); + Mockito.when(debtPositionApiMock.handleDpSync(debtPositionDTO)) + .thenReturn(new WorkflowCreatedDTO("1")); + + // When + WorkflowCreatedDTO result = workflowApiClient.handleDpSync(debtPositionDTO, accessToken); + + // Then + Assertions.assertSame(expectedResult.getWorkflowId(), result.getWorkflowId()); + } + + @Test + void whenAlignDpSyncAcaThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + DebtPositionDTO debtPositionDTO = new DebtPositionDTO(); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + + Mockito.when(workflowApisHolderMock.getDebtPositionApi(accessToken)) + .thenReturn(debtPositionApiMock); + Mockito.when(debtPositionApiMock.alignDpSyncAca(debtPositionDTO)) + .thenReturn(new WorkflowCreatedDTO("1")); + + // When + WorkflowCreatedDTO result = workflowApiClient.alignDpSyncAca(debtPositionDTO, accessToken); + + // Then + Assertions.assertSame(expectedResult.getWorkflowId(), result.getWorkflowId()); + } + + @Test + void whenAlignDpSyncGpdPreloadThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + DebtPositionDTO debtPositionDTO = new DebtPositionDTO(); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + + Mockito.when(workflowApisHolderMock.getDebtPositionApi(accessToken)) + .thenReturn(debtPositionApiMock); + Mockito.when(debtPositionApiMock.alignDpSyncGpdPreload(debtPositionDTO)) + .thenReturn(new WorkflowCreatedDTO("1")); + + // When + WorkflowCreatedDTO result = workflowApiClient.alignDpSyncGpdPreload(debtPositionDTO, accessToken); + + // Then + Assertions.assertSame(expectedResult.getWorkflowId(), result.getWorkflowId()); + } + + @Test + void whenAlignDpSyncAcaGpdPreloadThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + DebtPositionDTO debtPositionDTO = new DebtPositionDTO(); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + + Mockito.when(workflowApisHolderMock.getDebtPositionApi(accessToken)) + .thenReturn(debtPositionApiMock); + Mockito.when(debtPositionApiMock.alignDpSyncAcaGpdPreload(debtPositionDTO)) + .thenReturn(new WorkflowCreatedDTO("1")); + + // When + WorkflowCreatedDTO result = workflowApiClient.alignDpSyncAcaGpdPreload(debtPositionDTO, accessToken); + + // Then + Assertions.assertSame(expectedResult.getWorkflowId(), result.getWorkflowId()); + } + + @Test + void whenAlignDpGPDThenInvokeWithAccessToken() { + // Given + String accessToken = "ACCESSTOKEN"; + DebtPositionDTO debtPositionDTO = new DebtPositionDTO(); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + + Mockito.when(workflowApisHolderMock.getDebtPositionApi(accessToken)) + .thenReturn(debtPositionApiMock); + Mockito.when(debtPositionApiMock.alignDpGPD(debtPositionDTO)) + .thenReturn(new WorkflowCreatedDTO("1")); + + // When + WorkflowCreatedDTO result = workflowApiClient.alignDpGPD(debtPositionDTO, accessToken); + + // Then + Assertions.assertSame(expectedResult.getWorkflowId(), result.getWorkflowId()); + } +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolderTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolderTest.java new file mode 100644 index 00000000..37102eb9 --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/config/WorkflowApisHolderTest.java @@ -0,0 +1,51 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.config; + +import it.gov.pagopa.pu.debtpositions.connector.BaseApiHolderTest; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.organization.generated.ApiClient; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; + +@ExtendWith(MockitoExtension.class) +class WorkflowApisHolderTest extends BaseApiHolderTest { + @Mock + private RestTemplateBuilder restTemplateBuilderMock; + + private WorkflowApisHolder workflowApisHolder; + + @BeforeEach + void setUp() { + Mockito.when(restTemplateBuilderMock.build()).thenReturn(restTemplateMock); + Mockito.when(restTemplateMock.getUriTemplateHandler()).thenReturn(new DefaultUriBuilderFactory()); + ApiClient apiClient = new ApiClient(restTemplateMock); + String baseUrl = "http://example.com"; + apiClient.setBasePath(baseUrl); + workflowApisHolder = new WorkflowApisHolder(baseUrl, restTemplateBuilderMock); + } + + @AfterEach + void verifyNoMoreInteractions() { + Mockito.verifyNoMoreInteractions( + restTemplateBuilderMock, + restTemplateMock + ); + } + + @Test + void whenDebtPositionApiThenAuthenticationShouldBeSetInThreadSafeMode() throws InterruptedException { + assertAuthenticationShouldBeSetInThreadSafeMode( + accessToken -> workflowApisHolder.getDebtPositionApi(accessToken) + .handleDpSync(new DebtPositionDTO()), + WorkflowCreatedDTO.class, + workflowApisHolder::unload); + } + +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceTest.java new file mode 100644 index 00000000..f5251d5d --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/connector/workflow/service/WorkflowServiceTest.java @@ -0,0 +1,108 @@ +package it.gov.pagopa.pu.debtpositions.connector.workflow.service; + +import it.gov.pagopa.pu.debtpositions.connector.workflow.client.WorkflowApiClient; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class WorkflowServiceTest { + + @Mock + private WorkflowApiClient workflowApiClientMock; + + private WorkflowService workflowService; + + private final String accessToken = "ACCESSTOKEN"; + + @BeforeEach + void init() { + workflowService = new WorkflowServiceImpl( + workflowApiClientMock + ); + } + + @AfterEach + void verifyNoMoreInteractions() { + Mockito.verifyNoMoreInteractions( + workflowApiClientMock + ); + } + + @Test + void givenValidDebtPositionRequestDTOWhenHandleDpSyncThenEmpty() { + // Given + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + Mockito.when(workflowApiClientMock.handleDpSync(new DebtPositionDTO(), accessToken)) + .thenReturn(expectedResult); + + // When + WorkflowCreatedDTO result = workflowService.handleDpSync(new DebtPositionDTO(), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } + + @Test + void givenValidDebtPositionRequestDTOWhenAlignDpSyncAcaThenEmpty(){ + // Given + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + Mockito.when(workflowApiClientMock.alignDpSyncAca(new DebtPositionDTO(), accessToken)) + .thenReturn(expectedResult); + + // When + WorkflowCreatedDTO result = workflowService.alignDpSyncAca(new DebtPositionDTO(), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } + + @Test + void givenValidDebtPositionRequestDTOWhenAlignDpSyncGpdPreloadThenEmpty(){ + // Given + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + Mockito.when(workflowApiClientMock.alignDpSyncGpdPreload(new DebtPositionDTO(), accessToken)) + .thenReturn(expectedResult); + + // When + WorkflowCreatedDTO result = workflowService.alignDpSyncGpdPreload(new DebtPositionDTO(), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } + + @Test + void givenValidDebtPositionRequestDTOWhenAlignDpSyncAcaGpdPreloadThenEmpty(){ + // Given + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + Mockito.when(workflowApiClientMock.alignDpSyncAcaGpdPreload(new DebtPositionDTO(), accessToken)) + .thenReturn(expectedResult); + + // When + WorkflowCreatedDTO result = workflowService.alignDpSyncAcaGpdPreload(new DebtPositionDTO(), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } + + @Test + void givenValidDebtPositionRequestDTOWhenAlignDpGPDThenEmpty(){ + // Given + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO("1"); + Mockito.when(workflowApiClientMock.alignDpGPD(new DebtPositionDTO(), accessToken)) + .thenReturn(expectedResult); + + // When + WorkflowCreatedDTO result = workflowService.alignDpGPD(new DebtPositionDTO(), accessToken); + + // Then + Assertions.assertSame(expectedResult, result); + } +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapperTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapperTest.java index cf4e8000..1ae57804 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapperTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/mapper/InstallmentPIIMapperTest.java @@ -56,7 +56,7 @@ void testMap() { reflectionEqualsByName(installmentNoPIIExpected, result.getFirst()); reflectionEqualsByName(installmentPIIDTOExpected, result.getSecond()); - checkNotNullFields(result.getFirst(), "transfers", "personalDataId", "debtorFiscalCodeHash"); + checkNotNullFields(result.getFirst(), "personalDataId", "debtorFiscalCodeHash"); checkNotNullFields(result.getSecond()); } @@ -112,7 +112,7 @@ void testMapInstallmentWithNullSyncStatus() { reflectionEqualsByName(installmentNoPIIExpected, result.getFirst()); reflectionEqualsByName(installmentPIIDTOExpected, result.getSecond()); - checkNotNullFields(result.getFirst(), "transfers", "personalDataId", + checkNotNullFields(result.getFirst(), "personalDataId", "debtorFiscalCodeHash", "syncStatus"); checkNotNullFields(result.getSecond()); } diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceTest.java index d5688152..785689a5 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/GenerateIuvServiceTest.java @@ -1,6 +1,6 @@ package it.gov.pagopa.pu.debtpositions.service.create; -import it.gov.pagopa.pu.debtpositions.connector.organization.OrganizationService; +import it.gov.pagopa.pu.debtpositions.connector.organization.service.OrganizationService; import it.gov.pagopa.pu.debtpositions.exception.custom.InvalidValueException; import it.gov.pagopa.pu.debtpositions.util.faker.OrganizationFaker; import it.gov.pagopa.pu.organization.dto.generated.Organization; @@ -30,6 +30,8 @@ class GenerateIuvServiceTest { private static final String VALID_ORG_IPA_CODE = "VALID_IPA_CODE"; private static final Organization VALID_ORG = OrganizationFaker.buildOrganization() .organizationId(1L) + .orgName("ORG_NAME") + .status(Organization.StatusEnum.ACTIVE) .orgFiscalCode(VALID_ORG_FISCAL_CODE) .ipaCode(VALID_ORG_IPA_CODE); private static final String VALID_IUV = "12345678901234567"; diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/IuvServiceTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/IuvServiceTest.java index 6a38f4b9..c303a0ce 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/IuvServiceTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/IuvServiceTest.java @@ -24,6 +24,8 @@ class IuvServiceTest { private static final String VALID_APPLICATION_CODE = "01"; private static final Organization VALID_ORG = OrganizationFaker.buildOrganization() .organizationId(1L) + .orgName("ORG_NAME") + .status(Organization.StatusEnum.ACTIVE) .orgFiscalCode(VALID_ORG_FISCAL_CODE) .ipaCode(VALID_ORG_IPA_CODE) .segregationCode(VALID_APPLICATION_CODE); @@ -37,6 +39,8 @@ class IuvServiceTest { private static final long INVALID_PAYMENT_INDEX = 0L; private static final Organization INVALID_ORG = OrganizationFaker.buildOrganization() .organizationId(99L) + .orgName("INVALID_ORG_NAME") + .status(Organization.StatusEnum.DRAFT) .orgFiscalCode(INVALID_ORG_FISCAL_CODE) .ipaCode(INVALID_ORG_IPA_CODE); diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImplTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImplTest.java index 7c3ce5e1..e5c66abe 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/ValidateDebtPositionServiceImplTest.java @@ -1,6 +1,6 @@ package it.gov.pagopa.pu.debtpositions.service.create; -import it.gov.pagopa.pu.debtpositions.connector.organization.TaxonomyService; +import it.gov.pagopa.pu.debtpositions.connector.organization.service.TaxonomyService; import it.gov.pagopa.pu.debtpositions.exception.custom.InvalidValueException; import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; import it.gov.pagopa.pu.debtpositions.dto.generated.TransferDTO; diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImplTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImplTest.java index 2da8daba..e37566fc 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/CreateDebtPositionServiceImplTest.java @@ -1,6 +1,7 @@ package it.gov.pagopa.pu.debtpositions.service.create.debtposition; import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionOrigin; import it.gov.pagopa.pu.debtpositions.exception.custom.ConflictErrorException; import it.gov.pagopa.pu.debtpositions.model.DebtPosition; import it.gov.pagopa.pu.debtpositions.model.DebtPositionTypeOrg; @@ -10,6 +11,8 @@ import it.gov.pagopa.pu.debtpositions.service.DebtPositionService; import it.gov.pagopa.pu.debtpositions.service.create.GenerateIuvService; import it.gov.pagopa.pu.debtpositions.service.create.ValidateDebtPositionService; +import it.gov.pagopa.pu.debtpositions.service.create.debtposition.workflow.DebtPositionSyncService; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -37,6 +40,10 @@ class CreateDebtPositionServiceImplTest { private DebtPositionService debtPositionService; @Mock private GenerateIuvService generateIuvService; + @Mock + private DebtPositionSyncService debtPositionSyncService; + @Mock + private DebtPositionProcessorService debtPositionProcessorService; private CreateDebtPositionService createDebtPositionService; @@ -46,7 +53,8 @@ class CreateDebtPositionServiceImplTest { @BeforeEach void setUp() { createDebtPositionService = new CreateDebtPositionServiceImpl(authorizeOperatorOnDebtPositionTypeService, - validateDebtPositionService, debtPositionService, generateIuvService, installmentNoPIIRepository); + validateDebtPositionService, debtPositionService, generateIuvService, debtPositionSyncService, installmentNoPIIRepository, + debtPositionProcessorService); } @Test @@ -60,6 +68,7 @@ void givenDebtPositionWhenCreateThenOk() { Mockito.when(authorizeOperatorOnDebtPositionTypeService.authorize(orgId, debtPositionTypeOrgId, null)).thenReturn(debtPositionTypeOrg); Mockito.doNothing().when(validateDebtPositionService).validate(debtPositionDTO, null); Mockito.when(installmentNoPIIRepository.countExistingInstallments(debtPosition.getOrganizationId(), installmentNoPII.getIud(), installmentNoPII.getIuv(), installmentNoPII.getNav())).thenReturn(0L); + Mockito.when(debtPositionProcessorService.updateAmounts(debtPositionDTO)).thenReturn(debtPositionDTO); Mockito.when(debtPositionService.saveDebtPosition(debtPositionDTO)).thenReturn(debtPositionDTO); DebtPositionDTO result = createDebtPositionService.createDebtPosition(debtPositionDTO, false, false, null, null); @@ -68,6 +77,74 @@ void givenDebtPositionWhenCreateThenOk() { reflectionEqualsByName(buildDebtPositionDTO(), result); } + @Test + void givenDebtPositionOrdinarySilWhenCreateThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + debtPositionDTO.setDebtPositionOrigin(DebtPositionOrigin.ORDINARY_SIL); + + DebtPosition debtPosition = buildDebtPosition(); + debtPosition.setDebtPositionOrigin(DebtPositionOrigin.ORDINARY_SIL); + DebtPositionTypeOrg debtPositionTypeOrg = buildDebtPositionTypeOrg(); + InstallmentNoPII installmentNoPII = buildInstallmentNoPII(); + + Mockito.when(authorizeOperatorOnDebtPositionTypeService.authorize(orgId, debtPositionTypeOrgId, null)).thenReturn(debtPositionTypeOrg); + Mockito.doNothing().when(validateDebtPositionService).validate(debtPositionDTO, null); + Mockito.when(installmentNoPIIRepository.countExistingInstallments(debtPosition.getOrganizationId(), installmentNoPII.getIud(), installmentNoPII.getIuv(), installmentNoPII.getNav())).thenReturn(0L); + Mockito.when(debtPositionProcessorService.updateAmounts(debtPositionDTO)).thenReturn(debtPositionDTO); + Mockito.when(debtPositionService.saveDebtPosition(debtPositionDTO)).thenReturn(debtPositionDTO); + Mockito.when(debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false)).thenReturn(WorkflowCreatedDTO.builder().workflowId("1000").build()); + + DebtPositionDTO result = createDebtPositionService.createDebtPosition(debtPositionDTO, false, true, null, null); + + assertEquals(debtPositionDTO, result); + reflectionEqualsByName(debtPositionDTO, result); + } + + @Test + void givenDebtPositionSpontaneousWhenCreateThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + debtPositionDTO.setDebtPositionOrigin(DebtPositionOrigin.SPONTANEOUS); + + DebtPosition debtPosition = buildDebtPosition(); + debtPosition.setDebtPositionOrigin(DebtPositionOrigin.SPONTANEOUS); + DebtPositionTypeOrg debtPositionTypeOrg = buildDebtPositionTypeOrg(); + InstallmentNoPII installmentNoPII = buildInstallmentNoPII(); + + Mockito.when(authorizeOperatorOnDebtPositionTypeService.authorize(orgId, debtPositionTypeOrgId, null)).thenReturn(debtPositionTypeOrg); + Mockito.doNothing().when(validateDebtPositionService).validate(debtPositionDTO, null); + Mockito.when(installmentNoPIIRepository.countExistingInstallments(debtPosition.getOrganizationId(), installmentNoPII.getIud(), installmentNoPII.getIuv(), installmentNoPII.getNav())).thenReturn(0L); + Mockito.when(debtPositionProcessorService.updateAmounts(debtPositionDTO)).thenReturn(debtPositionDTO); + Mockito.when(debtPositionService.saveDebtPosition(debtPositionDTO)).thenReturn(debtPositionDTO); + Mockito.when(debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false)).thenReturn(WorkflowCreatedDTO.builder().workflowId("1000").build()); + + DebtPositionDTO result = createDebtPositionService.createDebtPosition(debtPositionDTO, false, true, null, null); + + assertEquals(debtPositionDTO, result); + reflectionEqualsByName(debtPositionDTO, result); + } + + @Test + void givenDebtPositionOtherOriginWhenCreateThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + debtPositionDTO.setDebtPositionOrigin(DebtPositionOrigin.RECEIPT_FILE); + + DebtPosition debtPosition = buildDebtPosition(); + debtPosition.setDebtPositionOrigin(DebtPositionOrigin.RECEIPT_FILE); + DebtPositionTypeOrg debtPositionTypeOrg = buildDebtPositionTypeOrg(); + InstallmentNoPII installmentNoPII = buildInstallmentNoPII(); + + Mockito.when(authorizeOperatorOnDebtPositionTypeService.authorize(orgId, debtPositionTypeOrgId, null)).thenReturn(debtPositionTypeOrg); + Mockito.doNothing().when(validateDebtPositionService).validate(debtPositionDTO, null); + Mockito.when(installmentNoPIIRepository.countExistingInstallments(debtPosition.getOrganizationId(), installmentNoPII.getIud(), installmentNoPII.getIuv(), installmentNoPII.getNav())).thenReturn(0L); + Mockito.when(debtPositionProcessorService.updateAmounts(debtPositionDTO)).thenReturn(debtPositionDTO); + Mockito.when(debtPositionService.saveDebtPosition(debtPositionDTO)).thenReturn(debtPositionDTO); + + DebtPositionDTO result = createDebtPositionService.createDebtPosition(debtPositionDTO, false, true, null, null); + + assertEquals(debtPositionDTO, result); + reflectionEqualsByName(debtPositionDTO, result); + } + @Test void givenDebtPositionWithDuplicatesWhenCreateThenThrowConflictErrorException() { DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); @@ -99,7 +176,9 @@ void givenDebtPositionWhenGenerateIuvThenAssignIuvToInstallments() { Mockito.when(installmentNoPIIRepository.countExistingInstallments(debtPosition.getOrganizationId(), installmentNoPII.getIud(), installmentNoPII.getIuv(), installmentNoPII.getNav())).thenReturn(0L); Mockito.when(generateIuvService.generateIuv(debtPositionDTO.getOrganizationId(), null)).thenReturn("generatedIuv"); Mockito.when(generateIuvService.iuv2Nav("generatedIuv")).thenReturn("generatedNav"); + Mockito.when(debtPositionProcessorService.updateAmounts(debtPositionDTO)).thenReturn(debtPositionDTO); Mockito.when(debtPositionService.saveDebtPosition(debtPositionDTO)).thenReturn(buildGeneratedIuvDebtPositionDTO()); + Mockito.when(debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false)).thenReturn(WorkflowCreatedDTO.builder().workflowId("1000").build()); DebtPositionDTO result = createDebtPositionService.createDebtPosition(debtPositionDTO, false, true, null, null); diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImplTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImplTest.java new file mode 100644 index 00000000..cc55d107 --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/DebtPositionProcessorServiceImplTest.java @@ -0,0 +1,62 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition; + +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.debtpositions.dto.generated.InstallmentDTO; +import it.gov.pagopa.pu.debtpositions.dto.generated.InstallmentStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO; +import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentFaker.buildInstallmentDTO; +import static it.gov.pagopa.pu.debtpositions.util.faker.PaymentOptionFaker.buildPaymentOptionDTO; +import static it.gov.pagopa.pu.debtpositions.util.faker.TransferFaker.buildTransferDTO; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +class DebtPositionProcessorServiceImplTest { + + private DebtPositionProcessorServiceImpl debtPositionProcessorService; + + @BeforeEach + public void setUp() { + debtPositionProcessorService = new DebtPositionProcessorServiceImpl(); + } + + @Test + void givenDebtPositionWhenUpdateAmountsThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + debtPositionDTO.getPaymentOptions().addAll(IntStream.range(0, 2) + .mapToObj(i -> buildPaymentOptionDTO()) + .collect(Collectors.toCollection(ArrayList::new))); + debtPositionDTO.getPaymentOptions().getFirst().getInstallments().addAll(IntStream.range(0, 2) + .mapToObj(i -> buildInstallmentDTO()) + .collect(Collectors.toCollection(ArrayList::new))); + debtPositionDTO.getPaymentOptions().getFirst().getInstallments().getFirst().getTransfers().addAll(IntStream.range(0, 2) + .mapToObj(i -> buildTransferDTO()) + .collect(Collectors.toCollection(ArrayList::new))); + + DebtPositionDTO result = debtPositionProcessorService.updateAmounts(debtPositionDTO); + + assertEquals(3000, result.getPaymentOptions().getFirst().getInstallments().getFirst().getAmountCents()); + assertEquals(5000, result.getPaymentOptions().getFirst().getTotalAmountCents()); + } + + @Test + void givenDebtPositionWithInstallmentCancelledWhenUpdateAmountsThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + InstallmentDTO firstInstallment = debtPositionDTO.getPaymentOptions().getFirst().getInstallments().getFirst(); + debtPositionDTO.getPaymentOptions().getFirst().getInstallments().addAll(IntStream.range(0, 2) + .mapToObj(i -> buildInstallmentDTO()) + .collect(Collectors.toCollection(ArrayList::new))); + firstInstallment.setStatus(InstallmentStatus.CANCELLED); + + DebtPositionDTO result = debtPositionProcessorService.updateAmounts(debtPositionDTO); + + assertEquals(2000, result.getPaymentOptions().getFirst().getTotalAmountCents()); + } +} + diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImplTest.java b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImplTest.java new file mode 100644 index 00000000..67646b6c --- /dev/null +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/service/create/debtposition/workflow/DebtPositionSyncServiceImplTest.java @@ -0,0 +1,172 @@ +package it.gov.pagopa.pu.debtpositions.service.create.debtposition.workflow; + +import it.gov.pagopa.pu.debtpositions.connector.organization.service.BrokerService; +import it.gov.pagopa.pu.debtpositions.connector.workflow.service.WorkflowService; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionOrigin; +import it.gov.pagopa.pu.organization.dto.generated.Broker; +import it.gov.pagopa.pu.workflowhub.dto.generated.WorkflowCreatedDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +@ExtendWith(MockitoExtension.class) +class DebtPositionSyncServiceImplTest { + @Mock + private BrokerService brokerService; + @Mock + private WorkflowService workflowService; + + private DebtPositionSyncServiceImpl debtPositionSyncService; + + @BeforeEach + void setUp() { + debtPositionSyncService = new DebtPositionSyncServiceImpl(brokerService, + workflowService); + } + + @Test + void givenDebtPositionWhenInvokeWorkflowSYNCThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.SYNC); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO(); + expectedResult.setWorkflowId("1000"); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + Mockito.when(workflowService.handleDpSync(debtPositionDTO, null)).thenReturn(expectedResult); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertEquals(expectedResult, result); + } + + @Test + void givenDebtPositionWhenInvokeWorkflowSYNC_ACAThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.SYNC_ACA); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO(); + expectedResult.setWorkflowId("1000"); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + Mockito.when(workflowService.alignDpSyncAca(debtPositionDTO, null)).thenReturn(expectedResult); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertEquals(expectedResult, result); + } + + @Test + void givenDebtPositionWhenInvokeWorkflowSYNC_GPDPRELOADThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.SYNC_GPDPRELOAD); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO(); + expectedResult.setWorkflowId("1000"); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + Mockito.when(workflowService.alignDpSyncGpdPreload(debtPositionDTO, null)).thenReturn(expectedResult); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertEquals(expectedResult, result); + } + + @Test + void givenDebtPositionWhenInvokeWorkflowSYNC_ACA_GPDPRELOADThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.SYNC_ACA_GPDPRELOAD); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO(); + expectedResult.setWorkflowId("1000"); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + Mockito.when(workflowService.alignDpSyncAcaGpdPreload(debtPositionDTO, null)).thenReturn(expectedResult); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertEquals(expectedResult, result); + } + + @Test + void givenMassiveTrueWhenInvokeWorkflowSYNC_ACA_GPDPRELOADThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.SYNC_ACA_GPDPRELOAD); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, true); + + assertNull(result); + } + + @Test + void givenDebtPositionWhenInvokeWorkflowASYNC_GPDThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.ASYNC_GPD); + WorkflowCreatedDTO expectedResult = new WorkflowCreatedDTO(); + expectedResult.setWorkflowId("1000"); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + Mockito.when(workflowService.alignDpGPD(debtPositionDTO, null)).thenReturn(expectedResult); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertEquals(expectedResult, result); + } + + @Test + void givenMassiveTrueWhenInvokeWorkflowASYNC_GPDThenOk() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + Broker broker = new Broker(); + broker.setPagoPaInteractionModel(Broker.PagoPaInteractionModelEnum.ASYNC_GPD); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.of(broker)); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, true); + + assertNull(result); + } + + @Test + void givenInvalidbrokerWhenInvokeWorkflowASYNC_GPDThenNull() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + + Mockito.when(brokerService.getBrokerByOrganizationId(debtPositionDTO.getOrganizationId(), null)).thenReturn(Optional.empty()); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertNull(result); + } + + @Test + void givenOriginDifferentWhenInvokeWorkflowASYNC_GPDThenNull() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + debtPositionDTO.setDebtPositionOrigin(DebtPositionOrigin.RECEIPT_FILE); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, true, false); + + assertNull(result); + } + + @Test + void givenPagoPaPaymentFalseWhenInvokeWorkflowASYNC_GPDThenNull() { + DebtPositionDTO debtPositionDTO = buildDebtPositionDTO(); + + WorkflowCreatedDTO result = debtPositionSyncService.invokeWorkFlow(debtPositionDTO, null, false, false); + + assertNull(result); + } +} diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/DebtPositionTypeOrgFaker.java b/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/DebtPositionTypeOrgFaker.java index b69eeac1..d2942b55 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/DebtPositionTypeOrgFaker.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/DebtPositionTypeOrgFaker.java @@ -1,5 +1,6 @@ package it.gov.pagopa.pu.debtpositions.util.faker; +import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionTypeOrgDTO; import it.gov.pagopa.pu.debtpositions.model.DebtPositionTypeOrg; public class DebtPositionTypeOrgFaker { @@ -34,4 +35,33 @@ public static DebtPositionTypeOrg buildDebtPositionTypeOrg() { return debtPositionTypeOrg; } + public static DebtPositionTypeOrgDTO buildDebtPositionTypeOrgDTO() { + DebtPositionTypeOrgDTO debtPositionTypeOrg = new DebtPositionTypeOrgDTO(); + debtPositionTypeOrg.setDebtPositionTypeOrgId(2L); + debtPositionTypeOrg.setDebtPositionTypeId(100L); + debtPositionTypeOrg.setOrganizationId(500L); + debtPositionTypeOrg.setBalance("1000.00"); + debtPositionTypeOrg.setCode("TEST_CODE"); + debtPositionTypeOrg.setDescription("Test Description"); + debtPositionTypeOrg.setIban("IT60X0542811101000000123456"); + debtPositionTypeOrg.setPostalIban("IT60X0542811101000000123457"); + debtPositionTypeOrg.setPostalAccountCode("12345678"); + debtPositionTypeOrg.setHolderPostalCc("Test Holder"); + debtPositionTypeOrg.setOrgSector("Finance"); + debtPositionTypeOrg.setXsdDefinitionRef("definition.xsd"); + debtPositionTypeOrg.setAmountCents(100L); + debtPositionTypeOrg.setExternalPaymentUrl("https://payment.example.com"); + debtPositionTypeOrg.setFlagAnonymousFiscalCode(true); + debtPositionTypeOrg.setFlagMandatoryDueDate(true); + debtPositionTypeOrg.setFlagSpontaneous(true); + debtPositionTypeOrg.setFlagNotifyIo(true); + debtPositionTypeOrg.setIoTemplateMessage("Test IO Template Message"); + debtPositionTypeOrg.setFlagActive(true); + debtPositionTypeOrg.setFlagNotifyOutcomePush(false); + debtPositionTypeOrg.setNotifyOutcomePushOrgSilServiceId(200L); + debtPositionTypeOrg.setFlagAmountActualization(true); + debtPositionTypeOrg.setAmountActualizationOrgSilServiceId(300L); + debtPositionTypeOrg.setFlagExternal(false); + return debtPositionTypeOrg; + } } diff --git a/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/InstallmentFaker.java b/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/InstallmentFaker.java index 07d80109..a0171027 100644 --- a/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/InstallmentFaker.java +++ b/src/test/java/it/gov/pagopa/pu/debtpositions/util/faker/InstallmentFaker.java @@ -13,12 +13,11 @@ import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentSyncStatusFaker.buildInstallmentSyncStatus; -import static it.gov.pagopa.pu.debtpositions.util.faker.PersonFaker.buildPerson; -import static it.gov.pagopa.pu.debtpositions.util.faker.PersonFaker.buildPersonDTO; -import static it.gov.pagopa.pu.debtpositions.util.faker.TransferFaker.buildTransfer; -import static it.gov.pagopa.pu.debtpositions.util.faker.TransferFaker.buildTransferDTO; +import static it.gov.pagopa.pu.debtpositions.util.faker.PersonFaker.*; +import static it.gov.pagopa.pu.debtpositions.util.faker.TransferFaker.*; public class InstallmentFaker { @@ -80,6 +79,7 @@ public static InstallmentNoPII buildInstallmentNoPII(){ .creationDate(date) .updateDate(date) .updateOperatorExternalId("OPERATOREXTERNALUSERID") + .transfers(new TreeSet<>(List.of(buildTransfer()))) .build(); }