Example #1
0
        /// <summary>
        /// Subscribes the user natural month asynchronous.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="planId">The plan identifier.</param>
        /// <param name="card">The card.</param>
        /// <param name="description">The description.</param>
        /// <param name="taxPercent">The tax percent.</param>
        /// <returns></returns>
        public async Task <string> SubscribeUserNaturalMonthAsync(SaasEcomUser user,
                                                                  string planId, CreditCard card, string description, decimal taxPercent = 0)
        {
            var trialEnds = GetStartNextMonth();

            if (string.IsNullOrEmpty(user.StripeCustomerId))
            {
                // Create a new customer in Stripe and save card
                var stripeUser = (StripeCustomer)await _customerProvider.CreateCustomerAsync
                                     (user, null, trialEnds, card.StripeToken);

                // Add subscription Id to the user
                user.StripeCustomerId = stripeUser.Id;

                await _cardDataService.AddAsync(card);
            }
            else if (!string.IsNullOrEmpty(card.StripeToken))
            {
                // Update the default card for the user
                _customerProvider.UpdateCustomer(user, card);
                card.SaasEcomUserId = user.Id;
                await _cardDataService.AddOrUpdateDefaultCardAsync(user.Id, card);
            }

            // Create pro-rata charge for the remaining of the month
            var amountInCents = await CalculateProRata(planId);

            var planCurrency = await GetPlanCurrency(planId);

            // If Charge succeeds -> Create Subscription
            string error;

            if (this._chargeProvider.CreateCharge(amountInCents, planCurrency, description, user.StripeCustomerId, out error))
            {
                // Create Subscription
                var subscriptionId = _subscriptionProvider.SubscribeUser(user, planId, trialEnds, taxPercent);
                var subscription   = await _subscriptionDataService.SubscribeUserAsync
                                         (user, planId, trialEnds, taxPercent, subscriptionId);

                // Update tax percent on stripe
                if (subscription.TaxPercent > 0)
                {
                    await this.UpdateSubscriptionTax(user, subscription.StripeId, subscription.TaxPercent);
                }
            }
            else
            {
                return(error);
            }

            return(null);
        }
        /// <summary>
        /// Subscribe an existing user to a plan.
        /// </summary>
        /// <param name="user">Application User</param>
        /// <param name="planId">Stripe plan Id</param>
        /// <param name="creditCard">Credit card to pay this subscription.</param>
        /// <param name="trialInDays">The trial in days.</param>
        /// <param name="taxPercent">The tax percent.</param>
        /// <returns></returns>
        private async Task <Subscription> SubscribeUserAsync(SaasEcomUser user, string planId, CreditCard creditCard, int trialInDays = 0, decimal taxPercent = 0)
        {
            // Save payment details
            if (creditCard != null)
            {
                if (creditCard.Id == 0)
                {
                    await _cardProvider.AddAsync(user, creditCard);
                }
                else
                {
                    await _cardProvider.UpdateAsync(user, creditCard);
                }
            }

            // Save subscription details
            var subscriptionId = _subscriptionProvider.SubscribeUser
                                     (user, planId, trialInDays: trialInDays, taxPercent: taxPercent);                                        // Stripe
            var subscription = await this._subscriptionDataService.SubscribeUserAsync(user, planId, trialInDays, taxPercent, subscriptionId); // DB

            return(subscription);
        }