/// <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)); }
/// <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); } }
/// <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); }