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