Details
diff --git a/api/src/main/java/com/ning/billing/util/tag/ControlTagType.java b/api/src/main/java/com/ning/billing/util/tag/ControlTagType.java
index 709f34b..361f9bf 100644
--- a/api/src/main/java/com/ning/billing/util/tag/ControlTagType.java
+++ b/api/src/main/java/com/ning/billing/util/tag/ControlTagType.java
@@ -23,7 +23,8 @@ public enum ControlTagType {
AUTO_PAY_OFF(new UUID(0, 1), "Suspends payments until removed.", true, false),
AUTO_INVOICING_OFF(new UUID(0, 2), "Suspends invoicing until removed.", false, true),
OVERDUE_ENFORCEMENT_OFF(new UUID(0, 3), "Suspends overdue enforcement behaviour until removed.", false, false),
- WRITTEN_OFF(new UUID(0, 4), "Indicated that an invoice is written off. No billing or payment effect.", false, false);
+ WRITTEN_OFF(new UUID(0, 4), "Indicates that an invoice is written off. No billing or payment effect.", false, false),
+ MANUAL_PAY(new UUID(0, 5), "Indicates that Killbill doesn't process payments for that account (external payments only)", true, false);
private final UUID id;
private final String description;
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 8d4e06e..5a4bf02 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
@@ -18,6 +18,7 @@ package com.ning.billing.util.template.translation;
import org.skife.config.Config;
import org.skife.config.Default;
+import org.skife.config.Description;
import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
@@ -44,6 +45,11 @@ public interface TranslatorConfig {
@Default("com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache")
String getTemplateName();
+ @Config("killbill.manualPayTemplate.name")
+ @Default("com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache")
+ @Description("Invoice template for accounts with MANUAL_PAY tag")
+ String getManualPayTemplateName();
+
@Config("killbill.template.invoiceFormatterFactoryClass")
@Default("com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory")
Class<? extends InvoiceFormatterFactory> getInvoiceFormatterFactoryClass();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 5ee9262..ea8e17a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -19,6 +19,7 @@ package com.ning.billing.invoice.api.user;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
import org.joda.time.DateTime;
@@ -39,7 +40,11 @@ import com.ning.billing.invoice.dao.InvoiceDao;
import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
import com.ning.billing.invoice.template.HtmlInvoiceGenerator;
import com.ning.billing.util.api.TagApiException;
+import com.ning.billing.util.api.TagUserApi;
import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.ControlTagType;
+import com.ning.billing.util.tag.Tag;
import com.google.inject.Inject;
@@ -48,13 +53,16 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
private final InvoiceDao dao;
private final InvoiceDispatcher dispatcher;
private final AccountUserApi accountUserApi;
+ private final TagUserApi tagUserApi;
private final HtmlInvoiceGenerator generator;
@Inject
- public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountUserApi accountUserApi, final HtmlInvoiceGenerator generator) {
+ public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountUserApi accountUserApi,
+ final TagUserApi tagUserApi, final HtmlInvoiceGenerator generator) {
this.dao = dao;
this.dispatcher = dispatcher;
this.accountUserApi = accountUserApi;
+ this.tagUserApi = tagUserApi;
this.generator = generator;
}
@@ -155,7 +163,18 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
final Account account = accountUserApi.getAccountById(invoice.getAccountId());
- return generator.generateInvoice(account, invoice);
+
+ // Check if this account has the MANUAL_PAY system tag
+ boolean manualPay = false;
+ final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT);
+ for (final Tag tag : accountTags.values()) {
+ if (ControlTagType.MANUAL_PAY.getId().equals(tag.getTagDefinitionId())) {
+ manualPay = true;
+ break;
+ }
+ }
+
+ return generator.generateInvoice(account, invoice, manualPay);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
index 27b9541..10d7202 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
@@ -19,6 +19,7 @@ package com.ning.billing.invoice.notification;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import com.google.inject.Inject;
import com.ning.billing.ErrorCode;
@@ -29,19 +30,26 @@ import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoiceNotifier;
import com.ning.billing.invoice.template.HtmlInvoiceGenerator;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.dao.ObjectType;
import com.ning.billing.util.email.DefaultEmailSender;
import com.ning.billing.util.email.EmailApiException;
import com.ning.billing.util.email.EmailConfig;
import com.ning.billing.util.email.EmailSender;
+import com.ning.billing.util.tag.ControlTagType;
+import com.ning.billing.util.tag.Tag;
public class EmailInvoiceNotifier implements InvoiceNotifier {
private final AccountUserApi accountUserApi;
+ private final TagUserApi tagUserApi;
private final HtmlInvoiceGenerator generator;
private final EmailConfig config;
@Inject
- public EmailInvoiceNotifier(final AccountUserApi accountUserApi, final HtmlInvoiceGenerator generator, final EmailConfig config) {
+ public EmailInvoiceNotifier(final AccountUserApi accountUserApi, final TagUserApi tagUserApi,
+ final HtmlInvoiceGenerator generator, final EmailConfig config) {
this.accountUserApi = accountUserApi;
+ this.tagUserApi = tagUserApi;
this.generator = generator;
this.config = config;
}
@@ -57,9 +65,19 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
cc.add(email.getEmail());
}
+ // Check if this account has the MANUAL_PAY system tag
+ boolean manualPay = false;
+ final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT);
+ for (final Tag tag : accountTags.values()) {
+ if (ControlTagType.MANUAL_PAY.getId().equals(tag.getTagDefinitionId())) {
+ manualPay = true;
+ break;
+ }
+ }
+
final String htmlBody;
try {
- htmlBody = generator.generateInvoice(account, invoice);
+ htmlBody = generator.generateInvoice(account, invoice, manualPay);
} catch (IOException e) {
throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED);
}
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 04c5075..7f55be3 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
@@ -43,7 +43,7 @@ public class HtmlInvoiceGenerator {
this.config = config;
}
- public String generateInvoice(final Account account, @Nullable final Invoice invoice) throws IOException {
+ public String generateInvoice(final Account account, @Nullable final Invoice invoice, final boolean manualPay) throws IOException {
// Don't do anything if the invoice is null
if (invoice == null) {
return null;
@@ -59,6 +59,10 @@ public class HtmlInvoiceGenerator {
final InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale);
data.put("invoice", formattedInvoice);
- return templateEngine.executeTemplate(config.getTemplateName(), data);
+ if (manualPay) {
+ return templateEngine.executeTemplate(config.getManualPayTemplateName(), data);
+ } else {
+ return templateEngine.executeTemplate(config.getTemplateName(), data);
+ }
}
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index e126ba2..5fb9e88 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -61,6 +61,7 @@ import com.ning.billing.util.email.templates.TemplateModule;
import com.ning.billing.util.glue.BusModule;
import com.ning.billing.util.glue.BusModule.BusType;
import com.ning.billing.util.glue.NotificationQueueModule;
+import com.ning.billing.util.glue.TagStoreModule;
import com.ning.billing.util.notificationq.DummySqlTest;
import com.ning.billing.util.notificationq.NotificationQueueService;
@@ -113,6 +114,7 @@ public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB
install(new MockCatalogModule());
install(new NotificationQueueModule());
install(new TemplateModule());
+ install(new TagStoreModule());
final MysqlTestingHelper helper = KillbillTestSuiteWithEmbeddedDB.getMysqlTestingHelper();
bind(MysqlTestingHelper.class).toInstance(helper);
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 c3fc3d4..5d7cb5b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -54,20 +54,20 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuite {
@Test(groups = "fast")
public void testGenerateInvoice() throws Exception {
- final String output = g.generateInvoice(createAccount(), createInvoice());
+ final String output = g.generateInvoice(createAccount(), createInvoice(), false);
Assert.assertNotNull(output);
}
@Test(groups = "fast")
public void testGenerateEmptyInvoice() throws Exception {
final Invoice invoice = Mockito.mock(Invoice.class);
- final String output = g.generateInvoice(createAccount(), invoice);
+ final String output = g.generateInvoice(createAccount(), invoice, false);
Assert.assertNotNull(output);
}
@Test(groups = "fast")
public void testGenerateNullInvoice() throws Exception {
- final String output = g.generateInvoice(createAccount(), null);
+ final String output = g.generateInvoice(createAccount(), null, false);
Assert.assertNull(output);
}