Skip to content

Commit

Permalink
Merge pull request #72 from pagopa/PAGOPA-1838-issue-get-pdf-receipt
Browse files Browse the repository at this point in the history
bug: [PagoPa-1838] fix issues in regenerate pdf receipt
  • Loading branch information
pasqualespica authored Jun 18, 2024
2 parents 73d55e9 + 4bbb934 commit 48e7c46
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;

import io.micrometer.core.instrument.util.StringUtils;
import it.gov.pagopa.receipt.pdf.helpdesk.client.BizEventCosmosClient;
import it.gov.pagopa.receipt.pdf.helpdesk.client.ReceiptCosmosClient;
import it.gov.pagopa.receipt.pdf.helpdesk.client.impl.BizEventCosmosClientImpl;
import it.gov.pagopa.receipt.pdf.helpdesk.client.impl.ReceiptCosmosClientImpl;
import it.gov.pagopa.receipt.pdf.helpdesk.entity.event.BizEvent;
import it.gov.pagopa.receipt.pdf.helpdesk.entity.receipt.ReasonError;
import it.gov.pagopa.receipt.pdf.helpdesk.entity.receipt.Receipt;
import it.gov.pagopa.receipt.pdf.helpdesk.entity.receipt.ReceiptMetadata;
import it.gov.pagopa.receipt.pdf.helpdesk.entity.receipt.enumeration.ReceiptStatusType;
import it.gov.pagopa.receipt.pdf.helpdesk.exception.BizEventNotFoundException;
import it.gov.pagopa.receipt.pdf.helpdesk.exception.PDVTokenizerException;
import it.gov.pagopa.receipt.pdf.helpdesk.exception.ReceiptNotFoundException;
import it.gov.pagopa.receipt.pdf.helpdesk.model.PdfGeneration;
import it.gov.pagopa.receipt.pdf.helpdesk.model.PdfMetadata;
import it.gov.pagopa.receipt.pdf.helpdesk.model.ProblemJson;
import it.gov.pagopa.receipt.pdf.helpdesk.service.BizEventToReceiptService;
import it.gov.pagopa.receipt.pdf.helpdesk.service.GenerateReceiptPdfService;
Expand Down Expand Up @@ -193,7 +197,7 @@ private HttpResponseMessage generateAndSavePDF(HttpRequestMessage<Optional<Strin
//Verify PDF generation success
success = generateReceiptPdfService.verifyAndUpdateReceipt(receipt, pdfGeneration);

this.updateReceiptInfo(documentdb, isCart, isToUpdateMetadata, bizEvent, listBizEvent, receipt);
this.updateReceiptInfo(documentdb, isCart, isToUpdateMetadata, bizEvent, listBizEvent, receipt, pdfGeneration);

} catch (IOException e) {
logger.error("[{}] IOException while generating the receipt with id {}: {}",
Expand Down Expand Up @@ -253,7 +257,7 @@ private static void checkOrCreateAttachments(Receipt receipt) {
}

private void updateReceiptInfo(OutputBinding<Receipt> documentdb, boolean isCart, boolean isToUpdateMetadata, BizEvent bizEvent,
List<BizEvent> listBizEvent, Receipt receipt) throws PDVTokenizerException, JsonProcessingException {
List<BizEvent> listBizEvent, Receipt receipt, PdfGeneration pdfGeneration) throws PDVTokenizerException, JsonProcessingException {

if (receipt.getEventData().getDebtorFiscalCode() == null ||
(receipt.getEventData().getPayerFiscalCode() == null
Expand All @@ -270,11 +274,28 @@ && isFromAuthenticatedOrigin(bizEvent))) {
}

if (isToUpdateMetadata) {
this.updateReceiptStatus(receipt, pdfGeneration);
documentdb.setValue(receipt);
}
}

private void updateReceiptStatus(Receipt receipt, PdfGeneration pdfGeneration) {
PdfMetadata debtorMetadata = pdfGeneration.getDebtorMetadata() != null ? pdfGeneration.getDebtorMetadata() : PdfMetadata.builder().build();
PdfMetadata payerMetadata = pdfGeneration.getPayerMetadata() != null ? pdfGeneration.getPayerMetadata() : PdfMetadata.builder().build();
boolean pdfSuccessfullyGen = StringUtils.isEmpty(debtorMetadata.getErrorMessage()) && StringUtils.isEmpty(payerMetadata.getErrorMessage());
if (pdfSuccessfullyGen) {
receipt.setReasonErr(null);
receipt.setReasonErrPayer(null);
receipt.setNumRetry(0);
receipt.setNotificationNumRetry(0);
receipt.setStatus(ReceiptStatusType.IO_NOTIFIED);
receipt.setNotified_at(System.currentTimeMillis());
documentdb.setValue(receipt);
} else {
receipt.setReasonErr(StringUtils.isNotEmpty(debtorMetadata.getErrorMessage()) ?
ReasonError.builder().code(debtorMetadata.getStatusCode()).message(debtorMetadata.getErrorMessage()).build() : null);
receipt.setReasonErrPayer(StringUtils.isNotEmpty(payerMetadata.getErrorMessage()) ?
ReasonError.builder().code(payerMetadata.getStatusCode()).message(payerMetadata.getErrorMessage()).build() : null);
receipt.setStatus(ReceiptStatusType.FAILED);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public BizEvent getBizEventDocument(String eventId) throws BizEventNotFoundExcep
CosmosContainer cosmosContainer = cosmosDatabase.getContainer(containerId);

//Build query
String query = String.format("SELECT * FROM c WHERE c.eventStatus = '%s' and c.id = '%s'", BizEventStatusType.DONE, eventId);
String query = String.format("SELECT * FROM c WHERE c.eventStatus IN ('%s','%s') AND c.id = '%s'", BizEventStatusType.DONE, BizEventStatusType.INGESTED, eventId);

//Query the container
CosmosPagedIterable<BizEvent> queryResponse = cosmosContainer
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package it.gov.pagopa.receipt.pdf.helpdesk.entity.event.enumeration;

public enum BizEventStatusType {
NA, RETRY, FAILED, DONE
NA, RETRY, FAILED, DONE, INGESTED
}
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ public void handleSaveReceipt(Receipt receipt, ReceiptStatusType receiptStatus)
break;
case IO_NOTIFIED:
receipt.setStatus(ReceiptStatusType.IO_NOTIFIED);
receipt.setNotified_at(System.currentTimeMillis());
receipt.setInserted_at(System.currentTimeMillis());
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.micrometer.core.instrument.util.StringUtils;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.net.URL;
Expand Down Expand Up @@ -77,7 +79,7 @@ public boolean verifyAndUpdateReceipt(Receipt receipt, PdfGeneration pdfGenerati

if (receipt.getEventData() != null && !"ANONIMO".equals(receipt.getEventData().getDebtorFiscalCode())) {

if (debtorMetadata == null) {
if (debtorMetadata == null || StringUtils.isNotEmpty(debtorMetadata.getErrorMessage())) {
logger.error("Unexpected result for debtor pdf receipt generation. Receipt id {}", receipt.getId());
return false;
}
Expand All @@ -94,7 +96,7 @@ public boolean verifyAndUpdateReceipt(Receipt receipt, PdfGeneration pdfGenerati
}

PdfMetadata payerMetadata = pdfGeneration.getPayerMetadata();
if (payerMetadata == null) {
if (payerMetadata == null || StringUtils.isNotEmpty(payerMetadata.getErrorMessage())) {
logger.error("Unexpected result for payer pdf receipt generation. Receipt id {}", receipt.getId());
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ public static boolean isBizEventInvalid(BizEvent bizEvent, ExecutionContext cont
return true;
}

if (!BizEventStatusType.DONE.equals(bizEvent.getEventStatus())) {
if (!BizEventStatusType.DONE.equals(bizEvent.getEventStatus()) && !BizEventStatusType.INGESTED.equals(bizEvent.getEventStatus())) {
logger.debug("[{}] event with id {} discarded because in status {}",
context.getFunctionName(), bizEvent.getId(), bizEvent.getEventStatus());
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import it.gov.pagopa.receipt.pdf.helpdesk.exception.BizEventNotFoundException;
import it.gov.pagopa.receipt.pdf.helpdesk.exception.ReceiptNotFoundException;
import it.gov.pagopa.receipt.pdf.helpdesk.model.PdfGeneration;
import it.gov.pagopa.receipt.pdf.helpdesk.model.PdfMetadata;
import it.gov.pagopa.receipt.pdf.helpdesk.model.request.RegenerateReceiptRequest;
import it.gov.pagopa.receipt.pdf.helpdesk.service.BizEventToReceiptService;
import it.gov.pagopa.receipt.pdf.helpdesk.service.GenerateReceiptPdfService;
Expand Down Expand Up @@ -86,6 +87,36 @@ void setUp() {
void regeneratePDFSuccess() {
int numRetry = 0;
Receipt receipt = buildReceiptWithStatus(ReceiptStatusType.INSERTED, numRetry);
receipt.setMdAttachPayer(null);

doReturn(bizEvent).when(bizEventCosmosClient).getBizEventDocument(anyString());
doReturn(receipt).when(receiptCosmosClientMock).getReceiptDocument(anyString());
doReturn(new PdfGeneration()).when(generateReceiptPdfServiceMock).generateReceipts(any(), any(), any());
doReturn(true).when(generateReceiptPdfServiceMock).verifyAndUpdateReceipt(any(), any());

HttpRequestMessage<Optional<String>> request = mock(HttpRequestMessage.class);

doAnswer((Answer<HttpResponseMessage.Builder>) invocation -> {
com.microsoft.azure.functions.HttpStatus status = (com.microsoft.azure.functions.HttpStatus) invocation.getArguments()[0];
return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status);
}).when(request).createResponseBuilder(any(com.microsoft.azure.functions.HttpStatus.class));

// test execution
assertEquals(200,assertDoesNotThrow(() -> sut.run(request, "1", documentdb, executionContextMock)).getStatusCode());

verify(receiptCosmosClientMock).getReceiptDocument(anyString());
verify(generateReceiptPdfServiceMock).generateReceipts(any(), any(), any());
verify(generateReceiptPdfServiceMock).verifyAndUpdateReceipt(any(), any());
}

@Test
@SneakyThrows
void regeneratePDFSameDebtorAndPayerSuccess() {
int numRetry = 0;
Receipt receipt = buildReceiptWithStatus(ReceiptStatusType.INSERTED, numRetry);
receipt.getEventData().setDebtorFiscalCode("same cf debtor and payer");
receipt.getEventData().setPayerFiscalCode("same cf debtor and payer");
receipt.getMdAttach().setUrl(null);

doReturn(bizEvent).when(bizEventCosmosClient).getBizEventDocument(anyString());
doReturn(receipt).when(receiptCosmosClientMock).getReceiptDocument(anyString());
Expand Down Expand Up @@ -255,6 +286,34 @@ void regeneratePDFReceiptNotFoundSuccess() {

}

@Test
@SneakyThrows
void regeneratePDFReceiptFileGenerationError() {
int numRetry = 0;
Receipt receipt = buildReceiptWithStatus(ReceiptStatusType.INSERTED, numRetry);
receipt.setMdAttachPayer(null);
receipt.setMdAttach(null);

doReturn(bizEvent).when(bizEventCosmosClient).getBizEventDocument(anyString());
when(receiptCosmosClientMock.getReceiptDocument(anyString())).thenReturn(receipt);
doReturn(PdfGeneration.builder().debtorMetadata(PdfMetadata.builder().errorMessage("error pdf").statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR).build()).build())
.when(generateReceiptPdfServiceMock).generateReceipts(any(), any(), any());
doReturn(false).when(generateReceiptPdfServiceMock).verifyAndUpdateReceipt(any(), any());


HttpRequestMessage<Optional<String>> request = mock(HttpRequestMessage.class);

doAnswer((Answer<HttpResponseMessage.Builder>) invocation -> {
com.microsoft.azure.functions.HttpStatus status = (com.microsoft.azure.functions.HttpStatus) invocation.getArguments()[0];
return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status);
}).when(request).createResponseBuilder(any(com.microsoft.azure.functions.HttpStatus.class));

// test execution
assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR,assertDoesNotThrow(() -> sut.run(request, "1", documentdb, executionContextMock)).getStatusCode());

verify(receiptCosmosClientMock).getReceiptDocument(anyString());
}

@Test
@SneakyThrows
void regeneratePDFCartReceiptNotFoundException() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,6 @@ void verifyPayerNullOrSameDebtorPayerFailReceiptGenerationInError() throws Recei
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.generateOnlyDebtor(true)
.build();
Expand All @@ -443,7 +442,6 @@ void verifyPayerNullOrSameDebtorPayerFailThrowsReceiptGenerationNotToRetryExcept
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(ReasonErrorCode.ERROR_TEMPLATE_PDF.getCode())
.errorMessage(ERROR_MESSAGE)
.build())
.generateOnlyDebtor(true)
.build();
Expand Down Expand Up @@ -494,7 +492,6 @@ void verifyDifferentDebtorPayerFailDebtorGenerationInError() throws ReceiptGener
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(SC_OK)
Expand All @@ -507,6 +504,27 @@ void verifyDifferentDebtorPayerFailDebtorGenerationInError() throws ReceiptGener
assertThrows(ReceiptGenerationNotToRetryException.class, () -> sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailDebtorGenerationInErrorWithMessage() throws ReceiptGenerationNotToRetryException {
Receipt receipt = buildReceiptForVerify(false, false);

PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(SC_OK)
.documentName(PAYER_DOCUMENT_NAME)
.documentUrl(PAYER_DOCUMENT_URL)
.build())
.generateOnlyDebtor(false)
.build();

assertEquals(false, sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailPayerGenerationInError() throws ReceiptGenerationNotToRetryException {
Expand All @@ -520,35 +538,72 @@ void verifyDifferentDebtorPayerFailPayerGenerationInError() throws ReceiptGenera
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.generateOnlyDebtor(false)
.build();

assertThrows(ReceiptGenerationNotToRetryException.class, () -> sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailPayerGenerationInErrorWithMessage() throws ReceiptGenerationNotToRetryException {
Receipt receipt = buildReceiptForVerify(true, true);

PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(SC_OK)
.documentName(DEBTOR_DOCUMENT_NAME)
.documentUrl(DEBTOR_DOCUMENT_URL)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.generateOnlyDebtor(false)
.build();

assertEquals(false, sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailGenerationInErrorForBoth() throws ReceiptGenerationNotToRetryException {
Receipt receipt = buildReceiptForVerify(true, true);

String errorMessagePayer = "error message payer";
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_BAD_REQUEST)
.errorMessage(errorMessagePayer)
.build())
.generateOnlyDebtor(false)
.build();

assertThrows(ReceiptGenerationNotToRetryException.class, () -> sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailGenerationInErrorForBothWithMessage() throws ReceiptGenerationNotToRetryException {
Receipt receipt = buildReceiptForVerify(true, true);

PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR)
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_BAD_REQUEST)
.errorMessage(ERROR_MESSAGE)
.build())
.generateOnlyDebtor(false)
.build();

assertEquals(false, sut.verifyAndUpdateReceipt(receipt, pdfGeneration));

}

@Test
void verifyDifferentDebtorPayerFailPayerReceiptMetadataNull() throws ReceiptGenerationNotToRetryException {
Expand Down Expand Up @@ -577,15 +632,12 @@ void verifyDifferentDebtorPayerFailPayerReceiptMetadataNull() throws ReceiptGene
void verifyDifferentDebtorPayerFailThrowsReceiptGenerationNotToRetryException() {
Receipt receipt = buildReceiptForVerify(true, true);

String errorMessagePayer = "error message payer";
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(ReasonErrorCode.ERROR_TEMPLATE_PDF.getCode())
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(HttpStatus.SC_BAD_REQUEST)
.errorMessage(errorMessagePayer)
.build())
.generateOnlyDebtor(false)
.build();
Expand All @@ -598,15 +650,12 @@ void verifyDifferentDebtorPayerFailThrowsReceiptGenerationNotToRetryException()
void verifyDifferentDebtorPayerFailBothThrowsReceiptGenerationNotToRetryException() {
Receipt receipt = buildReceiptForVerify(true, true);

String errorMessagePayer = "error message payer";
PdfGeneration pdfGeneration = PdfGeneration.builder()
.debtorMetadata(PdfMetadata.builder()
.statusCode(ReasonErrorCode.ERROR_TEMPLATE_PDF.getCode())
.errorMessage(ERROR_MESSAGE)
.build())
.payerMetadata(PdfMetadata.builder()
.statusCode(ReasonErrorCode.ERROR_TEMPLATE_PDF.getCode())
.errorMessage(errorMessagePayer)
.build())
.generateOnlyDebtor(false)
.build();
Expand Down

0 comments on commit 48e7c46

Please sign in to comment.