public async Task <ExecutionResult> Execute(ExecuteContext <IAssignCatalogArguments> context)
        {
            try
            {
                var arguments = context.Arguments;

                if (!arguments.ParentId.HasValue)
                {
                    throw new Exception("Catalog cannot be assigned to master company");
                }

                if (arguments.CatalogId.HasValue)
                {
                    await _companyCatalogService.AssignCatalogToCompany(arguments.ParentId.Value, arguments.CompanyId, arguments.CatalogId.Value);
                }
                else
                {
                    await _companyCatalogService.AssignDefaultCatalogToCompany(arguments.ParentId.Value, arguments.CompanyId);
                }

                await _companyCatalogService.GenerateDefaultCompanyCatalog(arguments.CompanyId);

                return(context.Completed());
            }
            catch (Exception ex)
            {
                this.Log().Error("Error executing CreateCompanyPriceCatalogActivity", ex);
                throw;
            }
        }
        public async Task Consume(ConsumeContext <IUpdateCompanyCommand> context)
        {
            var companyArguments = context.Message;

            var companyModel = Map(companyArguments);

            var company = _companyService.GetCompany(companyArguments.CompanyId);

            if (company?.Type == CompanyType.Reseller)
            {
                var oldUri       = $"http://{company.ControlPanelSiteUrl}/static/callback.html";
                var newUri       = $"http://{companyArguments.ControlPanelSiteUrl}/static/callback.html";
                var oldSilentUri = $"http://{company.ControlPanelSiteUrl}/static/silent.html";
                var newSilentUri = $"http://{companyArguments.ControlPanelSiteUrl}/static/silent.html";

                await _clientService.UpdateRedirectUri(oldUri, newUri);

                await _clientService.UpdateRedirectUri(oldSilentUri, newSilentUri);

                await _clientService.UpdatePostLogoutRedirectUri(company.ControlPanelSiteUrl,
                                                                 $"http://{companyArguments.ControlPanelSiteUrl}");
            }

            await _companyService.UpdateAsync(companyModel);

            if (companyModel.ParentId.HasValue && companyModel.CatalogId.HasValue)
            {
                await _companyCatalogService.AssignCatalogToCompany(companyModel.ParentId.Value, companyModel.Id,
                                                                    companyModel.CatalogId.Value);
            }
        }
        public async Task <IHttpActionResult> Update(int catalogId, UpdateCatalogViewModel model)
        {
            var catalog = await _companyCatalogService.GetCompanyCatalog(User.CompanyId(), catalogId);

            var myCompaniesAssignedToCatalog =
                await _companyCatalogService.GetCompaniesAssignedToCatalog(User.CompanyId(), catalogId);

            var newlyAssigned = model.CompaniesAssignedToCatalog.Where(o => model.CompaniesAssignedToCatalog.Any() &&
                                                                       myCompaniesAssignedToCatalog.All(n => o != n.CompanyId)).Select(c => c);

            var removed = myCompaniesAssignedToCatalog.Where(n =>
                                                             model.CompaniesAssignedToCatalog.All(o => n.CompanyId != o)).Select(c => c.CompanyId);

            foreach (var newlyAssignedCompanyId in newlyAssigned)
            {
                await _companyCatalogService.AssignCatalogToCompany(User.CompanyId(), newlyAssignedCompanyId, catalogId);
            }

            foreach (var removedCompanyId in removed)
            {
                await _companyCatalogService.RemoveCompanyFromAssignedCatalog(User.CompanyId(), removedCompanyId);
            }

            await _companyCatalogService.UpdateCompanyCatalog(User.CompanyId(), catalogId, new CatalogModel
            {
                Name        = model.Name,
                Description = model.Description
            });

            foreach (var newModel in model.ProductItems)
            {
                //var currentModel = catalog.Products
                //                    .Select(p => p.ProductItems.FirstOrDefault(pi => pi.ProductItemId == newModel.ProductItemId))
                //                    .FirstOrDefault();
                var currentModel = catalog.Products.SelectMany(p => p.ProductItems).FirstOrDefault(i => i.ProductItemId == newModel.ProductItemId);
                if (currentModel == null)
                {
                    throw new Exception();
                }

                if (currentModel.Available != newModel.Available)
                {
                    await _catalogProductItemService.ChangeProductAvailability(User.CompanyId(), catalogId, newModel.ProductItemId, newModel.Available);
                }

                await _catalogHelper.UpdateFixedRetailPrice(User.UserId(), User.CompanyId(), currentModel, newModel, catalogId);

                await _catalogHelper.UpdateRetailPrice(User.UserId(), User.CompanyId(), currentModel, newModel, catalogId);

                await _catalogHelper.UpdateResellerPrice(User.CompanyId(), currentModel, newModel, catalogId);
            }

            return(Ok(await _catalogHelper.GetCatalog(User.CompanyId(), catalogId)));
        }