package com.salesmanager.shop.admin.controller.products; import com.salesmanager.core.business.services.catalog.category.CategoryService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.services.catalog.product.image.ProductImageService; import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService; import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService; import com.salesmanager.core.business.services.tax.TaxClassService; import com.salesmanager.core.business.utils.CoreConfiguration; import com.salesmanager.core.business.utils.ProductPriceUtils; import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse; import com.salesmanager.core.business.utils.ajax.AjaxResponse; import com.salesmanager.core.model.catalog.category.Category; import com.salesmanager.core.model.catalog.category.CategoryDescription; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute; import com.salesmanager.core.model.catalog.product.availability.ProductAvailability; import com.salesmanager.core.model.catalog.product.description.ProductDescription; import com.salesmanager.core.model.catalog.product.image.ProductImage; import com.salesmanager.core.model.catalog.product.image.ProductImageDescription; import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer; import com.salesmanager.core.model.catalog.product.price.ProductPrice; import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription; import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship; import com.salesmanager.core.model.catalog.product.type.ProductType; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.core.model.tax.taxclass.TaxClass; import com.salesmanager.shop.admin.model.web.Menu; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.utils.DateUtil; import com.salesmanager.shop.utils.LabelUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; import javax.imageio.ImageIO; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.awt.image.BufferedImage; import java.math.BigDecimal; import java.util.*; @Controller public class ProductController { private static final Logger LOGGER = LoggerFactory.getLogger(ProductController.class); @Inject private ProductService productService; @Inject private ManufacturerService manufacturerService; @Inject private ProductTypeService productTypeService; @Inject private ProductImageService productImageService; @Inject private TaxClassService taxClassService; @Inject private ProductPriceUtils priceUtil; @Inject LabelUtils messages; @Inject private CoreConfiguration configuration; @Inject CategoryService categoryService; @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/editProduct.html", method=RequestMethod.GET) public String displayProductEdit(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { return displayProduct(productId,model,request,response); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/viewEditProduct.html", method=RequestMethod.GET) public String displayProductEdit(@RequestParam("sku") String sku, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { Language language = (Language)request.getAttribute("LANGUAGE"); Product dbProduct = productService.getByCode(sku, language); long productId = -1;//non existent if(dbProduct!=null) { productId = dbProduct.getId(); } return displayProduct(productId,model,request,response); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/createProduct.html", method=RequestMethod.GET) public String displayProductCreate(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { return displayProduct(null,model,request,response); } private String displayProduct(Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { //display menu setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); Language language = (Language)request.getAttribute("LANGUAGE"); List<Manufacturer> manufacturers = manufacturerService.listByStore(store, language); List<ProductType> productTypes = productTypeService.list(); List<TaxClass> taxClasses = taxClassService.listByStore(store); List<Language> languages = store.getLanguages(); com.salesmanager.shop.admin.model.catalog.Product product = new com.salesmanager.shop.admin.model.catalog.Product(); List<ProductDescription> descriptions = new ArrayList<ProductDescription>(); if(productId!=null && productId!=0) {//edit mode Product dbProduct = productService.getById(productId); if(dbProduct==null || dbProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } product.setProduct(dbProduct); Set<ProductDescription> productDescriptions = dbProduct.getDescriptions(); for(Language l : languages) { ProductDescription productDesc = null; for(ProductDescription desc : productDescriptions) { Language lang = desc.getLanguage(); if(lang.getCode().equals(l.getCode())) { productDesc = desc; } } if(productDesc==null) { productDesc = new ProductDescription(); productDesc.setLanguage(l); } descriptions.add(productDesc); } for(ProductImage image : dbProduct.getImages()) { if(image.isDefaultImage()) { product.setProductImage(image); break; } } ProductAvailability productAvailability = null; ProductPrice productPrice = null; Set<ProductAvailability> availabilities = dbProduct.getAvailabilities(); if(availabilities!=null && availabilities.size()>0) { for(ProductAvailability availability : availabilities) { if(availability.getRegion().equals(com.salesmanager.core.business.constants.Constants.ALL_REGIONS)) { productAvailability = availability; Set<ProductPrice> prices = availability.getPrices(); for(ProductPrice price : prices) { if(price.isDefaultPrice()) { productPrice = price; product.setProductPrice(priceUtil.getAdminFormatedAmount(store, productPrice.getProductPriceAmount())); } } } } } if(productAvailability==null) { productAvailability = new ProductAvailability(); } if(productPrice==null) { productPrice = new ProductPrice(); } product.setAvailability(productAvailability); product.setPrice(productPrice); product.setDescriptions(descriptions); product.setDateAvailable(DateUtil.formatDate(dbProduct.getDateAvailable())); } else { for(Language l : languages) { ProductDescription desc = new ProductDescription(); desc.setLanguage(l); descriptions.add(desc); } Product prod = new Product(); prod.setAvailable(true); ProductAvailability productAvailability = new ProductAvailability(); ProductPrice price = new ProductPrice(); product.setPrice(price); product.setAvailability(productAvailability); product.setProduct(prod); product.setDescriptions(descriptions); product.setDateAvailable(DateUtil.formatDate(new Date())); } model.addAttribute("product",product); model.addAttribute("manufacturers", manufacturers); model.addAttribute("productTypes", productTypes); model.addAttribute("taxClasses", taxClasses); return "admin-products-edit"; } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/save.html", method=RequestMethod.POST) public String saveProduct(@Valid @ModelAttribute("product") com.salesmanager.shop.admin.model.catalog.Product product, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception { Language language = (Language)request.getAttribute("LANGUAGE"); //display menu setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); List<Manufacturer> manufacturers = manufacturerService.listByStore(store, language); List<ProductType> productTypes = productTypeService.list(); List<TaxClass> taxClasses = taxClassService.listByStore(store); List<Language> languages = store.getLanguages(); model.addAttribute("manufacturers", manufacturers); model.addAttribute("productTypes", productTypes); model.addAttribute("taxClasses", taxClasses); //validate price BigDecimal submitedPrice = null; try { submitedPrice = priceUtil.getAmount(product.getProductPrice()); } catch (Exception e) { ObjectError error = new ObjectError("productPrice",messages.getMessage("NotEmpty.product.productPrice", locale)); result.addError(error); } Date date = new Date(); if(!StringUtils.isBlank(product.getDateAvailable())) { try { date = DateUtil.getDate(product.getDateAvailable()); product.getAvailability().setProductDateAvailable(date); product.setDateAvailable(DateUtil.formatDate(date)); } catch (Exception e) { ObjectError error = new ObjectError("dateAvailable",messages.getMessage("message.invalid.date", locale)); result.addError(error); } } //validate image if(product.getImage()!=null && !product.getImage().isEmpty()) { try { String maxHeight = configuration.getProperty("PRODUCT_IMAGE_MAX_HEIGHT_SIZE"); String maxWidth = configuration.getProperty("PRODUCT_IMAGE_MAX_WIDTH_SIZE"); String maxSize = configuration.getProperty("PRODUCT_IMAGE_MAX_SIZE"); BufferedImage image = ImageIO.read(product.getImage().getInputStream()); if(!StringUtils.isBlank(maxHeight)) { int maxImageHeight = Integer.parseInt(maxHeight); if(image.getHeight()>maxImageHeight) { ObjectError error = new ObjectError("image",messages.getMessage("message.image.height", locale) + " {"+maxHeight+"}"); result.addError(error); } } if(!StringUtils.isBlank(maxWidth)) { int maxImageWidth = Integer.parseInt(maxWidth); if(image.getWidth()>maxImageWidth) { ObjectError error = new ObjectError("image",messages.getMessage("message.image.width", locale) + " {"+maxWidth+"}"); result.addError(error); } } if(!StringUtils.isBlank(maxSize)) { int maxImageSize = Integer.parseInt(maxSize); if(product.getImage().getSize()>maxImageSize) { ObjectError error = new ObjectError("image",messages.getMessage("message.image.size", locale) + " {"+maxSize+"}"); result.addError(error); } } } catch (Exception e) { LOGGER.error("Cannot validate product image", e); } } if (result.hasErrors()) { return "admin-products-edit"; } Product newProduct = product.getProduct(); ProductAvailability newProductAvailability = null; ProductPrice newProductPrice = null; Set<ProductPriceDescription> productPriceDescriptions = null; //get tax class //TaxClass taxClass = newProduct.getTaxClass(); //TaxClass dbTaxClass = taxClassService.getById(taxClass.getId()); Set<ProductPrice> prices = new HashSet<ProductPrice>(); Set<ProductAvailability> availabilities = new HashSet<ProductAvailability>(); if(product.getProduct().getId()!=null && product.getProduct().getId().longValue()>0) { //get actual product newProduct = productService.getById(product.getProduct().getId()); if(newProduct!=null && newProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } //copy properties newProduct.setSku(product.getProduct().getSku()); newProduct.setRefSku(product.getProduct().getRefSku()); newProduct.setAvailable(product.getProduct().isAvailable()); newProduct.setDateAvailable(date); newProduct.setManufacturer(product.getProduct().getManufacturer()); newProduct.setType(product.getProduct().getType()); newProduct.setProductHeight(product.getProduct().getProductHeight()); newProduct.setProductLength(product.getProduct().getProductLength()); newProduct.setProductWeight(product.getProduct().getProductWeight()); newProduct.setProductWidth(product.getProduct().getProductWidth()); newProduct.setProductVirtual(product.getProduct().isProductVirtual()); newProduct.setProductShipeable(product.getProduct().isProductShipeable()); newProduct.setTaxClass(product.getProduct().getTaxClass()); newProduct.setSortOrder(product.getProduct().getSortOrder()); Set<ProductAvailability> avails = newProduct.getAvailabilities(); if(avails !=null && avails.size()>0) { for(ProductAvailability availability : avails) { if(availability.getRegion().equals(com.salesmanager.core.business.constants.Constants.ALL_REGIONS)) { newProductAvailability = availability; Set<ProductPrice> productPrices = availability.getPrices(); for(ProductPrice price : productPrices) { if(price.isDefaultPrice()) { newProductPrice = price; newProductPrice.setProductPriceAmount(submitedPrice); productPriceDescriptions = price.getDescriptions(); } else { prices.add(price); } } } else { availabilities.add(availability); } } } for(ProductImage image : newProduct.getImages()) { if(image.isDefaultImage()) { product.setProductImage(image); } } } if(newProductPrice==null) { newProductPrice = new ProductPrice(); newProductPrice.setDefaultPrice(true); newProductPrice.setProductPriceAmount(submitedPrice); } if(product.getProductImage()!=null && product.getProductImage().getId() == null) { product.setProductImage(null); } if(productPriceDescriptions==null) { productPriceDescriptions = new HashSet<ProductPriceDescription>(); for(ProductDescription description : product.getDescriptions()) { ProductPriceDescription ppd = new ProductPriceDescription(); ppd.setProductPrice(newProductPrice); ppd.setLanguage(description.getLanguage()); ppd.setName(ProductPriceDescription.DEFAULT_PRICE_DESCRIPTION); productPriceDescriptions.add(ppd); } newProductPrice.setDescriptions(productPriceDescriptions); } newProduct.setMerchantStore(store); if(newProductAvailability==null) { newProductAvailability = new ProductAvailability(); } newProductAvailability.setProductQuantity(product.getAvailability().getProductQuantity()); newProductAvailability.setProductQuantityOrderMin(product.getAvailability().getProductQuantityOrderMin()); newProductAvailability.setProductQuantityOrderMax(product.getAvailability().getProductQuantityOrderMax()); newProductAvailability.setProduct(newProduct); newProductAvailability.setPrices(prices); availabilities.add(newProductAvailability); newProductPrice.setProductAvailability(newProductAvailability); prices.add(newProductPrice); newProduct.setAvailabilities(availabilities); Set<ProductDescription> descriptions = new HashSet<ProductDescription>(); if(product.getDescriptions()!=null && product.getDescriptions().size()>0) { for(ProductDescription description : product.getDescriptions()) { description.setProduct(newProduct); descriptions.add(description); } } newProduct.setDescriptions(descriptions); product.setDateAvailable(DateUtil.formatDate(date)); if(product.getImage()!=null && !product.getImage().isEmpty()) { String imageName = product.getImage().getOriginalFilename(); ProductImage productImage = new ProductImage(); productImage.setDefaultImage(true); productImage.setImage(product.getImage().getInputStream()); productImage.setProductImage(imageName); List<ProductImageDescription> imagesDescriptions = new ArrayList<ProductImageDescription>(); for(Language l : languages) { ProductImageDescription imageDescription = new ProductImageDescription(); imageDescription.setName(imageName); imageDescription.setLanguage(l); imageDescription.setProductImage(productImage); imagesDescriptions.add(imageDescription); } productImage.setDescriptions(imagesDescriptions); productImage.setProduct(newProduct); newProduct.getImages().add(productImage); //productService.saveOrUpdate(newProduct); //product displayed product.setProductImage(productImage); } //else { //productService.saveOrUpdate(newProduct); //} productService.create(newProduct); model.addAttribute("success","success"); return "admin-products-edit"; } /** * Creates a duplicate product with the same inner object graph * Will ignore SKU, reviews and images * @param id * @param result * @param model * @param request * @param locale * @return * @throws Exception */ @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/product/duplicate.html", method=RequestMethod.POST) public String duplicateProduct(@ModelAttribute("productId") Long id, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception { Language language = (Language)request.getAttribute("LANGUAGE"); //display menu setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); List<Manufacturer> manufacturers = manufacturerService.listByStore(store, language); List<ProductType> productTypes = productTypeService.list(); List<TaxClass> taxClasses = taxClassService.listByStore(store); model.addAttribute("manufacturers", manufacturers); model.addAttribute("productTypes", productTypes); model.addAttribute("taxClasses", taxClasses); Product dbProduct = productService.getById(id); Product newProduct = new Product(); if(dbProduct==null || dbProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } //Make a copy of the product com.salesmanager.shop.admin.model.catalog.Product product = new com.salesmanager.shop.admin.model.catalog.Product(); Set<ProductAvailability> availabilities = new HashSet<ProductAvailability>(); //availability - price for(ProductAvailability pAvailability : dbProduct.getAvailabilities()) { ProductAvailability availability = new ProductAvailability(); availability.setProductDateAvailable(pAvailability.getProductDateAvailable()); availability.setProductIsAlwaysFreeShipping(pAvailability.getProductIsAlwaysFreeShipping()); availability.setProductQuantity(pAvailability.getProductQuantity()); availability.setProductQuantityOrderMax(pAvailability.getProductQuantityOrderMax()); availability.setProductQuantityOrderMin(pAvailability.getProductQuantityOrderMin()); availability.setProductStatus(pAvailability.getProductStatus()); availability.setRegion(pAvailability.getRegion()); availability.setRegionVariant(pAvailability.getRegionVariant()); availability.setProduct(newProduct); Set<ProductPrice> prices = pAvailability.getPrices(); for(ProductPrice pPrice : prices) { ProductPrice price = new ProductPrice(); price.setDefaultPrice(pPrice.isDefaultPrice()); price.setProductPriceAmount(pPrice.getProductPriceAmount()); price.setProductAvailability(availability); price.setProductPriceSpecialAmount(pPrice.getProductPriceSpecialAmount()); price.setProductPriceSpecialEndDate(pPrice.getProductPriceSpecialEndDate()); price.setProductPriceSpecialStartDate(pPrice.getProductPriceSpecialStartDate()); price.setProductPriceType(pPrice.getProductPriceType()); Set<ProductPriceDescription> priceDescriptions = new HashSet<ProductPriceDescription>(); //price descriptions for(ProductPriceDescription pPriceDescription : pPrice.getDescriptions()) { ProductPriceDescription productPriceDescription = new ProductPriceDescription(); productPriceDescription.setAuditSection(pPriceDescription.getAuditSection()); productPriceDescription.setDescription(pPriceDescription.getDescription()); productPriceDescription.setName(pPriceDescription.getName()); productPriceDescription.setLanguage(pPriceDescription.getLanguage()); productPriceDescription.setProductPrice(price); priceDescriptions.add(productPriceDescription); } price.setDescriptions(priceDescriptions); if(price.isDefaultPrice()) { product.setPrice(price); product.setProductPrice(priceUtil.getAdminFormatedAmount(store, price.getProductPriceAmount())); } availability.getPrices().add(price); } if(availability.getRegion().equals(com.salesmanager.core.business.constants.Constants.ALL_REGIONS)) { product.setAvailability(availability); } availabilities.add(availability); } newProduct.setAvailabilities(availabilities); //attributes Set<ProductAttribute> attributes = new HashSet<ProductAttribute>(); for(ProductAttribute pAttribute : dbProduct.getAttributes()) { ProductAttribute attribute = new ProductAttribute(); attribute.setAttributeDefault(pAttribute.getAttributeDefault()); attribute.setAttributeDiscounted(pAttribute.getAttributeDiscounted()); attribute.setAttributeDisplayOnly(pAttribute.getAttributeDisplayOnly()); attribute.setAttributeRequired(pAttribute.getAttributeRequired()); attribute.setProductAttributePrice(pAttribute.getProductAttributePrice()); attribute.setProductAttributeIsFree(pAttribute.getProductAttributeIsFree()); attribute.setProductAttributeWeight(pAttribute.getProductAttributeWeight()); attribute.setProductOption(pAttribute.getProductOption()); attribute.setProductOptionSortOrder(pAttribute.getProductOptionSortOrder()); attribute.setProductOptionValue(pAttribute.getProductOptionValue()); attributes.add(attribute); } newProduct.setAttributes(attributes); //relationships Set<ProductRelationship> relationships = new HashSet<ProductRelationship>(); for(ProductRelationship pRelationship : dbProduct.getRelationships()) { ProductRelationship relationship = new ProductRelationship(); relationship.setActive(pRelationship.isActive()); relationship.setCode(pRelationship.getCode()); relationship.setRelatedProduct(pRelationship.getRelatedProduct()); relationship.setStore(store); relationships.add(relationship); } newProduct.setRelationships(relationships); //product description Set<ProductDescription> descsset = new HashSet<ProductDescription>(); List<ProductDescription> desclist = new ArrayList<ProductDescription>(); Set<ProductDescription> descriptions = dbProduct.getDescriptions(); for(ProductDescription pDescription : descriptions) { ProductDescription description = new ProductDescription(); description.setAuditSection(pDescription.getAuditSection()); description.setName(pDescription.getName()); description.setDescription(pDescription.getDescription()); description.setLanguage(pDescription.getLanguage()); description.setMetatagDescription(pDescription.getMetatagDescription()); description.setMetatagKeywords(pDescription.getMetatagKeywords()); description.setMetatagTitle(pDescription.getMetatagTitle()); description.setProduct(newProduct); descsset.add(description); desclist.add(description); } newProduct.setDescriptions(descsset); product.setDescriptions(desclist); //product newProduct.setAuditSection(dbProduct.getAuditSection()); newProduct.setAvailable(dbProduct.isAvailable()); //copy // newProduct.setCategories(dbProduct.getCategories()); newProduct.setDateAvailable(dbProduct.getDateAvailable()); newProduct.setManufacturer(dbProduct.getManufacturer()); newProduct.setMerchantStore(store); newProduct.setProductHeight(dbProduct.getProductHeight()); newProduct.setProductIsFree(dbProduct.getProductIsFree()); newProduct.setProductLength(dbProduct.getProductLength()); newProduct.setProductOrdered(dbProduct.getProductOrdered()); newProduct.setProductWeight(dbProduct.getProductWeight()); newProduct.setProductWidth(dbProduct.getProductWidth()); newProduct.setSortOrder(dbProduct.getSortOrder()); newProduct.setTaxClass(dbProduct.getTaxClass()); newProduct.setType(dbProduct.getType()); newProduct.setSku(UUID.randomUUID().toString().replace("-","")); newProduct.setProductVirtual(dbProduct.isProductVirtual()); newProduct.setProductShipeable(dbProduct.isProductShipeable()); productService.update(newProduct); Set<Category> categories = dbProduct.getCategories(); for(Category category : categories) { Category categoryCopy = categoryService.getById(category.getId()); newProduct.getCategories().add(categoryCopy); productService.update(newProduct); } product.setProduct(newProduct); model.addAttribute("product", product); model.addAttribute("success","success"); return "redirect:/admin/products/editProduct.html?id=" + newProduct.getId(); } /** * Removes a product image based on the productimage id * @param request * @param response * @param locale * @return */ @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/product/removeImage.html") public @ResponseBody ResponseEntity<String> removeImage(HttpServletRequest request, HttpServletResponse response, Locale locale) { String iid = request.getParameter("imageId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); try { Long id = Long.parseLong(iid); ProductImage productImage = productImageService.getById(id); if(productImage==null || productImage.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) { resp.setStatusMessage(messages.getMessage("message.unauthorized", locale)); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); } else { productImageService.removeProductImage(productImage); resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED); } } catch (Exception e) { LOGGER.error("Error while deleting product", e); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); resp.setErrorMessage(e); } String returnString = resp.toJSONString(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } /** * List all categories and let the merchant associate the product to a category * @param productId * @param model * @param request * @param response * @return * @throws Exception */ @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/displayProductToCategories.html", method=RequestMethod.GET) public String displayAddProductToCategories(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); Language language = (Language)request.getAttribute("LANGUAGE"); //get the product and validate it belongs to the current merchant Product product = productService.getById(productId); if(product==null) { return "redirect:/admin/products/products.html"; } if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } //get parent categories List<Category> categories = categoryService.listByStore(store,language); model.addAttribute("product", product); model.addAttribute("categories", categories); return "catalogue-product-categories"; } /** * List all categories associated to a Product * @param request * @param response * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/product-categories/paging.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> pageProductCategories(HttpServletRequest request, HttpServletResponse response) { String sProductId = request.getParameter("productId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); Long productId; Product product = null; try { productId = Long.parseLong(sProductId); } catch (Exception e) { resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE); resp.setErrorString("Product id is not valid"); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } try { product = productService.getById(productId); if(product==null) { resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE); resp.setErrorString("Product id is not valid"); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) { resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE); resp.setErrorString("Product id is not valid"); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } Language language = (Language)request.getAttribute("LANGUAGE"); Set<Category> categories = product.getCategories(); for(Category category : categories) { Map entry = new HashMap(); entry.put("categoryId", category.getId()); List<CategoryDescription> descriptions = category.getDescriptions(); String categoryName = category.getDescriptions().get(0).getName(); for(CategoryDescription description : descriptions){ if(description.getLanguage().getCode().equals(language.getCode())) { categoryName = description.getName(); } } entry.put("name", categoryName); resp.addDataEntry(entry); } resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS); } catch (Exception e) { LOGGER.error("Error while paging products", e); resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE); resp.setErrorMessage(e); } String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/product-categories/remove.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> deleteProductFromCategory(HttpServletRequest request, HttpServletResponse response, Locale locale) { String sCategoryid = request.getParameter("categoryId"); String sProductId = request.getParameter("productId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); try { Long categoryId = Long.parseLong(sCategoryid); Long productId = Long.parseLong(sProductId); Category category = categoryService.getById(categoryId); Product product = productService.getById(productId); if(category==null || category.getMerchantStore().getId()!=store.getId()) { resp.setStatusMessage(messages.getMessage("message.unauthorized", locale)); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } if(product==null || product.getMerchantStore().getId()!=store.getId()) { resp.setStatusMessage(messages.getMessage("message.unauthorized", locale)); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } product.getCategories().remove(category); productService.update(product); resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED); } catch (Exception e) { LOGGER.error("Error while deleting category", e); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); resp.setErrorMessage(e); } String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/addProductToCategories.html", method=RequestMethod.POST) public String addProductToCategory(@RequestParam("productId") long productId, @RequestParam("id") long categoryId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); Language language = (Language)request.getAttribute("LANGUAGE"); //get the product and validate it belongs to the current merchant Product product = productService.getById(productId); if(product==null) { return "redirect:/admin/products/products.html"; } if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } //get parent categories List<Category> categories = categoryService.listByStore(store,language); Category category = categoryService.getById(categoryId); if(category==null) { return "redirect:/admin/products/products.html"; } if(category.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:/admin/products/products.html"; } product.getCategories().add(category); productService.update(product); model.addAttribute("product", product); model.addAttribute("categories", categories); return "catalogue-product-categories"; } private void setMenu(Model model, HttpServletRequest request) throws Exception { //display menu Map<String,String> activeMenus = new HashMap<String,String>(); activeMenus.put("catalogue", "catalogue"); activeMenus.put("catalogue-products", "catalogue-products"); @SuppressWarnings("unchecked") Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP"); Menu currentMenu = (Menu)menus.get("catalogue"); model.addAttribute("currentMenu",currentMenu); model.addAttribute("activeMenus",activeMenus); // } }