killbill-aplcache
Details
diff --git a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
index 59fc392..1b128b0 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/setup/AnalyticsModule.java
@@ -21,8 +21,8 @@ import com.google.inject.AbstractModule;
import com.ning.billing.analytics.AnalyticsListener;
import com.ning.billing.analytics.BusinessAccountRecorder;
import com.ning.billing.analytics.BusinessSubscriptionTransitionRecorder;
+import com.ning.billing.analytics.api.DefaultAnalyticsService;
import com.ning.billing.analytics.api.AnalyticsService;
-import com.ning.billing.analytics.api.IAnalyticsService;
import com.ning.billing.analytics.dao.BusinessAccountDao;
import com.ning.billing.analytics.dao.BusinessAccountDaoProvider;
import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
@@ -40,6 +40,6 @@ public class AnalyticsModule extends AbstractModule
bind(BusinessAccountRecorder.class).asEagerSingleton();
bind(AnalyticsListener.class).asEagerSingleton();
- bind(IAnalyticsService.class).to(AnalyticsService.class).asEagerSingleton();
+ bind(AnalyticsService.class).to(DefaultAnalyticsService.class).asEagerSingleton();
}
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 395d694..6054529 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -87,7 +87,7 @@ public class TestAnalyticsService
private TagDefinitionSqlDao tagDao;
@Inject
- private AnalyticsService service;
+ private DefaultAnalyticsService service;
@Inject
private Bus bus;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java b/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
index 663ed78..10b5c70 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
@@ -59,6 +59,11 @@ public class MockPhase implements PlanPhase
return BigDecimal.valueOf(price);
}
+ @Override
+ public boolean isZero() {
+ return price == 0.0;
+ }
+
};
}
@@ -78,7 +83,11 @@ public class MockPhase implements PlanPhase
{
return BigDecimal.valueOf(price);
}
-
+
+ @Override
+ public boolean isZero() {
+ return price == 0.0;
+ }
};
}
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockPlan.java b/analytics/src/test/java/com/ning/billing/analytics/MockPlan.java
index 72ce7ca..d611eee 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockPlan.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockPlan.java
@@ -18,6 +18,7 @@ package com.ning.billing.analytics;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.CatalogApiException;
+import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.Plan;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.Product;
@@ -25,6 +26,8 @@ import com.ning.billing.catalog.api.Product;
import java.util.Date;
import java.util.Iterator;
+import org.joda.time.DateTime;
+
public class MockPlan implements Plan
{
private final String name;
@@ -98,4 +101,10 @@ public class MockPlan implements Plan
public boolean isRetired() {
return false;
}
+
+ @Override
+ public DateTime dateOfFirstRecurringNonZeroCharge(
+ DateTime subscriptionStartDate) {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/api/src/main/java/com/ning/billing/catalog/api/InternationalPrice.java b/api/src/main/java/com/ning/billing/catalog/api/InternationalPrice.java
index 2876f1d..e047175 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/InternationalPrice.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/InternationalPrice.java
@@ -25,4 +25,6 @@ public interface InternationalPrice {
public abstract BigDecimal getPrice(Currency currency) throws CatalogApiException;
+ public abstract boolean isZero();
+
}
\ No newline at end of file
diff --git a/api/src/main/java/com/ning/billing/catalog/api/Plan.java b/api/src/main/java/com/ning/billing/catalog/api/Plan.java
index c0dbce5..3abbfbe 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/Plan.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/Plan.java
@@ -19,6 +19,8 @@ package com.ning.billing.catalog.api;
import java.util.Date;
import java.util.Iterator;
+import org.joda.time.DateTime;
+
public interface Plan {
public abstract PlanPhase[] getInitialPhases();
@@ -42,4 +44,7 @@ public interface Plan {
public abstract Date getEffectiveDateForExistingSubscriptons();
public abstract PlanPhase findPhase(String name) throws CatalogApiException;
+
+ public abstract DateTime dateOfFirstRecurringNonZeroCharge(DateTime subscriptionStartDate);
+
}
\ No newline at end of file
beatrix/pom.xml 12(+11 -1)
diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index ded6f0f..c964ba4 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -34,6 +34,10 @@
</dependency>
<dependency>
<groupId>com.ning.billing</groupId>
+ <artifactId>killbill-payment</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.ning.billing</groupId>
<artifactId>killbill-catalog</artifactId>
</dependency>
<dependency>
@@ -47,7 +51,7 @@
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
- <version>3.0</version>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.skife.config</groupId>
@@ -58,6 +62,12 @@
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
+ <groupId>com.ning.billing</groupId>
+ <artifactId>killbill-payment</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>com.ning.jdbi</groupId>
<artifactId>jdbi-metrics</artifactId>
<scope>test</scope>
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultInternationalPrice.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultInternationalPrice.java
index 1c505f9..d0cf2c4 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultInternationalPrice.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultInternationalPrice.java
@@ -119,4 +119,18 @@ public class DefaultInternationalPrice extends ValidatingConfig<StandaloneCatalo
return zeroPrice;
}
+ @Override
+ public boolean isZero() {
+ for(DefaultPrice price :prices) {
+ try {
+ if( price.getValue().compareTo(BigDecimal.ZERO) != 0) {
+ return false;
+ }
+ } catch (CurrencyValueNull e) {
+ //Ignore if the currency is null we treat it as 0
+ }
+ }
+ return true;
+ }
+
}
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlan.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlan.java
index 4972e26..a249289 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlan.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlan.java
@@ -29,9 +29,12 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
+import org.joda.time.DateTime;
+
import com.ning.billing.ErrorCode;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.CatalogApiException;
+import com.ning.billing.catalog.api.PhaseType;
import com.ning.billing.catalog.api.Plan;
import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.catalog.api.Product;
@@ -228,6 +231,18 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements
this.plansAllowedInBundle = plansAllowedInBundle;
return this;
}
+ @Override
+ public DateTime dateOfFirstRecurringNonZeroCharge(DateTime subscriptionStartDate) {
+ DateTime result = subscriptionStartDate.toDateTime();
+ for (PlanPhase phase : getAllPhases()) {
+ if(phase.getRecurringPrice() == null || phase.getRecurringPrice().isZero()) {
+ result = phase.getDuration().addToDateTime(result);
+ } else {
+ break;
+ }
+ }
+ return result;
+ }
}
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestPlan.java b/catalog/src/test/java/com/ning/billing/catalog/TestPlan.java
index 00dd1b6..e58f71c 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestPlan.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestPlan.java
@@ -18,17 +18,21 @@ package com.ning.billing.catalog;
import java.util.Date;
+import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.Duration;
+import com.ning.billing.catalog.api.InternationalPrice;
+import com.ning.billing.catalog.api.PlanPhase;
import com.ning.billing.util.config.ValidationErrors;
public class TestPlan {
private static final Logger log = LoggerFactory.getLogger(TestPlan.class);
- @Test
+ @Test(groups={"fast"}, enabled = true)
public void testDateValidation() {
StandaloneCatalog c = new MockCatalog();
@@ -40,4 +44,80 @@ public class TestPlan {
errors.log(log);
}
+
+ private static class MyDuration extends DefaultDuration {
+ final int days;
+
+ public MyDuration(int days) {
+ this.days = days;
+ }
+
+ @Override
+ public DateTime addToDateTime(DateTime dateTime) {
+ return dateTime.plusDays(days);
+ }
+ }
+
+ private static class MyPlanPhase extends MockPlanPhase {
+ Duration duration;
+ boolean recurringPriceIsZero;
+
+ MyPlanPhase(int duration, boolean recurringPriceIsZero) {
+ this.duration= new MyDuration( duration );
+ this.recurringPriceIsZero = recurringPriceIsZero;
+ }
+ @Override
+ public Duration getDuration(){
+ return duration;
+ }
+
+ @Override
+ public InternationalPrice getRecurringPrice() {
+ return new MockInternationalPrice() {
+ @Override
+ public boolean isZero() {
+ return recurringPriceIsZero;
+ }
+ };
+ }
+ }
+
+ @Test(groups={"fast"}, enabled = true)
+ public void testDataCalc() {
+ DefaultPlan p0 = new MockPlan() {
+ public PlanPhase[] getAllPhases() {
+ return new PlanPhase[]{
+ new MyPlanPhase(10, true),
+ new MyPlanPhase(10, false),
+ };
+ }
+ };
+
+ DefaultPlan p1 = new MockPlan() {
+ public PlanPhase[] getAllPhases() {
+ return new PlanPhase[]{
+ new MyPlanPhase(10, true),
+ new MyPlanPhase(10, true),
+ new MyPlanPhase(10, true),
+ new MyPlanPhase(10, true),
+ new MyPlanPhase(10, false),
+ new MyPlanPhase(10, true),
+ };
+ }
+ };
+
+ DefaultPlan p2 = new MockPlan() {
+ public PlanPhase[] getAllPhases() {
+ return new PlanPhase[]{
+ new MyPlanPhase(10, false),
+ new MyPlanPhase(10, true),
+ };
+ }
+ };
+ DateTime requestedDate = new DateTime();
+ Assert.assertEquals(p0.dateOfFirstRecurringNonZeroCharge(requestedDate), requestedDate.plusDays(10));
+ Assert.assertEquals(p1.dateOfFirstRecurringNonZeroCharge(requestedDate), requestedDate.plusDays(40));
+ Assert.assertEquals(p2.dateOfFirstRecurringNonZeroCharge(requestedDate), requestedDate.plusDays(0));
+
+ }
}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
index 8577544..ab11024 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
@@ -43,4 +43,9 @@ public class InternationalPriceMock implements InternationalPrice {
return rate;
}
+ @Override
+ public boolean isZero() {
+ return rate.compareTo(BigDecimal.ZERO) == 0;
+ }
+
}
diff --git a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
index 9700450..892d424 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -67,11 +67,7 @@ public class RequestProcessor {
}
else {
List<Either<PaymentError, PaymentInfo>> results = paymentApi.createPayment(account, Arrays.asList(event.getInvoiceId().toString()));
-
- if (results.isEmpty()) {
- eventBus.post(new PaymentError("unknown", "No payment processed"));
- }
- else {
+ if (!results.isEmpty()) {
Either<PaymentError, PaymentInfo> result = results.get(0);
eventBus.post(result.isLeft() ? result.getLeft() : result.getRight());
}
diff --git a/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java b/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
index cbff01b..935b968 100644
--- a/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
+++ b/payment/src/main/java/com/ning/billing/payment/setup/PaymentModule.java
@@ -24,6 +24,7 @@ import com.google.inject.AbstractModule;
import com.ning.billing.payment.RequestProcessor;
import com.ning.billing.payment.api.DefaultPaymentApi;
import com.ning.billing.payment.api.PaymentApi;
+import com.ning.billing.payment.api.PaymentService;
import com.ning.billing.payment.dao.DefaultPaymentDao;
import com.ning.billing.payment.dao.PaymentDao;
import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
@@ -55,7 +56,7 @@ public class PaymentModule extends AbstractModule {
bind(PaymentProviderPluginRegistry.class).asEagerSingleton();
bind(PaymentApi.class).to(DefaultPaymentApi.class).asEagerSingleton();
bind(RequestProcessor.class).asEagerSingleton();
- bind(PaymentService.class).asEagerSingleton();
+ bind(PaymentService.class).to(DefaultPaymentService.class).asEagerSingleton();
installPaymentProviderPlugins(paymentConfig);
installPaymentDao();
}
pom.xml 11(+11 -0)
diff --git a/pom.xml b/pom.xml
index d72a41e..dd142a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -84,6 +84,17 @@
</dependency>
<dependency>
<groupId>com.ning.billing</groupId>
+ <artifactId>killbill-payment</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.ning.billing</groupId>
+ <artifactId>killbill-payment</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>com.ning.billing</groupId>
<artifactId>killbill-catalog</artifactId>
<version>${project.version}</version>
</dependency>