public ActionResult FileUploadResults(FileUploadResultsViewModel fileUploadResultsViewModel) { return(View(fileUploadResultsViewModel)); }
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); }
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)); }