public ActionResult Category(int categoryId, CatalogPagingFilteringModel command)
        {
            var category = _categoryService.GetCategoryById(categoryId);
            if (category == null || category.Deleted)
                return InvokeHttp404();

            //Check whether the current user has a "Manage catalog" permission
            //It allows him to preview a category before publishing
            if (!category.Published && !_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
                return InvokeHttp404();

            //ACL (access control list)
            if (!_aclService.Authorize(category))
                return InvokeHttp404();

            //Store mapping
            if (!_storeMappingService.Authorize(category))
                return InvokeHttp404();
            
            //'Continue shopping' URL
            _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer, 
                SystemCustomerAttributeNames.LastContinueShoppingPage, 
                _webHelper.GetThisPageUrl(false),
                _storeContext.CurrentStore.Id);

            var model = category.ToModel();
            



            //sorting
            PrepareSortingOptions(model.PagingFilteringContext, command);
            //view mode
            PrepareViewModes(model.PagingFilteringContext, command);
            //page size
            PreparePageSizeOptions(model.PagingFilteringContext, command,
                category.AllowCustomersToSelectPageSize, 
                category.PageSizeOptions, 
                category.PageSize);

            //price ranges
            model.PagingFilteringContext.PriceRangeFilter.LoadPriceRangeFilters(category.PriceRanges, _webHelper, _priceFormatter);
            var selectedPriceRange = model.PagingFilteringContext.PriceRangeFilter.GetSelectedPriceRange(_webHelper, category.PriceRanges);
            decimal? minPriceConverted = null;
            decimal? maxPriceConverted = null;
            if (selectedPriceRange != null)
            {
                if (selectedPriceRange.From.HasValue)
                    minPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.From.Value, _workContext.WorkingCurrency);

                if (selectedPriceRange.To.HasValue)
                    maxPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.To.Value, _workContext.WorkingCurrency);
            }





            //category breadcrumb
            model.DisplayCategoryBreadcrumb = _catalogSettings.CategoryBreadcrumbEnabled;
            if (model.DisplayCategoryBreadcrumb)
            {
                foreach (var catBr in category.GetCategoryBreadCrumb(_categoryService, _aclService, _storeMappingService))
                {
                    model.CategoryBreadcrumb.Add(new CategoryModel()
                    {
                        Id = catBr.Id,
                        Name = catBr.GetLocalized(x => x.Name),
                        SeName = catBr.GetSeName()
                    });
                }
            }



            var customerRolesIds = _workContext.CurrentCustomer.CustomerRoles
                .Where(cr => cr.Active).Select(cr => cr.Id).ToList();



            //subcategories
            string subCategoriesCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_SUBCATEGORIES_KEY,
                categoryId,
                string.Join(",", customerRolesIds),
                _storeContext.CurrentStore.Id,
                _workContext.WorkingLanguage.Id,
                _webHelper.IsCurrentConnectionSecured());
            model.SubCategories = _cacheManager.Get(subCategoriesCacheKey, () =>
            {
                return _categoryService.GetAllCategoriesByParentCategoryId(categoryId)
                .Select(x =>
                {
                    var subCatModel = new CategoryModel.SubCategoryModel()
                    {
                        Id = x.Id,
                        Name = x.GetLocalized(y => y.Name),
                        SeName = x.GetSeName(),
                    };

                    //prepare picture model
                    int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                    var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                    subCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                    {
                        var picture = _pictureService.GetPictureById(x.PictureId);
                        var pictureModel = new PictureModel()
                        {
                            FullSizeImageUrl = _pictureService.GetPictureUrl(picture),
                            ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize),
                            Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), subCatModel.Name),
                            AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), subCatModel.Name)
                        };
                        return pictureModel;
                    });

                    return subCatModel;
                })
                .ToList();
            });

            //sibcategories
            string sibCategoriesCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_SIBCATEGORIES_KEY,
                categoryId,
                string.Join(",", customerRolesIds),
                _storeContext.CurrentStore.Id,
                _workContext.WorkingLanguage.Id,
                _webHelper.IsCurrentConnectionSecured());
            model.SibCategories = _cacheManager.Get(sibCategoriesCacheKey, () =>
            {
                return _categoryService.GetAllCategoriesByParentCategoryId(category.ParentCategoryId)
                .Select(x =>
                {
                    var sibCatModel = new CategoryModel.SubCategoryModel()
                    {
                        Id = x.Id,
                        Name = x.GetLocalized(y => y.Name),
                        SeName = x.GetSeName(),
                    };

                    //prepare picture model
                    int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                    var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                    sibCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                    {
                        var picture = _pictureService.GetPictureById(x.PictureId);
                        var pictureModel = new PictureModel()
                        {
                            FullSizeImageUrl = _pictureService.GetPictureUrl(picture),
                            ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize),
                            Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), sibCatModel.Name),
                            AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), sibCatModel.Name)
                        };
                        return pictureModel;
                    });

                    return sibCatModel;
                })
                .ToList();
            });



            //featured products
            if (!_catalogSettings.IgnoreFeaturedProducts)
            {
                //We cache a value indicating whether we have featured products
                IPagedList<Product> featuredProducts = null;
                string cacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_HAS_FEATURED_PRODUCTS_KEY, categoryId,
                    string.Join(",", customerRolesIds), _storeContext.CurrentStore.Id);
                var hasFeaturedProductsCache = _cacheManager.Get<bool?>(cacheKey);
                if (!hasFeaturedProductsCache.HasValue)
                {
                    //no value in the cache yet
                    //let's load products and cache the result (true/false)
                    featuredProducts = _productService.SearchProducts(
                       categoryIds: new List<int>() { category.Id },
                       storeId: _storeContext.CurrentStore.Id,
                       visibleIndividuallyOnly: true,
                       featuredProducts: true);
                    hasFeaturedProductsCache = featuredProducts.TotalCount > 0;
                    _cacheManager.Set(cacheKey, hasFeaturedProductsCache, 60);
                }
                if (hasFeaturedProductsCache.Value && featuredProducts == null)
                {
                    //cache indicates that the category has featured products
                    //let's load them
                    featuredProducts = _productService.SearchProducts(
                       categoryIds: new List<int>() { category.Id },
                       storeId: _storeContext.CurrentStore.Id,
                       visibleIndividuallyOnly: true,
                       featuredProducts: true);
                }
                if (featuredProducts != null)
                {
                    model.FeaturedProducts = PrepareProductOverviewModels(featuredProducts).ToList();
                }
            }


            var categoryIds = new List<int>();
            categoryIds.Add(category.Id);
            if (_catalogSettings.ShowProductsFromSubcategories)
            {
                //include subcategories
                categoryIds.AddRange(GetChildCategoryIds(category.Id));
            }
            //products
            IList<int> alreadyFilteredSpecOptionIds = model.PagingFilteringContext.SpecificationFilter.GetAlreadyFilteredSpecOptionIds(_webHelper);
            IList<int> filterableSpecificationAttributeOptionIds = null;
            var products = _productService.SearchProducts(out filterableSpecificationAttributeOptionIds, true,
                categoryIds: categoryIds,
                storeId: _storeContext.CurrentStore.Id,
                visibleIndividuallyOnly: true,
                featuredProducts:_catalogSettings.IncludeFeaturedProductsInNormalLists ? null : (bool?)false,
                priceMin:minPriceConverted, 
                priceMax:maxPriceConverted,
                filteredSpecs: alreadyFilteredSpecOptionIds,
                orderBy: ProductSortingEnum.StockAvailabilityAndPosition,
                pageIndex: command.PageNumber - 1,
                pageSize: command.PageSize);
            model.Products = PrepareProductOverviewModels(products).ToList();

            model.PagingFilteringContext.LoadPagedList(products);

            //specs
            model.PagingFilteringContext.SpecificationFilter.PrepareSpecsFilters(alreadyFilteredSpecOptionIds,
                filterableSpecificationAttributeOptionIds, 
                _specificationAttributeService, _webHelper, _workContext);
            

            //template
            var templateCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_TEMPLATE_MODEL_KEY, category.CategoryTemplateId);
            var templateViewPath = _cacheManager.Get(templateCacheKey, () =>
                {
                    var template = _categoryTemplateService.GetCategoryTemplateById(category.CategoryTemplateId);
                    if (template == null)
                        template = _categoryTemplateService.GetAllCategoryTemplates().FirstOrDefault();
                    if (template == null)
                        throw new Exception("No default template could be loaded");
                    return template.ViewPath;
                });

            //activity log
            _customerActivityService.InsertActivity("PublicStore.ViewCategory", _localizationService.GetResource("ActivityLog.PublicStore.ViewCategory"), category.Name);

            return View(templateViewPath, model);
        }
Exemple #2
0
        public ActionResult Category(int categoryId, CatalogPagingFilteringModel command)
        {
            var category = _categoryService.GetCategoryById(categoryId);
            if (category == null || category.Deleted || !category.Published)
                return RedirectToAction("Index", "Home");

            //'Continue shopping' URL
            _customerService.SaveCustomerAttribute(_workContext.CurrentCustomer, SystemCustomerAttributeNames.LastContinueShoppingPage, _webHelper.GetThisPageUrl(false));

            if (command.PageNumber <= 0) command.PageNumber = 1;

            var model = category.ToModel();

            //sorting
            model.PagingFilteringContext.AllowProductSorting = _catalogSettings.AllowProductSorting;
            if (model.PagingFilteringContext.AllowProductSorting)
            {
                foreach (ProductSortingEnum enumValue in Enum.GetValues(typeof(ProductSortingEnum)))
                {
                    var currentPageUrl = _webHelper.GetThisPageUrl(true);
                    var sortUrl = _webHelper.ModifyQueryString(currentPageUrl, "orderby=" + ((int)enumValue).ToString(), null);

                    var sortValue = enumValue.GetLocalizedEnum(_localizationService, _workContext);
                    model.PagingFilteringContext.AvailableSortOptions.Add(new SelectListItem()
                        {
                            Text = sortValue,
                            Value = sortUrl,
                            Selected = enumValue == (ProductSortingEnum)command.OrderBy
                        });
                }
            }

            //view mode
            model.PagingFilteringContext.AllowProductViewModeChanging = _catalogSettings.AllowProductViewModeChanging;
            var viewMode = !string.IsNullOrEmpty(command.ViewMode)
                ? command.ViewMode
                : _catalogSettings.DefaultViewMode;
            if (model.PagingFilteringContext.AllowProductViewModeChanging)
            {
                var currentPageUrl = _webHelper.GetThisPageUrl(true);
                //grid
                model.PagingFilteringContext.AvailableViewModes.Add(new SelectListItem()
                {
                    Text = _localizationService.GetResource("Categories.ViewMode.Grid"),
                    Value = _webHelper.ModifyQueryString(currentPageUrl, "viewmode=grid", null),
                    Selected = viewMode == "grid"
                });
                //list
                model.PagingFilteringContext.AvailableViewModes.Add(new SelectListItem()
                {
                    Text = _localizationService.GetResource("Categories.ViewMode.List"),
                    Value = _webHelper.ModifyQueryString(currentPageUrl, "viewmode=list", null),
                    Selected = viewMode == "list"
                });
            }

            //page size
            model.PagingFilteringContext.AllowCustomersToSelectPageSize = false;
            if (category.AllowCustomersToSelectPageSize && category.PageSizeOptions != null)
            {
                var pageSizes = category.PageSizeOptions.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                if (pageSizes.Any())
                {
                    // get the first page size entry to use as the default (category page load) or if customer enters invalid value via query string
                    if (command.PageSize <= 0 || !pageSizes.Contains(command.PageSize.ToString()))
                    {
                        int temp = 0;

                        if (int.TryParse(pageSizes.FirstOrDefault(), out temp))
                        {
                            if (temp > 0)
                            {
                                command.PageSize = temp;
                            }
                        }
                    }

                    var currentPageUrl = _webHelper.GetThisPageUrl(true);
                    var sortUrl = _webHelper.ModifyQueryString(currentPageUrl, "pagesize={0}", null);
                    sortUrl = _webHelper.RemoveQueryString(sortUrl, "pagenumber");

                    foreach (var pageSize in pageSizes)
                    {
                        int temp = 0;
                        if (!int.TryParse(pageSize, out temp))
                        {
                            continue;
                        }
                        if (temp <= 0)
                        {
                            continue;
                        }

                        model.PagingFilteringContext.PageSizeOptions.Add(new SelectListItem()
                        {
                            Text = pageSize,
                            Value = String.Format(sortUrl, pageSize),
                            Selected = pageSize.Equals(command.PageSize.ToString(), StringComparison.InvariantCultureIgnoreCase)
                        });
                    }

                    if (model.PagingFilteringContext.PageSizeOptions.Any())
                    {
                        model.PagingFilteringContext.PageSizeOptions = model.PagingFilteringContext.PageSizeOptions.OrderBy(x => int.Parse(x.Text)).ToList();
                        model.PagingFilteringContext.AllowCustomersToSelectPageSize = true;

                        if (command.PageSize <= 0)
                        {
                            command.PageSize = int.Parse(model.PagingFilteringContext.PageSizeOptions.FirstOrDefault().Text);
                        }
                    }
                }
            }

            if (command.PageSize <= 0) command.PageSize = category.PageSize;

            //price ranges
            model.PagingFilteringContext.PriceRangeFilter.LoadPriceRangeFilters(category.PriceRanges, _webHelper, _priceFormatter);
            var selectedPriceRange = model.PagingFilteringContext.PriceRangeFilter.GetSelectedPriceRange(_webHelper, category.PriceRanges);
            decimal? minPriceConverted = null;
            decimal? maxPriceConverted = null;
            if (selectedPriceRange != null)
            {
                if (selectedPriceRange.From.HasValue)
                    minPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.From.Value, _workContext.WorkingCurrency);

                if (selectedPriceRange.To.HasValue)
                    maxPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.To.Value, _workContext.WorkingCurrency);
            }

            //category breadcrumb
            model.DisplayCategoryBreadcrumb = _catalogSettings.CategoryBreadcrumbEnabled;
            if (model.DisplayCategoryBreadcrumb)
            {
                foreach (var catBr in GetCategoryBreadCrumb(category))
                {
                    model.CategoryBreadcrumb.Add(new CategoryModel()
                    {
                        Id = catBr.Id,
                        Name = catBr.GetLocalized(x => x.Name),
                        SeName = catBr.GetSeName()
                    });
                }
            }

            //subcategories
            model.SubCategories = _categoryService
                .GetAllCategoriesByParentCategoryId(categoryId)
                .Select(x =>
                {
                    var subCatName = x.GetLocalized(y => y.Name);
                    var subCatModel = new CategoryModel.SubCategoryModel()
                    {
                        Id = x.Id,
                        Name = subCatName,
                        SeName = x.GetSeName(),
                    };

                    //prepare picture model
                    int pictureSize = _mediaSetting.CategoryThumbPictureSize;
                    var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured());
                    subCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                    {
                        var pictureModel = new PictureModel()
                        {
                            FullSizeImageUrl = _pictureService.GetPictureUrl(x.PictureId),
                            ImageUrl = _pictureService.GetPictureUrl(x.PictureId, pictureSize),
                            Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), subCatName),
                            AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), subCatName)
                        };
                        return pictureModel;
                    });

                    return subCatModel;
                })
                .ToList();

            //featured products
            //Question: should we use '_catalogSettings.ShowProductsFromSubcategories' setting for displaying featured products?
            if (!_catalogSettings.IgnoreFeaturedProducts && _categoryService.GetTotalNumberOfFeaturedProducts(categoryId) > 0)
            {
                //We use the fast GetTotalNumberOfFeaturedProducts before invoking of the slow SearchProducts
                //to ensure that we have at least one featured product
                IList<int> filterableSpecificationAttributeOptionIdsFeatured = null;
                var featuredProducts = _productService.SearchProducts(category.Id,
                    0, true, null, null, 0, null, false,
                    _workContext.WorkingLanguage.Id, null,
                    ProductSortingEnum.Position, 0, int.MaxValue,
                    false, out filterableSpecificationAttributeOptionIdsFeatured);
                model.FeaturedProducts = featuredProducts.Select(x => PrepareProductOverviewModel(x)).ToList();
            }

            var categoryIds = new List<int>();
            categoryIds.Add(category.Id);
            if (_catalogSettings.ShowProductsFromSubcategories)
            {
                //include subcategories
                categoryIds.AddRange(GetChildCategoryIds(category.Id));
            }
            //products
            IList<int> alreadyFilteredSpecOptionIds = model.PagingFilteringContext.SpecificationFilter.GetAlreadyFilteredSpecOptionIds(_webHelper);
            IList<int> filterableSpecificationAttributeOptionIds = null;
            var products = _productService.SearchProducts(categoryIds, 0,
                _catalogSettings.IncludeFeaturedProductsInNormalLists ? null : (bool?)false,
                minPriceConverted, maxPriceConverted,
                0, string.Empty, false, _workContext.WorkingLanguage.Id, alreadyFilteredSpecOptionIds,
                (ProductSortingEnum)command.OrderBy, command.PageNumber - 1, command.PageSize,
                true, out filterableSpecificationAttributeOptionIds);
            model.Products = products.Select(x => PrepareProductOverviewModel(x)).ToList();

            model.PagingFilteringContext.LoadPagedList(products);
            model.PagingFilteringContext.ViewMode = viewMode;

            //specs
            model.PagingFilteringContext.SpecificationFilter.PrepareSpecsFilters(alreadyFilteredSpecOptionIds,
                filterableSpecificationAttributeOptionIds,
                _specificationAttributeService, _webHelper, _workContext);

            //template
            var templateCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_TEMPLATE_MODEL_KEY, category.CategoryTemplateId);
            var templateViewPath = _cacheManager.Get(templateCacheKey, () =>
                {
                    var template = _categoryTemplateService.GetCategoryTemplateById(category.CategoryTemplateId);
                    if (template == null)
                        template = _categoryTemplateService.GetAllCategoryTemplates().FirstOrDefault();
                    return template.ViewPath;
                });

            return View(templateViewPath, model);
        }
        public ActionResult Category(int categoryId, CatalogPagingFilteringModel command)
        {
            var category = _categoryService.GetCategoryById(categoryId);
            if (category == null || category.Deleted)
                return InvokeHttp404();

            //Check whether the current user has a "Manage catalog" permission
            //It allows him to preview a category before publishing
            if (!category.Published && !_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
                return InvokeHttp404();

            //ACL (access control list)
            if (!_aclService.Authorize(category))
                return InvokeHttp404();

            //Store mapping
            if (!_storeMappingService.Authorize(category))
                return InvokeHttp404();

            //'Continue shopping' URL
            _genericAttributeService.SaveAttribute(_workContext.CurrentCustomer,
                SystemCustomerAttributeNames.LastContinueShoppingPage,
                _webHelper.GetThisPageUrl(false),
                _storeContext.CurrentStore.Id);

            if (command.PageNumber <= 0) command.PageNumber = 1;

            var model = category.ToModel();

            //sorting
            model.PagingFilteringContext.AllowProductSorting = _catalogSettings.AllowProductSorting;
            if (model.PagingFilteringContext.AllowProductSorting)
            {
                foreach (ProductSortingEnum enumValue in Enum.GetValues(typeof(ProductSortingEnum)))
                {
                    var currentPageUrl = _webHelper.GetThisPageUrl(true);
                    var sortUrl = _webHelper.ModifyQueryString(currentPageUrl, "orderby=" + ((int)enumValue).ToString(), null);

                    var sortValue = enumValue.GetLocalizedEnum(_localizationService, _workContext);
                    model.PagingFilteringContext.AvailableSortOptions.Add(new SelectListItem()
                        {
                            Text = sortValue,
                            Value = sortUrl,
                            Selected = enumValue == (ProductSortingEnum)command.OrderBy
                        });
                }
            }

            //view mode
            model.PagingFilteringContext.AllowProductViewModeChanging = _catalogSettings.AllowProductViewModeChanging;
            var viewMode = !string.IsNullOrEmpty(command.ViewMode)
                ? command.ViewMode
                : _catalogSettings.DefaultViewMode;
            if (model.PagingFilteringContext.AllowProductViewModeChanging)
            {
                var currentPageUrl = _webHelper.GetThisPageUrl(true);
                //grid
                model.PagingFilteringContext.AvailableViewModes.Add(new SelectListItem()
                {
                    Text = _localizationService.GetResource("Categories.ViewMode.Grid"),
                    Value = _webHelper.ModifyQueryString(currentPageUrl, "viewmode=grid", null),
                    Selected = viewMode == "grid"
                });
                //list
                model.PagingFilteringContext.AvailableViewModes.Add(new SelectListItem()
                {
                    Text = _localizationService.GetResource("Categories.ViewMode.List"),
                    Value = _webHelper.ModifyQueryString(currentPageUrl, "viewmode=list", null),
                    Selected = viewMode == "list"
                });
            }

            //page size
            model.PagingFilteringContext.AllowCustomersToSelectPageSize = false;
            if (category.AllowCustomersToSelectPageSize && category.PageSizeOptions != null)
            {
                var pageSizes = category.PageSizeOptions.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                if (pageSizes.Any())
                {
                    // get the first page size entry to use as the default (category page load) or if customer enters invalid value via query string
                    if (command.PageSize <= 0 || !pageSizes.Contains(command.PageSize.ToString()))
                    {
                        int temp = 0;

                        if (int.TryParse(pageSizes.FirstOrDefault(), out temp))
                        {
                            if (temp > 0)
                            {
                                command.PageSize = temp;
                            }
                        }
                    }

                    var currentPageUrl = _webHelper.GetThisPageUrl(true);
                    var sortUrl = _webHelper.ModifyQueryString(currentPageUrl, "pagesize={0}", null);
                    sortUrl = _webHelper.RemoveQueryString(sortUrl, "pagenumber");

                    foreach (var pageSize in pageSizes)
                    {
                        int temp = 0;
                        if (!int.TryParse(pageSize, out temp))
                        {
                            continue;
                        }
                        if (temp <= 0)
                        {
                            continue;
                        }

                        model.PagingFilteringContext.PageSizeOptions.Add(new SelectListItem()
                        {
                            Text = pageSize,
                            Value = String.Format(sortUrl, pageSize),
                            Selected = pageSize.Equals(command.PageSize.ToString(), StringComparison.InvariantCultureIgnoreCase)
                        });
                    }

                    if (model.PagingFilteringContext.PageSizeOptions.Any())
                    {
                        model.PagingFilteringContext.PageSizeOptions = model.PagingFilteringContext.PageSizeOptions.OrderBy(x => int.Parse(x.Text)).ToList();
                        model.PagingFilteringContext.AllowCustomersToSelectPageSize = true;

                        if (command.PageSize <= 0)
                        {
                            command.PageSize = int.Parse(model.PagingFilteringContext.PageSizeOptions.FirstOrDefault().Text);
                        }
                    }
                }
            }
            else
            {
                //customer is not allowed to select a page size
                command.PageSize = category.PageSize;
            }

            if (command.PageSize <= 0) command.PageSize = category.PageSize;

            //price ranges
            model.PagingFilteringContext.PriceRangeFilter.LoadPriceRangeFilters(category.PriceRanges, _webHelper, _priceFormatter);
            var selectedPriceRange = model.PagingFilteringContext.PriceRangeFilter.GetSelectedPriceRange(_webHelper, category.PriceRanges);
            decimal? minPriceConverted = null;
            decimal? maxPriceConverted = null;
            if (selectedPriceRange != null)
            {
                if (selectedPriceRange.From.HasValue)
                    minPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.From.Value, _workContext.WorkingCurrency);

                if (selectedPriceRange.To.HasValue)
                    maxPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.To.Value, _workContext.WorkingCurrency);
            }

            //category breadcrumb
            model.DisplayCategoryBreadcrumb = _catalogSettings.CategoryBreadcrumbEnabled;
            if (model.DisplayCategoryBreadcrumb)
            {
                foreach (var catBr in category.GetCategoryBreadCrumb(_categoryService, _aclService, _storeMappingService))
                {
                    model.CategoryBreadcrumb.Add(new CategoryModel()
                    {
                        Id = catBr.Id,
                        Name = catBr.GetLocalized(x => x.Name),
                        SeName = catBr.GetSeName()
                    });
                }
            }

            //subcategories
            model.SubCategories = _categoryService
                .GetAllCategoriesByParentCategoryId(categoryId)
                .Select(x =>
                {
                    var subCatName = x.GetLocalized(y => y.Name);
                    var subCatModel = new CategoryModel.SubCategoryModel()
                    {
                        Id = x.Id,
                        Name = subCatName,
                        SeName = x.GetSeName(),
                    };

                    //prepare picture model
                    int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                    var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                    subCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                    {
                        var pictureModel = new PictureModel()
                        {
                            FullSizeImageUrl = _pictureService.GetPictureUrl(x.PictureId),
                            ImageUrl = _pictureService.GetPictureUrl(x.PictureId, pictureSize),
                            Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), subCatName),
                            AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), subCatName)
                        };
                        return pictureModel;
                    });

                    return subCatModel;
                })
                .ToList();

            //featured products
            if (!_catalogSettings.IgnoreFeaturedProducts)
            {
                IPagedList<Product> featuredProducts = null;

                //We cache whether we have featured products
                var customerRolesIds = _workContext.CurrentCustomer.CustomerRoles
                    .Where(cr => cr.Active).Select(cr => cr.Id).ToList();
                string cacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_HAS_FEATURED_PRODUCTS_KEY, categoryId,
                    string.Join(",", customerRolesIds), _storeContext.CurrentStore.Id);
                var hasFeaturedProductsCache = _cacheManager.Get<bool?>(cacheKey);
                if (!hasFeaturedProductsCache.HasValue)
                {
                    featuredProducts = _productService.SearchProducts(
                       categoryIds: new List<int>() { category.Id },
                       storeId: _storeContext.CurrentStore.Id,
                       visibleIndividuallyOnly: true,
                       featuredProducts: true);
                    hasFeaturedProductsCache = featuredProducts.TotalCount > 0;
                    _cacheManager.Set(cacheKey, hasFeaturedProductsCache, 60);
                }
                if (hasFeaturedProductsCache.Value && featuredProducts == null)
                {
                    featuredProducts = _productService.SearchProducts(
                       categoryIds: new List<int>() { category.Id },
                       storeId: _storeContext.CurrentStore.Id,
                       visibleIndividuallyOnly: true,
                       featuredProducts: true);
                }
                if (featuredProducts != null)
                {
                    model.FeaturedProducts = PrepareProductOverviewModels(featuredProducts).ToList();
                }
            }

            var categoryIds = new List<int>();
            categoryIds.Add(category.Id);
            if (_catalogSettings.ShowProductsFromSubcategories)
            {
                //include subcategories
                categoryIds.AddRange(GetChildCategoryIds(category.Id));
            }
            //products
            IList<int> alreadyFilteredSpecOptionIds = model.PagingFilteringContext.SpecificationFilter.GetAlreadyFilteredSpecOptionIds(_webHelper);
            IList<int> filterableSpecificationAttributeOptionIds = null;
            var products = _productService.SearchProducts(out filterableSpecificationAttributeOptionIds, true,
                categoryIds: categoryIds,
                storeId: _storeContext.CurrentStore.Id,
                visibleIndividuallyOnly: true,
                featuredProducts:_catalogSettings.IncludeFeaturedProductsInNormalLists ? null : (bool?)false,
                priceMin:minPriceConverted, priceMax:maxPriceConverted,
                filteredSpecs: alreadyFilteredSpecOptionIds,
                orderBy: (ProductSortingEnum)command.OrderBy,
                pageIndex: command.PageNumber - 1,
                pageSize: command.PageSize);
            model.Products = PrepareProductOverviewModels(products).ToList();

            model.PagingFilteringContext.LoadPagedList(products);
            model.PagingFilteringContext.ViewMode = viewMode;

            //specs
            model.PagingFilteringContext.SpecificationFilter.PrepareSpecsFilters(alreadyFilteredSpecOptionIds,
                filterableSpecificationAttributeOptionIds,
                _specificationAttributeService, _webHelper, _workContext);

            //template
            var templateCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_TEMPLATE_MODEL_KEY, category.CategoryTemplateId);
            var templateViewPath = _cacheManager.Get(templateCacheKey, () =>
                {
                    var template = _categoryTemplateService.GetCategoryTemplateById(category.CategoryTemplateId);
                    if (template == null)
                        template = _categoryTemplateService.GetAllCategoryTemplates().FirstOrDefault();
                    if (template == null)
                        throw new Exception("No default template could be loaded");
                    return template.ViewPath;
                });

            //activity log
            _customerActivityService.InsertActivity("PublicStore.ViewCategory", _localizationService.GetResource("ActivityLog.PublicStore.ViewCategory"), category.Name);

            return View(templateViewPath, model);
        }
        //----------------------------------------------------------------------------------------------------------------------------------------------------
        ////////Make sure sale increments are:
        ////////  consecutive
        ////////  don't intersect
        ////////  begin at 0
        ////////  end at 9,999,999
        //////[NonAction]
        //////protected virtual Boolean IncrementsAreGood(AUSaleRecord record)
        //////{
        //////    var increments = record.AUIncrementRecords.OrderBy(a => a.FromBidAmt);

        //////    int count = 0;
        //////    decimal lowamt = decimal.MaxValue;
        //////    decimal highamt = 0;
        //////    decimal previoustoamt = 0;
        //////    foreach (var increment in increments)
        //////    {
        //////        if (increment.FromBidAmt < lowamt)
        //////        { lowamt = increment.FromBidAmt;}

        //////        if (increment.ToBidAmt > highamt)
        //////        { highamt = increment.ToBidAmt;}

        //////        //must ensure each increment is well formed before doing intersection checks below
        //////        if (increment.ToBidAmt <= increment.FromBidAmt)
        //////            return false;
                
        //////        //make sure this increment is consecutive to last increment (oncrements ordered by From amt)
        //////        if (count == 0)
        //////            {previoustoamt = increment.ToBidAmt;}
        //////        else 
        //////            if (increment.FromBidAmt != previoustoamt + 1 )
        //////                {return false;}
        //////            else
        //////                 {previoustoamt = increment.ToBidAmt;}

        //////        count += 1;
        //////    }

        //////    //increments must begin in 0 and end in 9,999,999
        //////    if (lowamt != 0 || highamt != 9999999)
        //////        {return false;}

        //////    var increments2 = record.AUIncrementRecords.OrderBy(a => a.FromBidAmt);
        //////    count = 0;
        //////    int count2 = 0;
        //////    foreach (var increment in increments)
        //////    {

        //////        foreach (var increment2 in increments2)
        //////        {

        //////            if (((increment.FromBidAmt >= increment2.FromBidAmt && increment.FromBidAmt <= increment2.ToBidAmt) ||
        //////                (increment.ToBidAmt <= increment2.ToBidAmt && increment.ToBidAmt >= increment2.FromBidAmt )) &&
        //////                (count != count2))
        //////            { return false; }

        //////            count2 += 1;
        //////        }

        //////        count2 = 0;
        //////        count += 1;
        //////    }

        //////    return true;
        //////}



        #endregion

        #region Methods


        //---------------------------------------------------------------------------------------------------------------------------------------------
        ////////When a view is returned, it expects that an associated .cshtml file is in the same view folder 
        ////////structure as the controller layout for that area (if no areas are in use, then there is only 
        ////////1 view folder and 1 controller folder). The controller name will be the folder name in the views 
        ////////folder, and the actionresult name will be the expected name of the .cshtml file.


        //-------------------------------------------------------------------------------------------------------------------------------------------
        ////////[NopHttpsRequirement(SslRequirement.No)]
        ////////public ActionResult Index()
        ////////{
        ////////    return View();
        ////////}


        //---------------------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult CreateUpdateConsignor(int ConsignorId = 0)
        //////{
        //////    AUConsignorRecord consignor = new AUConsignorRecord();
        //////    if (ConsignorId > 0)
        //////    {
        //////        consignor = _consignorRepo.GetById(ConsignorId);
        //////    }

        //////    //indicate if entity has a fee associated. This tells Consignor page not to show fees fields if already has fee (maintain through grid)
        //////    var fee = _consignorService.GetFeesForOneId(ConsignorId, "AUConsignor");
           
        //////    //return View(consignment); //use with custome view engine
        //////    //return View("CreateUpdatePromoSlider");
        //////    //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");
        //////    return View("~/Views/AUConsignor/CreateUpdateConsignor.cshtml", consignor); //worked first time null
        //////    //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml", slider);
        //////}


        //---------------------------------------------------------------------------------------------------------------------------------------------------
        ////////this post happens when you click 'Save'
        //////[HttpPost]
        //////public ActionResult CreateUpdateConsignor(AUConsignorRecord record)
        //////{
        //////    if (ModelState.IsValid)
        //////    {
        //////        AUConsignorRecord consignor = _consignorRepo.GetById(record.AUConsignorID);

        //////        if (consignor == null)
        //////        {

        //////            var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////            record.CreatedBy = CurrentCustomer.Username;
        //////            record.UpdatedBy = CurrentCustomer.Username;

        //////            record.CreatedOnDT = System.DateTime.UtcNow;
        //////            record.UpdatedOnDT = System.DateTime.UtcNow;
        //////            //Make updated by same as created by date for initial store
        //////            //record.UpdatedOnDT = System.DateTime.UtcNow;
        //////            record.UpdatedOnDT = record.CreatedOnDT;

        //////            _consignorRepo.Insert(record);

        //////            //store a blank fee at the highest level to make consignor fees easier/more consistent grid design
        //////            var fee = new AUFeesRecord();
        //////            fee.AUEntityID = record.AUConsignorID;
        //////            fee.AUEntityType = "AUConsignor";
        //////            fee.CommissionCanExceedReserveInd = false;
        //////            fee.ExpertisingFeeAmt = 0;
        //////            fee.FixedFeeAmt = 0;
        //////            fee.InsuranceSoldPct = 0;
        //////            fee.InsuranceUnsoldPct = 0;
        //////            fee.InterestOnAdvancePct = 0;
        //////            fee.MinCommissionMailSoldAmt = 0;
        //////            fee.MinCommissionMailUnsoldAmt = 0;
        //////            fee.MinCommissionPublicSoldAmt = 0;
        //////            fee.MinCommissionPublicUnsoldAmt = 0;
        //////            fee.MinimumConsignorTotalFeeAmt = 0;
        //////            fee.MiscFeeAmt = 0;
        //////            fee.SoldPct = 0;
        //////            fee.UnsoldPct = 0;

        //////            _feesRepo.Insert(fee);


        //////            SuccessNotification("Consignor Created Successfully - please add consignments and fees!");
        //////            return RedirectToRoute(new
        //////            {
        //////                Action = "CreateUpdateConsignor",
        //////                Controller = "AUConsignor",
        //////                ConsignorId = record.AUConsignorID
        //////            });
        //////        }
        //////        else
        //////        {
        //////            //use latest consignor record to update with most up-do-date data rather than stale record
        //////            consignor.Prefix = record.Prefix;
        //////            consignor.FirstName = record.FirstName;
        //////            consignor.MiddleName = record.MiddleName;
        //////            consignor.LastName = record.LastName;
        //////            consignor.CustomerID = record.CustomerID;
        //////            consignor.Suffix = record.Suffix;
        //////            consignor.WEMailID = record.WEMailID;
        //////            consignor.HEMailID = record.HEMailID;
        //////            consignor.EMailPrefCode = record.EMailPrefCode;
        //////            //consignor.CommissionCanExceedReserveInd = record.CommissionCanExceedReserveInd;
        //////            //consignor.SoldPct = record.SoldPct;
        //////            //consignor.UnsoldPct = record.UnsoldPct;
        //////            //consignor.InsuranceSoldPct = record.InsuranceSoldPct;
        //////            //consignor.InsuranceUnsoldPct = record.InsuranceUnsoldPct;
        //////            //consignor.MinCommissionPublicSoldAmt = record.MinCommissionPublicSoldAmt;
        //////            //consignor.MinCommissionPublicUnsoldAmt = record.MinCommissionPublicUnsoldAmt;
        //////            //consignor.MinCommissionMailSoldAmt = record.MinCommissionMailSoldAmt;
        //////            //consignor.MinCommissionMailUnsoldAmt = record.MinCommissionMailUnsoldAmt;
        //////            //consignor.FixedFeeAmt = record.FixedFeeAmt;
        //////            //consignor.MinimumConsignorTotalFeeAmt = record.MinimumConsignorTotalFeeAmt;
        //////            //consignor.InterestOnAdvancePct = record.InterestOnAdvancePct;
        //////            //consignor.MiscFeeAmt = record.MiscFeeAmt;
        //////            //consignor.MiscFeeAmt = record.MiscFeeAmt;
        //////            //consignor.MiscFeeType = record.MiscFeeType;
        //////            //consignor.ExpertisingFeeAmt = record.ExpertisingFeeAmt;

        //////            //consignor.CreatedOnDT = System.DateTime.UtcNow;   --> don't overlay created info
        //////            //consignor.CreatedBy = CurrentCustomer.Username;


        //////            var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////            consignor.UpdatedBy = CurrentCustomer.Username;
        //////            consignor.UpdatedOnDT = System.DateTime.UtcNow;

        //////            //this is how nop converts it back out
        //////            //consignor.CreatedOnDT = _dateTimeHelper.ConvertToUserTime(customer.CreatedOnUtc, DateTimeKind.Utc);

        //////            //public virtual DateTime CreatedOnDT { get; set; }
        //////            //public virtual string CreatedBy { get; set; }
        //////            //public virtual DateTime UpdatedOnDT { get; set; }
        //////            //public virtual string UpdatedBy { get; set; }

        //////            _consignorRepo.Update(consignor);
        //////            _cacheManager.Clear();
        //////            SuccessNotification("Changed Saved!");
        //////            //return View(consignment); //now with customer view engine
        //////            return View("~/Views/AUConsignor/CreateUpdateConsignor.cshtml", consignor); //not hit first time??
        //////            //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml", slider);
        //////        }
        //////    }
        //////    else
        //////    {
        //////        return View();
        //////        //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml"); //not hit first time?
        //////        //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");
        //////    }
        //////}

        
        //----------------------------------------------------------------------------------------------------------------------------------------------
        ////////TODO: GET RID OF THIS VIEW??
        ////////public ActionResult CreateUpdateOneFees(int oneID = 0, string entityType = null)
        ////////{
        ////////    //AUFeesRecord fees = new AUFeesRecord();

        ////////    //if (oneID > 0 && entityType != null)
        ////////    //{
        ////////    //    fees = _consignorService.GetFeesForOneId(oneID, entityType);
        ////////    //}

        ////////    ViewBag.oneID = oneID;
        ////////    ViewBag.entityType = entityType;

        ////////    return View("~/Views/AUConsignor/CreateUpdateOneFees.cshtml");
        ////////}

        //---------------------------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult GetFeesList(int oneID = 0, string entityType = null)
        //////{
        //////    //var consignments = _consignmentService.GetAllConsignments(
        //////    //   consignorId: consignorID,
        //////    //   consignmentId: 0,
        //////    //   desc: null,
        //////    //   pageIndex: 0,
        //////    //   pageSize: 500);

        //////    var feeslist = new List<AUFeesRecord>();

        //////    var allfees = _consignorService.GetFeesHierarchyForEntryPoint(oneID, entityType);

        //////    var gridModel = new DataSourceResult();

        //////    //may be null if fees never created for consignor or if entries not created in hierachy
        //////   // if (allfees[0] != null) --fails on index if none found
        //////    //04/18/16 - fix order of fees list allfees = allfees.OrderBy(f => f.AUEntityType).ToList();
        //////    allfees = allfees.OrderBy(f => f.DisplayOrder).ToList();

        //////    if (allfees.Count > 0)
        //////      {
        //////        gridModel.Data = allfees.Select(x => new
        //////            {
        //////                AUFeesID = x.AUFeesID,
        //////                AUEntityType = x.AUEntityType,
        //////                AUEntityID = x.AUEntityID,
        //////                CommissionCanExceedReserveInd = x.CommissionCanExceedReserveInd,
        //////                SoldPct = x.SoldPct,
        //////                UnsoldPct = x.UnsoldPct,
        //////                InsuranceSoldPct = x.InsuranceSoldPct,
        //////                InsuranceUnsoldPct = x.InsuranceUnsoldPct,
        //////                MinCommissionPublicSoldAmt = x.MinCommissionPublicSoldAmt,
        //////                MinCommissionPublicUnsoldAmt = x.MinCommissionPublicUnsoldAmt,
        //////                MinCommissionMailSoldAmt = x.MinCommissionMailSoldAmt,
        //////                MinCommissionMailUnsoldAmt = x.MinCommissionMailUnsoldAmt,
        //////                FixedFeeAmt = x.FixedFeeAmt,
        //////                MinimumConsignorTotalFeeAmt = x.MinimumConsignorTotalFeeAmt,
        //////                InterestOnAdvancePct = x.InterestOnAdvancePct,
        //////                MiscFeeAmt = x.MiscFeeAmt,
        //////                MiscFeeType = x.MiscFeeType,
        //////                ExpertisingFeeAmt = x.ExpertisingFeeAmt
        //////            });
        //////        //Total = consignments.TotalCount
        //////    }

        //////    //var gridModel = new DataSourceResult
        //////    //{
        //////    //    Data = allfees.Select(x => new
        //////    //    {
        //////    //        AUFeesID = x.AUFeesID,
        //////    //        AUEntityType = x.AUEntityType,
        //////    //        AUEntityID = x.AUEntityID,
        //////    //        CommissionCanExceedReserveInd = x.CommissionCanExceedReserveInd,
        //////    //        SoldPct = x.SoldPct,
        //////    //        UnsoldPct = x.UnsoldPct,
        //////    //        InsuranceSoldPct = x.InsuranceSoldPct,
        //////    //        InsuranceUnsoldPct = x.InsuranceUnsoldPct,
        //////    //        MinCommissionPublicSoldAmt = x.MinCommissionPublicSoldAmt,
        //////    //        MinCommissionPublicUnsoldAmt = x.MinCommissionPublicUnsoldAmt,
        //////    //        MinCommissionMailSoldAmt = x.MinCommissionMailSoldAmt,
        //////    //        MinCommissionMailUnsoldAmt = x.MinCommissionMailUnsoldAmt,
        //////    //        FixedFeeAmt = x.FixedFeeAmt,
        //////    //        MinimumConsignorTotalFeeAmt = x.MinimumConsignorTotalFeeAmt,
        //////    //        InterestOnAdvancePct = x.InterestOnAdvancePct,
        //////    //        MiscFeeAmt = x.MiscFeeAmt,
        //////    //        MiscFeeType = x.MiscFeeType,
        //////    //        ExpertisingFeeAmt = x.ExpertisingFeeAmt
        //////    //    }),
        //////    //    //Total = consignments.TotalCount
        //////    //};

        //////    return Json(gridModel);
        //////}


        //---------------------------------------------------------------------------------------------------------------------------------------------
        ////////02/25/15 - comment for now
        ////////[HttpPost]
        ////////public ActionResult CreateUpdateOneFees(AUFeesRecord fees)
        ////////{


        ////////    var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        ////////    //session.CreatedBy = CurrentCustomer.Username;
        ////////    //session.UpdatedBy = CurrentCustomer.Username;

        ////////    //session.CreatedOnDT = System.DateTime.UtcNow;
        ////////    //session.UpdatedOnDT = System.DateTime.UtcNow;

        ////////    //var sale = _saleRepo.GetById(session.AUSaleID);
        ////////    //sale.AUSessionRecords.Add(session);
        ////////    //_saleRepo.Update(sale);
        ////////    SuccessNotification("Consignor Fees Updated!", false);
        ////////    return View("~/Views/AUConsignor/CreateUpdateOneFees.cshtml", fees);
        ////////}


        //------------------------------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult CreateUpdateConsignment(int ConsignorId = 0, int ConsignmentId = 0)
        //////{
        //////    //AUConsignmentRecord consignment = new AUConsignmentRecord() { ConsignmentDesc = "Test" };
        //////    //AUConsignorRecord consignor = new AUConsignorRecord();

        //////    AUCombConsignorConsignment combined = new AUCombConsignorConsignment();


        //////    //string x = "not there";

        //////    //string y = "not there";


        //////    //if (RouteData.Values["ConsignmentId"] != null)
        //////    //{
        //////    //    x = RouteData.Values["ConsignmentId"].ToString();
        //////    //}


        //////    //if (RouteData.DataTokens != null)
        //////    //{
        //////    //    y = RouteData.DataTokens.ToString();
        //////    //}

        //////    if (ConsignmentId > 0)
        //////    {
        //////        combined.AUConsignmentRecord = _consignmentRepo.GetById(ConsignmentId);
        //////        //consignment = _consignmentRepo.GetById(ConsignmentId);
        //////    }
        //////    else
        //////    {
        //////        //need to do this to make sure model is valid for ADD
        //////        combined.AUConsignmentRecord = new AUConsignmentRecord();
        //////        combined.AUConsignmentRecord.AUConsignmentID = 0; //set this because kick model invalid in POST otherwise
        //////    }

        //////    if (ConsignorId > 0)
        //////    {
        //////        combined.AUConsignorRecord = _consignorRepo.GetById(ConsignorId);
        //////        //consignor = _consignorRepo.GetById(ConsignorId);
        //////        //--AUConsignorConsignmentRecord testc = new AUConsignorConsignmentRecord();
        //////        //--testc.AUConsignorID = ConsignorId;
        //////        // testc.AUConsignorID = consignor.AUConsignorID;
        //////        //testc.AUConsignmentID = r2.AUConsignmentID;
        //////        //testc.Term = "F**k";
        //////        //--consignment.AUConsignorRecords.Add(testc);
        //////        //--combined.AUConsignmentRecord.AUConsignorRecords.Add(testc);
        //////    }

        //////    //return View(consignment); //use with custome view engine
        //////    //return View("CreateUpdatePromoSlider");
        //////    //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");

        //////    //last one that worked
        //////    //return View("~/Views/AUConsignor/CreateUpdateConsignment.cshtml", consignment); //worked first time null

        //////    return View("~/Views/AUConsignor/CreateUpdateConsignment.cshtml", combined); //worked first time null

        //////    //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml", slider);
        //////}




        //--------------------------------------------------------------------------------------------------------------------------------------------
        //////[HttpPost]
        //////public ActionResult CreateUpdateConsignment(AUCombConsignorConsignment r2)
        //////{
        //////    if (ModelState.IsValid)
        //////    {
        //////        AUConsignmentRecord consignment = _consignmentRepo.GetById(r2.AUConsignmentRecord.AUConsignmentID);

        //////        //DEBUG TO SEE IF r1 IS AVAILABLE
        //////        //TRY THIS WAY FIRST - NOT SURE BECAUSE MIGHT BE ABLE TO USE r1
        //////        //MIGHT BE BEST ANYWAY TO ENSURE CORD STILL THERE
        //////        //no  good !! could not instantiate
        //////        //AUConsignorRecord consignor = _consignorRepo.GetById(r1.AUConsignorID);

        //////        //string x = "not there";

        //////        //if (RouteData.Values["ConsignmentId"] != null)
        //////        //{
        //////        //    x = RouteData.Values["ConsignmentId"].ToString();
        //////        //}

        //////        //if (consignor == null)
        //////        //{
        //////        //    //place error handling here
        //////        //}

        //////        if (consignment == null)
        //////        {

        //////            //this worked but trying after insert
        //////            //AUConsignorConsignmentRecord testc = new AUConsignorConsignmentRecord();
        //////            //testc.AUConsignorID = 1;
        //////            ////testc.AUConsignmentID = 1;
        //////            //testc.AUConsignmentID = r2.AUConsignmentID; //already known?
        //////            //testc.Term = "F**k";
        //////            //r2.AUConsignorRecords.Add(testc);

        //////            //no good - can't update 2 entities
        //////            //r2.AUConsignmentRecord.CreatedOnDT = System.DateTime.UtcNow;
        //////            //r2.AUConsignmentRecord.UpdatedOnDT = System.DateTime.UtcNow;
        //////            //_combinedRepo.Insert(r2);

        //////            //try this first
        //////            var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////            r2.AUConsignmentRecord.CreatedBy = CurrentCustomer.Username;
        //////            r2.AUConsignmentRecord.UpdatedBy = CurrentCustomer.Username;
        //////            r2.AUConsignmentRecord.CreatedOnDT = System.DateTime.UtcNow;
        //////            r2.AUConsignmentRecord.UpdatedOnDT = System.DateTime.UtcNow;
        //////            _consignmentRepo.Insert(r2.AUConsignmentRecord);

        //////            //try this second
        //////            //AUConsignmentRecord consignment2 = new AUConsignmentRecord() { ConsignmentDesc = "Test" };
        //////            //consignment2.CreatedOnDT = System.DateTime.UtcNow;
        //////            //consignment2.UpdatedOnDT = System.DateTime.UtcNow;
        //////            //consignment2.ConsignmentDate = r2.AUConsignmentRecord.ConsignmentDate;
        //////            //consignment2.ConsignmentDesc = r2.AUConsignmentRecord.ConsignmentDesc;
        //////            //_consignmentRepo.Insert(consignment2);



        //////            /*
        //////            consignment.ConsignmentDate = r2.AUConsignmentRecord.ConsignmentDate;
        //////            consignment.ConsignmentDesc = r2.AUConsignmentRecord.ConsignmentDesc;
        //////            _consignmentRepo.Insert(consignment);
        //////            */


        //////            //try 1
        //////            AUConsignorConsignmentRecord testc = new AUConsignorConsignmentRecord();
        //////            testc.AUConsignmentID = r2.AUConsignmentRecord.AUConsignmentID;
        //////            testc.AUConsignorID = r2.AUConsignorRecord.AUConsignorID;
        //////            testc.Term = "Help!";
        //////            r2.AUConsignmentRecord.AUConsignorRecords.Add(testc);
        //////            _consignmentRepo.Update(r2.AUConsignmentRecord);

        //////            ////try 2
        //////            //AUConsignorConsignmentRecord testc = new AUConsignorConsignmentRecord();
        //////            //testc.AUConsignmentID = consignment2.AUConsignmentID;
        //////            //testc.AUConsignorID = r2.AUConsignorRecord.AUConsignorID;
        //////            //testc.Term = "Help!";
        //////            //consignment2.AUConsignorRecords.Add(testc);
        //////            //_consignmentRepo.Update(consignment2);



        //////            //var toUpdate = r2.AUConsignorRecords.First();
        //////            //toUpdate.AUConsignmentID = r2.AUConsignmentID;
        //////            //_consignmentRepo.Update(r2);

        //////            /*   worked
        //////            //fails because trying to insert AUConsignor again
        //////            AUConsignorConsignmentRecord testc = new AUConsignorConsignmentRecord();
        //////            //AUConsignmentRecord consignment2 = _consignmentRepo.GetById(r2.AUConsignmentID);
        //////            //testc.AUConsignorID = 1; WORKED
        //////            testc.AUConsignorID = consignor.AUConsignorID;
        //////            testc.AUConsignmentID = r2.AUConsignmentID;
        //////            testc.Term = "F**k";
        //////            r2.AUConsignorRecords.Add(testc);
        //////            _consignmentRepo.Update(r2);
        //////            */

        //////            //No Good - tried to insert AUConsignor again
        //////            //AUcc.AUConsignorID = 1;
        //////            //AUcc.AUConsignmentID = r2.AUConsignmentID;
        //////            //_consignorconsignmentRepo.Insert(AUcc);

        //////            //test shit out
        //////            //AUConsignorRecord c2 = new AUConsignorRecord();
        //////            //c2.LastName = "consignor Last Name";
        //////            //c2.AUConsignorID = 1;

        //////            //**************************************
        //////            //can only insert the same type passed in
        //////            //this is f*****g up consignment id for some reason
        //////            //*************************************************
        //////            //AUConsignmentRecord c2 = new AUConsignmentRecord();
        //////            //c2.AUConsignmentID = 99;
        //////            //c2.ConsignmentDesc = "This is the first internally generated consignment";
        //////            //_consignmentRepo.Insert(c2);



        //////            SuccessNotification("Consignment Created Successfully!");
        //////            return RedirectToRoute(new
        //////            {
        //////                Action = "CreateUpdateConsignment",
        //////                Controller = "AUConsignor",
        //////                ConsignorId = r2.AUConsignorRecord.AUConsignorID,
        //////                ConsignmentId = r2.AUConsignmentRecord.AUConsignmentID
        //////            });
        //////        }
        //////        else
        //////        {

        //////            //use latest data in consignment rather that stale R2
        //////            var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////            consignment.UpdatedBy = CurrentCustomer.Username;
        //////            consignment.UpdatedOnDT = System.DateTime.UtcNow;
        //////            consignment.ConsignmentDate = r2.AUConsignmentRecord.ConsignmentDate;
        //////            consignment.ConsignmentDesc = r2.AUConsignmentRecord.ConsignmentDesc;


        //////            //System.DateTime? cDate = null;
        //////            //try
        //////            //{
        //////            //    cDate = new DateTime(model.DateOfBirthYear.Value, model.DateOfBirthMonth.Value, model.DateOfBirthDay.Value);
        //////            //}
        //////            //catch { }

        //////            r2.AUConsignmentRecord.UpdatedOnDT = consignment.UpdatedOnDT;
        //////            r2.AUConsignmentRecord.UpdatedBy = consignment.UpdatedBy;

        //////            //test
        //////            //AUConsignorRecord c2 = new AUConsignorRecord();
        //////            //c2.LastName = "consignor Last Name";
        //////            //c2.AUConsignorID = 1;

        //////            //consignment.AUConsignorRecords.Add(c2);
        //////            //ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);

        //////            _consignmentRepo.Update(consignment);

        //////            //can only insert the same type passed in
        //////            //AUConsignmentRecord c2 = new AUConsignmentRecord();
        //////            //c2.AUConsignmentID = 99;
        //////            //c2.ConsignmentDesc = "This is the second updated description";
        //////            //_consignmentRepo.Update(c2);


        //////            //AUConsignorRecord c2 = new AUConsignorRecord();
        //////            //c2.LastName = "consignor New Last Name";
        //////            //c2.AUConsignorID = 1;
        //////            //_consignmentRepo.Insert();

        //////            _cacheManager.Clear();
        //////            SuccessNotification("Changed Saved!");
        //////            //return View(consignment); //now with customer view engine
        //////            return View("~/Views/AUConsignor/CreateUpdateConsignment.cshtml", r2); //not hit first time??
        //////            //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml", slider);
        //////        }
        //////    }
        //////    else
        //////    {
        //////        //invalid model will show "default" error messages driven by record annotation/decorations
        //////        var errors = ModelState.Values.SelectMany(v => v.Errors);
        //////        return View("~/Views/AUConsignor/CreateUpdateConsignment.cshtml", r2);
        //////        //return View();
        //////        //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml"); //not hit first time?
        //////        //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");
        //////    }
        //////}


        //-------------------------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult CreateUpdateSale(int SaleId = 0)
        //////{
        //////    AUSaleRecord sale = new AUSaleRecord();
        //////    if (SaleId > 0)
        //////    {
        //////        sale = _saleRepo.GetById(SaleId); //this will have all the sessions and addresses!!!!!
        //////    }

        //////    ViewBag.SaleIsPublished = sale.SaleIsPublished;

        //////    return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", sale); 

        //////    // WORKS!! return View("CreateUpdateSale", sale); //This is what works with the view engine!!!!
            
        //////}


        //----------------------------------------------------------------------------------------------------------------------------------------------------
        ////////this post happens when you click 'Save'
        //////[HttpPost]
        //////public ActionResult CreateUpdateSale(AUSaleRecord record, string save)
        //////{
        //////    if (save.Equals("Award Sale")) //see http://stackoverflow.com/questions/19650345/mvc-razor-form-with-multiple-different-submit-buttons
        //////    {
        //////        _consignorService.AwardSale(record.AUSaleID, record.SaleStoreID);
        //////        //TempData["notice"] = "Sale Successfully Awarded";   --from google
        //////        SuccessNotification("Sale Awarded!!");  //seems to be nop admin convention
        //////        return RedirectToAction("CreateUpdateSale");
        //////    }

        //////    //%%%%%the nav properties are gone, but the form values are there! reget the nav properties with getbyid before testing

        //////    if (ModelState.IsValid)
        //////    {
        //////                AUSaleRecord sale = _saleRepo.GetById(record.AUSaleID);

        //////                if (sale == null)
        //////                {
        //////                    if (!record.SaleIsPublished)
        //////                        {
        //////                            _consignorService.InsertSale(record);
        //////                            SuccessNotification("Sale Created Successfully!");
        //////                            return RedirectToRoute(new
        //////                            {
        //////                                Action = "CreateUpdateSale",
        //////                                Controller = "AUConsignor",
        //////                                SaleId = record.AUSaleID
        //////                            });
        //////                        }
        //////                    else
        //////                        {
        //////                            ErrorNotification("Insert of new sale not successful - trying to publish sale but something is wrong with your sale increments.");
        //////                            return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", record);
        //////                        }
        //////                }
        //////                else  //sale already exists so this will be an update. Use latest consignor record to update with most up-do-date data rather than stale record
        //////                {
        //////                    sale.AUSaleNbr = record.AUSaleNbr;
        //////                    sale.SaleTitle = record.SaleTitle;
        //////                    sale.SaleDesc = record.SaleDesc;
        //////                    sale.SaleStartDateTime = record.SaleStartDateTime;
        //////                    sale.SaleEndDateTime = record.SaleEndDateTime;
        //////                    sale.SaleStoreID = record.SaleStoreID;
        //////                    sale.SaleIsAwarded = record.SaleIsAwarded;
        //////                    sale.SaleType = record.SaleType;

        //////                    sale.CreatedOnDT = System.DateTime.UtcNow;
        //////                    sale.UpdatedOnDT = sale.CreatedOnDT;  //make sure dates are the same on insert
        //////                    //sale.UpdatedOnDT = System.DateTime.UtcNow;
        //////                    var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////                    sale.UpdatedBy = CurrentCustomer.Username;
                            
        //////                    if (!record.SaleIsPublished) //not trying to publish sale so no further checking needed
        //////                    {
        //////                        //_consignorService.UpdateSale(sale,record);
        //////                       // _cacheManager.Clear();

        //////                        sale.SaleIsPublished = record.SaleIsPublished;
        //////                        _saleRepo.Update(sale);

        //////                        SuccessNotification("Changes to Sale saved!");
        //////                        //return View(consignment); //now with customer view engine
        //////                        return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", sale); //BAD
        //////                    }
        //////                    else if (IncrementsAreGood(sale))
        //////                    {
        //////                        //_consignorService.UpdateSale(sale,record);

        //////                        sale.SaleIsPublished = record.SaleIsPublished;
        //////                        _saleRepo.Update(sale);
        //////                        //_cacheManager.Clear();
        //////                        SuccessNotification("Changes to Sale saved!");
        //////                        //return View(consignment); //now with customer view engine
        //////                        return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", sale); //BAD
        //////                    }
        //////                    else
        //////                    {
        //////                        ModelState.Remove("SaleIsPublished");
        //////                        sale.SaleIsPublished = false;
        //////                        //ModelState.Remove("SaleIsPublished");
                                          
        //////                        ErrorNotification("Update sale not successful - trying to publish sale but something is wrong with your sale increments. Fix increments before trying to publish");
        //////                       return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", sale);
        //////                    }
        //////                }
        //////    }
        //////    else  //model state is not valid
        //////    {
        //////        ErrorNotification("Invalid Model - Update not applied.");
        //////        return View("~/Views/AUConsignor/CreateUpdateSale.cshtml", record);
        //////        //return View();
        //////        //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml"); //not hit first time?
        //////        //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");
        //////    }
        //////}


        //----------------------------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult CreateUpdateAddress(int addressId = 0, int saleId = 0)
        //////{

        //////    AUCombAddress address = new AUCombAddress();
        //////    address.AUAddressRecord = new AUAddressRecord();   //must instantiate the record within the record

        //////    if (addressId > 0)
        //////    {
        //////        address.AUAddressRecord = _addressRepo.GetById(addressId);
        //////    }
        //////    else
        //////    {
        //////        //need to do this to make sure model is valid for ADD
        //////        address.AUAddressRecord.AUAddressID = 0;
        //////     }

        //////    if (saleId > 0)
        //////    {
        //////        address.saleId = saleId;
        //////    }
        //////    else
        //////    {
        //////        //need to do this to make sure model is valid for ADD
        //////        address.saleId = saleId = 0;
        //////    }

        //////    //Populate Countries (see CustomerController)
        //////    address.AUAddressRecord.AvailableCountries.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Address.SelectCountry"), Value = "0" });
        //////    foreach (var c in _countryService.GetAllCountries(true))
        //////    {
        //////        address.AUAddressRecord.AvailableCountries.Add(new SelectListItem
        //////        {
        //////            Text = c.Name,
        //////            Value = c.Id.ToString(),
        //////            Selected = c.Id == address.AUAddressRecord.CountryId
        //////        });
        //////    }

        //////    //Populate State/Province (see CustomerController). Had to take the ? away from Country ID as this statement complained
        //////    //that the parameter was invalid
        //////    var states = _stateProvinceService.GetStateProvincesByCountryId(address.AUAddressRecord.CountryId, false).ToList();
        //////    if (states.Count > 0)
        //////    {
        //////        address.AUAddressRecord.AvailableStates.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Address.SelectState"), Value = "0" });

        //////        foreach (var s in states)
        //////        {
        //////            address.AUAddressRecord.AvailableStates.Add(new SelectListItem { Text = s.Name, Value = s.Id.ToString(), Selected = (s.Id == address.AUAddressRecord.StateProvinceId) });
        //////        }
        //////    }
        //////    else
        //////    {
        //////        bool anyCountrySelected = address.AUAddressRecord.AvailableCountries.Any(x => x.Selected);

        //////        address.AUAddressRecord.AvailableStates.Add(new SelectListItem
        //////        {
        //////            Text = _localizationService.GetResource(anyCountrySelected ? "Admin.Address.OtherNonUS" : "Admin.Address.SelectState"),
        //////            Value = "0"
        //////        });
        //////    }

        //////    return View("~/Views/AUConsignor/CreateUpdateAddress.cshtml", address); //worked first time null

        //////}


        //-------------------------------------------------------------------------------------------------------------------------------------
        ////////this post happens when you click 'Save'
        //////[HttpPost]
        //////public ActionResult CreateUpdateAddress(AUCombAddress record)
        //////{
        //////    if (ModelState.IsValid)
        //////    {
        //////        AUAddressRecord address = _addressRepo.GetById(record.AUAddressRecord.AUAddressID);


        //////        var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////        record.AUAddressRecord.CreatedBy = CurrentCustomer.Username;
        //////        record.AUAddressRecord.UpdatedBy = CurrentCustomer.Username;

        //////        record.AUAddressRecord.CreatedOnDT = System.DateTime.UtcNow;
        //////        record.AUAddressRecord.UpdatedOnDT = System.DateTime.UtcNow;

        //////        if (address == null)
        //////        {
        //////            _addressRepo.Insert(record.AUAddressRecord);
        //////            SuccessNotification("Address Created Successfully!");
        //////            return RedirectToRoute(new
        //////            {
        //////                Action = "CreateUpdateAddress",
        //////                Controller = "AUConsignor",
        //////                addressId = record.AUAddressRecord.AUAddressID,
        //////                saleId = record.saleId
        //////            });
        //////        }
        //////        else
        //////        {
        //////            //use latest consignor record to update with most up-do-date data rather than stale record
        //////            address.Address1 = record.AUAddressRecord.Address1;
        //////            address.Address2 = record.AUAddressRecord.Address2;
        //////            address.AddressHtml = record.AUAddressRecord.AddressHtml;
        //////            address.City = record.AUAddressRecord.City;
        //////            address.CountryId = record.AUAddressRecord.CountryId;
        //////            address.StateProvinceId = record.AUAddressRecord.StateProvinceId;
        //////            address.ZipPostalCode = record.AUAddressRecord.ZipPostalCode;
        //////            //address.StateProvinceName = record.StateProvinceName;
        //////            //address.CountryName = record.CountryName;


        //////            //try this
        //////            //.ForMember(dest => dest.CountryName, mo => mo.MapFrom(src => src.Country != null ? src.Country.Name : null))

                    
        //////            address.UpdatedOnDT = record.AUAddressRecord.UpdatedOnDT;
        //////            address.UpdatedBy = record.AUAddressRecord.UpdatedBy;

        //////            //int id = NopContext.Current.User != null ? NopContext.Current.User.CustomerId : 0
        //////            //NopContext.Current.User.CustomerId  is no more present in version 3.0

        //////            //this is how nop converts it back out
        //////            //consignor.CreatedOnDT = _dateTimeHelper.ConvertToUserTime(customer.CreatedOnUtc, DateTimeKind.Utc);

        //////            //public virtual DateTime CreatedOnDT { get; set; }
        //////            //public virtual string CreatedBy { get; set; }
        //////            //public virtual DateTime UpdatedOnDT { get; set; }
        //////            //public virtual string UpdatedBy { get; set; }

        //////            _addressRepo.Update(address);
        //////          //  _cacheManager.Clear(); //took this out because it was killing the session
        //////            SuccessNotification("Changed Saved!");

        //////            //return View("~/Views/AUConsignor/CreateUpdateAddress.cshtml", address); //not hit first time??
                   
        //////            //need redirect so can pick up country/state lists again

        //////            //if (record.saleId == 0) 
        //////            //{
        //////                return RedirectToRoute(new
        //////                {
        //////                    Action = "CreateUpdateAddress",
        //////                    Controller = "AUConsignor",
        //////                    addressId = record.AUAddressRecord.AUAddressID,
        //////                    saleId = record.saleId
        //////                });
        //////            //}
        //////            //else
        //////            //{
        //////            //    return RedirectToRoute(new
        //////            //    {
        //////            //        Action = "CreateUpdateSale",
        //////            //        Controller = "AUConsignor",
        //////            //        saleId = record.saleId
        //////            //    });
        //////            //}
        //////        }
        //////    }
        //////    else
        //////    {
        //////        return View();
        //////        //return View("~/Views/PromoSlider/CreateUpdatePromoSlider.cshtml"); //not hit first time?
        //////        //return View("~/Plugins/Widgets.PromoSlider/Views/PromoSlider/CreateUpdatePromoSlider.cshtml");
        //////    }
        //////}

        //-------------------------------------------------------------------------------------------------------------------------------
        //////public ActionResult ListOneConsignments(int consignorID = 0)
        //////{
        //////    AUConsignmentList consignments = new AUConsignmentList();
        //////    consignments.searchAUConsignorID = consignorID;
        //////    return View("~/Views/AUConsignor/OneConsignorConsignments.cshtml", consignments);
        //////}


        //--------------------------------------------------------------------------------------------------------------------------------
        ////////Consignor-consignments is an example of how to use an existing search to limit 
        ////////consignments to one specific consignor. An example of how to use EF record definition 
        ////////is in Sale-Sessions
        //////[HttpPost]
        //////public ActionResult ListXConsignments(int consignorID)
        //////{

        //////    var consignments = _consignmentService.GetAllConsignments(
        //////        consignorId: consignorID,
        //////        consignmentId: 0,
        //////        desc: null,
        //////        pageIndex: 0,
        //////        pageSize: 500);

        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = consignments.Select(x => new
        //////        {
        //////            AUConsignorID = x.AUConsignorRecords.First().AUConsignorID,
        //////            AUConsignmentID = x.AUConsignmentID,
        //////            ConsignmentDate = x.ConsignmentDate,
        //////            ConsignmentDesc = x.ConsignmentDesc
        //////        }),
        //////        Total = consignments.TotalCount
        //////    };

        //////    return Json(gridModel);

        //////}

        //------------------------------------------------------------------------------------------------------------------------------
        ////////kill this for now
        ////////public ActionResult ManageSaleSessions(int saleID = 0)
        ////////{
        ////////    AUSaleRecord sale = new AUSaleRecord();
        ////////    if (saleID > 0)
        ////////    {
        ////////        sale = _saleRepo.GetById(saleID); //this will have all the sessions and addresses!!!!!
        ////////    }
        ////////    return View("~/Views/AUConsignor/OneSaleSessions.cshtml",sale);
        ////////}

        //-----------------------------------------------------------------------------------------------------------------------------
        ////////display all lots associated to a sale for selection
        //////[ChildActionOnly]
        //////public ActionResult ManageSaleLots(int saleID = 0)
        //////{
        //////    //AUSaleRecord increment = new AUIncrementRecord();
        //////    //increment.AUSaleID = saleID;
        //////    //increment.AUIncrementID = 0;

        //////    ////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        //////    //session.AvailableAddresses.Add(new SelectListItem { Text = _localizationService.GetResource("Plugins.Misc.AUConsignor.SelectAddressMsg"), Value = "0" });
        //////    //foreach (var c in _consignorService.GetAllAUAddresses())
        //////    //{
        //////    //    session.AvailableAddresses.Add(new SelectListItem
        //////    //    {
        //////    //        Text = c.Address1 + ", " + c.Address2 + ", " + c.City,
        //////    //        Value = c.AUAddressID.ToString(),
        //////    //        Selected = c.AUAddressID == session.AUAddressID
        //////    //    });
        //////    //}

        //////    return View();

        //////    //return View("~/Views/AUConsignor/ManageSaleIncrements.cshtml", increment);
        //////}


        //-------------------------------------------------------------------------------------------------------------------------------
       //////// [ChildActionOnly]
       ////// public ActionResult ManageSaleIncrements(int saleID = 0)
       ////// {
       //////     //put SaleIsPublished into ViewBag so view can hide the increment edit/delete buttons if published
       //////     var sale = _saleRepo.GetById(saleID);
       //////     ViewBag.SaleIsPublished = sale.SaleIsPublished;

       //////     AUIncrementRecord increment = new AUIncrementRecord();
       //////     increment.AUSaleID = saleID;
       //////     increment.AUIncrementID = 0;

       //////     //session.AvailableAddresses.Add(new SelectListItem { Text = _localizationService.GetResource("Plugins.Misc.AUConsignor.SelectAddressMsg"), Value = "0" });
       //////     //foreach (var c in _consignorService.GetAllAUAddresses())
       //////     //{
       //////     //    session.AvailableAddresses.Add(new SelectListItem
       //////     //    {
       //////     //        Text = c.Address1 + ", " + c.Address2 + ", " + c.City,
       //////     //        Value = c.AUAddressID.ToString(),
       //////     //        Selected = c.AUAddressID == session.AUAddressID
       //////     //    });
       //////     //}

       //////     return View("~/Views/AUConsignor/ManageSaleIncrements.cshtml", increment);
       ////// }



        //////[ChildActionOnly]
        //////public ActionResult ManageSaleSessions(int saleID = 0)
        //////{
        //////    AUSessionRecord session = new AUSessionRecord();
        //////    session.AUSaleID = saleID;
        //////    session.AUSessionID = 0;

        //////    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        //////    session.AvailableAddresses.Add(new SelectListItem { Text = _localizationService.GetResource("Plugins.Misc.AUConsignor.SelectAddressMsg"), Value = "0" });
        //////    foreach (var c in _consignorService.GetAllAUAddresses())
        //////    {
        //////        session.AvailableAddresses.Add(new SelectListItem
        //////        {
        //////            Text = c.Address1 + ", " + c.Address2 + ", " + c.City,
        //////            Value = c.AUAddressID.ToString(),
        //////            Selected = c.AUAddressID == session.AUAddressID
        //////        });
        //////    }


        //////    return View("~/Views/AUConsignor/ManageSaleSessions.cshtml", session);
        //////}

        
        //////[HttpPost]
        //////public ActionResult CreateSaleSession(AUSessionRecord session)
        //////{
        ////// if (!ModelState.IsValid)
        ////// {
        //////     ErrorNotification("something wrong with the model - notify admin");
        //////     return View();
        ////// }

        //////    //Recheck sale dates in case sale changed underneath session browser
        //////    var sale = _saleRepo.GetById(session.AUSaleID);
        //////    if (sale == null)
        //////        throw new NopException("Sale not found - please notify admin");

        //////    if (session.SessionStartDateTime < sale.SaleStartDateTime || 
        //////        session.SessionEndDateTime > sale.SaleEndDateTime ||
        //////        session.SessionEndDateTime < sale.SaleStartDateTime || 
        //////        session.SessionStartDateTime > sale.SaleEndDateTime)
        //////    {
        //////        ErrorNotification("Session dates must be within sale dates");
        //////        return new NullJsonResult();
        //////    }


        //////    var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////    session.CreatedBy = CurrentCustomer.Username;
        //////    session.UpdatedBy = CurrentCustomer.Username;

        //////    session.CreatedOnDT = System.DateTime.UtcNow;
        //////    session.UpdatedOnDT = session.CreatedOnDT;

           
        //////    //TODO: CHECK SESSION DATES WITHIN SALE FROM-TO
        //////    sale.AUSessionRecords.Add(session);
        //////    _saleRepo.Update(sale);
        //////    SuccessNotification("Session Added!", false);
        //////    return new NullJsonResult();
        //////}



        //////[HttpPost]
        //////public ActionResult GetSaleSessionsList(int saleId)
        //////{
        //////    var sessions = _saleRepo.GetById(saleId).AUSessionRecords.OrderBy(x => x.SessionStartDateTime);

        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = sessions.Select(x => new
        //////        {
        //////            AUSessionID = x.AUSessionID,
        //////            AUSaleID = x.AUSaleID,
        //////            SessionStartDateTime = _dateTimeHelper.ConvertToUserTime(x.SessionStartDateTime, DateTimeKind.Local),
        //////            SessionEndDateTime = _dateTimeHelper.ConvertToUserTime(x.SessionEndDateTime, DateTimeKind.Local),
        //////            SessionDescription = x.SessionDescription,
        //////            AUAddressID = x.AUAddressID,
        //////            AddressName = x.AUAddressRecord.Address1 + ", " + x.AUAddressRecord.Address2 + ", " + x.AUAddressRecord.City

        //////        }),
        //////        Total = sessions.Count()
        //////    };

        //////    return Json(gridModel);
        //////}



        //////[HttpPost]
        //////public ActionResult CreateSaleIncrement(AUIncrementRecord increment)  //this reference is injected by autofac (the repo is part of dbcontext)
        //////{
        //////    var CurrentCustomer = _authenticationService.GetAuthenticatedCustomer();
        //////    increment.CreatedBy = CurrentCustomer.Username;
        //////    increment.UpdatedBy = CurrentCustomer.Username;

        //////    increment.CreatedOnDT = System.DateTime.UtcNow;
        //////    increment.UpdatedOnDT = System.DateTime.UtcNow;

        //////    var sale = _saleRepo.GetById(increment.AUSaleID);
        //////    sale.AUIncrementRecords.Add(increment);
        //////    _saleRepo.Update(sale);
        //////    _eventPublisher.EntityInserted(increment);  //publish event that increment inserted to flush cache in C:\Users\Nicholas\Documents\My Documents\NopCommerce\Plugins\Nop.Plugin.Misc.AUConsignor\Infrastructure\AUConsignorCacheEventConsumer.cs
        //////    SuccessNotification("Increment Added!", false);
        //////    return new NullJsonResult();
        //////}


        ////////TODO: this function is redundant to the service in AUConsignor.Services  
        //////[HttpPost]
        //////public ActionResult GetSaleIncrementsList(int saleId)
        //////{
        //////    var increments = _saleRepo.GetById(saleId).AUIncrementRecords.OrderBy(x => x.FromBidAmt);
            
        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = increments.Select(x => new
        //////        {
        //////            AUIncrementID = x.AUIncrementID,
        //////            AUSaleID = x.AUSaleID,
        //////            FromBidAmt = x.FromBidAmt,
        //////            ToBidAmt = x.ToBidAmt,
        //////            IncrementAmt = x.IncrementAmt

        //////        }),
        //////        Total = increments.Count()
        //////    };

        //////    return Json(gridModel);
        //////}


        ////////Make sure sale session being added is within boundaries of sale from-to dates. Leave this as a server call in
        ////////case of concurrent access and held browser. TODO: determine if should move to browser for speed
        //////public JsonResult CheckSessionSaleDates(int AUSaleID, DateTime SessionStartDateTime, DateTime SessionEndDateTime)
        //////{

        //////    //condition for user check 

        //////    if (AUSaleID == 0)
        //////        throw new ArgumentNullException("AUSaleID");

        //////    var sale = _saleRepo.GetById(AUSaleID);
        //////    if (sale == null)
        //////    {
        //////        throw new ArgumentException("AUSaleID not found");
        //////    }

        //////    if (SessionStartDateTime < sale.SaleStartDateTime || SessionEndDateTime > sale.SaleEndDateTime)
        //////    {
        //////        return Json("BAD", JsonRequestBehavior.AllowGet);
        //////    }

        //////    return Json("GOOD", JsonRequestBehavior.AllowGet);

        //////}




        /////////TODO: DON'T THINK THIS IS USED
        //////[HttpPost]
        //////public ActionResult ListXSessions(int saleID)
        //////{
        //////    var sessions = _saleRepo.GetById(saleID).AUSessionRecords.OrderBy(x => x.SessionStartDateTime);

        //////    //var consignments = _consignmentService.GetAllConsignments(
        //////    //    consignorId: consignorID,
        //////    //    consignmentId: 0,
        //////    //    desc: null,
        //////    //    pageIndex: 0,
        //////    //    pageSize: 500);

        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = sessions.Select(x => new
        //////        {
        //////            AUSaleID = x.AUSaleID,
        //////            AUSessionID = x.AUSessionID,
        //////            SessionStartDateTime = x.SessionStartDateTime,
        //////            SessionEndDateTime = x.SessionEndDateTime,
        //////        }),
        //////        Total = sessions.Count(n => n.AUSessionID > 0)   //see http://stackoverflow.com/questions/3853010/get-item-count-of-a-list-using-linq
        //////    };

        //////    return Json(gridModel);
        //////}



        //////public ActionResult ManageConsignments()
        //////{
        //////    //return View(); 
        //////    AUConsignmentList listsearch = new AUConsignmentList();

        //////    //if (consignorID != 0) { listsearch.searchAUConsignorID = consignorID;}

        //////    return View("~/Views/AUConsignor/ManageConsignments.cshtml", listsearch); //not hit first time??
        //////}



        //////[HttpPost]
        //////public ActionResult ListConsignments(DataSourceRequest command, AUConsignmentList model)
        //////{
        //////    int consignmentid = 0;

        //////    //string firstname = "Test";
        //////    //string lastname = "";

        //////    int consignorid = model.searchAUConsignorID;
        //////    string desc = model.searchDesc;

        //////    var consignments = _consignmentService.GetAllConsignments(
        //////        consignorId: consignorid,
        //////        consignmentId: consignmentid,
        //////        desc: desc,
        //////        pageIndex: 0,
        //////        pageSize: 500);

        //////    //pageIndex: command.Page - 1,
        //////    //pageSize: command.PageSize);


        //////    //TODO: THIS WILL NEED TO BE CHANGED WHEN YOU IMPLEMENT MORE THAN ONE CONSIGNOR PER CONSIGNMENT
        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = consignments.Select(x => new
        //////        {
        //////            Id = x.Id, 
        //////            AUConsignorID = x.AUConsignorRecords.First().AUConsignorID, //TODO: make this a "primary" consignor select or coalesce all consignors
        //////            AUConsignmentID = x.AUConsignmentID,
        //////            ConsignmentDate = x.ConsignmentDate,
        //////            ConsignmentDesc = x.ConsignmentDesc
        //////        }),
        //////        Total = consignments.TotalCount
        //////    };

        //////    return Json(gridModel);
        //////}


        ////////list lots
        //////public ActionResult LotIndex()
        //////{
        //////    return RedirectToAction("ListLots");
        //////}


        ////////copied from C:\Users\Nicholas\Documents\My Documents\NopCommerce\Presentation\Nop.Web\Administration\Controllers\ProductController.cs
        //////public ActionResult ListLots()
        //////{

        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");

        //////    var model = new AULotList();

        //////    //a vendor should have access only to his products. Set the indicator in the model
        //////    model.IsLoggedInAsVendor = _workContext.CurrentVendor != null;


        //////    //categories
        //////    model.AvailableCategories.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    var categories = _categoryService.GetAllCategories(showHidden: true);
        //////    foreach (var c in categories)
        //////        model.AvailableCategories.Add(new SelectListItem { Text = c.GetFormattedBreadCrumb(categories), Value = c.Id.ToString() });

        //////    //NJM: Sales
        //////    model.AvailableSales.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    var sales = _consignorService.GetAllSales(
        //////         saleId: 0,
        //////         saleNbr: null,
        //////         saleTitle: null,
        //////         pageIndex: 0,
        //////         pageSize: 2147483647);
        //////    foreach (var c in sales)
        //////        model.AvailableSales.Add(new SelectListItem { Text = c.AUSaleNbr, Value = c.AUSaleID.ToString() });

        //////    //stores
        //////    model.AvailableStores.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    foreach (var s in _storeService.GetAllStores())
        //////        model.AvailableStores.Add(new SelectListItem { Text = s.Name, Value = s.Id.ToString() });

        //////    //warehouses
        //////    model.AvailableWarehouses.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    foreach (var wh in _shippingService.GetAllWarehouses())
        //////        model.AvailableWarehouses.Add(new SelectListItem { Text = wh.Name, Value = wh.Id.ToString() });

        //////    //product types
        //////    //NJM: Note ToSelectList is an extension method in Nop.Web.Framework
        //////    model.AvailableProductTypes = ProductType.SimpleProduct.ToSelectList(false).ToList();
        //////    model.AvailableProductTypes.Insert(0, new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });


        //////    //"published" property
        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.All"), Value = "0" });
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.PublishedOnly"), Value = "1" });
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.UnpublishedOnly"), Value = "2" });

        //////    return View("~/Views/AUConsignor/ManageLots.cshtml", model);

        //////    //return View("List.cshtml", model);

        //////}


        //////[HttpPost, ActionName("ListLots")]
        //////[FormValueRequired("go-to-product-by-sku")]
        //////public ActionResult GoToSku(AULotList model)   
        //////{
        //////    throw new NotImplementedException(); //need way to edit lot
        //////    //Console.Write("hit the button");
        //////    //return new NullJsonResult();
        //////}


        //////[HttpPost, ActionName("ListLots")]
        //////[FormValueRequired("exportexcel-all")]
        //////public ActionResult ExportExcelAll(AULotList model)
        //////{
        //////    //throw new NotImplementedException("exportexcel-all button not implemented yet"); //need way to edit lot

        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();

        //////    ////a vendor should have access only to his products
        //////    //if (_workContext.CurrentVendor != null)
        //////    //{
        //////    //    model.SearchVendorId = _workContext.CurrentVendor.Id;
        //////    //}

        //////    var categoryIds = new List<int> { model.SearchCategoryId };
        //////    //include subcategories
        //////    if (model.SearchIncludeSubCategories && model.SearchCategoryId > 0)
        //////        categoryIds.AddRange(GetChildCategoryIds(model.SearchCategoryId));

        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    bool? overridePublished = null;
        //////    if (model.SearchPublishedId == 1)
        //////        overridePublished = true;
        //////    else if (model.SearchPublishedId == 2)
        //////        overridePublished = false;

        //////    //var products = _productService.SearchProducts(
        //////    //    categoryIds: categoryIds,
        //////    //    manufacturerId: model.SearchManufacturerId,
        //////    //    storeId: model.SearchStoreId,
        //////    //    vendorId: model.SearchVendorId,
        //////    //    warehouseId: model.SearchWarehouseId,
        //////    //    productType: model.SearchProductTypeId > 0 ? (ProductType?)model.SearchProductTypeId : null,
        //////    //    keywords: model.SearchProductName,
        //////    //    showHidden: true,
        //////    //    overridePublished: overridePublished
        //////    //);

        //////    var products = _consignorService.GetAllLots(
        //////       categoryIds: categoryIds,
        //////       saleId: model.SearchSaleId,
        //////       storeId: model.SearchStoreId,
        //////       warehouseId: model.SearchWarehouseId,
        //////       productType: model.SearchProductTypeId > 0 ? (ProductType?)model.SearchProductTypeId : null,
        //////       keywords: model.SearchProductName,
        //////        //pageIndex: command.Page - 1,
        //////        //pageSize: command.PageSize,
        //////       showHidden: true,
        //////       overridePublished: overridePublished
        //////   );

        //////    try
        //////    {
        //////        byte[] bytes;
        //////        using (var stream = new MemoryStream())
        //////        {
        //////            //_exportManager.ExportProductsToXlsx(stream, products);
        //////            _collectibleexportService.ExportPhilatelicProductsToXlsx(stream, products);
        //////            bytes = stream.ToArray();
        //////        }
        //////        return File(bytes, "text/xls", "products.xlsx");
        //////    }
        //////    catch (Exception exc)
        //////    {
        //////        ErrorNotification(exc);
        //////        return RedirectToAction("ListLots");
        //////    }
        //////}




        //////[HttpPost]
        //////public ActionResult ExportExcelSelected(string selectedIds)
        //////{
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();

        //////    var products = new List<AUCombLotProc>();
        //////    if (selectedIds != null)
        //////    {
        //////        var ids = selectedIds
        //////            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
        //////            .Select(x => Convert.ToInt32(x))
        //////            .ToArray();
        //////        products.AddRange(_consignorService.GetAllLots(productIds: ids));
        //////    }

        //////    //a vendor should have access only to his products
        //////    if (_workContext.CurrentVendor != null)
        //////    {
        //////        products = products.Where(p => p.VendorId == _workContext.CurrentVendor.Id).ToList();
        //////    }

        //////    byte[] bytes = null;
        //////    using (var stream = new MemoryStream())
        //////    {
        //////        //_exportManager.ExportProductsToXlsx(stream, products);
        //////        _collectibleexportService.ExportPhilatelicProductsToXlsx(stream, products);

        //////        bytes = stream.ToArray();
        //////    }
        //////    return File(bytes, "text/xls", "products.xlsx");
        //////}



        //////[HttpPost, ActionName("ListLots")]
        //////[FormValueRequired("download-catalog-pdf")]
        //////public ActionResult DownloadCatalogAsPdf(AULotList model)
        //////{
        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");
        //////        //return AccessDeniedView();

        //////    ////a vendor should have access only to his products
        //////    //if (_workContext.CurrentVendor != null)
        //////    //{
        //////    //    model.SearchVendorId = _workContext.CurrentVendor.Id;
        //////    //}

        //////    var categoryIds = new List<int> { model.SearchCategoryId };
        //////    //include subcategories
        //////    if (model.SearchIncludeSubCategories && model.SearchCategoryId > 0)
        //////        categoryIds.AddRange(GetChildCategoryIds(model.SearchCategoryId));


        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    bool? overridePublished = null;
        //////    if (model.SearchPublishedId == 1)
        //////        overridePublished = true;
        //////    else if (model.SearchPublishedId == 2)
        //////        overridePublished = false;

        //////    //this will not conside exclude sale, as it general use for Manage Lots
        //////    var products = _consignorService.GetAllLots(
        //////        categoryIds: categoryIds,
        //////        saleId: model.SearchSaleId,
        //////        storeId: model.SearchStoreId,
        //////        warehouseId: model.SearchWarehouseId,
        //////        productType: model.SearchProductTypeId > 0 ? (ProductType?)model.SearchProductTypeId : null,
        //////        keywords: model.SearchProductName,
        //////        //pageIndex: command.Page - 1,
        //////        //pageSize: command.PageSize,
        //////        showHidden: true,
        //////        overridePublished: overridePublished
        //////    );

        //////    try
        //////    {
        //////        byte[] bytes;
        //////        using (var stream = new MemoryStream())
        //////        {
        //////            _philatelicpdfService.PrintProductsToPdf(stream, products);
        //////            bytes = stream.ToArray();
        //////        }
        //////        return File(bytes, "application/pdf", "pdfcatalog.pdf");
        //////    }
        //////    catch (Exception exc)
        //////    {
        //////        ErrorNotification(exc);
        //////        return RedirectToAction("ListLots");
        //////    }
        //////}



        //////[HttpPost]
        //////public ActionResult LotList(DataSourceRequest command, AULotList model)
        //////{

        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");

        //////    //TODO: add in vendor logic for consignors to see their lots. See C:\Users\Nicholas\Documents\My Documents\NopCommerce\Presentation\Nop.Web\Administration\Controllers\ProductController.cs ProductList()


        //////    var categoryIds = new List<int> { model.SearchCategoryId };
        //////    //include subcategories
        //////    if (model.SearchIncludeSubCategories && model.SearchCategoryId > 0)
        //////        categoryIds.AddRange(GetChildCategoryIds(model.SearchCategoryId));


        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    bool? overridePublished = null;
        //////    if (model.SearchPublishedId == 1)
        //////        overridePublished = true;
        //////    else if (model.SearchPublishedId == 2)
        //////        overridePublished = false;


        //////    //this will not conside exclude sale, as it general use for Manage Lots
        //////    var lots = _consignorService.GetAllLots(
        //////        categoryIds: categoryIds,
        //////        saleId: model.SearchSaleId,
        //////        storeId: model.SearchStoreId,
        //////        warehouseId: model.SearchWarehouseId,
        //////        productType: model.SearchProductTypeId > 0 ? (ProductType?)model.SearchProductTypeId : null,
        //////        keywords: model.SearchProductName,
        //////        pageIndex: command.Page - 1,
        //////        pageSize: command.PageSize,
        //////        showHidden: true,
        //////        overridePublished: overridePublished
        //////    );


        //////    //int productid = 0;
        //////    //string firstname = "Test";
        //////    //string lastname = "";

        //////    //int productId = model.searchProductID;
        //////    //string searchname = model.searchName;
        //////    //%%%%%%%%%%%start cleaning here
        //////    //var lots = _consignorService.GetAllLots(
        //////    //    //productId: productId,
        //////    //    //searchname: searchname,
        //////    //    pageIndex: 0,
        //////    //    pageSize: 500);

        //////    //pageIndex: command.Page - 1,
        //////    //pageSize: command.PageSize);
            
 
        //////    //TODO: THIS WILL NEED TO BE CHANGED WHEN YOU IMPLEMENT MORE THAN ONE CONSIGNOR PER CONSIGNMENT
        //////    //%%%%%%%%%%lots is food - something wrong with the view
        //////    //var gridModel = new DataSourceResult
        //////    //{
        //////    //    Data = lots.Select(x => new
        //////    //    {

        //////    //        Id = x.Id,
        //////    //        ProductID = x.ProductID,
        //////    //        Name = x.Name,
        //////    //        ShortDescription = x.ShortDescription,
        //////    //        LotNbr = x.LotNbr,
        //////    //        AUSaleID = x.AUSaleID,
        //////    //        AUSaleNbr = x.AUSaleNbr,
        //////    //        SaleTitle = x.SaleTitle

        //////    //    }),
        //////    //    Total = lots.TotalCount
        //////    //};


        //////    var gridModel = new DataSourceResult();
        //////    gridModel.Data = lots.Select(x =>
        //////    {
        //////        var lotsModel = x.ToModel();  //ToModel uses EF mapper and is implemented as an Extension. Map definition is in Infrastructure\AutomapperStartupTask
        //////        lotsModel.Id = x.Id;
        //////        lotsModel.ProductID = x.ProductID;
        //////        lotsModel.AULotID = x.AULotID;
        //////        lotsModel.Name = x.Name;
        //////        lotsModel.ShortDescription = x.ShortDescription;
        //////        lotsModel.SKU = x.SKU;
        //////        lotsModel.LotNbr = x.LotNbr;
        //////        lotsModel.IsLotSold = x.IsLotSold;
        //////        lotsModel.AUSaleID = x.AUSaleID;
        //////        lotsModel.SaleIsActive = x.SaleIsActive;
        //////        lotsModel.AUSaleNbr = x.AUSaleNbr;
        //////        lotsModel.SaleTitle = x.SaleTitle;
               
        //////        //little hack here:
        //////        //ensure that product full descriptions are not returned
        //////        //otherwise, we can get the following error if products have too long descriptions:
        //////        //"Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. "
        //////        //also it improves performance
        //////        //-->productModel.FullDescription = "";

        //////        //picture
        //////        var defaultProductPicture = _pictureService.GetPicturesByProductId(x.ProductID, 1).FirstOrDefault();

        //////        lotsModel.PictureThumbnailUrl = _pictureService.GetPictureUrl(defaultProductPicture, 75, true);
                
        //////        //product type
        //////        //productModel.ProductTypeName = x.ProductType.GetLocalizedEnum(_localizationService, _workContext);
                
        //////        //friendly stock qantity
        //////        //if a simple product AND "manage inventory" is "Track inventory", then display
        //////        //if (x.ProductType == ProductType.SimpleProduct && x.ManageInventoryMethod == ManageInventoryMethod.ManageStock)
        //////        //    productModel.StockQuantityStr = x.GetTotalStockQuantity().ToString();
               
        //////        return lotsModel;
        //////    });
        //////    gridModel.Total = lots.TotalCount;

        //////    return Json(gridModel);

        //////}


        //////[HttpPost]
        //////public ActionResult ListSaleLots(DataSourceRequest command, AULotList model,int excludeSaleId, bool excludeSale)
        //////{
        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");

            
        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    //bool? overridePublished = false; //show published and unpublished lots associated to the sale the sale

        //////    //should not happen
        //////    if (model.SearchSaleId == 0 && excludeSaleId != 0 && excludeSale == false )
        //////    {
        //////        model.SearchSaleId = excludeSaleId;
        //////    }


        //////    //TODO: only show lots in the store
        //////    var lots = _consignorService.GetAllLots(
        //////        saleId: model.SearchSaleId,
        //////        pageIndex: command.Page - 1,
        //////        pageSize: command.PageSize,
        //////        showHidden: true,
        //////        excludeSale: excludeSale,
        //////        excludeSaleId: excludeSaleId
        //////    );

        //////     //overridePublished: overridePublished,


        //////    //var lots = _consignorService.GetAllLots(
        //////    //    categoryIds: categoryIds,
        //////    //    saleId: model.SearchSaleId,
        //////    //    storeId: model.SearchStoreId,
        //////    //    warehouseId: model.SearchWarehouseId,
        //////    //    productType: model.SearchProductTypeId > 0 ? (AUProductType?)model.SearchProductTypeId : null,
        //////    //    keywords: model.SearchProductName,
        //////    //    pageIndex: command.Page - 1,
        //////    //    pageSize: command.PageSize,
        //////    //    showHidden: true,
        //////    //    overridePublished: overridePublished
        //////    //);


        //////    var gridModel = new DataSourceResult();
        //////    gridModel.Data = lots.Select(x =>
        //////    {
        //////        var lotsModel = x.ToModel();  //ToModel uses EF mapper and is implemented as an Extension. Map definition is in Infrastructure\AutomapperStartupTask
        //////        lotsModel.Id = x.Id;
        //////        lotsModel.ProductID = x.ProductID;
        //////        lotsModel.AULotID = x.AULotID;
        //////        lotsModel.Name = x.Name;
        //////        lotsModel.ShortDescription = x.ShortDescription;
        //////        lotsModel.SKU = x.SKU;
        //////        lotsModel.LotNbr = x.LotNbr;
        //////        lotsModel.IsLotSold = x.IsLotSold;
        //////        lotsModel.AUSaleID = x.AUSaleID;
        //////        lotsModel.AUSaleNbr = x.AUSaleNbr;
        //////        lotsModel.SaleTitle = x.SaleTitle;

        //////        //little hack here:
        //////        //ensure that product full descriptions are not returned
        //////        //otherwise, we can get the following error if products have too long descriptions:
        //////        //"Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. "
        //////        //also it improves performance
        //////        //-->productModel.FullDescription = "";

        //////        //picture
        //////        var defaultProductPicture = _pictureService.GetPicturesByProductId(x.ProductID, 1).FirstOrDefault();

        //////        lotsModel.PictureThumbnailUrl = _pictureService.GetPictureUrl(defaultProductPicture, 75, true);

        //////        //product type
        //////        //productModel.ProductTypeName = x.ProductType.GetLocalizedEnum(_localizationService, _workContext);

        //////        //friendly stock qantity
        //////        //if a simple product AND "manage inventory" is "Track inventory", then display
        //////        //if (x.ProductType == ProductType.SimpleProduct && x.ManageInventoryMethod == ManageInventoryMethod.ManageStock)
        //////        //    productModel.StockQuantityStr = x.GetTotalStockQuantity().ToString();

        //////        return lotsModel;
        //////    });
        //////    gridModel.Total = lots.TotalCount;

        //////    return Json(gridModel);
        //////}

        //////public ActionResult SaleProductAddPopup(int saleId)
        //////{
        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");

        //////    var model = new AULotList();  //using same search model as ManageLots

        //////    //a vendor should have access only to his products. Set the indicator in the model
        //////    model.IsLoggedInAsVendor = _workContext.CurrentVendor != null;
        //////    model.SaleId = saleId;

        //////    //categories
        //////    model.AvailableCategories.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    var categories = _categoryService.GetAllCategories(showHidden: true);
        //////    foreach (var c in categories)
        //////        model.AvailableCategories.Add(new SelectListItem { Text = c.GetFormattedBreadCrumb(categories), Value = c.Id.ToString() });

        //////    //NJM: Sales
        //////    model.AvailableSales.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    var sales = _consignorService.GetAllSales(
        //////         saleId: saleId,
        //////         saleNbr: null,
        //////         saleTitle: null,
        //////         excludeSale: true,
        //////         pageIndex: 0,
        //////         pageSize: 2147483647);
        //////    foreach (var c in sales)
        //////        model.AvailableSales.Add(new SelectListItem { Text = c.AUSaleNbr, Value = c.AUSaleID.ToString() });

        //////    //stores
        //////    model.AvailableStores.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    foreach (var s in _storeService.GetAllStores())
        //////        model.AvailableStores.Add(new SelectListItem { Text = s.Name, Value = s.Id.ToString() });

        //////    //warehouses
        //////    model.AvailableWarehouses.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    foreach (var wh in _shippingService.GetAllWarehouses())
        //////        model.AvailableWarehouses.Add(new SelectListItem { Text = wh.Name, Value = wh.Id.ToString() });

        //////    //product types
        //////    //NJM: Note ToSelectList is an extension method in Nop.Web.Framework
        //////    model.AvailableProductTypes = ProductType.SimpleProduct.ToSelectList(false).ToList();
        //////    model.AvailableProductTypes.Insert(0, new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });


        //////    //"published" property
        //////    //0 - all (according to "ShowHidden" parameter)
        //////    //1 - published only
        //////    //2 - unpublished only
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.All"), Value = "0" });
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.PublishedOnly"), Value = "1" });
        //////    model.AvailablePublishedOptions.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Catalog.Products.List.SearchPublished.UnpublishedOnly"), Value = "2" });

        //////    return View("~/Views/AUConsignor/ManageSaleLotsPopup.cshtml", model);
        //////}


       ////// /// <summary>
       ////// /// WARNING - THIS CODE IS CURRENTLY NOT EXECUTED AS WE DO NOT ALLOW "ORPHAN" CONSIGNOR RECORDS.  TODO: REMOVE THIS IF FULL TESTING REVEALS NOT NEEDED - 
       ////// /// CURRENTLY FAILING BECAUSE MODEL IS SHOWN TO BE INVALID WHEN NON-ZERO VALIDATION (ANNOTATION) HIT FOR AUCONSIGNORRECORD
       ////// /// </summary>
       ////// /// <param name="consignorId"></param>
       ////// /// <returns></returns>
       //////// [HttpPost]
       ////// public ActionResult ConsignorCustomerDisassociate(int consignorId)
       ////// {
       //////     //TODO: Implement permissions
       //////     //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
       //////     //    return AccessDeniedView();

       //////     var consignor = _consignorService.GetConsignorById(consignorId);
       //////     if (consignor == null)
       //////     {
       //////         ErrorNotification("A major error occurred -consignor id sent to ConsignorCustomerDisassociate null. Please contact System Support");
       //////         return RedirectToAction("ManageConsignors");
       //////     }

       //////     consignor.CustomerID = 0;

       //////     _consignorRepo.Update(consignor);
       //////     //_cacheManager.Clear();
       //////     SuccessNotification("Consignor disassociated from customer! Please associate to another customer asap");

       //////     return View("~/Views/AUConsignor/CreateUpdateConsignor.cshtml", consignor); //not hit first time??

       ////// }



        //////public ActionResult ConsignorCustomerSelectPopup(int consignorId)
        //////{
        //////    //TODO: Permissions to associate Customer to Consignor
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return View("~/Administration/Views/Security/AccessDenied.cshtml");

        //////    var model = new AUCustomerList();  //using same search model as ManageLots

        //////    //TODO: a vendor should not be able to see the consignor info or set the customer. Add and Set the indicator in the model
        //////    model.IsLoggedInAsVendor = _workContext.CurrentVendor != null;

        //////    //TODO: POPULATE WITH PHONEENABLED, 
        //////    model.PhoneEnabled = true;
        //////    model.ZipPostalCodeEnabled = true;
        //////    model.CompanyEnabled = true;

        //////    model.AUConsignorId = consignorId;

        //////    return View("~/Views/AUConsignor/ConsignorCustomerSelectPopup.cshtml", model);
        //////}
        
        

        //////[HttpPost]
        //////public ActionResult ConsignorCustomerSelectPopup(string selectedIds, int consignorId, string btnIdToRefresh, string frmIdToRefresh, AUCustomerList model)
        //////{
        //////    //TODO: Implement permissions
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();


        //////    var consignor = _consignorService.GetConsignorById(consignorId);
        //////    if (consignor == null || selectedIds == null)
        //////    {
        //////        ErrorNotification("A major error occurred -consignor id or selected ids from ConsignorCustomerSelectPopup null. Please contact System Support");
        //////        return RedirectToAction("ManageConsignors");
        //////    }

        //////    //TODO: Finish this - Need to get the lot info to ensure not already sold and unpublished
        //////    var ids = selectedIds
        //////            .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
        //////            .Select(x => Convert.ToInt32(x))
        //////            .ToArray();

        //////    var customer = _consignorService.GetCustomerById(ids[0]);

        //////    if (customer == null)
        //////    {
        //////        ErrorNotification("A major error occurred - customer not found using vendor id from ConsignorCustomerSelectPopup null. Please contact System Support");
        //////        return RedirectToAction("ManageConsignors");
        //////    }

        //////    consignor.CustomerID = customer.Id;
        //////    _consignorRepo.Update(consignor);


        //////    SuccessNotification("Customer associated to Consignor!!");  //seems to be nop admin convention

        //////    ViewBag.RefreshPage = true;
        //////    ViewBag.btnId = btnIdToRefresh;
        //////    ViewBag.formId = frmIdToRefresh;
        //////    return View("~/Views/AUConsignor/ConsignorCustomerSelectPopup.cshtml", model);
        //////    //return RedirectToAction("ListLots"); //TODO FIX THIS
        //////}

        ////////Popup the sale selection popup window to copy increments from
        //////public ActionResult SaleIncrementCopyPopup(int saleId)
        //////{
        //////    if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////        return View("~/Administration/Views/Security/AccessDenied.cshtml");

        //////    var model = new AUSaleList();  //using same search model as ManageSales

        //////    //a vendor should have access only to his products. Set the indicator in the model
        //////    //model.IsLoggedInAsVendor = _workContext.CurrentVendor != null;
        //////    model.SaleId = saleId;

        //////    //Populate Sales
        //////    //don't allow select all           model.AvailableSales.Add(new SelectListItem { Text = _localizationService.GetResource("Admin.Common.All"), Value = "0" });
        //////    var sales = _consignorService.GetAllSales(
        //////         saleId: saleId,
        //////         saleNbr: null,
        //////         saleTitle: null,
        //////         excludeSale: true,
        //////         pageIndex: 0,
        //////         pageSize: 2147483647);
        //////    foreach (var c in sales)
        //////        model.AvailableSales.Add(new SelectListItem { Text = c.SaleTitle, Value = c.AUSaleID.ToString() });

        //////    return View("~/Views/AUConsignor/SaleIncrementCopyPopup.cshtml", model);
        //////}




        //////[HttpPost]
        //////public ActionResult SaleProductAddPopup(string selectedIds, int saleId, string btnIdToRefresh, string frmIdToRefresh, AULotList model)
        //////{
        //////    //TODO: Implement permissions
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();

            
        //////    var sale = _consignorService.GetSaleById(saleId);
        //////    if (sale == null)
        //////    {
        //////        ErrorNotification("A major error occurred -sale id from SaleProductAddPopup not found. Please contact System Support");
        //////        return RedirectToAction("ManageSales"); 
        //////    }
            
        //////    //TODO: Finish this - Need to get the lot info to ensure not already sold and unpublished
        //////    var lots = new List<AULotRecord>();
        //////    if (selectedIds != null)
        //////    {
        //////        lots.AddRange(_consignorService.GetLotsByPids(selectedIds));
        //////    }

        //////    foreach (var l in lots)
        //////    {
        //////        var sl = l.AUSaleRecords.FirstOrDefault(x => x.AUSaleID == sale.AUSaleID);
        //////        if (sl == null) //Sale exists but the junction AUSaleLot record doesn't
        //////        {
        //////            var saleLot = new AUSaleLotRecord
        //////            {
        //////                AUSaleID = sale.AUSaleID,
        //////                AULotID = l.AULotID,
        //////                LotNbr = 0,                        
        //////                SaleIsActive = sale.SaleIsActive,       //pull this indicator from the Sale record - don't load from spreadsheet
        //////                DisplayOrder = 0             
        //////            };
        //////            _consignorService.InsertSaleLot(saleLot);
        //////        }
        //////        //else                                            //Sale exists and the junction AUSaleLot record does as well, so update it
        //////        //{
        //////        //    sl.AUSaleID = sale.AUSaleID;
        //////        //    sl.AULotID = lot.AULotID;
        //////        //    sl.LotNbr = LotNbr;
        //////        //    sl.SaleIsActive = sale.SaleIsActive;
        //////        //    sl.DisplayOrder = DisplayOrder;
        //////        //    _consignorService.UpdateSaleLot(sl);
        //////        //}
        //////    }

        //////    ////a vendor should have access only to his products
        //////    //if (_workContext.CurrentVendor != null)
        //////    //{
        //////    //    products = products.Where(p => p.VendorId == _workContext.CurrentVendor.Id).ToList();
        //////    //}

        //////    //_consignorService.PublishSelectedProducts(products);

        //////    SuccessNotification("Lots were associated to sale!!");  //seems to be nop admin convention

        //////    ViewBag.RefreshPage = true;
        //////    ViewBag.btnId = btnIdToRefresh;
        //////    ViewBag.formId = frmIdToRefresh;
        //////    return View("~/Views/AUConsignor/ManageSaleLotsPopup.cshtml", model);
        //////    //return RedirectToAction("ListLots"); //TODO FIX THIS
        //////}


        //////[HttpPost]
        //////public ActionResult CopySaleIncementsToSale(int selectedSaleId, int saleId, string btnIdToRefresh, string frmIdToRefresh, AUSaleList model)
        //////{
        //////    //TODO: Implement permissions
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();


        //////    var salefrom = _consignorService.GetSaleById(selectedSaleId);
        //////    if (salefrom == null)
        //////    {
        //////        ErrorNotification("A major error occurred -sale from id from CopySaleIncementsToSale popup not found. Please contact System Support");
        //////        return RedirectToAction("ManageSales"); //TODO FIX THIS to alert majorerror
        //////    }

        //////    var saleto = _consignorService.GetSaleById(saleId); //TODO: why using service to get this record.
        //////    if (saleto == null)
        //////    {
        //////        ErrorNotification("A major error occurred -saleto id from CopySaleIncementsToSale popup not found. Please contact System Support");
        //////        return RedirectToAction("ManageSales"); //TODO FIX THIS to alert majorerror
        //////    }

        //////    //changed so not walking the sale
        //////    var increments = saleto.AUIncrementRecords;

        //////   // consignor = _consignorRepo.GetById(ConsignorId);
        //////    //doesn't work - eats itself so second iteration fails
        //////    //foreach (var i in increments)
        //////    //{
               
        //////    //    var inc = _incrementRepo.GetById(i.AUIncrementID);
        //////    //    _incrementRepo.Delete(inc);
        //////    //}


        //////    while (1 == 1)
        //////    {
        //////        var inc = increments.FirstOrDefault();
        //////        if (inc != null)
        //////        {
        //////            _incrementRepo.Delete(inc);  //these hit db right away
        //////        }
        //////        else
        //////        {
        //////            break;
        //////        }
        //////    }

        //////    //saleto.AUIncrementRecords.Clear();
        //////    //_saleRepo.Update(saleto);

        //////    foreach (var incf in salefrom.AUIncrementRecords)
        //////    {
        //////        var newinc = new AUIncrementRecord();
        //////        var sale = _saleRepo.GetById(saleto.AUSaleID);
        //////        newinc.AUSaleID = saleto.AUSaleID; //change forein key to new sale;
        //////        newinc.CreatedBy = "Test created by";
                
        //////        //newinc.createdon
        //////        newinc.FromBidAmt = incf.FromBidAmt;
        //////        newinc.ToBidAmt = incf.ToBidAmt;
        //////        newinc.IncrementAmt = incf.IncrementAmt;


        //////        newinc.CreatedBy = "Test";
        //////        newinc.UpdatedBy = "Test";
        //////        newinc.CreatedOnDT = System.DateTime.UtcNow;
        //////        newinc.UpdatedOnDT = System.DateTime.UtcNow;


        //////        saleto.AUIncrementRecords.Add(newinc);

        //////       // saleto.AUIncrementRecords.Add(newinc);
        //////       // _saleRepo.Update(saleto);


        //////       // _incrementRepo.Insert(newinc); No Work - not null key???
               
        //////    }
        //////    _saleRepo.Update(saleto); //record add above does not hit db until this

        //////    ////a vendor should have access only to his products
        //////    //if (_workContext.CurrentVendor != null)
        //////    //{
        //////    //    products = products.Where(p => p.VendorId == _workContext.CurrentVendor.Id).ToList();
        //////    //}


        //////    //_consignorService.PublishSelectedProducts(products);


        //////    SuccessNotification("Increments were associated to sale!!");  //seems to be nop admin convention

        //////    ViewBag.RefreshPage = true;
        //////    ViewBag.btnId = btnIdToRefresh; //button to click (btnRefreshIncrements)
        //////    ViewBag.formId = frmIdToRefresh; //form to open (sale-form)


        //////    return View("~/Views/AUConsignor/SaleIncrementCopyPopup.cshtml", model);
        //////    //return RedirectToAction("ListLots"); //TODO FIX THIS
        //////}


        ////////[HttpPost]  grid is not posting
        ////////the grid passes in fields in the row schema as well as the form model
        ////////the grid schema can containmore fields than are displayed in the columns
        ////////AULotID comes from the schema
        ////////AUSaleID comes from the model
        //////public ActionResult RemoveLotFromSale(int AULotID, AUSaleRecord model)
        //////{
        //////   //TODO: AUTHORIZE
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
        //////    //    return AccessDeniedView();

        //////     _consignorService.DeleteSaleLotByLotId(AULotID, model.AUSaleID);
           
        //////    //if (productCategory == null)
        //////    //    throw new ArgumentException("No product category mapping found with the specified id");

        //////    ////var categoryId = productCategory.CategoryId;
        //////    //_categoryService.DeleteProductCategory(productCategory);

        //////    return new NullJsonResult();
        //////}


        //////public ActionResult DeleteFees(string btnIdToRefresh, string frmIdToRefresh, AUFeesRecord model)
        //////{
        //////    //TODO: AUTHORIZE
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
        //////    //    return AccessDeniedView();

        //////    var fee = _feesRepo.GetById(model.AUFeesID);

        //////    if (fee != null) //should not happen once you start hiding the inherit button on an inherited fee
        //////    {
        //////        _feesRepo.Delete(fee);

        //////        ViewBag.RefreshPage = true;
        //////        ViewBag.btnId = btnIdToRefresh;
        //////        ViewBag.formId = frmIdToRefresh;
        //////    }

        //////    return new NullJsonResult();
        //////}

        //////public ActionResult InheritFees(AUFeesRecord model)
        //////{
        //////    //TODO: AUTHORIZE
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
        //////    //    return AccessDeniedView();

        //////    var fee = _feesRepo.GetById(model.AUFeesID);
        //////    _feesRepo.Delete(fee);

        //////    return new NullJsonResult();
        //////}

        //////[HttpPost]
        //////public ActionResult CreateUpdateFees(AUFeesRecord model)
        //////{
        //////    //TODO: Implement permissions across all actions
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageProducts))
        //////    //    return AccessDeniedView();

        //////    //var productCategory = _categoryService.GetProductCategoryById(model.Id);
        //////    //if (productCategory == null)
        //////    //    throw new ArgumentException("No product category mapping found with the specified id");

        //////    string feetype = "";

        //////    var fee = new AUFeesRecord();
        //////    if (model.AUFeesID > 0)
        //////    {
        //////        fee = _feesRepo.GetById(model.AUFeesID);        //TODO: push into service
        //////    }
        //////    else
        //////    {
        //////        //Make sure you don't carry the Inherited indicator (I) into the database
        //////        feetype = model.AUEntityType;

        //////        if (model.AUEntityType == "AUConsignment(I)")
        //////        {
        //////            feetype = "AUConsignment";
        //////        }
        //////        else if (model.AUEntityType == "AULot(I)")
        //////        {
        //////            feetype = "AULot";
        //////        }

        //////        fee.AUEntityType = feetype;
        //////        fee.AUEntityID = model.AUEntityID;

        //////        //Hack - force in the Order here for displaying
        //////        if (feetype == "AUConsignor")
        //////        {
        //////            fee.DisplayOrder = 0;
        //////        }
        //////        else if (feetype == "AUConsignment")
        //////        {
        //////            fee.DisplayOrder = 2; 
        //////        }
        //////        else if (feetype == "AULot")
        //////        {
        //////            fee.DisplayOrder = 3;
        //////        }
        //////    }

        //////    fee.CommissionCanExceedReserveInd = model.CommissionCanExceedReserveInd;
        //////    fee.ExpertisingFeeAmt = model.ExpertisingFeeAmt;
        //////    fee.FixedFeeAmt = model.FixedFeeAmt;
        //////    fee.InsuranceSoldPct = model.InsuranceSoldPct;
        //////    fee.InsuranceUnsoldPct = model.InsuranceUnsoldPct;
        //////    fee.InterestOnAdvancePct = model.InterestOnAdvancePct;
        //////    fee.MinCommissionMailSoldAmt = model.MinCommissionMailSoldAmt;
        //////    fee.MinCommissionMailUnsoldAmt = model.MinCommissionMailUnsoldAmt;
        //////    fee.MinCommissionPublicSoldAmt = model.MinCommissionPublicSoldAmt;
        //////    fee.MinCommissionPublicUnsoldAmt = model.MinCommissionPublicUnsoldAmt;
        //////    fee.MinimumConsignorTotalFeeAmt = model.MinimumConsignorTotalFeeAmt;
        //////    fee.MiscFeeAmt = model.MiscFeeAmt;
        //////    fee.SoldPct = model.SoldPct;
        //////    fee.UnsoldPct = model.UnsoldPct;

        //////    if (model.AUFeesID > 0)
        //////    {
        //////        _feesRepo.Update(fee);        //TODO: push into service
        //////    }
        //////    else
        //////    {
        //////        _feesRepo.Insert(fee);
        //////    }

        //////    return new NullJsonResult();
        //////}


        //////// [HttpPost]  grid is not posting so signature can't be post
        ////////form passes fields in the grid row schema as well as the form model
        ////////the grid schema can contain more fields than are displayed in the columns
        ////////AULotID comes from the schema
        ////////AUSaleID comes from the model
        //////public ActionResult DeleteSaleIncrement(int AUIncrementID)
        //////{
        //////    //TODO: AUTHORIZE
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
        //////    //    return AccessDeniedView();

        //////    _consignorService.DeleteIncrementById(AUIncrementID);

        //////    //if (productCategory == null)
        //////    //    throw new ArgumentException("No product category mapping found with the specified id");

        //////    ////var categoryId = productCategory.CategoryId;
        //////    //_categoryService.DeleteProductCategory(productCategory);

        //////    return new NullJsonResult();
        //////}


        //////public ActionResult UpdateSaleIncrement(AUIncrementRecord increment)
        //////{
        //////    //TODO: AUTHORIZE
        //////    //if (!_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
        //////    //    return AccessDeniedView();

        //////    _incrementRepo.Update(increment);

        //////    return new NullJsonResult();
        //////}


        //////public ActionResult ManageConsignors()
        //////{

        //////    //%%%%%%%%%%%%%%%%%%%
        //////    //var listModel = new AUConsignorList
        //////    //{
        //////    //    //UsernamesEnabled = _customerSettings.UsernamesEnabled,
        //////    //    //DateOfBirthEnabled = _customerSettings.DateOfBirthEnabled,
        //////    //    //CompanyEnabled = _customerSettings.CompanyEnabled,
        //////    //    //PhoneEnabled = _customerSettings.PhoneEnabled,
        //////    //    //ZipPostalCodeEnabled = _customerSettings.ZipPostalCodeEnabled,
        //////    //    //AvailableCustomerRoles = _customerService.GetAllCustomerRoles(true).Select(cr => cr.ToModel()).ToList(),
        //////    //    //SearchCustomerRoleIds = defaultRoleIds,
        //////    //};
        //////    //return View(listModel);




        //////    //return View();
        //////    return View("~/Views/AUConsignor/ManageConsignors.cshtml"); //not hit first time??
        //////}


        //public ActionResult CustomerList(DataSourceRequest command, CustomerListModel model,
        //   [ModelBinder(typeof(CommaSeparatedModelBinder))] int[] searchCustomerRoleIds)

        //////[HttpPost]
        ////////*************************************************************************************************************************************
        //////// you had to pass in AUConsignorList model and populate it with the additionaldata function
        //////// in the cshtml to get the entered search data. ToTest: do you need DataSourceRequest?? Note, when just doing a total list,
        //////// you didn;t need to pass in anything
        //////public ActionResult ListConsignors(DataSourceRequest command, AUConsignorList model)
        //////{
        //////    //********************************Original*******See Consignments for M-M *********************************************************
        //////    //var consignors = _consignorRepo.Table.ToList();

        //////    //var gridModel = new DataSourceResult
        //////    //{
        //////    //    Data = consignors.Select(x => new
        //////    //    {
        //////    //        AUConsignorID = x.AUConsignorID,
        //////    //        FirstName = x.FirstName,
        //////    //        MiddleName = x.MiddleName,
        //////    //        LastName = x.LastName,
        //////    //        CreateDate = x.CreateDate,
        //////    //        BuyerFee = x.BuyerFee,
        //////    //        SellerFee = x.SellerFee,
        //////    //    }),
        //////    //    Total = consignors.Count()
        //////    //};
        //////    //*****************************Original*******************************************************************

        //////    int consignorid = 0;
        //////    string email = "";
        //////    //string firstname = "Test";
        //////    string lastname = "";

        //////    string fn = model.searchFirstName;

        //////    var consignors = _consignorService.GetAllConsignors(
        //////        consignorId: consignorid,
        //////        WEmail: email,
        //////        firstName: model.searchFirstName,
        //////        lastName: lastname,
        //////        pageIndex: 0,
        //////        pageSize: 500);

        //////    //pageIndex: command.Page - 1,
        //////    //pageSize: command.PageSize);


        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = consignors.Select(x => new
        //////        {
        //////            Id = x.Id,
        //////            AUConsignorID = x.AUConsignorID,
        //////            CustomerID = x.CustomerID,
        //////            FirstName = x.FirstName,
        //////            MiddleName = x.MiddleName,
        //////            LastName = x.LastName
        //////        }),
        //////        Total = consignors.TotalCount
        //////    };

        //////    return Json(gridModel);
        //////}

        //////public ActionResult ManageSales()
        //////{

        //////      //return View();
        //////    return View("~/Views/AUConsignor/ManageSales.cshtml"); //not hit first time??
        //////}


        //////public ActionResult ListSales(DataSourceRequest command, AUSaleList model)
        //////{

        //////    var sales = _consignorService.GetAllSales(
        //////        saleId: model.searchAUSaleID,
        //////        saleNbr: model.searchSaleNbr,
        //////        saleTitle: model.searchSaleTitle,
        //////        pageIndex: 0,
        //////        pageSize: 500);

        //////    //pageIndex: command.Page - 1,
        //////    //pageSize: command.PageSize);


        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = sales.Select(x => new
        //////        {
        //////            AUSaleID = x.AUSaleID,
        //////            SaleStoreID = x.SaleStoreID,
        //////            AUSaleNbr = x.AUSaleNbr,
        //////            SaleTitle = x.SaleTitle,
        //////            SaleDesc = x.SaleDesc,
        //////           // SaleStartDateTime = x.SaleStartDateTime,
        //////           // SaleEndDateTime = x.SaleEndDateTime,
        //////            SaleStartDateTime = _dateTimeHelper.ConvertToUserTime(x.SaleStartDateTime, DateTimeKind.Local),
        //////            SaleEndDateTime = _dateTimeHelper.ConvertToUserTime(x.SaleEndDateTime, DateTimeKind.Local),


        //////        }),
        //////        Total = sales.TotalCount
        //////    };


        //////    return Json(gridModel);
        //////}

        //////public ActionResult ListUnassignedConsignors(DataSourceRequest command, AUCustomerList model)
        //////{

        //////    int roleId = _consignorService.GetIdForRole("Consignors");
        //////    int[] roleIds = new int[1];

        //////    //Note: roleId may be 0 if Role was not found
        //////    roleIds[0] = roleId;

        //////    var vendors = _consignorService.GetUnassignedConsignorCustomers(
        //////        vendorId: model.SearchVendorId,
        //////        customerRoleIds: roleIds,
        //////        email: model.SearchEmail,
        //////        username: model.SearchUsername,
        //////        firstName: model.SearchFirstName,
        //////        lastName: model.SearchLastName,
        //////        company: model.SearchCompany,
        //////        phone: model.SearchPhone,
        //////        zipPostalCode: model.SearchZipPostalCode,
        //////        pageIndex: 0,
        //////        pageSize: 500);

        //////    //pageIndex: command.Page - 1,
        //////    //pageSize: command.PageSize);

        //////    //TODO: Add address, phone info to this result set (use nav property = select home address)
        //////    var gridModel = new DataSourceResult
        //////    {
        //////        Data = vendors.Select(x => new
        //////        {
        //////            Id = x.Id, 
        //////            VendorId = x.VendorId,
        //////            CustomerGuid = x.CustomerGuid,
        //////            Firstname = (x.Addresses.Count() != 0) ? x.Addresses.First().FirstName : "No Address",
        //////            Lastname = (x.Addresses.Count() != 0) ? x.Addresses.First().LastName : "No Address",
        //////            Address1 = (x.Addresses.Count() != 0) ? x.Addresses.First().Address1 : "No Address",
        //////            Address2 = (x.Addresses.Count() != 0) ? x.Addresses.First().Address2 : "No Address",
        //////            City = (x.Addresses.Count() != 0) ? x.Addresses.First().City : "No Address",
        //////            ZipPostalCode = (x.Addresses.Count() != 0) ? x.Addresses.First().ZipPostalCode : "No Address",
        //////            Username = x.Username,
        //////            Company = (x.Addresses.Count() != 0) ? x.Addresses.First().Company : "No Address",
        //////            Phone = (x.Addresses.Count() != 0) ? x.Addresses.First().PhoneNumber : "No Address",
        //////            Email = x.Email,
        //////            AdminComment = x.AdminComment,
        //////            HasShoppingCartItems = x.HasShoppingCartItems,
        //////            Active = x.Active,
        //////            CreatedOnUtc = x.CreatedOnUtc,
        //////            LastLoginDateUtc = x.LastLoginDateUtc,
        //////            LastActivityDateUtc = x.LastActivityDateUtc
        //////        }),
        //////        Total = vendors.TotalCount
        //////    };


        //////    return Json(gridModel);
        //////}
        //TODO: what is this  DECORATION from Web CatalogController.cs
        // [NopHttpsRequirement(SslRequirement.No)]
        //WARNING!!! This is for the search page breadcrumb only!



        //TODO: what is this  DECORATION from Web CatalogController.cs
       // [NopHttpsRequirement(SslRequirement.No)]
        public ActionResult Category(int categoryId, int? saleId, string children, string allChildren, CatalogPagingFilteringModel command)
        {

            int inSaleId = saleId.GetValueOrDefault();  //NJM: make it 0 if it's null. will be null coming off the Catalog breadcrumb
            bool manageCategoriesBySale = true; //TODO: placeholder to determine type of store and if manage categories by sale

            var category = new Category();

            if (categoryId != 0)  //NJM: may pass as zero if trying to present category page for sale only- off sale navigator or sale breadcrumb
            {
                category = _categoryService.GetCategoryById(categoryId);
                if (category == null || category.Deleted)
                    return InvokeHttp404();

                //Check whether the current user has a "Manage catalog" permission
                //It allows him to preview a category before publishing
                if (!category.Published && !_permissionService.Authorize(StandardPermissionProvider.ManageCategories))
                    return InvokeHttp404();

                //ACL (access control list)
                if (!_aclService.Authorize(category))
                    return InvokeHttp404();

                //Store mapping
                if (!_storeMappingService.Authorize(category))
                    return InvokeHttp404();
            }
            else
            {
               //NJM: TODO Stuff page info for now until you add to AUSale (like Category)
                category.AllowCustomersToSelectPageSize = true;
                category.PageSizeOptions = "6,3,9";
                category.PageSize = 6;
            }

            //TODO: come back to this to save the last page to continue shopping 
            ////////'Continue shopping' URL
            //////_genericAttributeService.SaveAttribute(_workContext.CurrentCustomer,
            //////    SystemCustomerAttributeNames.LastContinueShoppingPage,
            //////    _webHelper.GetThisPageUrl(false),
            //////    _storeContext.CurrentStore.Id);

            var model = category.ToAUModel();     //NJM: this maps Category to AUCategory but does not populate nested classes

            if (inSaleId != 0)  //NJM: coming off sale navigator or breadcrumb, so get the sale title
            {
                var sale = _saleRepo.GetById(inSaleId);
                if (sale == null)
                {
                    throw new NopException("SaleId not found for category " + saleId);
                }

                model.SaleId = inSaleId;              //this is needed to allow hyperlink to specify sale constraint
                model.SaleTitle = sale.SaleTitle;  //this is needed for the breadcrumb
            }

            //sorting
            PrepareSortingOptions(model.PagingFilteringContext, command);
            //view mode
            PrepareViewModes(model.PagingFilteringContext, command);
            //page size
            PreparePageSizeOptions(model.PagingFilteringContext, command,
                category.AllowCustomersToSelectPageSize,
                category.PageSizeOptions,
                category.PageSize);


            //price ranges
            //TODO:  insert *estimate* in here for filtering?
            model.PagingFilteringContext.PriceRangeFilter.LoadPriceRangeFilters(category.PriceRanges, _webHelper, _priceFormatter);
            var selectedPriceRange = model.PagingFilteringContext.PriceRangeFilter.GetSelectedPriceRange(_webHelper, category.PriceRanges);
            decimal? minPriceConverted = null;
            decimal? maxPriceConverted = null;
            if (selectedPriceRange != null)
            {
                if (selectedPriceRange.From.HasValue)
                    minPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.From.Value, _workContext.WorkingCurrency);

                if (selectedPriceRange.To.HasValue)
                    maxPriceConverted = _currencyService.ConvertToPrimaryStoreCurrency(selectedPriceRange.To.Value, _workContext.WorkingCurrency);
            }


            //*******************************************************************************************************************
            //* The category breadcrumb s/b ok because it looks at the hierarchy above the current node, which is stable 
            //* regardless if a lot is associated
            //**************************************************************************************************************
            //category breadcrumb
            if (_catalogSettings.CategoryBreadcrumbEnabled)
            {
                model.DisplayCategoryBreadcrumb = true;

                string breadcrumbCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_BREADCRUMB_KEY,
                    categoryId,
                    string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()),
                    _storeContext.CurrentStore.Id,
                    _workContext.WorkingLanguage.Id);

                //%%%get the breadcrumb here
                model.CategoryBreadcrumb = _cacheManager.Get(breadcrumbCacheKey, () =>
                    category
                    .GetCategoryBreadCrumb(_categoryService, _aclService, _storeMappingService)
                    .Select(catBr => new AUCategoryModel
                    {
                        Id = catBr.Id,
                        SaleId = inSaleId,
                        Name = catBr.GetLocalized(x => x.Name),
                        SeName = catBr.GetSeName()
                    })
                    .ToList()
                );
            }




            //*******************************************************************************************************************
            //* Subcategories need modification because you only want to show subs that have a lot associated for this sale if sale provided
            //* this will affect what shows in the main panel when you click the parent node, and also affects child categores passed in the url to 
            //* this action from the breadcrumb and navigator
            //**************************************************************************************************************
            //TODO deteermine if store wants to manage categories by sale. if so, use special stored procedure, otherwise use standard nop
            //logic to show raw category tree. use temporary variable for interim to control flow

            if (manageCategoriesBySale)
            {
                string subCategoriesCacheKey = string.Format(AUModelCacheEventConsumer.SALE_CATEGORY_SUBCATEGORIES_KEY,
                    inSaleId,
                    categoryId,
                    string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()),
                    _storeContext.CurrentStore.Id,
                    _workContext.WorkingLanguage.Id,
                    _webHelper.IsCurrentConnectionSecured());

                model.SubCategories = _cacheManager.Get(subCategoriesCacheKey, () =>
                    _ausaleService.GetSaleCategoriesByParentCategoryId(inSaleId, categoryId)
                    .Select(x =>
                    {
                        var subCatModel = new AUCategoryModel.SubCategoryModel
                        {
                            Id = x.Id,
                            Name = x.GetLocalized(y => y.Name),
                            SeName = x.GetSeName(),
                        };

                        //prepare picture model
                        int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                        var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                        subCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                        {
                            var picture = _pictureService.GetPictureById(x.PictureId);
                            var pictureModel = new PictureModel
                            {
                                FullSizeImageUrl = _pictureService.GetPictureUrl(picture),
                                ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize),
                                Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), subCatModel.Name),
                                AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), subCatModel.Name)
                            };
                            return pictureModel;
                        });

                        return subCatModel;
                    })
                    .ToList()
                );
            }
            else //sale id is not present so get the raw hierarchy based on the category id passed in - original nop logic
            {
                string subCategoriesCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_SUBCATEGORIES_KEY,
                categoryId,
                string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()),
                _storeContext.CurrentStore.Id,
                _workContext.WorkingLanguage.Id,
                _webHelper.IsCurrentConnectionSecured());
                model.SubCategories = _cacheManager.Get(subCategoriesCacheKey, () =>
                    _categoryService.GetAllCategoriesByParentCategoryId(categoryId)
                    .Select(x =>
                    {
                        var subCatModel = new CategoryModel.SubCategoryModel
                        {
                            Id = x.Id,
                            Name = x.GetLocalized(y => y.Name),
                            SeName = x.GetSeName(),
                        };

                        //prepare picture model
                        //TODO: refactor to define only once (see above)
                        int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                        var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                        subCatModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                        {
                            var picture = _pictureService.GetPictureById(x.PictureId);
                            var pictureModel = new PictureModel
                            {
                                FullSizeImageUrl = _pictureService.GetPictureUrl(picture),
                                ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize),
                                Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), subCatModel.Name),
                                AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), subCatModel.Name)
                            };
                            return pictureModel;
                        });

                        return subCatModel.ToAUSubCatModel();  //NJM converting CategoryModel.SubCategoryModel to AUCategoryModel.SubCategoryModel
                    })
                    .ToList()
                );
            }


            //featured products
            //TODO - maybe want only featured products for the sales??
            if (categoryId != 0)  //may pass as zero if trying to present category page for sale only. For now don't show sale level featured products
            {
                if (!_catalogSettings.IgnoreFeaturedProducts)
                {
                    //We cache a value indicating whether we have featured products
                    IPagedList<Product> featuredProducts = null;
                    string cacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_HAS_FEATURED_PRODUCTS_KEY, categoryId,
                        string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()), _storeContext.CurrentStore.Id);
                    var hasFeaturedProductsCache = _cacheManager.Get<bool?>(cacheKey);
                    if (!hasFeaturedProductsCache.HasValue)
                    {
                        //no value in the cache yet
                        //let's load products and cache the result (true/false)
                        featuredProducts = _productService.SearchProducts(
                           categoryIds: new List<int> { category.Id },
                           storeId: _storeContext.CurrentStore.Id,
                           visibleIndividuallyOnly: true,
                           featuredProducts: true);
                        hasFeaturedProductsCache = featuredProducts.TotalCount > 0;
                        _cacheManager.Set(cacheKey, hasFeaturedProductsCache, 60);
                    }
                    if (hasFeaturedProductsCache.Value && featuredProducts == null)
                    {
                        //cache indicates that the category has featured products
                        //let's load them
                        featuredProducts = _productService.SearchProducts(
                           categoryIds: new List<int> { category.Id },
                           storeId: _storeContext.CurrentStore.Id,
                           visibleIndividuallyOnly: true,
                           featuredProducts: true);
                    }
                    if (featuredProducts != null)
                    {
                        model.FeaturedProducts = PrepareProductOverviewModels(featuredProducts).ToList();
                    }
                }
            }

            //Gets ALL (raw) subcategories t the category passed in. If sale is provided, stored proc will only show lots in this sale in these categories
            var categoryIds = new List<int>();
            categoryIds.Add(category.Id);
            if (_catalogSettings.ShowProductsFromSubcategories)
            {
                //original--> 
                categoryIds.AddRange(GetChildCategoryIds(category.Id));
            }
            

            IList<int> alreadyFilteredSpecOptionIds = model.PagingFilteringContext.SpecificationFilter.GetAlreadyFilteredSpecOptionIds(_webHelper);
            IList<int> filterableSpecificationAttributeOptionIds;



            var lots = _consignorService.GetAllLots2(
              out filterableSpecificationAttributeOptionIds, 
              true,
              categoryIds: categoryIds,
              saleId: inSaleId,
              storeId: _storeContext.CurrentStore.Id,
              visibleIndividuallyOnly: true,
              featuredProducts: _catalogSettings.IncludeFeaturedProductsInNormalLists ? null : (bool?)false,
                priceMin: minPriceConverted,
                priceMax: maxPriceConverted,
                filteredSpecs: alreadyFilteredSpecOptionIds,
                //orderBy: (ProductSortingEnum)command.OrderBy ---> not working?  //TODO: fix ordering (enum issue?)
                //warehouseId: model.SearchWarehouseId,
                //productType: model.SearchProductTypeId > 0 ? (ProductType?)model.SearchProductTypeId : null,
                //keywords: model.SearchProductName,

            //pageIndex: command.PageNumber - 1,
            //pageSize: command.PageSize,
              showHidden: false,
              overridePublished: true
              ).Select(x => x.ToProduct()).ToList(); //NJM: Important! Notice embedded "ToProduct mapping to get from AUCombLotProc to Product
                                                    //this is where you need to change to insert the bidding info


            int totalRecords = lots.Count;
            int pageIndex = command.PageNumber - 1;
            int pageSize = command.PageSize;


            //int totalRecords = (pTotalRecords.Value != DBNull.Value) ? Convert.ToInt32(pTotalRecords.Value) : 0;
            //var products = new PagedList<Product>(lots, pageIndex, pageSize, totalRecords);

            //NJM: need to cast lots List to IPagedList so can be used in  model.PagingFilteringContext.LoadPagedList(products);
            var products = new PagedList<Product>(lots, pageIndex, pageSize, totalRecords);


            //var products = _productService.SearchProducts(out filterableSpecificationAttributeOptionIds, true,
            //    categoryIds: categoryIds,
            //    storeId: _storeContext.CurrentStore.Id,
            //    visibleIndividuallyOnly: true,
            //    featuredProducts: _catalogSettings.IncludeFeaturedProductsInNormalLists ? null : (bool?)false,
            //    priceMin: minPriceConverted,
            //    priceMax: maxPriceConverted,
            //    filteredSpecs: alreadyFilteredSpecOptionIds,
            //    orderBy: (ProductSortingEnum)command.OrderBy,
            //    pageIndex: command.PageNumber - 1,
            //    pageSize: command.PageSize);


            //&&&&&&&&&&&&&this function should return AU
                model.Products = PrepareProductOverviewModels(products).ToList();

                //IPagedList<Product> products
                model.PagingFilteringContext.LoadPagedList(products);

                //specs
                model.PagingFilteringContext.SpecificationFilter.PrepareSpecsFilters(alreadyFilteredSpecOptionIds,
                    filterableSpecificationAttributeOptionIds,
                    _specificationAttributeService, _webHelper, _workContext);


            //template
            var templateCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_TEMPLATE_MODEL_KEY, category.CategoryTemplateId);
            var templateViewPath = _cacheManager.Get(templateCacheKey, () =>
            {
                var template = _categoryTemplateService.GetCategoryTemplateById(category.CategoryTemplateId);
                if (template == null)
                    template = _categoryTemplateService.GetAllCategoryTemplates().FirstOrDefault();
                if (template == null)
                    throw new Exception("No default template could be loaded");
                return template.ViewPath;
            });

            //activity log
            _customerActivityService.InsertActivity("PublicStore.ViewCategory", _localizationService.GetResource("ActivityLog.PublicStore.ViewCategory"), category.Name);

            return View(templateViewPath, model);
        }
        public ActionResult HomepageCategoryContainer()
        {
            string categoriesCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_HOMEPAGE_KEY,
                string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()),
                _storeContext.CurrentStore.Id,
                _workContext.WorkingLanguage.Id,
                _webHelper.IsCurrentConnectionSecured());

            var model = _cacheManager.Get(categoriesCacheKey, () =>
                _categoryService.GetAllCategoriesDisplayedInTopMenu()
                .Where(x => x.ShowOnHomePage == false && x.IncludeInTopMenu == true)
                .Select(x =>
                {
                    var catModel = x.ToModel();

                    //prepare picture model
                    int pictureSize = _mediaSettings.CategoryThumbPictureSize;
                    var categoryPictureCacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_PICTURE_MODEL_KEY, x.Id, pictureSize, true, _workContext.WorkingLanguage.Id, _webHelper.IsCurrentConnectionSecured(), _storeContext.CurrentStore.Id);
                    catModel.PictureModel = _cacheManager.Get(categoryPictureCacheKey, () =>
                    {
                        var picture = _pictureService.GetPictureById(x.PictureId);
                        var pictureModel = new PictureModel
                        {
                            FullSizeImageUrl = _pictureService.GetPictureUrl(picture),
                            ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize),
                            Title = string.Format(_localizationService.GetResource("Media.Category.ImageLinkTitleFormat"), catModel.Name),
                            AlternateText = string.Format(_localizationService.GetResource("Media.Category.ImageAlternateTextFormat"), catModel.Name)
                        };
                        return pictureModel;
                    });

                    //get subcategories
                    var subcats = _categoryService.GetAllCategoriesByParentCategoryId(catModel.Id);
                    IList<CategoryModel.SubCategoryModel> lstSubcategories = new List<CategoryModel.SubCategoryModel>();

                    //add parent products
                    IList<int> categoryId = new List<int>();
                    categoryId.Add(catModel.Id);
                    foreach (Category subcatitem in subcats)
                    {
                        categoryId.Add(subcatitem.Id);
                        var subsubcats = _categoryService.GetAllCategoriesByParentCategoryId(subcatitem.Id);
                        foreach (Category subsubcatitem in subsubcats)
                        {
                            categoryId.Add(subsubcatitem.Id);
                        }
                    }

                    //include child products in the list since not all parents have products attached
                    var parentProducts = _productService.SearchProducts(0, 12, categoryId, 0, 0, 0, 0, null, false, null, null,
                    null, 0, null, false, true, false, 0, null, ProductSortingEnum.NameAsc, false, null);
                    IList<ProductOverviewModel> lstParentProducts = new List<ProductOverviewModel>();

                    int counter = 0;
                    foreach (Product parentPItem in parentProducts)
                    {
                        if (counter < 8)
                        {
                            ProductOverviewModel p = new ProductOverviewModel();
                            decimal convertedPrice = Math.Round(parentPItem.Price, 2);
                            p.ProductPrice.Price = convertedPrice.ToString();
                            p.Id = parentPItem.Id;
                            p.Name = parentPItem.Name;
                            p.SeName = parentPItem.GetSeName();
                            p.ShortDescription = parentPItem.ShortDescription;
                            p.ProductPrice.OldPrice = parentPItem.OldPrice.ToString();

                            var picture = _pictureService.GetPicturesByProductId(parentPItem.Id, 1).FirstOrDefault();
                            p.DefaultPictureModel.Title = parentPItem.Name;
                            p.DefaultPictureModel.ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize);
                            lstParentProducts.Add(p);
                            counter++;
                        }
                    }

                    catModel.Products = lstParentProducts;

                    ////get subcategories
                    //var subcats = _categoryService.GetAllCategoriesByParentCategoryId(catModel.Id);
                    //IList<CategoryModel.SubCategoryModel> lstSubcategories = new List<CategoryModel.SubCategoryModel>();

                    foreach (Category item in subcats)
                    {
                        CategoryModel.SubCategoryModel s = new CategoryModel.SubCategoryModel();
                        s.Id = item.Id;
                        s.Name = item.Name;
                        s.PictureModel = null;

                        IList<int> categoryIds = new List<int>();
                        categoryIds.Add(item.Id);
                        //get sub-subcategories
                        var subsubcats = _categoryService.GetAllCategoriesByParentCategoryId(item.Id);
                        foreach (Category subsubcatitem in subsubcats)
                        {
                            categoryIds.Add(subsubcatitem.Id);
                        }

                        //add subcategory products
                        var products = _productService.SearchProducts(0, 8, categoryIds, 0, 0, 0, 0, null, false, null, null,
                            null, 0, null, false, true, false, 0, null, ProductSortingEnum.NameAsc, false, null);
                        IList<ProductOverviewModel> lstProducts = new List<ProductOverviewModel>();

                        //int parentCounter = 0;
                        //foreach (Product pitem in products)
                        //{
                        //    foreach (ProductCategory categoryItem in pitem.ProductCategories)
                        //    {
                        //        //if (categoryItem.CategoryId == item.Id && categoryItem.IsFeaturedProduct == true)
                        //        if (categoryItem.CategoryId == item.Id && parentCounter < 8)
                        //        {
                        //            ProductOverviewModel p = new ProductOverviewModel();
                        //            decimal convertedPrice = Math.Round(pitem.Price, 2);
                        //            p.ProductPrice.Price = convertedPrice.ToString();
                        //            p.Id = pitem.Id;
                        //            p.Name = pitem.Name;
                        //            p.SeName = pitem.GetSeName();
                        //            p.ShortDescription = pitem.ShortDescription;
                        //            p.ProductPrice.OldPrice = pitem.OldPrice.ToString();

                        //            var picture = _pictureService.GetPicturesByProductId(pitem.Id, 1).FirstOrDefault();
                        //            p.DefaultPictureModel.Title = pitem.Name;
                        //            p.DefaultPictureModel.ImageUrl = _pictureService.GetPictureUrl(picture, pictureSize);

                        //            lstProducts.Add(p);
                        //            parentCounter++;
                        //        }
                        //    }
                        //}

                        var specproducts = PrepareProductOverviewModels(products, true, true, null, true).ToList();

                        //s.Products = lstProducts;
                        s.Products = specproducts;

                        lstSubcategories.Add(s);
                    }
                    catModel.SubCategories = lstSubcategories;
                    return catModel;
                })
                .ToList()
            );

            //get featured products
            var report = _cacheManager.Get(string.Format(ModelCacheEventConsumer.HOMEPAGE_BESTSELLERS_IDS_KEY, _storeContext.CurrentStore.Id),
                () =>
                    _orderReportService.BestSellersReport(storeId: _storeContext.CurrentStore.Id,
                    pageSize: 8));

            var featuredProducts = _productService.GetProductsByIds(report.Select(x => x.ProductId).ToArray());
            var featuredProductsOverview = PrepareProductOverviewModels(featuredProducts, true, true, null, true).ToList();
            var featuredCategoryModel = new CategoryModel();
            featuredCategoryModel.Name = "Featured Products";
            featuredCategoryModel.Id = -99999;
            featuredCategoryModel.Products = featuredProductsOverview;

            if (model.Count == 0)
                return Content("");

            CategoryContainerModel categoryModel = new CategoryContainerModel();

            categoryModel.Categories = model;
            categoryModel.FeaturedCategory = featuredCategoryModel;

            //p.SpecificationAttributeModels = this.PrepareProductSpecificationModel(_workContext,
            //       _specificationAttributeService,
            //       _cacheManager,
            //       parentPItem);

            //return PartialView(model);
            return PartialView(categoryModel);
        }