From 34b47213f21688bb1ac01285c7d07d753eda4009 Mon Sep 17 00:00:00 2001 From: Dylan Tangredi Date: Thu, 30 Jan 2025 17:32:55 +0100 Subject: [PATCH] [PIDM-42] fix(payment-status): fix payment option status and payment position status not changing to PAID when paying the full amount in presence of already paid installments; --- .../service/payments/PaymentsService.java | 6 ++++- .../util/DebtPositionValidation.java | 24 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/it/gov/pagopa/debtposition/service/payments/PaymentsService.java b/src/main/java/it/gov/pagopa/debtposition/service/payments/PaymentsService.java index 9570292f..664ca43c 100644 --- a/src/main/java/it/gov/pagopa/debtposition/service/payments/PaymentsService.java +++ b/src/main/java/it/gov/pagopa/debtposition/service/payments/PaymentsService.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Optional; import javax.validation.Valid; @@ -233,7 +234,10 @@ private PaymentOption updatePaymentStatus(PaymentPosition pp, String nav, Paymen } // aggiorno lo stato della payment position - if (countPaidPartialPayment > 0 && countPaidPartialPayment < numberOfPartialPayment) { + // PIDM-42 if paying the full amount when there is already a paid partial payment + // then update the payment position status to PAID + if (countPaidPartialPayment > 0 && countPaidPartialPayment < numberOfPartialPayment + && Boolean.TRUE.equals(Objects.requireNonNull(poToPay).getIsPartialPayment())) { pp.setStatus(DebtPositionStatus.PARTIALLY_PAID); } else { pp.setStatus(DebtPositionStatus.PAID); diff --git a/src/main/java/it/gov/pagopa/debtposition/util/DebtPositionValidation.java b/src/main/java/it/gov/pagopa/debtposition/util/DebtPositionValidation.java index 223bc27a..600c24d4 100644 --- a/src/main/java/it/gov/pagopa/debtposition/util/DebtPositionValidation.java +++ b/src/main/java/it/gov/pagopa/debtposition/util/DebtPositionValidation.java @@ -239,10 +239,28 @@ private static void checkPaymentOptionPayable(PaymentPosition ppToPay, String na } // La posizione debitoria è già in PARTIALLY_PAID ed arriva una richiesta di pagamento su una payment option non rateizzata (isPartialPayment = false) => errore - if (ppToPay.getStatus().equals(DebtPositionStatus.PARTIALLY_PAID) && Boolean.FALSE.equals(poToPay.getIsPartialPayment())) { - throw new AppException(AppError.PAYMENT_OPTION_ALREADY_PAID, poToPay.getOrganizationFiscalCode(), nav); + // PIDM-42: if this is a full payment and the position is partially paid then + // log this but allow the payment option status to be changed to PO_PAID instead of throwing an error + if (ppToPay.getStatus().equals(DebtPositionStatus.PARTIALLY_PAID) + && Boolean.FALSE.equals(poToPay.getIsPartialPayment())) { + + // log detailed information about this edge case + log.warn("Potential payment state inconsistency detected || " + + "Organization: {} || " + + "IUPD: {} || " + + "NAV: {} || " + + "Position Status: {} || " + + "Payment Option Status: {} || " + + "Is Partial Payment: {} || " + + "Timestamp: {}", + ppToPay.getOrganizationFiscalCode(), + ppToPay.getIupd(), + nav, + ppToPay.getStatus(), + poToPay.getStatus(), + poToPay.getIsPartialPayment(), + LocalDateTime.now()); } - } private static boolean isPaid(PaymentOption po) {