/// <summary> /// Deletes the subscription plan asynchronous. /// </summary> /// <param name="subscriptionPlanId">The subscription plan identifier.</param> /// <returns></returns> /// <exception cref="System.ArgumentException">subscriptionPlanId</exception> public async Task <int> DeleteAsync(string subscriptionPlanId) { int result = -1; var plan = await _subscriptionDataService.FindAsync(subscriptionPlanId); if (plan == null) { throw new ArgumentException("subscriptionPlanId"); } if (!plan.Disabled) { var countUsersInPlan = await _subscriptionDataService.CountUsersAsync(plan.Id); // If plan has users only disable if (countUsersInPlan > 0) { await _subscriptionDataService.DisableAsync(subscriptionPlanId); result = 1; } else { await _subscriptionDataService.DeleteAsync(subscriptionPlanId); result = 0; } // Delete from Stripe _subscriptionPlanProvider.Delete(plan.Id); } return(result); }
// TODO: Remove UserId (not used) /// <summary> /// Updates the subscription asynchronous, if the new plan is more expensive the customer is charged immediately /// </summary> /// <param name="userId">The user identifier.</param> /// <param name="stripeUserId">The stripe user identifier.</param> /// <param name="stripeSubscriptionId">The current subscription stripe identifier.</param> /// <param name="newPlanId">The new plan identifier.</param> /// <param name="proRate">if set to <c>true</c> [pro rate].</param> /// <returns></returns> public async Task <bool> UpdateSubscriptionAsync(string userId, string stripeUserId, string stripeSubscriptionId, string newPlanId, bool proRate = true) { var subscription = _subscriptionDataService.FindById(stripeSubscriptionId); if (subscription != null && (subscription.SubscriptionPlan.Id != newPlanId || subscription.End != null)) // Check end date in case that we are re-activating { bool changingPlan = subscription.SubscriptionPlan.Id != newPlanId; var currentPlan = await _subscriptionPlanDataService.FindAsync(subscription.SubscriptionPlanId); var newPlan = await _subscriptionPlanDataService.FindAsync(newPlanId); // Do Stripe charge if the new plan is more expensive if (changingPlan && currentPlan.Price < newPlan.Price) { var upgradeCharge = await CalculateProRata(newPlanId) - await CalculateProRata(subscription.SubscriptionPlanId); var upgradeChargeWithTax = upgradeCharge * (1 + subscription.TaxPercent / 100); string error; _chargeProvider.CreateCharge((int)upgradeChargeWithTax, await GetPlanCurrency(newPlanId), "Fluxifi Upgrade", stripeUserId, out error); if (!string.IsNullOrEmpty(error)) { return(false); } } // Update Stripe if (_subscriptionProvider.UpdateSubscription(stripeUserId, subscription.StripeId, newPlanId, proRate)) { // Update DB subscription.SubscriptionPlanId = newPlanId; subscription.End = null; // In case that we are reactivating await _subscriptionDataService.UpdateSubscriptionAsync(subscription); return(true); } } return(false); }
private async Task <string> GetPlanCurrency(string planId) { var plan = await _subscriptionPlanDataService.FindAsync(planId); return(plan.Currency); }