killbill-aplcache

analytics: support refunds and chargebacks in bip Add invoice_payment_type

7/5/2012 9:43:17 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentRecorder.java
index 6f7338d..1d7c3d0 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoicePaymentRecorder.java
@@ -32,6 +32,8 @@ import com.ning.billing.analytics.dao.BusinessAccountSqlDao;
 import com.ning.billing.analytics.dao.BusinessInvoicePaymentSqlDao;
 import com.ning.billing.analytics.dao.BusinessInvoiceSqlDao;
 import com.ning.billing.analytics.model.BusinessInvoicePayment;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.payment.api.Payment;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.api.PaymentApiException;
@@ -44,6 +46,7 @@ public class BusinessInvoicePaymentRecorder {
 
     private final BusinessInvoicePaymentSqlDao invoicePaymentSqlDao;
     private final AccountUserApi accountApi;
+    private final InvoicePaymentApi invoicePaymentApi;
     private final PaymentApi paymentApi;
     private final Clock clock;
     private final BusinessInvoiceRecorder invoiceRecorder;
@@ -51,10 +54,11 @@ public class BusinessInvoicePaymentRecorder {
 
     @Inject
     public BusinessInvoicePaymentRecorder(final BusinessInvoicePaymentSqlDao invoicePaymentSqlDao, final AccountUserApi accountApi,
-                                          final PaymentApi paymentApi, final Clock clock, final BusinessInvoiceRecorder invoiceRecorder,
-                                          final BusinessAccountRecorder accountRecorder) {
+                                          final InvoicePaymentApi invoicePaymentApi, final PaymentApi paymentApi, final Clock clock,
+                                          final BusinessInvoiceRecorder invoiceRecorder, final BusinessAccountRecorder accountRecorder) {
         this.invoicePaymentSqlDao = invoicePaymentSqlDao;
         this.accountApi = accountApi;
+        this.invoicePaymentApi = invoicePaymentApi;
         this.paymentApi = paymentApi;
         this.clock = clock;
         this.invoiceRecorder = invoiceRecorder;
@@ -78,6 +82,8 @@ public class BusinessInvoicePaymentRecorder {
             return;
         }
 
+        final InvoicePayment invoicePayment = invoicePaymentApi.getInvoicePayment(paymentId);
+
         final PaymentMethod paymentMethod;
         try {
             paymentMethod = paymentApi.getPaymentMethod(account, payment.getPaymentMethodId(), true);
@@ -86,11 +92,11 @@ public class BusinessInvoicePaymentRecorder {
             return;
         }
 
-        createPayment(account, payment, paymentMethod, extPaymentRefId, message);
+        createPayment(account, invoicePayment, payment, paymentMethod, extPaymentRefId, message);
     }
 
-    private void createPayment(final Account account, final Payment payment, final PaymentMethod paymentMethod,
-                               final String extPaymentRefId, final String message) {
+    private void createPayment(final Account account, @Nullable final InvoicePayment invoicePayment, final Payment payment,
+                               final PaymentMethod paymentMethod, final String extPaymentRefId, final String message) {
         final PaymentMethodPlugin pluginDetail = paymentMethod.getPluginDetail();
         // TODO - make it generic
         final String cardCountry = pluginDetail != null ? pluginDetail.getValueString("country") : null;
@@ -104,8 +110,19 @@ public class BusinessInvoicePaymentRecorder {
                 // Delete the existing payment if it exists - this is to make the call idempotent
                 transactional.deleteInvoicePayment(payment.getId().toString());
 
+                // invoicePayment may be null on payment failures
+                final String invoicePaymentType;
+                final UUID linkedInvoicePaymentId;
+                if (invoicePayment != null) {
+                    invoicePaymentType = invoicePayment.getType().toString();
+                    linkedInvoicePaymentId = invoicePayment.getLinkedInvoicePaymentId();
+                } else {
+                    invoicePaymentType = null;
+                    linkedInvoicePaymentId = null;
+                }
+
                 // Create the bip record
-                final BusinessInvoicePayment invoicePayment = new BusinessInvoicePayment(
+                final BusinessInvoicePayment businessInvoicePayment = new BusinessInvoicePayment(
                         account.getExternalKey(),
                         payment.getAmount(),
                         extPaymentRefId,
@@ -122,9 +139,10 @@ public class BusinessInvoicePaymentRecorder {
                         paymentMethod.getPluginName(),
                         payment.getPaymentStatus().toString(),
                         payment.getAmount(),
-                        clock.getUTCNow()
-                );
-                transactional.createInvoicePayment(invoicePayment);
+                        clock.getUTCNow(),
+                        invoicePaymentType,
+                        linkedInvoicePaymentId);
+                transactional.createInvoicePayment(businessInvoicePayment);
 
                 // Update bin to get the latest invoice(s) balance(s)
                 final BusinessInvoiceSqlDao invoiceSqlDao = transactional.become(BusinessInvoiceSqlDao.class);
@@ -134,7 +152,7 @@ public class BusinessInvoicePaymentRecorder {
                 final BusinessAccountSqlDao accountSqlDao = transactional.become(BusinessAccountSqlDao.class);
                 accountRecorder.updateAccountInTransaction(account, accountSqlDao);
 
-                log.info("Added payment {}", invoicePayment);
+                log.info("Added payment {}", businessInvoicePayment);
                 return null;
             }
         });
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentBinder.java
index e00d675..c55111c 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentBinder.java
@@ -22,6 +22,7 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.sql.Types;
+import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
@@ -76,6 +77,14 @@ public @interface BusinessInvoicePaymentBinder {
                     q.bind("payment_method", invoicePayment.getPaymentMethod());
                     q.bind("card_type", invoicePayment.getCardType());
                     q.bind("card_country", invoicePayment.getCardCountry());
+                    q.bind("invoice_payment_type", invoicePayment.getInvoicePaymentType());
+
+                    final UUID linkedInvoicePaymentId = invoicePayment.getLinkedInvoicePaymentId();
+                    if (linkedInvoicePaymentId != null) {
+                        q.bind("linked_invoice_payment_id", linkedInvoicePaymentId.toString());
+                    } else {
+                        q.bindNull("linked_invoice_payment_id", Types.VARCHAR);
+                    }
                 }
             };
         }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentMapper.java
index b658006..de11209 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessInvoicePaymentMapper.java
@@ -49,9 +49,19 @@ public class BusinessInvoicePaymentMapper implements ResultSetMapper<BusinessInv
         final String paymentMethod = r.getString(15);
         final String cardType = r.getString(16);
         final String cardCountry = r.getString(17);
+        final String invoicePaymentType = r.getString(18);
+        final String linkedInvoicePaymentIdString = r.getString(19);
+
+        final UUID linkedInvoicePaymentId;
+        if (linkedInvoicePaymentIdString != null) {
+            linkedInvoicePaymentId = UUID.fromString(linkedInvoicePaymentIdString);
+        } else {
+            linkedInvoicePaymentId = null;
+        }
 
         return new BusinessInvoicePayment(accountKey, amount, extPaymentRefId, cardCountry, cardType, createdDate, currency,
                                           effectiveDate, invoiceId, paymentError, paymentId, paymentMethod, paymentType,
-                                          pluginName, processingStatus, requestedAmount, updatedDate);
+                                          pluginName, processingStatus, requestedAmount, updatedDate, invoicePaymentType,
+                                          linkedInvoicePaymentId);
     }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoicePayment.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoicePayment.java
index d3044a8..73a1f8d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoicePayment.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessInvoicePayment.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.analytics.model;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.UUID;
 
@@ -42,13 +43,16 @@ public class BusinessInvoicePayment {
     private final String paymentMethod;
     private final String cardType;
     private final String cardCountry;
+    private final String invoicePaymentType;
+    private final UUID linkedInvoicePaymentId;
 
     public BusinessInvoicePayment(final String accountKey, final BigDecimal amount, final String extPaymentRefId,
                                   final String cardCountry, final String cardType, final DateTime createdDate,
                                   final Currency currency, final DateTime effectiveDate, final UUID invoiceId,
                                   final String paymentError, final UUID paymentId, final String paymentMethod,
                                   final String paymentType, final String pluginName, final String processingStatus,
-                                  final BigDecimal requestedAmount, final DateTime updatedDate) {
+                                  final BigDecimal requestedAmount, final DateTime updatedDate, @Nullable final String invoicePaymentType,
+                                  @Nullable final UUID linkedInvoicePaymentId) {
         this.accountKey = accountKey;
         this.amount = amount;
         this.extPaymentRefId = extPaymentRefId;
@@ -66,6 +70,8 @@ public class BusinessInvoicePayment {
         this.processingStatus = processingStatus;
         this.requestedAmount = requestedAmount;
         this.updatedDate = updatedDate;
+        this.invoicePaymentType = invoicePaymentType;
+        this.linkedInvoicePaymentId = linkedInvoicePaymentId;
     }
 
     public String getExtPaymentRefId() {
@@ -136,6 +142,14 @@ public class BusinessInvoicePayment {
         return updatedDate;
     }
 
+    public String getInvoicePaymentType() {
+        return invoicePaymentType;
+    }
+
+    public UUID getLinkedInvoicePaymentId() {
+        return linkedInvoicePaymentId;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
@@ -157,6 +171,8 @@ public class BusinessInvoicePayment {
         sb.append(", paymentMethod='").append(paymentMethod).append('\'');
         sb.append(", cardType='").append(cardType).append('\'');
         sb.append(", cardCountry='").append(cardCountry).append('\'');
+        sb.append(", invoicePaymentType='").append(invoicePaymentType).append('\'');
+        sb.append(", linkedInvoicePaymentId='").append(linkedInvoicePaymentId).append('\'');
         sb.append('}');
         return sb.toString();
     }
@@ -223,6 +239,12 @@ public class BusinessInvoicePayment {
         if (updatedDate != null ? !updatedDate.equals(that.updatedDate) : that.updatedDate != null) {
             return false;
         }
+        if (invoicePaymentType != null ? !invoicePaymentType.equals(that.invoicePaymentType) : that.invoicePaymentType != null) {
+            return false;
+        }
+        if (linkedInvoicePaymentId != null ? !linkedInvoicePaymentId.equals(that.linkedInvoicePaymentId) : that.linkedInvoicePaymentId != null) {
+            return false;
+        }
 
         return true;
     }
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoicePaymentSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoicePaymentSqlDao.sql.stg
index a5efb04..a71f3d5 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoicePaymentSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessInvoicePaymentSqlDao.sql.stg
@@ -19,6 +19,8 @@ select
 , payment_method
 , card_type
 , card_country
+, invoice_payment_type
+, linked_invoice_payment_id
 from bip
 where payment_id = :payment_id
 limit 1
@@ -44,6 +46,8 @@ select
 , payment_method
 , card_type
 , card_country
+, invoice_payment_type
+, linked_invoice_payment_id
 from bip
 where account_key = :account_key
 order by created_date asc
@@ -69,6 +73,8 @@ insert into bip (
 , payment_method
 , card_type
 , card_country
+, invoice_payment_type
+, linked_invoice_payment_id
 ) values (
   :payment_id
 , :created_date
@@ -87,6 +93,8 @@ insert into bip (
 , :payment_method
 , :card_type
 , :card_country
+, :invoice_payment_type
+, :linked_invoice_payment_id
 );
 >>
 
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
index c3095e4..102a442 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -120,6 +120,8 @@ create table bip (
 , payment_method varchar(20) default null
 , card_type varchar(20) default null
 , card_country varchar(20) default null
+, invoice_payment_type varchar(24) default null
+, linked_invoice_payment_id char(36) default null
 , primary key(record_id)
 ) engine=innodb comment 'Business Invoice Payments, track all payments';
 create unique index bip_key_index on bip (payment_id);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
index 3f0b762..9ec7696 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestBusinessInvoicePaymentSqlDao.java
@@ -116,12 +116,15 @@ public class TestBusinessInvoicePaymentSqlDao extends TestWithEmbeddedDB {
         final String processingStatus = UUID.randomUUID().toString();
         final BigDecimal requestedAmount = BigDecimal.ZERO;
         final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+        final String invoicePaymentType = UUID.randomUUID().toString().substring(0, 10);
+        final UUID linkedInvoicePaymentId = UUID.randomUUID();
 
         return new BusinessInvoicePayment(accountKey, amount, extPaymentRefId,
                                           cardCountry, cardType, createdDate,
                                           currency, effectiveDate, invoiceId,
                                           paymentError, paymentId, paymentMethod,
                                           paymentType, pluginName, processingStatus,
-                                          requestedAmount, updatedDate);
+                                          requestedAmount, updatedDate, invoicePaymentType,
+                                          linkedInvoicePaymentId);
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
index e5a997b..ce31865 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessInvoicePayment.java
@@ -47,12 +47,15 @@ public class TestBusinessInvoicePayment extends AnalyticsTestSuite {
         final String processingStatus = UUID.randomUUID().toString();
         final BigDecimal requestedAmount = BigDecimal.ZERO;
         final DateTime updatedDate = new DateTime(DateTimeZone.UTC);
+        final String invoicePaymentType = UUID.randomUUID().toString();
+        final UUID linkedInvoicePaymentId = UUID.randomUUID();
         final BusinessInvoicePayment invoicePayment = new BusinessInvoicePayment(accountKey, amount, extPaymentRefId,
                                                                                  cardCountry, cardType, createdDate,
                                                                                  currency, effectiveDate, invoiceId,
                                                                                  paymentError, paymentId, paymentMethod,
                                                                                  paymentType, pluginName, processingStatus,
-                                                                                 requestedAmount, updatedDate);
+                                                                                 requestedAmount, updatedDate, invoicePaymentType,
+                                                                                 linkedInvoicePaymentId);
         Assert.assertSame(invoicePayment, invoicePayment);
         Assert.assertEquals(invoicePayment, invoicePayment);
         Assert.assertTrue(invoicePayment.equals(invoicePayment));
@@ -73,10 +76,12 @@ public class TestBusinessInvoicePayment extends AnalyticsTestSuite {
         Assert.assertEquals(invoicePayment.getProcessingStatus(), processingStatus);
         Assert.assertEquals(invoicePayment.getRequestedAmount(), requestedAmount);
         Assert.assertEquals(invoicePayment.getUpdatedDate(), updatedDate);
+        Assert.assertEquals(invoicePayment.getInvoicePaymentType(), invoicePaymentType);
+        Assert.assertEquals(invoicePayment.getLinkedInvoicePaymentId(), linkedInvoicePaymentId);
 
         final BusinessInvoicePayment otherInvoicePayment = new BusinessInvoicePayment(null, null, extPaymentRefId, null, null, createdDate,
                                                                                       null, null, null, null, paymentId, null,
-                                                                                      null, null, null, null, null);
+                                                                                      null, null, null, null, null, null, null);
         Assert.assertFalse(invoicePayment.equals(otherInvoicePayment));
     }
 }