/// <summary> /// Get Statistics that will be use to render reward dashboard /// </summary> /// <param name="db"></param> /// <param name=""></param> public static dynamic GetRewardStats(NancyBlackDatabase db, AffiliateRegistration reg) { var allDownline = AffiliateModule.DiscoverDownLine(db, reg.AffiliateCode).ToList(); return(new { UniqueVisitorCount = reg.TotalUniqueUser, PageViewsCount = reg.TotalPageView, DownlineCount = allDownline.Count, DirectDownlineCount = allDownline.Where(d => d.level == 1).Count(), SalesCount = db.Query <SaleOrder>() .Where(so => so.PaymentStatus == PaymentStatus.PaymentReceived) .Count() }); }
/// <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); }
/// <summary> /// Creates the click tracking from current context /// </summary> public static void CreateFromContext(NancyContext ctx, NancyBlackDatabase db, AffiliateRegistration reg) { var owner = db.GetById <NcbUser>(reg.NcbUserId); var record = new AffiliateShareClick(); record.UserId = ctx.Items["userid"] as string; // wont track own click if (record.UserId == owner.Guid.ToString()) { return; } record.IPAddress = ctx.Request.UserHostAddress; record.Url = ctx.Request.Url.Path + "?" + ctx.Request.Url.Query; record.AffiliateRegistrationId = reg.Id; db.UpsertRecord(record); }