killbill-memoizeit

logging: improve logging of payment operations Signed-off-by:

4/12/2016 7:31:01 PM

Details

diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
index 17515f1..6ee3eee 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -32,11 +32,13 @@ import org.killbill.billing.util.config.PaymentConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 
 public class DefaultApiBase {
 
     private static final Logger log = LoggerFactory.getLogger(DefaultApiBase.class);
+    private static final Joiner JOINER = Joiner.on(",");
 
     private final PaymentConfig paymentConfig;
 
@@ -44,7 +46,17 @@ public class DefaultApiBase {
         this.paymentConfig = paymentConfig;
     }
 
-    protected void logAPICall(final String transactionType, final Account account, final UUID paymentMethodId, @Nullable final UUID paymentId, @Nullable final UUID transactionId, @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final String paymentExternalKey, @Nullable final String paymentTransactionExternalKey) {
+    protected void logAPICall(final String transactionType,
+                              final Account account,
+                              final UUID paymentMethodId,
+                              @Nullable final UUID paymentId,
+                              @Nullable final UUID transactionId,
+                              @Nullable final BigDecimal amount,
+                              @Nullable final Currency currency,
+                              @Nullable final String paymentExternalKey,
+                              @Nullable final String paymentTransactionExternalKey,
+                              @Nullable final TransactionStatus transactionStatus,
+                              @Nullable final List<String> paymentControlPluginNames) {
         if (log.isInfoEnabled()) {
             final StringBuilder logLine = new StringBuilder();
             logLine.append("PaymentApi: transactionType='")
@@ -87,6 +99,16 @@ public class DefaultApiBase {
                        .append(currency)
                        .append("'");
             }
+            if (transactionStatus != null) {
+                logLine.append(", transactionStatus='")
+                       .append(transactionStatus)
+                       .append("'");
+            }
+            if (paymentControlPluginNames != null) {
+                logLine.append(", paymentControlPluginNames='")
+                       .append(JOINER.join(paymentControlPluginNames))
+                       .append("'");
+            }
             log.info(logLine.toString());
         }
     }
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
index 0a39175..b8e1e7a 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
@@ -42,6 +42,9 @@ import org.killbill.billing.util.entity.Pagination;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
 public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
 
     private static final boolean SHOULD_LOCK_ACCOUNT = true;
@@ -76,11 +79,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         }
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.AUTHORIZE.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.AUTHORIZE.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createAuthorization(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                    SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createAuthorization(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                     SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
     }
 
     @Override
@@ -101,11 +120,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         }
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.AUTHORIZE.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.AUTHORIZE.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createAuthorization(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                                 properties, paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createAuthorization(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                                  properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override
@@ -118,11 +153,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
         checkPositiveAmount(amount);
 
-        logAPICall(TransactionType.CAPTURE.name(), account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.CAPTURE.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createCapture(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                              SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createCapture(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                               SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
     }
 
     @Override
@@ -139,9 +190,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(properties, "plugin properties");
         checkPositiveAmount(amount);
 
+        final String transactionType = TransactionType.CAPTURE.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createCapture(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                           properties, paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createCapture(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                            properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override
@@ -156,15 +225,31 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         }
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.PURCHASE.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.PURCHASE.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createPurchase(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                               SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createPurchase(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
     }
 
     @Override
-    public Payment createPurchaseWithPaymentControl(final Account account, @Nullable final UUID paymentMethodId, @Nullable final UUID paymentId, final BigDecimal amount, final Currency currency, @Nullable  final String paymentExternalKey, final String paymentTransactionExternalKey,
+    public Payment createPurchaseWithPaymentControl(final Account account, @Nullable final UUID paymentMethodId, @Nullable final UUID paymentId, final BigDecimal amount, final Currency currency, @Nullable final String paymentExternalKey, final String paymentTransactionExternalKey,
                                                     final Iterable<PluginProperty> properties, final PaymentOptions paymentOptions, final CallContext callContext) throws PaymentApiException {
         final List<String> paymentControlPluginNames = toPaymentControlPluginNames(paymentOptions);
         if (paymentControlPluginNames.isEmpty()) {
@@ -180,20 +265,34 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentTransactionExternalKey, "paymentTransactionExternalKey");
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.PURCHASE.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
-
         if (paymentMethodId == null && !paymentOptions.isExternalPayment()) {
             throw new PaymentApiException(ErrorCode.PAYMENT_INVALID_PARAMETER, "paymentMethodId", "should not be null");
         }
-
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-
         final UUID nonNulPaymentMethodId = (paymentMethodId != null) ?
                                            paymentMethodId :
                                            paymentMethodProcessor.createOrGetExternalPaymentMethod(UUIDs.randomUUID().toString(), account, properties, callContext, internalCallContext);
-        return pluginControlPaymentProcessor.createPurchase(IS_API_PAYMENT, account, nonNulPaymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                            properties, paymentControlPluginNames, callContext, internalCallContext);
 
+        final String transactionType = TransactionType.PURCHASE.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
+        final Payment payment = pluginControlPaymentProcessor.createPurchase(IS_API_PAYMENT, account, nonNulPaymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                             properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override
@@ -204,11 +303,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.VOID.name(), account, null, paymentId, null, null, null, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.VOID.name();
+        logAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createVoid(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey,
-                                           SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createVoid(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey,
+                                                            SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
 
     }
 
@@ -223,11 +338,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.VOID.name(), account, null, paymentId, null, null, null, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.VOID.name();
+        logAPICall(transactionType, account, null, paymentId, null, null, null, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createVoid(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey,
-                                                        properties, paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createVoid(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey,
+                                                                         properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override
@@ -243,11 +374,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             checkPositiveAmount(amount);
         }
 
-        logAPICall(TransactionType.REFUND.name(), account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.REFUND.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createRefund(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                             SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createRefund(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                              SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
     }
 
     @Override
@@ -269,12 +416,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
             checkPositiveAmount(amount);
         }
 
-        logAPICall(TransactionType.REFUND.name(), account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.REFUND.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createRefund(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
-                                                          properties, paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createRefund(IS_API_PAYMENT, account, paymentId, amount, currency, paymentTransactionExternalKey,
+                                                                           properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
 
+        return payment;
     }
 
     @Override
@@ -290,12 +452,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         }
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.CREDIT.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.CREDIT.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createCredit(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                             SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createCredit(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                              SHOULD_LOCK_ACCOUNT, properties, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
 
+        return payment;
     }
 
     @Override
@@ -316,11 +493,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         }
         checkNotNullParameter(properties, "plugin properties");
 
-        logAPICall(TransactionType.CREDIT.name(), account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.CREDIT.name();
+        logAPICall(transactionType, account, paymentMethodId, paymentId, null, amount, currency, paymentExternalKey, paymentTransactionExternalKey, null, paymentControlPluginNames);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createCredit(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
-                                                          properties, paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createCredit(IS_API_PAYMENT, account, paymentMethodId, paymentId, amount, currency, paymentExternalKey, paymentTransactionExternalKey,
+                                                                           properties, paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override
@@ -328,10 +521,32 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(account, "account");
         checkNotNullParameter(paymentTransactionId, "paymentTransactionId");
 
-        logAPICall("NOTIFY_STATE_CHANGE", account, null, null, paymentTransactionId, null, null, null, null);
+        final String transactionType = "NOTIFY_STATE_CHANGE";
+        logAPICall(transactionType, account, null, null, paymentTransactionId, null, null, null, null, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.notifyPendingPaymentOfStateChanged(account, paymentTransactionId, isSuccess, callContext, internalCallContext);
+        final Payment payment = paymentProcessor.notifyPendingPaymentOfStateChanged(account, paymentTransactionId, isSuccess, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = Iterables.<PaymentTransaction>tryFind(payment.getTransactions(),
+                                                                                            new Predicate<PaymentTransaction>() {
+                                                                                                @Override
+                                                                                                public boolean apply(final PaymentTransaction transaction) {
+                                                                                                    return transaction.getId().equals(paymentTransactionId);
+                                                                                                }
+                                                                                            }).orNull();
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction == null ? null : paymentTransaction.getId(),
+                   paymentTransaction == null ? null : paymentTransaction.getProcessedAmount(),
+                   paymentTransaction == null ? null : paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction == null ? null : paymentTransaction.getExternalKey(),
+                   paymentTransaction == null ? null : paymentTransaction.getTransactionStatus(),
+                   null);
+
+        return payment;
     }
 
     @Override
@@ -347,12 +562,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
         checkPositiveAmount(amount);
 
-        logAPICall(TransactionType.CHARGEBACK.name(), account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey);
+        final String transactionType = TransactionType.CHARGEBACK.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, null);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return paymentProcessor.createChargeback(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, amount, currency, true,
-                                                 callContext, internalCallContext);
+        final Payment payment = paymentProcessor.createChargeback(IS_API_PAYMENT, NULL_ATTEMPT_ID, account, paymentId, paymentTransactionExternalKey, amount, currency, true,
+                                                                  callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   null);
 
+        return payment;
     }
 
     @Override
@@ -368,9 +598,27 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
         checkNotNullParameter(paymentId, "paymentId");
         checkPositiveAmount(amount);
 
+        final String transactionType = TransactionType.CHARGEBACK.name();
+        logAPICall(transactionType, account, null, paymentId, null, amount, currency, null, paymentTransactionExternalKey, null, paymentControlPluginNames);
+
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        return pluginControlPaymentProcessor.createChargeback(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey, amount, currency,
-                                                              paymentControlPluginNames, callContext, internalCallContext);
+        final Payment payment = pluginControlPaymentProcessor.createChargeback(IS_API_PAYMENT, account, paymentId, paymentTransactionExternalKey, amount, currency,
+                                                                               paymentControlPluginNames, callContext, internalCallContext);
+
+        final PaymentTransaction paymentTransaction = payment.getTransactions().get(payment.getTransactions().size() - 1);
+        logAPICall(transactionType,
+                   account,
+                   payment.getPaymentMethodId(),
+                   payment.getId(),
+                   paymentTransaction.getId(),
+                   paymentTransaction.getProcessedAmount(),
+                   paymentTransaction.getProcessedCurrency(),
+                   payment.getExternalKey(),
+                   paymentTransaction.getExternalKey(),
+                   paymentTransaction.getTransactionStatus(),
+                   paymentControlPluginNames);
+
+        return payment;
     }
 
     @Override