diff --git a/README.md b/README.md index abc59863..68204d2f 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,6 @@ then replace env variables with correct values | `COSMOS_RECEIPT_CONTAINER_NAME` | Container name of the Receipt container in CosmosDB | | | `PDF_ENGINE_ENDPOINT` | Endpoint to the PDF engine | | | `OCP_APIM_SUBSCRIPTION_KEY` | Auth key for Azure to access the PDF Engine | | -| `COMPLETE_TEMPLATE_FILE_NAME ` | Filename of the complete template | "complete_template.zip" | -| `PARTIAL_TEMPLATE_FILE_NAME` | Filename of the partial template | "partial_template.zip" | > to doc details about AZ fn config > see [here](https://stackoverflow.com/questions/62669672/azure-functions-what-is-the-purpose-of-having-host-json-and-local-settings-jso) diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdf.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdf.java index 4b82f59b..c424bc07 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdf.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdf.java @@ -9,20 +9,20 @@ import com.microsoft.azure.functions.annotation.QueueTrigger; import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptCosmosClientImpl; import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent; +import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReasonError; import it.gov.pagopa.receipt.pdf.generator.entity.receipt.Receipt; import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReceiptStatusType; import it.gov.pagopa.receipt.pdf.generator.exception.BizEventNotValidException; import it.gov.pagopa.receipt.pdf.generator.exception.ReceiptNotFoundException; import it.gov.pagopa.receipt.pdf.generator.model.PdfGeneration; import it.gov.pagopa.receipt.pdf.generator.service.GenerateReceiptPdfService; +import it.gov.pagopa.receipt.pdf.generator.service.impl.GenerateReceiptPdfServiceImpl; import it.gov.pagopa.receipt.pdf.generator.utils.ObjectMapperUtils; import org.apache.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; /** * Azure Functions with Azure Queue trigger. @@ -31,6 +31,8 @@ public class GenerateReceiptPdf { private final Logger logger = LoggerFactory.getLogger(GenerateReceiptPdf.class); + private static final int MAX_NUMBER_RETRY = Integer.parseInt(System.getenv().getOrDefault("COSMOS_RECEIPT_QUEUE_MAX_RETRY", "5")); + /** * This function will be invoked when a Queue trigger occurs * # @@ -64,6 +66,8 @@ public class GenerateReceiptPdf { * @param documentdb Output binding that will update the receipt data with the pdfs metadata * @param requeueMessage Output binding that will re-send the bizEventMessage to the queue in case of errors * @param context Function context + * @throws BizEventNotValidException thrown when an error occur on parsing the message from the queue to a {@link BizEvent} + * @throws ReceiptNotFoundException thrown when a receipt associated to the bizEvent is not found on Cosmos DB or the retrieved receipt is null */ @FunctionName("GenerateReceiptProcess") public void processGenerateReceipt( @@ -77,7 +81,7 @@ public void processGenerateReceipt( databaseName = "db", collectionName = "receipts", connectionStringSetting = "COSMOS_RECEIPTS_CONN_STRING") - OutputBinding> documentdb, + OutputBinding documentdb, @QueueOutput( name = "QueueReceiptWaitingForGenOutput", queueName = "%RECEIPT_QUEUE_TOPIC%", @@ -86,23 +90,86 @@ public void processGenerateReceipt( final ExecutionContext context) throws BizEventNotValidException, ReceiptNotFoundException { //Map queue bizEventMessage to BizEvent - BizEvent bizEvent; - - try { - bizEvent = ObjectMapperUtils.mapString(bizEventMessage, BizEvent.class); - } catch (JsonProcessingException e) { - throw new BizEventNotValidException("Error parsing the message coming from the queue", e); - } + BizEvent bizEvent = getBizEventFromMessage(context, bizEventMessage); - List itemsToNotify = new ArrayList<>(); logger.info("[{}] function called at {} for bizEvent with id {}", context.getFunctionName(), LocalDateTime.now(), bizEvent.getId()); //Retrieve receipt's data from CosmosDB - Receipt receipt; + Receipt receipt = getReceipt(context, bizEvent); - ReceiptCosmosClientImpl receiptCosmosClient = ReceiptCosmosClientImpl.getInstance(); + //Verify receipt status + if (isReceiptValid(receipt)) { + logger.info("[{}] Receipt with id {} not in INSERTED or RETRY (status: {}) or have null event data (eventData is null: {})", + context.getFunctionName(), + receipt.getEventId(), + receipt.getStatus(), + receipt.getEventData() == null); + return; + } + + GenerateReceiptPdfService service = new GenerateReceiptPdfServiceImpl(); + + //Verify if debtor's and payer's fiscal code are the same + String debtorCF = receipt.getEventData().getDebtorFiscalCode(); + + if (debtorCF != null) { + logger.info("[{}] Generating pdf for Receipt with id {} and bizEvent with id {}", + context.getFunctionName(), + receipt.getId(), + bizEvent.getId()); + + //Generate and save PDF + PdfGeneration pdfGeneration = service.generateReceipts(receipt, bizEvent); + + //Verify PDF generation success + boolean success = service.verifyAndUpdateReceipt(receipt, pdfGeneration); + if (success) { + receipt.setStatus(ReceiptStatusType.GENERATED); + receipt.setGenerated_at(System.currentTimeMillis()); + logger.info("[{}] Receipt with id {} being saved with status {}", + context.getFunctionName(), + receipt.getEventId(), + receipt.getStatus()); + } else { + ReceiptStatusType receiptStatusType; + //Verify if the max number of retry have been passed + if (receipt.getNumRetry() > MAX_NUMBER_RETRY) { + receiptStatusType = ReceiptStatusType.FAILED; + } else { + receiptStatusType = ReceiptStatusType.RETRY; + receipt.setNumRetry(receipt.getNumRetry() + 1); + requeueMessage.setValue(bizEventMessage); + } + receipt.setStatus(receiptStatusType); + logger.error("[{}] Error generating receipt for Receipt {} will be saved with status {}", + context.getFunctionName(), + receipt.getId(), + receiptStatusType); + } + } else { + String errorMessage = String.format( + "Error processing receipt with id %s : debtor's fiscal code is null", + receipt.getEventId() + ); + receipt.setStatus(ReceiptStatusType.FAILED); + //Update the receipt's status and error message + ReasonError reasonError = new ReasonError(HttpStatus.SC_INTERNAL_SERVER_ERROR, errorMessage); + receipt.setReasonErr(reasonError); + logger.error("[{}] Error generating PDF: {}", context.getFunctionName(), errorMessage); + } + + documentdb.setValue(receipt); + } + + private boolean isReceiptValid(Receipt receipt) { + return receipt.getEventData() == null + || (!receipt.getStatus().equals(ReceiptStatusType.INSERTED) && !receipt.getStatus().equals(ReceiptStatusType.RETRY)); + } + private Receipt getReceipt(ExecutionContext context, BizEvent bizEvent) throws ReceiptNotFoundException { + Receipt receipt; + ReceiptCosmosClientImpl receiptCosmosClient = ReceiptCosmosClientImpl.getInstance(); //Retrieve receipt from CosmosDB try { receipt = receiptCosmosClient.getReceiptDocument(bizEvent.getId()); @@ -112,70 +179,21 @@ public void processGenerateReceipt( throw new ReceiptNotFoundException(errorMsg, e); } - int numberOfSavedPdfs = 0; - - //Verify receipt status - if (receipt != null && - receipt.getEventData() != null && - (receipt.getStatus().equals(ReceiptStatusType.INSERTED) || - receipt.getStatus().equals(ReceiptStatusType.RETRY)) - ) { - - GenerateReceiptPdfService service = new GenerateReceiptPdfService(); - - //Verify if debtor's and payer's fiscal code are the same - String debtorCF = receipt.getEventData().getDebtorFiscalCode(); - String payerCF = receipt.getEventData().getPayerFiscalCode(); - - if (debtorCF != null || payerCF != null) { - boolean generateOnlyDebtor = payerCF == null || payerCF.equals(debtorCF); - logger.info("[{}] Generating pdf for Receipt with id {}", - context.getFunctionName(), - receipt.getEventId()); - - //Generate and save PDF - PdfGeneration pdfGeneration = service.handlePdfsGeneration(generateOnlyDebtor, receipt, bizEvent, debtorCF, payerCF); - logger.info("[{}] Saving pdf for Receipt with id {} to the blob storage", - context.getFunctionName(), - receipt.getEventId()); - - //Write PDF blob storage metadata on receipt - numberOfSavedPdfs = service.addPdfsMetadataToReceipt(receipt, pdfGeneration); - - //Verify PDF generation success - service.verifyPdfGeneration(bizEventMessage, requeueMessage, logger, receipt, generateOnlyDebtor, pdfGeneration); - } else { - String errorMessage = String.format( - "[%s] Error processing receipt with id %s : both debtor's and payer's fiscal code are null", - context.getFunctionName(), - receipt.getEventId() - ); - - service.handleErrorGeneratingReceipt( - ReceiptStatusType.FAILED, - HttpStatus.SC_INTERNAL_SERVER_ERROR, - errorMessage, - bizEventMessage, - receipt, - requeueMessage - ); - } - - //Add receipt to items to be saved to CosmosDB - itemsToNotify.add(receipt); - } else if (receipt != null) { - logger.info("[{}] Receipt with id {} not in INSERTED or RETRY", - context.getFunctionName(), - receipt.getEventId()); + if (receipt == null) { + String errorMsg = "[{}] Receipt retrieved with the biz-event id {} is null"; + logger.debug(errorMsg, context.getFunctionName(), bizEvent.getId()); + throw new ReceiptNotFoundException(errorMsg); } + return receipt; + } - if (!itemsToNotify.isEmpty()) { - logger.info("[{}] Receipt with id {} being saved with status {} and with {} pdfs", - context.getFunctionName(), - receipt.getEventId(), - receipt.getStatus(), - numberOfSavedPdfs); - documentdb.setValue(itemsToNotify); + private BizEvent getBizEventFromMessage(ExecutionContext context, String bizEventMessage) throws BizEventNotValidException { + try { + return ObjectMapperUtils.mapString(bizEventMessage, BizEvent.class); + } catch (JsonProcessingException e) { + String errorMsg = String.format("[%s] Error parsing the message coming from the queue", + context.getFunctionName()); + throw new BizEventNotValidException(errorMsg, e); } } } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImpl.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImpl.java index bdb86adf..c0f211ad 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImpl.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImpl.java @@ -46,7 +46,7 @@ private PdfEngineClientImpl() { this.httpClientBuilder = HttpClientBuilder.create(); } - public PdfEngineClientImpl(HttpClientBuilder clientBuilder) { + PdfEngineClientImpl(HttpClientBuilder clientBuilder) { this.httpClientBuilder = clientBuilder; } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImpl.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImpl.java index bb466aad..b4a9325d 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImpl.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImpl.java @@ -36,7 +36,7 @@ private ReceiptBlobClientImpl() { .buildClient(); } - public ReceiptBlobClientImpl(BlobServiceClient serviceClient) { + ReceiptBlobClientImpl(BlobServiceClient serviceClient) { this.blobServiceClient = serviceClient; } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImpl.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImpl.java index 050fd3ea..161c8ea9 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImpl.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImpl.java @@ -32,7 +32,7 @@ private ReceiptCosmosClientImpl() { .buildClient(); } - public ReceiptCosmosClientImpl(CosmosClient cosmosClient) { + ReceiptCosmosClientImpl(CosmosClient cosmosClient) { this.cosmosClient = cosmosClient; } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImpl.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImpl.java index 668def24..68c58b64 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImpl.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImpl.java @@ -30,7 +30,7 @@ private ReceiptQueueClientImpl() { .buildClient(); } - public ReceiptQueueClientImpl(QueueClient queueClient) { + ReceiptQueueClientImpl(QueueClient queueClient) { this.queueClient = queueClient; } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/GeneratePDFException.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/GeneratePDFException.java new file mode 100644 index 00000000..8d34a418 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/GeneratePDFException.java @@ -0,0 +1,26 @@ +package it.gov.pagopa.receipt.pdf.generator.exception; + +/** Thrown in case an error occurred when generating a PDF Receipt */ +public class GeneratePDFException extends PDFReceiptGenerationException { + + /** + * Constructs new exception with provided message, status code and cause + * + * @param message Detail message + * @param statusCode Error code + * @param cause Exception thrown + */ + public GeneratePDFException(String message, int statusCode, Throwable cause) { + super(message, statusCode, cause); + } + + /** + * Constructs new exception with provided message, status code + * + * @param message Detail message + * @param statusCode Error code + */ + public GeneratePDFException(String message, int statusCode) { + super(message, statusCode); + } +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/PDFReceiptGenerationException.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/PDFReceiptGenerationException.java new file mode 100644 index 00000000..394f6165 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/PDFReceiptGenerationException.java @@ -0,0 +1,34 @@ +package it.gov.pagopa.receipt.pdf.generator.exception; + +/** Thrown in case an error occurred when generating or saving a PDF Receipt */ +public class PDFReceiptGenerationException extends Exception { + + private final int statusCode; + + /** + * Constructs new exception with provided message, status code and cause + * + * @param message Detail message + * @param statusCode Error code + * @param cause Exception thrown + */ + public PDFReceiptGenerationException(String message, int statusCode, Throwable cause) { + super(message, cause); + this.statusCode = statusCode; + } + + /** + * Constructs new exception with provided message, status code + * + * @param message Detail message + * @param statusCode Error code + */ + public PDFReceiptGenerationException(String message, int statusCode) { + super(message); + this.statusCode = statusCode; + } + + public int getStatusCode() { + return statusCode; + } +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/SavePDFToBlobException.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/SavePDFToBlobException.java new file mode 100644 index 00000000..1925d266 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/exception/SavePDFToBlobException.java @@ -0,0 +1,26 @@ +package it.gov.pagopa.receipt.pdf.generator.exception; + +/** Thrown in case an error occurred when saving a PDF Receipt to the Blob storage */ +public class SavePDFToBlobException extends PDFReceiptGenerationException { + + /** + * Constructs new exception with provided message, status code and cause + * + * @param message Detail message + * @param statusCode Error code + * @param cause Exception thrown + */ + public SavePDFToBlobException(String message, int statusCode, Throwable cause) { + super(message, statusCode, cause); + } + + /** + * Constructs new exception with provided message, status code + * + * @param message Detail message + * @param statusCode Error code + */ + public SavePDFToBlobException(String message, int statusCode) { + super(message, statusCode); + } +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfGeneration.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfGeneration.java index 42b7dd1e..c7455460 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfGeneration.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfGeneration.java @@ -12,7 +12,8 @@ @NoArgsConstructor public class PdfGeneration { - PdfMetadata debtorMetadata; - PdfMetadata payerMetadata; + private boolean generateOnlyDebtor; + private PdfMetadata debtorMetadata; + private PdfMetadata payerMetadata; } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfMetadata.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfMetadata.java index 74db5845..315ee8c4 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfMetadata.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/PdfMetadata.java @@ -1,8 +1,6 @@ package it.gov.pagopa.receipt.pdf.generator.model; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; /** * Model class for PDF metadata from Blob Storage @@ -10,6 +8,8 @@ @Getter @Setter @NoArgsConstructor +@AllArgsConstructor +@Builder public class PdfMetadata { int statusCode; diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Cart.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Cart.java new file mode 100644 index 00000000..f50a565e --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Cart.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class Cart { + + private List items; + private String amountPartial; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Debtor.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Debtor.java new file mode 100644 index 00000000..be0c4491 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Debtor.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class Debtor { + + private String fullName; + private String taxCode; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Item.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Item.java new file mode 100644 index 00000000..748bcd69 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Item.java @@ -0,0 +1,20 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class Item { + + private RefNumber refNumber; + private Debtor debtor; + private Payee payee; + private String subject; + private String amount; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSP.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSP.java new file mode 100644 index 00000000..c0a2b22a --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSP.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class PSP { + + private String name; + private PSPFee fee; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSPFee.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSPFee.java new file mode 100644 index 00000000..4c03263d --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PSPFee.java @@ -0,0 +1,16 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class PSPFee { + + private String amount; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Payee.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Payee.java new file mode 100644 index 00000000..403825f1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Payee.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class Payee { + + private String name; + private String taxCode; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PaymentMethod.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PaymentMethod.java new file mode 100644 index 00000000..ce878d16 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/PaymentMethod.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class PaymentMethod { + + private String name; + private String logo; + private String accountHolder; + private boolean extraFee; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/ReceiptPDFTemplate.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/ReceiptPDFTemplate.java new file mode 100644 index 00000000..64c4fddb --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/ReceiptPDFTemplate.java @@ -0,0 +1,18 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class ReceiptPDFTemplate { + + private Transaction transaction; + private User user; + private Cart cart; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/RefNumber.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/RefNumber.java new file mode 100644 index 00000000..cc16a5a9 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/RefNumber.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class RefNumber { + + private String type; + private String value; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Transaction.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Transaction.java new file mode 100644 index 00000000..03592092 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/Transaction.java @@ -0,0 +1,22 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class Transaction { + + private String id; + private String timestamp; + private String amount; + private PSP psp; + private String rrn; + private String authCode; + private PaymentMethod paymentMethod; + private boolean requestedByDebtor; +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/User.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/User.java new file mode 100644 index 00000000..78ce6382 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/User.java @@ -0,0 +1,17 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class User { + + private UserData data; + private String email; + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/UserData.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/UserData.java new file mode 100644 index 00000000..0c6d6d1a --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/model/template/UserData.java @@ -0,0 +1,18 @@ +package it.gov.pagopa.receipt.pdf.generator.model.template; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import static com.fasterxml.jackson.annotation.JsonInclude.*; + +@Data +@Builder +@JsonInclude(Include.NON_NULL) +public class UserData { + + private String firstName; + private String lastName; + private String taxCode; +} + diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/GenerateReceiptPdfService.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/GenerateReceiptPdfService.java index e484eece..8cddcdb0 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/GenerateReceiptPdfService.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/GenerateReceiptPdfService.java @@ -1,336 +1,27 @@ package it.gov.pagopa.receipt.pdf.generator.service; -import com.microsoft.azure.functions.OutputBinding; -import it.gov.pagopa.receipt.pdf.generator.client.impl.PdfEngineClientImpl; -import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptBlobClientImpl; import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent; -import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReasonError; import it.gov.pagopa.receipt.pdf.generator.entity.receipt.Receipt; -import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReceiptMetadata; -import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReasonErrorCode; -import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReceiptStatusType; import it.gov.pagopa.receipt.pdf.generator.model.PdfGeneration; -import it.gov.pagopa.receipt.pdf.generator.model.PdfMetadata; -import it.gov.pagopa.receipt.pdf.generator.model.request.PdfEngineRequest; -import it.gov.pagopa.receipt.pdf.generator.model.response.BlobStorageResponse; -import it.gov.pagopa.receipt.pdf.generator.model.response.PdfEngineResponse; -import it.gov.pagopa.receipt.pdf.generator.utils.ObjectMapperUtils; -import it.gov.pagopa.receipt.pdf.generator.utils.TemplateMapperUtils; -import lombok.NoArgsConstructor; -import org.apache.http.HttpStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.io.*; -import java.net.URL; -import java.nio.file.Files; -import java.time.LocalDateTime; - -@NoArgsConstructor -public class GenerateReceiptPdfService { - - private final Logger logger = LoggerFactory.getLogger(GenerateReceiptPdfService.class); - - private static final int MAX_NUMBER_RETRY = Integer.parseInt(System.getenv().getOrDefault("COSMOS_RECEIPT_QUEUE_MAX_RETRY", "5")); - - /** - * Handles conditionally the generation of the PDFs based on the generateOnlyDebtor boolean - * - * @param generateOnlyDebtor Boolean that verify if the payer and debtor have the same fiscal code - * @param receipt Receipt from CosmosDB - * @param bizEvent Biz-event from queue message - * @param debtorCF Debtor fiscal code - * @param payerCF Payer fiscal code - * @return PdfGeneration object with the PDF metadata from the Blob Storage or relatives error messages - */ - public PdfGeneration handlePdfsGeneration(boolean generateOnlyDebtor, Receipt receipt, BizEvent bizEvent, String debtorCF, String payerCF) { - PdfGeneration pdfGeneration = new PdfGeneration(); - - if (generateOnlyDebtor) { - //Generate debtor's complete PDF - if (debtorCF != null && - (receipt.getMdAttach() == null || - receipt.getMdAttach().getUrl() == null || - receipt.getMdAttach().getUrl().isEmpty()) - ) { - pdfGeneration.setDebtorMetadata(generatePdf(bizEvent, true)); - } - } else { - //Generate debtor's partial PDF - if (debtorCF != null && - (receipt.getMdAttach() == null || - receipt.getMdAttach().getUrl() == null || - receipt.getMdAttach().getUrl().isEmpty()) - ) { - pdfGeneration.setDebtorMetadata(generatePdf(bizEvent, false)); - } - //Generate payer's complete PDF - if (payerCF != null && - (receipt.getMdAttachPayer() == null || - receipt.getMdAttachPayer().getUrl() == null || - receipt.getMdAttachPayer().getUrl().isEmpty()) - ) { - pdfGeneration.setPayerMetadata(generatePdf(bizEvent, true)); - } - } - - return pdfGeneration; - } - - /** - * Handles PDF generation and saving to storage - * - * @param bizEvent Biz-event from queue message - * @param completeTemplate Boolean that indicates what template to use - * @return PDF metadata retrieved from Blob Storage or relative error message - */ - private PdfMetadata generatePdf(BizEvent bizEvent, boolean completeTemplate) { - PdfEngineRequest request = new PdfEngineRequest(); - PdfMetadata response = new PdfMetadata(); - - //Get filename - String completeTemplateFileName = System.getenv().getOrDefault("COMPLETE_TEMPLATE_FILE_NAME", "complete_template.zip"); - String partialTemplateFileName = System.getenv().getOrDefault("PARTIAL_TEMPLATE_FILE_NAME", "partial_template.zip"); - - String fileName = completeTemplate ? completeTemplateFileName : partialTemplateFileName; - - try { - URL templateStream = GenerateReceiptPdfService.class.getClassLoader().getResource(fileName); - //Build the request - request.setTemplate(templateStream); - request.setData(ObjectMapperUtils.writeValueAsString(TemplateMapperUtils.convertReceiptToPdfData(bizEvent))); - - request.setApplySignature(false); - - PdfEngineClientImpl pdfEngineClient = PdfEngineClientImpl.getInstance(); - - //Call the PDF Engine - PdfEngineResponse pdfEngineResponse = pdfEngineClient.generatePDF(request); - - if (pdfEngineResponse.getStatusCode() == HttpStatus.SC_OK) { - //Save the PDF - String pdfFileName = bizEvent.getId() + "_" + (completeTemplate ? "p" : "d"); - - handleSaveToBlobStorage(pdfEngineResponse, response, pdfFileName); - - } else { - //Handle PDF generation error - response.setStatusCode(ReasonErrorCode.ERROR_PDF_ENGINE.getCustomCode(pdfEngineResponse.getStatusCode())); - response.setErrorMessage(pdfEngineResponse.getErrorMessage()); - } - - } catch (Exception e) { - String errMsg = "File template not found, error: "; - logger.error(errMsg, e); - //Handle file not found error - response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR); - response.setErrorMessage(errMsg + e); - } - - return response; - } - - /** - * Handles saving PDF to Blob Storage - * - * @param response Pdf metadata containing response - * @param pdfFileName Filename composed of biz-event id and user fiscal code - */ - private void handleSaveToBlobStorage(PdfEngineResponse pdfEngineResponse, PdfMetadata response, String pdfFileName) { - BlobStorageResponse blobStorageResponse; - - ReceiptBlobClientImpl blobClient = ReceiptBlobClientImpl.getInstance(); - - String tempPdfPath = pdfEngineResponse.getTempPdfPath(); - String tempDirectoryPath = pdfEngineResponse.getTempDirectoryPath(); - - //Save to Blob Storage - try (BufferedInputStream pdfStream = new BufferedInputStream(new FileInputStream(tempPdfPath))) { - blobStorageResponse = blobClient.savePdfToBlobStorage(pdfStream, pdfFileName); - - if (blobStorageResponse.getStatusCode() == com.microsoft.azure.functions.HttpStatus.CREATED.value()) { - //Update PDF metadata - response.setDocumentName(blobStorageResponse.getDocumentName()); - response.setDocumentUrl(blobStorageResponse.getDocumentUrl()); - - response.setStatusCode(HttpStatus.SC_OK); - - } else { - //Handle Blob storage error - response.setStatusCode(ReasonErrorCode.ERROR_BLOB_STORAGE.getCode()); - response.setErrorMessage("Error saving pdf to blob storage"); - } - - } catch (Exception e) { - String errMsg = "Error saving pdf to blob storage : "; - logger.error(errMsg, e); - //Handle Blob storage error - response.setStatusCode(ReasonErrorCode.ERROR_BLOB_STORAGE.getCode()); - response.setErrorMessage(errMsg + e); - } - - deleteTempFolderAndFile(tempPdfPath, tempDirectoryPath); - } - - /** - * Delete temporary file and director created for the generated PDF - * - * @param tempPdfPath Path to the temp PDF file - * @param tempDirectoryPath Path to the temp directory containing the PDF file - */ - private void deleteTempFolderAndFile(String tempPdfPath, String tempDirectoryPath) { - File tempFile = new File(tempPdfPath); - if (tempFile.exists()) { - try { - Files.delete(tempFile.toPath()); - } catch (IOException e) { - logger.warn("Error deleting temporary pdf file from file system", e); - } - } - - File tempDirectory = new File(tempDirectoryPath); - if (tempDirectory.exists()) { - try { - Files.delete(tempDirectory.toPath()); - } catch (IOException e) { - logger.warn("Error deleting temporary pdf directory from file system", e); - } - } - } - - - /** - * Adds PDF metadata from the Blob Storage to the receipt to be saved on CosmosDB - * - * @param receipt Receipt to be saved - * @param responseGen Response from the PDF generation process - * @return number of pdfs saved to blob storage - */ - public int addPdfsMetadataToReceipt(Receipt receipt, PdfGeneration responseGen) { - PdfMetadata debtorMetadata = responseGen.getDebtorMetadata(); - PdfMetadata payerMetadata = responseGen.getPayerMetadata(); - - int numberOfSavedPdfs = 0; - - if (debtorMetadata != null && debtorMetadata.getStatusCode() == HttpStatus.SC_OK) { - ReceiptMetadata receiptMetadata = new ReceiptMetadata(); - receiptMetadata.setName(debtorMetadata.getDocumentName()); - receiptMetadata.setUrl(debtorMetadata.getDocumentUrl()); - - receipt.setMdAttach(receiptMetadata); - numberOfSavedPdfs++; - } - - if (payerMetadata != null && payerMetadata.getStatusCode() == HttpStatus.SC_OK) { - ReceiptMetadata receiptMetadata = new ReceiptMetadata(); - receiptMetadata.setName(payerMetadata.getDocumentName()); - receiptMetadata.setUrl(payerMetadata.getDocumentUrl()); - - receipt.setMdAttachPayer(receiptMetadata); - numberOfSavedPdfs++; - } - - return numberOfSavedPdfs; - } - - /** - * Verifies if the PDF generation process succeeded - * In case of errors updates the receipt status and error message and re-sends the queue message to the queue - * - * @param bizEventMessage Queue message - * @param requeueMessage Output binding for sending messages to the queue - * @param logger Function logger - * @param receipt Receipt to be updated - * @param generateOnlyDebtor Boolean to verify if debtor's and payer's fiscal code is the same - * @param pdfGeneration Response from the PDF generation process - */ - public void verifyPdfGeneration(String bizEventMessage, OutputBinding requeueMessage, Logger logger, Receipt receipt, boolean generateOnlyDebtor, PdfGeneration pdfGeneration) { - PdfMetadata responseDebtorGen = pdfGeneration.getDebtorMetadata(); - PdfMetadata responsePayerGen = pdfGeneration.getPayerMetadata(); - - //Verify if all the needed PDFs have been generated - if (responseDebtorGen != null && - responseDebtorGen.getStatusCode() == HttpStatus.SC_OK && - (generateOnlyDebtor || - (responsePayerGen != null && - responsePayerGen.getStatusCode() == HttpStatus.SC_OK)) - ) { - receipt.setStatus(ReceiptStatusType.GENERATED); - receipt.setGenerated_at(System.currentTimeMillis()); - } else { - ReceiptStatusType receiptStatusType; - //Verify if the max number of retry have been passed - if (receipt.getNumRetry() > MAX_NUMBER_RETRY) { - receiptStatusType = ReceiptStatusType.FAILED; - } else { - receiptStatusType = ReceiptStatusType.RETRY; - } - - PdfMetadata failedResponse = returnFailedResponse(responseDebtorGen, responsePayerGen); - - int errorStatusCode = failedResponse != null ? failedResponse.getStatusCode() : HttpStatus.SC_INTERNAL_SERVER_ERROR; - String errorMessage = failedResponse != null ? failedResponse.getErrorMessage() : "Unknown error"; - - //Update the receipt's status and error message - handleErrorGeneratingReceipt( - receiptStatusType, - errorStatusCode, - errorMessage, - bizEventMessage, - receipt, - requeueMessage - ); - } - } +public interface GenerateReceiptPdfService { /** - * Return the failed response between the debtor's and the payer's one + * Handles conditionally the generation of the PDF's receipts based on the provided bizEvent * - * @param responseDebtorGen Debtor pdf generation response - * @param responsePayerGen Payer pdf generation response - * @return the failed response + * @param receipt the Receipt that hold the status of the elaboration + * @param bizEvent Biz-event from queue message + * @return {@link PdfGeneration} object with the result of the PDF generation and store or the relatives error messages */ - private static PdfMetadata returnFailedResponse(PdfMetadata responseDebtorGen, PdfMetadata responsePayerGen) { - PdfMetadata failedResponse = null; - - if (responseDebtorGen != null && responseDebtorGen.getStatusCode() != HttpStatus.SC_OK) { - failedResponse = responseDebtorGen; - - } - if (responsePayerGen != null && responsePayerGen.getStatusCode() != HttpStatus.SC_OK) { - failedResponse = responsePayerGen; - } - return failedResponse; - } + PdfGeneration generateReceipts(Receipt receipt, BizEvent bizEvent); /** - * Handles errors updating receipt status and error message, - * re-sends the biz-event message to the queue, - * logs error message + * Verifies if the PDF generation process succeeded or not, and update the receipt with the result + * In case of errors updates the receipt status and error message. * - * @param receiptStatusType Status to update the receipt - * @param errorStatusCode Error code - * @param errorMessage Error message - * @param bizEventMessage BizEvent message from queue - * @param receipt Receipt to be saved on CosmosDB - * @param requeueMessage Output Binding to save the bizEventMessage + * @param receipt the Receipt that hold the status of the elaboration + * @param pdfGeneration {@link PdfGeneration} object with the result of the PDF generation + * @return true if the process succeeded, otherwise false */ - public void handleErrorGeneratingReceipt( - ReceiptStatusType receiptStatusType, - int errorStatusCode, - String errorMessage, - String bizEventMessage, - Receipt receipt, - OutputBinding requeueMessage) { - - receipt.setStatus(receiptStatusType); - receipt.setNumRetry(receipt.getNumRetry() + 1); - //Update the receipt's status and error message - ReasonError reasonError = new ReasonError(errorStatusCode, errorMessage); - receipt.setReasonErr(reasonError); - - //Re-queue the message - requeueMessage.setValue(bizEventMessage); - logger.error("Error generating PDF at {} : {}", LocalDateTime.now(), errorMessage); - } + boolean verifyAndUpdateReceipt(Receipt receipt, PdfGeneration pdfGeneration); } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/impl/GenerateReceiptPdfServiceImpl.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/impl/GenerateReceiptPdfServiceImpl.java new file mode 100644 index 00000000..c3b9eece --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/service/impl/GenerateReceiptPdfServiceImpl.java @@ -0,0 +1,304 @@ +package it.gov.pagopa.receipt.pdf.generator.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import it.gov.pagopa.receipt.pdf.generator.client.impl.PdfEngineClientImpl; +import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptBlobClientImpl; +import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent; +import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReasonError; +import it.gov.pagopa.receipt.pdf.generator.entity.receipt.Receipt; +import it.gov.pagopa.receipt.pdf.generator.entity.receipt.ReceiptMetadata; +import it.gov.pagopa.receipt.pdf.generator.entity.receipt.enumeration.ReasonErrorCode; +import it.gov.pagopa.receipt.pdf.generator.exception.GeneratePDFException; +import it.gov.pagopa.receipt.pdf.generator.exception.PDFReceiptGenerationException; +import it.gov.pagopa.receipt.pdf.generator.exception.SavePDFToBlobException; +import it.gov.pagopa.receipt.pdf.generator.model.PdfGeneration; +import it.gov.pagopa.receipt.pdf.generator.model.PdfMetadata; +import it.gov.pagopa.receipt.pdf.generator.model.request.PdfEngineRequest; +import it.gov.pagopa.receipt.pdf.generator.model.response.BlobStorageResponse; +import it.gov.pagopa.receipt.pdf.generator.model.response.PdfEngineResponse; +import it.gov.pagopa.receipt.pdf.generator.model.template.*; +import it.gov.pagopa.receipt.pdf.generator.service.GenerateReceiptPdfService; +import it.gov.pagopa.receipt.pdf.generator.utils.BizEventToPdfMapper; +import it.gov.pagopa.receipt.pdf.generator.utils.ObjectMapperUtils; +import lombok.NoArgsConstructor; +import org.apache.http.HttpStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.util.Collections; + +@NoArgsConstructor +public class GenerateReceiptPdfServiceImpl implements GenerateReceiptPdfService { + + private final Logger logger = LoggerFactory.getLogger(GenerateReceiptPdfServiceImpl.class); + + private static final int ALREADY_CREATED = 208; + + /** + * {@inheritDoc} + */ + @Override + public PdfGeneration generateReceipts(Receipt receipt, BizEvent bizEvent) { + PdfGeneration pdfGeneration = new PdfGeneration(); + + String debtorCF = receipt.getEventData().getDebtorFiscalCode(); + String payerCF = receipt.getEventData().getPayerFiscalCode(); + + if (payerCF != null) { + + if (payerCF.equals(debtorCF)) { + pdfGeneration.setGenerateOnlyDebtor(true); + //Generate debtor's complete PDF + if (receiptAlreadyCreated(receipt.getMdAttach())) { + pdfGeneration.setDebtorMetadata(PdfMetadata.builder().statusCode(ALREADY_CREATED).build()); + return pdfGeneration; + } + ReceiptPDFTemplate completeTemplate = buildTemplate(bizEvent, false); + PdfMetadata generationResult = generateAndSavePDFReceipt(bizEvent, debtorCF, completeTemplate); + pdfGeneration.setDebtorMetadata(generationResult); + return pdfGeneration; + } else { + + //Generate payer's complete PDF + if (receiptAlreadyCreated(receipt.getMdAttachPayer())) { + pdfGeneration.setPayerMetadata(PdfMetadata.builder().statusCode(ALREADY_CREATED).build()); + } else { + ReceiptPDFTemplate completeTemplate = buildTemplate(bizEvent, false); + + PdfMetadata generationResult = generateAndSavePDFReceipt(bizEvent, payerCF, completeTemplate); + pdfGeneration.setPayerMetadata(generationResult); + } + } + + } + + //Generate debtor's partial PDF + if (receiptAlreadyCreated(receipt.getMdAttach())) { + pdfGeneration.setDebtorMetadata(PdfMetadata.builder().statusCode(ALREADY_CREATED).build()); + } else { + ReceiptPDFTemplate onlyDebtorTemplate = buildTemplate(bizEvent, true); + + PdfMetadata generationResult = generateAndSavePDFReceipt(bizEvent, debtorCF, onlyDebtorTemplate); + pdfGeneration.setDebtorMetadata(generationResult); + } + + return pdfGeneration; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean verifyAndUpdateReceipt(Receipt receipt, PdfGeneration pdfGeneration) { + PdfMetadata debtorMetadata = pdfGeneration.getDebtorMetadata(); + if (pdfGeneration.isGenerateOnlyDebtor()) { + if (debtorMetadata == null) { + logger.error("Unexpected result for debtor pdf receipt generation. Receipt id {}", receipt.getId()); + return false; + } + if (debtorMetadata.getStatusCode() == ALREADY_CREATED) { + return true; + } + if (debtorMetadata.getStatusCode() == HttpStatus.SC_OK) { + ReceiptMetadata receiptMetadata = new ReceiptMetadata(); + receiptMetadata.setName(debtorMetadata.getDocumentName()); + receiptMetadata.setUrl(debtorMetadata.getDocumentUrl()); + + receipt.setMdAttach(receiptMetadata); + return true; + } + ReasonError reasonError = new ReasonError(debtorMetadata.getStatusCode(), debtorMetadata.getErrorMessage()); + receipt.setReasonErr(reasonError); + return false; + } + + // No single receipt + PdfMetadata payerMetadata = pdfGeneration.getPayerMetadata(); + boolean result = true; + if (debtorMetadata == null || payerMetadata == null) { + logger.error("Unexpected result for both payer and debtor pdf receipt generation. Receipt id {}", receipt.getId()); + return false; + } + + if (debtorMetadata.getStatusCode() == HttpStatus.SC_OK) { + ReceiptMetadata receiptMetadata = new ReceiptMetadata(); + receiptMetadata.setName(debtorMetadata.getDocumentName()); + receiptMetadata.setUrl(debtorMetadata.getDocumentUrl()); + + receipt.setMdAttach(receiptMetadata); + } else if (debtorMetadata.getStatusCode() != ALREADY_CREATED) { + ReasonError reasonError = new ReasonError(debtorMetadata.getStatusCode(), debtorMetadata.getErrorMessage()); + receipt.setReasonErr(reasonError); + result = false; + } + if (payerMetadata.getStatusCode() == HttpStatus.SC_OK) { + ReceiptMetadata receiptMetadata = new ReceiptMetadata(); + receiptMetadata.setName(payerMetadata.getDocumentName()); + receiptMetadata.setUrl(payerMetadata.getDocumentUrl()); + + receipt.setMdAttachPayer(receiptMetadata); + } else if (payerMetadata.getStatusCode() != ALREADY_CREATED) { + ReasonError reasonError = new ReasonError(payerMetadata.getStatusCode(), payerMetadata.getErrorMessage()); + receipt.setReasonErr(reasonError); + result = false; + } + return result; + } + + private PdfMetadata generateAndSavePDFReceipt(BizEvent bizEvent, String fiscalCode, ReceiptPDFTemplate completeTemplate) { + try { + String blobName = bizEvent.getId() + fiscalCode; + PdfEngineResponse pdfEngineResponse = generatePdf(completeTemplate); + return saveToBlobStorage(pdfEngineResponse, blobName); + } catch (PDFReceiptGenerationException e) { + logger.error("An error occurred when generating or saving the PDF receipt for biz-event {}", bizEvent.getId(), e); + return PdfMetadata.builder().statusCode(e.getStatusCode()).errorMessage(e.getMessage()).build(); + } + } + + private PdfMetadata saveToBlobStorage(PdfEngineResponse pdfEngineResponse, String blobName) throws SavePDFToBlobException { + ReceiptBlobClientImpl blobClient = ReceiptBlobClientImpl.getInstance(); + String tempPdfPath = pdfEngineResponse.getTempPdfPath(); + String tempDirectoryPath = pdfEngineResponse.getTempDirectoryPath(); + + BlobStorageResponse blobStorageResponse; + //Save to Blob Storage + try (BufferedInputStream pdfStream = new BufferedInputStream(new FileInputStream(tempPdfPath))) { + blobStorageResponse = blobClient.savePdfToBlobStorage(pdfStream, blobName); + } catch (Exception e) { + throw new SavePDFToBlobException("Error saving pdf to blob storage", ReasonErrorCode.ERROR_BLOB_STORAGE.getCode(), e); + } finally { + deleteTempFolderAndFile(tempPdfPath, tempDirectoryPath); + } + + if (blobStorageResponse.getStatusCode() != com.microsoft.azure.functions.HttpStatus.CREATED.value()) { + String errMsg = String.format("Error saving pdf to blob storage, storage responded with status %s", + blobStorageResponse.getStatusCode()); + throw new SavePDFToBlobException(errMsg, ReasonErrorCode.ERROR_BLOB_STORAGE.getCode()); + } + + //Update PDF metadata + return PdfMetadata.builder() + .documentName(blobStorageResponse.getDocumentName()) + .documentUrl(blobStorageResponse.getDocumentUrl()) + .statusCode(HttpStatus.SC_OK) + .build(); + } + + // TODO fix temp files create a temp dir and pass it to the client + private PdfEngineResponse generatePdf(ReceiptPDFTemplate template) throws PDFReceiptGenerationException { + PdfEngineRequest request = new PdfEngineRequest(); + + URL templateStream = GenerateReceiptPdfServiceImpl.class.getClassLoader().getResource("template.zip"); + //Build the request + request.setTemplate(templateStream); + request.setData(parseTemplateDataToString(template)); + request.setApplySignature(false); + + PdfEngineClientImpl pdfEngineClient = PdfEngineClientImpl.getInstance(); + + //Call the PDF Engine + PdfEngineResponse pdfEngineResponse = pdfEngineClient.generatePDF(request); + + if (pdfEngineResponse.getStatusCode() != HttpStatus.SC_OK) { + throw new GeneratePDFException(pdfEngineResponse.getErrorMessage(), pdfEngineResponse.getStatusCode()); + } + + return pdfEngineResponse; + } + + private ReceiptPDFTemplate buildTemplate(BizEvent bizEvent, boolean onlyDebtor) { + // TODO build template data + return ReceiptPDFTemplate.builder() + .transaction(Transaction.builder() + .id(BizEventToPdfMapper.getId(bizEvent)) + .timestamp(BizEventToPdfMapper.getTimestamp(bizEvent)) + .amount(BizEventToPdfMapper.getAmount(bizEvent)) + .psp(PSP.builder() + .name(BizEventToPdfMapper.getPspName(bizEvent)) + .fee(PSPFee.builder() + .amount(BizEventToPdfMapper.getPspFee(bizEvent)) + .build()) + .build()) + .rrn(BizEventToPdfMapper.getRnn(bizEvent)) + .paymentMethod(PaymentMethod.builder() + .name(BizEventToPdfMapper.getPaymentMethodName(bizEvent)) + .logo(BizEventToPdfMapper.getPaymentMethodLogo(bizEvent)) + .accountHolder(BizEventToPdfMapper.getPaymentMethodAccountHolder(bizEvent)) + .extraFee(BizEventToPdfMapper.getExtraFee(bizEvent)) + .build()) + .authCode(BizEventToPdfMapper.getAuthCode(bizEvent)) + .requestedByDebtor(onlyDebtor) + .build()) + .user(onlyDebtor ? + null : + User.builder() + .data(UserData.builder() + .firstName(BizEventToPdfMapper.getUserFullName(bizEvent)) + .lastName(null) //TODO only fullname + .taxCode(BizEventToPdfMapper.getUserTaxCode(bizEvent)) + .build()) + .email(BizEventToPdfMapper.getUserMail(bizEvent)) + .build()) + .cart(Cart.builder() + .items(Collections.singletonList( + Item.builder() + .refNumber(RefNumber.builder() + .type(BizEventToPdfMapper.getRefNumberType()) + .value(BizEventToPdfMapper.getRefNumberValue(bizEvent)) + .build()) + .debtor(Debtor.builder() + .fullName(BizEventToPdfMapper.getDebtorFullName(bizEvent)) + .taxCode(BizEventToPdfMapper.getDebtorTaxCode(bizEvent)) + .build()) + .payee(Payee.builder() + .name(BizEventToPdfMapper.getPayeeName(bizEvent)) + .taxCode(BizEventToPdfMapper.getPayeeTaxCode(bizEvent)) + .build()) + .subject(BizEventToPdfMapper.getItemSubject(bizEvent)) + .amount(BizEventToPdfMapper.getItemAmount(bizEvent)) + .build() + )) + .amountPartial(BizEventToPdfMapper.getItemAmount(bizEvent)) //Cart items total amount w/o fee + .build()) + .build(); + } + + private void deleteTempFolderAndFile(String tempPdfPath, String tempDirectoryPath) { + File tempFile = new File(tempPdfPath); + if (tempFile.exists()) { + try { + Files.delete(tempFile.toPath()); + } catch (IOException e) { + logger.warn("Error deleting temporary pdf file from file system", e); + } + } + + File tempDirectory = new File(tempDirectoryPath); + if (tempDirectory.exists()) { + try { + Files.delete(tempDirectory.toPath()); + } catch (IOException e) { + logger.warn("Error deleting temporary pdf directory from file system", e); + } + } + } + + private String parseTemplateDataToString(ReceiptPDFTemplate template) throws GeneratePDFException { + try { + return ObjectMapperUtils.writeValueAsString(template); + } catch (JsonProcessingException e) { + throw new GeneratePDFException("Error preparing input data for receipt PDF template", ReasonErrorCode.ERROR_PDF_ENGINE.getCode(), e); + } + } + + private boolean receiptAlreadyCreated(ReceiptMetadata receiptMetadata) { + return receiptMetadata != null && receiptMetadata.getUrl() != null && receiptMetadata.getUrl().isEmpty(); + } +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/BizEventToPdfMapper.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/BizEventToPdfMapper.java new file mode 100644 index 00000000..17303852 --- /dev/null +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/BizEventToPdfMapper.java @@ -0,0 +1,186 @@ +package it.gov.pagopa.receipt.pdf.generator.utils; + +import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent; + +public class BizEventToPdfMapper { + + /** + * Hide from public usage. + */ + private BizEventToPdfMapper() { + } + + public static String getId(BizEvent event) { + if ( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null + ) { + return String.valueOf(event.getTransactionDetails().getTransaction().getIdTransaction()); + } + if ( + event.getPaymentInfo() != null + ) { + return event.getPaymentInfo().getPaymentToken(); + } + + //TODO IUR? + return null; + } + + public static String getTimestamp(BizEvent event) { + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null && + event.getTransactionDetails().getTransaction().getCreationDate() != null + ){ + return event.getTransactionDetails().getTransaction().getCreationDate(); + } + + return event.getPaymentInfo() != null ? event.getPaymentInfo().getPaymentDateTime() : ""; + } + + public static String getAmount(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null + ){ + return String.valueOf(event.getTransactionDetails().getTransaction().getAmount()); + } + + return event.getPaymentInfo() != null ? event.getPaymentInfo().getAmount() : ""; + } + + public static String getPspName(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null && + event.getTransactionDetails().getTransaction().getPsp() != null && + event.getTransactionDetails().getTransaction().getPsp().getBusinessName() != null + ){ + return event.getTransactionDetails().getTransaction().getPsp().getBusinessName(); + } + + return event.getPsp() != null ? event.getPsp().getPsp() : null; + } + + public static String getPspFee(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null + ){ + return String.valueOf(event.getTransactionDetails().getTransaction().getFee()); + } + + return event.getPaymentInfo() != null ? event.getPaymentInfo().getFee() : null; + } + + public static String getRnn(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null && + event.getTransactionDetails().getTransaction().getRrn() != null + ){ + return event.getTransactionDetails().getTransaction().getRrn(); + } + + //TODO ECOMMERCE ANALYSIS + //TODO NODO -> paymentToken / iur? + return null; + } + + public static String getAuthCode(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getTransaction() != null && + event.getTransactionDetails().getTransaction().getAuthorizationCode() != null + ){ + return event.getTransactionDetails().getTransaction().getAuthorizationCode(); + } + + return null; + } + + public static String getPaymentMethodName(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getWallet() != null && + event.getTransactionDetails().getWallet().getInfo() != null && + event.getTransactionDetails().getWallet().getInfo().getBrand() != null + ){ + return event.getTransactionDetails().getWallet().getInfo().getBrand(); + } + + return null; + } + + public static String getPaymentMethodLogo(BizEvent event){ + //TODO analyse -> transactionDetails.wallet.info.brandLogo doesn't exist + + return null; + } + + public static String getPaymentMethodAccountHolder(BizEvent event){ + if( + event.getTransactionDetails() != null && + event.getTransactionDetails().getWallet() != null && + event.getTransactionDetails().getWallet().getInfo() != null && + event.getTransactionDetails().getWallet().getInfo().getHolder() != null + ){ + return event.getTransactionDetails().getWallet().getInfo().getHolder(); + } + + return event.getPayer() != null ? event.getPayer().getFullName() : null; + } + + public static boolean getExtraFee(BizEvent event){ + //TODO Mapping ? + return false; + } + + public static String getUserMail(BizEvent event){ + //TODO Mapping ? + return null; + } + + public static String getUserFullName(BizEvent event){ + return event.getPayer() != null ? event.getPayer().getFullName() : null; + } + + public static String getUserTaxCode(BizEvent event){ + return event.getPayer() != null ? event.getPayer().getEntityUniqueIdentifierValue() : null; + } + + private static final String REF_NUMBER_TYPE = "CODICE AVVISO"; + public static String getRefNumberType(){ + return REF_NUMBER_TYPE; + } + + public static String getRefNumberValue(BizEvent event){ + return event.getDebtorPosition() != null ? event.getDebtorPosition().getIuv() : null; + } + + public static String getDebtorFullName(BizEvent event){ + return event.getDebtor() != null ? event.getDebtor().getFullName() : null; + } + + public static String getDebtorTaxCode(BizEvent event){ + return event.getDebtor() != null ? event.getDebtor().getEntityUniqueIdentifierValue() : null; + } + + public static String getPayeeName(BizEvent event){ + return event.getCreditor() != null ? event.getCreditor().getOfficeName() : null; + } + + public static String getPayeeTaxCode(BizEvent event){ + return event.getCreditor() != null ? event.getCreditor().getCompanyName() : null; + } + + public static String getItemSubject(BizEvent event){ + return event.getPaymentInfo() != null ? event.getPaymentInfo().getRemittanceInformation() : null; + } + + public static String getItemAmount(BizEvent event){ + return event.getPaymentInfo() != null ? event.getPaymentInfo().getAmount() : null; + } + +} diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtils.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtils.java index 7ed16ef3..b76235e4 100644 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtils.java +++ b/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtils.java @@ -2,24 +2,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.modelmapper.ModelMapper; -import org.modelmapper.convention.MatchingStrategies; public class ObjectMapperUtils { - private static final ModelMapper modelMapper; - private static final ObjectMapper objectMapper; - - /** - * Model mapper property setting are specified in the following block. - * Default property matching strategy is set to Strict see {@link MatchingStrategies} - * Custom mappings are added using {@link ModelMapper#addMappings(PropertyMap)} - */ - static { - modelMapper = new ModelMapper(); - modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - objectMapper = new ObjectMapper(); - } + private static final ObjectMapper objectMapper = new ObjectMapper(); /** * Hide from public usage. @@ -33,12 +19,8 @@ private ObjectMapperUtils() { * @param value Object to be encoded * @return encoded string */ - public static String writeValueAsString(Object value) { - try { + public static String writeValueAsString(Object value) throws JsonProcessingException { return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException e) { - return null; - } } /** @@ -52,6 +34,4 @@ public static String writeValueAsString(Object value) { public static T mapString(final String string, Class outClass) throws JsonProcessingException { return objectMapper.readValue(string, outClass); } - - } diff --git a/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/TemplateMapperUtils.java b/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/TemplateMapperUtils.java deleted file mode 100644 index 0682a51e..00000000 --- a/src/main/java/it/gov/pagopa/receipt/pdf/generator/utils/TemplateMapperUtils.java +++ /dev/null @@ -1,226 +0,0 @@ -package it.gov.pagopa.receipt.pdf.generator.utils; - -import it.gov.pagopa.receipt.pdf.generator.entity.event.BizEvent; -import it.gov.pagopa.receipt.pdf.generator.entity.event.Info; -import it.gov.pagopa.receipt.pdf.generator.entity.event.Transaction; -import it.gov.pagopa.receipt.pdf.generator.entity.event.TransactionDetails; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -public class TemplateMapperUtils { - - private static final String KEY_AMOUNT = "amount"; - private static final String KEY_TAX_CODE = "taxCode"; - - /** - * Hide from public usage. - */ - private TemplateMapperUtils() { - } - - /** - * Converts the data from the biz-event to data compatible with the template to be given to the PDF engine - * - * @param bizEvent Biz-event from queue message - * @return map of data - */ - public static Map convertReceiptToPdfData(BizEvent bizEvent) { - Map map = new HashMap<>(); - - TransactionDetails transactionDetails = bizEvent.getTransactionDetails(); - - //transaction - Map transactionMap = getTransactionMap(bizEvent, transactionDetails); - - //user - Map userMap = getUserMap(bizEvent, transactionDetails); - - //cart - Map cartMap = getCartMap(bizEvent); - - - map.put("transaction", transactionMap); - map.put("user", userMap); - map.put("cart", cartMap); - map.put("noticeCode", ""); - map.put(KEY_AMOUNT, 0); - - return map; - } - - /** - * Retrieves transaction's data from the biz-event - * - * @param bizEvent Biz-event from queue message - * @param transactionDetails Biz-event transaction details - * @return map of the transaction's data - */ - private static Map getTransactionMap(BizEvent bizEvent, TransactionDetails transactionDetails) { - Map transactionMap = new HashMap<>(); - - Transaction transaction = transactionDetails != null ? transactionDetails.getTransaction() : null; - Info transactionInfo = transactionDetails != null && transactionDetails.getWallet() != null - ? transactionDetails.getWallet().getInfo() : null; - - //transaction.psp - Map transactionPspMap = new HashMap<>(); - transactionPspMap.put( - "name", - transaction != null && transaction.getPsp() != null ? transaction.getPsp().getBusinessName() : "" - ); - //transaction.psp.fee - Map transactionPspFeeMap = new HashMap<>(); - transactionPspFeeMap.put( - KEY_AMOUNT, - transaction != null ? transaction.getFee() : "" - ); - transactionPspMap.put( - "fee", - transactionPspFeeMap - ); - //transaction.paymentMethod - Map transactionPaymentMethod = new HashMap<>(); - transactionPaymentMethod.put( - "name", bizEvent.getPaymentInfo() != null ? bizEvent.getPaymentInfo().getPaymentMethod() : "" - ); - transactionPaymentMethod.put( - "logo", transactionInfo != null ? transactionInfo.getBrand() : "" - ); - transactionPaymentMethod.put( - "accountHolder", - transactionInfo != null ? transactionInfo.getHolder() : "" - ); - transactionPaymentMethod.put( - "extraFee", - "false" - ); - - transactionMap.put( - "id", - transaction != null ? transaction.getIdTransaction() : "" - ); - transactionMap.put( - "timestamp", - bizEvent.getPaymentInfo() != null ? bizEvent.getPaymentInfo().getPaymentDateTime() : "" - ); - transactionMap.put( - KEY_AMOUNT, - bizEvent.getPaymentInfo() != null ? bizEvent.getPaymentInfo().getAmount() : "" - ); - transactionMap.put( - "psp", - transactionPspMap); - transactionMap.put( - "rrn", - transaction != null ? transaction.getRrn() : "" - ); - transactionMap.put( - "paymentMethod", - transactionPaymentMethod - ); - transactionMap.put( - "authCode", - transaction != null ? transaction.getAuthorizationCode() : "" - ); - return transactionMap; - } - - /** - * Retrieves user's data from the biz-event - * - * @param bizEvent Biz-event from queue message - * @param transactionDetails Biz-event transaction details - * @return map of the user's data - */ - private static Map getUserMap(BizEvent bizEvent, TransactionDetails transactionDetails) { - Map userMap = new HashMap<>(); - //user.data - Map userDataMap = new HashMap<>(); - userDataMap.put( - "firstName", - transactionDetails != null && transactionDetails.getUser() != null ? transactionDetails.getUser().getFullName() : "" - ); - userDataMap.put( - "lastName", - "" - ); - userDataMap.put( - KEY_TAX_CODE, - transactionDetails != null && transactionDetails.getUser() != null ? transactionDetails.getUser().getFiscalCode() : "" - ); - - userMap.put( - "data", - userDataMap - ); - userMap.put( - "mail", - bizEvent.getDebtor() != null ? bizEvent.getDebtor().getEMail() : "" - ); - return userMap; - } - - /** - * Retrieves items cart's data from the biz-event - * - * @param bizEvent Biz-event from queue message - * @return map of items cart's data - */ - private static Map getCartMap(BizEvent bizEvent) { - //cart - Map cartMap = new HashMap<>(); - //cart.items - ArrayList cartItemsArray = new ArrayList<>(); - //cart.items[0] - Map cartItemMap = new HashMap<>(); - //cart.items[0].refNumber - Map cartItemRefNumberMap = new HashMap<>(); - cartItemRefNumberMap.put( - "type", - "CODICE AVVISO" - ); - cartItemRefNumberMap.put( - "value", - bizEvent.getDebtorPosition() != null ? bizEvent.getDebtorPosition().getIuv() : "") - ; - //cart.items[0].debtor - Map cartItemDebtorMap = new HashMap<>(); - cartItemDebtorMap.put( - "fullName", - bizEvent.getDebtor() != null ? bizEvent.getDebtor().getFullName() : "" - ); - cartItemDebtorMap.put( - KEY_TAX_CODE, - bizEvent.getDebtor() != null ? bizEvent.getDebtor().getEntityUniqueIdentifierType() : "" - ); - //cart.items[0].payee - Map cartItemPayeeMap = new HashMap<>(); - cartItemPayeeMap.put( - "name", - bizEvent.getCreditor() != null ? bizEvent.getCreditor().getOfficeName() : "" - ); - cartItemPayeeMap.put( - KEY_TAX_CODE, - bizEvent.getCreditor() != null ? bizEvent.getCreditor().getCompanyName() : "" - ); - - cartItemMap.put("refNumber", cartItemRefNumberMap); - cartItemMap.put("debtor", cartItemDebtorMap); - cartItemMap.put("payee", cartItemPayeeMap); - cartItemMap.put( - "subject", - bizEvent.getPaymentInfo() != null ? bizEvent.getPaymentInfo().getRemittanceInformation() : "" - ); - cartItemMap.put( - KEY_AMOUNT, - bizEvent.getPaymentInfo() != null ? bizEvent.getPaymentInfo().getAmount() : "" - ); - - cartItemsArray.add(cartItemMap); - - cartMap.put("items", cartItemsArray); - return cartMap; - } -} diff --git a/src/main/resources/complete_template.zip b/src/main/resources/complete_template.zip deleted file mode 100644 index 9a7ca602..00000000 Binary files a/src/main/resources/complete_template.zip and /dev/null differ diff --git a/src/main/resources/partial_template.zip b/src/main/resources/partial_template.zip deleted file mode 100644 index 28be23b1..00000000 Binary files a/src/main/resources/partial_template.zip and /dev/null differ diff --git a/src/main/resources/template.zip b/src/main/resources/template.zip new file mode 100644 index 00000000..fb8c6c16 Binary files /dev/null and b/src/main/resources/template.zip differ diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdfTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdfTest.java index 4e4209d5..e563ecce 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdfTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/GenerateReceiptPdfTest.java @@ -14,7 +14,10 @@ import it.gov.pagopa.receipt.pdf.generator.model.response.BlobStorageResponse; import it.gov.pagopa.receipt.pdf.generator.model.response.PdfEngineResponse; import org.apache.http.HttpStatus; -import org.junit.jupiter.api.*; +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.ArgumentCaptor; import org.mockito.Captor; @@ -26,7 +29,6 @@ import java.io.IOException; import java.lang.reflect.Field; import java.nio.file.Files; -import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -66,7 +68,7 @@ class GenerateReceiptPdfTest { private ExecutionContext context; @Captor - private ArgumentCaptor> receiptCaptor; + private ArgumentCaptor receiptCaptor; @Captor private ArgumentCaptor messageCaptor; @@ -136,7 +138,7 @@ void runOkReceiptStatusInsertedDifferentFiscalCode() throws ReceiptNotFoundExcep GenerateReceiptPdfTest.setMock(ReceiptBlobClientImpl.class, blobClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -145,7 +147,7 @@ void runOkReceiptStatusInsertedDifferentFiscalCode() throws ReceiptNotFoundExcep assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_DIFFERENT_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); assertEquals(ReceiptStatusType.GENERATED, capturedCosmos.getStatus()); assertEquals(VALID_DEBTOR_CF, capturedCosmos.getEventData().getDebtorFiscalCode()); @@ -189,7 +191,7 @@ void runOkReceiptStatusInsertedSameFiscalCode() throws ReceiptNotFoundException GenerateReceiptPdfTest.setMock(ReceiptBlobClientImpl.class, blobClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -198,7 +200,7 @@ void runOkReceiptStatusInsertedSameFiscalCode() throws ReceiptNotFoundException assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); assertEquals(ReceiptStatusType.GENERATED, capturedCosmos.getStatus()); assertEquals(VALID_BLOB_URL, capturedCosmos.getMdAttach().getUrl()); @@ -239,7 +241,7 @@ void runOkReceiptStatusRetrySameFiscalCode() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(ReceiptBlobClientImpl.class, blobClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -248,7 +250,7 @@ void runOkReceiptStatusRetrySameFiscalCode() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); assertEquals(ReceiptStatusType.GENERATED, capturedCosmos.getStatus()); assertEquals(VALID_BLOB_URL, capturedCosmos.getMdAttach().getUrl()); @@ -259,6 +261,36 @@ void runOkReceiptStatusRetrySameFiscalCode() throws ReceiptNotFoundException { ); } + @Test + void runKOReceiptNullDebtorFiscalCode() throws ReceiptNotFoundException { + ReceiptCosmosClientImpl cosmosClient = mock(ReceiptCosmosClientImpl.class); + receiptMock.setStatus(ReceiptStatusType.INSERTED); + EventData eventDataMock = mock(EventData.class); + when(eventDataMock.getDebtorFiscalCode()).thenReturn(null); + receiptMock.setEventData(eventDataMock); + when(cosmosClient.getReceiptDocument(any())).thenReturn(receiptMock); + + GenerateReceiptPdfTest.setMock(ReceiptCosmosClientImpl.class, cosmosClient); + + @SuppressWarnings("unchecked") + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); + + @SuppressWarnings("unchecked") + OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); + + // test execution + assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); + + verify(documentdb).setValue(receiptCaptor.capture()); + Receipt capturedCosmos = receiptCaptor.getValue(); + + assertEquals(ReceiptStatusType.FAILED, capturedCosmos.getStatus()); + assertNotNull(capturedCosmos.getReasonErr()); + assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, capturedCosmos.getReasonErr().getCode()); + assertNull(capturedCosmos.getMdAttachPayer()); + assertNull(capturedCosmos.getMdAttach()); + } + @Test void runDiscarded() throws ReceiptNotFoundException { ReceiptCosmosClientImpl cosmosClient = mock(ReceiptCosmosClientImpl.class); @@ -271,7 +303,7 @@ void runDiscarded() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(ReceiptCosmosClientImpl.class, cosmosClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -290,7 +322,25 @@ void runReceiptNotFound() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(ReceiptCosmosClientImpl.class, cosmosClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); + + @SuppressWarnings("unchecked") + OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); + + // test execution + Assertions.assertThrows(ReceiptNotFoundException.class, + () -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); + } + + @Test + void runReceiptIsNull() throws ReceiptNotFoundException { + ReceiptCosmosClientImpl cosmosClient = mock(ReceiptCosmosClientImpl.class); + when(cosmosClient.getReceiptDocument(any())) + .thenReturn(null); + GenerateReceiptPdfTest.setMock(ReceiptCosmosClientImpl.class, cosmosClient); + + @SuppressWarnings("unchecked") + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -303,7 +353,7 @@ void runReceiptNotFound() throws ReceiptNotFoundException { @Test void runKoInvalidBizEventMessage() { @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -332,7 +382,7 @@ void runKoPdfEngine400() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(PdfEngineClientImpl.class, pdfEngineClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -341,12 +391,12 @@ void runKoPdfEngine400() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); + String capturedMessage = messageCaptor.getValue(); - assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, caputuredMessage); + assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, capturedMessage); assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); assertEquals(PDF_ENGINE_ERROR_MESSAGE, capturedCosmos.getReasonErr().getMessage()); @@ -373,7 +423,7 @@ void runKoPdfEngine401() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(PdfEngineClientImpl.class, pdfEngineClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -382,12 +432,12 @@ void runKoPdfEngine401() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); + String capturedMessage = messageCaptor.getValue(); - assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, caputuredMessage); + assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, capturedMessage); assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); assertEquals(ReasonErrorCode.ERROR_PDF_ENGINE.getCustomCode(com.microsoft.azure.functions.HttpStatus.UNAUTHORIZED.value()), capturedCosmos.getReasonErr().getCode()); assertEquals(PDF_ENGINE_ERROR_MESSAGE, capturedCosmos.getReasonErr().getMessage()); @@ -414,7 +464,7 @@ void runKoPdfEngine500() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(PdfEngineClientImpl.class, pdfEngineClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -423,12 +473,12 @@ void runKoPdfEngine500() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); + String capturedMessage = messageCaptor.getValue(); - assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, caputuredMessage); + assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, capturedMessage); assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); assertEquals(ReasonErrorCode.ERROR_PDF_ENGINE.getCustomCode(HttpStatus.SC_INTERNAL_SERVER_ERROR), capturedCosmos.getReasonErr().getCode()); assertEquals(PDF_ENGINE_ERROR_MESSAGE, capturedCosmos.getReasonErr().getMessage()); @@ -462,7 +512,7 @@ void runKoBlobStorage() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(ReceiptBlobClientImpl.class, blobClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -471,12 +521,12 @@ void runKoBlobStorage() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_DIFFERENT_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); + String capturedMessage = messageCaptor.getValue(); - assertEquals(BIZ_EVENT_MESSAGE_DIFFERENT_CF, caputuredMessage); + assertEquals(BIZ_EVENT_MESSAGE_DIFFERENT_CF, capturedMessage); assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); assertEquals(ReasonErrorCode.ERROR_BLOB_STORAGE.getCode(), capturedCosmos.getReasonErr().getCode()); } @@ -509,7 +559,7 @@ void runKoBlobStorageThrowException() throws Exception { GenerateReceiptPdfTest.setMock(ReceiptBlobClientImpl.class, blobClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -521,12 +571,12 @@ void runKoBlobStorageThrowException() throws Exception { ); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); + String capturedMessage = messageCaptor.getValue(); - assertEquals(BIZ_EVENT_MESSAGE_DIFFERENT_CF, caputuredMessage); + assertEquals(BIZ_EVENT_MESSAGE_DIFFERENT_CF, capturedMessage); assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); assertEquals(ReasonErrorCode.ERROR_BLOB_STORAGE.getCode(), capturedCosmos.getReasonErr().getCode()); } @@ -551,7 +601,7 @@ void runKoTooManyRetry() throws ReceiptNotFoundException { GenerateReceiptPdfTest.setMock(PdfEngineClientImpl.class, pdfEngineClient); @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); + OutputBinding documentdb = (OutputBinding) spy(OutputBinding.class); @SuppressWarnings("unchecked") OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); @@ -560,52 +610,11 @@ void runKoTooManyRetry() throws ReceiptNotFoundException { assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); + Receipt capturedCosmos = receiptCaptor.getValue(); assertEquals(ReceiptStatusType.FAILED, capturedCosmos.getStatus()); } - @Test - void runKoTemplateNotFound() throws Exception { - ReceiptCosmosClientImpl cosmosClient = mock(ReceiptCosmosClientImpl.class); - receiptMock.setStatus(ReceiptStatusType.INSERTED); - EventData eventDataMock = mock(EventData.class); - when(eventDataMock.getDebtorFiscalCode()).thenReturn(VALID_DEBTOR_CF); - when(eventDataMock.getPayerFiscalCode()).thenReturn(VALID_DEBTOR_CF); - receiptMock.setEventData(eventDataMock); - receiptMock.setNumRetry(0); - when(cosmosClient.getReceiptDocument(any())).thenReturn(receiptMock); - - GenerateReceiptPdfTest.setMock(ReceiptCosmosClientImpl.class, cosmosClient); - - PdfEngineClientImpl pdfEngineClient = mock(PdfEngineClientImpl.class); - - GenerateReceiptPdfTest.setMock(PdfEngineClientImpl.class, pdfEngineClient); - - @SuppressWarnings("unchecked") - OutputBinding> documentdb = (OutputBinding>) spy(OutputBinding.class); - - @SuppressWarnings("unchecked") - OutputBinding requeueMessage = (OutputBinding) spy(OutputBinding.class); - - // test execution - withEnvironmentVariable("COMPLETE_TEMPLATE_FILE_NAME", "invalid_filename") - .execute(() -> { - assertDoesNotThrow(() -> function.processGenerateReceipt(BIZ_EVENT_MESSAGE_SAME_CF, documentdb, requeueMessage, context)); - }); - - - verify(documentdb).setValue(receiptCaptor.capture()); - Receipt capturedCosmos = receiptCaptor.getValue().get(0); - - verify(requeueMessage).setValue(messageCaptor.capture()); - String caputuredMessage = messageCaptor.getValue(); - - assertEquals(BIZ_EVENT_MESSAGE_SAME_CF, caputuredMessage); - assertEquals(ReceiptStatusType.RETRY, capturedCosmos.getStatus()); - assertNotNull(capturedCosmos.getReasonErr().getMessage()); - } - private static void setMock(Class classToMock, T mock) { try { Field instance = classToMock.getDeclaredField("instance"); diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/PdfEngineClientImplTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImplTest.java similarity index 98% rename from src/test/java/it/gov/pagopa/receipt/pdf/generator/client/PdfEngineClientImplTest.java rename to src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImplTest.java index dd90f50a..a3a7b338 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/PdfEngineClientImplTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/PdfEngineClientImplTest.java @@ -1,6 +1,5 @@ -package it.gov.pagopa.receipt.pdf.generator.client; +package it.gov.pagopa.receipt.pdf.generator.client.impl; -import it.gov.pagopa.receipt.pdf.generator.client.impl.PdfEngineClientImpl; import it.gov.pagopa.receipt.pdf.generator.model.request.PdfEngineRequest; import it.gov.pagopa.receipt.pdf.generator.model.response.PdfEngineResponse; import org.apache.http.HttpEntity; diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptBlobClientImplTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImplTest.java similarity index 96% rename from src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptBlobClientImplTest.java rename to src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImplTest.java index 97d5003f..e92cbf68 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptBlobClientImplTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptBlobClientImplTest.java @@ -1,11 +1,10 @@ -package it.gov.pagopa.receipt.pdf.generator.client; +package it.gov.pagopa.receipt.pdf.generator.client.impl; import com.azure.core.http.rest.Response; import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; import com.azure.storage.blob.BlobServiceClient; import com.microsoft.azure.functions.HttpStatus; -import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptBlobClientImpl; import it.gov.pagopa.receipt.pdf.generator.model.response.BlobStorageResponse; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptCosmosClientImplTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImplTest.java similarity index 96% rename from src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptCosmosClientImplTest.java rename to src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImplTest.java index cecd7c51..ce5256d1 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptCosmosClientImplTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptCosmosClientImplTest.java @@ -1,10 +1,9 @@ -package it.gov.pagopa.receipt.pdf.generator.client; +package it.gov.pagopa.receipt.pdf.generator.client.impl; import com.azure.cosmos.CosmosClient; import com.azure.cosmos.CosmosContainer; import com.azure.cosmos.CosmosDatabase; import com.azure.cosmos.util.CosmosPagedIterable; -import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptCosmosClientImpl; import it.gov.pagopa.receipt.pdf.generator.entity.receipt.Receipt; import it.gov.pagopa.receipt.pdf.generator.exception.ReceiptNotFoundException; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptQueueClientImplTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImplTest.java similarity index 95% rename from src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptQueueClientImplTest.java rename to src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImplTest.java index 25ec221d..8ef8004a 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/ReceiptQueueClientImplTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/client/impl/ReceiptQueueClientImplTest.java @@ -1,10 +1,9 @@ -package it.gov.pagopa.receipt.pdf.generator.client; +package it.gov.pagopa.receipt.pdf.generator.client.impl; import com.azure.core.http.rest.Response; import com.azure.storage.queue.QueueClient; import com.azure.storage.queue.models.SendMessageResult; import com.microsoft.azure.functions.HttpStatus; -import it.gov.pagopa.receipt.pdf.generator.client.impl.ReceiptQueueClientImpl; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/it/gov/pagopa/receipt/pdf/generator/util/ObjectMapperUtilsTest.java b/src/test/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtilsTest.java similarity index 63% rename from src/test/java/it/gov/pagopa/receipt/pdf/generator/util/ObjectMapperUtilsTest.java rename to src/test/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtilsTest.java index c207de88..e3363031 100644 --- a/src/test/java/it/gov/pagopa/receipt/pdf/generator/util/ObjectMapperUtilsTest.java +++ b/src/test/java/it/gov/pagopa/receipt/pdf/generator/utils/ObjectMapperUtilsTest.java @@ -1,7 +1,6 @@ -package it.gov.pagopa.receipt.pdf.generator.util; +package it.gov.pagopa.receipt.pdf.generator.utils; import com.fasterxml.jackson.core.JsonProcessingException; -import it.gov.pagopa.receipt.pdf.generator.utils.ObjectMapperUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -11,9 +10,7 @@ class ObjectMapperUtilsTest { @Test void returnNullAfterException() { - - Assertions.assertNull(ObjectMapperUtils.writeValueAsString(InputStream.nullInputStream())); + Assertions.assertThrows(JsonProcessingException.class, () ->ObjectMapperUtils.writeValueAsString(InputStream.nullInputStream())); Assertions.assertThrows(JsonProcessingException.class, () -> ObjectMapperUtils.mapString("", InputStream.class)); - } } diff --git a/src/test/resources/receipt_data.json b/src/test/resources/receipt_data.json deleted file mode 100644 index 1f1c3379..00000000 --- a/src/test/resources/receipt_data.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "transaction": { - "id": "F57E2F8E-25FF-4183-AB7B-4A5EC1A96644", - "timestamp": "2020-07-10 15:00:00.000", - "amount": 300.00, - "psp": { - "name": "Nexi", - "fee": { - "amount": 2.00 - } - }, - "rrn": "1234567890", - "paymentMethod": { - "name": "Visa *1234", - "logo": "https://...", - "accountHolder": "Marzia Roccaraso", - "extraFee": false - }, - "authCode": "9999999999" - }, - "user": { - "data": { - "firstName": "Marzia", - "lastName": "Roccaraso", - "taxCode": "RCCMRZ88A52C409A" - }, - "email": "email@test.it" - }, - "cart": { - "items": [{ - "refNumber": { - "type": "codiceAvviso", - "value": "123456789012345678" - }, - "debtor": { - "fullName": "Giuseppe Bianchi", - "taxCode": "BNCGSP70A12F205X" - }, - "payee": { - "name": "Comune di Controguerra", - "taxCode": "82001760675" - }, - "subject": "TARI 2022", - "amount": 150.00 - }], - "amountPartial": 300.00 - }, - "noticeCode": "noticeCodeTest", - "amount": 100 -} \ No newline at end of file