public void SetModifiedMenuAsDefault(string enterpriseId)
        {
            using (var session = _documentStore.OpenSession())
            {
                var enterprise   = session.Load <Enterprise>(enterpriseId);
                var modifiedMenu = session.Include <ModifiedMenu>(m => m.Menu.Categories.SelectMany(p => p.Products)).Load(enterprise.ModifiedMenu);

                //Get deleted products. Products that exist in Original menu but NOT in the new Modified menu.
                var deletedProductsIds =
                    GeneralHelper.CompareLists(enterprise.Menu.Categories.SelectMany(c => c.Products).ToList(),
                                               modifiedMenu.Menu.Categories.SelectMany(c => c.Products).ToList());
                var productsToDelete = session.Load <Product>(deletedProductsIds);
                foreach (var productToDelete in productsToDelete)
                {
                    //Delete products
                    if (productToDelete.Id == enterpriseId)
                    {
                        session.Delete(productToDelete);
                    }
                    else
                    {
                        _logger.Warn(string.Format("Was about to delete product ({0}) that not belongs to enterprise ({1}) Code:[bvfgttls]", productToDelete.Id, enterpriseId));
                    }
                }
                if (productsToDelete.Any())
                {
                    _logger.Info(string.Format("{0} products deleted for approved modified menu. Enterprise: {1}", productsToDelete.Count(), enterpriseId));
                }

                //Set all updated versions to be the real versions
                var products = session.Load <Product>(modifiedMenu.Menu.Categories.SelectMany(p => p.Products));
                foreach (var p in products.Where(p => p.UpdatedVersion != null))
                {
                    var product = ProductHelper.AddUpdatedInfoToProduct(p);
                    product.UpdatedVersion = null;
                }
                if (products.Any())
                {
                    _logger.Info(string.Format("Updated {0} products for approved modified menu. Enterprise: {1}", products.Count(), enterpriseId));
                }

                enterprise.Menu         = modifiedMenu.Menu;
                enterprise.ModifiedMenu = null;

                session.Delete(modifiedMenu);

                session.SaveChanges();
            }
        }
        public void DisapproveModifiedMenu(string enterpriseId)
        {
            using (var session = _documentStore.OpenSession())
            {
                var enterprise = session.Load <Enterprise>(enterpriseId);

                var productsInOrginalMenu = enterprise.Menu.Categories.SelectMany(c => c.Products);

                var modifiedMenu = session.Include <ModifiedMenu>(m => m.Menu.Categories.SelectMany(p => p.Products)).Load(enterprise.ModifiedMenu);

                var productsInModifiedMenu = modifiedMenu.Menu.Categories.SelectMany(c => c.Products);

                //Get ids for new products in this modified menu. Products that exist in modified menu but NOT in original menu
                var IdsForNewProductsInModifiedMenu = GeneralHelper.CompareLists(productsInModifiedMenu.ToList(), productsInOrginalMenu.ToList());
                var newProductsToDelete             = session.Load <Product>(IdsForNewProductsInModifiedMenu);
                foreach (var newProduct in newProductsToDelete)
                {
                    //Delete all new products for this modified menu
                    if (newProduct.Enterprise == enterpriseId)
                    {
                        session.Delete(newProduct);
                    }
                    else
                    {
                        _logger.Warn(string.Format("Was about to delete product ({0}) that not belongs to enterprise ({1}). Code:[iplikhff]", newProduct.Id, enterpriseId));
                    }
                }

                if (newProductsToDelete.Any())
                {
                    _logger.Info(string.Format("{0} products deleted for disapproved modified menu. Enterprise: {1}", newProductsToDelete.Count(), enterpriseId));
                }

                session.Delete(modifiedMenu);

                enterprise.ModifiedMenu   = null;
                enterprise.LockedFromEdit = false;

                var products = session.Load <Product>(enterprise.Menu.Categories.SelectMany(p => p.Products));
                foreach (var p in products.Where(p => p.UpdatedVersion != null))
                {
                    p.UpdatedVersion = null;
                }

                session.SaveChanges();
            }
        }
        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);
        }