/// <summary> /// Subscribes the family /// </summary> /// <param name="subscription">The subscription</param> /// <returns></returns> public void Subscribe(Subscription subscription) { SubscriptionPromoCode subscriptionPromoCode = null; var familySubscription = _familyService.GetFamilySubscription(); //var subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType); var subscriptionPlan = new SubscriptionPlan(); //added by promocode var prePromoCodeStatus = _familyService.GetPrePromoCodeStatus(); if (!string.IsNullOrEmpty(prePromoCodeStatus.PromoCode)) { subscription.SubscriptionType = SubscriptionType.PromoPlan; subscriptionPromoCode = ValidatePromoCode(prePromoCodeStatus.PromoCode); subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType); } else { subscriptionPlan = GetSubscriptionPlan(subscription.SubscriptionType); } if (familySubscription != null) { switch (familySubscription.Status) { case SubscriptionStatus.Active: throw new InvalidOperationException(string.Format("You already have an active {0} subscription.", familySubscription.SubscriptionPlan.PlanName.ToLower())); case SubscriptionStatus.PendingCancellation: case SubscriptionStatus.Cancelled: if (familySubscription.EndsOn.Date <= DateTime.UtcNow.Date) { subscriptionPlan = GetSubscriptionPlan(SubscriptionType.Annual); familySubscription.BankTransactionID = PurchaseAnnualSubscription(subscriptionPlan.Price); familySubscription.SubscriptionPlanID = subscriptionPlan.Id; familySubscription.StartsOn = DateTime.UtcNow; familySubscription.EndsOn = DateTime.UtcNow.AddYears(1); familySubscription.Status = SubscriptionStatus.Active; familySubscription.PromoCode = subscriptionPromoCode?.PromoCode ?? string.Empty; Repository.Update(familySubscription); } else { if (familySubscription.SubscriptionPlanID == subscriptionPlan.Id) { familySubscription.Status = SubscriptionStatus.Active; familySubscription.PromoCode = subscriptionPromoCode?.PromoCode ?? string.Empty; Repository.Update(familySubscription); } else { ActivateSubscription(subscriptionPlan, subscription.SubscriptionType, familySubscription, subscriptionPromoCode); } } // Sets IsActive of the subscription cancellation request to false. var admin = _familyService.GetAdmin(); if (admin == null) { return; } var subscriptionCancellationRequest = Repository.Table <SubscriptionCancellationRequest>() .FirstOrDefault(p => p.FamilyMemberID == admin.Id && p.IsActive); if (subscriptionCancellationRequest == null) { return; } subscriptionCancellationRequest.IsActive = false; Repository.Update(subscriptionCancellationRequest); break; } } else { //Handle null Promocode //subscriptionPromoCode = ValidatePromoCode(subscription.PromoCode); ActivateSubscription(subscriptionPlan, subscription.SubscriptionType, null, subscriptionPromoCode); } }
/// <summary> /// Activates the subscription plan /// </summary> /// <param name="subscriptionPlanId">The subscription plan identifier.</param> /// <param name="subscriptionType">The subscription type.</param> /// <param name="familySubscription">The family subscription.</param> /// <param name="subscriptionPromoCode">The subscription promo code.</param> /// <returns>The family subscription.</returns> private FamilySubscription ActivateSubscription(SubscriptionPlan subscriptionPlan, SubscriptionType subscriptionType, FamilySubscription familySubscription, SubscriptionPromoCode subscriptionPromoCode) { familySubscription = familySubscription ?? new FamilySubscription(); var subscriptionEndDate = DateTime.UtcNow.AddDays(-1); switch (subscriptionType) { case SubscriptionType.OneMonthTrial: subscriptionEndDate = DateTime.UtcNow.AddMonths(1); familySubscription.IsTrialUsed = true; familySubscription.TrialStartDate = DateTime.UtcNow; break; case SubscriptionType.PromoPlan: switch (subscriptionPromoCode.DurationType) { case DurationType.Day: subscriptionEndDate = DateTime.UtcNow.AddDays(subscriptionPromoCode.Duration); break; case DurationType.Month: subscriptionEndDate = DateTime.UtcNow.AddMonths(subscriptionPromoCode.Duration); break; case DurationType.Year: subscriptionEndDate = DateTime.UtcNow.AddYears(subscriptionPromoCode.Duration); break; } break; case SubscriptionType.Annual: familySubscription.BankTransactionID = PurchaseAnnualSubscription(subscriptionPlan.Price); subscriptionEndDate = DateTime.UtcNow.AddYears(1); break; case SubscriptionType.Pendingaccount: subscriptionEndDate = DateTime.UtcNow.AddMonths(1); familySubscription.IsTrialUsed = true; familySubscription.TrialStartDate = DateTime.UtcNow; break; } familySubscription.SubscriptionPlanID = subscriptionPlan.Id; familySubscription.StartsOn = DateTime.UtcNow; familySubscription.EndsOn = subscriptionEndDate; familySubscription.Status = SubscriptionStatus.Active; familySubscription.PromoCode = subscriptionPromoCode?.PromoCode ?? string.Empty; return(_familyService.UpdatetFamilySubscription(familySubscription)); }