Skip to content

Commit b57b5ff

Browse files
CIV-3679 GA ways to pay api calls (#23)
* CIV-3679 GA ways to pay api calls Include all the new ways to pay api calls for GA - service-request - service request pba payment * CIV-3679 Rename Class to specify DTO * CIV-3679 Add PBA service request response class * CIV-3679 Refactor PBA service response
1 parent d2c59ed commit b57b5ff

8 files changed

Lines changed: 256 additions & 0 deletions

File tree

src/main/java/uk/gov/hmcts/reform/payments/client/PaymentsApi.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
import uk.gov.hmcts.reform.payments.client.health.InternalHealth;
1111
import uk.gov.hmcts.reform.payments.client.models.PaymentDto;
1212
import uk.gov.hmcts.reform.payments.request.CardPaymentRequest;
13+
import uk.gov.hmcts.reform.payments.request.CreateServiceRequestDTO;
1314
import uk.gov.hmcts.reform.payments.request.CreditAccountPaymentRequest;
15+
import uk.gov.hmcts.reform.payments.request.PBAServiceRequestDTO;
16+
import uk.gov.hmcts.reform.payments.response.PBAServiceRequestResponse;
17+
import uk.gov.hmcts.reform.payments.response.PaymentServiceResponse;
1418

1519
@FeignClient(name = "payments-api", url = "${payments.api.url}", configuration = PaymentClientConfiguration.class)
1620
public interface PaymentsApi {
@@ -46,4 +50,19 @@ void cancelCardPayment(
4650
@RequestHeader("Authorization") String authorization,
4751
@RequestHeader("ServiceAuthorization") String serviceAuthorization
4852
);
53+
54+
@PostMapping(value = "/service-request", consumes = "application/json")
55+
PaymentServiceResponse createServiceRequest(
56+
@RequestHeader("Authorization") String authorization,
57+
@RequestHeader("ServiceAuthorization") String serviceAuthorization,
58+
@RequestBody CreateServiceRequestDTO paymentRequest
59+
);
60+
61+
@PostMapping(value = "/service-request/{service-request-reference}/pba-payments", consumes = "application/json")
62+
PBAServiceRequestResponse createPbaPayment(
63+
@PathVariable("service-request-reference") String serviceReqReference,
64+
@RequestHeader("Authorization") String authorization,
65+
@RequestHeader("ServiceAuthorization") String serviceAuthorization,
66+
@RequestBody PBAServiceRequestDTO paymentRequest
67+
);
4968
}

src/main/java/uk/gov/hmcts/reform/payments/client/PaymentsClient.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
import uk.gov.hmcts.reform.authorisation.generators.AuthTokenGenerator;
77
import uk.gov.hmcts.reform.payments.client.models.PaymentDto;
88
import uk.gov.hmcts.reform.payments.request.CardPaymentRequest;
9+
import uk.gov.hmcts.reform.payments.request.CreateServiceRequestDTO;
910
import uk.gov.hmcts.reform.payments.request.CreditAccountPaymentRequest;
11+
import uk.gov.hmcts.reform.payments.request.PBAServiceRequestDTO;
12+
import uk.gov.hmcts.reform.payments.response.PBAServiceRequestResponse;
13+
import uk.gov.hmcts.reform.payments.response.PaymentServiceResponse;
1014

1115
@Service
1216
@ConditionalOnProperty(prefix = "payments", name = "api.url")
@@ -54,4 +58,22 @@ public void cancelCardPayment(String authorisation, String paymentReference) {
5458
authTokenGenerator.generate()
5559
);
5660
}
61+
62+
public PaymentServiceResponse createServiceRequest(String authorisation, CreateServiceRequestDTO paymentRequest) {
63+
return paymentsApi.createServiceRequest(
64+
authorisation,
65+
authTokenGenerator.generate(),
66+
paymentRequest
67+
);
68+
}
69+
70+
public PBAServiceRequestResponse createPbaPayment(String serviceReqReference, String authorisation,
71+
PBAServiceRequestDTO paymentRequest) {
72+
return paymentsApi.createPbaPayment(
73+
serviceReqReference,
74+
authorisation,
75+
authTokenGenerator.generate(),
76+
paymentRequest
77+
);
78+
}
5779
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package uk.gov.hmcts.reform.payments.client.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class CasePaymentRequestDto {
16+
17+
@JsonProperty("action")
18+
private String action;
19+
@JsonProperty("responsible_party")
20+
private String responsibleParty;
21+
22+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package uk.gov.hmcts.reform.payments.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import uk.gov.hmcts.reform.payments.client.models.CasePaymentRequestDto;
9+
import uk.gov.hmcts.reform.payments.client.models.FeeDto;
10+
11+
@Data
12+
@Builder
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class CreateServiceRequestDTO {
16+
17+
@JsonProperty("call_back_url")
18+
private String callBackUrl;
19+
@JsonProperty("case_payment_request")
20+
private CasePaymentRequestDto casePaymentRequest;
21+
@JsonProperty("case_reference")
22+
private String caseReference;
23+
@JsonProperty("ccd_case_number")
24+
private String ccdCaseNumber;
25+
@JsonProperty("fees")
26+
private FeeDto[] fees;
27+
@JsonProperty("organisation_id")
28+
private String organisationId;
29+
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package uk.gov.hmcts.reform.payments.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
9+
import java.math.BigDecimal;
10+
11+
@Data
12+
@Builder
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class PBAServiceRequestDTO {
16+
17+
@JsonProperty("account_number")
18+
private String accountNumber;
19+
@JsonProperty("amount")
20+
private BigDecimal amount;
21+
@Builder.Default
22+
@JsonProperty("currency")
23+
private String currency = "GBP";
24+
@JsonProperty("customer_reference")
25+
private String customerReference;
26+
@JsonProperty("idempotency_key")
27+
private String idempotencyKey;
28+
@JsonProperty("organisationName")
29+
private String organisationName;
30+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package uk.gov.hmcts.reform.payments.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class PBAServiceRequestResponse {
16+
17+
@JsonProperty("payment_reference")
18+
private String paymentReference;
19+
20+
@JsonProperty("status")
21+
private String status;
22+
23+
@JsonProperty("date_created")
24+
private String dateCreated;
25+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package uk.gov.hmcts.reform.payments.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class PaymentServiceResponse {
16+
17+
@JsonProperty("service_request_reference")
18+
private String serviceRequestReference;
19+
20+
}

src/test/java/uk/gov/hmcts/reform/payments/client/PaymentsClientTest.java

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@
88
import org.springframework.http.HttpStatus;
99
import org.springframework.web.client.HttpClientErrorException;
1010
import uk.gov.hmcts.reform.authorisation.generators.AuthTokenGenerator;
11+
import uk.gov.hmcts.reform.payments.client.models.CasePaymentRequestDto;
12+
import uk.gov.hmcts.reform.payments.client.models.FeeDto;
1113
import uk.gov.hmcts.reform.payments.request.CardPaymentRequest;
14+
import uk.gov.hmcts.reform.payments.request.CreateServiceRequestDTO;
1215
import uk.gov.hmcts.reform.payments.request.CreditAccountPaymentRequest;
16+
import uk.gov.hmcts.reform.payments.request.PBAServiceRequestDTO;
1317

1418
import java.math.BigDecimal;
1519

20+
import static java.math.BigDecimal.ROUND_UNNECESSARY;
1621
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1722
import static org.mockito.ArgumentMatchers.anyString;
1823
import static org.mockito.Mockito.doThrow;
@@ -21,6 +26,22 @@
2126

2227
@ExtendWith(MockitoExtension.class)
2328
class PaymentsClientTest {
29+
30+
private static final BigDecimal TEN_2_DP = BigDecimal.TEN.setScale(2, ROUND_UNNECESSARY);
31+
32+
private static final String CCD_CASE_NUMBER = "UNKNOWN";
33+
private static final BigDecimal FEE_AMOUNT = TEN_2_DP;
34+
private static final String FEE_CODE = "FEE0234";
35+
private static final String FEE_DESCRIPTION = "A sample fee";
36+
private static final String FEE_REFERENCE = "reference";
37+
private static final String FEE_VERSION = "version";
38+
private static final Integer FEE_VOLUME = 1;
39+
private static final String JURISDICTION_1 = "jurisdiction 1";
40+
private static final String JURISDICTION_2 = "jurisdiction 2";
41+
private static final String MEMO_LINE = "Memo line";
42+
private static final String NATURAL_ACCOUNT_CODE = "natural account code";
43+
private static final BigDecimal NET_FEE_AMOUNT = TEN_2_DP;
44+
2445
private static final CardPaymentRequest CARD_PAYMENT_REQUEST = CardPaymentRequest.builder()
2546
.amount(BigDecimal.valueOf(999.99))
2647
.caseReference("case reference")
@@ -44,6 +65,39 @@ class PaymentsClientTest {
4465
.siteId("site ID")
4566
.build();
4667

68+
private static final CreateServiceRequestDTO SERVICE_REQUEST = CreateServiceRequestDTO.builder()
69+
.callBackUrl("callbackurl")
70+
.casePaymentRequest(CasePaymentRequestDto.builder().action("action").responsibleParty("party").build())
71+
.caseReference("case reference")
72+
.ccdCaseNumber("ccd case number")
73+
.fees(new FeeDto[]{
74+
FeeDto.builder()
75+
.id(1)
76+
.calculatedAmount(FEE_AMOUNT)
77+
.ccdCaseNumber(CCD_CASE_NUMBER)
78+
.code(FEE_CODE)
79+
.description(FEE_DESCRIPTION)
80+
.jurisdiction1(JURISDICTION_1)
81+
.jurisdiction2(JURISDICTION_2)
82+
.memoLine(MEMO_LINE)
83+
.naturalAccountCode(NATURAL_ACCOUNT_CODE)
84+
.netAmount(NET_FEE_AMOUNT)
85+
.reference(FEE_REFERENCE)
86+
.version(FEE_VERSION)
87+
.volume(FEE_VOLUME)
88+
.build()
89+
})
90+
.organisationId("organisation id")
91+
.build();
92+
93+
private static final PBAServiceRequestDTO SERVICE_REQUEST_PAYMENT = PBAServiceRequestDTO.builder()
94+
.accountNumber("acc number")
95+
.amount(FEE_AMOUNT)
96+
.currency("currency")
97+
.customerReference("customer reference")
98+
.idempotencyKey("key")
99+
.organisationName("organisation name").build();
100+
47101
@Mock
48102
private PaymentsApi paymentsApi;
49103

@@ -58,6 +112,23 @@ void setUp() {
58112
when(authTokenGenerator.generate()).thenReturn("auth token");
59113
}
60114

115+
@Test
116+
void createServiceRequestShouldInvokePaymentsApi() {
117+
client.createServiceRequest("authorisation", SERVICE_REQUEST);
118+
119+
verify(paymentsApi).createServiceRequest("authorisation", "auth token", SERVICE_REQUEST);
120+
}
121+
122+
@Test
123+
void createServiceRequestShouldPropagateExceptions() {
124+
when(authTokenGenerator.generate())
125+
.thenThrow(new RuntimeException("expected exception for create payment"));
126+
127+
assertThatThrownBy(() -> client.createServiceRequest("authorisation", SERVICE_REQUEST))
128+
.isInstanceOf(RuntimeException.class)
129+
.hasMessage("expected exception for create payment");
130+
}
131+
61132
@Test
62133
void createCreditAccountPaymentShouldInvokePaymentsApi() {
63134
client.createCreditAccountPayment("authorisation", CREDIT_ACCOUNT_PAYMENT);
@@ -127,4 +198,21 @@ void cancelCardPaymentShouldPropagateExceptions() {
127198
.isInstanceOf(HttpClientErrorException.class)
128199
.hasMessage("404 Payment Not found");
129200
}
201+
202+
@Test
203+
void createPbaPaymentShouldInvokePaymentsApi() {
204+
client.createPbaPayment("reference", "authorisation", SERVICE_REQUEST_PAYMENT);
205+
206+
verify(paymentsApi).createPbaPayment("reference", "authorisation", "auth token", SERVICE_REQUEST_PAYMENT);
207+
}
208+
209+
@Test
210+
void createPbaPaymentShouldPropagateExceptions() {
211+
when(authTokenGenerator.generate())
212+
.thenThrow(new RuntimeException("expected exception for create payment"));
213+
214+
assertThatThrownBy(() -> client.createPbaPayment("reference", "authorisation", SERVICE_REQUEST_PAYMENT))
215+
.isInstanceOf(RuntimeException.class)
216+
.hasMessage("expected exception for create payment");
217+
}
130218
}

0 commit comments

Comments
 (0)