Esempio n. 1
0
        /// <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()
            });
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        /// <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);
        }