killbill-memoizeit
Changes
invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java 34(+15 -19)
pom.xml 2(+1 -1)
Details
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index e923e80..f777fcc 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -60,6 +60,7 @@ import org.killbill.billing.invoice.model.CreditAdjInvoiceItem;
import org.killbill.billing.invoice.model.DefaultInvoice;
import org.killbill.billing.invoice.model.ExternalChargeInvoiceItem;
import org.killbill.billing.invoice.model.InvoiceItemFactory;
+import org.killbill.billing.invoice.model.TaxInvoiceItem;
import org.killbill.billing.invoice.template.HtmlInvoice;
import org.killbill.billing.invoice.template.HtmlInvoiceGenerator;
import org.killbill.billing.tag.TagInternalApi;
@@ -288,6 +289,11 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
}
@Override
+ public List<InvoiceItem> insertTaxItems(final UUID accountId, final LocalDate effectiveDate, final Iterable<InvoiceItem> taxItems, final boolean autoCommit, final CallContext context) throws InvoiceApiException {
+ return insertItems(accountId, effectiveDate, InvoiceItemType.TAX, taxItems, autoCommit, context);
+ }
+
+ @Override
public InvoiceItem getCreditById(final UUID creditId, final TenantContext context) throws InvoiceApiException {
final InvoiceItem creditItem = InvoiceItemFactory.fromModelDao(dao.getCreditById(creditId, internalCallContextFactory.createInternalTenantContext(creditId, ObjectType.INVOICE_ITEM, context)));
if (creditItem == null) {
@@ -508,8 +514,6 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
final InvoiceItem newInvoiceItem;
switch (itemType) {
case EXTERNAL_CHARGE:
- final LocalDate startDate = MoreObjects.firstNonNull(inputItem.getStartDate(), effectiveDate);
- final LocalDate endDate = inputItem.getEndDate();
newInvoiceItem = new ExternalChargeInvoiceItem(UUIDs.randomUUID(),
context.getCreatedDate(),
curInvoiceForItem.getId(),
@@ -523,8 +527,8 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
inputItem.getPrettyPlanName(),
inputItem.getPrettyPhaseName(),
inputItem.getDescription(),
- startDate,
- endDate,
+ MoreObjects.firstNonNull(inputItem.getStartDate(), effectiveDate),
+ inputItem.getEndDate(),
inputItem.getAmount(),
inputItem.getRate(),
accountCurrency,
@@ -546,6 +550,16 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
inputItem.getDescription());
break;
+ case TAX:
+ newInvoiceItem = new TaxInvoiceItem(UUIDs.randomUUID(),
+ curInvoiceForItem.getId(),
+ accountId,
+ inputItem.getBundleId(),
+ inputItem.getDescription(),
+ MoreObjects.firstNonNull(inputItem.getStartDate(), effectiveDate),
+ inputItem.getAmount(),
+ accountCurrency);
+ break;
default:
throw new IllegalStateException(String.format("Unsupported to add item of type '%s'", itemType));
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
index 9a64ce5..8def71d 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
@@ -41,6 +41,7 @@ import org.killbill.billing.invoice.api.InvoicePaymentType;
import org.killbill.billing.invoice.api.InvoiceStatus;
import org.killbill.billing.invoice.model.DefaultInvoicePayment;
import org.killbill.billing.invoice.model.ExternalChargeInvoiceItem;
+import org.killbill.billing.invoice.model.TaxInvoiceItem;
import org.killbill.billing.util.api.TagApiException;
import org.killbill.billing.util.currency.KillBillMoney;
import org.killbill.billing.util.tag.ControlTagType;
@@ -144,25 +145,6 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
Assert.assertEquals(externalChargeInvoiceItem.getBundleId(), bundleId);
}
- private void verifyExternalChargeOnExistingInvoice(final BigDecimal initialInvoiceBalance, @Nullable final UUID bundleId,
- final BigDecimal externalChargeAmount, final InvoiceItem externalChargeInvoiceItem) throws InvoiceApiException {
- Assert.assertEquals(externalChargeInvoiceItem.getInvoiceId(), invoiceId);
- Assert.assertEquals(externalChargeInvoiceItem.getBundleId(), bundleId);
- Assert.assertEquals(externalChargeInvoiceItem.getInvoiceItemType(), InvoiceItemType.EXTERNAL_CHARGE);
- Assert.assertEquals(externalChargeInvoiceItem.getAccountId(), accountId);
- Assert.assertEquals(externalChargeInvoiceItem.getAmount().compareTo(externalChargeAmount), 0);
- Assert.assertEquals(externalChargeInvoiceItem.getCurrency(), accountCurrency);
- Assert.assertNull(externalChargeInvoiceItem.getLinkedItemId());
-
- // Verify the adjusted invoice balance
- final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
- Assert.assertEquals(adjustedInvoiceBalance.compareTo(initialInvoiceBalance.add(externalChargeAmount)), 0);
-
- // Verify the adjusted account balance
- final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
- Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
- }
-
@Test(groups = "slow", expectedExceptions = InvoiceApiException.class, expectedExceptionsMessageRegExp = ".*it is already in COMMITTED status")
public void testAdjustCommittedInvoice() throws Exception {
// Verify the initial invoice balance
@@ -250,6 +232,20 @@ public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
testAdjustPartialInvoiceItem(false);
}
+
+ @Test(groups = "slow")
+ public void testAddTaxItems() throws Exception {
+ final BigDecimal taxItemAmount = BigDecimal.TEN;
+ final UUID bundleId = UUID.randomUUID();
+ final InvoiceItem taxItem = new TaxInvoiceItem(null, accountId, bundleId, UUID.randomUUID().toString(), clock.getUTCToday(), taxItemAmount, accountCurrency);
+
+ final List<InvoiceItem> resultTaxInvoiceItems = invoiceUserApi.insertTaxItems(accountId, clock.getUTCToday(), ImmutableList.<InvoiceItem>of(taxItem), true, callContext);
+ Assert.assertEquals(resultTaxInvoiceItems.size(), 1);
+ Assert.assertEquals(resultTaxInvoiceItems.get(0).getAmount().compareTo(taxItemAmount), 0);
+ Assert.assertEquals(resultTaxInvoiceItems.get(0).getBundleId(), bundleId);
+ }
+
+
private void testAdjustPartialInvoiceItem(final boolean recurring) throws Exception {
final Account account = invoiceUtil.createAccount(callContext);
final UUID accountId = account.getId();
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index 298a255..2e23582 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -106,7 +106,6 @@ import org.slf4j.LoggerFactory;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -504,7 +503,7 @@ public class InvoiceResource extends JaxRsResourceBase {
@javax.ws.rs.core.Context final UriInfo uriInfo,
@javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, InvoiceApiException, PaymentApiException {
- final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+ //final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
final CallContext callContext = context.createCallContextWithAccountId(accountId, createdBy, reason, comment, request);
final Account account = accountUserApi.getAccountById(accountId, callContext);
@@ -525,6 +524,50 @@ public class InvoiceResource extends JaxRsResourceBase {
return Response.status(Status.OK).entity(createdExternalChargesJson).build();
}
+ @POST
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @Path("/" + TAXES + "/{accountId:" + UUID_PATTERN + "}")
+ @ApiOperation(value = "Create tax items", response = InvoiceItemJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 201, message = "Create tax items successfully"),
+ @ApiResponse(code = 400, message = "Invalid account id supplied"),
+ @ApiResponse(code = 404, message = "Account not found")})
+ public Response createTaxItems(@PathParam("accountId") final UUID accountId,
+ final List<InvoiceItemJson> taxItemJson,
+ @QueryParam(QUERY_AUTO_COMMIT) @DefaultValue("false") final Boolean autoCommit,
+ @QueryParam(QUERY_REQUESTED_DT) final String requestedDateTimeString,
+ @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+ @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 {
+ verifyNonNullOrEmpty(taxItemJson, "Body should be specified");
+ verifyNonNullOrEmpty(accountId, "AccountId needs to be set");
+
+ // TODO do we actually support passing that to invoice for invoice plugins ?
+ // final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+ final CallContext callContext = context.createCallContextWithAccountId(accountId, createdBy, reason, comment, request);
+
+ final Account account = accountUserApi.getAccountById(accountId, callContext);
+ final Iterable<InvoiceItem> sanitizedTaxItemsJson = validateSanitizeAndTranformInputItems(account.getCurrency(), taxItemJson);
+
+ final LocalDate requestedDate = toLocalDateDefaultToday(account, requestedDateTimeString, callContext);
+ final List<InvoiceItem> createdTaxItems = invoiceApi.insertTaxItems(account.getId(), requestedDate, sanitizedTaxItemsJson, autoCommit, callContext);
+
+ final List<InvoiceItemJson> createdTaxItemJson = Lists.<InvoiceItem, InvoiceItemJson>transform(createdTaxItems,
+ new Function<InvoiceItem, InvoiceItemJson>() {
+ @Override
+ public InvoiceItemJson apply(final InvoiceItem input) {
+ return new InvoiceItemJson(input);
+ }
+ }
+ );
+ return Response.status(Status.OK).entity(createdTaxItemJson).build();
+ }
+
+
+
private Iterable<InvoiceItem> validateSanitizeAndTranformInputItems(final Currency accountCurrency, final Iterable<InvoiceItemJson> inputItems) throws InvoiceApiException {
try {
final Iterable<InvoiceItemJson> sanitized = Iterables.transform(inputItems, new Function<InvoiceItemJson, InvoiceItemJson>() {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index 6434696..8451e15 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -188,6 +188,8 @@ public interface JaxrsResource {
String CHARGES = "charges";
String CHARGES_PATH = PREFIX + "/" + INVOICES + "/" + CHARGES;
+ String TAXES = "taxes";
+
String PAYMENTS = "payments";
String PAYMENTS_PATH = PREFIX + "/" + PAYMENTS;
pom.xml 2(+1 -1)
diff --git a/pom.xml b/pom.xml
index 60d6d3e..eebf585 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
<parent>
<artifactId>killbill-oss-parent</artifactId>
<groupId>org.kill-bill.billing</groupId>
- <version>0.141.75</version>
+ <version>0.141.76-SNAPSHOT</version>
</parent>
<artifactId>killbill</artifactId>
<version>0.19.17-SNAPSHOT</version>