package com.salesmanager.shop.admin.controller.products;
import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.utils.CoreConfiguration;
import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.admin.controller.ControllerConstants;
import com.salesmanager.shop.admin.controller.customers.CustomerController;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
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.util.*;
@Controller
public class ManufacturerController {
@Inject
private LanguageService languageService;
@Inject
private ManufacturerService manufacturerService;
@Inject
LabelUtils messages;
@Inject
private CoreConfiguration configuration;
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class);
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/list.html", method=RequestMethod.GET)
public String getManufacturers(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.setMenu(model, request);
return ControllerConstants.Tiles.Product.manufacturerList;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/create.html", method=RequestMethod.GET)
public String createManufacturer( Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
return displayManufacturer(null,model,request,response);
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/edit.html", method=RequestMethod.GET)
public String editManufacturer(@RequestParam("id") long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
return displayManufacturer(manufacturerId,model,request,response);
}
private String displayManufacturer(Long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
//display menu
setMenu(model,request);
//List<Language> languages = languageService.getLanguages();
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
List<Language> languages = store.getLanguages();
com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer = new com.salesmanager.shop.admin.model.catalog.Manufacturer();
List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
if( manufacturerId!=null && manufacturerId.longValue()!=0) { //edit mode
Manufacturer dbManufacturer = new Manufacturer();
dbManufacturer = manufacturerService.getById( manufacturerId );
if(dbManufacturer==null) {
return ControllerConstants.Tiles.Product.manufacturerList;
}
if(dbManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return ControllerConstants.Tiles.Product.manufacturerList;
}
Set<ManufacturerDescription> manufacturerDescriptions = dbManufacturer.getDescriptions();
for(Language l : languages) {
ManufacturerDescription manufDescription = null;
if(manufacturerDescriptions!=null) {
for(ManufacturerDescription desc : manufacturerDescriptions) {
String code = desc.getLanguage().getCode();
if(code.equals(l.getCode())) {
manufDescription = desc;
}
}
}
if(manufDescription==null) {
manufDescription = new ManufacturerDescription();
manufDescription.setLanguage(l);
}
manufacturer.getDescriptions().add(manufDescription);
}
manufacturer.setManufacturer( dbManufacturer );
manufacturer.setCode(dbManufacturer.getCode());
manufacturer.setOrder( dbManufacturer.getOrder() );
} else { // Create mode
Manufacturer manufacturerTmp = new Manufacturer();
manufacturer.setManufacturer( manufacturerTmp );
for(Language l : languages) {// for each store language
ManufacturerDescription manufacturerDesc = new ManufacturerDescription();
manufacturerDesc.setLanguage(l);
descriptions.add( manufacturerDesc );
manufacturer.setDescriptions(descriptions);
}
}
model.addAttribute("languages",languages);
model.addAttribute("manufacturer", manufacturer);
return ControllerConstants.Tiles.Product.manufacturerDetails;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/save.html", method=RequestMethod.POST)
public String saveManufacturer( @Valid @ModelAttribute("manufacturer") com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
this.setMenu(model, request);
//save or edit a manufacturer
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
List<Language> languages = languageService.getLanguages();
if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
for(ManufacturerDescription description : manufacturer.getDescriptions()) {
//validate Url Clicked
/* if ( description.getUrlClicked() != null && !description.getUrlClicked().toString().isEmpty()) {
try{
Integer.parseInt( description.getUrlClicked().toString() );
} catch (Exception e) {
ObjectError error = new ObjectError("descriptions[${counter.index}].urlClicked","URL Clicked must be a number");
result.addError(error);
}
}*/
}
}
//validate image
if(manufacturer.getImage()!=null && !manufacturer.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(manufacturer.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(manufacturer.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 manufacturer image", e);
}
}
if (result.hasErrors()) {
model.addAttribute("languages",languages);
return ControllerConstants.Tiles.Product.manufacturerDetails;
}
Manufacturer newManufacturer = manufacturer.getManufacturer();
if ( manufacturer.getManufacturer().getId() !=null && manufacturer.getManufacturer().getId() > 0 ){
newManufacturer = manufacturerService.getById( manufacturer.getManufacturer().getId() );
if(newManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return ControllerConstants.Tiles.Product.manufacturerList;
}
}
// for(ManufacturerImage image : manufacturer.getImages()) {
// if(image.isDefaultImage()) {
// manufacturer.setProductImage(image);
// }
// }
Set<ManufacturerDescription> descriptions = new HashSet<ManufacturerDescription>();
if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
for(ManufacturerDescription desc : manufacturer.getDescriptions()) {
desc.setManufacturer(newManufacturer);
descriptions.add(desc);
}
}
newManufacturer.setDescriptions(descriptions );
newManufacturer.setOrder( manufacturer.getOrder() );
newManufacturer.setMerchantStore(store);
newManufacturer.setCode(manufacturer.getCode());
// if(manufacturer.getManufacturerImage()!=null && manufacturer.getManufacturerImage().getId() == null) {
// newManufacturer.setProductImage(null);
// }
if(manufacturer.getImage()!=null && !manufacturer.getImage().isEmpty()) {
//
// String imageName = manufacturer.getImage().getOriginalFilename();
//
// ManufacturerImage manufacturerImage = new ManufacturerImage();
// manufacturerImage.setDefaultImage(true);
// manufacturerImage.setImage(manufacturer.getImage().getInputStream());
// manufacturerImage.setManufacturerImage(imageName);
//
// List<ManufacturerImageDescription> imagesDescriptions = new ArrayList<ManufacturerImageDescription>();
//
// for(Language l : languages) {
//
// ManufacturerImageDescription imageDescription = new ManufacturerImageDescription();
// imageDescription.setName(imageName);
// imageDescription.setLanguage(l);
// imageDescription.setManufacturerImage(productImage);
// imagesDescriptions.add(imageDescription);
//
// }
//
// manufacturerImage.setDescriptions(imagesDescriptions);
// manufacturerImage.setProduct(newManufacturer);
//
// newManufacturer.getImages().add(manufacturerImage);
//
// manufacturerService.saveOrUpdate(newManufacturer);
//
// //manufacturer displayed
// manufacturer.setProductImage(manufacturerImage);
} else {
manufacturerService.saveOrUpdate(newManufacturer);
}
model.addAttribute("manufacturer", manufacturer);
model.addAttribute("languages",languages);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Product.manufacturerDetails;
}
@SuppressWarnings("unchecked")
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/paging.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> pageManufacturers(HttpServletRequest request, HttpServletResponse response) {
AjaxResponse resp = new AjaxResponse();
try {
Language language = (Language)request.getAttribute("LANGUAGE");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
List<Manufacturer> manufacturers = null;
manufacturers = manufacturerService.listByStore(store, language);
for(Manufacturer manufacturer : manufacturers) {
@SuppressWarnings("rawtypes")
Map entry = new HashMap();
entry.put("id", manufacturer.getId());
ManufacturerDescription description = manufacturer.getDescriptions().iterator().next();
entry.put("name", description.getName());
entry.put("code", manufacturer.getCode());
entry.put("order", manufacturer.getOrder());
resp.addDataEntry(entry);
}
resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
} catch (Exception e) {
LOGGER.error("Error while paging Manufacturers", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
}
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
String returnString = resp.toJSONString();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/catalogue/manufacturer/remove.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> deleteManufacturer(HttpServletRequest request, HttpServletResponse response, Locale locale) {
Long sid = Long.valueOf(request.getParameter("id") );
AjaxResponse resp = new AjaxResponse();
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
try{
Manufacturer delManufacturer = manufacturerService.getById( sid );
if(delManufacturer==null || delManufacturer.getMerchantStore().getId().intValue() != store.getId().intValue()) {
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);
}
int count = manufacturerService.getCountManufAttachedProducts( delManufacturer ).intValue();
//IF already attached to products it can't be deleted
if ( count > 0 ){
resp.setStatusMessage(messages.getMessage("message.product.association", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
manufacturerService.delete( delManufacturer );
resp.setStatusMessage(messages.getMessage("message.success", locale));
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
} catch (Exception e) {
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
LOGGER.error("Cannot delete manufacturer.", e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/manufacturer/checkCode.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> checkCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
String code = request.getParameter("code");
String id = request.getParameter("id");
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
if(StringUtils.isBlank(code)) {
resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
try {
Manufacturer manufacturer = manufacturerService.getByCode(store, code);
if(manufacturer!=null && StringUtils.isBlank(id)) {
resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
if(manufacturer!=null && !StringUtils.isBlank(id)) {
try {
Long lid = Long.parseLong(id);
if(manufacturer.getCode().equals(code) && manufacturer.getId().longValue()==lid) {
resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
} catch (Exception e) {
resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
}
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
} catch (Exception e) {
LOGGER.error("Error while getting category", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
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("manufacturer-list", "manufacturer-list");
@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);
}
}