Skip to content

Commit

Permalink
feat: P4ADEV-1990 [export-classifications] ClassifyIUV ​​refactory fo…
Browse files Browse the repository at this point in the history
…r Transfer to add export filter fields (#153)
  • Loading branch information
macacia authored Mar 7, 2025
1 parent d7e06bc commit 877ca3d
Show file tree
Hide file tree
Showing 10 changed files with 138 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package it.gov.pagopa.payhub.activities.connector.debtposition;

import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptWithAdditionalNodeDataDTO;

/**
* This interface provides methods that manage Receipt of debt positions within the related microservice
*/
public interface ReceiptService {
ReceiptDTO createReceipt(ReceiptWithAdditionalNodeDataDTO receipt);
ReceiptNoPII getByTransferId(Long transferId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import it.gov.pagopa.payhub.activities.connector.auth.AuthnService;
import it.gov.pagopa.payhub.activities.connector.debtposition.client.ReceiptClient;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
Expand All @@ -22,4 +23,9 @@ public ReceiptServiceImpl(AuthnService authnService, ReceiptClient receiptClient
public ReceiptDTO createReceipt(ReceiptWithAdditionalNodeDataDTO receipt) {
return receiptClient.createReceipt(authnService.getAccessToken(), receipt);
}

@Override
public ReceiptNoPII getByTransferId(Long transferId) {
return receiptClient.getByTransferId(authnService.getAccessToken(), transferId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@

import it.gov.pagopa.payhub.activities.connector.debtposition.config.DebtPositionApisHolder;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpClientErrorException;

import java.util.Optional;

@Lazy
@Slf4j
@Service
public class ReceiptClient {
private final DebtPositionApisHolder debtPositionApisHolder;
Expand All @@ -18,4 +24,14 @@ public ReceiptClient(DebtPositionApisHolder debtPositionApisHolder) {
public ReceiptDTO createReceipt(String accessToken, ReceiptWithAdditionalNodeDataDTO receipt) {
return debtPositionApisHolder.getReceiptApi(accessToken).createReceipt(receipt);
}

public ReceiptNoPII getByTransferId(String accessToken, Long transferId) {
try {
return debtPositionApisHolder.getReceiptNoPiiSearchControllerApi(accessToken)
.crudReceiptsGetByTransferId(transferId);
} catch (HttpClientErrorException.NotFound e) {
log.info("ReceiptDTO not found for TransferId: {}", transferId);
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ public class DebtPositionApisHolder {
private final DebtPositionApi debtPositionApi;
private final ReceiptApi receiptApi;
private final DebtPositionTypeOrgApi debtPositionTypeOrgApi;
private final ReceiptNoPiiSearchControllerApi receiptNoPiiSearchControllerApi;
/** it will store the actual accessToken and mappedExternalUserId */
private final ThreadLocal<Pair<String, String>> authContextHolder = new ThreadLocal<>();

public DebtPositionApisHolder(
DebtPositionApiClientConfig clientConfig,
RestTemplateBuilder restTemplateBuilder
) {

RestTemplate restTemplate = restTemplateBuilder.build();
ApiClientExt apiClient = new ApiClientExt(restTemplate);
apiClient.setBasePath(clientConfig.getBaseUrl());
Expand All @@ -44,6 +44,7 @@ public DebtPositionApisHolder(
this.transferApi = new TransferApi(apiClient);
this.receiptApi = new ReceiptApi(apiClient);
this.debtPositionTypeOrgApi = new DebtPositionTypeOrgApi(apiClient);
this.receiptNoPiiSearchControllerApi = new ReceiptNoPiiSearchControllerApi(apiClient);
}

@PreDestroy
Expand Down Expand Up @@ -79,6 +80,9 @@ public DebtPositionTypeOrgApi getDebtPositionTypeOrgApi(String accessToken) {
return getApi(accessToken, null, debtPositionTypeOrgApi);
}

public ReceiptNoPiiSearchControllerApi getReceiptNoPiiSearchControllerApi(String accessToken) {
return getApi(accessToken, null, receiptNoPiiSearchControllerApi);
}

private <T extends BaseApi> T getApi(String accessToken, String mappedExternalUserId, T api) {
authContextHolder.set(Pair.of(accessToken, mappedExternalUserId));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package it.gov.pagopa.payhub.activities.service.classifications;

import it.gov.pagopa.payhub.activities.connector.classification.ClassificationService;
import it.gov.pagopa.payhub.activities.connector.debtposition.ReceiptService;
import it.gov.pagopa.payhub.activities.dto.classifications.TransferSemanticKeyDTO;
import it.gov.pagopa.pu.classification.dto.generated.Classification;
import it.gov.pagopa.pu.classification.dto.generated.PaymentsReporting;
import it.gov.pagopa.pu.classification.dto.generated.Treasury;
import it.gov.pagopa.payhub.activities.enums.ClassificationsEnum;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.Transfer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

Expand All @@ -19,9 +23,11 @@
@Service
public class TransferClassificationStoreService {
private final ClassificationService classificationService;
private final ReceiptService receiptService;

public TransferClassificationStoreService(ClassificationService classificationService) {
public TransferClassificationStoreService(ClassificationService classificationService, ReceiptService receiptService) {
this.classificationService = classificationService;
this.receiptService = receiptService;
}

/**
Expand All @@ -44,23 +50,39 @@ public Integer saveClassifications(
PaymentsReporting paymentsReportingDTO,
Treasury treasuryDTO,
List<ClassificationsEnum> classifications) {
log.debug("retrieving Receipt from Transfer ID {}", transferDTO.getTransferId());
Optional<ReceiptNoPII> optionalReceipt = Optional.ofNullable(receiptService.getByTransferId(transferDTO.getTransferId()));

log.info("Saving classifications {} for semantic key organization id: {} and iuv: {} and iur {} and transfer index: {}",
String.join(", ", classifications.stream().map(String::valueOf).toList()),
transferSemanticKeyDTO.getOrgId(), transferSemanticKeyDTO.getIuv(), transferSemanticKeyDTO.getIur(), transferSemanticKeyDTO.getTransferIndex());

Optional<PaymentsReporting> optionalPaymentsReporting = Optional.ofNullable(paymentsReportingDTO);
Optional<Treasury> optionalTreasury = Optional.ofNullable(treasuryDTO);
Optional<Transfer> optionalTransfer = Optional.ofNullable(transferDTO);
List<Classification> dtoList = classifications.stream()
.map(classification -> (Classification)Classification.builder()
.map(classification -> (Classification) Classification.builder()
.organizationId(transferSemanticKeyDTO.getOrgId())
.transferId(Optional.ofNullable(transferDTO).map(Transfer::getTransferId).orElse(null))
.transferId(optionalTransfer.map(Transfer::getTransferId).orElse(null))
.paymentsReportingId(optionalPaymentsReporting.map(PaymentsReporting::getPaymentsReportingId).orElse(null))
.treasuryId(Optional.ofNullable(treasuryDTO).map(Treasury::getTreasuryId).orElse(null))
.treasuryId(optionalTreasury.map(Treasury::getTreasuryId).orElse(null))
.iuf(optionalPaymentsReporting.map(PaymentsReporting::getIuf).orElse(null))
.iuv(transferSemanticKeyDTO.getIuv())
.iur(transferSemanticKeyDTO.getIur())
.transferIndex(transferSemanticKeyDTO.getTransferIndex())
.label(classification.name())
.lastClassificationDate(LocalDate.now())
.payDate(optionalPaymentsReporting.map(PaymentsReporting::getPayDate).orElse(null))
.paymentDateTime(optionalReceipt.map(ReceiptNoPII::getPaymentDateTime).orElse(null))
.regulationDate(optionalPaymentsReporting.map(PaymentsReporting::getRegulationDate).orElse(null))
.billDate(optionalTreasury.map(Treasury::getBillDate).orElse(null))
.regionValueDate(optionalTreasury.map(Treasury::getRegionValueDate).orElse(null))
.pspCompanyName(optionalReceipt.map(ReceiptNoPII::getPspCompanyName).orElse(null))
.pspLastName(optionalTreasury.map(Treasury::getPspLastName).orElse(null))
.regulationUniqueIdentifier(optionalPaymentsReporting.map(PaymentsReporting::getRegulationUniqueIdentifier).orElse(null))
.accountRegistryCode(optionalTreasury.map(Treasury::getAccountRegistryCode).orElse(null))
.billAmountCents(optionalTreasury.map(Treasury::getBillAmountCents).orElse(null))
.remittanceInformation(optionalTransfer.map(Transfer::getRemittanceInformation).orElse(null))
.build())
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import it.gov.pagopa.payhub.activities.connector.auth.AuthnService;
import it.gov.pagopa.payhub.activities.connector.debtposition.client.ReceiptClient;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.Mockito.*;

Expand Down Expand Up @@ -41,4 +43,22 @@ void whenCreateReceiptThenInvokeClient() {
verify(receiptClientMock,times(1)).createReceipt(accessToken, receiptWithAdditionalNodeDataDTO);
}

@Test
void whenGetByTransferIdThenInvokeClient() {
// Given
String accessToken = "ACCESSTOKEN";
ReceiptNoPII expected = mock(ReceiptNoPII.class);
Long transferId = 1L;

when(authnServiceMock.getAccessToken()).thenReturn(accessToken);
when(receiptClientMock.getByTransferId(accessToken, transferId)).thenReturn(expected);

// When
ReceiptNoPII result = receiptService.getByTransferId(transferId);

// Then
assertEquals(expected, result);
verify(authnServiceMock, times(1)).getAccessToken();
verify(receiptClientMock, times(1)).getByTransferId(accessToken, transferId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import it.gov.pagopa.payhub.activities.connector.debtposition.config.DebtPositionApisHolder;
import it.gov.pagopa.pu.debtposition.client.generated.ReceiptApi;
import it.gov.pagopa.pu.debtposition.client.generated.ReceiptNoPiiSearchControllerApi;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptDTO;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptWithAdditionalNodeDataDTO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
Expand All @@ -19,6 +21,8 @@ class ReceiptClientTest {
private DebtPositionApisHolder debtPositionApisHolderMock;
@Mock
private ReceiptApi receiptApiMock;
@Mock
private ReceiptNoPiiSearchControllerApi receiptNoPiiSearchControllerApiMock;

@InjectMocks
private ReceiptClient receiptClient;
Expand All @@ -41,4 +45,23 @@ void whenNotifyReportedTransferIdThenInvokeWithAccessToken() {
verify(debtPositionApisHolderMock, times(1)).getReceiptApi(accessToken);
verify(receiptApiMock, times(1)).createReceipt(receiptWithAdditionalNodeDataDTO);
}

@Test
void whenGetByTransferIdThenInvokeWithAccessToken() {
// Given
String accessToken = "ACCESSTOKEN";
Long transferId = 1L;
ReceiptNoPII expectedResult = mock(ReceiptNoPII.class);

when(debtPositionApisHolderMock.getReceiptNoPiiSearchControllerApi(accessToken)).thenReturn(receiptNoPiiSearchControllerApiMock);
when(receiptNoPiiSearchControllerApiMock.crudReceiptsGetByTransferId(transferId)).thenReturn(expectedResult);

// When
ReceiptNoPII result = receiptClient.getByTransferId(accessToken, transferId);
// Then
Assertions.assertEquals(expectedResult, result);

verify(debtPositionApisHolderMock, times(1)).getReceiptNoPiiSearchControllerApi(accessToken);
verify(receiptNoPiiSearchControllerApiMock, times(1)).crudReceiptsGetByTransferId(transferId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,13 @@ void whenGetDebtPositionTypeOrgApiThenAuthenticationShouldBeSetInThreadSafeMode(
IONotificationDTO.class,
debtPositionApisHolder::unload);
}

@Test
void whenGetReceiptNoPiiSearchControllerApiThenAuthenticationShouldBeSetInThreadSafeMode() throws InterruptedException {
assertAuthenticationShouldBeSetInThreadSafeMode(
accessToken -> debtPositionApisHolder.getReceiptNoPiiSearchControllerApi(accessToken)
.crudReceiptsGetByTransferId(1L),
ReceiptNoPII.class,
debtPositionApisHolder::unload);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package it.gov.pagopa.payhub.activities.service.classifications;

import it.gov.pagopa.payhub.activities.connector.classification.ClassificationService;
import it.gov.pagopa.payhub.activities.connector.debtposition.ReceiptService;
import it.gov.pagopa.payhub.activities.dto.classifications.TransferSemanticKeyDTO;
import it.gov.pagopa.pu.classification.dto.generated.Classification;
import it.gov.pagopa.pu.classification.dto.generated.PaymentsReporting;
Expand All @@ -9,16 +10,20 @@
import it.gov.pagopa.payhub.activities.util.faker.PaymentsReportingFaker;
import it.gov.pagopa.payhub.activities.util.faker.TransferFaker;
import it.gov.pagopa.payhub.activities.util.faker.TreasuryFaker;
import it.gov.pagopa.pu.debtposition.dto.generated.ReceiptNoPII;
import it.gov.pagopa.pu.debtposition.dto.generated.Transfer;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.time.LocalDate;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
Expand All @@ -29,12 +34,14 @@ class TransferClassificationStoreServiceTest {

@Mock
private ClassificationService classificationServiceMock;
@Mock
private ReceiptService receiptServiceMock;

private TransferClassificationStoreService service;

@BeforeEach
void setUp() {
service = new TransferClassificationStoreService(classificationServiceMock);
service = new TransferClassificationStoreService(classificationServiceMock, receiptServiceMock);
}

@Test
Expand All @@ -47,8 +54,12 @@ void whenSaveAllThenReturnSavedList() {
.iur("IUR")
.transferIndex(1)
.build();
List<Classification> dtoList = classifications.stream()
.map(classification -> (Classification)Classification.builder()
ReceiptNoPII receiptNoPII = mock(ReceiptNoPII.class);

when(receiptServiceMock.getByTransferId(transferDTO.getTransferId())).thenReturn(receiptNoPII);

List<Classification> dtoList = List.of(
Classification.builder()
.organizationId(transferSemanticKeyDTO.getOrgId())
.transferId(transferDTO.getTransferId())
.paymentsReportingId(paymentsReportingDTO.getPaymentsReportingId())
Expand All @@ -57,12 +68,25 @@ void whenSaveAllThenReturnSavedList() {
.iuv(transferSemanticKeyDTO.getIuv())
.iur(transferSemanticKeyDTO.getIur())
.transferIndex(transferSemanticKeyDTO.getTransferIndex())
.label(classification.name())
.build())
.toList();
.label(classifications.getFirst().name())
.lastClassificationDate(LocalDate.now())
.payDate(paymentsReportingDTO.getPayDate())
.paymentDateTime(receiptNoPII.getPaymentDateTime())
.regulationDate(paymentsReportingDTO.getRegulationDate())
.billDate(treasuryDTO.getBillDate())
.regionValueDate(treasuryDTO.getRegionValueDate())
.pspCompanyName(receiptNoPII.getPspCompanyName())
.pspLastName(treasuryDTO.getPspLastName())
.regulationUniqueIdentifier(paymentsReportingDTO.getRegulationUniqueIdentifier())
.accountRegistryCode(treasuryDTO.getAccountRegistryCode())
.billAmountCents(treasuryDTO.getBillAmountCents())
.remittanceInformation(transferDTO.getRemittanceInformation())
.build());

when(classificationServiceMock.saveAll(dtoList)).thenReturn(dtoList.size());

// Act & Assert
assertEquals(classifications.size(), dtoList.size());
assertDoesNotThrow(() ->
service.saveClassifications(transferSemanticKeyDTO, transferDTO, paymentsReportingDTO, treasuryDTO, classifications));
}
Expand Down
2 changes: 1 addition & 1 deletion version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.67.0
P4ADEV-1990-SNAPSHOT

0 comments on commit 877ca3d

Please sign in to comment.