public static Menu AddProductToMenu(Menu menu, Product product, string categoryId) { if (menu.Categories == null) { menu.Categories = new List<Category> { new Category { Id = categoryId, Products = new List<string>() } }; } var category = menu.Categories.FirstOrDefault(c => c.Id == categoryId); if (category == null) { category = new Category { Id = categoryId, Products = new List<string>() }; menu.Categories.Add(category); } category.Products.Add(product.Id); return menu; }
public static void ValidateMenu(Menu menu, string enterpriseId, Raven.Client.IDocumentSession session, Abstract.ILogger _logger) { var allProductIds = menu.Categories.SelectMany(c => c.Products); var productIds = allProductIds as string[] ?? allProductIds.ToArray(); var allProducts = session.Load<Product>(productIds); //Check if all products belongs to this enterprise foreach (var product in allProducts.Where(product => product != null && product.Enterprise != enterpriseId).ToList()) { foreach (var category in from category in menu.Categories from c in category.Products.Where(c => c == product.Id).ToList() select category) { category.Products.Remove(product.Id); } _logger.Warn("Product '{0}' belongs to enterprise: '{1}' was about to be added to '{2}' Code:[hTrsvv563]", product.Id, product.Enterprise, enterpriseId); } //Remove category if it does not have any products foreach (var category in menu.Categories.Where(category => category.Products.Count == 0).ToList()) { menu.Categories.Remove(category); } try { var productDuplicates = productIds.GroupBy(p => p.ToUpper()).SelectMany(grp => grp.Skip(1)); foreach (var productDuplicate in productDuplicates) { _logger.Warn("Duplicate in products found: {0}, Enterprise: {1}", productDuplicate, enterpriseId); } var categoryDuplicates = menu.Categories.GroupBy(c => c.Id.ToUpper()).SelectMany(grp => grp.Skip(1)); foreach (var categoryDuplicate in categoryDuplicates) { _logger.Info("Duplicate in categories found: Name: {0}, Id: {1}, Enterprise: {2}", categoryDuplicate.Name, categoryDuplicate.Id, enterpriseId); categoryDuplicate.Id = GeneralHelper.GetGuid(); } } catch (Exception ex) { _logger.Fatal("ValidateMenu, duplicate check!", ex); } }
public bool UpdateEnterprise(string enterpriseId, Menu menu) { var updated = false; using (var session = _documentStore.OpenSession()) { var enterprise = session.Load<Enterprise>(enterpriseId); try { if (EnterpriseHelper.ValidEditableEnterprise(enterprise, session)) { MenuHelper.ValidateMenu(menu, enterpriseId, session, _logger); if (enterprise.IsNew || enterprise.OwnedByAccount) { var deletedProductsIds = GeneralHelper.CompareLists(enterprise.Menu.Categories.SelectMany(c => c.Products).ToList(), menu.Categories.SelectMany(c => c.Products).ToList()); if (deletedProductsIds.Count > 0) { var deletedProducts = session.Load<Product>(deletedProductsIds); //Delete products that belongs to this enterprise foreach (var deletedProduct in deletedProducts.Where(deletedProduct => deletedProduct != null && deletedProduct.Enterprise == enterpriseId)) { session.Delete(deletedProduct); } } enterprise.Menu = menu; enterprise.LastUpdated = DateTime.Now; } else { var modifiedMenuInDb = session.Load<ModifiedMenu>(MenuHelper.GetModifiedMenuId(enterpriseId)); if (modifiedMenuInDb == null) { var modifiedMenu = new ModifiedMenu { Id = MenuHelper.GetModifiedMenuId(enterpriseId), Menu = menu }; session.Store(modifiedMenu); enterprise.LockedFromEdit = true; enterprise.ModifiedMenu = modifiedMenu.Id; } } session.Store(enterprise); session.SaveChanges(); updated = true; _logger.Info("Updated menu settings for enterprise: " + enterprise.Id); } } catch (Exception ex) { _logger.Fatal(ex.Message, ex); var failedEnterprise = new FailedEnterprise { Enterprise = enterprise, Menu = menu, ErrorMessage = ex.Message }; session.Store(failedEnterprise); session.SaveChanges(); } } return updated; }
public ActionResult SaveMenuSetup(Menu menu, string enterpriseId) { var updated = Db.Enterprises.UpdateEnterprise(enterpriseId, menu); return Json(new { success = updated }); }
public static Enterprise CreateFakeEnterprise(Abstract.Db.IDb Db,bool modified) { var enterprise = new Enterprise { Id = EnterpriseHelper.GetId(GeneralHelper.GetGuid()), Name = RandomString(), Categories = RandomListString(), LastUpdated = DateTime.Now, Coordinates = RandomCoordinates(), StreetRoute = RandomString(), County = "Stockholm" }; var menu = new Menu(); var categories = new List<Category>(); var products = new List<Product>(); for (var i = 0; i < _random.Next(35, 40); i++) { var category = new Category { Id = GeneralHelper.GetGuid(), Name = RandomString(), Products = new List<string>() }; for (var j = 0; j < _random.Next(1, 2); j++) { var product = NewProduct(enterprise.Id,modified); products.Add(product); category.Products.Add(product.Id); } categories.Add(category); } menu.Categories = categories; if(!modified) { enterprise.IsNew = true; } enterprise.Menu = menu; Db.Enterprises.CreateEnterprise(enterprise); Db.Products.AddProductsToDb(products); if(modified) { Thread.Sleep(1000); var categoryCount = enterprise.Menu.Categories.Count; //Remove random products for (var i = 0; i < _random.Next(1, 4); i++) { var randomCategory = enterprise.Menu.Categories[_random.Next(categoryCount)]; var productCountForCategory = randomCategory.Products.Count; enterprise.Menu.Categories[_random.Next(categoryCount)].Products.RemoveAt(_random.Next(productCountForCategory)); } //Create new products var newProducts = new List<Product>(); for (var i = 0; i < _random.Next(1, 8);i++ ) { newProducts.Add(NewProduct(enterprise.Id,false)); } //Add the new products to random categories in random places foreach (var newProduct in newProducts) { var randomCategory = enterprise.Menu.Categories[_random.Next(categoryCount)]; var productCountForCategory = randomCategory.Products.Count; randomCategory.Products.Insert(_random.Next(productCountForCategory),newProduct.Id); } Db.Products.AddProductsToDb(newProducts); Thread.Sleep(1000); Db.Enterprises.UpdateEnterprise(enterprise.Id, enterprise.Menu); } return enterprise; }
public void AddProduct(Product product, string categoryId, string enterpriseId) { using (var session = _documentStore.OpenSession()) { var enterprise = session.Load<Enterprise>(enterpriseId); if (EnterpriseHelper.ValidEditableEnterprise(enterprise, session)) { product.Enterprise = enterpriseId; //Om det är en ny enterprise eller en som är ägd, spara produkten direkt if (enterprise.IsNew || enterprise.OwnedByAccount) { enterprise.Menu = MenuHelper.AddProductToMenu(enterprise.Menu, product, categoryId); _logger.Info(string.Format("New product ({0}) added to new enterprise: {1}, Code:[gPrsdfeas3]", product.Id, enterpriseId)); } else { //If enterprise is existing, save/create a TEMP-menu for approvement var modifiedMenuId = MenuHelper.GetModifiedMenuId(enterpriseId); var menuInDb = session.Load<ModifiedMenu>(modifiedMenuId); if (menuInDb == null) { //Copy the menu from the Enpterprise var menuCopy = new Menu { Categories = new List<Category>() }; foreach (var c in enterprise.Menu.Categories) { var category = new Category { Id = c.Id, Name = c.Name, Products = new List<string>() }; foreach (var p in c.Products) { category.Products.Add(p); } menuCopy.Categories.Add(category); } menuInDb = new ModifiedMenu { Id = modifiedMenuId, Menu = menuCopy }; enterprise.ModifiedMenu = modifiedMenuId; } MenuHelper.AddProductToMenu(menuInDb.Menu, product, categoryId); session.Store(menuInDb); _logger.Info(string.Format("New product {0} added to modified menu:{1} Code:[g8iopgdfe]", product.Id, modifiedMenuId)); } session.Store(enterprise); session.Store(product); session.SaveChanges(); } else { var loggedInUser = !string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name) ? string.Format(", logged in user: {0}", HttpContext.Current.User.Identity.Name) : string.Empty; _logger.Warn(string.Format("A product({0}) was about to be added to a non-valid enterprise with id: {1}{2}, Code:[yTerdfds56]", product.Name, enterpriseId, loggedInUser)); } } }