Esempio n. 1
0
        public ActionResult ProcessPayment(string token, string PayerID)
        {

            ReviewOrderViewModel newcampaign = Session["NewCampaign"] as ReviewOrderViewModel;
            string result = newcampaign.ProcessPayment(token, PayerID);

            if (result == "success")
            {
                if (ModelState.IsValid)
                {
                    newcampaign.Campaign.SetNumericalPrices();
                    db.Campaigns.Add(newcampaign.Campaign);
                    db.SaveChanges();

                    NotificationLog sellerCreatedCampaign = new NotificationLog();
                    sellerCreatedCampaign.CampaignID = newcampaign.Campaign.CampaignID;
                    sellerCreatedCampaign.LogTimestamp = DateTime.Now;
                    sellerCreatedCampaign.Message = "A seller used the automated tool to create a new campaign!";
                    db.NotificationLog.Add(sellerCreatedCampaign);


                    int id = newcampaign.Campaign.CampaignID;

                    List<string> codes = newcampaign.DiscountCodes.Split(new[] { "\r\n" }, StringSplitOptions.None).ToList();
                    foreach (var item in codes)
                    {
                        if (!String.IsNullOrEmpty(item))
                        {
                            DiscountCode itemcode = new DiscountCode();
                            itemcode.Code = item;
                            itemcode.CampaignID = id;
                            db.DiscountCodes.Add(itemcode);

                        }
                    }
                    db.SaveChanges();
                }
                return View("Success", newcampaign);
            }

            return View("Index", "Seller");
        }
Esempio n. 2
0
        public JsonResult SubmitItemRequest(int campaignid, string userid, string reviewtype, string asin)
        {
            //An error is occuring that some products to not generate the id attribute and the
            //var reviewtype = "#" + asin + "reviewtype" in scripts cannot get reviewtype value.
            //I think this is happening for ASIN products that are all numerical (books). 
            //Temp fix: make reviewtype default to text.
            if (reviewtype == "undefined") { reviewtype = "Text"; }


            string thisCustomer = User.Identity.Name;
            
            //First check if customer has already received or requested this deal, fail immediately if so.
            bool alreadyrequested = db.ItemRequests.Any(i => i.Campaign.ASIN.Equals(asin) && i.CustomerID.Equals(thisCustomer));
            bool alreadyselected = db.Reviews.Any(j => j.Campaign.ASIN.Equals(asin) && j.CustomerID.Equals(thisCustomer));
            if (alreadyrequested || alreadyselected)
            {
                return Json(new { result = "Duplicate" });
            }

            //If customer hasn't requested yet, then check how many open reviews they  have
            int completedReviewsByCustomer = (from c in db.Reviews
                                              where c.CustomerID.Equals(thisCustomer)
                                              where c.Reviewed.Equals(true)
                                              select c).Count();

            int openReviewsByCustomer = (from c in db.Reviews
                                         where c.CustomerID.Equals(thisCustomer)
                                         where c.Reviewed.Equals(false)
                                         select c).Count();

            //If customer has completed three review for BlueRibbons, then they are allowed to have three open reviews
            //at any given moment. If they are new user or less than three completed reviews, they're limited to two items.
            if(completedReviewsByCustomer >=3)
            {
                if (openReviewsByCustomer >= 3)
                {
                    return Json(new { result = "Exceed3" });
                }
            } else
            {
                if (openReviewsByCustomer >= 2)
                {
                    return Json(new { result = "Exceed1" });
                }
            }

            //If customer has overdue reviews, then they're not eligible for more deals.
            var customersOpenReviews = (from c in db.Reviews
                                        where c.CustomerID.Equals(thisCustomer)
                                        where c.Reviewed.Equals(false)
                                        select c).ToList();

            foreach(var rev in customersOpenReviews)
            {
                if(rev.DueDate.Date < DateTime.Now.Date)
                {
                    return Json(new { result = "Overdue" });
                }
            }


            //If customer made it this far then we'll log their request.
            ItemRequest newrequest = new ItemRequest();
            newrequest.CampaignID = campaignid;
            newrequest.CustomerID = thisCustomer;
            newrequest.ReviewType = (ReviewType)Enum.Parse(typeof(ReviewType), reviewtype);
            db.ItemRequests.Add(newrequest);
            db.SaveChanges();

            string message = "OK";

            Campaign campaign = (from Campaign c in db.Campaigns
                                 where c.CampaignID.Equals(campaignid)
                                 select c).First();

            // Any campaign with a daily limit of 0 will only log requests and NOT auto
            //respond per alex and Amber, so we'll just stop here. 
            if (campaign.DailyLimit == 0)
            {
                return Json(new { result = message });
            }

            //With the customer's request logged, if there are available Discount Codes for the campaign, then we'll assign one automatically
            //and let customer get deal!
            int discountCodeCount = (from c in db.DiscountCodes
                      where c.CampaignID.Equals(newrequest.CampaignID)
                      select c).Count();

            if (discountCodeCount > 0)
            {
                var code = (from DiscountCode dc in db.DiscountCodes
                            where dc.CampaignID.Equals(newrequest.CampaignID)
                            select dc).First();

                //Close the item request.
                newrequest.ActiveRequest = false;
                newrequest.Selected = true;

                //Create a Review object based on item request.
                Review requestconvert = new Review();
                requestconvert.CampaignID = newrequest.CampaignID;
                requestconvert.CustomerID = newrequest.CustomerID;
                requestconvert.ReviewTypeExpected = newrequest.ReviewType;
                requestconvert.SelectedDate = DateTime.Now;
                requestconvert.DiscountCode = code.Code;
                db.Reviews.Add(requestconvert);

                db.DiscountCodes.Remove(code);
                db.SaveChanges();

                SendDiscountViewModel codeemail = new SendDiscountViewModel(requestconvert);
                codeemail.SendCode();
                object approved = new
                {
                    result = "Approved",
                    code = code.Code,
                    defaultUrl = campaign.AmazonUrl,
                    customUrl = campaign.VendorsPurchaseURL,
                    instructions = campaign.VendorsPurchaseInstructions
                };

                //After we've approved customer and applied discount code, check if discount codes are depleted.
                //If we used the last discount code, then retire campaign. Note: this will only close campaign
                //if we USED the last code. It won't affect campaigns with no pre-loaded codes. 
                if (discountCodeCount == 1)
                {
                    campaign.OpenCampaign = false;
                    campaign.CloseDate = DateTime.Now;
                    db.Entry(campaign).State = EntityState.Modified;

                    NotificationLog lastCodeLog = new NotificationLog();
                    lastCodeLog.CampaignID = campaign.CampaignID;
                    lastCodeLog.LogTimestamp = DateTime.Now;
                    lastCodeLog.Message = "Last discount code was distributed. Campaign has been Closed.";
                    db.NotificationLog.Add(lastCodeLog);

                }

                DateTime today = DateTime.Now.Date;

                //If we hit the daily deal limit, temporarily pause program. 
                //Secheduled task will reset daily counter the next morning.
                int todaysCount = (from c in db.Reviews
                                   where c.SelectedDate > today
                                   select c).Count();

                //Note, campaigns will a daily limit of 0 are managed manually. 
                if (todaysCount >= campaign.DailyLimit && campaign.DailyLimit > 0)
                {
                    campaign.DailyLimitReached = true;
                    db.Entry(campaign).State = EntityState.Modified;

                    NotificationLog limitReachedLog = new NotificationLog();
                    limitReachedLog.CampaignID = campaign.CampaignID;
                    limitReachedLog.LogTimestamp = DateTime.Now;
                    limitReachedLog.Message = "Daily limit for this campaign has been reached. Item availability will reset tomorrow.";
                    db.NotificationLog.Add(limitReachedLog);

                }

                //And we'll check the number of text reviews. If we've hit our text review goal, we'll disable text reviews
                //and force remaining review requests to be photo or video. 

                int textReviews = (from c in db.Reviews
                                   where c.CampaignID.Equals(campaign.CampaignID)
                                   where c.ReviewTypeExpected == 0
                                   select c).Count();

                if (textReviews >= campaign.TextGoal)
                {
                    campaign.TextValid = false;

                    NotificationLog textLimitReached = new NotificationLog();
                    textLimitReached.CampaignID = campaign.CampaignID;
                    textLimitReached.LogTimestamp = DateTime.Now;
                    textLimitReached.Message = "Text goal has been reached for this campaign. Text reviews have been disabled.";
                    db.NotificationLog.Add(textLimitReached);
                }

                db.SaveChanges();

                return Json(approved);
            }

            //No codes were available, so all we did was log the request for the admins. 
            return Json(new { result = message });

        }