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) {