/* * Copyright 2010-2013 Ning, Inc. * Copyright 2014-2015 Groupon, Inc * Copyright 2014-2015 The Billing Project, LLC * * The Billing Project licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.killbill.billing.invoice.notification; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.killbill.billing.ErrorCode; import org.killbill.billing.ObjectType; import org.killbill.billing.account.api.Account; import org.killbill.billing.account.api.AccountEmail; import org.killbill.billing.account.api.AccountInternalApi; import org.killbill.billing.callcontext.InternalTenantContext; import org.killbill.billing.invoice.api.Invoice; import org.killbill.billing.invoice.api.InvoiceApiException; import org.killbill.billing.invoice.api.InvoiceNotifier; import org.killbill.billing.invoice.template.HtmlInvoice; import org.killbill.billing.invoice.template.HtmlInvoiceGenerator; import org.killbill.billing.tag.TagInternalApi; import org.killbill.billing.util.callcontext.InternalCallContextFactory; import org.killbill.billing.util.callcontext.TenantContext; import org.killbill.billing.util.email.DefaultEmailSender; import org.killbill.billing.util.email.EmailApiException; import org.killbill.billing.util.email.EmailConfig; import org.killbill.billing.util.email.EmailSender; import org.killbill.billing.util.tag.ControlTagType; import org.killbill.billing.util.tag.Tag; import com.google.common.base.Strings; import com.google.inject.Inject; public class EmailInvoiceNotifier implements InvoiceNotifier { private final AccountInternalApi accountApi; private final TagInternalApi tagUserApi; private final HtmlInvoiceGenerator generator; private final EmailConfig config; private final InternalCallContextFactory internalCallContextFactory; @Inject public EmailInvoiceNotifier(final AccountInternalApi accountApi, final TagInternalApi tagUserApi, final HtmlInvoiceGenerator generator, final EmailConfig config, final InternalCallContextFactory internalCallContextFactory) { this.accountApi = accountApi; this.tagUserApi = tagUserApi; this.generator = generator; this.config = config; this.internalCallContextFactory = internalCallContextFactory; } @Override public void notify(final Account account, final Invoice invoice, final TenantContext context) throws InvoiceApiException { if (Strings.emptyToNull(account.getEmail()) == null) { throw new InvoiceApiException(new IllegalArgumentException("Email for account " + account.getId() + " not specified"), ErrorCode.EMAIL_SENDING_FAILED); } final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(account.getId(), context); final List<String> to = new ArrayList<String>(); to.add(account.getEmail()); final List<AccountEmail> accountEmailList = accountApi.getEmails(account.getId(), internalTenantContext); final List<String> cc = new ArrayList<String>(); for (final AccountEmail email : accountEmailList) { cc.add(email.getEmail()); } // Check if this account has the MANUAL_PAY system tag boolean manualPay = false; final List<Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT, internalTenantContext); for (final Tag tag : accountTags) { if (ControlTagType.MANUAL_PAY.getId().equals(tag.getTagDefinitionId())) { manualPay = true; break; } } final HtmlInvoice htmlInvoice; try { htmlInvoice = generator.generateInvoice(account, invoice, manualPay, internalTenantContext); } catch (final IOException e) { throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED); } // take localized subject, or the configured one if the localized one is not available String subject = htmlInvoice.getSubject(); if (subject == null) { subject = config.getInvoiceEmailSubject(); } final EmailSender sender = new DefaultEmailSender(config); try { sender.sendHTMLEmail(to, cc, subject, htmlInvoice.getBody()); } catch (final EmailApiException e) { throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED); } catch (final IOException e) { throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED); } } }