From c72cf66de81e7deec67c3ded6c8994a0a3c87d72 Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Mon, 9 Jun 2025 17:33:03 +0200 Subject: [PATCH 1/8] Maps dispute challenge documents into response --- .../com/global/api/entities/Transaction.java | 1 + .../com/global/api/mapping/GpApiMapping.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/com/global/api/entities/Transaction.java b/src/main/java/com/global/api/entities/Transaction.java index 49fd315..6859528 100644 --- a/src/main/java/com/global/api/entities/Transaction.java +++ b/src/main/java/com/global/api/entities/Transaction.java @@ -123,6 +123,7 @@ public class Transaction { private TokenData tokenData; @Getter @Setter private InstallmentData installmentData; + @Getter @Setter private List disputeDocuments; public Customer getCustomerData() { return customerData; diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index 57b113b..400e0dc 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -52,6 +52,7 @@ public class GpApiMapping { private static final String DOCUMENT_UPLOAD = "DOCUMENT_UPLOAD"; private static final String FILE_CREATE = "FILE_CREATE"; private static final String FILE_SINGLE = "FILE_SINGLE"; + private static final String DISPUTE_CHALLENGE = "CHALLENGE"; public static Transaction mapResponse(String rawResponse) throws GatewayException { Transaction transaction = new Transaction(); @@ -128,6 +129,24 @@ public static Transaction mapResponse(String rawResponse) throws GatewayExceptio case TRANSFER: transaction.setPaymentMethodType(PaymentMethodType.AccountFunds); break; + case DISPUTE_CHALLENGE: + if (json.has("documents")) { + List documents = json.getEnumerator("documents"); + + List disputeDocuments = new ArrayList<>(); + for (JsonDoc document : documents) { + if (document.getString("id") != null) { + DisputeDocument disputeDocument = new DisputeDocument(); + disputeDocument.setId(document.getString("id")); + disputeDocument.setType(document.getString("type") != null ? document.getString("type") : null); + + disputeDocuments.add(disputeDocument); + } + } + + transaction.setDisputeDocuments(disputeDocuments); + } + break; default: break; } From 59a40f9d2b1723339ba2ab257187c06ffdb6d47d Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 10:31:18 +0200 Subject: [PATCH 2/8] Maps discounts into DepositSummary --- .../com/global/api/entities/reporting/DepositSummary.java | 2 ++ src/main/java/com/global/api/mapping/GpApiMapping.java | 6 ++++++ .../java/com/global/api/tests/gpapi/GpApiMappingTest.java | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/global/api/entities/reporting/DepositSummary.java b/src/main/java/com/global/api/entities/reporting/DepositSummary.java index 2c4e30c..1b7a71f 100644 --- a/src/main/java/com/global/api/entities/reporting/DepositSummary.java +++ b/src/main/java/com/global/api/entities/reporting/DepositSummary.java @@ -30,6 +30,8 @@ public class DepositSummary { public int refundsTotalCount; public BigDecimal refundsTotalAmount; public String refundsTotalCurrency; + public int discountsTotalCount; + public BigDecimal discountsTotalAmount; public int chargebackTotalCount; public BigDecimal chargebackTotalAmount; public String chargebackTotalCurrency; diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index 400e0dc..a9295dd 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -765,6 +765,12 @@ public static DepositSummary mapDepositSummary(JsonDoc doc) throws GatewayExcept summary.setRefundsTotalAmount(refunds.getAmount("amount")); } + if(doc.has("discounts")) { + JsonDoc discounts = doc.get("discounts"); + summary.setDiscountsTotalCount(discounts.getInt("count")); + summary.setDiscountsTotalAmount(discounts.getAmount("amount")); + } + if (doc.has("disputes")) { JsonDoc disputes = doc.get("disputes"); diff --git a/src/test/java/com/global/api/tests/gpapi/GpApiMappingTest.java b/src/test/java/com/global/api/tests/gpapi/GpApiMappingTest.java index bbace7d..ebf08a8 100644 --- a/src/test/java/com/global/api/tests/gpapi/GpApiMappingTest.java +++ b/src/test/java/com/global/api/tests/gpapi/GpApiMappingTest.java @@ -137,7 +137,7 @@ public void MapTransactionSummaryTest_FromObject() throws GatewayException { @Test public void MapDepositSummaryTest() throws GatewayException { // Arrange - String rawJson = "{\"id\":\"DEP_2342423423\",\"time_created\":\"2020-11-21\",\"status\":\"FUNDED\",\"funding_type\":\"CREDIT\",\"amount\":\"11400\",\"currency\":\"USD\",\"aggregation_model\":\"H-By Date\",\"bank_transfer\":{\"masked_account_number_last4\":\"XXXXXX9999\",\"bank\":{\"code\":\"XXXXX0001\"}},\"system\":{\"mid\":\"101023947262\",\"hierarchy\":\"055-70-024-011-019\",\"name\":\"XYZ LTD.\",\"dba\":\"XYZ Group\"},\"sales\":{\"count\":4,\"amount\":\"12400\"},\"refunds\":{\"count\":1,\"amount\":\"-1000\"},\"discounts\":{\"count\":0,\"amount\":\"\"},\"tax\":{\"count\":0,\"amount\":\"\"},\"disputes\":{\"chargebacks\":{\"count\":0,\"amount\":\"\"},\"reversals\":{\"count\":0,\"amount\":\"\"}},\"fees\":{\"amount\":\"\"},\"action\":{\"id\":\"ACT_TWdmMMOBZ91iQX1DcvxYermuVJ6E6h\",\"type\":\"DEPOSIT_SINGLE\",\"time_created\":\"2020-11-24T18:43:43.370Z\",\"result_code\":\"SUCCESS\",\"app_id\":\"JF2GQpeCrOivkBGsTRiqkpkdKp67Gxi0\",\"app_name\":\"test_app\"}}"; + String rawJson = "{\"id\":\"DEP_2342423423\",\"time_created\":\"2020-11-21\",\"status\":\"FUNDED\",\"funding_type\":\"CREDIT\",\"amount\":\"11400\",\"currency\":\"USD\",\"aggregation_model\":\"H-By Date\",\"bank_transfer\":{\"masked_account_number_last4\":\"XXXXXX9999\",\"bank\":{\"code\":\"XXXXX0001\"}},\"system\":{\"mid\":\"101023947262\",\"hierarchy\":\"055-70-024-011-019\",\"name\":\"XYZ LTD.\",\"dba\":\"XYZ Group\"},\"sales\":{\"count\":4,\"amount\":\"12400\"},\"refunds\":{\"count\":1,\"amount\":\"-1000\"},\"discounts\":{\"count\":4,\"amount\":\"259\"},\"tax\":{\"count\":0,\"amount\":\"\"},\"disputes\":{\"chargebacks\":{\"count\":0,\"amount\":\"\"},\"reversals\":{\"count\":0,\"amount\":\"\"}},\"fees\":{\"amount\":\"\"},\"action\":{\"id\":\"ACT_TWdmMMOBZ91iQX1DcvxYermuVJ6E6h\",\"type\":\"DEPOSIT_SINGLE\",\"time_created\":\"2020-11-24T18:43:43.370Z\",\"result_code\":\"SUCCESS\",\"app_id\":\"JF2GQpeCrOivkBGsTRiqkpkdKp67Gxi0\",\"app_name\":\"test_app\"}}"; JsonDoc doc = JsonDoc.parse(rawJson); @@ -172,6 +172,12 @@ public void MapDepositSummaryTest() throws GatewayException { assertEquals(refunds.getAmount("amount"), deposit.getRefundsTotalAmount()); } + if(doc.has("discounts")) { + JsonDoc refunds = doc.get("discounts"); + assertEquals((int) refunds.getInt("count"), deposit.getDiscountsTotalCount()); + assertEquals(refunds.getAmount("amount"), deposit.getDiscountsTotalAmount()); + } + if (doc.has("disputes")) { JsonDoc disputes = doc.get("disputes"); if (disputes.has("chargebacks")) { From 0a4de63598ad76119e62981fa2694791a56295b7 Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 10:31:58 +0200 Subject: [PATCH 3/8] Handles provider object in dispute mapping --- .../java/com/global/api/mapping/GpApiMapping.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index a9295dd..3b04a57 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -867,6 +867,20 @@ public static DisputeSummary mapDisputeSummary(JsonDoc doc) throws GatewayExcept summary.setTransactionCardType(card.getString("brand")); summary.setTransactionBrandReference(card.getString("brand_reference")); } + } else if(transaction.has("provider")) { + JsonDoc provider = transaction.get("provider"); + if (provider.has("payment_method")) { + JsonDoc paymentMethod = provider.get("payment_method"); + + if (paymentMethod.has("card")) { + JsonDoc card = paymentMethod.get("card"); + + summary.setTransactionMaskedCardNumber(card.getString("number")); + summary.setTransactionARN(card.getString("arn")); + summary.setTransactionCardType(card.getString("brand")); + summary.setTransactionBrandReference(card.getString("brand_reference")); + } + } } } String timeToRespondBy = doc.getString("time_to_respond_by"); From 91ea3af6d46982f4054e943c3c0f5bdaaca57d29 Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 10:35:23 +0200 Subject: [PATCH 4/8] Adds merchant discount amount into TransactionSummary --- src/main/java/com/global/api/entities/TransactionSummary.java | 1 + src/main/java/com/global/api/mapping/GpApiMapping.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/global/api/entities/TransactionSummary.java b/src/main/java/com/global/api/entities/TransactionSummary.java index 783ccd2..f207c8b 100644 --- a/src/main/java/com/global/api/entities/TransactionSummary.java +++ b/src/main/java/com/global/api/entities/TransactionSummary.java @@ -156,4 +156,5 @@ public class TransactionSummary { private String transactionTime; private Card cardDetails; private InstallmentData installmentData; + private BigDecimal merchantDiscountAmount; } diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index 3b04a57..3c9bb75 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -544,6 +544,10 @@ public static TransactionSummary mapTransactionSummary(JsonDoc doc) throws Gatew summary.setInstallmentData(setInstallmentData(installment)); } + if(doc.has("merchant_discount_amount")) { + summary.setMerchantDiscountAmount(doc.getDecimal("merchant_discount_amount")); + } + summary.setFraudManagementResponse(doc.has("risk_assessment") ? mapFraudManagementReport(doc.get("risk_assessment")) : null); return summary; From a06323325d04e93247a97d7ef3f6dacdacfcb5bb Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 11:07:19 +0200 Subject: [PATCH 5/8] Adds mapping for merchant amount in dispute details --- .../java/com/global/api/entities/reporting/DisputeSummary.java | 1 + src/main/java/com/global/api/mapping/GpApiMapping.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/global/api/entities/reporting/DisputeSummary.java b/src/main/java/com/global/api/entities/reporting/DisputeSummary.java index 06d8dad..ae3759e 100644 --- a/src/main/java/com/global/api/entities/reporting/DisputeSummary.java +++ b/src/main/java/com/global/api/entities/reporting/DisputeSummary.java @@ -20,6 +20,7 @@ public class DisputeSummary { private String merchantDbaName; private String merchantNumber; private String merchantCategory; + private BigDecimal merchantAmount; private Date depositDate; private String depositReference; private String depositType; diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index 3c9bb75..a684aa9 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -831,6 +831,7 @@ public static DisputeSummary mapDisputeSummary(JsonDoc doc) throws GatewayExcept summary.setReasonCode(doc.getString("reason_code")); summary.setReason(doc.getString("reason_description")); summary.setResult(doc.getString("result")); + summary.setMerchantAmount(doc.getAmount("merchant_amount")); if (doc.has("system")) { JsonDoc system = doc.get("system"); From 3baed583df866cc9eaa1c7daeae0403e0e018e8e Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 11:07:47 +0200 Subject: [PATCH 6/8] Adds mapping for founding_type field in settled disputes --- src/main/java/com/global/api/mapping/GpApiMapping.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index a684aa9..9d02bb9 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -919,6 +919,7 @@ public static DisputeSummary mapSettlementDisputeSummary(JsonDoc doc) throws Gat summary.setCaseIdTime(parseGpApiDateTime(doc.getString("stage_time_created"))); summary.setDepositDate(parseGpApiDate(doc.getString("deposit_time_created"))); summary.setDepositReference(doc.getString("deposit_id")); + summary.setType(doc.getString("funding_type")); if (doc.has("transaction")) { JsonDoc transaction = doc.get("transaction"); From ec03f46edd2007bd5a619d6614069d28bdcbea6c Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 11:08:19 +0200 Subject: [PATCH 7/8] Adds brand_reference value to the digital wallet object --- .../requestbuilder/gpApi/GpApiAuthorizationRequestBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/global/api/builders/requestbuilder/gpApi/GpApiAuthorizationRequestBuilder.java b/src/main/java/com/global/api/builders/requestbuilder/gpApi/GpApiAuthorizationRequestBuilder.java index 2a5247e..d572839 100644 --- a/src/main/java/com/global/api/builders/requestbuilder/gpApi/GpApiAuthorizationRequestBuilder.java +++ b/src/main/java/com/global/api/builders/requestbuilder/gpApi/GpApiAuthorizationRequestBuilder.java @@ -76,7 +76,8 @@ public GpApiRequest buildRequest(AuthorizationBuilder builder, GpApiConnector ga .set("cryptogram", creditCardData.getCryptogram()) .set("eci", creditCardData.getEci()) .set("avs_address", builderBillingAddress != null ? builderBillingAddress.getStreetAddress1() : "") - .set("avs_postal_code", builderBillingAddress != null ? builderBillingAddress.getPostalCode() : ""); + .set("avs_postal_code", builderBillingAddress != null ? builderBillingAddress.getPostalCode() : "") + .set("brand_reference", builder.getCardBrandTransactionId()); maskedData.putAll( MaskValueUtil.hideValues( From ec30853d42b0862049280daba6e0a0743759720b Mon Sep 17 00:00:00 2001 From: Piotr Chowaniec Date: Tue, 10 Jun 2025 11:09:42 +0200 Subject: [PATCH 8/8] Clean up imports --- src/main/java/com/global/api/mapping/GpApiMapping.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/global/api/mapping/GpApiMapping.java b/src/main/java/com/global/api/mapping/GpApiMapping.java index 9d02bb9..77e0edd 100644 --- a/src/main/java/com/global/api/mapping/GpApiMapping.java +++ b/src/main/java/com/global/api/mapping/GpApiMapping.java @@ -11,15 +11,10 @@ import com.global.api.entities.payFac.Person; import com.global.api.entities.payFac.UserReference; import com.global.api.entities.reporting.*; -import com.global.api.paymentMethods.CreditCardData; -import com.global.api.paymentMethods.Installment; -import com.global.api.paymentMethods.InstallmentData; -import com.global.api.paymentMethods.RecurringPaymentMethod; -import com.global.api.paymentMethods.eCheck; +import com.global.api.paymentMethods.*; import com.global.api.utils.EnumUtils; import com.global.api.utils.JsonDoc; import com.global.api.utils.StringUtils; -import com.google.gson.JsonElement; import lombok.var; import org.joda.time.DateTime;