@Override
public Response doOperation(final CallContext ctx) throws EntitlementApiException,
AccountApiException {
final Entitlement current = entitlementApi.getEntitlementForId(subscriptionId, callContext);
final LocalDate inputLocalDate = toLocalDate(requestedDate);
final Entitlement newEntitlement;
final Account account = accountUserApi.getAccountById(current.getAccountId(), callContext);
final PhaseType phaseType = entitlement.getPhaseType();
final PlanPhaseSpecifier planSpec = entitlement.getPlanName() != null ?
new PlanPhaseSpecifier(entitlement.getPlanName(), phaseType) :
new PlanPhaseSpecifier(entitlement.getProductName(),
entitlement.getBillingPeriod(), entitlement.getPriceList(), phaseType);
final List<PlanPhasePriceOverride> overrides = buildPlanPhasePriceOverrides(entitlement.getPriceOverrides(), account.getCurrency(), planSpec);
if (requestedDate == null && billingPolicy == null) {
newEntitlement = current.changePlan(new DefaultEntitlementSpecifier(planSpec, null, overrides), pluginProperties, ctx);
} else if (billingPolicy == null) {
newEntitlement = current.changePlanWithDate(new DefaultEntitlementSpecifier(planSpec, null, overrides), inputLocalDate, pluginProperties, ctx);
} else {
newEntitlement = current.changePlanOverrideBillingPolicy(new DefaultEntitlementSpecifier(planSpec, null, overrides), null, billingPolicy, pluginProperties, ctx);
}
isImmediateOp = newEntitlement.getLastActiveProduct().getName().equals(entitlement.getProductName()) &&
newEntitlement.getLastActivePlan().getRecurringBillingPeriod() == entitlement.getBillingPeriod() &&
newEntitlement.getLastActivePriceList().getName().equals(entitlement.getPriceList());
return Response.status(Status.NO_CONTENT).build();
}