// Product details page > back in stock subscribe public ActionResult SubscribePopup(int productId) { var product = _productService.GetProductById(productId); if (product == null || product.Deleted) { throw new ArgumentException("No product found with the specified id"); } var model = new BackInStockSubscribeModel(); model.ProductId = product.Id; model.ProductName = product.GetLocalized(x => x.Name); model.ProductSeName = product.GetSeName(); model.IsCurrentCustomerRegistered = _workContext.CurrentCustomer.IsRegistered(); model.MaximumBackInStockSubscriptions = _catalogSettings.MaximumBackInStockSubscriptions; model.CurrentNumberOfBackInStockSubscriptions = _backInStockSubscriptionService .GetAllSubscriptionsByCustomerId(_workContext.CurrentCustomer.Id, _storeContext.CurrentStore.Id, 0, 1) .TotalCount; if (product.ManageInventoryMethod == ManageInventoryMethod.ManageStock && product.BackorderMode == BackorderMode.NoBackorders && product.AllowBackInStockSubscriptions && product.GetTotalStockQuantity() <= 0) { //out of stock model.SubscriptionAllowed = true; model.AlreadySubscribed = _backInStockSubscriptionService .FindSubscription(_workContext.CurrentCustomer.Id, product.Id, _storeContext.CurrentStore.Id) != null; } return(View(model)); }
public ActionResult BackInStockSubscribePopup(int id /* productId */) { var product = _productService.GetProductById(id); if (product == null || product.Deleted || product.IsSystemProduct) { throw new ArgumentException(T("Products.NotFound", id)); } var customer = _services.WorkContext.CurrentCustomer; var store = _services.StoreContext.CurrentStore; var model = new BackInStockSubscribeModel(); model.ProductId = product.Id; model.ProductName = product.GetLocalized(x => x.Name); model.ProductSeName = product.GetSeName(); model.IsCurrentCustomerRegistered = customer.IsRegistered(); model.MaximumBackInStockSubscriptions = _catalogSettings.MaximumBackInStockSubscriptions; model.CurrentNumberOfBackInStockSubscriptions = _backInStockSubscriptionService .GetAllSubscriptionsByCustomerId(customer.Id, store.Id, 0, 1) .TotalCount; if (product.ManageInventoryMethod == ManageInventoryMethod.ManageStock && product.BackorderMode == BackorderMode.NoBackorders && product.AllowBackInStockSubscriptions && product.StockQuantity <= 0) { // Out of stock. model.SubscriptionAllowed = true; model.AlreadySubscribed = _backInStockSubscriptionService.FindSubscription(customer.Id, product.Id, store.Id) != null; } return(View("BackInStockSubscribePopup", model)); }
// Product details page > back in stock subscribe button public virtual async Task <IActionResult> SubscribeButton(string productId, string warehouseId) { var product = await _productService.GetProductById(productId); if (product == null) { throw new ArgumentException("No product found with the specified id"); } var customer = _workContext.CurrentCustomer; if (!customer.IsRegistered()) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); } if (product.ManageInventoryMethod != ManageInventoryMethod.ManageStock) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); } warehouseId = _shoppingCartSettings.AllowToSelectWarehouse ? (string.IsNullOrEmpty(warehouseId) ? "" : warehouseId) : (string.IsNullOrEmpty(_storeContext.CurrentStore.DefaultWarehouseId) ? product.WarehouseId : _storeContext.CurrentStore.DefaultWarehouseId); var subscription = await _backInStockSubscriptionService .FindSubscription(customer.Id, product.Id, null, _storeContext.CurrentStore.Id, warehouseId); if (subscription != null) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.DeleteNotifyWhenAvailable"))); } return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); }
// Product details page > back in stock subscribe public virtual async Task <IActionResult> SubscribePopup(string productId) { var product = await _productService.GetProductById(productId); if (product == null) { throw new ArgumentException("No product found with the specified id"); } var customer = _workContext.CurrentCustomer; var store = _storeContext.CurrentStore; var model = new BackInStockSubscribeModel(); model.ProductId = product.Id; model.ProductName = product.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id); model.ProductSeName = product.GetSeName(_workContext.WorkingLanguage.Id); model.IsCurrentCustomerRegistered = customer.IsRegistered(); model.MaximumBackInStockSubscriptions = _catalogSettings.MaximumBackInStockSubscriptions; model.CurrentNumberOfBackInStockSubscriptions = (await _backInStockSubscriptionService .GetAllSubscriptionsByCustomerId(customer.Id, store.Id, 0, 1)) .TotalCount; if (product.ManageInventoryMethod == ManageInventoryMethod.ManageStock && product.BackorderMode == BackorderMode.NoBackorders && product.AllowBackInStockSubscriptions && product.GetTotalStockQuantity(warehouseId: store.DefaultWarehouseId) <= 0) { //out of stock model.SubscriptionAllowed = true; model.AlreadySubscribed = (await _backInStockSubscriptionService .FindSubscription(customer.Id, product.Id, store.Id, product.UseMultipleWarehouses ? store.DefaultWarehouseId : "")) != null; } return(View(model)); }
// Product details page > back in stock subscribe public virtual IActionResult SubscribePopup(int productId) { var product = _productService.GetProductById(productId); if (product == null || product.Deleted) { throw new ArgumentException("No product found with the specified id"); } BackInStockSubscribeModel model = new BackInStockSubscribeModel(); model = new BackInStockSubscribeModel { ProductId = product.Id, ImageUrl = _pictureService.GetPictureUrl(product.ProductPictures.FirstOrDefault()?.Picture), //ProductCategoryName = product.ProductCategories.FirstOrDefault()?.Category.ParentCategoryId == null ? product.ProductCategories.FirstOrDefault()?.Category.Name : _categoryService.GetCategoryById(product.ProductCategories.FirstOrDefault()?.Category.ParentCategoryId ?? 0).Name, ProductPrice = _priceFormatter.FormatPrice(product.Price), ProductName = _localizationService.GetLocalized(product, x => x.Name), ProductSeName = _urlRecordService.GetSeName(product), IsCurrentCustomerRegistered = _workContext.CurrentCustomer.IsRegistered(), MaximumBackInStockSubscriptions = _catalogSettings.MaximumBackInStockSubscriptions, CurrentNumberOfBackInStockSubscriptions = _backInStockSubscriptionService .GetAllSubscriptionsByCustomerId(_workContext.CurrentCustomer.Id, _storeContext.CurrentStore.Id, 0, 1) .TotalCount }; if (product.BackorderMode == BackorderMode.NoBackorders && _productService.GetTotalStockQuantity(product) <= 0) { //out of stock model.SubscriptionAllowed = true; model.AlreadySubscribed = _backInStockSubscriptionService .FindSubscription(_workContext.CurrentCustomer.Id, product.Id, _storeContext.CurrentStore.Id) != null; } return(PartialView(model)); }
// Product details page > back in stock subscribe button public virtual async Task <IActionResult> SubscribeButton(string productId) { var product = await _productService.GetProductById(productId); if (product == null) { throw new ArgumentException("No product found with the specified id"); } var customer = _workContext.CurrentCustomer; var store = _storeContext.CurrentStore; if (!customer.IsRegistered()) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); } if (product.ManageInventoryMethod != ManageInventoryMethod.ManageStock) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); } var subscription = await _backInStockSubscriptionService .FindSubscription(customer.Id, product.Id, string.Empty, _storeContext.CurrentStore.Id, product.UseMultipleWarehouses?_storeContext.CurrentStore.DefaultWarehouseId : ""); if (subscription != null) { return(Content(_localizationService.GetResource("BackInStockSubscriptions.DeleteNotifyWhenAvailable"))); } return(Content(_localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"))); }
public async Task <ProductDetailsAttributeChangeModel> Handle(GetProductDetailsAttributeChange request, CancellationToken cancellationToken) { var model = new ProductDetailsAttributeChangeModel(); string attributeXml = await _mediator.Send(new GetParseProductAttributes() { Product = request.Product, Form = request.Form }); string warehouseId = _shoppingCartSettings.AllowToSelectWarehouse ? request.Form["WarehouseId"].ToString() : request.Product.UseMultipleWarehouses ? request.Store.DefaultWarehouseId : (string.IsNullOrEmpty(request.Store.DefaultWarehouseId) ? request.Product.WarehouseId : request.Store.DefaultWarehouseId); //rental attributes DateTime?rentalStartDate = null; DateTime?rentalEndDate = null; if (request.Product.ProductType == ProductType.Reservation) { request.Product.ParseReservationDates(request.Form, out rentalStartDate, out rentalEndDate); } model.Sku = request.Product.FormatSku(attributeXml, _productAttributeParser); model.Mpn = request.Product.FormatMpn(attributeXml, _productAttributeParser); model.Gtin = request.Product.FormatGtin(attributeXml, _productAttributeParser); if (await _permissionService.Authorize(StandardPermissionProvider.DisplayPrices) && !request.Product.CustomerEntersPrice && request.Product.ProductType != ProductType.Auction) { //we do not calculate price of "customer enters price" option is enabled var unitprice = await _priceCalculationService.GetUnitPrice(request.Product, request.Customer, ShoppingCartType.ShoppingCart, 1, attributeXml, 0, rentalStartDate, rentalEndDate, true); decimal discountAmount = unitprice.discountAmount; List <AppliedDiscount> scDiscounts = unitprice.appliedDiscounts; decimal finalPrice = unitprice.unitprice; var productprice = await _taxService.GetProductPrice(request.Product, finalPrice); decimal finalPriceWithDiscountBase = productprice.productprice; decimal taxRate = productprice.taxRate; decimal finalPriceWithDiscount = await _currencyService.ConvertFromPrimaryStoreCurrency(finalPriceWithDiscountBase, request.Currency); model.Price = _priceFormatter.FormatPrice(finalPriceWithDiscount); } //stock model.StockAvailability = request.Product.FormatStockMessage(warehouseId, attributeXml, _localizationService, _productAttributeParser); //back in stock subscription if ((request.Product.ManageInventoryMethod == ManageInventoryMethod.ManageStockByAttributes || request.Product.ManageInventoryMethod == ManageInventoryMethod.ManageStock) && request.Product.BackorderMode == BackorderMode.NoBackorders && request.Product.AllowBackInStockSubscriptions) { var combination = _productAttributeParser.FindProductAttributeCombination(request.Product, attributeXml); if (combination != null) { if (request.Product.GetTotalStockQuantityForCombination(combination, warehouseId: request.Store.DefaultWarehouseId) <= 0) { model.DisplayBackInStockSubscription = true; } } if (request.Product.ManageInventoryMethod == ManageInventoryMethod.ManageStock) { model.DisplayBackInStockSubscription = request.Product.AllowBackInStockSubscriptions; attributeXml = ""; } var subscription = await _backInStockSubscriptionService .FindSubscription(request.Customer.Id, request.Product.Id, attributeXml, request.Store.Id, warehouseId); if (subscription != null) { model.ButtonTextBackInStockSubscription = _localizationService.GetResource("BackInStockSubscriptions.DeleteNotifyWhenAvailable"); } else { model.ButtonTextBackInStockSubscription = _localizationService.GetResource("BackInStockSubscriptions.NotifyMeWhenAvailable"); } } //conditional attributes if (request.ValidateAttributeConditions) { var attributes = request.Product.ProductAttributeMappings; foreach (var attribute in attributes) { var conditionMet = _productAttributeParser.IsConditionMet(request.Product, attribute, attributeXml); if (conditionMet.HasValue) { if (conditionMet.Value) { model.EnabledAttributeMappingIds.Add(attribute.Id); } else { model.DisabledAttributeMappingids.Add(attribute.Id); } } } } //picture. used when we want to override a default product picture when some attribute is selected if (request.LoadPicture) { //first, try to get product attribute combination picture var pictureId = request.Product.ProductAttributeCombinations.Where(x => x.AttributesXml == attributeXml).FirstOrDefault()?.PictureId ?? ""; //then, let's see whether we have attribute values with pictures if (string.IsNullOrEmpty(pictureId)) { pictureId = _productAttributeParser.ParseProductAttributeValues(request.Product, attributeXml) .FirstOrDefault(attributeValue => !string.IsNullOrEmpty(attributeValue.PictureId))?.PictureId ?? ""; } if (!string.IsNullOrEmpty(pictureId)) { var pictureModel = new PictureModel { Id = pictureId, FullSizeImageUrl = await _pictureService.GetPictureUrl(pictureId), ImageUrl = await _pictureService.GetPictureUrl(pictureId, _mediaSettings.ProductDetailsPictureSize) }; model.PictureFullSizeUrl = pictureModel.FullSizeImageUrl; model.PictureDefaultSizeUrl = pictureModel.ImageUrl; } } return(model); }