killbill-memoizeit

invoice: Fix NPE exception when retrieving payments associated

6/14/2016 2:42:17 PM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java
index c4b2195..f53b9d0 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoicePayment.java
@@ -450,10 +450,8 @@ public class TestInvoicePayment extends TestIntegrationBase {
         assertTrue(invoice1.getBalance().compareTo(new BigDecimal("249.95")) == 0);
         assertTrue(invoice1.getPaidAmount().compareTo(BigDecimal.ZERO) == 0);
         assertTrue(invoice1.getChargedAmount().compareTo(new BigDecimal("249.95")) == 0);
-        assertEquals(invoice1.getPayments().size(), 1);
-        assertEquals(invoice1.getPayments().get(0).getAmount().compareTo(BigDecimal.ZERO), 0);
-        assertEquals(invoice1.getPayments().get(0).getCurrency(), Currency.USD);
-        assertFalse(invoice1.getPayments().get(0).isSuccess());
+        // Payment is not seen in invoice_payment table
+        assertEquals(invoice1.getPayments().size(), 0);
 
         final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(account.getId(), callContext);
         assertTrue(accountBalance1.compareTo(new BigDecimal("249.95")) == 0);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java
index acf13dc..5cc91c0 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDaoHelper.java
@@ -266,7 +266,14 @@ public class InvoiceDaoHelper {
 
     private void getInvoicePaymentsWithinTransaction(final Iterable<InvoiceModelDao> invoices, final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory, final InternalTenantContext context) {
         final InvoicePaymentSqlDao invoicePaymentSqlDao = entitySqlDaoWrapperFactory.become(InvoicePaymentSqlDao.class);
-        final List<InvoicePaymentModelDao> invoicePaymentsForAccount = invoicePaymentSqlDao.getByAccountRecordId(context);
+        final List<InvoicePaymentModelDao> invoicePaymentsForAccountRaw = invoicePaymentSqlDao.getByAccountRecordId(context);;
+        // Remove entries where payment_id is NULL (we don't know if the payment happened, we never got the second phase from the 2-phase commit protocol)
+        final List<InvoicePaymentModelDao> invoicePaymentsForAccount = ImmutableList.copyOf(Iterables.filter(invoicePaymentsForAccountRaw, new Predicate<InvoicePaymentModelDao>() {
+            @Override
+            public boolean apply(final InvoicePaymentModelDao input) {
+                return input.getPaymentId() != null;
+            }
+        }));
 
         final Map<UUID, List<InvoicePaymentModelDao>> invoicePaymentsPerInvoiceId = new HashMap<UUID, List<InvoicePaymentModelDao>>();
         for (final InvoicePaymentModelDao invoicePayment : invoicePaymentsForAccount) {