Skip to content

Commit

Permalink
invoice: Add support for prettyName (planName, phaseName, usageName) …
Browse files Browse the repository at this point in the history
…when retrieveing invoices through apis. See #716
  • Loading branch information
sbrossie committed Mar 28, 2017
1 parent 341df0d commit 607a77d
Show file tree
Hide file tree
Showing 12 changed files with 170 additions and 54 deletions.
Expand Up @@ -140,8 +140,7 @@ public Iterable<Invoice> prepareInvoices() throws InvoiceApiException {
return ImmutableList.<Invoice>of(invoice); return ImmutableList.<Invoice>of(invoice);
} }
}; };
final List<InvoiceItem> createdInvoiceItems = invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, callContext); invoiceApiHelper.dispatchToInvoicePluginsAndInsertItems(accountId, false, withAccountLock, callContext);

return new DefaultInvoicePayment(refund); return new DefaultInvoicePayment(refund);
} }


Expand Down
Expand Up @@ -36,10 +36,11 @@
import org.killbill.billing.account.api.AccountInternalApi; import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.callcontext.InternalCallContext; import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext; import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.CatalogService;
import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.invoice.InvoiceDispatcher; import org.killbill.billing.invoice.InvoiceDispatcher;
import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications;
import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications.SubscriptionNotification;
import org.killbill.billing.invoice.api.DryRunArguments; import org.killbill.billing.invoice.api.DryRunArguments;
import org.killbill.billing.invoice.api.Invoice; import org.killbill.billing.invoice.api.Invoice;
import org.killbill.billing.invoice.api.InvoiceApiException; import org.killbill.billing.invoice.api.InvoiceApiException;
Expand Down Expand Up @@ -78,7 +79,6 @@
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Collections2; import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.inject.Inject; import com.google.inject.Inject;


Expand All @@ -97,6 +97,8 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
private final InternalCallContextFactory internalCallContextFactory; private final InternalCallContextFactory internalCallContextFactory;
private final PersistentBus eventBus; private final PersistentBus eventBus;


private final CatalogService catalogService;

@Inject @Inject
public DefaultInvoiceUserApi(final InvoiceDao dao, public DefaultInvoiceUserApi(final InvoiceDao dao,
final InvoiceDispatcher dispatcher, final InvoiceDispatcher dispatcher,
Expand All @@ -105,41 +107,47 @@ public DefaultInvoiceUserApi(final InvoiceDao dao,
final TagInternalApi tagApi, final TagInternalApi tagApi,
final InvoiceApiHelper invoiceApiHelper, final InvoiceApiHelper invoiceApiHelper,
final HtmlInvoiceGenerator generator, final HtmlInvoiceGenerator generator,
final CatalogService catalogService,
final InternalCallContextFactory internalCallContextFactory) { final InternalCallContextFactory internalCallContextFactory) {
this.dao = dao; this.dao = dao;
this.dispatcher = dispatcher; this.dispatcher = dispatcher;
this.accountUserApi = accountUserApi; this.accountUserApi = accountUserApi;
this.tagApi = tagApi; this.tagApi = tagApi;
this.invoiceApiHelper = invoiceApiHelper; this.invoiceApiHelper = invoiceApiHelper;
this.generator = generator; this.generator = generator;
this.catalogService = catalogService;
this.internalCallContextFactory = internalCallContextFactory; this.internalCallContextFactory = internalCallContextFactory;
this.eventBus = eventBus; this.eventBus = eventBus;
} }


@Override @Override
public List<Invoice> getInvoicesByAccount(final UUID accountId, boolean includesMigrated, final TenantContext context) { public List<Invoice> getInvoicesByAccount(final UUID accountId, boolean includesMigrated, final TenantContext context) {


final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, context);
final List<InvoiceModelDao> invoicesByAccount = includesMigrated ? final List<InvoiceModelDao> invoicesByAccount = includesMigrated ?
dao.getAllInvoicesByAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)) : dao.getAllInvoicesByAccount(internalTenantContext) :
dao.getInvoicesByAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)); dao.getInvoicesByAccount(internalTenantContext);


return fromInvoiceModelDao(invoicesByAccount); return fromInvoiceModelDao(invoicesByAccount, getCatalogSafelyForPrettyNames(internalTenantContext));
} }


@Override @Override
public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate, final TenantContext context) { public List<Invoice> getInvoicesByAccount(final UUID accountId, final LocalDate fromDate, final TenantContext context) {
final List<InvoiceModelDao> invoicesByAccount = dao.getInvoicesByAccount(fromDate, internalCallContextFactory.createInternalTenantContext(accountId, context)); final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, context);
return fromInvoiceModelDao(invoicesByAccount); final List<InvoiceModelDao> invoicesByAccount = dao.getInvoicesByAccount(fromDate, internalTenantContext);
return fromInvoiceModelDao(invoicesByAccount, getCatalogSafelyForPrettyNames(internalTenantContext));
} }


@Override @Override
public Invoice getInvoiceByPayment(final UUID paymentId, final TenantContext context) throws InvoiceApiException { public Invoice getInvoiceByPayment(final UUID paymentId, final TenantContext context) throws InvoiceApiException {
final InternalTenantContext tenantContext = internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context); final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context);
final UUID invoiceId = dao.getInvoiceIdByPaymentId(paymentId, tenantContext); final UUID invoiceId = dao.getInvoiceIdByPaymentId(paymentId, internalTenantContext);
if (invoiceId == null) { if (invoiceId == null) {
throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, paymentId); throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, paymentId);
} }
final InvoiceModelDao invoiceModelDao = dao.getById(invoiceId, tenantContext); final InvoiceModelDao invoiceModelDao = dao.getById(invoiceId, internalTenantContext);
return new DefaultInvoice(invoiceModelDao); return new DefaultInvoice(invoiceModelDao, getCatalogSafelyForPrettyNames(internalTenantContext));
} }


@Override @Override
Expand Down Expand Up @@ -194,19 +202,22 @@ public BigDecimal getAccountCBA(final UUID accountId, final TenantContext contex


@Override @Override
public Invoice getInvoice(final UUID invoiceId, final TenantContext context) throws InvoiceApiException { public Invoice getInvoice(final UUID invoiceId, final TenantContext context) throws InvoiceApiException {
return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context))); final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context);
return new DefaultInvoice(dao.getById(invoiceId, internalTenantContext), getCatalogSafelyForPrettyNames(internalTenantContext));
} }


@Override @Override
public Invoice getInvoiceByNumber(final Integer number, final TenantContext context) throws InvoiceApiException { public Invoice getInvoiceByNumber(final Integer number, final TenantContext context) throws InvoiceApiException {
// The account record id will be populated in the DAO // The account record id will be populated in the DAO
return new DefaultInvoice(dao.getByNumber(number, internalCallContextFactory.createInternalTenantContextWithoutAccountRecordId(context))); final InternalTenantContext internalTenantContextWithoutAccountRecordId = internalCallContextFactory.createInternalTenantContextWithoutAccountRecordId(context);
return new DefaultInvoice(dao.getByNumber(number, internalTenantContextWithoutAccountRecordId), getCatalogSafelyForPrettyNames(internalTenantContextWithoutAccountRecordId));
} }


@Override @Override
public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate, final TenantContext context) { public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final LocalDate upToDate, final TenantContext context) {
final List<InvoiceModelDao> unpaidInvoicesByAccountId = dao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContextFactory.createInternalTenantContext(accountId, context)); final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, context);
return fromInvoiceModelDao(unpaidInvoicesByAccountId); final List<InvoiceModelDao> unpaidInvoicesByAccountId = dao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalTenantContext);
return fromInvoiceModelDao(unpaidInvoicesByAccountId, getCatalogSafelyForPrettyNames(internalTenantContext));
} }


@Override @Override
Expand Down Expand Up @@ -514,12 +525,12 @@ private void notifyBusOfInvoiceAdjustment(final UUID invoiceId, final UUID accou
} }
} }


private List<Invoice> fromInvoiceModelDao(final Collection<InvoiceModelDao> invoiceModelDaos) { private List<Invoice> fromInvoiceModelDao(final Collection<InvoiceModelDao> invoiceModelDaos, final Catalog catalog) {
return ImmutableList.<Invoice>copyOf(Collections2.transform(invoiceModelDaos, return ImmutableList.<Invoice>copyOf(Collections2.transform(invoiceModelDaos,
new Function<InvoiceModelDao, Invoice>() { new Function<InvoiceModelDao, Invoice>() {
@Override @Override
public Invoice apply(final InvoiceModelDao input) { public Invoice apply(final InvoiceModelDao input) {
return new DefaultInvoice(input); return new DefaultInvoice(input, catalog);
} }
})); }));
} }
Expand Down Expand Up @@ -574,4 +585,13 @@ public InvoiceItem apply(final InvoiceItemModelDao input) {
} }
})); }));
} }

private Catalog getCatalogSafelyForPrettyNames(final InternalTenantContext internalTenantContext) {
try {
return catalogService.getFullCatalog(true, true, internalTenantContext);
} catch (final CatalogApiException e) {
log.warn(String.format("Failed to extract catalog to fill invoice item pretty names for tenantRecordId='%s', ignoring...", internalTenantContext.getTenantRecordId()), internalTenantContext.getTenantRecordId());
return null;
}
}
} }
Expand Up @@ -33,7 +33,7 @@ public abstract class AdjInvoiceItem extends InvoiceItemBase {
AdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, AdjInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId,
final LocalDate startDate, final LocalDate endDate, @Nullable final String description, final LocalDate startDate, final LocalDate endDate, @Nullable final String description,
final BigDecimal amount, final Currency currency, @Nullable final UUID reversingId) { final BigDecimal amount, final Currency currency, @Nullable final UUID reversingId) {
super(id, createdDate, invoiceId, accountId, null, null, description, startDate, endDate, amount, currency, reversingId); super(id, createdDate, invoiceId, accountId, null, null, description, startDate, endDate, amount, null, currency, reversingId);
} }


@Override @Override
Expand Down
Expand Up @@ -26,6 +26,7 @@


import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.killbill.billing.catalog.api.Catalog;
import org.killbill.billing.catalog.api.Currency; import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.entity.EntityBase; import org.killbill.billing.entity.EntityBase;
import org.killbill.billing.invoice.api.Invoice; import org.killbill.billing.invoice.api.Invoice;
Expand Down Expand Up @@ -74,7 +75,7 @@ public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable fina
} }


// This CTOR is used to return an existing invoice and must include everything (items, payments, tags,..) // This CTOR is used to return an existing invoice and must include everything (items, payments, tags,..)
public DefaultInvoice(final InvoiceModelDao invoiceModelDao) { public DefaultInvoice(final InvoiceModelDao invoiceModelDao, @Nullable final Catalog catalog) {
this(invoiceModelDao.getId(), invoiceModelDao.getCreatedDate(), invoiceModelDao.getAccountId(), this(invoiceModelDao.getId(), invoiceModelDao.getCreatedDate(), invoiceModelDao.getAccountId(),
invoiceModelDao.getInvoiceNumber(), invoiceModelDao.getInvoiceDate(), invoiceModelDao.getTargetDate(), invoiceModelDao.getInvoiceNumber(), invoiceModelDao.getInvoiceDate(), invoiceModelDao.getTargetDate(),
invoiceModelDao.getCurrency(), invoiceModelDao.getProcessedCurrency(), invoiceModelDao.isMigrated(), invoiceModelDao.getCurrency(), invoiceModelDao.getProcessedCurrency(), invoiceModelDao.isMigrated(),
Expand All @@ -83,7 +84,7 @@ public DefaultInvoice(final InvoiceModelDao invoiceModelDao) {
addInvoiceItems(Collections2.transform(invoiceModelDao.getInvoiceItems(), new Function<InvoiceItemModelDao, InvoiceItem>() { addInvoiceItems(Collections2.transform(invoiceModelDao.getInvoiceItems(), new Function<InvoiceItemModelDao, InvoiceItem>() {
@Override @Override
public InvoiceItem apply(final InvoiceItemModelDao input) { public InvoiceItem apply(final InvoiceItemModelDao input) {
return InvoiceItemFactory.fromModelDao(input); return InvoiceItemFactory.fromModelDaoWithCatalog(input, catalog);
} }
})); }));
addPayments(Collections2.transform(invoiceModelDao.getInvoicePayments(), new Function<InvoicePaymentModelDao, InvoicePayment>() { addPayments(Collections2.transform(invoiceModelDao.getInvoicePayments(), new Function<InvoicePaymentModelDao, InvoicePayment>() {
Expand All @@ -94,6 +95,10 @@ public InvoicePayment apply(final InvoicePaymentModelDao input) {
})); }));
} }


public DefaultInvoice(final InvoiceModelDao invoiceModelDao) {
this(invoiceModelDao, null);
}

public DefaultInvoice(final UUID accountId, final LocalDate invoiceDate, final Currency currency) { public DefaultInvoice(final UUID accountId, final LocalDate invoiceDate, final Currency currency) {
this(UUID.randomUUID(), null, accountId, null, invoiceDate, null, currency, currency, false, false, InvoiceStatus.DRAFT, true, null); this(UUID.randomUUID(), null, accountId, null, invoiceDate, null, currency, currency, false, false, InvoiceStatus.DRAFT, true, null);
} }
Expand Down
Expand Up @@ -30,18 +30,18 @@
public class ExternalChargeInvoiceItem extends InvoiceItemBase { public class ExternalChargeInvoiceItem extends InvoiceItemBase {


public ExternalChargeInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final String description, public ExternalChargeInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final String description,
final LocalDate date, final BigDecimal amount, final Currency currency) { final LocalDate effectiveDate, final BigDecimal amount, final Currency currency) {
this(UUIDs.randomUUID(), invoiceId, accountId, bundleId, description, date, amount, currency); this(UUIDs.randomUUID(), invoiceId, accountId, bundleId, description, effectiveDate, amount, currency);
} }


public ExternalChargeInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, public ExternalChargeInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) { @Nullable final String description, final LocalDate effectiveDate, final BigDecimal amount, final Currency currency) {
this(id, null, invoiceId, accountId, bundleId, description, date, amount, currency); this(id, null, invoiceId, accountId, bundleId, description, effectiveDate, amount, currency);
} }


public ExternalChargeInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, public ExternalChargeInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) { @Nullable final String description, final LocalDate effectiveDate, final BigDecimal amount, final Currency currency) {
super(id, createdDate, invoiceId, accountId, bundleId, null, description, null, date, null, amount, currency); super(id, createdDate, invoiceId, accountId, bundleId, null, description, effectiveDate, null, amount, null, currency, null);
} }


@Override @Override
Expand Down
Expand Up @@ -43,6 +43,12 @@ public FixedPriceInvoiceItem(final UUID id, @Nullable final DateTime createdDate
super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, planName, phaseName, null, date, null, amount, null, currency, null); super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, planName, phaseName, null, date, null, amount, null, currency, null);
} }


public FixedPriceInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, final UUID bundleId,
final UUID subscriptionId, final String planName, final String phaseName, final String prettyPlanName, final String prettyPhaseName,
@Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) {
super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, planName, phaseName, null, prettyPlanName, prettyPhaseName, null, date, null, amount, null, currency, null);
}

@Override @Override
public String getDescription() { public String getDescription() {
if (description != null) { if (description != null) {
Expand Down
Expand Up @@ -56,14 +56,8 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem


public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String description, @Nullable final UUID subscriptionId, @Nullable final String description,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency) { final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency, final UUID reversedItemId) {
this(id, createdDate, invoiceId, accountId, null, bundleId, subscriptionId, description, startDate, endDate, amount, rate, currency, null); this(id, createdDate, invoiceId, accountId, null, bundleId, subscriptionId, description, startDate, endDate, amount, rate, currency, reversedItemId);
}

public InvoiceItemBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String description,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final Currency currency, final UUID reversedItemId) {
this(id, createdDate, invoiceId, accountId, null, bundleId, subscriptionId, description, startDate, endDate, amount, null, currency, reversedItemId);
} }


// For parent invoices // For parent invoices
Expand Down
Expand Up @@ -33,13 +33,28 @@ public abstract class InvoiceItemCatalogBase extends InvoiceItemBase implements
protected final String phaseName; protected final String phaseName;
protected final String usageName; protected final String usageName;


protected final String prettyPlanName;
protected final String prettyPhaseName;
protected final String prettyUsageName;

public InvoiceItemCatalogBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String description, @Nullable final String planName, @Nullable final String phaseName, @Nullable final String usageName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency, @Nullable final UUID linkedItemId) {
this(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, planName, phaseName, usageName, null, null, null, startDate, endDate, amount, rate, currency, linkedItemId);
}


public InvoiceItemCatalogBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, public InvoiceItemCatalogBase(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
@Nullable final UUID subscriptionId, @Nullable final String description, @Nullable final String planName, @Nullable final String phaseName, @Nullable final String usageName, @Nullable final UUID subscriptionId, @Nullable final String description, @Nullable final String planName, @Nullable final String phaseName, @Nullable final String usageName,
@Nullable final String prettyPlanName, @Nullable final String prettyPhaseName, @Nullable final String prettyUsageName,
final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency, @Nullable final UUID linkedItemId) { final LocalDate startDate, final LocalDate endDate, final BigDecimal amount, final BigDecimal rate, final Currency currency, @Nullable final UUID linkedItemId) {
super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, startDate, endDate, amount, rate, currency); super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, startDate, endDate, amount, rate, currency, linkedItemId);
this.planName = planName; this.planName = planName;
this.phaseName = phaseName; this.phaseName = phaseName;
this.usageName = usageName; this.usageName = usageName;
this.prettyPlanName = prettyPlanName;
this.prettyPhaseName = prettyPhaseName;
this.prettyUsageName = prettyUsageName;
} }




Expand All @@ -61,17 +76,17 @@ public String getUsageName() {


@Override @Override
public String getPrettyPlanName() { public String getPrettyPlanName() {
return null; return prettyPlanName;
} }


@Override @Override
public String getPrettyPhaseName() { public String getPrettyPhaseName() {
return null; return prettyPhaseName;
} }


@Override @Override
public String getPrettyUsageName() { public String getPrettyUsageName() {
return null; return prettyUsageName;
} }




Expand Down

1 comment on commit 607a77d

@pierre
Copy link
Member

@pierre pierre commented on 607a77d Mar 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Please sign in to comment.