@TimedResource @GET @Path("/{accountId:" + UUID_PATTERN + "}/" + ALL_TAGS) @Produces(APPLICATION_JSON) @ApiOperation(value = "Retrieve account tags", response = TagJson.class, responseContainer = "List") @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied"), @ApiResponse(code = 404, message = "Account not found")}) public Response getAllTags(@PathParam(ID_PARAM_NAME) final UUID accountId, @QueryParam(QUERY_OBJECT_TYPE) final ObjectType objectType, @QueryParam(QUERY_INCLUDED_DELETED) @DefaultValue("false") final Boolean includedDeleted, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode, @javax.ws.rs.core.Context final HttpServletRequest request) throws TagDefinitionApiException { final TenantContext tenantContext = context.createTenantContextWithAccountId(accountId, request); final List<Tag> tags = objectType != null ? tagUserApi.getTagsForAccountType(accountId, objectType, includedDeleted, tenantContext) : tagUserApi.getTagsForAccount(accountId, includedDeleted, tenantContext); return createTagResponse(accountId, tags, auditMode, tenantContext); }
private void add_WRITTEN_OFF_Tag(final UUID id, final ObjectType type) throws TagDefinitionApiException, TagApiException { busHandler.pushExpectedEvent(NextEvent.TAG); tagApi.addTag(id, type, ControlTagType.WRITTEN_OFF.getId(), callContext); assertListenerStatus(); final List<Tag> tags = tagApi.getTagsForObject(id, type, false, callContext); assertEquals(tags.size(), 1); }
@TimedResource @POST @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @ApiOperation(value = "Create a tag definition", response = TagDefinitionJson.class) @ApiResponses(value = {@ApiResponse(code = 201, message = "Tag definition created successfully"), @ApiResponse(code = 400, message = "Invalid name or description supplied")}) public Response createTagDefinition(final TagDefinitionJson json, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @javax.ws.rs.core.Context final HttpServletRequest request, @javax.ws.rs.core.Context final UriInfo uriInfo) throws TagDefinitionApiException { // Checked as the database layer as well, but bail early and return 400 instead of 500 verifyNonNullOrEmpty(json, "TagDefinitionJson body should be specified"); verifyNonNullOrEmpty(json.getName(), "TagDefinition name needs to be set", json.getDescription(), "TagDefinition description needs to be set"); Preconditions.checkArgument(json.getApplicableObjectTypes() != null && !json.getApplicableObjectTypes().isEmpty(), "Applicable object types must be set"); final TagDefinition createdTagDef = tagUserApi.createTagDefinition(json.getName(), json.getDescription(), json.getApplicableObjectTypes(), context.createCallContextNoAccountId(createdBy, reason, comment, request)); return uriBuilder.buildResponse(uriInfo, TagDefinitionResource.class, "getTagDefinition", createdTagDef.getId(), request); }
@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("searchKey", searchKey, QUERY_AUDIT, auditMode.getLevel().toString())); final Map<UUID, TagDefinition> tagDefinitionsCache = new HashMap<UUID, TagDefinition>(); for (final TagDefinition tagDefinition : tagUserApi.getTagDefinitions(tenantContext)) { tagDefinitionsCache.put(tagDefinition.getId(), tagDefinition);
@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())); 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); }
final TagDefinition tagDefinition = tagUserApi.createTagDefinition("foo", "foo desc", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT, ObjectType.INVOICE), callContext); assertListenerStatus(); final TagDefinition tagDefinition2 = tagUserApi.getTagDefinition(tagDefinition.getId(), callContext); assertEquals(tagDefinition2.getApplicableObjectTypes().size(), 2); assertEquals(tagDefinition2.getApplicableObjectTypes().get(0), ObjectType.ACCOUNT); tagUserApi.addTag(invoice.getId(), ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), callContext); assertListenerStatus(); tagUserApi.addTag(invoice.getId(), ObjectType.INVOICE, tagDefinition.getId(), callContext); assertListenerStatus(); List<Tag> tags = tagUserApi.getTagsForAccount(account.getId(), false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); tags = tagUserApi.getTagsForObject(invoice.getId(), ObjectType.INVOICE, false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); tags = tagUserApi.getTagsForAccountType(account.getId(), ObjectType.INVOICE, false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); tagUserApi.addTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.AUTO_PAY_OFF.getId(), callContext); assertListenerStatus(); tags = tagUserApi.getTagsForAccount(account.getId(), false, callContext);
@Test(groups = "slow") public void testApiTagOnAccount() throws Exception { busHandler.pushExpectedEvents(NextEvent.TAG); tagUserApi.addTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.AUTO_INVOICING_OFF.getId(), callContext); assertListenerStatus(); busHandler.pushExpectedEvents(NextEvent.TAG); tagUserApi.addTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.AUTO_PAY_OFF.getId(), callContext); assertListenerStatus(); List<Tag> tags = tagUserApi.getTagsForAccount(account.getId(), false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); tags = tagUserApi.getTagsForObject(account.getId(), ObjectType.ACCOUNT, false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); tags = tagUserApi.getTagsForAccountType(account.getId(), ObjectType.ACCOUNT, false, callContext); Assert.assertEquals(tags.size(), 2); checkTagsExists(tags); }
protected Collection<Tag> getTagsForAccount(final UUID accountId, final TenantContext context) throws OSGIServiceNotAvailable { final TagUserApi tagUserApi = getTagUserApi(); return tagUserApi.getTagsForAccount(accountId, false, context); }
tagUserApi.addTag(accountId, ObjectType.ACCOUNT, ControlTagType.AUTO_INVOICING_OFF.getId(), callContext);
protected Response getTags(final UUID accountId, final UUID taggedObjectId, final AuditMode auditMode, final boolean includeDeleted, final TenantContext context) throws TagDefinitionApiException { final List<Tag> tags = tagUserApi.getTagsForObject(taggedObjectId, getObjectType(), includeDeleted, context); return createTagResponse(accountId, tags, auditMode, context); }
protected List<TagDefinition> getTagDefinitions(final TenantContext context) throws OSGIServiceNotAvailable { final TagUserApi tagUserApi = getTagUserApi(); return tagUserApi.getTagDefinitions(context); }
@TimedResource @GET @Path("/{tagDefinitionId:" + UUID_PATTERN + "}") @Produces(APPLICATION_JSON) @ApiOperation(value = "Retrieve a tag definition", response = TagDefinitionJson.class) @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid tagDefinitionId supplied")}) public Response getTagDefinition(@PathParam("tagDefinitionId") final UUID tagDefId, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode, @javax.ws.rs.core.Context final HttpServletRequest request) throws TagDefinitionApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final TagDefinition tagDefinition = tagUserApi.getTagDefinition(tagDefId, tenantContext); final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tagDefinition.getId(), ObjectType.TAG_DEFINITION, auditMode.getLevel(), tenantContext); final TagDefinitionJson json = new TagDefinitionJson(tagDefinition, auditLogs); return Response.status(Status.OK).entity(json).build(); }
@Test(groups = "slow") public void testNonOverdueAccountWith_OVERDUE_ENFORCEMENT_OFF() throws Exception { clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0)); setupAccount(); // Set the OVERDUE_ENFORCEMENT_OFF tag (we set the clear state, hence the blocking event) busHandler.pushExpectedEvents(NextEvent.TAG, NextEvent.BLOCK); tagUserApi.addTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.OVERDUE_ENFORCEMENT_OFF.getId(), callContext); assertListenerStatus(); // Set next invoice to fail and create subscription paymentPlugin.makeAllInvoicesFailWithError(true); final DefaultEntitlement baseEntitlement = createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey", productName, ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE); bundle = subscriptionApi.getSubscriptionBundle(baseEntitlement.getBundleId(), callContext); invoiceChecker.checkInvoice(account.getId(), 1, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), null, InvoiceItemType.FIXED, new BigDecimal("0"))); invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 5, 1), callContext); // DAY 30 have to get out of trial before first payment addDaysAndCheckForCompletion(30, NextEvent.PHASE, NextEvent.INVOICE, NextEvent.PAYMENT_ERROR, NextEvent.INVOICE_PAYMENT_ERROR); invoiceChecker.checkInvoice(account.getId(), 2, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 31), new LocalDate(2012, 6, 30), InvoiceItemType.RECURRING, new BigDecimal("249.95"))); invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 6, 30), callContext); // DAY 36 -- RIGHT AFTER OD1 addDaysAndCheckForCompletion(6); // Should still be in clear state checkODState(OverdueWrapper.CLEAR_STATE_NAME); // Now remove OVERDUE_ENFORCEMENT_OFF tag busHandler.pushExpectedEvents(NextEvent.TAG, NextEvent.BLOCK); tagUserApi.removeTag(account.getId(), ObjectType.ACCOUNT, ControlTagType.OVERDUE_ENFORCEMENT_OFF.getId(), callContext); assertListenerStatus(); checkODState("OD1"); }
Assert.assertTrue(tagUserApi.getTagsForAccount(accountId, true, callContext).isEmpty()); Assert.assertTrue(tagUserApi.getTagsForAccount(accountId, true, callContext).isEmpty()); final List<Tag> tags = tagUserApi.getTagsForAccount(accountId, false, callContext); Assert.assertEquals(tags.size(), 1); Assert.assertEquals(tags.get(0).getTagDefinitionId(), SystemTags.PARK_TAG_DEFINITION_ID); Assert.assertEquals(tagUserApi.getTagsForAccount(accountId, false, callContext), tags); Assert.assertEquals(invoiceDao.getInvoicesByAccount(false, context).size(), 0); Assert.assertEquals(tagUserApi.getTagsForAccount(accountId, false, callContext).size(), 1); Assert.assertEquals(invoiceDao.getInvoicesByAccount(false, context).size(), 1); Assert.assertEquals(tagUserApi.getTagsForAccount(accountId, false, callContext).size(), 0); Assert.assertEquals(tagUserApi.getTagsForAccount(accountId, true, callContext).size(), 1);
@Test(groups = "slow", description = "Verify invoice/account balance with a WRITTEN_OFF invoice. Verify behavior when WRITTEN_OFF tag is added after credit was added to invoice" ) public void testWrittenOffInvoiceWithAccountCredit() throws Exception { // Add credit on the account invoiceUserApi.insertCredit(accountId, BigDecimal.TEN, null, accountCurrency, true, null, null, null, callContext); final BigDecimal accountBalance0 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance0.compareTo(new BigDecimal("-10.0")), 0); final BigDecimal accountCBA0 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA0.compareTo(BigDecimal.TEN), 0); // Create new invoice with one charge and expect account credit to be used final List<InvoiceItem> items = invoiceUserApi.insertExternalCharges(accountId, clock.getUTCToday(), ImmutableList.<InvoiceItem>of(new ExternalChargeInvoiceItem(UUID.randomUUID(), clock.getUTCNow(), null, accountId, null, null, null, null, new BigDecimal("13.5"), accountCurrency, null)), true, null, callContext); assertEquals(items.size(), 1); final BigDecimal accountBalance1 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance1.compareTo(new BigDecimal("3.5")), 0); final BigDecimal accountCBA1 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA1.compareTo(BigDecimal.ZERO), 0); // Tag invoice with WRITTEN_OFF and expect balance to now show as Zero tagUserApi.addTag(items.get(0).getInvoiceId(), ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), callContext); final BigDecimal accountBalance2 = invoiceUserApi.getAccountBalance(accountId, callContext); assertEquals(accountBalance2.compareTo(BigDecimal.ZERO), 0); final BigDecimal accountCBA2 = invoiceUserApi.getAccountCBA(accountId, callContext); assertEquals(accountCBA2.compareTo(BigDecimal.ZERO), 0); }
@Test(groups = "slow") public void testAddRemoveWrittenOffTag() throws InvoiceApiException, TagApiException { final Invoice originalInvoice = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(originalInvoice.getBalance().compareTo(BigDecimal.ZERO), 1); invoiceUserApi.tagInvoiceAsWrittenOff(invoiceId, callContext); List<Tag> tags = tagUserApi.getTagsForObject(invoiceId, ObjectType.INVOICE, false, callContext); assertEquals(tags.size(), 1); assertEquals(tags.get(0).getTagDefinitionId(), ControlTagType.WRITTEN_OFF.getId()); final Invoice invoiceWithTag = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoiceWithTag.getBalance().compareTo(BigDecimal.ZERO), 0); invoiceUserApi.tagInvoiceAsNotWrittenOff(invoiceId, callContext); tags = tagUserApi.getTagsForObject(invoiceId, ObjectType.INVOICE, false, callContext); assertEquals(tags.size(), 0); final Invoice invoiceAfterTagRemoval = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoiceAfterTagRemoval.getBalance().compareTo(BigDecimal.ZERO), 1); }
@TimedResource @GET @Produces(APPLICATION_JSON) @ApiOperation(value = "List tag definitions", response = TagDefinitionJson.class, responseContainer = "List") @ApiResponses(value = {}) public Response getTagDefinitions(@javax.ws.rs.core.Context final HttpServletRequest request, @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode) { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final List<TagDefinition> tagDefinitions = tagUserApi.getTagDefinitions(tenantContext); final Collection<TagDefinitionJson> result = new LinkedList<TagDefinitionJson>(); for (final TagDefinition tagDefinition : tagDefinitions) { final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tagDefinition.getId(), ObjectType.TAG_DEFINITION, auditMode.getLevel(), tenantContext); result.add(new TagDefinitionJson(tagDefinition, auditLogs)); } return Response.status(Status.OK).entity(result).build(); }
protected Response createTagResponse(final UUID accountId, final List<Tag> tags, final AuditMode auditMode, final TenantContext context) throws TagDefinitionApiException { final AccountAuditLogsForObjectType tagsAuditLogs = auditUserApi.getAccountAuditLogs(accountId, ObjectType.TAG, auditMode.getLevel(), context); final Map<UUID, TagDefinition> tagDefinitionsCache = new HashMap<UUID, TagDefinition>(); final Collection<TagJson> result = new LinkedList<TagJson>(); for (final Tag tag : tags) { if (tagDefinitionsCache.get(tag.getTagDefinitionId()) == null) { tagDefinitionsCache.put(tag.getTagDefinitionId(), tagUserApi.getTagDefinition(tag.getTagDefinitionId(), context)); } final TagDefinition tagDefinition = tagDefinitionsCache.get(tag.getTagDefinitionId()); final List<AuditLog> auditLogs = tagsAuditLogs.getAuditLogs(tag.getId()); result.add(new TagJson(tag, tagDefinition, auditLogs)); } return Response.status(Response.Status.OK).entity(result).build(); }
@Test(groups = "slow") public void testOverdueStateWith_WRITTEN_OFF() throws Exception { clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0)); setupAccount(); // Set next invoice to fail and create subscription paymentPlugin.makeAllInvoicesFailWithError(true); final DefaultEntitlement baseEntitlement = createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey", productName, ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE); bundle = subscriptionApi.getSubscriptionBundle(baseEntitlement.getBundleId(), callContext); invoiceChecker.checkInvoice(account.getId(), 1, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), null, InvoiceItemType.FIXED, new BigDecimal("0"))); invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 5, 1), callContext); // DAY 30 have to get out of trial before first payment addDaysAndCheckForCompletion(30, NextEvent.PHASE, NextEvent.INVOICE, NextEvent.PAYMENT_ERROR, NextEvent.INVOICE_PAYMENT_ERROR); final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, false, callContext); assertEquals(invoices.size(), 2); final Invoice nonNullInvoice = invoices.get(1); assertTrue(nonNullInvoice.getBalance().compareTo(BigDecimal.ZERO) > 0); // Set the WRITTEN_OFF tag busHandler.pushExpectedEvents(NextEvent.TAG); tagUserApi.addTag(nonNullInvoice.getId(), ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), callContext); assertListenerStatus(); // Move after what should be OD1 (if invoice had not been written off) addDaysAndCheckForCompletion(6); // Should still be in clear state because of WRITTEN_OFF tag checkODState(OverdueWrapper.CLEAR_STATE_NAME); // Remove the WRITTEN_OFF tag and verify overdue state is now OD1 busHandler.pushExpectedEvents(NextEvent.TAG, NextEvent.BLOCK); tagUserApi.removeTag(nonNullInvoice.getId(), ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), callContext); assertListenerStatus(); checkODState("OD1"); }