killbill-aplcache

invoice: add specific template for external payments Accounts

7/25/2012 1:20:43 PM

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);
     }