Exemplo n.º 1
0
        /// <summary>
        /// Whether user can claim the reward
        /// </summary>
        /// <param name="db"></param>
        /// <param name="rewardsId"></param>
        /// <param name="registrationId"></param>
        /// <returns></returns>
        public static bool CanClaim(NancyBlackDatabase db, int rewardsId, int registrationId)
        {
            var reg     = db.GetById <AffiliateRegistration>(registrationId);
            var rewards = db.GetById <AffiliateReward>(rewardsId);
            var stat    = AffiliateReward.GetRewardStats(db, reg);

            return(AffiliateReward.CanClaim(db, rewards, reg, stat));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Claim the rewards
        /// </summary>
        /// <param name="db"></param>
        /// <param name="rewardsId"></param>
        /// <param name="registrationId"></param>
        /// <returns></returns>
        public static AffiliateRewardsClaim ClaimReward(NancyBlackDatabase db, int rewardsId, int registrationId)
        {
            var canClaim = AffiliateReward.CanClaim(db, rewardsId, registrationId);

            if (canClaim == false)
            {
                return(null);
            }

            AffiliateReward rewards;
            var             reg = db.GetById <AffiliateRegistration>(registrationId);

            rewards = db.GetById <AffiliateReward>(rewardsId);

            if (rewards.MaxPerUser > 0)
            {
                lock (BaseModule.GetLockObject("RewardClaim-Reg-" + registrationId))
                {
                    var totalClaimedByUser = db.Query <AffiliateRewardsClaim>()
                                             .Where(c => c.AffiliateRewardsId == rewards.Id &&
                                                    c.AffiliateRegistrationId == registrationId).Count();

                    if (totalClaimedByUser >= rewards.MaxPerUser)
                    {
                        return(null);
                    }
                }
            }

            if (rewards.TotalQuota > 0)
            {
                lock (BaseModule.GetLockObject("RewardClaim-" + rewardsId))
                {
                    var totalClaimed = db.Query <AffiliateRewardsClaim>().Where(c => c.AffiliateRewardsId == rewards.Id).Count();
                    rewards.RemainingQuota = rewards.TotalQuota - totalClaimed;
                    db.UpsertRecord(rewards);
                }
            }

            if (rewards.IsRewardsClaimable == false)
            {
                return(null);
            }


            if (rewards.IsCodeDiscount || rewards.IsFreeGiftInSaleOrder)
            {
                var until = DateTime.MaxValue.Ticks;

                if (rewards.CodeDicountExpiryInDays != null)
                {
                    until = DateTime.Now.AddDays(rewards.CodeDicountExpiryInDays.Value).Ticks;
                }
                if (rewards.CodeDiscountExpiryDate != null)
                {
                    until = rewards.CodeDiscountExpiryDate.Value.Ticks;
                }

                AffiliateRewardsClaim claim = null;
                db.Transaction(() =>
                {
                    // free gift also gets created as code

                    Product p = new Product();

                    if (rewards.IsCodeDiscount)
                    {
                        p.Price      = rewards.CodeDiscountAmount * -1;
                        p.Attributes = new
                        {
                            rewardId      = rewards.Id,
                            description   = rewards.Title + ", ราคาก่อนส่วนลดขั้นต่ำ: " + rewards.MinimumPurchaseAmount,
                            min           = rewards.MinimumPurchaseAmount,
                            onetime       = true,
                            until         = until,
                            discount      = rewards.CodeDiscountAmount,
                            affiliateName = reg.AffiliateName,
                            require       = rewards.RequiredProductIds,
                        };
                    }

                    if (rewards.IsFreeGiftInSaleOrder)
                    {
                        p.DiscountPrice    = 0;
                        p.Price            = rewards.CodeDiscountAmount;
                        p.PromotionEndDate = new DateTime(until);
                        p.MasterProductId  = rewards.RewardsProductId;
                        p.IsVariation      = true;

                        p.Attributes = new
                        {
                            rewardId      = rewards.Id,
                            description   = rewards.Title + ", ราคาก่อนส่วนลดขั้นต่ำ: " + rewards.MinimumPurchaseAmount,
                            min           = rewards.MinimumPurchaseAmount,
                            onetime       = true,
                            until         = until,
                            discount      = rewards.CodeDiscountAmount,
                            isfreeproduct = 1,
                            affiliateName = reg.AffiliateName,
                            require       = rewards.RequiredProductIds,
                        };
                    }

                    db.UpsertRecord(p);

                    var code = hashids.Encode(p.Id, reg.Id);
                    p.Url    = "/promotions/code/" + code;
                    p.Title  = "Affiliate Discount: " + code;


                    if (rewards.IsFreeGiftInSaleOrder)
                    {
                        p.Title = "GIFT ITEM:" + rewards.Title;
                    }

                    db.UpsertRecord(p);

                    claim = new AffiliateRewardsClaim();
                    claim.AffiliateRegistrationId = reg.Id;
                    claim.NcbUserId          = reg.NcbUserId;
                    claim.AffiliateCode      = reg.AffiliateCode;
                    claim.DiscountCode       = code;
                    claim.RewardsName        = rewards.Title;
                    claim.AffiliateRewardsId = rewards.Id;
                    claim.ProductId          = p.Id;
                    claim.CouponAttributes   = p.Attributes;
                    db.UpsertRecord(claim);
                });

                return(claim);
            }

            {
                var claim = new AffiliateRewardsClaim();
                claim.AffiliateRegistrationId = reg.Id;
                claim.NcbUserId          = reg.NcbUserId;
                claim.AffiliateCode      = reg.AffiliateCode;
                claim.RewardsName        = rewards.Title;
                claim.AffiliateRewardsId = rewards.Id;
                claim.ProductId          = rewards.RewardsProductId;

                db.UpsertRecord(claim);

                return(claim);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Whether user can claim the reward
        /// </summary>
        /// <param name="db"></param>
        /// <param name="rewardsId"></param>
        /// <param name="registrationId"></param>
        /// <returns></returns>
        public static bool CanClaim(NancyBlackDatabase db, AffiliateReward rewards, AffiliateRegistration reg, dynamic statIn)
        {
            AffiliateReward stat;

            if (statIn is JObject)
            {
                stat = ((JObject)statIn)
                       .ToObject <AffiliateReward>();
            }
            else
            {
                // stat looks like a rewards so we can use it
                stat = JObject.FromObject(statIn)
                       .ToObject <AffiliateReward>();
            }

            var claimed = db.Query <AffiliateRewardsClaim>()
                          .Where(c => c.AffiliateRewardsId == rewards.Id && c.AffiliateRegistrationId == reg.Id)
                          .Count();

            Func <AffiliateReward, AffiliateReward, Func <AffiliateReward, int?>, bool> compareStat = (rew, st, prop) =>
            {
                var require = prop(rew);
                if (require == null)
                {
                    return(false);
                }

                if (prop(rew) == 0)
                {
                    if (rew.IsOneTime && claimed > 0) // if one time and already claimed, cannot claim anymore
                    {
                        return(false);
                    }

                    return(true);
                }

                var multiple  = prop(st) / prop(rew);
                var remaining = multiple - claimed;

                if (rew.IsOneTime && claimed > 0) // if one time and already claimed, cannot claim anymore
                {
                    return(false);
                }

                /*
                 * Require: 10 (rew)
                 * Current Stat: 35 (st)
                 *
                 * multiple = 35 / 10 => 3 (integer division)
                 *
                 * claimed = 1
                 * remaining = 2
                 *
                 */
                return(remaining > 0);
            };

            var canClaim = compareStat(rewards, stat, item => item.DirectDownlineCount) ||
                           compareStat(rewards, stat, item => item.DownlineCount) ||
                           compareStat(rewards, stat, item => item.PageViewsCount) ||
                           compareStat(rewards, stat, item => item.SalesCount) ||
                           compareStat(rewards, stat, item => item.UniqueVisitorCount);

            return(canClaim);
        }