/// <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);
        }
Ejemplo n.º 2
0
        // 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);
        }
Ejemplo n.º 3
0
        private async Task <string> GetPlanCurrency(string planId)
        {
            var plan = await _subscriptionPlanDataService.FindAsync(planId);

            return(plan.Currency);
        }