public CompleteEnterpriseViewModel GetCompleteEnterprise(string enterpriseId, bool edit = false) { using (var session = _documentStore.OpenSession()) { var viewModel = new CompleteEnterpriseViewModel(); if (string.IsNullOrEmpty(enterpriseId)) { return(viewModel); } // Load enterprise, include products var enterprise = session.Include <Enterprise>(e => e.Menu.Categories.Select(c => c.Products)).Load(enterpriseId); if (enterprise == null) { return(viewModel); } var menu = enterprise.Menu; var newProducts = new List <string>(); var deletedProductIds = new List <string>(); //Load the modified menu if: edit-mode, has a modified menu, is NOT new, is NOT owned by enterprise if (edit && !string.IsNullOrEmpty(enterprise.ModifiedMenu) && !enterprise.IsNew && !enterprise.OwnedByAccount) { //Get the modified menu instead var modifiedMenu = session.Include <Menu>(e => e.Categories.Select(c => c.Products)).Load <ModifiedMenu>(enterprise.ModifiedMenu); //Get ids of all new products. Products that exist in the Modified-menu but not the original menu newProducts = modifiedMenu.Menu.Categories.SelectMany(c => c.Products).Where(p => !enterprise.Menu.Categories.SelectMany(c => c.Products).Select(p1 => p1).Contains(p)).ToList(); //Get ids of all deleted products. Products that does NOT exist in the Modified-menu but not the original menu deletedProductIds = enterprise.Menu.Categories.SelectMany(c => c.Products).Where(p => !modifiedMenu.Menu.Categories.SelectMany(c => c.Products).Select(p1 => p1).Contains(p)).ToList(); //Set modifiedMenu to menu Mapper.CreateMap <ModifiedMenu, Menu>(); menu = Mapper.Map(modifiedMenu.Menu, menu); } var products = new List <Product>(); // Create to viewmodel var categoriesViewModel = new List <ViewModelCategory>(); if (menu != null) { if (menu.Categories != null) { foreach (var p in menu.Categories.Select(category => session.Load <Product>(category.Products))) { products.AddRange(p); } Mapper.CreateMap <Product, ProductViewModel>(); foreach (var category in menu.Categories) { var categoryViewModel = new ViewModelCategory { Name = category.Name, Id = category.Id, EnterpriseId = enterpriseId, Products = new List <ProductViewModel>() }; foreach (var product in category.Products.Select(productForCategory => products.FirstOrDefault(p => p != null && p.Id == productForCategory))) { if (product == null) { _logger.Warn("Product is null for enterprise {0} ({1})", enterprise.Name, enterprise.Id); continue; } var p = ProductHelper.ModelToViewModel(product); if (edit && p.UpdatedVersion != null) { p.Updated = true; p.OriginalProduct = product; //p.UpdatedVersion = product.UpdatedVersion; Mapper.CreateMap <ProductUpdatedVersion, ProductViewModel>(); Mapper.Map(product.UpdatedVersion, p); } if (edit) { if (newProducts.Contains(p.Id)) { p.New = true; } } p.Enterprise = enterpriseId; p.CategoryId = category.Id; categoryViewModel.Products.Add(p); } categoriesViewModel.Add(categoryViewModel); } if (edit) { //Add deleted products to viewmodel var deletedProducts = session.Load <Product>(deletedProductIds); var deletedProductsViewModel = ProductHelper.ModelToViewModel(deletedProducts.ToList()); foreach (var productViewModel in deletedProductsViewModel) { productViewModel.Deleted = true; } viewModel.DeletedProducts = deletedProductsViewModel; } } } // Add to viewmodel viewModel.ViewModelCategories = categoriesViewModel; viewModel.Enterprise = EnterpriseHelper.ModelToViewModel(enterprise); viewModel.Enterprise.DisplayCategories = EnterpriseHelper.GetDisplayCategories(enterprise.Categories); viewModel.Enterprise.DisplayStreet = string.Format("{0} {1}", enterprise.StreetRoute, enterprise.StreetNumber); if (!edit) { viewModel.Enterprise.ModifiedMenu = null; } return(viewModel); } }
public ActionResult CreateTempEnterprise(EnterpriseViewModel viewModel) { if (!string.IsNullOrEmpty(viewModel.Nope)) { return(RedirectToAction("Index", "Home")); } if (string.IsNullOrEmpty(viewModel.Name)) { ModelState.AddModelError("Name", "Ange restaurangens namn"); } if (viewModel.DisplayCategories == null || viewModel.DisplayCategories.Count < 1) { ModelState.AddModelError("DisplayCategories", "Välj minst en kategori"); } else { viewModel.DisplayCategories = EnterpriseHelper.GetDisplayCategories(viewModel.DisplayCategories); } if (viewModel.Coordinates.Lat < 1 || viewModel.Coordinates.Lng < 1) { ModelState.AddModelError("Coordinates", "Du måste ange någon platsinfo"); } if (ModelState.IsValid) { var categoryList = new List <string>(); categoryList.AddRange(viewModel.DisplayCategories.Take(6).Select(catgory => catgory.Value)); var enterprise = new Enterprise { Name = viewModel.Name, Phone = viewModel.Phone, StreetNumber = viewModel.StreetNumber, StreetRoute = viewModel.StreetRoute, PostalCode = viewModel.PostalCode, PostalTown = viewModel.PostalTown, Commune = viewModel.Commune, County = viewModel.County, SubLocality = viewModel.SubLocality, CountryCode = viewModel.CountryCode ?? "SE", SearchTags = EnterpriseHelper.GenerateSearchTags(viewModel.Name), Coordinates = new Coordinates { Lat = viewModel.Coordinates.Lat, Lng = viewModel.Coordinates.Lng }, Categories = categoryList, IsNew = true, OwnedByAccount = false, LockedFromEdit = false, LastUpdated = DateTime.Now, Menu = new Menu() }; if (string.IsNullOrEmpty(viewModel.Id)) { enterprise.Id = EnterpriseHelper.GetId(GeneralHelper.GetGuid()); Db.Enterprises.CreateEnterprise(enterprise); } else { var enterpriseInDb = Db.Enterprises.GetEnterpriseById(enterprise.Id); if (enterpriseInDb != null) { Db.Enterprises.UpdateEnterprise(enterprise); } } return(Json(new { url = Url.Action("Edit", new { key = EnterpriseHelper.GetKey(enterprise.Id) }) })); } viewModel.ShowForm = true; return(PartialView("~/Views/Manage/_AddEnterpriseForm.cshtml", viewModel)); }