killbill-memoizeit

Payment rework ongoing

5/24/2012 1:48:12 PM

Changes

payment/src/main/java/com/ning/billing/payment/setup/DefaultPaymentService.java 92(+0 -92)

payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java 71(+0 -71)

payment/src/test/java/com/ning/billing/payment/setup/PaymentModuleWithMocks.java 27(+0 -27)

payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModuleWithEmbeddedDb.java 58(+0 -58)

payment/src/test/java/com/ning/billing/payment/setup/PaymentTestModuleWithMocks.java 72(+0 -72)

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
index 17b3c14..e4dff64 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/AnalyticsTestModule.java
@@ -24,7 +24,7 @@ import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.entitlement.glue.DefaultEntitlementModule;
 import com.ning.billing.invoice.glue.DefaultInvoiceModule;
 import com.ning.billing.junction.glue.DefaultJunctionModule;
-import com.ning.billing.payment.setup.PaymentModule;
+import com.ning.billing.payment.glue.PaymentModule;
 import com.ning.billing.util.email.EmailModule;
 import com.ning.billing.util.email.templates.TemplateModule;
 import com.ning.billing.util.glue.BusModule;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 43e046f..d0a8d7f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -285,8 +285,7 @@ public class TestAnalyticsService {
         final PaymentAttempt paymentAttempt = new DefaultPaymentAttempt(UUID.randomUUID(), invoice.getId(), account.getId(), BigDecimal.TEN,
                 ACCOUNT_CURRENCY, clock.getUTCNow(), clock.getUTCNow(), paymentInfoNotification.getId(), 1, new DateTime(), new DateTime(), PaymentAttemptStatus.COMPLETED_SUCCESS);
         paymentDao.createPaymentAttempt(paymentAttempt, PaymentAttemptStatus.COMPLETED_SUCCESS, context);
-        paymentDao.savePaymentInfo(paymentInfoNotification, context);
-        paymentDao.updatePaymentAttemptWithPaymentId(paymentAttempt.getId(), paymentInfoNotification.getId(), context);
+        paymentDao.insertPaymentInfoWithPaymentAttemptUpdate(paymentInfoNotification, paymentAttempt.getId(), context);
         Assert.assertEquals(paymentDao.getPaymentInfoList(Arrays.asList(invoice.getId())).size(), 1);
     }
 
diff --git a/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java b/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
index bc3d372..6af0430 100644
--- a/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
@@ -21,6 +21,9 @@ import org.codehaus.jackson.annotate.JsonProperty;
 
 
 public final class CreditCardPaymentMethodInfo extends PaymentMethodInfo {
+    
+    public static final String TYPE = "CreditCard";
+    
     private final String cardHolderName;
     private final String cardType;
     private final String expirationDate;
@@ -47,7 +50,7 @@ public final class CreditCardPaymentMethodInfo extends PaymentMethodInfo {
                                        @JsonProperty("cardPostalCode") String cardPostalCode,
                                        @JsonProperty("cardCountry") String cardCountry) {
 
-      super(id, accountId, defaultMethod, "CreditCard");
+      super(id, accountId, defaultMethod, TYPE);
       this.cardHolderName = cardHolderName;
       this.cardType = cardType;
       this.expirationDate = expirationDate;
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentMethodInfo.java b/api/src/main/java/com/ning/billing/payment/api/PaymentMethodInfo.java
index bf3abe9..a2a3a01 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentMethodInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentMethodInfo.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.payment.api;
 
-import java.util.UUID;
 
 import com.google.common.base.Objects;
 
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java b/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
index 3b2ebed..c8d1342 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
@@ -23,6 +23,7 @@ import com.google.common.base.Strings;
 
 
 public final class PaypalPaymentMethodInfo extends PaymentMethodInfo {
+
     public static final String TYPE = "PayPal";
 
     public static final class Builder extends BuilderBase<PaypalPaymentMethodInfo, Builder> {
diff --git a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
index 8f1117b..2f76e99 100644
--- a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
+++ b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
@@ -32,12 +32,6 @@ public interface PaymentInfoPlugin {
 
     public String getPaymentNumber();
 
-    public String getPaymentMethod();
-
-    public String getCardType();
-
-    public String getCardCountry();
-
     public String getReferenceId();
 
     public String getPaymentMethodId();
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/BeatrixModule.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/BeatrixModule.java
index 420483c..9f7b259 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/BeatrixModule.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/BeatrixModule.java
@@ -48,8 +48,8 @@ import com.ning.billing.junction.glue.DefaultJunctionModule;
 import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.overdue.OverdueService;
 import com.ning.billing.payment.api.PaymentService;
+import com.ning.billing.payment.glue.PaymentModule;
 import com.ning.billing.payment.provider.MockPaymentProviderPluginModule;
-import com.ning.billing.payment.setup.PaymentModule;
 import com.ning.billing.util.bus.BusService;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/PaymentTestModule.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/PaymentTestModule.java
index d444776..69fec1f 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/PaymentTestModule.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/PaymentTestModule.java
@@ -29,8 +29,8 @@ import com.ning.billing.junction.api.BillingApi;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.payment.dao.MockPaymentDao;
 import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.payment.glue.PaymentModule;
 import com.ning.billing.payment.provider.MockPaymentProviderPluginModule;
-import com.ning.billing.payment.setup.PaymentModule;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.InMemoryBus;
 import com.ning.billing.util.notificationq.MockNotificationQueueService;
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentInvoiceIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentInvoiceIntegration.java
index ef7571e..ae7400b 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentInvoiceIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentInvoiceIntegration.java
@@ -52,7 +52,7 @@ import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentErrorEvent;
 import com.ning.billing.payment.api.PaymentInfoEvent;
-import com.ning.billing.payment.setup.PaymentTestModuleWithEmbeddedDb;
+import com.ning.billing.payment.glue.PaymentTestModuleWithEmbeddedDb;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.Bus.EventBusException;
 import com.ning.billing.util.glue.CallContextModule;
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentProvider.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentProvider.java
index 44ba8f0..27f5988 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentProvider.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/payment/TestPaymentProvider.java
@@ -40,7 +40,7 @@ import com.ning.billing.mock.glue.MockJunctionModule;
 import com.ning.billing.payment.RequestProcessor;
 import com.ning.billing.payment.api.PaymentErrorEvent;
 import com.ning.billing.payment.api.PaymentInfoEvent;
-import com.ning.billing.payment.setup.PaymentTestModuleWithMocks;
+import com.ning.billing.payment.glue.PaymentTestModuleWithMocks;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.Bus.EventBusException;
 
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
index 8bb7692..1e2c2f3 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
@@ -36,6 +36,7 @@ import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.payment.api.PaymentAttempt.PaymentAttemptStatus;
 import com.ning.billing.payment.dao.PaymentDao;
 
+import com.ning.billing.payment.plugin.api.PaymentInfoPlugin;
 import com.ning.billing.payment.plugin.api.PaymentPluginApiException;
 import com.ning.billing.payment.plugin.api.PaymentProviderPlugin;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
@@ -296,27 +297,26 @@ public class DefaultPaymentApi implements PaymentApi {
         PaymentInfoEvent paymentInfo = null;
         BusEvent event = null;
         try {
-            paymentInfo = new DefaultPaymentInfoEvent(plugin.processInvoice(account, invoice), account.getId(), invoice.getId());
-
-            paymentDao.savePaymentInfo(paymentInfo, context);
+            
+            PaymentInfoPlugin paymentPluginInfo =  plugin.processInvoice(account, invoice);
+            final String paymentMethodId = paymentPluginInfo.getPaymentMethodId();
 
-            final String paymentMethodId = paymentInfo.getPaymentMethodId();
             log.debug("Fetching payment method info for payment method id " + ((paymentMethodId == null) ? "null" : paymentMethodId));
             PaymentMethodInfo paymentMethodInfo = plugin.getPaymentMethodInfo(paymentMethodId);
 
             if (paymentMethodInfo instanceof CreditCardPaymentMethodInfo) {
                 CreditCardPaymentMethodInfo ccPaymentMethod = (CreditCardPaymentMethodInfo)paymentMethodInfo;
-                paymentDao.updatePaymentInfo(ccPaymentMethod.getType(), paymentInfo.getId(), ccPaymentMethod.getCardType(), ccPaymentMethod.getCardCountry(), context);
-
+                paymentInfo = new DefaultPaymentInfoEvent(paymentPluginInfo, ccPaymentMethod ,account.getId(), invoice.getId());
 
             } else if (paymentMethodInfo instanceof PaypalPaymentMethodInfo) {
                 PaypalPaymentMethodInfo paypalPaymentMethodInfo = (PaypalPaymentMethodInfo)paymentMethodInfo;
-                paymentDao.updatePaymentInfo(paypalPaymentMethodInfo.getType(), paymentInfo.getId(), null, null, context);
-            }
-            if (paymentInfo.getId() != null) {
-                paymentDao.updatePaymentAttemptWithPaymentId(paymentAttempt.getId(), paymentInfo.getId(), context);
+                paymentInfo = new DefaultPaymentInfoEvent(paymentPluginInfo, paypalPaymentMethodInfo ,account.getId(), invoice.getId());
+            } else {
+                paymentInfo = new DefaultPaymentInfoEvent(paymentPluginInfo, account.getId(), invoice.getId());
             }
+            paymentDao.insertPaymentInfoWithPaymentAttemptUpdate(paymentInfo, paymentAttempt.getId(), context);
 
+ 
             invoicePaymentApi.notifyOfPaymentAttempt(invoice.getId(),
                         paymentInfo == null || paymentInfo.getStatus().equalsIgnoreCase("Error") ? null : paymentInfo.getAmount(),
                           /*paymentInfo.getRefundAmount(), */
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
index eb48f30..d10cc17 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
@@ -112,10 +112,68 @@ public class DefaultPaymentInfoEvent extends EntityBase implements PaymentInfoEv
     }
     
 
+    public DefaultPaymentInfoEvent(PaymentInfoPlugin info, CreditCardPaymentMethodInfo methodInfo,  UUID accountId, UUID invoiceId) {
+        this(UUID.randomUUID(),
+                accountId,
+                invoiceId,
+                info.getAmount(),
+                info.getRefundAmount(),
+                info.getBankIdentificationNumber(),
+                info.getPaymentNumber(),
+                info.getStatus(),
+                info.getType(),
+                info.getReferenceId(),
+                info.getPaymentMethodId(),
+                methodInfo.getType(),
+                methodInfo.getCardType(),
+                methodInfo.getCardCountry(),
+                null,
+                info.getEffectiveDate(),
+                info.getCreatedDate(),
+                info.getUpdatedDate());
+    }
+
+    
+    public DefaultPaymentInfoEvent(PaymentInfoPlugin info, PaypalPaymentMethodInfo methodInfo,  UUID accountId, UUID invoiceId) {
+        this(UUID.randomUUID(),
+                accountId,
+                invoiceId,
+                info.getAmount(),
+                info.getRefundAmount(),
+                info.getBankIdentificationNumber(),
+                info.getPaymentNumber(),
+                info.getStatus(),
+                info.getType(),
+                info.getReferenceId(),
+                info.getPaymentMethodId(),
+                methodInfo.getType(),
+                null,
+                null,
+                null,
+                info.getEffectiveDate(),
+                info.getCreatedDate(),
+                info.getUpdatedDate());
+    }
+
     public DefaultPaymentInfoEvent(PaymentInfoPlugin info, UUID accountId, UUID invoiceId) {
-        this(UUID.randomUUID(), accountId,  invoiceId, info.getAmount(), info.getRefundAmount(), info.getBankIdentificationNumber(), info.getPaymentNumber(),
-                info.getStatus(), info.getCardType(), info.getReferenceId(), info.getPaymentMethodId(), info.getPaymentMethod(), info.getCardType(), info.getCardCountry(),
-                null, info.getEffectiveDate(), info.getCreatedDate(), info.getUpdatedDate());
+        this(UUID.randomUUID(),
+                accountId,
+                invoiceId,
+                info.getAmount(),
+                info.getRefundAmount(),
+                info.getBankIdentificationNumber(),
+                info.getPaymentNumber(),
+                info.getStatus(),
+                info.getType(),
+                info.getReferenceId(),
+                info.getPaymentMethodId(),
+                null,
+                null,
+                null,
+                null,
+                info.getEffectiveDate(),
+                info.getCreatedDate(),
+                info.getUpdatedDate());
     }
 
     
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
index 27f5ba1..52595d3 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/AuditedPaymentDao.java
@@ -104,67 +104,42 @@ public class AuditedPaymentDao implements PaymentDao {
             }
         });
     }
-
+    
     @Override
-    public void savePaymentInfo(final PaymentInfoEvent info, final CallContext context) {
+    public void insertPaymentInfoWithPaymentAttemptUpdate(final PaymentInfoEvent paymentInfo, final UUID paymentAttemptId, final CallContext context) {
+
         paymentSqlDao.inTransaction(new Transaction<Void, PaymentSqlDao>() {
             @Override
             public Void inTransaction(PaymentSqlDao transactional, TransactionStatus status) throws Exception {
-                transactional.insertPaymentInfo(info, context);
-                Long recordId = transactional.getRecordId(info.getId().toString());
-                EntityHistory<PaymentInfoEvent> history = new EntityHistory<PaymentInfoEvent>(info.getId(), recordId, info, ChangeType.INSERT);
+
+                transactional.insertPaymentInfo(paymentInfo, context);
+                Long recordId = transactional.getRecordId(paymentInfo.getId().toString());
+                EntityHistory<PaymentInfoEvent> history = new EntityHistory<PaymentInfoEvent>(paymentInfo.getId(), recordId, paymentInfo, ChangeType.INSERT);
                 transactional.insertHistoryFromTransaction(history, context);
 
                 Long historyRecordId = transactional.getHistoryRecordId(recordId);
                 EntityAudit audit = new EntityAudit(TableName.PAYMENTS, historyRecordId, ChangeType.INSERT);
                 transactional.insertAuditFromTransaction(audit, context);
 
-                return null;
-            }
-        });
-    }
 
-    @Override
-    public void updatePaymentAttemptWithPaymentId(final UUID paymentAttemptId, final UUID id, final CallContext context) {
-        paymentAttemptSqlDao.inTransaction(new Transaction<Void, PaymentAttemptSqlDao>() {
-            @Override
-            public Void inTransaction(PaymentAttemptSqlDao transactional, TransactionStatus status) throws Exception {
-                transactional.updatePaymentAttemptWithPaymentId(paymentAttemptId.toString(), id.toString(), context);
-                PaymentAttempt paymentAttempt = transactional.getPaymentAttemptById(paymentAttemptId.toString());
-                Long recordId = transactional.getRecordId(paymentAttemptId.toString());
-                EntityHistory<PaymentAttempt> history = new EntityHistory<PaymentAttempt>(paymentAttemptId, recordId, paymentAttempt, ChangeType.UPDATE);
-                transactional.insertHistoryFromTransaction(history, context);
+                if (paymentInfo.getId() != null && paymentAttemptId != null) {
+                    PaymentAttemptSqlDao transAttemptSqlDao = transactional.become(PaymentAttemptSqlDao.class);
 
-                Long historyRecordId = transactional.getHistoryRecordId(recordId);
-                EntityAudit audit = new EntityAudit(TableName.PAYMENT_ATTEMPTS, historyRecordId, ChangeType.UPDATE);
-                transactional.insertAuditFromTransaction(audit, context);
+                    transAttemptSqlDao.updatePaymentAttemptWithPaymentId(paymentAttemptId.toString(), paymentInfo.getId().toString(), context);
+                    PaymentAttempt paymentAttempt = transAttemptSqlDao.getPaymentAttemptById(paymentAttemptId.toString());
+                    recordId = transAttemptSqlDao.getRecordId(paymentAttemptId.toString());
+                    EntityHistory<PaymentAttempt> historyAttempt = new EntityHistory<PaymentAttempt>(paymentAttemptId, recordId, paymentAttempt, ChangeType.UPDATE);
+                    transAttemptSqlDao.insertHistoryFromTransaction(historyAttempt, context);
 
+                    historyRecordId = transAttemptSqlDao.getHistoryRecordId(recordId);
+                    audit = new EntityAudit(TableName.PAYMENT_ATTEMPTS, historyRecordId, ChangeType.UPDATE);
+                    transAttemptSqlDao.insertAuditFromTransaction(audit, context);
+                }
                 return null;
             }
         });
     }
 
-    @Override
-    public void updatePaymentInfo(final String type, final UUID paymentId, final String cardType,
-                                  final String cardCountry, final CallContext context) {
-        paymentSqlDao.inTransaction(new Transaction<Void, PaymentSqlDao>() {
-            @Override
-            public Void inTransaction(PaymentSqlDao transactional, TransactionStatus status) throws Exception {
-                transactional.updatePaymentInfo(type, paymentId.toString(), cardType, cardCountry, context);
-                PaymentInfoEvent paymentInfo = transactional.getPaymentInfo(paymentId.toString());
-
-                Long recordId = transactional.getRecordId(paymentId.toString());
-                EntityHistory<PaymentInfoEvent> history = new EntityHistory<PaymentInfoEvent>(paymentInfo.getId(), recordId, paymentInfo, ChangeType.UPDATE);
-                transactional.insertHistoryFromTransaction(history, context);
-
-                Long historyRecordId = transactional.getHistoryRecordId(recordId);
-                EntityAudit audit = new EntityAudit(TableName.PAYMENT_HISTORY, historyRecordId, ChangeType.UPDATE);
-                transactional.insertAuditFromTransaction(audit, context);
-
-                return null;
-            }
-        });
-    }
 
     @Override
     public List<PaymentInfoEvent> getPaymentInfoList(List<UUID> invoiceIds) {
@@ -211,5 +186,4 @@ public class AuditedPaymentDao implements PaymentDao {
             }
         }));
     }
-
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
index 21abc8e..bceafd4 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentDao.java
@@ -30,17 +30,14 @@ public interface PaymentDao {
     PaymentAttempt createPaymentAttempt(Invoice invoice, PaymentAttemptStatus status, CallContext context);
     PaymentAttempt createPaymentAttempt(PaymentAttempt paymentAttempt, PaymentAttemptStatus status, CallContext context);
 
-    void savePaymentInfo(PaymentInfoEvent right, CallContext context);
-
+    void insertPaymentInfoWithPaymentAttemptUpdate(PaymentInfoEvent paymentInfo, UUID paymentAttemptId, CallContext context);
+    
+    
     PaymentAttempt getPaymentAttemptForPaymentId(UUID paymentId);
     List<PaymentAttempt> getPaymentAttemptsForInvoiceIds(List<UUID> invoiceIds);
 
-    void updatePaymentAttemptWithPaymentId(UUID paymentAttemptId, UUID paymentId, CallContext context);
-
     List<PaymentAttempt> getPaymentAttemptsForInvoiceId(UUID invoiceId);
 
-    void updatePaymentInfo(String paymentMethodType, UUID paymentId, String cardType, String cardCountry, CallContext context);
-
     List<PaymentInfoEvent> getPaymentInfoList(List<UUID> invoiceIds);
 
     PaymentInfoEvent getLastPaymentInfo(List<UUID> invoiceIds);
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index 18ae0f4..f5a79af 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -38,6 +38,7 @@ import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 import org.skife.jdbi.v2.sqlobject.mixins.CloseMe;
 import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 import org.skife.jdbi.v2.unstable.BindIn;
@@ -48,7 +49,7 @@ import com.ning.billing.payment.api.PaymentInfoEvent;
 
 @ExternalizedSqlViaStringTemplate3()
 @RegisterMapper(PaymentSqlDao.PaymentInfoMapper.class)
-public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, UpdatableEntitySqlDao<PaymentInfoEvent>, CloseMe {
+public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, UpdatableEntitySqlDao<PaymentInfoEvent>, Transmogrifier,  CloseMe {
     @SqlQuery
     PaymentInfoEvent getPaymentInfoForPaymentAttemptId(@Bind("payment_attempt_id") String paymentAttemptId);
 
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
index 296731f..6a40b84 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
@@ -76,10 +76,6 @@ public class NoOpPaymentProviderPlugin implements PaymentProviderPlugin {
                 return null;
             }
             @Override
-            public String getPaymentMethod() {
-                return null;
-            }
-            @Override
             public DateTime getEffectiveDate() {
                 return null;
             }
@@ -88,14 +84,6 @@ public class NoOpPaymentProviderPlugin implements PaymentProviderPlugin {
                 return new DateTime(DateTimeZone.UTC);
             }
             @Override
-            public String getCardType() {
-                return null;
-            }
-            @Override
-            public String getCardCountry() {
-                return null;
-            }
-            @Override
             public String getBankIdentificationNumber() {
                 return null;
             }
diff --git a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
index e3335df..14afbc1 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -91,10 +91,6 @@ public class RequestProcessor {
         Account account = null;        
         try {
             account = accountUserApi.getAccountById(event.getAccountId());
-            if (account == null) {
-                log.error("Failed to process invoice, account {} does not exist!", event.getAccountId());
-                return;
-            }
             if (isAccountAutoPayOff(account.getId())) {
                 return;
             }
diff --git a/payment/src/test/java/com/ning/billing/payment/api/TestMockPaymentApi.java b/payment/src/test/java/com/ning/billing/payment/api/TestMockPaymentApi.java
index bda4a6f..7fb8d39 100644
--- a/payment/src/test/java/com/ning/billing/payment/api/TestMockPaymentApi.java
+++ b/payment/src/test/java/com/ning/billing/payment/api/TestMockPaymentApi.java
@@ -22,7 +22,7 @@ import org.testng.annotations.Test;
 import com.google.inject.Inject;
 import com.ning.billing.mock.glue.MockClockModule;
 import com.ning.billing.mock.glue.MockJunctionModule;
-import com.ning.billing.payment.setup.PaymentTestModuleWithMocks;
+import com.ning.billing.payment.glue.PaymentTestModuleWithMocks;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.glue.CallContextModule;
 
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
index ca341bd..d47f490 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
@@ -74,43 +74,30 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public void savePaymentInfo(PaymentInfoEvent paymentInfo, CallContext context) {
-        payments.put(paymentInfo.getId(), paymentInfo);
-    }
-
-    @Override
-    public void updatePaymentAttemptWithPaymentId(UUID paymentAttemptId, UUID paymentId, CallContext context) {
-        PaymentAttempt existingPaymentAttempt = paymentAttempts.get(paymentAttemptId);
+    public void insertPaymentInfoWithPaymentAttemptUpdate(PaymentInfoEvent paymentInfo, UUID paymentAttemptId,
+            CallContext context) {
 
-        if (existingPaymentAttempt != null) {
-            paymentAttempts.put(existingPaymentAttempt.getId(),
-                                ((DefaultPaymentAttempt) existingPaymentAttempt).cloner().setPaymentId(paymentId).build());
+        payments.put(paymentInfo.getId(), paymentInfo);
+        if (paymentAttemptId != null) {
+            PaymentAttempt existingPaymentAttempt = paymentAttempts.get(paymentAttemptId);
+            if (existingPaymentAttempt != null) {
+                paymentAttempts.put(existingPaymentAttempt.getId(),
+                        ((DefaultPaymentAttempt) existingPaymentAttempt).cloner().setPaymentId(paymentInfo.getId()).build());
+            }
         }
     }
 
     @Override
     public List<PaymentAttempt> getPaymentAttemptsForInvoiceId(final UUID invoiceId) {
         Collection<PaymentAttempt> attempts =  Collections2.filter(paymentAttempts.values(), new Predicate<PaymentAttempt>() {
-                @Override
-                public boolean apply(PaymentAttempt input) {
-                    return invoiceId.equals(input.getInvoiceId());
-                }
-            });
+            @Override
+            public boolean apply(PaymentAttempt input) {
+                return invoiceId.equals(input.getInvoiceId());
+            }
+        });
         return new ArrayList<PaymentAttempt>(attempts);
     }
 
-    @Override
-    public void updatePaymentInfo(String paymentMethodType, UUID paymentId, String cardType, String cardCountry, CallContext context) {
-        DefaultPaymentInfoEvent existingPayment = (DefaultPaymentInfoEvent) payments.get(paymentId);
-        if (existingPayment != null) {
-            PaymentInfoEvent payment = existingPayment.cloner()
-                    .setPaymentMethod(paymentMethodType)
-                    .setCardType(cardType)
-                    .setCardCountry(cardCountry)
-                    .build();
-            payments.put(paymentId, payment);
-        }
-    }
 
     @Override
     public List<PaymentInfoEvent> getPaymentInfoList(List<UUID> invoiceIds) {
@@ -165,4 +152,5 @@ public class MockPaymentDao implements PaymentDao {
         return null;
     }
 
+
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
index 9960ab7..7c74182 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
@@ -57,7 +57,7 @@ public abstract class TestPaymentDao {
                 .setEffectiveDate(new DefaultClock().getUTCNow())
                 .build();
 
-        paymentDao.savePaymentInfo(paymentInfo, context);
+        paymentDao.insertPaymentInfoWithPaymentAttemptUpdate(paymentInfo, null, context);
     }
 
     @Test(groups={"slow"})
@@ -74,8 +74,7 @@ public abstract class TestPaymentDao {
                 .build();
 
         CallContext context = new TestCallContext("PaymentTests");
-        paymentDao.savePaymentInfo(paymentInfo, context);
-        paymentDao.updatePaymentInfo("CreditCard", paymentInfo.getId(), "Visa", "US", context);
+        paymentDao.insertPaymentInfoWithPaymentAttemptUpdate(paymentInfo, null, context);
     }
 
     @Test(groups={"slow"})
@@ -132,16 +131,8 @@ public abstract class TestPaymentDao {
                 .setEffectiveDate(clock.getUTCNow())
                 .build();
 
-        paymentDao.savePaymentInfo(originalPaymentInfo, thisContext);
-        paymentDao.updatePaymentAttemptWithPaymentId(originalPaymentAttempt.getId(), originalPaymentInfo.getId(), thisContext);
+        paymentDao.insertPaymentInfoWithPaymentAttemptUpdate(originalPaymentInfo, originalPaymentAttempt.getId(), thisContext);
         PaymentInfoEvent paymentInfo = paymentDao.getPaymentInfoList(Arrays.asList(invoiceId)).get(0);
         Assert.assertEquals(paymentInfo, originalPaymentInfo);
-
-        clock.setDeltaFromReality(60 * 60 * 1000); // move clock forward one hour
-        paymentDao.updatePaymentInfo(originalPaymentInfo.getPaymentMethod(), originalPaymentInfo.getId(), originalPaymentInfo.getCardType(), originalPaymentInfo.getCardCountry(), thisContext);
-        paymentInfo = paymentDao.getPaymentInfoList(Arrays.asList(invoiceId)).get(0);
-        // TODO: replace these asserts
-//        Assert.assertEquals(paymentInfo.getCreatedDate().compareTo(attempt.getCreatedDate()), 0);
-//        Assert.assertTrue(paymentInfo.getUpdatedDate().isAfter(originalPaymentInfo.getUpdatedDate()));
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/plugin/api/MockPaymentInfoPlugin.java b/payment/src/test/java/com/ning/billing/payment/plugin/api/MockPaymentInfoPlugin.java
index 8d4428e..a65a66b 100644
--- a/payment/src/test/java/com/ning/billing/payment/plugin/api/MockPaymentInfoPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/plugin/api/MockPaymentInfoPlugin.java
@@ -85,21 +85,6 @@ public class MockPaymentInfoPlugin implements PaymentInfoPlugin {
     }
 
     @Override
-    public String getPaymentMethod() {
-        return paymentMethod;
-    }
-
-    @Override
-    public String getCardType() {
-        return cardType;
-    }
-
-    @Override
-    public String getCardCountry() {
-        return cardCountry;
-    }
-
-    @Override
     public String getReferenceId() {
         return referenceId;
     }
diff --git a/payment/src/test/java/com/ning/billing/payment/TestRetryService.java b/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
index 47f16df..cceaccb 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestRetryService.java
@@ -55,11 +55,11 @@ import com.ning.billing.payment.api.PaymentInfoEvent;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.api.PaymentAttempt.PaymentAttemptStatus;
 import com.ning.billing.payment.dao.PaymentDao;
+import com.ning.billing.payment.glue.PaymentTestModuleWithMocks;
 import com.ning.billing.payment.provider.MockPaymentProviderPlugin;
 import com.ning.billing.payment.provider.DefaultPaymentProviderPluginRegistry;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.payment.retry.FailedPaymentRetryService;
-import com.ning.billing.payment.setup.PaymentTestModuleWithMocks;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
diff --git a/server/src/main/java/com/ning/billing/server/modules/KillbillServerModule.java b/server/src/main/java/com/ning/billing/server/modules/KillbillServerModule.java
index ccd5b51..b21195f 100644
--- a/server/src/main/java/com/ning/billing/server/modules/KillbillServerModule.java
+++ b/server/src/main/java/com/ning/billing/server/modules/KillbillServerModule.java
@@ -37,7 +37,7 @@ import com.ning.billing.jaxrs.resources.TagResource;
 import com.ning.billing.jaxrs.util.KillbillEventHandler;
 import com.ning.billing.jaxrs.util.TagHelper;
 import com.ning.billing.junction.glue.DefaultJunctionModule;
-import com.ning.billing.payment.setup.PaymentModule;
+import com.ning.billing.payment.glue.PaymentModule;
 import com.ning.billing.util.glue.BusModule;
 import com.ning.billing.util.glue.CallContextModule;
 import com.ning.billing.util.glue.ClockModule;
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index 46214e9..09641d2 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -67,8 +67,8 @@ import com.ning.billing.jaxrs.json.BundleJsonNoSubsciptions;
 import com.ning.billing.jaxrs.json.SubscriptionJsonNoEvents;
 import com.ning.billing.jaxrs.resources.BaseJaxrsResource;
 import com.ning.billing.junction.glue.DefaultJunctionModule;
+import com.ning.billing.payment.glue.PaymentModule;
 import com.ning.billing.payment.provider.MockPaymentProviderPluginModule;
-import com.ning.billing.payment.setup.PaymentModule;
 import com.ning.billing.server.listeners.KillbillGuiceListener;
 import com.ning.billing.server.modules.KillbillServerModule;
 import com.ning.billing.util.clock.Clock;