Ejemplo 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);
        }
Ejemplo 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);
        }
Ejemplo n.º 3
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());
            });
        }