Example #1
0
 public ActionResult FileUploadResults(FileUploadResultsViewModel fileUploadResultsViewModel)
 {
     return(View(fileUploadResultsViewModel));
 }
Example #2
0
        private FileUploadResultsViewModel ImportAmazonFile(string fileName)
        {
            var userId            = User.Identity.GetUserId();
            var existingPurchases = _db.Purchases.Where(p => p.UserId == userId).ToList();

            var newCategoryCount = new int();
            var newSiteCount     = new int();
            var newPurchaseCount = new int();

            try
            {
                var reader          = new StreamReader(new FileStream(fileName, FileMode.Open));
                var amazonPurchases = _amazonFileService.ExtractPurchasesFromFile(reader);
                reader.Close();
                foreach (var amazonPurchase in amazonPurchases)
                {
                    if (IsDuplicatePurchase(amazonPurchase.Website, amazonPurchase.OrderId) ||
                        amazonPurchase.Quantity == 0)
                    {
                        continue;
                    }

                    // TODO: Note, this Linq statement is converted to SQL, which ignores case when it compares the strings
                    var suggestedCategoryName = _db.SuggestedCategoryNames
                                                .SingleOrDefault(x => x.CategoryName == amazonPurchase.Category)?.SuggestedName;

                    var category = _db.Categories.Where(x => x.UserId == userId)
                                   .SingleOrDefault(c => suggestedCategoryName == null
                            ? amazonPurchase.Category.Equals(c.Name)
                            : suggestedCategoryName.Equals(c.Name));

                    // If category doesn't exist, create it
                    if (!amazonPurchase.Category.IsNullOrWhiteSpace() && category == null)
                    {
                        var categoryName = suggestedCategoryName.IsNullOrWhiteSpace()
                            ? amazonPurchase.Category
                            : suggestedCategoryName;

                        // TODO: Note, this Linq statement is converted to SQL, which ignores case when it compares the strings
                        var suggestedParentCategoryName = _db.SuggestedParentCategories
                                                          .SingleOrDefault(x => x.CategoryName == categoryName)?.ParentCategoryName;

                        var parentCategory = _db.Categories.Where(x => x.UserId == userId)
                                             .SingleOrDefault(x => x.Name == suggestedParentCategoryName);

                        // If parent category doesn't exist, create it
                        if (!suggestedParentCategoryName.IsNullOrWhiteSpace() && parentCategory == null)
                        {
                            parentCategory = new Category
                            {
                                Name           = suggestedParentCategoryName,
                                UserId         = userId,
                                NecessityValue = GetSuggestedNecessityValueForCategory(suggestedParentCategoryName) ?? NecessityValue.SomewhatUnecessary,
                                UseParentCategoryNecessityValue = false
                            };
                            _db.Categories.Add(parentCategory);
                        }

                        category = new Category
                        {
                            Name           = categoryName,
                            UserId         = userId,
                            NecessityValue = GetSuggestedNecessityValueForCategory(categoryName) ?? NecessityValue.SomewhatUnecessary,
                            ParentCategory = parentCategory,
                            UseParentCategoryNecessityValue = true
                        };
                        newCategoryCount++;
                        _db.Categories.Add(category);
                    }



                    var site = _db.Sites.SingleOrDefault(c => amazonPurchase.Website.Equals(c.Name));
                    if (site == null)
                    {
                        site = new Site
                        {
                            Name = amazonPurchase.Website
                        };
                        newSiteCount++;
                        _db.Sites.Add(site);
                    }

                    var purchase = new Purchase
                    {
                        UserId    = userId,
                        Name      = amazonPurchase.Title,
                        UnitPrice = decimal.Parse(amazonPurchase.PurchasePricePerUnit,
                                                  NumberStyles.Currency),
                        Quantity                  = amazonPurchase.Quantity,
                        SiteId                    = site.Id,
                        OrderDate                 = amazonPurchase.OrderDate,
                        OrderReferenceNumber      = amazonPurchase.OrderId,
                        Category                  = category,
                        NecessityValue            = NecessityValue.SomewhatUnecessary,
                        UseCategoryNecessityValue = true
                    };

                    newPurchaseCount++;
                    _db.Purchases.Add(purchase);
                    _db.SaveChanges();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }

            var uploadFileResults = new FileUploadResultsViewModel
            {
                ExistingPurchases = existingPurchases.Count,
                NewCategories     = newCategoryCount,
                NewSites          = newSiteCount,
                NewPurchases      = newPurchaseCount
            };

            return(uploadFileResults);
        }
Example #3
0
        public ActionResult ImportAmazonPurchases(AmazonLoginViewModel amazonLoginViewModel)
        {
            var userId     = User.Identity.GetUserId();
            var folderName = $@"C:\EcommerceTracker\AmazonFiles\{userId}";

            var chromeOptions = new ChromeOptions();

            chromeOptions.AddUserProfilePreference("download.default_directory", folderName);
            chromeOptions.AddUserProfilePreference("intl.accept_languages", "nl");
            chromeOptions.AddUserProfilePreference("disable-popup-blocking", "true");

            // Amazon uses a captcha to prevent headless browsers from logging in
            // chromeOptions.AddArgument("--headless");
            // TODO: Move to seperate method
            using (var driver = new ChromeDriver(chromeOptions))
            {
                try
                {
                    // Navigate to Order History Report page
                    driver.Navigate().GoToUrl("https://www.amazon.com/gp/b2b/reports");

                    // Login to Amazon, with alternate login page detection
                    // TODO: Check if username or password are incorrect
                    var passwordFormFieldExists = driver.FindElementsById("ap_password").Count > 0;
                    if (passwordFormFieldExists)
                    {
                        driver.FindElementById("ap_email").SendKeys(amazonLoginViewModel.EmailAddress);
                        driver.FindElementById("ap_password").SendKeys(amazonLoginViewModel.Password);
                        driver.FindElementById("signInSubmit").Click();
                    }
                    else
                    {
                        driver.FindElementById("ap_email").SendKeys(amazonLoginViewModel.EmailAddress);
                        driver.FindElementById("continue").Click();
                        driver.FindElementById("ap_password").SendKeys(amazonLoginViewModel.Password);
                        driver.FindElementById("signInSubmit").Click();
                    }

                    var waitForForm = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                    waitForForm.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.Id("report-form")));

                    // Look for existing reports
                    // var generatedReportHistoryTableRows = driver.FindElementsByXPath("//*[@class='order-hist-submitted']/tbody/tr");

                    var startMonthSelect = new SelectElement(driver.FindElementById("report-month-start"));
                    startMonthSelect.SelectByValue("1");
                    var startDaySelect = new SelectElement(driver.FindElementById("report-day-start"));
                    startDaySelect.SelectByValue("1");
                    var startYearSelect = new SelectElement(driver.FindElementById("report-year-start"));
                    startYearSelect.SelectByIndex(startYearSelect.Options.Count - 1);
                    driver.FindElementById("report-use-today").Click();
                    driver.FindElementById("report-name").SendKeys("Generated for Ecommerce Tracker");
                    driver.FindElementById("report-confirm").Click();

                    var reportProcessed = false;
                    var reportFailed    = false;
                    do
                    {
                        if (driver.FindElementsById("processing-report-table-row").Count < 1)
                        {
                            reportProcessed = true;
                        }
                        else if (driver.FindElementById("processing-long").Displayed)
                        {
                            driver.FindElementByXPath("//*[@id='report-refresh-button']/img").Click();
                        }
                        else if (driver.FindElementById("processing-failed").Displayed)
                        {
                            reportFailed = true;
                        }
                        Thread.Sleep(TimeSpan.FromSeconds(3));
                    } while (!reportProcessed && !reportFailed);
                }
                catch (Exception e)
                {
                    Debug.Write(e.Message);
                    TempData["HTML"] = driver.PageSource;
                    return(RedirectToAction("SeleniumError"));
                }
            }

            // TODO: Check if directory exists
            var fileNames = Directory.GetFiles(folderName);
            // TODO: Check if files exist
            var totalFileUploadResults = new FileUploadResultsViewModel
            {
                ExistingPurchases = _db.Purchases.Count(x => x.UserId == userId)
            };
            var existingPurchaseFiles = _db.TrackedPurchaseFiles.Where(x => x.UserId == userId).ToList();

            foreach (var fileName in fileNames)
            {
                if (existingPurchaseFiles.Select(x => x.FileName).Contains(fileName))
                {
                    continue;
                }
                var fileUploadResult = ImportAmazonFile(fileName);
                totalFileUploadResults.NewSites      += fileUploadResult.NewSites;
                totalFileUploadResults.NewCategories += fileUploadResult.NewCategories;
                totalFileUploadResults.NewPurchases  += fileUploadResult.NewPurchases;
                _db.TrackedPurchaseFiles.Add(new TrackedPurchaseFile
                {
                    UserId     = userId,
                    FileName   = fileName,
                    FolderName = folderName,
                    Website    = "Amazon.com",
                    ImportDate = DateTime.Now
                });
            }
            _db.SaveChanges();

            return(RedirectToAction("FileUploadResults", totalFileUploadResults));
        }