killbill-memoizeit

jaxrs: allow complete operations by specifying the transaction

8/12/2015 8:39:46 PM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
index 95eed00..e69e85c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
@@ -285,7 +285,22 @@ public class PaymentResource extends ComboPaymentResource {
 
         final TransactionType transactionType;
         final String transactionExternalKey;
-        if (json != null && json.getTransactionExternalKey() != null && json.getTransactionType() != null) {
+        if (json != null && json.getTransactionId() != null) {
+            final Collection<PaymentTransaction> paymentTransactionCandidates = Collections2.<PaymentTransaction>filter(initialPayment.getTransactions(),
+                                                                                                                        new Predicate<PaymentTransaction>() {
+                                                                                                                            @Override
+                                                                                                                            public boolean apply(final PaymentTransaction input) {
+                                                                                                                                return input.getId().toString().equals(json.getTransactionId());
+                                                                                                                            }
+                                                                                                                        });
+            if (paymentTransactionCandidates.size() == 1) {
+                final PaymentTransaction paymentTransaction = paymentTransactionCandidates.iterator().next();
+                transactionType = paymentTransaction.getTransactionType();
+                transactionExternalKey = paymentTransaction.getExternalKey();
+            } else {
+                return Response.status(Status.NOT_FOUND).build();
+            }
+        } else if (json != null && json.getTransactionExternalKey() != null && json.getTransactionType() != null) {
             transactionType = TransactionType.valueOf(json.getTransactionType());
             transactionExternalKey = json.getTransactionExternalKey();
         } else if (json != null && json.getTransactionExternalKey() != null) {
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
index ba0e769..1cfdb15 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
@@ -91,6 +91,13 @@ public class TestPayment extends TestJaxrsBase {
             completeTransactionWithTypeAndKey.setTransactionExternalKey(authPaymentTransaction.getTransactionExternalKey());
             final Payment completedPaymentByTypeAndKey = killBillClient.completePayment(completeTransactionWithTypeAndKey, pluginProperties, createdBy, reason, comment);
             verifyPayment(account, paymentMethodId, completedPaymentByTypeAndKey, paymentExternalKey, authTransactionExternalKey, transactionType.toString(), pending, amount, authAmount, BigDecimal.ZERO, BigDecimal.ZERO, 1, paymentNb);
+
+            // Finally, specify the payment id and transaction id
+            final PaymentTransaction completeTransactionWithTypeAndId = new PaymentTransaction();
+            completeTransactionWithTypeAndId.setPaymentId(initialPayment.getPaymentId());
+            completeTransactionWithTypeAndId.setTransactionId(authPaymentTransaction.getTransactionId());
+            final Payment completedPaymentByTypeAndId = killBillClient.completePayment(completeTransactionWithTypeAndId, pluginProperties, createdBy, reason, comment);
+            verifyPayment(account, paymentMethodId, completedPaymentByTypeAndId, paymentExternalKey, authTransactionExternalKey, transactionType.toString(), pending, amount, authAmount, BigDecimal.ZERO, BigDecimal.ZERO, 1, paymentNb);
         }
     }
 
@@ -145,6 +152,13 @@ public class TestPayment extends TestJaxrsBase {
         completeTransactionWithTypeAndKey.setTransactionExternalKey(refundTransactionExternalKey);
         final Payment completedPaymentByTypeAndKey = killBillClient.completePayment(completeTransactionWithTypeAndKey, pluginProperties, createdBy, reason, comment);
         verifyPaymentWithPendingRefund(account, paymentMethodId, paymentExternalKey, purchaseTransactionExternalKey, purchaseAmount, refundTransactionExternalKey, completedPaymentByTypeAndKey);
+
+        // Also, it should work if we specify the payment id and transaction id
+        final PaymentTransaction completeTransactionWithTypeAndId = new PaymentTransaction();
+        completeTransactionWithTypeAndId.setPaymentId(refundPayment.getPaymentId());
+        completeTransactionWithTypeAndId.setTransactionId(refundPayment.getTransactions().get(1).getTransactionId());
+        final Payment completedPaymentByTypeAndId = killBillClient.completePayment(completeTransactionWithTypeAndId, pluginProperties, createdBy, reason, comment);
+        verifyPaymentWithPendingRefund(account, paymentMethodId, paymentExternalKey, purchaseTransactionExternalKey, purchaseAmount, refundTransactionExternalKey, completedPaymentByTypeAndId);
     }
 
     @Test(groups = "slow")