Exemplo n.º 1
0
        /// <summary>
        /// Upate Referer code of given user
        /// </summary>
        /// <param name="db"></param>
        /// <param name="userId"></param>
        /// <param name="refererCode"></param>
        /// <returns></returns>
        public static AffiliateRegistration UpdateReferer(NancyBlackDatabase db, int userId, string refererCode)
        {
            var registration = AffiliateModule.ApplyAffiliate(db, userId, refererCode);

            if (registration.RefererAffiliateCode == null)
            {
                registration.RefererAffiliateCode = refererCode;
                db.UpsertRecord(registration);
            }

            return(registration);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Upate Referer code of given user
        /// </summary>
        /// <param name="db"></param>
        /// <param name="userId"></param>
        /// <param name="refererCode"></param>
        /// <returns></returns>
        public static AffiliateRegistration UpdateReferer(NancyBlackDatabase db, int userId, string refererCode)
        {
            var registration = AffiliateModule.ApplyAffiliate(db, userId, refererCode);

            // can only change referer if does not already have one
            // NOTE: already tried allowing referer to change - this cause
            // problem with cycle and also possible fraud attempt
            // also - if we allow referer to change the number of
            // downline will be limited and also referer can 'steal'
            // downline from other referer.

            if (registration.RefererAffiliateCode == null &&
                registration.AffiliateCode != refererCode)
            {
                registration.RefererAffiliateCode = refererCode;
                db.UpsertRecord(registration);
            }

            return(registration);
        }
Exemplo n.º 3
0
        private dynamic AffiliateDashboard(AffiliateRegistration registration, dynamic arg)
        {
            dynamic affiliateFacts = MemoryCache.Default["affiliatefacts"];

            if (affiliateFacts == null)
            {
                affiliateFacts = new
                {
                    Total       = this.SiteDatabase.Query <AffiliateRegistration>().Count(),
                    TotalActive = this.SiteDatabase.Query("SELECT Distinct AffiliateCode FROM AffiliateTransaction", new { Count = 0 }).Count(),
                    PayoutStats = this.SiteDatabase.Query("SELECT Count(Id) as Count, Avg(CommissionAmount) as Avg, Sum(CommissionAmount) as Sum FROM AffiliateTransaction", new { Count = 0, Avg = 0.0M, Sum = 0.0M }).FirstOrDefault(),
                };
                MemoryCache.Default.Add("affiliatefacts", affiliateFacts, DateTimeOffset.Now.AddHours(1));
            }

            var content = ContentModule.GetPage(SiteDatabase, "/__affiliate", true);

            var standardModel = new StandardModel(200);

            standardModel.Content = content;

            if (registration != null)
            {
                var     key           = "dashboard-" + registration.NcbUserId;
                dynamic dashboardData = MemoryCache.Default[key];

                if (Request.Query.code != null)
                {
                    dashboardData = null; // this is impersonation by user 1 - refresh all data

                    MemoryCache.Default.Remove(key);
                    MemoryCache.Default.Remove("AffiliateReg-" + registration.AffiliateCode);
                }

                if (dashboardData == null)
                {
                    var user       = this.SiteDatabase.GetById <NcbUser>(registration.NcbUserId);
                    var saleOrders = this.SiteDatabase.Query <SaleOrder>()
                                     .Where(so => so.NcbUserId == registration.NcbUserId)
                                     .ToList();

                    var activeSaleOrder = (from so in saleOrders
                                           where so.PaymentStatus == PaymentStatus.Credit ||
                                           so.PaymentStatus == PaymentStatus.Deposit ||
                                           so.PaymentStatus == PaymentStatus.PaymentReceived
                                           select so).FirstOrDefault();

                    if (activeSaleOrder != null)
                    {
                        // figure out delivery date
                        activeSaleOrder.FindShipoutAndDeliveryDate(this.SiteDatabase);
                    }

                    Func <SaleOrder, SaleOrder> reduce = (so) =>
                    {
                        var thinCustomer = new
                        {
                            FirstName = (string)so.Customer.FirstName,
                            LastName  = (string)so.Customer.LastName
                        };

                        return(new SaleOrder()
                        {
                            __createdAt = so.__createdAt,
                            SaleOrderIdentifier = so.SaleOrderIdentifier,
                            Status = so.Status,
                            PaymentStatus = so.PaymentStatus,
                            Customer = thinCustomer
                        });
                    };

                    var stat = AffiliateReward.GetRewardStats(this.SiteDatabase, registration);
                    Func <AffiliateReward, JObject> addCanClaim = (rew) =>
                    {
                        var canClaim = AffiliateReward.CanClaim(this.SiteDatabase, rew, registration, stat);
                        var toReturn = JObject.FromObject(rew);

                        toReturn.Add("canClaim", canClaim);

                        return(toReturn);
                    };

                    Func <AffiliateReward, bool> postProcess = (rew) =>
                    {
                        if (rew.IsRewardsClaimable)
                        {
                            return(true);
                        }

                        if (rew.ActiveUntil.HasValue)
                        {
                            if (DateTime.Now.Subtract(rew.ActiveUntil.Value).TotalDays > 7)
                            {
                                return(false); // skip rewards older than 1 week
                            }

                            return(true); // show that they have missed this rewards
                        }

                        if (rew.TotalQuota > 0) // with quota, see created date
                        {
                            if (DateTime.Now.Subtract(rew.__createdAt).TotalDays > 7)
                            {
                                return(false); // dont show old rewards
                            }

                            return(true);
                        }

                        return(true);
                    };

                    AffiliateRegistration refererReg;
                    refererReg = this.SiteDatabase.Query <AffiliateRegistration>()
                                 .Where(reg => reg.AffiliateCode == registration.RefererAffiliateCode)
                                 .FirstOrDefault();

                    if (refererReg != null)
                    {
                        var refererUser = this.SiteDatabase.GetById <NcbUser>(refererReg.NcbUserId);
                        refererReg.AdditionalData = new
                        {
                            Id = refererUser.Profile.id
                        };
                    }

                    dashboardData = new
                    {
                        Referer = refererReg,

                        Registration = registration,

                        Code = registration.AffiliateCode,

                        RelatedOrders = this.SiteDatabase.Query <SaleOrder>()
                                        .Where(so => so.AffiliateCode == registration.AffiliateCode)
                                        .AsEnumerable()
                                        .Select(s => reduce(s)).ToList(),

                        AffiliateTransaction = this.SiteDatabase.Query("SELECT * FROM AffiliateTransaction WHERE AffiliateCode=?",
                                                                       new AffiliateTransaction(),
                                                                       new object[] { registration.AffiliateCode }).ToList(),

                        Profile = user.Profile,

                        SaleOrders = this.SiteDatabase.Query <SaleOrder>()
                                     .Where(so => so.NcbUserId == registration.NcbUserId)
                                     .AsEnumerable()
                                     .Select(s => reduce(s)).ToList(),

                        ActiveSaleOrder = activeSaleOrder,

                        /* Stats */

                        SubscribeAll = SiteDatabase.QueryAsDynamic("SELECT COUNT(Id) As Count FROM AffiliateRegistration WHERE RefererAffiliateCode=?",
                                                                   new { Count = 0 },
                                                                   new object[] { registration.AffiliateCode }).First().Count,

                        ShareClicks = SiteDatabase.QueryAsDynamic("SELECT COUNT(Id) As Count, Url FROM AffiliateShareClick WHERE AffiliateRegistrationId=? GROUP By Url",
                                                                  new { Count = 0, Url = "" },
                                                                  new object[] { registration.Id }),

                        Downline = AffiliateModule.DiscoverDownLine(this.SiteDatabase, registration.AffiliateCode),

                        Rewards = this.SiteDatabase.Query <AffiliateReward>().AsEnumerable()
                                  .Where(rew => rew.IsActive == true)
                                  .AsEnumerable()
                                  .Where(rew => postProcess(rew))
                                  .Select(rew => addCanClaim(rew)),

                        RewardsStat = stat,

                        ClaimedRewards = this.SiteDatabase.Query <AffiliateRewardsClaim>()
                                         .Where(c => c.NcbUserId == registration.NcbUserId)
                                         .AsEnumerable(),

                        AffiliateFacts = affiliateFacts
                    };

#if !DEBUG
                    MemoryCache.Default.Add(key, dashboardData, DateTimeOffset.Now.AddMinutes(10));
#endif
                    UpdatePageView(registration);
                }

                standardModel.Data = JObject.FromObject(dashboardData);
            }


            return(View["affiliate-dashboard", standardModel]);
        }
Exemplo n.º 4
0
        public AffiliateModule()
        {
            AffiliateModule.TemplatePath = Path.Combine(RootPath, "Site", "Views", "EmailTemplates");

            Post["/__affiliate/apply"] = HandleRequest((arg) =>
            {
                if (this.CurrentUser.IsAnonymous)
                {
                    return(400);
                }

                var reg       = AffiliateModule.ApplyAffiliate(this.SiteDatabase, this.CurrentUser.Id);
                var regresult = JObject.FromObject(reg);

                var body = arg.body.Value;
                if (body.sharedCoupon != null)
                {
                    var discountCode = (string)body.sharedCoupon.CouponCode;

                    lock (BaseModule.GetLockObject("SharedCouponCheck-" + reg.Id))
                    {
                        // prevent dubplicates
                        var existing = this.SiteDatabase.Query <AffiliateRewardsClaim>()
                                       .Where(c => c.DiscountCode == discountCode && c.AffiliateRegistrationId == reg.Id)
                                       .FirstOrDefault();

                        if (existing == null)
                        {
                            var toCopy = this.SiteDatabase.GetById <AffiliateRewardsClaim>((int)body.sharedCoupon.CouponId);

                            toCopy.Id = 0;
                            toCopy.AffiliateRegistrationId = reg.Id;
                            toCopy.AffiliateCode           = reg.AffiliateCode;
                            toCopy.NcbUserId      = this.CurrentUser.Id;
                            toCopy.RewardsName    = "shared from ID:" + body.sharedCoupon.AffiliateId;
                            toCopy.IsShareEnabled = false;

                            this.SiteDatabase.UpsertRecord(toCopy);

                            regresult.Add("CouponSaved", true);
                        }
                    }
                }

                if (body.sharedReward != null)
                {
                    lock (BaseModule.GetLockObject("SharedRewardCheck-" + reg.Id))
                    {
                        var result = AffiliateReward.ClaimReward(this.SiteDatabase, (int)body.sharedReward.Id, reg.Id);
                        if (result != null)
                        {
                            regresult.Add("RewardClaimed", true);
                        }
                    }
                }

                return(regresult);
            });

            Post["/__affiliate/requestpayment"] = HandleRequest((arg) =>
            {
                if (CurrentUser.IsAnonymous)
                {
                    return(400);
                }

                var registration = SiteDatabase.Query <AffiliateRegistration>()
                                   .Where(t => t.NcbUserId == CurrentUser.Id).FirstOrDefault();

                if (registration == null)
                {
                    return(400);
                }

                var pendingPayment = SiteDatabase.Query <AffiliateTransaction>()
                                     .Where(t => t.AffiliateCode == registration.AffiliateCode && t.IsCommissionPaid == false && t.IsPendingApprove == false)
                                     .ToList();


                // using alternate rate
                SiteDatabase.Transaction(() =>
                {
                    foreach (var item in pendingPayment)
                    {
                        item.IsPendingApprove = true;
                        SiteDatabase.UpsertRecord(item);
                    }
                });

                return(200);
            });

            Post["/__affiliate/claimrewards"] = HandleRequest((arg) =>
            {
                dynamic param = (arg.body.Value as JObject);
                if (param.Id == null)
                {
                    return(400);
                }

                var registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, this.CurrentUser.Id);

                var result = AffiliateReward.ClaimReward(this.SiteDatabase, (int)param.Id, registration.Id);
                if (result == null)
                {
                    return(403);
                }

                return(result);
            });

            Post["/__affiliate/addtosaleorder"] = HandleRequest((arg) =>
            {
                if (CurrentUser.IsAnonymous)
                {
                    return(400);
                }

                var requestBody             = (arg.body.Value as JObject);
                var saleOrderId             = requestBody.Value <int>("saleOrderId");
                var affiliateRewardsClaimId = requestBody.Value <int>("arcId");

                if (saleOrderId != 0 && affiliateRewardsClaimId != 0)
                {
                    var aRC = SiteDatabase.GetById <AffiliateRewardsClaim>(affiliateRewardsClaimId);

                    if (aRC.IncludedInSaleOrderId != 0 || aRC.DiscountCode != null)
                    {
                        return(403);
                    }

                    aRC.IncludedInSaleOrderId = saleOrderId;
                    SiteDatabase.UpsertRecord(aRC);

                    return(new
                    {
                        AffiliateRewardsClaim = aRC
                    });
                }


                return(403);
            });

            Post["/__affiliate/updateprofile"] = HandleRequest((arg) =>
            {
                var requestBody = arg.body.Value;

                if (requestBody.Profile == null && requestBody.Registration == null)
                {
                    return(400);
                }

                // Impersonation in effect
                int userId = this.CurrentUser.Id;
                if (userId != (int)requestBody.UserId)
                {
                    if (userId == 1)
                    {
                        userId = (int)requestBody.UserId;
                    }
                    else
                    {
                        return(400); // user that is not 1 cannot save with impersonation
                    }
                }

                if (requestBody.Profile != null)
                {
                    UserManager.Current.UpdateProfile(this.SiteDatabase, userId, requestBody.Profile);
                }

                if (requestBody.Registration != null)
                {
                    AffiliateRegistration registration = SiteDatabase.Query <AffiliateRegistration>()
                                                         .Where(t => t.NcbUserId == CurrentUser.Id).FirstOrDefault();

                    registration.AffiliateName    = requestBody.Registration.AffiliateName;
                    registration.AffiliateMessage = requestBody.Registration.AffiliateMessage;
                    SiteDatabase.UpsertRecord(registration);

                    MemoryCache.Default.Remove("AffiliateReg-" + registration.AffiliateCode);
                }

                MemoryCache.Default.Remove("dashboard-" + CurrentUser.Id);


                return(200);
            });

            Get["/" + AFFILIATE_PROGRAM_NAME + "/dashboard"] = HandleRequest((arg) =>
            {
                if (this.CurrentUser.IsAnonymous)
                {
                    return(this.Response.AsRedirect("/" + AFFILIATE_PROGRAM_NAME));
                }

                var id = this.CurrentUser.Id;
                AffiliateRegistration registration = null;

                if (this.CurrentUser.HasClaim("admin") && Request.Query.code != null) // admin impersonate anyone
                {
                    var code     = (string)Request.Query.code;
                    registration = SiteDatabase.Query <AffiliateRegistration>()
                                   .Where(t => t.AffiliateCode == code).FirstOrDefault();

                    if (registration == null)
                    {
                        return(404); // wrong code
                    }
                }
                else if (this.CurrentUser.HasClaim("admin") && Request.Query.so != null)
                {
                    var soId = (int)Request.Query.so;
                    var so   = SiteDatabase.GetById <SaleOrder>(soId);

                    if (so.NcbUserId == 0)
                    {
                        return(404); // user cannot view squad51 because they was not registered
                    }

                    registration = SiteDatabase.Query <AffiliateRegistration>()
                                   .Where(t => t.NcbUserId == so.NcbUserId).FirstOrDefault();

                    // automatically apply owner of given so
                    if (registration == null &&
                        (so.PaymentStatus == PaymentStatus.PaymentReceived ||
                         so.PaymentStatus == PaymentStatus.Deposit))
                    {
                        registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, so.NcbUserId);
                    }
                }
                else
                {
                    if (id != 0)
                    {
                        registration = SiteDatabase.Query <AffiliateRegistration>()
                                       .Where(t => t.NcbUserId == id).FirstOrDefault();
                    }
                }

                if (registration == null)
                {
                    if (id != 0) // some known user but we still can't get their registration
                    {
                        // no registration - try to see whether this user already a customer
                        var saleOrder = this.SiteDatabase.Query <SaleOrder>()
                                        .Where(so => so.NcbUserId == id &&
                                               (so.PaymentStatus == PaymentStatus.Deposit ||
                                                so.PaymentStatus == PaymentStatus.PaymentReceived))
                                        .FirstOrDefault();

                        // already customer - auto register them
                        if (saleOrder != null)
                        {
                            registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, id);
                            return(this.AffiliateDashboard(registration, arg));
                        }
                    }

                    // redirect back to application page
                    return(this.Response.AsRedirect("/" + AFFILIATE_PROGRAM_NAME));
                }


                return(this.AffiliateDashboard(registration, arg));
            });

            Get["/" + AFFILIATE_PROGRAM_NAME] = HandleRequest((arg) =>
            {
                var id = this.CurrentUser.Id;

                AffiliateRegistration registration = SiteDatabase.Query <AffiliateRegistration>()
                                                     .Where(t => t.NcbUserId == id).FirstOrDefault();

                var content = ContentModule.GetPage(SiteDatabase, "/__affiliate", true);
                return(View["affiliate-apply", new StandardModel(this, content, new
                {
                    Registration = registration
                })]);
            });

            Get["/__affiliate/profileimage/{id}"] = this.HandleRequest(arg =>
            {
                var response         = new Response();
                response.ContentType = "image/jpeg";
                response.Contents    = (output) =>
                {
                    WebClient client = new WebClient();
                    var data         = client.DownloadData("https://graph.facebook.com/" + (string)arg.id + "/picture?type=large");
                    output.Write(data, 0, data.Length);
                };
                return(response);
            });

            Get["/__affiliate/getsharedcoupon"] = this.HandleRequest((arg) =>
            {
                if (this.Request.Cookies.ContainsKey("coupon"))
                {
                    var id     = this.Request.Cookies["coupon"];
                    var coupon = this.SiteDatabase.GetById <AffiliateRewardsClaim>(int.Parse(id));

                    if (coupon != null)
                    {
                        if (coupon.IsShareEnabled == false)
                        {
                            return(404);
                        }

                        var couponProduct = this.SiteDatabase.GetById <Product>(coupon.ProductId);
                        if (couponProduct.Url.Contains("/archive/"))
                        {
                            return(new {
                                IsValid = false
                            });
                        }

                        var reg = this.SiteDatabase.GetById <AffiliateRegistration>(coupon.AffiliateRegistrationId);

                        return(new
                        {
                            AffiliateId = reg.Id,
                            AffiliateName = reg.AffiliateName,
                            AffiliateRewardsId = coupon.AffiliateRewardsId,
                            CouponId = coupon.Id,
                            CouponCode = coupon.DiscountCode,
                            CouponAttributes = coupon.CouponAttributes
                        });
                    }
                }

                return(404);
            });

            Get["/__affiliate/getreward"] = this.HandleRequest((arg) =>
            {
                if (this.Request.Cookies.ContainsKey("reward"))
                {
                    var id     = this.Request.Cookies["reward"];
                    var reward = this.SiteDatabase.GetById <AffiliateReward>(int.Parse(id));

                    if (reward != null)
                    {
                        if (reward.IsDirectClaim == false)
                        {
                            return(404);
                        }

                        if (reward.IsRewardsClaimable == false)
                        {
                            return(new
                            {
                                IsValid = false
                            });
                        }

                        return(reward);
                    }
                }

                return(404);
            });

            Get["/__affiliate/myrewards"] = this.HandleRequest((arg) =>
            {
                if (this.CurrentUser.IsAnonymous)
                {
                    return(401);
                }

                return(this.SiteDatabase.Query <AffiliateRewardsClaim>()
                       .Where(c => c.NcbUserId == this.CurrentUser.Id)
                       .AsEnumerable());
            });
        }