Details
diff --git a/api/src/main/java/com/ning/billing/catalog/api/MigrationPlan.java b/api/src/main/java/com/ning/billing/catalog/api/MigrationPlan.java
new file mode 100644
index 0000000..a6f4e91
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/catalog/api/MigrationPlan.java
@@ -0,0 +1,22 @@
+/*
+ * 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.catalog.api;
+
+public interface MigrationPlan extends Plan {
+ public static final String MIGRATION_PLAN_NAME = "__KILLBILL_MIGRATION_PLAN__";
+ public static final String MIGRATION_PLAN_PHASE_NAME = "__KILLBILL_MIGRATION_PLAN_PHASE__";
+}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
index 4a61849..09de79a 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/Invoice.java
@@ -31,7 +31,7 @@ public interface Invoice extends Entity {
List<InvoiceItem> getInvoiceItems();
- List<InvoiceItem> getInvoiceItems(Class clazz);
+ public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(Class<T> clazz);
int getNumberOfItems();
@@ -60,4 +60,6 @@ public interface Invoice extends Entity {
BigDecimal getBalance();
boolean isDueForPayment(DateTime targetDate, int numberOfDays);
+
+ boolean isMigrationInvoice();
}
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
index 5523e12..0f021c3 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
@@ -16,6 +16,13 @@
package com.ning.billing.catalog;
+import java.net.URI;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
import com.ning.billing.ErrorCode;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.CatalogApiException;
@@ -28,12 +35,6 @@ import com.ning.billing.util.config.ValidatingConfig;
import com.ning.billing.util.config.ValidationError;
import com.ning.billing.util.config.ValidationErrors;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.net.URI;
-
@XmlAccessorType(XmlAccessType.NONE)
public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implements PlanPhase {
@@ -59,8 +60,8 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
//Not exposed in XML
private Plan plan;
- public static String phaseName(Plan plan, PlanPhase phase) {
- return plan.getName() + "-" + phase.getPhaseType().toString().toLowerCase();
+ public static String phaseName(String planName, PhaseType phasetype) {
+ return planName + "-" + phasetype.toString().toLowerCase();
}
public static String planName(String phaseName) throws CatalogApiException {
@@ -110,7 +111,7 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
*/
@Override
public String getName() {
- return phaseName(plan,this);
+ return phaseName(plan.getName(),this.getPhaseType());
}
/* (non-Javadoc)
diff --git a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
index b7f7b79..029cdcd 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
@@ -17,6 +17,7 @@
package com.ning.billing.catalog;
import java.net.URI;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
@@ -254,6 +255,7 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
for(DefaultPlan p : plans) {
p.initialize(catalog, sourceURI);
}
+
}
diff --git a/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java b/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
index 092a863..244ca49 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
@@ -16,24 +16,21 @@
package com.ning.billing.catalog;
-import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.catalog.api.PhaseType;
-import com.ning.billing.catalog.api.ProductCategory;
+import java.util.Date;
+
import com.ning.billing.catalog.rules.CaseCancelPolicy;
import com.ning.billing.catalog.rules.CaseChangePlanAlignment;
import com.ning.billing.catalog.rules.CaseChangePlanPolicy;
import com.ning.billing.catalog.rules.CaseCreateAlignment;
import com.ning.billing.catalog.rules.PlanRules;
-import java.util.Date;
-
public class MockCatalog extends StandaloneCatalog {
private static final String[] PRODUCT_NAMES = new String[]{ "TestProduct1", "TestProduct2", "TestProduct3"};
public MockCatalog() {
setEffectiveDate(new Date());
setProducts(MockProduct.createAll());
- setPlans(MockPlan.createAll());
+ setPlans((DefaultPlan[])MockPlan.createAll());
populateRules();
populatePriceLists();
}
diff --git a/catalog/src/test/java/com/ning/billing/catalog/MockPlan.java b/catalog/src/test/java/com/ning/billing/catalog/MockPlan.java
index 58483c4..deececb 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/MockPlan.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/MockPlan.java
@@ -117,7 +117,7 @@ public class MockPlan extends DefaultPlan {
public static DefaultPlan[] createAll() {
- return new MockPlan[]{
+ return new DefaultPlan[]{
createBicycleTrialEvergreen1USD(),
createBicycleNoTrialEvergreen1USD(),
createPickupTrialEvergreen10USD(),
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestInternationalPrice.java b/catalog/src/test/java/com/ning/billing/catalog/TestInternationalPrice.java
index c14a157..2772fc4 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestInternationalPrice.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestInternationalPrice.java
@@ -71,7 +71,7 @@ public class TestInternationalPrice {
Assert.assertEquals(c.getCurrentPlans()[0].getFinalPhase().getRecurringPrice().getPrice(Currency.GBP), new BigDecimal(0));
}
- @Test
+ @Test
public void testNegativeValuePrices(){
StandaloneCatalog c = new MockCatalog();
c.setSupportedCurrencies(new Currency[]{Currency.GBP, Currency.EUR, Currency.USD, Currency.BRL, Currency.MXN});
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestPlanPhase.java b/catalog/src/test/java/com/ning/billing/catalog/TestPlanPhase.java
index a3b825d..e25ac82 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestPlanPhase.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestPlanPhase.java
@@ -60,10 +60,10 @@ public class TestPlanPhase {
DefaultPlanPhase ppEvergreen = MockPlanPhase.create1USDMonthlyEvergreen().setPhaseType(PhaseType.EVERGREEN).setPlan(p);
DefaultPlanPhase ppFixedterm = MockPlanPhase.create1USDMonthlyEvergreen().setPhaseType(PhaseType.FIXEDTERM).setPlan(p);
- String ppnDiscount = DefaultPlanPhase.phaseName(p, ppDiscount);
- String ppnTrial = DefaultPlanPhase.phaseName(p, ppTrial);
- String ppnEvergreen = DefaultPlanPhase.phaseName(p, ppEvergreen);
- String ppnFixedterm = DefaultPlanPhase.phaseName(p, ppFixedterm);
+ String ppnDiscount = DefaultPlanPhase.phaseName(p.getName(), ppDiscount.getPhaseType());
+ String ppnTrial = DefaultPlanPhase.phaseName(p.getName(), ppTrial.getPhaseType());
+ String ppnEvergreen = DefaultPlanPhase.phaseName(p.getName(), ppEvergreen.getPhaseType());
+ String ppnFixedterm = DefaultPlanPhase.phaseName(p.getName(), ppFixedterm.getPhaseType());
Assert.assertEquals(ppnTrial, planNameExt + "trial");
Assert.assertEquals(ppnEvergreen, planNameExt + "evergreen");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
new file mode 100644
index 0000000..27bda4b
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -0,0 +1,50 @@
+/*
+ * 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.api.migration;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.google.inject.Inject;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.dao.DefaultInvoiceDao;
+import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.invoice.model.MigrationInvoiceItem;
+import com.ning.billing.util.clock.Clock;
+
+public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
+
+ private DefaultInvoiceDao dao;
+
+ @Inject
+ public DefaultInvoiceMigrationApi(DefaultInvoiceDao dao) {
+ this.dao = dao;
+ }
+
+ @Override
+ public UUID createMigrationInvoice(UUID accountId, DateTime targetDate, BigDecimal balance, Currency currency, Clock clock) {
+ Invoice migrationInvoice = new DefaultInvoice(accountId, targetDate, currency, clock, true);
+ InvoiceItem migrationInvoiceItem = new MigrationInvoiceItem(migrationInvoice.getId(), targetDate, balance, currency);
+ migrationInvoice.addInvoiceItem(migrationInvoiceItem);
+ dao.create(migrationInvoice);
+ return migrationInvoice.getId();
+ }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/InvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/InvoiceMigrationApi.java
new file mode 100644
index 0000000..30c7371
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/InvoiceMigrationApi.java
@@ -0,0 +1,32 @@
+/*
+ * 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.api.migration;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.clock.Clock;
+
+public interface InvoiceMigrationApi {
+
+ UUID createMigrationInvoice(UUID accountId, DateTime targetDate,
+ BigDecimal balance, Currency currency, Clock clock);
+
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 05be556..3f66b9f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -119,8 +119,9 @@ public interface InvoiceSqlDao extends EntityDao<Invoice>, Transactional<Invoice
DateTime invoiceDate = new DateTime(result.getTimestamp("invoice_date"));
DateTime targetDate = new DateTime(result.getTimestamp("target_date"));
Currency currency = Currency.valueOf(result.getString("currency"));
+ boolean isMigrationInvoice = result.getBoolean("migration_invoice");
- return new DefaultInvoice(id, accountId, invoiceDate, targetDate, currency);
+ return new DefaultInvoice(id, accountId, invoiceDate, targetDate, currency, isMigrationInvoice);
}
}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index b11bfe2..c55846d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -16,14 +16,6 @@
package com.ning.billing.invoice.model;
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.invoice.api.InvoicePayment;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
-import org.joda.time.DateTime;
-
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +26,8 @@ import org.joda.time.DateTime;
import com.ning.billing.catalog.api.Currency;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.util.clock.Clock;
public class DefaultInvoice implements Invoice {
private final InvoiceItemList invoiceItems = new InvoiceItemList();
@@ -44,18 +37,29 @@ public class DefaultInvoice implements Invoice {
private final DateTime invoiceDate;
private final DateTime targetDate;
private final Currency currency;
+ private final boolean migrationInvoice;
public DefaultInvoice(UUID accountId, DateTime targetDate, Currency currency, Clock clock) {
this(UUID.randomUUID(), accountId, clock.getUTCNow(), targetDate, currency);
}
+ public DefaultInvoice(UUID accountId, DateTime targetDate, Currency currency, Clock clock, boolean migrationInvoice) {
+ this(UUID.randomUUID(), accountId, clock.getUTCNow(), targetDate, currency, migrationInvoice);
+ }
+
public DefaultInvoice(UUID invoiceId, UUID accountId, DateTime invoiceDate, DateTime targetDate,
Currency currency) {
+ this(invoiceId, accountId, invoiceDate, targetDate, currency, false);
+ }
+
+ public DefaultInvoice(UUID invoiceId, UUID accountId, DateTime invoiceDate, DateTime targetDate,
+ Currency currency, boolean migrationInvoice) {
this.id = invoiceId;
this.accountId = accountId;
this.invoiceDate = invoiceDate;
this.targetDate = targetDate;
this.currency = currency;
+ this.migrationInvoice = migrationInvoice;
}
@Override
@@ -74,7 +78,7 @@ public class DefaultInvoice implements Invoice {
}
@Override
- public List<InvoiceItem> getInvoiceItems(Class clazz) {
+ public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(Class<T> clazz) {
List<InvoiceItem> results = new ArrayList<InvoiceItem>();
for (InvoiceItem item : invoiceItems) {
if (item.getClass() == clazz) {
@@ -133,8 +137,13 @@ public class DefaultInvoice implements Invoice {
public Currency getCurrency() {
return currency;
}
-
+
@Override
+ public boolean isMigrationInvoice() {
+ return migrationInvoice;
+ }
+
+ @Override
public DateTime getLastPaymentAttempt() {
DateTime lastPaymentAttempt = null;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
new file mode 100644
index 0000000..9a0c2d8
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
@@ -0,0 +1,36 @@
+/*
+ * 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.model;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.MigrationPlan;
+
+public class MigrationInvoiceItem extends FixedPriceInvoiceItem {
+ private final static UUID MIGRATION_SUBSCRIPTION_ID = UUID.fromString("ed25f954-3aa2-4422-943b-c3037ad7257c"); //new UUID(0L,0L);
+
+ public MigrationInvoiceItem(UUID invoiceId, DateTime startDate, BigDecimal amount, Currency currency) {
+ super(invoiceId, MIGRATION_SUBSCRIPTION_ID, MigrationPlan.MIGRATION_PLAN_NAME, MigrationPlan.MIGRATION_PLAN_PHASE_NAME, startDate, startDate,
+ amount, currency, new DateTime(), new DateTime());
+ }
+
+
+}
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
index b9d3faa..adcb758 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/com/ning/billing/invoice/ddl.sql
@@ -46,6 +46,7 @@ CREATE TABLE invoices (
invoice_date datetime NOT NULL,
target_date datetime NOT NULL,
currency char(3) NOT NULL,
+ migration_invoice bool NOT NULL,
PRIMARY KEY(id)
) ENGINE=innodb;
CREATE INDEX invoices_account_id ON invoices(account_id ASC);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
new file mode 100644
index 0000000..e773be9
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -0,0 +1,29 @@
+/*
+ * 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.api.migration;
+
+import java.util.UUID;
+
+import org.testng.annotations.Test;
+
+public class TestDefaultInvoiceMigrationApi {
+
+ @Test(groups={"fast"},enabled=true)
+ public void test(){
+ System.out.println(UUID.randomUUID().toString());
+ }
+}