killbill-aplcache

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 a2728ec..d1c6127 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
@@ -484,10 +484,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/calculator/InvoiceCalculatorUtils.java b/invoice/src/main/java/org/killbill/billing/invoice/calculator/InvoiceCalculatorUtils.java
index 6ceed50..e751f40 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/calculator/InvoiceCalculatorUtils.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/calculator/InvoiceCalculatorUtils.java
@@ -88,7 +88,7 @@ public abstract class InvoiceCalculatorUtils {
     private static BigDecimal computeInvoiceAmountAdjustedForAccountCredit(final Currency currency, final Iterable<InvoiceItem> invoiceItems) {
         BigDecimal amountAdjusted = BigDecimal.ZERO;
         if (invoiceItems == null || !invoiceItems.iterator().hasNext()) {
-            return amountAdjusted;
+            return KillBillMoney.of(amountAdjusted, currency);
         }
 
         for (final InvoiceItem invoiceItem : invoiceItems) {
@@ -114,7 +114,7 @@ public abstract class InvoiceCalculatorUtils {
     public static BigDecimal computeInvoiceAmountCharged(final Currency currency, @Nullable final Iterable<InvoiceItem> invoiceItems) {
         BigDecimal amountCharged = BigDecimal.ZERO;
         if (invoiceItems == null || !invoiceItems.iterator().hasNext()) {
-            return amountCharged;
+            return KillBillMoney.of(amountCharged, currency);
         }
 
         for (final InvoiceItem invoiceItem : invoiceItems) {
@@ -138,7 +138,7 @@ public abstract class InvoiceCalculatorUtils {
     public static BigDecimal computeInvoiceOriginalAmountCharged(final DateTime invoiceCreatedDate, final Currency currency, @Nullable final Iterable<InvoiceItem> invoiceItems) {
         BigDecimal amountCharged = BigDecimal.ZERO;
         if (invoiceItems == null || !invoiceItems.iterator().hasNext()) {
-            return amountCharged;
+            return KillBillMoney.of(amountCharged, currency);
         }
 
         for (final InvoiceItem invoiceItem : invoiceItems) {
@@ -154,7 +154,7 @@ public abstract class InvoiceCalculatorUtils {
     public static BigDecimal computeInvoiceAmountCredited(final Currency currency, @Nullable final Iterable<InvoiceItem> invoiceItems) {
         BigDecimal amountCredited = BigDecimal.ZERO;
         if (invoiceItems == null || !invoiceItems.iterator().hasNext()) {
-            return amountCredited;
+            return KillBillMoney.of(amountCredited, currency);
         }
 
         for (final InvoiceItem invoiceItem : invoiceItems) {
@@ -169,7 +169,7 @@ public abstract class InvoiceCalculatorUtils {
     public static BigDecimal computeInvoiceAmountPaid(final Currency currency, @Nullable final Iterable<InvoicePayment> invoicePayments) {
         BigDecimal amountPaid = BigDecimal.ZERO;
         if (invoicePayments == null || !invoicePayments.iterator().hasNext()) {
-            return amountPaid;
+            return KillBillMoney.of(amountPaid, currency);
         }
 
         for (final InvoicePayment invoicePayment : invoicePayments) {
@@ -187,7 +187,7 @@ public abstract class InvoiceCalculatorUtils {
     public static BigDecimal computeInvoiceAmountRefunded(final Currency currency, @Nullable final Iterable<InvoicePayment> invoicePayments) {
         BigDecimal amountRefunded = BigDecimal.ZERO;
         if (invoicePayments == null || !invoicePayments.iterator().hasNext()) {
-            return amountRefunded;
+            return KillBillMoney.of(amountRefunded, currency);
         }
 
         for (final InvoicePayment invoicePayment : invoicePayments) {
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 0680144..00b625c 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
@@ -262,7 +262,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) {