killbill-memoizeit
Changes
account/pom.xml 2(+1 -1)
api/pom.xml 2(+1 -1)
beatrix/pom.xml 8(+4 -4)
catalog/pom.xml 2(+1 -1)
currency/pom.xml 2(+1 -1)
entitlement/pom.xml 2(+1 -1)
invoice/pom.xml 2(+1 -1)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 51(+50 -1)
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java 5(+3 -2)
invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java 10(+10 -0)
invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java 195(+189 -6)
invoice/src/test/resources/com/ning/billing/util/template/translation/InvoiceTranslation_en_US.properties 3(+3 -0)
jaxrs/pom.xml 2(+1 -1)
junction/pom.xml 2(+1 -1)
NEWS 4(+4 -0)
osgi/pom.xml 2(+1 -1)
osgi-bundles/bundles/jruby/pom.xml 2(+1 -1)
osgi-bundles/bundles/logger/pom.xml 4(+2 -2)
osgi-bundles/bundles/pom.xml 2(+1 -1)
osgi-bundles/defaultbundles/pom.xml 2(+1 -1)
osgi-bundles/libs/killbill/pom.xml 2(+1 -1)
osgi-bundles/libs/pom.xml 2(+1 -1)
osgi-bundles/libs/slf4j-osgi/pom.xml 2(+1 -1)
osgi-bundles/pom.xml 2(+1 -1)
osgi-bundles/tests/beatrix/pom.xml 2(+1 -1)
osgi-bundles/tests/payment/pom.xml 2(+1 -1)
osgi-bundles/tests/pom.xml 2(+1 -1)
overdue/pom.xml 2(+1 -1)
payment/pom.xml 2(+1 -1)
pom.xml 2(+1 -1)
server/pom.xml 2(+1 -1)
subscription/pom.xml 2(+1 -1)
tenant/pom.xml 2(+1 -1)
usage/pom.xml 2(+1 -1)
util/pom.xml 2(+1 -1)
Details
account/pom.xml 2(+1 -1)
diff --git a/account/pom.xml b/account/pom.xml
index 8754e54..d39e5b6 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-account</artifactId>
api/pom.xml 2(+1 -1)
diff --git a/api/pom.xml b/api/pom.xml
index ada9b8a..550072f 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-internal-api</artifactId>
diff --git a/api/src/main/java/com/ning/billing/invoice/api/formatters/InvoiceFormatterFactory.java b/api/src/main/java/com/ning/billing/invoice/api/formatters/InvoiceFormatterFactory.java
index a957cb4..11924f7 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/formatters/InvoiceFormatterFactory.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/formatters/InvoiceFormatterFactory.java
@@ -18,9 +18,10 @@ package com.ning.billing.invoice.api.formatters;
import java.util.Locale;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.util.template.translation.TranslatorConfig;
public interface InvoiceFormatterFactory {
- public InvoiceFormatter createInvoiceFormatter(TranslatorConfig config, Invoice invoice, Locale locale);
+ public InvoiceFormatter createInvoiceFormatter(TranslatorConfig config, Invoice invoice, Locale locale, CurrencyConversionApi currencyConversionApi);
}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceInternalApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceInternalApi.java
index c982029..54395ce 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceInternalApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceInternalApi.java
@@ -40,7 +40,7 @@ public interface InvoiceInternalApi {
public BigDecimal getAccountBalance(UUID accountId, InternalTenantContext context);
- public void notifyOfPayment(UUID invoiceId, BigDecimal amountOutstanding, Currency currency, UUID paymentId, DateTime paymentDate, InternalCallContext context) throws InvoiceApiException;
+ public void notifyOfPayment(UUID invoiceId, BigDecimal amountOutstanding, Currency currency, Currency processedCurrency, UUID paymentId, DateTime paymentDate, InternalCallContext context) throws InvoiceApiException;
public void notifyOfPayment(InvoicePayment invoicePayment, InternalCallContext context) throws InvoiceApiException;
diff --git a/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java b/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
index 5557241..64abd06 100644
--- a/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
+++ b/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
@@ -39,7 +39,6 @@ public interface TranslatorConfig {
String getCatalogBundlePath();
// Invoices
-
@Config("killbill.template.bundlePath")
@Default("com/ning/billing/util/template/translation/InvoiceTranslation")
@Description("Path to the invoice template translation bundle")
beatrix/pom.xml 8(+4 -4)
diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index af67733..7a6f702 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-beatrix</artifactId>
@@ -240,9 +240,9 @@
</goals>
<configuration>
<tasks>
- <copy file="${basedir}/../osgi-bundles/tests/beatrix/target/killbill-osgi-bundles-test-beatrix-${project.version}-jar-with-dependencies.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-test-beatrix-${project.version}-jar-with-dependencies.jar"></copy>
- <copy file="${basedir}/../osgi-bundles/tests/payment/target/killbill-osgi-bundles-test-payment-${project.version}-jar-with-dependencies.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-test-payment-${project.version}-jar-with-dependencies.jar"></copy>
- <copy file="${basedir}/../osgi-bundles/bundles/jruby/target/killbill-osgi-bundles-jruby-${project.version}.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-jruby-${project.version}.jar"></copy>
+ <copy file="${basedir}/../osgi-bundles/tests/beatrix/target/killbill-osgi-bundles-test-beatrix-${project.version}-jar-with-dependencies.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-test-beatrix-${project.version}-jar-with-dependencies.jar" />
+ <copy file="${basedir}/../osgi-bundles/tests/payment/target/killbill-osgi-bundles-test-payment-${project.version}-jar-with-dependencies.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-test-payment-${project.version}-jar-with-dependencies.jar" />
+ <copy file="${basedir}/../osgi-bundles/bundles/jruby/target/killbill-osgi-bundles-jruby-${project.version}.jar" tofile="${basedir}/src/test/resources/killbill-osgi-bundles-jruby-${project.version}.jar" />
</tasks>
</configuration>
</execution>
catalog/pom.xml 2(+1 -1)
diff --git a/catalog/pom.xml b/catalog/pom.xml
index cba2117..0b3735d 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-catalog</artifactId>
currency/pom.xml 2(+1 -1)
diff --git a/currency/pom.xml b/currency/pom.xml
index 7b19fba..7be89da 100644
--- a/currency/pom.xml
+++ b/currency/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
entitlement/pom.xml 2(+1 -1)
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index e3c9196..94047b3 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-entitlement</artifactId>
invoice/pom.xml 2(+1 -1)
diff --git a/invoice/pom.xml b/invoice/pom.xml
index ced392e..978afd6 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-invoice</artifactId>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index 8eea774..63ca1b2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -97,8 +97,8 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
}
@Override
- public void notifyOfPayment(final UUID invoiceId, final BigDecimal amount, final Currency currency, final UUID paymentId, final DateTime paymentDate, final InternalCallContext context) throws InvoiceApiException {
- final InvoicePayment invoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, paymentDate, amount, currency);
+ public void notifyOfPayment(final UUID invoiceId, final BigDecimal amount, final Currency currency, final Currency processedCurrency, final UUID paymentId, final DateTime paymentDate, final InternalCallContext context) throws InvoiceApiException {
+ final InvoicePayment invoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, paymentDate, amount, currency, processedCurrency);
notifyOfPayment(invoicePayment, context);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index c4ee207..1ea4350 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -334,7 +334,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
final InvoicePaymentModelDao refund = new InvoicePaymentModelDao(UUID.randomUUID(), context.getCreatedDate(), InvoicePaymentType.REFUND,
payment.getInvoiceId(), paymentId,
context.getCreatedDate(), requestedPositiveAmount.negate(),
- payment.getCurrency(), paymentCookieId, payment.getId());
+ payment.getCurrency(), payment.getProcessedCurrency(), paymentCookieId, payment.getId());
transactional.create(refund, context);
// Retrieve invoice after the Refund
@@ -404,7 +404,8 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
}
final InvoicePaymentModelDao chargeBack = new InvoicePaymentModelDao(UUID.randomUUID(), context.getCreatedDate(), InvoicePaymentType.CHARGED_BACK,
payment.getInvoiceId(), payment.getPaymentId(), context.getCreatedDate(),
- requestedChargedBackAmount.negate(), payment.getCurrency(), null, payment.getId());
+ requestedChargedBackAmount.negate(), payment.getCurrency(), payment.getProcessedCurrency(),
+ null, payment.getId());
transactional.create(chargeBack, context);
// Notify the bus since the balance of the invoice changed
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
index 9d07999..54965fd 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoHelper.java
@@ -268,6 +268,13 @@ public class InvoiceDaoHelper {
final InvoicePaymentSqlDao invoicePaymentSqlDao = entitySqlDaoWrapperFactory.become(InvoicePaymentSqlDao.class);
final String invoiceId = invoice.getId().toString();
final List<InvoicePaymentModelDao> invoicePayments = invoicePaymentSqlDao.getPaymentsForInvoice(invoiceId, context);
+ for (final InvoicePaymentModelDao cur : invoicePayments) {
+ if (cur.getCurrency() != cur.getProcessedCurrency()) {
+ // If any entry is set with a different processed currency, we use it as a processed currency.
+ invoice.setProcessedCurrency(cur.getProcessedCurrency());
+ break;
+ }
+ }
invoice.addPayments(invoicePayments);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDao.java
index 77c9a1b..cf3956d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceModelDao.java
@@ -42,6 +42,7 @@ public class InvoiceModelDao extends EntityBase implements EntityModelDao<Invoic
// Note in the database, for convenience only
private List<InvoiceItemModelDao> invoiceItems;
private List<InvoicePaymentModelDao> invoicePayments;
+ private Currency processedCurrency;
public InvoiceModelDao() { /* For the DAO mapper */ }
@@ -86,6 +87,14 @@ public class InvoiceModelDao extends EntityBase implements EntityModelDao<Invoic
return invoicePayments;
}
+ public void setProcessedCurrency(Currency currency) {
+ this.processedCurrency = currency;
+ }
+
+ public Currency getProcessedCurrency() {
+ return processedCurrency != null ? processedCurrency : currency;
+ }
+
public UUID getAccountId() {
return accountId;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentModelDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentModelDao.java
index 6ba00b2..21dddd4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentModelDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentModelDao.java
@@ -36,6 +36,7 @@ public class InvoicePaymentModelDao extends EntityBase implements EntityModelDao
private DateTime paymentDate;
private BigDecimal amount;
private Currency currency;
+ private Currency processedCurrency;
private UUID paymentCookieId;
private UUID linkedInvoicePaymentId;
@@ -43,7 +44,7 @@ public class InvoicePaymentModelDao extends EntityBase implements EntityModelDao
public InvoicePaymentModelDao(final UUID id, final DateTime createdDate, final InvoicePaymentType type, final UUID invoiceId,
final UUID paymentId, final DateTime paymentDate, final BigDecimal amount, final Currency currency,
- final UUID paymentCookieId, final UUID linkedInvoicePaymentId) {
+ final Currency processedCurrency, final UUID paymentCookieId, final UUID linkedInvoicePaymentId) {
super(id, createdDate, createdDate);
this.type = type;
this.invoiceId = invoiceId;
@@ -51,13 +52,14 @@ public class InvoicePaymentModelDao extends EntityBase implements EntityModelDao
this.paymentDate = paymentDate;
this.amount = amount;
this.currency = currency;
+ this.processedCurrency = processedCurrency;
this.paymentCookieId = paymentCookieId;
this.linkedInvoicePaymentId = linkedInvoicePaymentId;
}
public InvoicePaymentModelDao(final InvoicePayment invoicePayment) {
this(invoicePayment.getId(), invoicePayment.getCreatedDate(), invoicePayment.getType(), invoicePayment.getInvoiceId(), invoicePayment.getPaymentId(),
- invoicePayment.getPaymentDate(), invoicePayment.getAmount(), invoicePayment.getCurrency(), invoicePayment.getPaymentCookieId(),
+ invoicePayment.getPaymentDate(), invoicePayment.getAmount(), invoicePayment.getCurrency(), invoicePayment.getProcessedCurrency(), invoicePayment.getPaymentCookieId(),
invoicePayment.getLinkedInvoicePaymentId());
}
@@ -85,6 +87,10 @@ public class InvoicePaymentModelDao extends EntityBase implements EntityModelDao
return currency;
}
+ public Currency getProcessedCurrency() {
+ return processedCurrency;
+ }
+
public UUID getPaymentCookieId() {
return paymentCookieId;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index 4f3d4a0..e75063b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -51,6 +51,8 @@ public class DefaultInvoice extends EntityBase implements Invoice {
private final Currency currency;
private final boolean migrationInvoice;
+ private final Currency processedCurrency;
+
// Used to create a new invoice
public DefaultInvoice(final UUID accountId, final LocalDate invoiceDate, final LocalDate targetDate, final Currency currency) {
this(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, false);
@@ -58,26 +60,27 @@ public class DefaultInvoice extends EntityBase implements Invoice {
public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
- this(invoiceId, null, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
+ this(invoiceId, null, accountId, invoiceNumber, invoiceDate, targetDate, currency, currency, isMigrationInvoice);
}
// Used to hydrate invoice from persistence layer
- private DefaultInvoice(final UUID invoiceId, @Nullable final DateTime createdDate, final UUID accountId,
+ public DefaultInvoice(final UUID invoiceId, @Nullable final DateTime createdDate, final UUID accountId,
@Nullable final Integer invoiceNumber, final LocalDate invoiceDate,
- final LocalDate targetDate, final Currency currency, final boolean isMigrationInvoice) {
+ final LocalDate targetDate, final Currency currency, final Currency processedCurrency, final boolean isMigrationInvoice) {
super(invoiceId, createdDate, createdDate);
this.accountId = accountId;
this.invoiceNumber = invoiceNumber;
this.invoiceDate = invoiceDate;
this.targetDate = targetDate;
this.currency = currency;
+ this.processedCurrency = processedCurrency;
this.migrationInvoice = isMigrationInvoice;
}
public DefaultInvoice(final InvoiceModelDao invoiceModelDao) {
this(invoiceModelDao.getId(), invoiceModelDao.getCreatedDate(), invoiceModelDao.getAccountId(),
invoiceModelDao.getInvoiceNumber(), invoiceModelDao.getInvoiceDate(), invoiceModelDao.getTargetDate(),
- invoiceModelDao.getCurrency(), invoiceModelDao.isMigrated());
+ invoiceModelDao.getCurrency(), invoiceModelDao.getProcessedCurrency(), invoiceModelDao.isMigrated());
addInvoiceItems(Collections2.transform(invoiceModelDao.getInvoiceItems(), new Function<InvoiceItemModelDao, InvoiceItem>() {
@Override
public InvoiceItem apply(final InvoiceItemModelDao input) {
@@ -173,6 +176,10 @@ public class DefaultInvoice extends EntityBase implements Invoice {
return currency;
}
+ public Currency getProcessedCurrency() {
+ return processedCurrency;
+ }
+
@Override
public boolean isMigrationInvoice() {
return migrationInvoice;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
index 2d4f814..2d6653f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
@@ -37,22 +37,23 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
private final DateTime paymentDate;
private final BigDecimal amount;
private final Currency currency;
+ private final Currency processedCurrency;
private final UUID paymentCookieId;
private final UUID linkedInvoicePaymentId;
public DefaultInvoicePayment(final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
- final BigDecimal amount, final Currency currency) {
- this(UUID.randomUUID(), null, type, paymentId, invoiceId, paymentDate, amount, currency, null, null);
+ final BigDecimal amount, final Currency currency, final Currency processedCurrency) {
+ this(UUID.randomUUID(), null, type, paymentId, invoiceId, paymentDate, amount, currency, processedCurrency, null, null);
}
public DefaultInvoicePayment(final UUID id, final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
- @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final UUID paymentCookieId,
+ @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final Currency processedCurrency, @Nullable final UUID paymentCookieId,
@Nullable final UUID linkedInvoicePaymentId) {
- this(id, null, type, paymentId, invoiceId, paymentDate, amount, currency, paymentCookieId, linkedInvoicePaymentId);
+ this(id, null, type, paymentId, invoiceId, paymentDate, amount, currency, processedCurrency, paymentCookieId, linkedInvoicePaymentId);
}
public DefaultInvoicePayment(final UUID id, @Nullable final DateTime createdDate, final InvoicePaymentType type, final UUID paymentId, final UUID invoiceId, final DateTime paymentDate,
- @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final UUID paymentCookieId,
+ @Nullable final BigDecimal amount, @Nullable final Currency currency, @Nullable final Currency processedCurrency, @Nullable final UUID paymentCookieId,
@Nullable final UUID linkedInvoicePaymentId) {
super(id, createdDate, createdDate);
this.type = type;
@@ -61,6 +62,7 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
this.invoiceId = invoiceId;
this.paymentDate = paymentDate;
this.currency = currency;
+ this.processedCurrency =processedCurrency;
this.paymentCookieId = paymentCookieId;
this.linkedInvoicePaymentId = linkedInvoicePaymentId;
}
@@ -68,7 +70,8 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
public DefaultInvoicePayment(final InvoicePaymentModelDao invoicePaymentModelDao) {
this(invoicePaymentModelDao.getId(), invoicePaymentModelDao.getCreatedDate(), invoicePaymentModelDao.getType(),
invoicePaymentModelDao.getPaymentId(), invoicePaymentModelDao.getInvoiceId(), invoicePaymentModelDao.getPaymentDate(),
- invoicePaymentModelDao.getAmount(), invoicePaymentModelDao.getCurrency(), invoicePaymentModelDao.getPaymentCookieId(),
+ invoicePaymentModelDao.getAmount(), invoicePaymentModelDao.getCurrency(), invoicePaymentModelDao.getProcessedCurrency(),
+ invoicePaymentModelDao.getPaymentCookieId(),
invoicePaymentModelDao.getLinkedInvoicePaymentId());
}
@@ -112,4 +115,9 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment
return paymentCookieId;
}
+ @Override
+ public Currency getProcessedCurrency() {
+ return processedCurrency;
+ }
+
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 23bad28..f184bf8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
@@ -28,8 +29,14 @@ import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.currency.api.CurrencyConversion;
+import com.ning.billing.currency.api.CurrencyConversionApi;
+import com.ning.billing.currency.api.CurrencyConversionException;
+import com.ning.billing.currency.api.Rate;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
@@ -37,6 +44,7 @@ import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
+import com.ning.billing.invoice.model.DefaultInvoice;
import com.ning.billing.util.template.translation.TranslatorConfig;
import com.google.common.base.Objects;
@@ -50,16 +58,20 @@ import static com.ning.billing.util.DefaultAmountFormatter.round;
*/
public class DefaultInvoiceFormatter implements InvoiceFormatter {
+ private final static Logger logger = LoggerFactory.getLogger(DefaultInvoiceFormatter.class);
+
private final TranslatorConfig config;
private final Invoice invoice;
private final DateTimeFormatter dateFormatter;
private final Locale locale;
+ private final CurrencyConversionApi currencyConversionApi;
- public DefaultInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
+ public DefaultInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale, final CurrencyConversionApi currencyConversionApi) {
this.config = config;
this.invoice = invoice;
dateFormatter = DateTimeFormat.mediumDate().withLocale(locale);
this.locale = locale;
+ this.currencyConversionApi = currencyConversionApi;
}
@Override
@@ -211,6 +223,43 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
}
@Override
+ public Currency getProcessedCurrency() {
+ final Currency processedCurrency = ((DefaultInvoice) invoice).getProcessedCurrency();
+ // If the processed currency is different we return it; otherwise we return null so that template does not print anything special
+ return (processedCurrency != getCurrency()) ? processedCurrency : null;
+ }
+
+ @Override
+ public String getProcessedPaymentRate() {
+ final Currency currency = getProcessedCurrency();
+ if (currency == null) {
+ return null;
+ }
+ // If there were multiple payments (and refunds) we pick chose the last one
+ DateTime latestPaymentDate = null;
+ final Iterator<InvoicePayment> paymentIterator = ((DefaultInvoice) invoice).getPayments().iterator();
+ while (paymentIterator.hasNext()) {
+ final InvoicePayment cur = paymentIterator.next();
+ latestPaymentDate = latestPaymentDate != null && latestPaymentDate.isAfter(cur.getPaymentDate()) ?
+ latestPaymentDate : cur.getPaymentDate();
+
+ }
+ try {
+ final CurrencyConversion conversion = currencyConversionApi.getCurrencyConversion(currency, latestPaymentDate);
+ for (Rate rate : conversion.getRates()) {
+ if (rate.getCurrency() == getCurrency()) {
+ return rate.getValue().toString();
+ }
+ }
+ } catch (CurrencyConversionException e) {
+ logger.warn("Failed to retrieve currency conversion rates for currency = " + currency + " and date = " + latestPaymentDate, e);
+ return null;
+ }
+ logger.warn("Failed to retrieve currency conversion rates for currency = " + currency + " and date = " + latestPaymentDate);
+ return null;
+ }
+
+ @Override
public boolean isMigrationInvoice() {
return invoice.isMigrationInvoice();
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
index 9afc946..dcb86b7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
@@ -18,6 +18,7 @@ package com.ning.billing.invoice.template.formatters;
import java.util.Locale;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
@@ -26,7 +27,7 @@ import com.ning.billing.util.template.translation.TranslatorConfig;
public class DefaultInvoiceFormatterFactory implements InvoiceFormatterFactory {
@Override
- public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
- return new DefaultInvoiceFormatter(config, invoice, locale);
+ public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale, CurrencyConversionApi currencyConversionApi) {
+ return new DefaultInvoiceFormatter(config, invoice, locale, currencyConversionApi);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
index e142348..12ca496 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
@@ -24,6 +24,7 @@ import java.util.Map;
import javax.annotation.Nullable;
import com.ning.billing.account.api.Account;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
@@ -39,12 +40,15 @@ public class HtmlInvoiceGenerator {
private final InvoiceFormatterFactory factory;
private final TemplateEngine templateEngine;
private final TranslatorConfig config;
+ private final CurrencyConversionApi currencyConversionApi;
@Inject
- public HtmlInvoiceGenerator(final InvoiceFormatterFactory factory, final TemplateEngine templateEngine, final TranslatorConfig config) {
+ public HtmlInvoiceGenerator(final InvoiceFormatterFactory factory, final TemplateEngine templateEngine,
+ final TranslatorConfig config, final CurrencyConversionApi currencyConversionApi) {
this.factory = factory;
this.templateEngine = templateEngine;
this.config = config;
+ this.currencyConversionApi = currencyConversionApi;
}
public String generateInvoice(final Account account, @Nullable final Invoice invoice, final boolean manualPay) throws IOException {
@@ -60,7 +64,7 @@ public class HtmlInvoiceGenerator {
data.put("text", invoiceTranslator);
data.put("account", account);
- final InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale);
+ final InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale, currencyConversionApi);
data.put("invoice", formattedInvoice);
if (manualPay) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java b/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
index 6980185..7a85fc0 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
@@ -135,4 +135,14 @@ public class DefaultInvoiceTranslator extends DefaultTranslatorBase implements I
public String getInvoiceBalance() {
return getTranslation(locale, "invoiceBalance");
}
+
+ @Override
+ public String getProcessedPaymentCurrency() {
+ return getTranslation(locale, "processedPaymentCurrency");
+ }
+
+ @Override
+ public String getProcessedPaymentRate() {
+ return getTranslation(locale, "processedPaymentRate");
+ }
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java b/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
index 75bd117..9e6faf4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
@@ -54,4 +54,8 @@ public interface InvoiceStrings {
String getInvoiceAmountPaid();
String getInvoiceBalance();
+
+ String getProcessedPaymentCurrency();
+
+ String getProcessedPaymentRate();
}
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 6428f7c..8d1383d 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -9,6 +9,7 @@ tableFields(prefix) ::= <<
, <prefix>payment_date
, <prefix>amount
, <prefix>currency
+, <prefix>processed_currency
, <prefix>payment_cookie_id
, <prefix>linked_invoice_payment_id
, <prefix>created_by
@@ -22,6 +23,7 @@ tableValues() ::= <<
, :paymentDate
, :amount
, :currency
+, :processedCurrency
, :paymentCookieId
, :linkedInvoicePaymentId
, :createdBy
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
index 10e4eec..50d736e 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -58,7 +58,8 @@ CREATE TABLE invoice_payments (
payment_date datetime NOT NULL,
amount numeric(10,4) NOT NULL,
currency char(3) NOT NULL,
- payment_cookie_id char(36) DEFAULT NULL,
+ processed_currency char(3) NOT NULL,
+ payment_cookie_id char(36) DEFAULT NULL,
linked_invoice_payment_id char(36) DEFAULT NULL,
created_by varchar(50) NOT NULL,
created_date datetime NOT NULL,
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
index c3088e6..91bb02a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
@@ -95,7 +95,7 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
if (existingPayment != null) {
invoicePayments.add(new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.CHARGED_BACK, null, null, DateTime.now(DateTimeZone.UTC), amount,
- Currency.USD, null, existingPayment.getId()));
+ existingPayment.getCurrency(), existingPayment.getProcessedCurrency(), null, existingPayment.getId()));
}
return existingPayment;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index c222d80..2ad6556 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -143,7 +143,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
final BigDecimal paymentAmount = new BigDecimal("11.00");
final UUID paymentId = UUID.randomUUID();
- final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD);
+ final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD, Currency.USD);
invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoiceId, context);
@@ -514,7 +514,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
invoiceUtil.createInvoiceItem(item2, context);
final BigDecimal payment1 = new BigDecimal("48.0");
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
@@ -579,7 +579,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
invoiceUtil.createInvoice(invoice1, true, context);
final BigDecimal payment1 = new BigDecimal("48.0");
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
final BigDecimal balance = invoiceDao.getAccountBalance(accountId, context);
@@ -620,7 +620,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
// Pay the whole thing
final UUID paymentId = UUID.randomUUID();
final BigDecimal payment1 = rate1;
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
balance = invoiceDao.getAccountBalance(accountId, context);
assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
@@ -669,7 +669,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
// Pay the whole thing
final UUID paymentId = UUID.randomUUID();
final BigDecimal payment1 = amount;
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
balancePriorRefund = invoiceDao.getAccountBalance(accountId, context);
assertEquals(balancePriorRefund.compareTo(new BigDecimal("0.00")), 0);
@@ -775,7 +775,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
// Pay the whole thing
final UUID paymentId = UUID.randomUUID();
final BigDecimal payment1 = amount1.add(rate1);
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
balance = invoiceDao.getAccountBalance(accountId, context);
assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
@@ -861,7 +861,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
// Pay the whole thing
final BigDecimal payment1 = amount1.add(rate1);
- final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
+ final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD, Currency.USD);
invoiceUtil.createPayment(payment, context);
balance = invoiceDao.getAccountBalance(accountId, context);
assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
@@ -884,7 +884,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
assertEquals(cba.compareTo(new BigDecimal("10.00")), 0);
// partial REFUND on the payment (along with CBA generated by the system)
- final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), rate2.negate(), Currency.USD, null, payment.getId());
+ final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), rate2.negate(), Currency.USD,
+ Currency.USD, null, payment.getId());
invoiceUtil.createPayment(refund, context);
final CreditBalanceAdjInvoiceItem cbaItem2 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
invoiceUtil.createInvoiceItem(cbaItem2, context);
@@ -1299,7 +1300,7 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
// SECOND CREATE THE PAYMENT
final BigDecimal paymentAmount = new BigDecimal("239.00");
final UUID paymentId = UUID.randomUUID();
- final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow(), paymentAmount, Currency.USD);
+ final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoiceId, clock.getUTCNow(), paymentAmount, Currency.USD, Currency.USD);
invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
// AND THEN THIRD THE REFUND
@@ -1443,7 +1444,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
fixedItem1.getCurrency());
final UUID paymentId = UUID.randomUUID();
- final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), new BigDecimal("10.0"), Currency.USD);
+ final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), new BigDecimal("10.0"),
+ Currency.USD, Currency.USD);
invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
@@ -1509,7 +1511,8 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
final BigDecimal paymentAmount = new BigDecimal("10.00");
final UUID paymentId = UUID.randomUUID();
- final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD);
+ final DefaultInvoicePayment defaultInvoicePayment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), clock.getUTCNow().plusDays(12), paymentAmount,
+ Currency.USD, Currency.USD);
invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), context);
// Create invoice 2
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index d8db31e..91cc531 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -877,7 +877,8 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
invoices.add(invoice1);
// pay the invoice
- invoice1.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), april25.toDateTimeAtCurrentTime(), TEN, Currency.USD));
+ invoice1.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), april25.toDateTimeAtCurrentTime(), TEN,
+ Currency.USD, Currency.USD));
assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
// change the plan (i.e. repair) on start date
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
index 795571a..e6460e5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -16,11 +16,23 @@
package com.ning.billing.invoice.glue;
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.mockito.Mockito;
import org.skife.config.ConfigSource;
import com.ning.billing.GuicyKillbillTestNoDBModule;
import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.currency.api.CurrencyConversion;
+import com.ning.billing.currency.api.CurrencyConversionApi;
+import com.ning.billing.currency.api.CurrencyConversionException;
+import com.ning.billing.currency.api.Rate;
import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.dao.MockInvoiceDao;
import com.ning.billing.mock.glue.MockNonEntityDaoModule;
@@ -46,5 +58,42 @@ public class TestInvoiceModuleNoDB extends TestInvoiceModule {
bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
bind(AccountUserApi.class).toInstance(Mockito.mock(AccountUserApi.class));
+
+ installCurrencyConversionApi();
+ }
+
+ private void installCurrencyConversionApi() {
+ final CurrencyConversionApi currencyConversionApi = Mockito.mock(CurrencyConversionApi.class);
+ final CurrencyConversion currencyConversion = Mockito.mock(CurrencyConversion.class);
+ final Set<Rate> rates = new HashSet<Rate>();
+ rates.add(new Rate() {
+ @Override
+ public Currency getBaseCurrency() {
+ return Currency.USD;
+ }
+
+ @Override
+ public Currency getCurrency() {
+ return Currency.BRL;
+ }
+
+ @Override
+ public BigDecimal getValue() {
+ return new BigDecimal("0.4234");
+ }
+
+ @Override
+ public DateTime getConversionDate() {
+ return new DateTime(DateTimeZone.UTC);
+ }
+ });
+ Mockito.when(currencyConversion.getRates()).thenReturn(rates);
+ try {
+ Mockito.when(currencyConversionApi.getCurrencyConversion(Mockito.<Currency>any(), Mockito.<DateTime>any())).thenReturn(currencyConversion);
+ } catch (CurrencyConversionException e) {
+ throw new RuntimeException(e);
+ }
+
+ bind(CurrencyConversionApi.class).toInstance(currencyConversionApi);
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
index d491c30..3b2945e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
@@ -16,10 +16,12 @@
package com.ning.billing.invoice.glue;
+import org.mockito.Mockito;
import org.skife.config.ConfigSource;
import com.ning.billing.GuicyKillbillTestWithEmbeddedDBModule;
import com.ning.billing.account.glue.DefaultAccountModule;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.InvoiceListener;
import com.ning.billing.invoice.TestInvoiceNotificationQListener;
import com.ning.billing.util.glue.BusModule;
@@ -46,5 +48,7 @@ public class TestInvoiceModuleWithEmbeddedDb extends TestInvoiceModule {
install(new NonEntityDaoModule());
install(new MetricsModule());
install(new BusModule(configSource));
+
+ bind(CurrencyConversionApi.class).toInstance(Mockito.mock(CurrencyConversionApi.class));
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
index fc14b9b..5e1403e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -28,6 +28,7 @@ import org.testng.annotations.BeforeMethod;
import com.ning.billing.GuicyKillbillTestSuiteNoDB;
import com.ning.billing.bus.api.PersistentBus;
import com.ning.billing.commons.locker.GlobalLocker;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.api.InvoiceMigrationApi;
import com.ning.billing.invoice.api.InvoicePaymentApi;
import com.ning.billing.invoice.api.InvoiceUserApi;
@@ -86,6 +87,8 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
protected InvoiceDao invoiceDao;
@Inject
protected TestInvoiceHelper invoiceUtil;
+ @Inject
+ protected CurrencyConversionApi currencyConversionApi;
private void loadSystemPropertiesFromClasspath(final String resource) {
final URL url = InvoiceTestSuiteNoDB.class.getResource(resource);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index df64133..a698b20 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -36,6 +36,7 @@ import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.invoice.api.InvoicePaymentType;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
+import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
import com.ning.billing.invoice.model.DefaultInvoice;
@@ -43,6 +44,7 @@ import com.ning.billing.invoice.model.DefaultInvoicePayment;
import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
import com.ning.billing.invoice.model.RefundAdjInvoiceItem;
import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
+import com.ning.billing.invoice.template.translator.DefaultInvoiceTranslator;
import com.ning.billing.util.email.templates.MustacheTemplateEngine;
import com.ning.billing.util.template.translation.TranslatorConfig;
@@ -84,7 +86,7 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
Assert.assertEquals(invoice.getCreditedAmount().doubleValue(), 0.00);
// Verify the merge
- final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US);
+ final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US, null);
final List<InvoiceItem> invoiceItems = formatter.getInvoiceItems();
Assert.assertEquals(invoiceItems.size(), 1);
Assert.assertEquals(invoiceItems.get(0).getInvoiceItemType(), InvoiceItemType.FIXED);
@@ -121,22 +123,24 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
final RefundAdjInvoiceItem refundAdjInvoiceItem = new RefundAdjInvoiceItem(fixedItem.getInvoiceId(), fixedItem.getAccountId(),
fixedItem.getStartDate(), BigDecimal.ONE.negate(), fixedItem.getCurrency());
final DefaultInvoice invoice = new DefaultInvoice(fixedItem.getInvoiceId(), fixedItem.getAccountId(), null,
- new LocalDate(), new LocalDate(), Currency.USD, false);
+ new LocalDate(), new LocalDate(), Currency.USD, false);
invoice.addInvoiceItem(fixedItem);
invoice.addInvoiceItem(repairAdjInvoiceItem);
invoice.addInvoiceItem(creditBalanceAdjInvoiceItem);
invoice.addInvoiceItem(creditAdjInvoiceItem);
invoice.addInvoiceItem(creditBalanceAdjInvoiceItem2);
invoice.addInvoiceItem(refundAdjInvoiceItem);
- invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.TEN, Currency.USD));
- invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.REFUND, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.ONE.negate(), Currency.USD));
+ invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.TEN,
+ Currency.USD, Currency.USD));
+ invoice.addPayment(new DefaultInvoicePayment(InvoicePaymentType.REFUND, UUID.randomUUID(), invoice.getId(), clock.getUTCNow(), BigDecimal.ONE.negate(),
+ Currency.USD, Currency.USD));
// Check the scenario
Assert.assertEquals(invoice.getBalance().doubleValue(), 0.00);
Assert.assertEquals(invoice.getCreditedAmount().doubleValue(), 11.00);
Assert.assertEquals(invoice.getRefundedAmount().doubleValue(), -1.00);
// Verify the merge
- final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US);
+ final InvoiceFormatter formatter = new DefaultInvoiceFormatter(config, invoice, Locale.US, null);
final List<InvoiceItem> invoiceItems = formatter.getInvoiceItems();
Assert.assertEquals(invoiceItems.size(), 4);
Assert.assertEquals(invoiceItems.get(0).getInvoiceItemType(), InvoiceItemType.FIXED);
@@ -179,9 +183,188 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
Locale.FRANCE);
}
+
+ @Test(groups = "fast")
+ public void testProcessedCurrencyExists() throws Exception {
+ final Invoice invoice = new DefaultInvoice(UUID.randomUUID(), clock.getUTCNow(), UUID.randomUUID(), new Integer(234), new LocalDate(), new LocalDate(), Currency.BRL, Currency.USD, false);
+
+ checkOutput(invoice,
+ "{{#invoice.processedCurrency}}" +
+ "<tr>\n" +
+ " <td class=\"processedCurrency\"><strong>{{invoice.processedCurrency}}</strong></td>\n" +
+ "</tr>\n" +
+ "{{/invoice.processedCurrency}}",
+ "<tr>\n" +
+ " <td class=\"processedCurrency\"><strong>USD</strong></td>\n" +
+ "</tr>\n",
+ Locale.US);
+ }
+
+ @Test(groups = "fast")
+ public void testProcessedCurrencyDoesNotExist() throws Exception {
+ final Invoice invoice = new DefaultInvoice(UUID.randomUUID(), clock.getUTCNow(), UUID.randomUUID(), new Integer(234), new LocalDate(), new LocalDate(), Currency.USD, Currency.USD, false);
+
+ checkOutput(invoice,
+ "{{#invoice.processedCurrency}}" +
+ "<tr>\n" +
+ " <td class=\"processedCurrency\"><strong>{{invoice.processedCurrency}}</strong></td>\n" +
+ "</tr>\n" +
+ "{{/invoice.processedCurrency}}",
+ "",
+ Locale.US);
+ }
+
+ // No Assertion, just to print the html
+ @Test(groups = "fast")
+ public void testForDisplay() throws Exception {
+
+ final FixedPriceInvoiceItem fixedItemBRL = new FixedPriceInvoiceItem(UUID.randomUUID(), UUID.randomUUID(), null, null,
+ UUID.randomUUID().toString(), UUID.randomUUID().toString(),
+ new LocalDate(), new BigDecimal("1499.95"), Currency.BRL);
+ final Invoice invoice = new DefaultInvoice(UUID.randomUUID(), clock.getUTCNow(), UUID.randomUUID(), new Integer(234), new LocalDate(), new LocalDate(), Currency.BRL, Currency.BRL, false);
+ invoice.addInvoiceItem(fixedItemBRL);
+
+ final String template = "<html>\n" +
+ " <head>\n" +
+ " <style type=\"text/css\">\n" +
+ " #header td { width: 250px; }\n" +
+ " #header .company_info { width: 450px; }\n" +
+ " #header .label { text-align: right; font-weight: bold; }\n" +
+ " #header .label_value { padding-left: 10px; }\n" +
+ "\n" +
+ " #invoice_items { margin-top: 50px; }\n" +
+ " #invoice_items th { border-bottom: solid 2px black; }\n" +
+ " #invoice_items td { width: 250px; }\n" +
+ " #invoice_items td.amount { width: 125px; }\n" +
+ " #invoice_items td.network { width: 350px; }\n" +
+ " #invoice_items .amount { text-align: right; }\n" +
+ " #invoice_items .label { text-align: right; font-weight: bold; }\n" +
+ " </style>\n" +
+ " </head>\n" +
+ " <body>\n" +
+ " <table id=\"header\">\n" +
+ " <tr>\n" +
+ " <td class=\"company_info\"/>\n" +
+ " <td />\n" +
+ " <td><h1>{{text.invoiceTitle}}</h1></td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td colspan=\"3\"><img src=\"http://static.foo.com/www/0/main/gfx/front/logo.png\"/></td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td class=\"company_info\" />\n" +
+ " <td class=\"label\">{{text.invoiceDate}}</td>\n" +
+ " <td class=\"label_value\">{{invoice.formattedInvoiceDate}}</td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td class=\"company_info\" />\n" +
+ " <td class=\"label\">{{text.invoiceNumber}}</td>\n" +
+ " <td class=\"label_value\">{{invoice.invoiceNumber}}</td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td class=\"company_info\">{{text.companyCountry}}</td>\n" +
+ " <td colspan=\"2\" />\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td class=\"company_info\">{{text.companyUrl}}</td>\n" +
+ " <td colspan=\"2\" />\n" +
+ " </tr>\n" +
+ " </table>\n" +
+ "\n" +
+ " <table id=\"invoice_items\">\n" +
+ " <tr>\n" +
+ " <th class=\"network\">{{text.invoiceItemBundleName}}</td>\n" +
+ " <th>{{text.invoiceItemDescription}}</td>\n" +
+ " <th>{{text.invoiceItemServicePeriod}}</td>\n" +
+ " <th>{{text.invoiceItemAmount}}</td>\n" +
+ " </tr>\n" +
+ " {{#invoice.invoiceItems}}\n" +
+ " <tr>\n" +
+ " <td class=\"network\">{{description}}</td>\n" +
+ " <td>{{planName}}</td>\n" +
+ " <td>{{formattedStartDate}}{{#formattedEndDate}} - {{formattedEndDate}}{{/formattedEndDate}}</td>\n" +
+ " <td class=\"amount\">{{formattedAmount}}</td>\n" +
+ " </tr>\n" +
+ " {{/invoice.invoiceItems}}\n" +
+ " <tr>\n" +
+ " <td colspan=\"4\" height=\"50px\"></td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td colspan=\"2\" />\n" +
+ " <td class=\"label\">{{text.invoiceAmount}}</td>\n" +
+ " <td class=\"amount\"><strong>{{invoice.formattedChargedAmount}}</strong></td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td colspan=\"2\" />\n" +
+ " <td class=\"label\">{{text.invoiceAmountPaid}}" +
+ " {{#invoice.processedCurrency}}" +
+ " (*)" +
+ " {{/invoice.processedCurrency}}\n" +
+ " </td>\n" +
+ " <td class=\"amount\"><strong>{{invoice.formattedPaidAmount}}</strong></td>\n" +
+ " </tr>\n" +
+ " <tr>\n" +
+ " <td colspan=\"2\" />\n" +
+ " <td class=\"label\">{{text.invoiceBalance}}</td>\n" +
+ " <td class=\"amount\"><strong>{{invoice.formattedBalance}}</strong></td>\n" +
+ " </tr>\n" +
+ " </table>\n" +
+ " {{#invoice.processedCurrency}}" +
+ " {{text.processedPaymentCurrency}} {{invoice.processedCurrency}}." +
+ " {{#invoice.processedPaymentRate}}\n" +
+ " {{text.processedPaymentRate}} {{invoice.processedPaymentRate}}.\n" +
+ " {{/invoice.processedPaymentRate}}" +
+ " {{/invoice.processedCurrency}}" +
+ " </body>\n" +
+ "</html>\n";
+
+ final Map<String, Object> data = new HashMap<String, Object>();
+
+ final DefaultInvoiceTranslator translator = new DefaultInvoiceTranslator(new TranslatorConfig() {
+ @Override
+ public String getDefaultLocale() {
+ return "en_US";
+ }
+
+ @Override
+ public String getCatalogBundlePath() {
+ return null;
+ }
+
+ @Override
+ public String getInvoiceTemplateBundlePath() {
+ return "com/ning/billing/util/template/translation/InvoiceTranslation";
+ }
+
+ @Override
+ public String getTemplateName() {
+ return null;
+ }
+
+ @Override
+ public String getManualPayTemplateName() {
+ return null;
+ }
+
+ @Override
+ public Class<? extends InvoiceFormatterFactory> getInvoiceFormatterFactoryClass() {
+ return null;
+ }
+ });
+ translator.setLocale(Locale.US);
+ data.put("text", translator);
+
+ data.put("invoice", new DefaultInvoiceFormatter(config, invoice, Locale.US, currencyConversionApi));
+
+ final String formattedText = templateEngine.executeTemplateText(template, data);
+
+ System.out.println(formattedText);
+ }
+
+
private void checkOutput(final Invoice invoice, final String template, final String expected, final Locale locale) {
final Map<String, Object> data = new HashMap<String, Object>();
- data.put("invoice", new DefaultInvoiceFormatter(config, invoice, locale));
+ data.put("invoice", new DefaultInvoiceFormatter(config, invoice, locale, null));
final String formattedText = templateEngine.executeTemplateText(template, data);
Assert.assertEquals(formattedText, expected);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
index fd00f39..ce9a813 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -53,7 +53,7 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
final TemplateEngine templateEngine = new MustacheTemplateEngine();
final InvoiceFormatterFactory factory = new DefaultInvoiceFormatterFactory();
- g = new HtmlInvoiceGenerator(factory, templateEngine, config);
+ g = new HtmlInvoiceGenerator(factory, templateEngine, config, null);
}
@Test(groups = "fast")
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
index 62333fe..85ee2b6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoiceTestUtils.java
@@ -112,6 +112,7 @@ public class InvoiceTestUtils {
Mockito.when(payment.getPaymentDate()).thenReturn(clock.getUTCNow());
Mockito.when(payment.getAmount()).thenReturn(amount);
Mockito.when(payment.getCurrency()).thenReturn(currency);
+ Mockito.when(payment.getProcessedCurrency()).thenReturn(currency);
invoicePaymentApi.notifyOfPayment(payment, callContext);
diff --git a/invoice/src/test/resources/com/ning/billing/util/template/translation/InvoiceTranslation_en_US.properties b/invoice/src/test/resources/com/ning/billing/util/template/translation/InvoiceTranslation_en_US.properties
index 4c259d6..02d074a 100644
--- a/invoice/src/test/resources/com/ning/billing/util/template/translation/InvoiceTranslation_en_US.properties
+++ b/invoice/src/test/resources/com/ning/billing/util/template/translation/InvoiceTranslation_en_US.properties
@@ -17,3 +17,6 @@ invoiceItemBundleName=Weapon
invoiceItemDescription=Description
invoiceItemServicePeriod=Service Period
invoiceItemAmount=Amount
+
+processedPaymentCurrency=(*) The payment was processed in
+processedPaymentRate=The rate applied was
jaxrs/pom.xml 2(+1 -1)
diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 4354fd5..ba8636a 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-jaxrs</artifactId>
junction/pom.xml 2(+1 -1)
diff --git a/junction/pom.xml b/junction/pom.xml
index eff2d17..28e9ae3 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-junction</artifactId>
NEWS 4(+4 -0)
diff --git a/NEWS b/NEWS
index f9ee9a0..87dacb3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+0.7.1
+ Add support for currency conversion plugin type
+ Allow payments/refund to be processed by plugin in a different currency than the one on the account
+
0.7.0
Initial support for pagination
Entitlement bugfixes
osgi/pom.xml 2(+1 -1)
diff --git a/osgi/pom.xml b/osgi/pom.xml
index fd4dee9..56eaec9 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi</artifactId>
osgi-bundles/bundles/jruby/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/bundles/jruby/pom.xml b/osgi-bundles/bundles/jruby/pom.xml
index fdf4aae..341f7dd 100644
--- a/osgi-bundles/bundles/jruby/pom.xml
+++ b/osgi-bundles/bundles/jruby/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>com.ning.billing</groupId>
<artifactId>killbill-osgi-bundles</artifactId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-jruby</artifactId>
osgi-bundles/bundles/logger/pom.xml 4(+2 -2)
diff --git a/osgi-bundles/bundles/logger/pom.xml b/osgi-bundles/bundles/logger/pom.xml
index 08878bf..0f04ca8 100644
--- a/osgi-bundles/bundles/logger/pom.xml
+++ b/osgi-bundles/bundles/logger/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-logger</artifactId>
@@ -56,7 +56,7 @@
<configuration>
<instructions>
<Bundle-Activator>com.ning.billing.osgi.bundles.logger.Activator</Bundle-Activator>
- <Export-Package></Export-Package>
+ <Export-Package />
<Private-Package>com.ning.billing.osgi.bundles.logger.*</Private-Package>
<!-- Optional resolution because exported by the Felix system bundle -->
<Import-Package>*;resolution:=optional</Import-Package>
osgi-bundles/bundles/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/bundles/pom.xml b/osgi-bundles/bundles/pom.xml
index 2dfafd7..2c756e8 100644
--- a/osgi-bundles/bundles/pom.xml
+++ b/osgi-bundles/bundles/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-all-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles</artifactId>
diff --git a/osgi-bundles/bundles/webconsolebranding/pom.xml b/osgi-bundles/bundles/webconsolebranding/pom.xml
index 4d26bac..ed32258 100644
--- a/osgi-bundles/bundles/webconsolebranding/pom.xml
+++ b/osgi-bundles/bundles/webconsolebranding/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-webconsolebranding</artifactId>
osgi-bundles/defaultbundles/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/defaultbundles/pom.xml b/osgi-bundles/defaultbundles/pom.xml
index f80a403..ddb02b6 100644
--- a/osgi-bundles/defaultbundles/pom.xml
+++ b/osgi-bundles/defaultbundles/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-all-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-defaultbundles</artifactId>
osgi-bundles/libs/killbill/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/libs/killbill/pom.xml b/osgi-bundles/libs/killbill/pom.xml
index f71ffd4..27d5103 100644
--- a/osgi-bundles/libs/killbill/pom.xml
+++ b/osgi-bundles/libs/killbill/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-lib-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-lib-killbill</artifactId>
osgi-bundles/libs/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/libs/pom.xml b/osgi-bundles/libs/pom.xml
index 35d079d..50df835 100644
--- a/osgi-bundles/libs/pom.xml
+++ b/osgi-bundles/libs/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-all-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-lib-bundles</artifactId>
osgi-bundles/libs/slf4j-osgi/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/libs/slf4j-osgi/pom.xml b/osgi-bundles/libs/slf4j-osgi/pom.xml
index 42edfc7..3bc522e 100644
--- a/osgi-bundles/libs/slf4j-osgi/pom.xml
+++ b/osgi-bundles/libs/slf4j-osgi/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-lib-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-lib-slf4j-osgi</artifactId>
osgi-bundles/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/pom.xml b/osgi-bundles/pom.xml
index 232d288..db01a7d 100644
--- a/osgi-bundles/pom.xml
+++ b/osgi-bundles/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-all-bundles</artifactId>
osgi-bundles/tests/beatrix/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/tests/beatrix/pom.xml b/osgi-bundles/tests/beatrix/pom.xml
index 058f56e..412a6a1 100644
--- a/osgi-bundles/tests/beatrix/pom.xml
+++ b/osgi-bundles/tests/beatrix/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-test-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-test-beatrix</artifactId>
osgi-bundles/tests/payment/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/tests/payment/pom.xml b/osgi-bundles/tests/payment/pom.xml
index b8a013c..7f072a4 100644
--- a/osgi-bundles/tests/payment/pom.xml
+++ b/osgi-bundles/tests/payment/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-test-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-bundles-test-payment</artifactId>
osgi-bundles/tests/pom.xml 2(+1 -1)
diff --git a/osgi-bundles/tests/pom.xml b/osgi-bundles/tests/pom.xml
index f1d8698..8e0c65d 100644
--- a/osgi-bundles/tests/pom.xml
+++ b/osgi-bundles/tests/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill-osgi-all-bundles</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-osgi-test-bundles</artifactId>
overdue/pom.xml 2(+1 -1)
diff --git a/overdue/pom.xml b/overdue/pom.xml
index 4a4787e..363a06b 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-overdue</artifactId>
payment/pom.xml 2(+1 -1)
diff --git a/payment/pom.xml b/payment/pom.xml
index 6cbd440..5029b2b 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-payment</artifactId>
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index 37a8c8a..a3f488e 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -549,6 +549,7 @@ public class PaymentProcessor extends ProcessorBase {
invoiceApi.notifyOfPayment(invoice.getId(),
payment.getAmount(),
payment.getCurrency(),
+ paymentPluginInfo.getCurrency(),
payment.getId(),
payment.getEffectiveDate(),
context);
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index e7417af..035c075 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
<version>0.5.6-SNAPSHOT</version>
</parent>
<artifactId>killbill</artifactId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<packaging>pom</packaging>
<name>killbill</name>
<description>Library for managing recurring subscriptions and the associated billing</description>
server/pom.xml 2(+1 -1)
diff --git a/server/pom.xml b/server/pom.xml
index d023835..800d31b 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-server</artifactId>
diff --git a/server/src/main/resources/killbill-server.properties b/server/src/main/resources/killbill-server.properties
index 063df9c..49012e2 100644
--- a/server/src/main/resources/killbill-server.properties
+++ b/server/src/main/resources/killbill-server.properties
@@ -14,7 +14,6 @@
# under the License.
#
-killbill.catalog.uri=file:///Users/stephanebrossier/Work/Src/Killbill/killbill/server/src/main/resources/NingCatalog.xml
# Use skeleton properties for server and configure killbill database
com.ning.jetty.jdbi.url=jdbc:mysql://127.0.0.1:3306/killbill
subscription/pom.xml 2(+1 -1)
diff --git a/subscription/pom.xml b/subscription/pom.xml
index a58307b..ed913d6 100644
--- a/subscription/pom.xml
+++ b/subscription/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-subscription</artifactId>
tenant/pom.xml 2(+1 -1)
diff --git a/tenant/pom.xml b/tenant/pom.xml
index 97f7c97..6e452f1 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-tenant</artifactId>
usage/pom.xml 2(+1 -1)
diff --git a/usage/pom.xml b/usage/pom.xml
index c569590..d7e857c 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -19,7 +19,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-usage</artifactId>
util/pom.xml 2(+1 -1)
diff --git a/util/pom.xml b/util/pom.xml
index 9c1e5d5..dcd1a75 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -12,7 +12,7 @@
<parent>
<artifactId>killbill</artifactId>
<groupId>com.ning.billing</groupId>
- <version>0.8.1-SNAPSHOT</version>
+ <version>0.8.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>killbill-util</artifactId>
diff --git a/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java b/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java
index 30282b7..a61bd40 100644
--- a/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java
+++ b/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java
@@ -18,6 +18,7 @@ package com.ning.billing.mock;
import java.util.Locale;
+import com.ning.billing.currency.api.CurrencyConversionApi;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
@@ -25,7 +26,7 @@ import com.ning.billing.util.template.translation.TranslatorConfig;
public class MockInvoiceFormatterFactory implements InvoiceFormatterFactory {
@Override
- public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
+ public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale, CurrencyConversionApi currencyConversionApi) {
return null;
}
}