use of org.killbill.billing.util.tag.Tag in project killbill by killbill.
the class DefaultInvoiceDao method changeInvoiceStatus.
@Override
public void changeInvoiceStatus(final UUID invoiceId, final InvoiceStatus newStatus, final InternalCallContext context) throws InvoiceApiException {
final List<Tag> invoicesTags = getInvoicesTags(context);
transactionalSqlDao.execute(false, InvoiceApiException.class, new EntitySqlDaoTransactionWrapper<Void>() {
@Override
public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
final InvoiceSqlDao transactional = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
// Retrieve the invoice and make sure it belongs to the right account
final InvoiceModelDao invoice = transactional.getById(invoiceId.toString(), context);
if (invoice == null) {
throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
}
if (invoice.getStatus().equals(newStatus) || invoice.getStatus().equals(InvoiceStatus.VOID)) {
throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_STATUS, newStatus, invoiceId, invoice.getStatus());
}
transactional.updateStatusAndTargetDate(invoiceId.toString(), newStatus.toString(), invoice.getTargetDate(), context);
// Run through all invoices
// Current invoice could be a credit item that needs to be rebalanced
cbaDao.doCBAComplexityFromTransaction(invoicesTags, entitySqlDaoWrapperFactory, context);
// Invoice creation event sent on COMMITTED
if (InvoiceStatus.COMMITTED.equals(newStatus)) {
notifyBusOfInvoiceCreation(entitySqlDaoWrapperFactory, invoice, context);
} else if (InvoiceStatus.VOID.equals(newStatus)) {
// https://github.com/killbill/killbill/issues/1448
notifyBusOfInvoiceAdjustment(entitySqlDaoWrapperFactory, invoiceId, invoice.getAccountId(), context.getUserToken(), context);
// Deactivate any usage trackingIds if necessary
final InvoiceTrackingSqlDao trackingSqlDao = entitySqlDaoWrapperFactory.become(InvoiceTrackingSqlDao.class);
final List<InvoiceTrackingModelDao> invoiceTrackingModelDaos = trackingSqlDao.getTrackingsForInvoices(ImmutableList.of(invoiceId.toString()), context);
if (!invoiceTrackingModelDaos.isEmpty()) {
final Collection<String> invoiceTrackingIdsToDeactivate = Collections2.<InvoiceTrackingModelDao, String>transform(invoiceTrackingModelDaos, new Function<InvoiceTrackingModelDao, String>() {
@Override
public String apply(final InvoiceTrackingModelDao input) {
return input.getId().toString();
}
});
trackingSqlDao.deactivateByIds(invoiceTrackingIdsToDeactivate, context);
}
}
return null;
}
});
}
use of org.killbill.billing.util.tag.Tag in project killbill by killbill.
the class TagResource method getTags.
@TimedResource
@GET
@Path("/" + PAGINATION)
@Produces(APPLICATION_JSON)
@ApiOperation(value = "List tags", response = TagJson.class, responseContainer = "List")
@ApiResponses(value = {})
public Response getTags(@QueryParam(QUERY_SEARCH_OFFSET) @DefaultValue("0") final Long offset, @QueryParam(QUERY_SEARCH_LIMIT) @DefaultValue("100") final Long limit, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode, @javax.ws.rs.core.Context final HttpServletRequest request) throws TagApiException {
final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
final Pagination<Tag> tags = tagUserApi.getTags(offset, limit, tenantContext);
final URI nextPageUri = uriBuilder.nextPage(TagResource.class, "getTags", tags.getNextOffset(), limit, ImmutableMap.<String, String>of(QUERY_AUDIT, auditMode.getLevel().toString()), ImmutableMap.<String, String>of());
final Map<UUID, TagDefinition> tagDefinitionsCache = new HashMap<UUID, TagDefinition>();
for (final TagDefinition tagDefinition : tagUserApi.getTagDefinitions(tenantContext)) {
tagDefinitionsCache.put(tagDefinition.getId(), tagDefinition);
}
return buildStreamingPaginationResponse(tags, new Function<Tag, TagJson>() {
@Override
public TagJson apply(final Tag tag) {
final TagDefinition tagDefinition = tagDefinitionsCache.get(tag.getTagDefinitionId());
// TODO Really slow - we should instead try to figure out the account id
final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tag.getId(), ObjectType.TAG, auditMode.getLevel(), tenantContext);
return new TagJson(tag, tagDefinition, auditLogs);
}
}, nextPageUri);
}
use of org.killbill.billing.util.tag.Tag in project killbill by killbill.
the class TagResource method searchTags.
@TimedResource
@GET
@Path("/" + SEARCH + "/{searchKey:" + ANYTHING_PATTERN + "}")
@Produces(APPLICATION_JSON)
@ApiOperation(value = "Search tags", response = TagJson.class, responseContainer = "List")
@ApiResponses(value = {})
public Response searchTags(@PathParam("searchKey") final String searchKey, @QueryParam(QUERY_SEARCH_OFFSET) @DefaultValue("0") final Long offset, @QueryParam(QUERY_SEARCH_LIMIT) @DefaultValue("100") final Long limit, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode, @javax.ws.rs.core.Context final HttpServletRequest request) throws TagApiException {
final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
final Pagination<Tag> tags = tagUserApi.searchTags(searchKey, offset, limit, tenantContext);
final URI nextPageUri = uriBuilder.nextPage(TagResource.class, "searchTags", tags.getNextOffset(), limit, ImmutableMap.<String, String>of(QUERY_AUDIT, auditMode.getLevel().toString()), ImmutableMap.<String, String>of("searchKey", searchKey));
final Map<UUID, TagDefinition> tagDefinitionsCache = new HashMap<UUID, TagDefinition>();
for (final TagDefinition tagDefinition : tagUserApi.getTagDefinitions(tenantContext)) {
tagDefinitionsCache.put(tagDefinition.getId(), tagDefinition);
}
return buildStreamingPaginationResponse(tags, new Function<Tag, TagJson>() {
@Override
public TagJson apply(final Tag tag) {
final TagDefinition tagDefinition = tagDefinitionsCache.get(tag.getTagDefinitionId());
// TODO Really slow - we should instead try to figure out the account id
final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tag.getId(), ObjectType.TAG, auditMode.getLevel(), tenantContext);
return new TagJson(tag, tagDefinition, auditLogs);
}
}, nextPageUri);
}
use of org.killbill.billing.util.tag.Tag in project killbill by killbill.
the class TestInvoiceDaoHelper method testPopulateChildrenWithParent.
@Test(groups = "slow")
public void testPopulateChildrenWithParent() throws Exception {
final Account parentAccount = invoiceUtil.createAccount(callContext);
final UUID childAccountId = account.getId();
final UUID parentAccountId = parentAccount.getId();
final InternalCallContext parentContext = internalCallContextFactory.createInternalCallContext(parentAccountId, callContext);
final InvoiceModelDao parentInvoice = new InvoiceModelDao(parentAccountId, today, account.getCurrency(), InvoiceStatus.DRAFT, true);
final InvoiceItem parentInvoiceItem = new ParentInvoiceItem(UUID.randomUUID(), now, parentInvoice.getId(), parentAccountId, childAccountId, BigDecimal.TEN, account.getCurrency(), "");
parentInvoice.addInvoiceItem(new InvoiceItemModelDao(parentInvoiceItem));
invoiceUtil.createInvoice(new DefaultInvoice(parentInvoice), parentContext);
final UUID accountId = account.getId();
final Invoice childInvoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
final InvoiceItem invoiceItem = new RecurringInvoiceItem(childInvoice.getId(), accountId, UUID.randomUUID(), UUID.randomUUID(), "test", "test-plan", "test-phase", null, today, today, BigDecimal.TEN, BigDecimal.TEN, Currency.USD);
childInvoice.addInvoiceItem(invoiceItem);
invoiceUtil.createInvoice(childInvoice, internalAccountContext);
InvoiceParentChildModelDao invoiceRelation = new InvoiceParentChildModelDao(parentInvoice.getId(), childInvoice.getId(), childAccountId);
invoiceDao.createParentChildInvoiceRelation(invoiceRelation, internalAccountContext);
// //
final List<Tag> tags = ImmutableList.of();
final InvoiceModelDao invoice1 = getRawInvoice(childInvoice.getId(), internalAccountContext);
populateChildrenByInvoiceId(invoice1, tags);
final InvoiceModelDao invoice2 = getRawInvoice(childInvoice.getId(), internalAccountContext);
populateChildrenByAccountRecordId(invoice2, tags);
Assert.assertEquals(invoice1, invoice2);
}
use of org.killbill.billing.util.tag.Tag in project killbill by killbill.
the class TestInvoiceDaoHelper method testPopulateChildrenWith_WRITTEN_OFF.
@Test(groups = "slow")
public void testPopulateChildrenWith_WRITTEN_OFF() throws Exception {
final UUID accountId = account.getId();
final Invoice inputInvoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
final InvoiceItem invoiceItem = new RecurringInvoiceItem(inputInvoice.getId(), accountId, UUID.randomUUID(), UUID.randomUUID(), "test", "test-plan", "test-phase", null, today, today, BigDecimal.TEN, BigDecimal.TEN, Currency.USD);
inputInvoice.addInvoiceItem(invoiceItem);
invoiceUtil.createInvoice(inputInvoice, internalAccountContext);
final List<Tag> tags = ImmutableList.of(new DefaultControlTag(ControlTagType.WRITTEN_OFF, ObjectType.INVOICE, inputInvoice.getId(), clock.getUTCNow()));
final InvoiceModelDao invoice1 = getRawInvoice(inputInvoice.getId(), internalAccountContext);
populateChildrenByInvoiceId(invoice1, tags);
final InvoiceModelDao invoice2 = getRawInvoice(inputInvoice.getId(), internalAccountContext);
populateChildrenByAccountRecordId(invoice2, tags);
Assert.assertEquals(invoice1, invoice2);
Assert.assertEquals((new DefaultInvoice(invoice1)).getBalance().compareTo(BigDecimal.ZERO), 0);
Assert.assertEquals((new DefaultInvoice(invoice2)).getBalance().compareTo(BigDecimal.ZERO), 0);
}
Aggregations