diff --git a/src/main/java/uk/gov/pay/ledger/queue/eventprocessor/RefundEventProcessor.java b/src/main/java/uk/gov/pay/ledger/queue/eventprocessor/RefundEventProcessor.java index f3269e6ff..104740054 100644 --- a/src/main/java/uk/gov/pay/ledger/queue/eventprocessor/RefundEventProcessor.java +++ b/src/main/java/uk/gov/pay/ledger/queue/eventprocessor/RefundEventProcessor.java @@ -8,9 +8,9 @@ import uk.gov.pay.ledger.transaction.entity.TransactionEntity; import uk.gov.pay.ledger.transaction.service.TransactionService; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import static java.util.stream.Collectors.toMap; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -31,6 +31,7 @@ public RefundEventProcessor(EventService eventService, TransactionService transa @Override public void process(Event event) { EventDigest refundEventDigest = eventService.getEventDigestForResource(event); + Optional mayBePaymentEventDigest = Optional.empty(); /** * Apply shared refund payment attributes to the refund digest @@ -43,24 +44,35 @@ public void process(Event event) { * for the digest can be removed. */ if (isNotBlank(refundEventDigest.getParentResourceExternalId())) { - Map fieldsFromPayment = getFieldsFromOriginalPayment(refundEventDigest.getParentResourceExternalId()); - refundEventDigest.getEventPayload().putAll(fieldsFromPayment); + mayBePaymentEventDigest = getPaymentEventDigest(refundEventDigest.getParentResourceExternalId()); + mayBePaymentEventDigest.ifPresent(paymentEventDigest -> { + Map fieldsFromPayment = getPaymentFieldsToProjectOnToRefund(paymentEventDigest); + refundEventDigest.getEventPayload().put("payment_details", fieldsFromPayment); + }); } - transactionService.upsertTransactionFor(refundEventDigest); + TransactionEntity refundTransactionEntity = transactionEntityFactory.create(refundEventDigest); + + mayBePaymentEventDigest.ifPresent(paymentEventDigest -> { + TransactionEntity paymentTransactionEntity = transactionEntityFactory.create(paymentEventDigest); + refundTransactionEntity.setEntityFieldsFromOriginalPayment(paymentTransactionEntity); + }); + + transactionService.upsertTransaction(refundTransactionEntity); } - private Map getFieldsFromOriginalPayment(String paymentExternalId) { + private Optional getPaymentEventDigest(String paymentExternalId) { EventDigest paymentEventDigest = null; - List paymentsFieldsToCopyToRefunds = List.of("cardholder_name", "email", "description", - "card_brand", "last_digits_card_number", "first_digits_card_number", "reference", - "card_brand_label", "expiry_date", "card_type", "wallet_type"); - try { paymentEventDigest = eventService.getEventDigestForResource(paymentExternalId); } catch (EmptyEventsException ignored) { // no valid refund projection is possible without payment events, allow upstream to handle this } + return Optional.ofNullable(paymentEventDigest); + } + + private Map getPaymentFieldsToProjectOnToRefund(EventDigest paymentEventDigest) { + List paymentsFieldsToCopyToRefunds = List.of("card_brand_label", "expiry_date", "card_type", "wallet_type"); var paymentPayloadIsEmpty = paymentEventDigest == null || paymentEventDigest.getEventPayload() == null; diff --git a/src/main/java/uk/gov/pay/ledger/transaction/entity/TransactionEntity.java b/src/main/java/uk/gov/pay/ledger/transaction/entity/TransactionEntity.java index 03db0af3c..e00b5c216 100644 --- a/src/main/java/uk/gov/pay/ledger/transaction/entity/TransactionEntity.java +++ b/src/main/java/uk/gov/pay/ledger/transaction/entity/TransactionEntity.java @@ -8,6 +8,7 @@ import uk.gov.pay.ledger.transaction.state.TransactionState; import java.time.ZonedDateTime; +import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @@ -228,6 +229,16 @@ public String getGatewayPayoutId() { return gatewayPayoutId; } + public void setEntityFieldsFromOriginalPayment(TransactionEntity paymentTransaction) { + this.cardBrand = paymentTransaction.getCardBrand(); + this.cardholderName = paymentTransaction.getCardholderName(); + this.reference = paymentTransaction.getReference(); + this.firstDigitsCardNumber = paymentTransaction.getFirstDigitsCardNumber(); + this.lastDigitsCardNumber = paymentTransaction.getLastDigitsCardNumber(); + this.description = paymentTransaction.getDescription(); + this.email = paymentTransaction.email; + } + public static class Builder { private Long fee; private Long id; diff --git a/src/main/java/uk/gov/pay/ledger/transaction/service/TransactionService.java b/src/main/java/uk/gov/pay/ledger/transaction/service/TransactionService.java index 256325591..5d398095c 100644 --- a/src/main/java/uk/gov/pay/ledger/transaction/service/TransactionService.java +++ b/src/main/java/uk/gov/pay/ledger/transaction/service/TransactionService.java @@ -163,6 +163,10 @@ public void upsertTransactionFor(EventDigest eventDigest) { transactionDao.upsert(transaction); } + public void upsertTransaction(TransactionEntity transaction) { + transactionDao.upsert(transaction); + } + public TransactionEventResponse findTransactionEvents(String externalId, String gatewayAccountId, boolean includeAllEvents, int statusVersion) { Map transactionEntityMap = getTransactionsAsMap(externalId, gatewayAccountId); @@ -180,8 +184,7 @@ public TransactionEventResponse findTransactionEvents(String externalId, String } } - public Optional findByGatewayTransactionId(String gatewayTransactionId, String paymentProvider - ) { + public Optional findByGatewayTransactionId(String gatewayTransactionId, String paymentProvider) { TransactionSearchParams searchParams = new TransactionSearchParams(); searchParams.setGatewayTransactionId(gatewayTransactionId); searchParams.setTransactionType(PAYMENT); diff --git a/src/test/java/uk/gov/pay/ledger/queue/EventDigestHandlerTest.java b/src/test/java/uk/gov/pay/ledger/queue/EventDigestHandlerTest.java index dbae02647..49583cdff 100644 --- a/src/test/java/uk/gov/pay/ledger/queue/EventDigestHandlerTest.java +++ b/src/test/java/uk/gov/pay/ledger/queue/EventDigestHandlerTest.java @@ -18,6 +18,7 @@ import uk.gov.pay.ledger.event.model.TransactionEntityFactory; import uk.gov.pay.ledger.event.service.EventService; import uk.gov.pay.ledger.payout.service.PayoutService; +import uk.gov.pay.ledger.transaction.entity.TransactionEntity; import uk.gov.pay.ledger.transaction.service.TransactionMetadataService; import uk.gov.pay.ledger.transaction.service.TransactionService; @@ -85,7 +86,7 @@ public void shouldUpsertTransactionIfResourceTypeIsRefund() { eventDigestHandler.processEvent(event); verify(eventService).getEventDigestForResource(event); - verify(transactionService).upsertTransactionFor(any(EventDigest.class)); + verify(transactionService).upsertTransaction(any(TransactionEntity.class)); } @Test diff --git a/src/test/java/uk/gov/pay/ledger/queue/QueueMessageReceiverIT.java b/src/test/java/uk/gov/pay/ledger/queue/QueueMessageReceiverIT.java index ed0a58a53..094260858 100644 --- a/src/test/java/uk/gov/pay/ledger/queue/QueueMessageReceiverIT.java +++ b/src/test/java/uk/gov/pay/ledger/queue/QueueMessageReceiverIT.java @@ -163,10 +163,12 @@ public void shouldHandleRefundEvent() throws InterruptedException { assertThat(refund.getLastDigitsCardNumber(), is("4242")); assertThat(refund.getFirstDigitsCardNumber(), is("424242")); assertThat(refund.getReference(), is("aref")); - Map transactionDetails = new Gson().fromJson(refund.getTransactionDetails(), Map.class); - assertThat(transactionDetails.get("reference"), is("aref")); - assertThat(transactionDetails.get("expiry_date"), is("11/21")); - assertThat(transactionDetails.get("card_type"), is("DEBIT")); + Map transactionDetails = new Gson().fromJson(refund.getTransactionDetails(), Map.class); + Map paymentDetails = (Map) transactionDetails.get("payment_details"); + + assertThat(paymentDetails.get("card_brand_label"), is("Visa")); + assertThat(paymentDetails.get("expiry_date"), is("11/21")); + assertThat(paymentDetails.get("card_type"), is("DEBIT")); } @Test diff --git a/src/test/java/uk/gov/pay/ledger/util/fixture/QueuePaymentEventFixture.java b/src/test/java/uk/gov/pay/ledger/util/fixture/QueuePaymentEventFixture.java index d131bc85c..aecea703a 100644 --- a/src/test/java/uk/gov/pay/ledger/util/fixture/QueuePaymentEventFixture.java +++ b/src/test/java/uk/gov/pay/ledger/util/fixture/QueuePaymentEventFixture.java @@ -135,6 +135,7 @@ public QueuePaymentEventFixture withDefaultEventDataForEventType(String eventTyp .put("address_country", "GB") .put("card_type", "DEBIT") .put("card_brand", "visa") + .put("card_brand_label", "Visa") .put("gateway_transaction_id", gatewayAccountId) .put("corporate_surcharge", 5) .put("total_amount", 1005)