killbill-uncached
Changes
.gitignore 2(+1 -1)
analytics/pom.xml 10(+6 -4)
catalog/pom.xml 2(+1 -1)
catalog/src/test/resources/log4j.xml 36(+36 -0)
invoice/pom.xml 10(+10 -0)
invoice/src/main/resources/ddl.sql 34(+34 -0)
util/pom.xml 10(+10 -0)
Details
.gitignore 2(+1 -1)
diff --git a/.gitignore b/.gitignore
index 2f47d40..6fa2692 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,5 +15,5 @@ logs/
*.settings
*.project
*/bin/
-catalog/src/main/resources/CatalogSchema.xsd
+catalog/src/test/resources/CatalogSchema.xsd
*/test-output/
\ No newline at end of file
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
index 3feae9d..e95c0aa 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
@@ -16,27 +16,21 @@
package com.ning.billing.account.dao;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertFalse;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.List;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Stage;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.glue.AccountModule;
import com.ning.billing.account.glue.AccountModuleMock;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
public class TestSimpleAccountDao {
analytics/pom.xml 10(+6 -4)
diff --git a/analytics/pom.xml b/analytics/pom.xml
index a6aa930..81f5197 100644
--- a/analytics/pom.xml
+++ b/analytics/pom.xml
@@ -63,14 +63,16 @@
<scope>runtime</scope>
</dependency>
<dependency>
- <groupId>org.jdbi</groupId>
- <artifactId>jdbi</artifactId>
- </dependency>
- <dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.ning.billing</groupId>
+ <artifactId>killbill-util</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
</build>
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestEventDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestEventDao.java
index 453f35f..f27db78 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestEventDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestEventDao.java
@@ -16,21 +16,11 @@
package com.ning.billing.analytics.dao;
-import com.ning.billing.analytics.BusinessSubscription;
-import com.ning.billing.analytics.BusinessSubscriptionEvent;
-import com.ning.billing.analytics.BusinessSubscriptionTransition;
-import com.ning.billing.analytics.MockDuration;
-import com.ning.billing.analytics.MockPhase;
-import com.ning.billing.analytics.MockPlan;
-import com.ning.billing.analytics.MockProduct;
-import com.ning.billing.analytics.MockSubscription;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.catalog.api.IPlan;
-import com.ning.billing.catalog.api.IPlanPhase;
-import com.ning.billing.catalog.api.IProduct;
-import com.ning.billing.catalog.api.PhaseType;
-import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.analytics.*;
+import com.ning.billing.catalog.api.*;
+import com.ning.billing.dbi.MysqlTestingHelper;
import com.ning.billing.entitlement.api.user.ISubscription;
+import org.apache.commons.io.IOUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.skife.jdbi.v2.IDBI;
@@ -56,8 +46,10 @@ public class TestEventDao
@BeforeClass(alwaysRun = true)
public void startMysql() throws IOException, ClassNotFoundException, SQLException
{
+ final String ddl = IOUtils.toString(EventDao.class.getResourceAsStream("/com/ning/billing/analytics/ddl.sql"));
+
helper.startMysql();
- helper.initDb();
+ helper.initDb(ddl);
final IProduct product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
final IPlan plan = new MockPlan("platinum-monthly", product);
catalog/pom.xml 2(+1 -1)
diff --git a/catalog/pom.xml b/catalog/pom.xml
index a327ddd..cd42fb4 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -49,7 +49,7 @@
<configuration>
<mainClass>com.ning.billing.catalog.io.XMLSchemaGenerator</mainClass>
<arguments>
- <argument>${project.basedir}/src/main/resources</argument>
+ <argument>${project.basedir}/src/test/resources</argument>
</arguments>
</configuration>
</execution>
diff --git a/catalog/src/main/java/com/ning/billing/catalog/Case.java b/catalog/src/main/java/com/ning/billing/catalog/Case.java
index a26c4ba..2d92df0 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/Case.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/Case.java
@@ -20,9 +20,6 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlIDREF;
import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.PhaseType;
-import com.ning.billing.catalog.api.PlanAlignmentChange;
-import com.ning.billing.catalog.api.PlanPhaseSpecifier;
import com.ning.billing.catalog.api.PlanSpecifier;
import com.ning.billing.catalog.api.ProductCategory;
diff --git a/catalog/src/main/java/com/ning/billing/catalog/CaseCreateAlignment.java b/catalog/src/main/java/com/ning/billing/catalog/CaseCreateAlignment.java
index 3a1ba1f..69a64ca 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/CaseCreateAlignment.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/CaseCreateAlignment.java
@@ -19,7 +19,6 @@ package com.ning.billing.catalog;
import javax.xml.bind.annotation.XmlElement;
import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.PlanAlignmentCreate;
import com.ning.billing.catalog.api.ProductCategory;
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java b/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
index 426f7c6..f9163e2 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
@@ -20,6 +20,7 @@ import java.io.IOException;
import java.net.URL;
import javax.xml.bind.JAXBException;
+import javax.xml.transform.TransformerException;
import org.xml.sax.SAXException;
@@ -29,6 +30,6 @@ import com.ning.billing.catalog.api.InvalidConfigException;
public interface ICatalogLoader {
public abstract VersionedCatalog load(URL url) throws IOException,
- SAXException, InvalidConfigException, JAXBException;
+ SAXException, InvalidConfigException, JAXBException, TransformerException;
}
\ No newline at end of file
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java b/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
index 59bffa3..fcda9d7 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Scanner;
import javax.xml.bind.JAXBException;
+import javax.xml.transform.TransformerException;
import org.xml.sax.SAXException;
@@ -43,7 +44,7 @@ public class VersionedCatalogLoader implements ICatalogLoader {
* @see com.ning.billing.catalog.io.ICatalogLoader#load(java.net.URL)
*/
@Override
- public VersionedCatalog load(URL url) throws IOException, SAXException, InvalidConfigException, JAXBException {
+ public VersionedCatalog load(URL url) throws IOException, SAXException, InvalidConfigException, JAXBException, TransformerException {
String directoryContents = pullContentsFrom(url);
List<URL> xmlURLs = findXmlReferences(directoryContents, url);
VersionedCatalog result = new VersionedCatalog();
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/XMLReader.java b/catalog/src/main/java/com/ning/billing/catalog/io/XMLReader.java
index 1f568ea..2a82a71 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/XMLReader.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/XMLReader.java
@@ -16,17 +16,19 @@
package com.ning.billing.catalog.io;
-import java.io.InputStream;
+import java.io.IOException;
import java.net.URL;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.stream.StreamSource;
+import javax.xml.transform.TransformerException;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import com.ning.billing.catalog.Catalog;
@@ -34,18 +36,17 @@ import com.ning.billing.catalog.ValidatingConfig.ValidationErrors;
import com.ning.billing.catalog.api.InvalidConfigException;
public class XMLReader {
+ public static Logger log = LoggerFactory.getLogger(XMLReader.class);
-
- public static Catalog getCatalogFromName(URL url) throws SAXException, InvalidConfigException, JAXBException {
+ public static Catalog getCatalogFromName(URL url) throws SAXException, InvalidConfigException, JAXBException, IOException, TransformerException {
JAXBContext context =JAXBContext.newInstance(Catalog.class);
- InputStream resourceStream = XMLReader.class.getResourceAsStream("/CatalogSchema.xsd");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI );
- Schema schema = factory.newSchema(new StreamSource(resourceStream));
-
Unmarshaller um = context.createUnmarshaller();
- um.setSchema(schema);
+ Schema schema = factory.newSchema(XMLSchemaGenerator.xmlSchema());
+ um.setSchema(schema);
+
Object o = um.unmarshal(url);
if(o instanceof Catalog) {
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/XMLSchemaGenerator.java b/catalog/src/main/java/com/ning/billing/catalog/io/XMLSchemaGenerator.java
index ae41c61..db61c1b 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/XMLSchemaGenerator.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/XMLSchemaGenerator.java
@@ -16,6 +16,8 @@
package com.ning.billing.catalog.io;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -33,14 +35,16 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import com.ning.billing.catalog.Catalog;
public class XMLSchemaGenerator {
+ final private static int MAX_SCHEMA_SIZE_IN_BYTES = 100000;
- //Note: this main method is called byt the maven build to generate the schema for the jar
+ //Note: this main method is called by the maven build to generate the schema for the jar
public static void main(String[] args) throws IOException, TransformerException, JAXBException {
JAXBContext context =JAXBContext.newInstance(Catalog.class);
String xsdFileName = "CatalogSchema.xsd";
@@ -51,6 +55,13 @@ public class XMLSchemaGenerator {
pojoToXSD(context, s);
}
+ public static StreamSource xmlSchema() throws IOException, TransformerException, JAXBException {
+ ByteArrayOutputStream output = new ByteArrayOutputStream(MAX_SCHEMA_SIZE_IN_BYTES);
+ JAXBContext context =JAXBContext.newInstance(Catalog.class);
+ pojoToXSD(context, output);
+ StreamSource source = new StreamSource(new ByteArrayInputStream(output.toByteArray()));
+ return source;
+ }
public static void pojoToXSD(JAXBContext context, OutputStream out)
throws IOException, TransformerException
diff --git a/catalog/src/main/java/com/ning/billing/catalog/Plan.java b/catalog/src/main/java/com/ning/billing/catalog/Plan.java
index a220cf7..bfdd093 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/Plan.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/Plan.java
@@ -27,7 +27,6 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
-import com.ning.billing.catalog.api.BillingAlignment;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.IPlan;
import com.ning.billing.catalog.api.IPlanPhase;
diff --git a/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java b/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
index 46188af..e858b82 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
@@ -18,7 +18,6 @@ package com.ning.billing.catalog.io;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
-import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@@ -26,12 +25,13 @@ import java.util.Iterator;
import java.util.List;
import javax.xml.bind.JAXBException;
+import javax.xml.transform.TransformerException;
-import com.google.common.io.Resources;
import org.joda.time.DateTime;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
+import com.google.common.io.Resources;
import com.ning.billing.catalog.Catalog;
import com.ning.billing.catalog.VersionedCatalog;
import com.ning.billing.catalog.api.InvalidConfigException;
@@ -126,7 +126,7 @@ public class TestVersionedCatalogLoader {
}
@Test(enabled=true)
- public void testLoad() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException {
+ public void testLoad() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException, TransformerException {
VersionedCatalog c = loader.load(Resources.getResource("versionedCatalog"));
assertEquals(4, c.size());
Iterator<Catalog> it = c.iterator();
diff --git a/catalog/src/test/java/com/ning/billing/catalog/io/TestXMLReader.java b/catalog/src/test/java/com/ning/billing/catalog/io/TestXMLReader.java
index 97dbc3b..1d08c31 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/io/TestXMLReader.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/io/TestXMLReader.java
@@ -16,16 +16,15 @@
package com.ning.billing.catalog.io;
-import java.io.File;
import java.io.IOException;
import javax.xml.bind.JAXBException;
import javax.xml.transform.TransformerException;
-import com.google.common.io.Resources;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
+import com.google.common.io.Resources;
import com.ning.billing.catalog.api.InvalidConfigException;
public class TestXMLReader {
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestCaseChange.java b/catalog/src/test/java/com/ning/billing/catalog/TestCaseChange.java
index ed2972d..ed48ccf 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestCaseChange.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestCaseChange.java
@@ -25,8 +25,8 @@ import org.testng.annotations.Test;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.PhaseType;
-import com.ning.billing.catalog.api.PlanPhaseSpecifier;
-import com.ning.billing.catalog.api.PlanSpecifier;
+import com.ning.billing.catalog.api.PlanPhaseSpecifier;
+import com.ning.billing.catalog.api.PlanSpecifier;
import com.ning.billing.catalog.api.ProductCategory;
public class TestCaseChange {
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java b/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
index 8a7b07f..ee4d094 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
@@ -16,20 +16,19 @@
package com.ning.billing.catalog;
import static org.testng.AssertJUnit.assertEquals;
-import java.io.File;
+
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Date;
import javax.xml.bind.JAXBException;
+import javax.xml.transform.TransformerException;
-import com.google.common.io.Resources;
import org.joda.time.DateTime;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
-import com.ning.billing.catalog.Catalog;
-import com.ning.billing.catalog.VersionedCatalog;
+import com.google.common.io.Resources;
import com.ning.billing.catalog.api.InvalidConfigException;
import com.ning.billing.catalog.io.ICatalogLoader;
import com.ning.billing.catalog.io.VersionedCatalogLoader;
@@ -38,14 +37,14 @@ public class TestVersionedCatalog {
private final ICatalogLoader loader = new VersionedCatalogLoader();
@Test(enabled=true)
- public void testAddCatalog() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException {
+ public void testAddCatalog() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException, TransformerException {
VersionedCatalog vc = loader.load(Resources.getResource("versionedCatalog"));
vc.add(new Catalog(new Date()));
assertEquals(5, vc.size());
}
@Test(enabled=true)
- public void testApplyEffectiveDate() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException {
+ public void testApplyEffectiveDate() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException, TransformerException {
VersionedCatalog vc = loader.load(Resources.getResource("versionedCatalog"));
Date d = new Date(1L);
vc.configureEffectiveDate(d);
catalog/src/test/resources/log4j.xml 36(+36 -0)
diff --git a/catalog/src/test/resources/log4j.xml b/catalog/src/test/resources/log4j.xml
new file mode 100644
index 0000000..75abc76
--- /dev/null
+++ b/catalog/src/test/resources/log4j.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2010-2011 Ning, Inc.
+ ~
+ ~ Ning licenses this file to you under the Apache License, version 2.0
+ ~ (the "License"); you may not use this file except in compliance with the
+ ~ License. You may obtain a copy of the License at:
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ ~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ ~ License for the specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%p %d{ISO8601} %X{trace} %t %c %m%n"/>
+ </layout>
+ </appender>
+
+
+ <logger name="com.ning.billing.entitlement">
+ <level value="info"/>
+ </logger>
+
+ <root>
+ <priority value="info"/>
+ <appender-ref ref="stdout"/>
+ </root>
+</log4j:configuration>
invoice/pom.xml 10(+10 -0)
diff --git a/invoice/pom.xml b/invoice/pom.xml
index a8d9ad0..ea85b04 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -30,6 +30,16 @@
<artifactId>testng</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jdbi</groupId>
+ <artifactId>jdbi</artifactId>
+ <version>2.27</version>
+ </dependency>
</dependencies>
<build>
</build>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
new file mode 100644
index 0000000..9abc12a
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.dao;
+
+import com.ning.billing.invoice.model.Invoice;
+import org.skife.jdbi.v2.sqlobject.Bind;
+import org.skife.jdbi.v2.sqlobject.BindBean;
+import org.skife.jdbi.v2.sqlobject.SqlQuery;
+import org.skife.jdbi.v2.sqlobject.SqlUpdate;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@ExternalizedSqlViaStringTemplate3()
+@RegisterMapper(InvoiceMapper.class)
+public interface InvoiceDao {
+ @SqlQuery
+ List<Invoice> getInvoicesByAccount(@Bind final String accountId);
+
+ @SqlQuery
+ Invoice getInvoice(@Bind final String invoiceId);
+
+ @SqlUpdate
+ void createInvoice(@BindBean final Invoice invoice);
+
+ @SqlUpdate
+ void addPayment(@Bind final String invoiceId, @Bind final BigDecimal paymentAmount);
+
+ @SqlQuery
+ int test();
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java
new file mode 100644
index 0000000..9de9f76
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.dao;
+
+import com.ning.billing.invoice.model.InvoiceItem;
+import com.ning.billing.invoice.model.InvoiceItemList;
+import org.skife.jdbi.v2.sqlobject.Bind;
+import org.skife.jdbi.v2.sqlobject.BindBean;
+import org.skife.jdbi.v2.sqlobject.SqlQuery;
+import org.skife.jdbi.v2.sqlobject.SqlUpdate;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+
+@ExternalizedSqlViaStringTemplate3()
+@RegisterMapper(InvoiceItemMapper.class)
+public interface InvoiceItemDao {
+ @SqlQuery
+ InvoiceItemList getInvoiceItemsByInvoice(@Bind final String invoiceId);
+
+ @SqlQuery
+ InvoiceItemList getInvoiceItemsByAccount(@Bind final String accountId);
+
+ @SqlUpdate
+ void createInvoiceItem(@BindBean final InvoiceItem invoiceItem);
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceMapper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceMapper.java
new file mode 100644
index 0000000..335b3c5
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceMapper.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.dao;
+
+import com.ning.billing.invoice.model.Invoice;
+import org.skife.jdbi.v2.BeanMapper;
+
+public class InvoiceMapper extends BeanMapper<Invoice> {
+ public InvoiceMapper() {
+ super(Invoice.class);
+ }
+}
\ No newline at end of file
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 29d4370..730c22b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -27,21 +27,28 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
public class DefaultInvoiceGenerator implements IInvoiceGenerator {
@Override
- public InvoiceItemList generateInvoiceItems(final BillingEventSet events, final InvoiceItemList existingItems, final DateTime targetDate, final Currency targetCurrency) {
- if (events == null) {return new InvoiceItemList();}
- if (events.size() == 0) {return new InvoiceItemList();}
+ public Invoice generateInvoice(final UUID accountId, final BillingEventSet events, final InvoiceItemList existingItems, final DateTime targetDate, final Currency targetCurrency) {
+ if (events == null) {return new Invoice(accountId, targetCurrency);}
+ if (events.size() == 0) {return new Invoice(accountId, targetCurrency);}
- InvoiceItemList currentItems = generateInvoiceItems(events, targetDate, targetCurrency);
- InvoiceItemList itemsToPost = reconcileInvoiceItems(currentItems, existingItems);
+ Invoice invoice = new Invoice(accountId, targetCurrency);
+ InvoiceItemList currentItems = generateInvoiceItems(events, invoice.getInvoiceId(), targetDate, targetCurrency);
+ InvoiceItemList itemsToPost = reconcileInvoiceItems(invoice.getInvoiceId(), currentItems, existingItems);
+ invoice.add(itemsToPost);
- return itemsToPost;
+ return invoice;
}
- private InvoiceItemList reconcileInvoiceItems(final InvoiceItemList currentInvoiceItems, final InvoiceItemList existingInvoiceItems) {
- InvoiceItemList currentItems = (InvoiceItemList) currentInvoiceItems.clone();
+ private InvoiceItemList reconcileInvoiceItems(final UUID invoiceId, final InvoiceItemList currentInvoiceItems, final InvoiceItemList existingInvoiceItems) {
+ InvoiceItemList currentItems = new InvoiceItemList();
+ for (InvoiceItem item : currentInvoiceItems) {
+ currentItems.add(new InvoiceItem(item, invoiceId));
+ }
+
InvoiceItemList existingItems = (InvoiceItemList) existingInvoiceItems.clone();
Collections.sort(currentItems);
@@ -69,13 +76,13 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
// add existing items that aren't covered by current items as credit items
for (InvoiceItem existingItem : existingItems) {
- currentItems.add(existingItem.asCredit());
+ currentItems.add(existingItem.asCredit(invoiceId));
}
return currentItems;
}
- private InvoiceItemList generateInvoiceItems(BillingEventSet events, DateTime targetDate, Currency targetCurrency) {
+ private InvoiceItemList generateInvoiceItems(BillingEventSet events, UUID invoiceId, DateTime targetDate, Currency targetCurrency) {
InvoiceItemList items = new InvoiceItemList();
// sort events; this relies on the sort order being by subscription id then start date
@@ -88,41 +95,41 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
IBillingEvent nextEvent = events.get(i + 1);
if (thisEvent.getSubscriptionId() == nextEvent.getSubscriptionId()) {
- processEvents(thisEvent, nextEvent, items, targetDate, targetCurrency);
+ processEvents(invoiceId, thisEvent, nextEvent, items, targetDate, targetCurrency);
} else {
- processEvent(thisEvent, items, targetDate, targetCurrency);
+ processEvent(invoiceId, thisEvent, items, targetDate, targetCurrency);
}
}
// process the last item in the event set
if (events.size() > 0) {
- processEvent(events.getLast(), items, targetDate, targetCurrency);
+ processEvent(invoiceId, events.getLast(), items, targetDate, targetCurrency);
}
return items;
}
- private void processEvent(IBillingEvent event, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
+ private void processEvent(UUID invoiceId, IBillingEvent event, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
BigDecimal rate = event.getPrice(targetCurrency);
BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(event, targetDate, rate);
IBillingMode billingMode = getBillingMode(event.getBillingMode());
DateTime billThroughDate = billingMode.calculateEffectiveEndDate(event.getEffectiveDate(), targetDate, event.getBillCycleDay(), event.getBillingPeriod());
- addInvoiceItem(items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ addInvoiceItem(invoiceId, items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
}
- private void processEvents(IBillingEvent firstEvent, IBillingEvent secondEvent, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
+ private void processEvents(UUID invoiceId, IBillingEvent firstEvent, IBillingEvent secondEvent, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
BigDecimal rate = firstEvent.getPrice(targetCurrency);
BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(firstEvent, secondEvent, targetDate, rate);
IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
DateTime billThroughDate = billingMode.calculateEffectiveEndDate(firstEvent.getEffectiveDate(), secondEvent.getEffectiveDate(), targetDate, firstEvent.getBillCycleDay(), firstEvent.getBillingPeriod());
- addInvoiceItem(items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
+ addInvoiceItem(invoiceId, items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
}
- private void addInvoiceItem(List<InvoiceItem> items, IBillingEvent event, DateTime billThroughDate, BigDecimal amount, BigDecimal rate, Currency currency) {
+ private void addInvoiceItem(UUID invoiceId, List<InvoiceItem> items, IBillingEvent event, DateTime billThroughDate, BigDecimal amount, BigDecimal rate, Currency currency) {
if (!(amount.compareTo(BigDecimal.ZERO) == 0)) {
- InvoiceItem item = new InvoiceItem(event.getSubscriptionId(), event.getEffectiveDate(), billThroughDate, event.getDescription(), amount, rate, currency);
+ InvoiceItem item = new InvoiceItem(invoiceId, event.getSubscriptionId(), event.getEffectiveDate(), billThroughDate, event.getDescription(), amount, rate, currency);
items.add(item);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/IInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/IInvoiceGenerator.java
index 468686b..09d5e47 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/IInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/IInvoiceGenerator.java
@@ -20,7 +20,9 @@ import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.BillingEventSet;
import org.joda.time.DateTime;
+import java.util.UUID;
+
// TODO: Jeff -- Determine what the consequence of account-level currency changes are on repair scenarios
public interface IInvoiceGenerator {
- public InvoiceItemList generateInvoiceItems(BillingEventSet events, InvoiceItemList items, DateTime targetDate, Currency targetCurrency);
+ public Invoice generateInvoice(UUID accountId, BillingEventSet events, InvoiceItemList items, DateTime targetDate, Currency targetCurrency);
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/Invoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/Invoice.java
index 02ce760..8d67d53 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/Invoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/Invoice.java
@@ -17,21 +17,35 @@
package com.ning.billing.invoice.model;
import com.ning.billing.catalog.api.Currency;
+import org.joda.time.DateTime;
import java.math.BigDecimal;
import java.util.List;
+import java.util.UUID;
public class Invoice {
private final InvoiceItemList items = new InvoiceItemList();
+ private final UUID invoiceId;
+ private UUID accountId;
+ private final DateTime invoiceDate;
private Currency currency;
- public Invoice() {}
+ public Invoice() {
+ this.invoiceId = UUID.randomUUID();
+ this.invoiceDate = new DateTime();
+ }
- public Invoice(Currency currency) {
+ public Invoice(UUID accountId, Currency currency) {
+ this.invoiceId = UUID.randomUUID();
+ this.accountId = accountId;
+ this.invoiceDate = new DateTime();
this.currency = currency;
}
- public Invoice(List<InvoiceItem> items, Currency currency) {
+ public Invoice(UUID accountId, List<InvoiceItem> items, Currency currency) {
+ this.invoiceId = UUID.randomUUID();
+ this.accountId = accountId;
+ this.invoiceDate = new DateTime();
this.currency = currency;
this.items.addAll(items);
}
@@ -48,6 +62,22 @@ public class Invoice {
return items;
}
+ public int getNumberOfItems() {
+ return items.size();
+ }
+
+ public UUID getInvoiceId() {
+ return invoiceId;
+ }
+
+ public UUID getAccountId() {
+ return accountId;
+ }
+
+ public DateTime getInvoiceDate() {
+ return invoiceDate;
+ }
+
public Currency getCurrency() {
return currency;
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItem.java
index ae3ab53..7645575 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItem.java
@@ -23,6 +23,8 @@ import java.math.BigDecimal;
import java.util.UUID;
public class InvoiceItem implements Comparable<InvoiceItem> {
+ private final UUID invoiceItemId;
+ private final UUID invoiceId;
private final UUID subscriptionId;
private DateTime startDate;
private DateTime endDate;
@@ -31,7 +33,9 @@ public class InvoiceItem implements Comparable<InvoiceItem> {
private final BigDecimal rate;
private final Currency currency;
- public InvoiceItem(UUID subscriptionId, DateTime startDate, DateTime endDate, String description, BigDecimal amount, BigDecimal rate, Currency currency) {
+ public InvoiceItem(UUID invoiceId, UUID subscriptionId, DateTime startDate, DateTime endDate, String description, BigDecimal amount, BigDecimal rate, Currency currency) {
+ this.invoiceItemId = UUID.randomUUID();
+ this.invoiceId = invoiceId;
this.subscriptionId = subscriptionId;
this.startDate = startDate;
this.endDate = endDate;
@@ -41,8 +45,20 @@ public class InvoiceItem implements Comparable<InvoiceItem> {
this.currency = currency;
}
- public InvoiceItem asCredit() {
- return new InvoiceItem(subscriptionId, startDate, endDate, description, amount.negate(), rate, currency);
+ public InvoiceItem(InvoiceItem that, UUID invoiceId) {
+ this.invoiceItemId = UUID.randomUUID();
+ this.invoiceId = invoiceId;
+ this.subscriptionId = that.subscriptionId;
+ this.startDate = that.startDate;
+ this.endDate = that.endDate;
+ this.description = that.description;
+ this.amount = that.amount;
+ this.rate = that.rate;
+ this.currency = that.currency;
+ }
+
+ public InvoiceItem asCredit(UUID invoiceId) {
+ return new InvoiceItem(invoiceId, subscriptionId, startDate, endDate, description, amount.negate(), rate, currency);
}
public UUID getSubscriptionId() {
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceDao.sql.stg
new file mode 100644
index 0000000..da2eade
--- /dev/null
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceDao.sql.stg
@@ -0,0 +1,24 @@
+group InvoiceDao;
+
+getInvoicesByAccount() ::= <<
+ select * from invoices where account_id = :accountId order by invoiceDate asc;
+>>
+
+getInvoice() ::= <<
+ select * from invoices where invoice_id = :invoiceId;
+>>
+
+createInvoice() ::= <<
+ INSERT INTO invoices(invoice_id, account_id, invoiceDate)
+ VALUES (:invoiceId, :accountId, :invoiceDate);
+>>
+
+addPayment() ::= <<
+ UPDATE invoices SET amount_paid = amount_paid + :paymentAmount
+ WHERE invoice_id = :invoiceId;
+>>
+
+test() ::= <<
+ SELECT DISTINCT 1 FROM invoices;
+>>
+;
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceItemDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceItemDao.sql.stg
new file mode 100644
index 0000000..479b4cf
--- /dev/null
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceItemDao.sql.stg
@@ -0,0 +1,13 @@
+group InvoiceItemDao;
+
+getInvoiceItemsByInvoice() ::= <<
+>>
+
+getInvoiceItemsByAccount() ::= <<
+>>
+
+createInvoiceItem() ::= <<
+ INSERT INTO invoice_items(invoice_item_id, subscription_id, start_date, end_date, description, amount, rate, currency)
+ VALUES(:invoiceItemId, :invoiceId, :subscriptionId, :startDate, :endDate, :description, :amount, :rate, :currency)
+>>
+;
invoice/src/main/resources/ddl.sql 34(+34 -0)
diff --git a/invoice/src/main/resources/ddl.sql b/invoice/src/main/resources/ddl.sql
new file mode 100644
index 0000000..1a851a0
--- /dev/null
+++ b/invoice/src/main/resources/ddl.sql
@@ -0,0 +1,34 @@
+DROP TABLE IF EXISTS invoice_items;
+CREATE TABLE invoice_items (
+ id int(11) unsigned NOT NULL AUTO_INCREMENT,
+ invoice_item_id char(36) NOT NULL,
+ invoice_id char(36) NOT NULL,
+ subscription_id char(36) NOT NULL,
+ start_date datetime NOT NULL,
+ end_date datetime NOT NULL,
+ description varchar(100) NOT NULL,
+ amount numeric(10,4) NOT NULL,
+ rate numeric(10,4) NOT NULL,
+ currency varchar(5) NOT NULL,
+ PRIMARY KEY(id)
+) ENGINE=innodb;
+
+CREATE INDEX invoice_items_subscription_id ON invoice_items(subscription_id ASC);
+
+DROP TABLE IF EXISTS invoices;
+CREATE TABLE invoices (
+ id int(11) unsigned NOT NULL AUTO_INCREMENT,
+ invoice_id char(36) NOT NULL,
+ account_id char(36) NOT NULL,
+ invoice_date datetime NOT NULL,
+ amount_paid numeric(10,4) NOT NULL DEFAULT 0,
+ amount_outstanding numeric(10,4) NOT NULL,
+ last_payment_attempt datetime DEFAULT NULL,
+ PRIMARY KEY(id)
+) ENGINE=innodb;
+
+CREATE INDEX invoices_account_id ON invoices(account_id ASC);
+CREATE INDEX invoices_invoice_id ON invoices(invoice_id ASC);
+
+
+
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
new file mode 100644
index 0000000..5447094
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.dao;
+
+import org.testng.annotations.Test;
+
+@Test(groups = {"invoicing", "invoicing-dao"})
+public class InvoiceDaoTests {
+// private final MysqlTestingHelper helper = new MysqlTestingHelper();
+// private InvoiceDao dao;
+//
+// @BeforeClass(alwaysRun = true)
+// private void setup() {
+// final String ddl = IOUtils.toString(InvoiceDao.class.getResourceAsStream("/ddl.sql"));
+//
+// helper.startMysql();
+// helper.initDb();
+//
+// final IDBI dbi = helper.getDBI();
+// dao = dbi.onDemand(EventDao.class);
+//
+// // Healthcheck test to make sure MySQL is setup properly
+// try {
+// dao.test();
+// }
+// catch (Throwable t) {
+// Assert.fail(t.toString());
+// }
+// }
+//
+// @Test
+// public void testCreationAndRetrievalByAccount() {
+// InvoiceDao dao = dbi.onDemand(InvoiceDao.class);
+// UUID accountId = UUID.randomUUID();
+// Invoice invoice = new Invoice(accountId, Currency.USD);
+// DateTime invoiceDate = invoice.getInvoiceDate();
+//
+// dao.createInvoice(invoice);
+//
+// List<Invoice> invoices = dao.getInvoicesByAccount(accountId.toString());
+// assertNotNull(invoices);
+// assertEquals(invoices.size(), 1);
+// Invoice thisInvoice = invoices.get(0);
+// assertEquals(invoice.getAccountId(), accountId);
+// assertTrue(thisInvoice.getInvoiceDate().equals(invoiceDate));
+// assertEquals(thisInvoice.getCurrency(), Currency.USD);
+// assertEquals(thisInvoice.getNumberOfItems(), 0);
+// assertTrue(thisInvoice.getTotalAmount().compareTo(BigDecimal.ZERO) == 0);
+// }
+
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 4e7b756..01a533c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -22,10 +22,7 @@ import com.ning.billing.entitlement.api.billing.BillingMode;
import com.ning.billing.entitlement.api.billing.IBillingEvent;
import com.ning.billing.invoice.api.BillingEvent;
import com.ning.billing.invoice.api.BillingEventSet;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
-import com.ning.billing.invoice.model.IInvoiceGenerator;
-import com.ning.billing.invoice.model.InvoiceItem;
-import com.ning.billing.invoice.model.InvoiceItemList;
+import com.ning.billing.invoice.model.*;
import org.joda.time.DateTime;
import org.testng.annotations.Test;
@@ -41,11 +38,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
@Test
public void testWithNullEventSetAndNullInvoiceSet() {
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(null, null, new DateTime(), Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 0);
- assertEquals(invoiceItems.getTotalAmount(), ZERO);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 0);
+ assertEquals(invoice.getTotalAmount(), ZERO);
}
@Test
@@ -53,11 +51,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
BillingEventSet events = new BillingEventSet();
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, new DateTime(), Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, new DateTime(), Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 0);
- assertEquals(invoiceItems.getTotalAmount(), ZERO);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 0);
+ assertEquals(invoice.getTotalAmount(), ZERO);
}
@Test
@@ -77,11 +76,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 10, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 1);
- assertEquals(invoiceItems.getTotalAmount(), TWENTY);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 1);
+ assertEquals(invoice.getTotalAmount(), TWENTY);
}
@Test
@@ -102,15 +102,16 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 10, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 1);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 1);
BigDecimal expectedNumberOfBillingCycles;
expectedNumberOfBillingCycles = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
BigDecimal expectedAmount = expectedNumberOfBillingCycles.multiply(rate).setScale(NUMBER_OF_DECIMALS);
- assertEquals(invoiceItems.getTotalAmount(), expectedAmount);
+ assertEquals(invoice.getTotalAmount(), expectedAmount);
}
@Test
@@ -131,11 +132,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 10, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 2);
- assertEquals(invoiceItems.getTotalAmount(), FIVE.multiply(TWO).add(TEN).setScale(NUMBER_OF_DECIMALS));
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 2);
+ assertEquals(invoice.getTotalAmount(), FIVE.multiply(TWO).add(TEN).setScale(NUMBER_OF_DECIMALS));
}
@Test
@@ -157,10 +159,11 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 12, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 2);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 2);
BigDecimal numberOfCyclesEvent1;
numberOfCyclesEvent1 = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
@@ -172,7 +175,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
expectedValue = expectedValue.add(numberOfCyclesEvent2.multiply(TEN));
expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS);
- assertEquals(invoiceItems.getTotalAmount(), expectedValue);
+ assertEquals(invoice.getTotalAmount(), expectedValue);
}
@Test
@@ -200,11 +203,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
DateTime targetDate = buildDateTime(2011, 12, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 3);
- assertEquals(invoiceItems.getTotalAmount(), FIVE.add(TEN).add(TWO.multiply(THIRTY)).setScale(NUMBER_OF_DECIMALS));
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 3);
+ assertEquals(invoice.getTotalAmount(), FIVE.add(TEN).add(TWO.multiply(THIRTY)).setScale(NUMBER_OF_DECIMALS));
}
@Test
@@ -222,16 +226,17 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
events.add(event1);
InvoiceItemList existingInvoiceItems = new InvoiceItemList();
- InvoiceItem invoiceItem = new InvoiceItem(subscriptionId, startDate, buildDateTime(2012, 1, 1), "",
+ InvoiceItem invoiceItem = new InvoiceItem(UUID.randomUUID(), subscriptionId, startDate, buildDateTime(2012, 1, 1), "",
rate.multiply(FOUR), rate, Currency.USD);
existingInvoiceItems.add(invoiceItem);
DateTime targetDate = buildDateTime(2011, 12, 3);
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, Currency.USD);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), 0);
- assertEquals(invoiceItems.getTotalAmount(), ZERO);
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), 0);
+ assertEquals(invoice.getTotalAmount(), ZERO);
}
@Test
@@ -404,11 +409,12 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
private void testInvoiceGeneration(BillingEventSet events, InvoiceItemList existingInvoiceItems, DateTime targetDate, int expectedNumberOfItems, BigDecimal expectedAmount) {
Currency currency = Currency.USD;
- InvoiceItemList invoiceItems = generator.generateInvoiceItems(events, existingInvoiceItems, targetDate, currency);
- existingInvoiceItems.addAll(invoiceItems);
- assertNotNull(invoiceItems);
- assertEquals(invoiceItems.size(), expectedNumberOfItems);
- assertEquals(invoiceItems.getTotalAmount(), expectedAmount);
+ UUID accountId = UUID.randomUUID();
+ Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, currency);
+ existingInvoiceItems.addAll(invoice.getItems());
+ assertNotNull(invoice);
+ assertEquals(invoice.getNumberOfItems(), expectedNumberOfItems);
+ assertEquals(invoice.getTotalAmount(), expectedAmount);
}
// TODO: Jeff C -- how do we ensure that an annual add-on is properly aligned *at the end* with the base plan?
util/pom.xml 10(+10 -0)
diff --git a/util/pom.xml b/util/pom.xml
index 1266ef7..e41c388 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -56,6 +56,16 @@
<artifactId>testng</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.mysql</groupId>
+ <artifactId>management</artifactId>
+ <version>5.0.11</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
<plugins>