Skip to content

Commit

Permalink
[P4ADEV-2179] updated API getReceiptDetail
Browse files Browse the repository at this point in the history
  • Loading branch information
mscarsel committed Feb 14, 2025
1 parent ebe0067 commit 46ae306
Show file tree
Hide file tree
Showing 14 changed files with 725 additions and 352 deletions.
721 changes: 385 additions & 336 deletions openapi/generated.openapi.json

Large diffs are not rendered by default.

43 changes: 42 additions & 1 deletion openapi/p4pa-debt-position.openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,18 @@ paths:
type: integer
format: int64
description: The ID of the receipt
- name: operatorExternalUserId
in: query
required: true
schema:
type: string
responses:
"200":
description: Ok
content:
application/json:
schema:
$ref: "#/components/schemas/ReceiptDTO"
$ref: "#/components/schemas/ReceiptDetailDTO"
"400":
description: Invalid request
content:
Expand Down Expand Up @@ -598,6 +603,42 @@ components:
updateDate:
type: string
format: date-time
ReceiptDetailDTO:
type: object
required:
- receiptId
- paymentAmountCents
- remittanceInformation
- debtPositionDescription
- debtor
- pspCompanyName
- iud
properties:
receiptId:
type: integer
format: int64
iuv:
type: string
paymentAmountCents:
type: integer
format: int64
remittanceInformation:
type: string
debtPositionDescription:
type: string
debtor:
$ref: "#/components/schemas/PersonDTO"
payer:
$ref: "#/components/schemas/PersonDTO"
paymentDateTime:
type: string
format: date-time
pspCompanyName:
type: string
iud:
type: string
iur:
type: string
ReceiptTransferDTO:
required:
- idTransfer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.gov.pagopa.pu.debtpositions.controller.generated.ReceiptApi;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import it.gov.pagopa.pu.debtpositions.service.ReceiptService;
import org.springframework.http.HttpStatus;
Expand All @@ -24,7 +25,7 @@ public ResponseEntity<ReceiptDTO> createReceipt(ReceiptWithAdditionalNodeDataDTO
}

@Override
public ResponseEntity<ReceiptDTO> getReceiptDetail(Long receiptId) {
return ResponseEntity.ok(receiptService.getReceiptDetail(receiptId));
public ResponseEntity<ReceiptDetailDTO> getReceiptDetail(Long receiptId, String operatorExternalUserId) {
return ResponseEntity.ok(receiptService.getReceiptDetail(receiptId, operatorExternalUserId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package it.gov.pagopa.pu.debtpositions.mapper;

import it.gov.pagopa.pu.debtpositions.citizen.service.PersonalDataService;
import it.gov.pagopa.pu.debtpositions.dto.ReceiptPIIDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.model.view.receipt.ReceiptDetailNoPIIView;
import org.springframework.stereotype.Service;

@Service
public class ReceiptDetailPIIViewMapper {

private final PersonalDataService personalDataService;
private final PersonMapper personMapper;

public ReceiptDetailPIIViewMapper(PersonalDataService personalDataService,
PersonMapper personMapper) {
this.personalDataService = personalDataService;
this.personMapper = personMapper;
}

public ReceiptDetailDTO mapToReceiptDetailDTO(ReceiptDetailNoPIIView receiptDetailNoPIIView) {
ReceiptPIIDTO pii = personalDataService.get(
receiptDetailNoPIIView.getDebtorPersonalDataId(),ReceiptPIIDTO.class);
return ReceiptDetailDTO.builder()
.receiptId(receiptDetailNoPIIView.getReceiptId())
.iuv(receiptDetailNoPIIView.getIuv())
.paymentAmountCents(receiptDetailNoPIIView.getPaymentAmountCents())
.remittanceInformation(receiptDetailNoPIIView.getRemittanceInformation())
.debtPositionDescription(receiptDetailNoPIIView.getDebtPositionDescription())
.paymentDateTime(receiptDetailNoPIIView.getPaymentDateTime())
.pspCompanyName(receiptDetailNoPIIView.getPspCompanyName())
.iud(receiptDetailNoPIIView.getIud())
.iur(receiptDetailNoPIIView.getIur())
.debtor(personMapper.mapToDto(pii.getDebtor()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package it.gov.pagopa.pu.debtpositions.model.view.receipt;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.io.Serializable;
import java.time.OffsetDateTime;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "receipt")
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ReceiptDetailNoPIIView implements Serializable {
@Id
private Long receiptId;
private String iuv;
private Long paymentAmountCents;
private String remittanceInformation;
private String debtPositionDescription;
private Long debtorPersonalDataId;
private OffsetDateTime paymentDateTime;
private String pspCompanyName;
private String iud;
private String iur;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package it.gov.pagopa.pu.debtpositions.repository.view.receipt;

import io.swagger.v3.oas.annotations.Parameter;
import it.gov.pagopa.pu.debtpositions.model.view.receipt.ReceiptDetailNoPIIView;
import java.util.Optional;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;

@RepositoryRestResource(path = "receipts-detail-view")
public interface ReceiptDetailNoPIIViewRepository extends Repository<ReceiptDetailNoPIIView, Long> {
@RestResource(exported = false)
@Query(value = "SELECT new ReceiptDetailNoPIIView("
+ "r.receiptId as receiptId, "
+ "i.iuv as iuv, "
+ "r.paymentAmountCents as paymentAmountCents, "
+ "i.remittanceInformation as remittanceInformation, "
+ "dp.description as debtPositionDescription, "
+ "i.personalDataId as debtorPersonalDataId, "
+ "r.paymentDateTime as paymentDateTime, "
+ "r.pspCompanyName as pspCompanyName, "
+ "i.iud as iud, "
+ "i.iur as iur "
+ ") "
+ "FROM ReceiptDetailNoPIIView r "
+ "JOIN InstallmentNoPII i ON r.receiptId = i.receiptId "
+ "JOIN PaymentOption po ON i.paymentOptionId = po.paymentOptionId "
+ "JOIN DebtPosition dp ON po.debtPositionId = dp.debtPositionId "
+ "JOIN DebtPositionTypeOrg dpto ON dp.debtPositionTypeOrgId = dpto.debtPositionTypeOrgId "
+ "JOIN DebtPositionTypeOrgOperators dptoo ON dpto.debtPositionTypeOrgId = dptoo.debtPositionTypeOrgId "
+ "WHERE r.receiptId = :receiptId "
+ "AND dptoo.operatorExternalUserId = :operatorExternalUserId ")
Optional<ReceiptDetailNoPIIView> findReceiptDetailView(
@Parameter(required = true) @Param("receiptId") Long receiptId,
@Parameter(required = true) @Param("operatorExternalUserId") String operatorExternalUserId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package it.gov.pagopa.pu.debtpositions.repository.view.receipt;

import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;

public interface ReceiptDetailPIIViewRepository {
ReceiptDetailDTO getReceiptDetail(Long receiptId, String operatorExternalUserId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package it.gov.pagopa.pu.debtpositions.repository.view.receipt;

import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.exception.custom.NotFoundException;
import it.gov.pagopa.pu.debtpositions.mapper.ReceiptDetailPIIViewMapper;
import it.gov.pagopa.pu.debtpositions.model.view.receipt.ReceiptDetailNoPIIView;
import org.springframework.stereotype.Service;

@Service
public class ReceiptDetailPIIViewRepositoryImpl implements ReceiptDetailPIIViewRepository {
private final ReceiptDetailNoPIIViewRepository receiptDetailNoPIIViewRepository;
private final ReceiptDetailPIIViewMapper receiptDetailPIIViewMapper;

public ReceiptDetailPIIViewRepositoryImpl(
ReceiptDetailNoPIIViewRepository receiptDetailNoPIIViewRepository,
ReceiptDetailPIIViewMapper receiptDetailPIIViewMapper) {
this.receiptDetailNoPIIViewRepository = receiptDetailNoPIIViewRepository;
this.receiptDetailPIIViewMapper = receiptDetailPIIViewMapper;
}

@Override
public ReceiptDetailDTO getReceiptDetail(Long receiptId, String operatorExternalUserId) {
ReceiptDetailNoPIIView receiptDetailNoPIIView = receiptDetailNoPIIViewRepository.findReceiptDetailView(receiptId, operatorExternalUserId)
.orElseThrow(() -> new NotFoundException(
"ReceiptDetailNoPIIView having receiptId %d and operatorExternalUserId %s not found".formatted(
receiptId, operatorExternalUserId)));
return receiptDetailPIIViewMapper.mapToReceiptDetailDTO(receiptDetailNoPIIView);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package it.gov.pagopa.pu.debtpositions.service;

import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptWithAdditionalNodeDataDTO;

public interface ReceiptService {
ReceiptDTO createReceipt(ReceiptWithAdditionalNodeDataDTO receiptDTO);
ReceiptDTO getReceiptDetail(Long receiptId);
ReceiptDetailDTO getReceiptDetail(Long receiptId, String operatorExternalUserId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,24 @@

import it.gov.pagopa.pu.debtpositions.dto.Receipt;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import it.gov.pagopa.pu.debtpositions.mapper.ReceiptMapper;
import it.gov.pagopa.pu.debtpositions.repository.ReceiptPIIRepository;
import it.gov.pagopa.pu.debtpositions.repository.view.receipt.ReceiptDetailPIIViewRepository;
import org.springframework.stereotype.Service;

@Service
public class ReceiptServiceImpl implements ReceiptService{

private final ReceiptPIIRepository receiptPIIRepository;
private final ReceiptDetailPIIViewRepository receiptDetailPIIViewRepository;
private final ReceiptMapper receiptMapper;

public ReceiptServiceImpl(ReceiptPIIRepository receiptPIIRepository, ReceiptMapper receiptMapper) {
public ReceiptServiceImpl(ReceiptPIIRepository receiptPIIRepository,
ReceiptDetailPIIViewRepository receiptDetailPIIViewRepository, ReceiptMapper receiptMapper) {
this.receiptPIIRepository = receiptPIIRepository;
this.receiptDetailPIIViewRepository = receiptDetailPIIViewRepository;
this.receiptMapper = receiptMapper;
}

Expand All @@ -27,8 +32,8 @@ public ReceiptDTO createReceipt(ReceiptWithAdditionalNodeDataDTO receiptDTO) {
}

@Override
public ReceiptDTO getReceiptDetail(Long receiptId) {
return receiptPIIRepository.getReceiptDetail(receiptId);
public ReceiptDetailDTO getReceiptDetail(Long receiptId, String operatorExternalUserId) {
return receiptDetailPIIViewRepository.getReceiptDetail(receiptId, operatorExternalUserId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import it.gov.pagopa.pu.debtpositions.service.ReceiptService;
import it.gov.pagopa.pu.debtpositions.util.TestUtils;
Expand Down Expand Up @@ -62,18 +63,20 @@ void whenCreateReceiptThenOk() throws Exception {
void whenGetReceiptDetailThenOk() throws Exception {
//given
Long receiptId = 1L;
ReceiptDTO expectedResponse = podamFactory.manufacturePojo(ReceiptDTO.class);
String operatorExternalUserId = "operatorExternalUserId";
ReceiptDetailDTO expectedResponse = podamFactory.manufacturePojo(ReceiptDetailDTO.class);

Mockito.when(receiptServiceMock.getReceiptDetail(receiptId)).thenReturn(expectedResponse);
Mockito.when(receiptServiceMock.getReceiptDetail(receiptId, operatorExternalUserId)).thenReturn(expectedResponse);

MvcResult result = mockMvc.perform(
MockMvcRequestBuilders.get("/receipts/"+receiptId))
MockMvcRequestBuilders.get("/receipts/"+receiptId)
.param("operatorExternalUserId",operatorExternalUserId))
.andExpect(status().isOk())
.andReturn();

ReceiptDTO response = objectMapper.readValue(result.getResponse().getContentAsString(), ReceiptDTO.class);
ReceiptDetailDTO response = objectMapper.readValue(result.getResponse().getContentAsString(), ReceiptDetailDTO.class);
TestUtils.reflectionEqualsByName(expectedResponse,response);

Mockito.verify(receiptServiceMock).getReceiptDetail(receiptId);
Mockito.verify(receiptServiceMock).getReceiptDetail(receiptId, operatorExternalUserId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package it.gov.pagopa.pu.debtpositions.mapper;

import it.gov.pagopa.pu.debtpositions.citizen.service.PersonalDataService;
import it.gov.pagopa.pu.debtpositions.dto.ReceiptPIIDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.ReceiptDetailDTO;
import it.gov.pagopa.pu.debtpositions.model.view.receipt.ReceiptDetailNoPIIView;
import it.gov.pagopa.pu.debtpositions.util.TestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import uk.co.jemos.podam.api.PodamFactory;

@ExtendWith(MockitoExtension.class)
class ReceiptDetailPIIViewMapperTest {

private final PodamFactory podamFactory = TestUtils.getPodamFactory();

@Mock
private PersonalDataService personalDataServiceMock;

@Spy
private PersonMapper personMapperSpy;

@InjectMocks
private ReceiptDetailPIIViewMapper receiptDetailPIIViewMapper;

@Test
void givenValidReceiptNoPIIWhenMapToReceiptDTOThenReturnReceiptDTO() {
//given
ReceiptDetailNoPIIView receiptDetailNoPIIView = podamFactory.manufacturePojo(ReceiptDetailNoPIIView.class);
ReceiptPIIDTO receiptPIIDTO = podamFactory.manufacturePojo(ReceiptPIIDTO.class);
Mockito.when(personalDataServiceMock.get(receiptDetailNoPIIView.getDebtorPersonalDataId(),ReceiptPIIDTO.class)).thenReturn(receiptPIIDTO);
//when
ReceiptDetailDTO response = receiptDetailPIIViewMapper.mapToReceiptDetailDTO(receiptDetailNoPIIView);

//verify
Assertions.assertNotNull(response);
TestUtils.reflectionEqualsByName(receiptDetailNoPIIView, response, "debtor", "payer");
TestUtils.reflectionEqualsByName(receiptPIIDTO.getDebtor(), response.getDebtor());
TestUtils.checkNotNullFields(response,"payer");
Mockito.verify(personalDataServiceMock).get(receiptDetailNoPIIView.getDebtorPersonalDataId(),ReceiptPIIDTO.class);
Mockito.verify(personMapperSpy).mapToDto(receiptPIIDTO.getDebtor());
}

}
Loading

0 comments on commit 46ae306

Please sign in to comment.