@TimedResource @POST @Path("/" + MIGRATION + "/{accountId:" + UUID_PATTERN + "}") @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @ApiOperation(value = "Create a migration invoice", response = InvoiceJson.class, tags="Invoice") @ApiResponses(value = {@ApiResponse(code = 201, message = "Created migration invoice successfully"), @ApiResponse(code = 400, message = "Invalid account id or target datetime supplied")}) public Response createMigrationInvoice(@PathParam("accountId") final UUID accountId, final List<InvoiceItemJson> items, @Nullable @QueryParam(QUERY_TARGET_DATE) final String targetDate, @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 AccountApiException, InvoiceApiException { final CallContext callContext = context.createCallContextWithAccountId(accountId, createdBy, reason, comment, request); final Account account = accountUserApi.getAccountById(accountId, callContext); final Iterable<InvoiceItem> sanitizedInvoiceItems = validateSanitizeAndTranformInputItems(account.getCurrency(), items); final LocalDate resolvedTargetDate = toLocalDateDefaultToday(account, targetDate, callContext); final UUID invoiceId = invoiceApi.createMigrationInvoice(accountId, resolvedTargetDate, sanitizedInvoiceItems, callContext); return uriBuilder.buildResponse(uriInfo, InvoiceResource.class, "getInvoice", invoiceId, request); }
@Test(groups = "slow", description = "Verify invoice/account balance with migrated invoice. Verify account credit is not consumed and that invoice/account balance does not take into account migrated invoice.") public void testMigratedInvoiceWithAccountCredit() throws Exception { // Add credit on the account invoiceUserApi.insertCredit(accountId, BigDecimal.TEN, null, accountCurrency, true, null, null, null, callContext); final UUID invoiceId = invoiceUserApi.createMigrationInvoice(accountId, null, ImmutableList.<InvoiceItem>of(new FixedPriceInvoiceItem(UUID.randomUUID(), clock.getUTCNow(), null, accountId, null, null, null, "foo", "bar", null, null, BigDecimal.ONE, accountCurrency)), callContext); final Invoice invoice1 = invoiceUserApi.getInvoice(invoiceId, callContext); assertEquals(invoice1.getBalance().compareTo(BigDecimal.ZERO), 0); // Verify credit is **not applied** against migration invoice 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); }
private UUID createAndCheckMigrationInvoice(final UUID accountId) throws InvoiceApiException { final InvoiceItem recurringItem = new RecurringInvoiceItem(null, accountId, null, null, "productName", "planName", "phaseName", new LocalDate(2016, 2, 1), new LocalDate(2016, 3, 1), MIGRATION_INVOICE_AMOUNT, MIGRATION_INVOICE_AMOUNT, MIGRATION_INVOICE_CURRENCY); final UUID migrationInvoiceId = invoiceUserApi.createMigrationInvoice(accountId, date_migrated, ImmutableList.of(recurringItem), callContext); Assert.assertNotNull(migrationInvoiceId); //Double check it was created and values are correct final InvoiceModelDao invoice = invoiceDao.getById(migrationInvoiceId, internalCallContext); Assert.assertNotNull(invoice); Assert.assertEquals(invoice.getAccountId(), accountId); Assert.assertEquals(invoice.getTargetDate().compareTo(date_migrated), 0); //temp to avoid tz test artifact // Assert.assertEquals(invoice.getTargetDate(),now); Assert.assertEquals(invoice.getInvoiceItems().size(), 1); Assert.assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(MIGRATION_INVOICE_AMOUNT), 0); Assert.assertEquals(invoice.getInvoiceItems().get(0).getType(), InvoiceItemType.RECURRING); Assert.assertEquals(InvoiceModelDaoHelper.getRawBalanceForRegularInvoice(invoice).compareTo(BigDecimal.ZERO), 0); Assert.assertEquals(invoice.getCurrency(), MIGRATION_INVOICE_CURRENCY); Assert.assertTrue(invoice.isMigrated()); return migrationInvoiceId; }