Example #1
0
        public CouponValidationToken ValidateCoupon(int priceLineId, int couponOwnerId, int?courseId, int?bundleId, string couponCode)
        {
            var result = new CouponValidationToken
            {
                IsValid    = false
                , Discount = 0
            };

            if (string.IsNullOrEmpty(couponCode))
            {
                result.Message = "coupon code required";
                return(result);
            }

            var code = couponCode.TrimString().OptimizedUrl();
            var inst = CouponInstanceRepository.GetMany(x => x.CouponCode.ToLower() == code &&
                                                        (
                                                            (courseId != null && x.Coupons.CourseId == courseId) ||
                                                            (bundleId != null && x.Coupons.BundleId == bundleId) ||
                                                            (x.Coupons.OwnerUserId != null && x.Coupons.OwnerUserId == couponOwnerId)
                                                        )
                                                        ).ToList();

            if (inst.Count() == 1)
            {
                return(ValidateCoupon(priceLineId, couponOwnerId, courseId, bundleId, inst[0].Id));
            }

            result.Message = inst.Count.Equals(0) ? "coupon instance not found" : "multiple coupon instances found. please contact author";
            return(result);
        }
Example #2
0
        private bool SaveUniqueCouponInstance(int couponId, string code, out string error)
        {
            try
            {
                var entities = CouponInstanceRepository.GetMany(x => x.CouponId == couponId && x.CouponCode == code).ToList();

                if (!entities.Any())
                {
                    CouponInstanceRepository.Add((new CouponDTO
                    {
                        CouponId = couponId,
                        CouponCode = code,
                        UsageLimit = 1
                    }).CourseCouponDto2CouponInstanceEntity(code));
                }
                else
                {
                    error = "already exists";
                    return(false);
                }

                return(CouponInstanceRepository.UnitOfWork.CommitAndRefreshChanges(out error));
            }
            catch (Exception ex)
            {
                error = Utils.FormatError(ex);
                return(false);
            }
        }
Example #3
0
        private bool SaveCouponInstance(CouponDTO dto, out string error)
        {
            try
            {
                var entities = CouponInstanceRepository.GetMany(x => x.CouponId == dto.CouponId).ToList();

                if (!entities.Any())
                {
                    CouponInstanceRepository.Add(dto.CourseCouponDto2CouponInstanceEntity());
                }
                else
                {
                    if (entities.Count().Equals(1))
                    {
                        var entity = entities[0];
                        entity.UpdateCouponInstanceEntity(dto);
                    }
                    //else
                    //{
                    //TODO ask for logic
                    //}
                }

                return(CouponInstanceRepository.UnitOfWork.CommitAndRefreshChanges(out error));
            }
            catch (Exception ex)
            {
                error = Utils.FormatError(ex);
                return(false);
            }
        }
Example #4
0
        private void GetCouponProperties(int couponId, out int usageLimit, out int actualUsage, out string couponCode)
        {
            var instances = CouponInstanceRepository.GetMany(x => x.CouponId == couponId).ToList();
            var ids       = instances.Select(i => i.Id).ToList();

            usageLimit  = instances.Any() ? (instances.Count == 1 ? instances[0].UsageLimit : instances.Count) : 0;
            couponCode  = instances.Any() ? (instances.Count == 1 ? instances[0].CouponCode : string.Empty) : string.Empty;
            actualUsage = instances.Any() ? OrderLineRepository.Count(x => x.CouponInstanceId != null && ids.Contains((int)x.CouponInstanceId)) : 0;
        }
Example #5
0
 private bool IsCouponCodeValid(string couponCode, int couponId, out string error)
 {
     error = string.Empty;
     try
     {
         return(couponId < 0 ? !CouponInstanceRepository.IsAny(x => x.CouponCode == couponCode)  : !CouponInstanceRepository.IsAny(x => x.CouponCode == couponCode && x.CouponId != couponId));
     }
     catch (Exception ex)
     {
         error = Utils.FormatError(ex);
         return(false);
     }
 }
Example #6
0
        public CouponBaseDTO GetCouponBaseToken(int couponInstanceId, out string error)
        {
            error = string.Empty;

            var inst = CouponInstanceRepository.GetById(couponInstanceId);

            if (inst == null)
            {
                error = "coupon instance not found";
                return(null);
            }

            var coupon = CouponRepository.GetById(inst.CouponId);

            if (coupon == null)
            {
                error = "coupon not found";
                return(null);
            }

            return(coupon.Entity2CouponBaseDTO());
        }
Example #7
0
        public CouponValidationToken ValidateCoupon(int priceLineId, int couponOwnerId, int?courseId, int?bundleId, int couponInstanceId)
        {
            var result = new CouponValidationToken
            {
                IsValid    = false
                , Discount = 0
            };

            var inst = CouponInstanceRepository.GetById(couponInstanceId);

            if (inst == null)
            {
                result.Message = "coupon instance not found";
                return(result);
            }

            var coupon = CouponRepository.GetById(inst.CouponId).Entity2AuthorCouponDTO();

            if (coupon == null)
            {
                result.Message = "coupon not found";
                return(result);
            }

            var priceToken = GetItemPriceToken(priceLineId);

            if (priceToken == null)
            {
                result.Message = "Price Line not found";
                return(result);
            }

            decimal basePrice;

            if (courseId != null)
            {
                var course = CourseRepository.GetById((int)courseId);

                if (course == null)
                {
                    result.Message = "course not found";
                    return(result);
                }

                if (coupon.CourseId != null)
                {
                    if (coupon.CourseId != courseId)
                    {
                        result.Message = "coupon not allowed to this course";
                        return(result);
                    }
                }
                else
                {
                    if (coupon.OwnerUserId == null || (coupon.OwnerUserId != course.AuthorUserId))
                    {
                        result.Message = "coupon not allowed to this course";
                        return(result);
                    }
                }

                var itemPrice = priceToken.Price;

                if (itemPrice == 0)
                {
                    result.Message = "invalid price";
                    return(result);
                }

                basePrice = itemPrice;
            }
            else if (bundleId != null)
            {
                var bundle = BundleRepository.GetById((int)bundleId);

                if (bundle == null)
                {
                    result.Message = "bundle not found";
                    return(result);
                }

                if (coupon.BundleId != null)
                {
                    if (coupon.BundleId != bundleId)
                    {
                        result.Message = "coupon not allowed to this bundle";
                        return(result);
                    }
                }
                else
                {
                    if (coupon.OwnerUserId == null || (coupon.OwnerUserId != bundle.AuthorId))
                    {
                        result.Message = "coupon not allowed to this bundle";
                        return(result);
                    }
                }

                var itemPrice = priceToken.Price;

                if (itemPrice == 0)
                {
                    result.Message = "invalid price";
                    return(result);
                }

                basePrice = itemPrice;
            }
            else
            {
                result.Message = "course or bundle required";
                return(result);
            }

            var objectName = courseId != null ? "course" : "bundle";

            result.OriginalPrice = basePrice;
            result.FinalPrice    = basePrice;



            if ((coupon.CourseId.HasValue && coupon.CourseId != courseId))
            {
                result.Message = "This coupon is not allowed for this " + objectName;
            }
            else if (coupon.ExpirationDate < DateTime.Now.AddDays(-1))
            {
                result.Message = "This coupon is expired";
            }
            else if (inst.UsageLimit != -1 && inst.SALE_OrderLines.Count >= inst.UsageLimit)
            {
                result.Message = "This coupon is no longer valid";
            }
            else
            {
                if (priceToken.PriceType == BillingEnums.ePricingTypes.SUBSCRIPTION && coupon.Type != CourseEnums.CouponType.SUBSCRIPTION)
                {
                    result.Message = "This coupon is not allowed for this " + objectName;
                    return(result);
                }

                result.IsValid = true;

                switch (coupon.Type)
                {
                case CourseEnums.CouponType.PERCENT:
                case CourseEnums.CouponType.SUBSCRIPTION:
                    result.Discount   = (decimal)(coupon.Amount != null ? basePrice * (coupon.Amount / 100) : 0);
                    result.FinalPrice = CalculateDiscountedPrice(basePrice, coupon.Amount ?? 0, CourseEnums.CouponType.PERCENT);
                    result.IsFree     = result.FinalPrice == 0;
                    result.Message    = priceToken.PriceType == BillingEnums.ePricingTypes.SUBSCRIPTION ? String.Format("The price of this {2} is now {1:0.00} for the initial {0} months of your subscription. After that, regular rates shall apply", coupon.SubscriptionMonths ?? 0, result.FinalPrice, objectName) :
                                        String.Format("Coupon code is valid for a discount of {0}%. Your price is: {1} {2:0.00}", coupon.Amount, priceToken.Currency.ISO, result.FinalPrice);
                    break;

                case CourseEnums.CouponType.FIXED:
                    if (priceToken.PriceType == BillingEnums.ePricingTypes.SUBSCRIPTION)
                    {
                        result.IsValid = false;
                        result.Message = "Fixed amount coupon can't be applied to subscription";
                    }
                    else
                    {
                        result.Discount   = coupon.Amount ?? 0;
                        result.FinalPrice = CalculateDiscountedPrice(basePrice, coupon.Amount ?? 0, CourseEnums.CouponType.FIXED);
                        result.IsFree     = result.FinalPrice == 0;
                        result.Message    = string.Format("Coupon code is valid for a discount of {1} {0:0.00}, Your price is: {1} {2:0.00}", result.Discount, priceToken.Currency.ISO, result.FinalPrice);
                    }

                    break;

                case CourseEnums.CouponType.FREE:
                    result.Discount   = basePrice;
                    result.FinalPrice = 0;
                    result.IsFree     = true;
                    result.Message    = "This coupon entitles you to get this course for free. Click the button below to complete the process.";
                    break;
                }
            }

            return(result);
        }