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));
        }