package com.salesmanager.shop.admin.controller.customers;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.customer.attribute.*;
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.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.LabelUtils;
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.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@Controller
public class CustomerOptionsSetController {
@Inject
private LanguageService languageService;
@Inject
private CustomerOptionSetService customerOptionSetService;
@Inject
private CustomerOptionService customerOptionService;
@Inject
private CustomerOptionValueService customerOptionValueService;
@Inject
private LabelUtils messages;
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerOptionsSetController.class);
@PreAuthorize("hasRole('CUSTOMER')")
@RequestMapping(value="/admin/customers/optionsset/list.html", method=RequestMethod.GET)
public String displayOptions(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
Language language = languageService.toLanguage(locale);
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
//get options
List<CustomerOption> options = customerOptionService.listByStore(store, language);
//get values
List<CustomerOptionValue> optionsValues = customerOptionValueService.listByStore(store, language);
CustomerOptionSet optionSet = new CustomerOptionSet();
model.addAttribute("optionSet", optionSet);
model.addAttribute("options", options);
model.addAttribute("optionsValues", optionsValues);
return ControllerConstants.Tiles.Customer.optionsSet;
}
@PreAuthorize("hasRole('CUSTOMER')")
@RequestMapping(value="/admin/customers/optionsset/save.html", method=RequestMethod.POST)
public String saveOptionSet(@Valid @ModelAttribute("optionSet") CustomerOptionSet optionSet, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
//display menu
setMenu(model,request);
Language language = languageService.toLanguage(locale);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
/** reference objects **/
//get options
List<CustomerOption> options = customerOptionService.listByStore(store, language);
//get values
List<CustomerOptionValue> optionsValues = customerOptionValueService.listByStore(store, language);
model.addAttribute("options", options);
model.addAttribute("optionsValues", optionsValues);
if(optionSet.getCustomerOption()==null || optionSet.getCustomerOptionValue()==null) {
model.addAttribute("errorMessageAssociation",messages.getMessage("message.optionset.noassociation", locale));
ObjectError error = new ObjectError("customerOptionValue.id",messages.getMessage("message.optionset.noassociation", locale));
result.addError(error);
return ControllerConstants.Tiles.Customer.optionsSet;
}
//see if association already exist
CustomerOption option = null;
//get from DB
//option = customerOptionService.getById(optionSet.getPk().getCustomerOption().getId());
option = customerOptionService.getById(optionSet.getCustomerOption().getId());
if(option==null) {
return "redirect:/admin/customers/optionsset/list.html";
}
//CustomerOptionValue optionValue = customerOptionValueService.getById(optionSet.getPk().getCustomerOptionValue().getId());
CustomerOptionValue optionValue = customerOptionValueService.getById(optionSet.getCustomerOptionValue().getId());
if(optionValue==null) {
return "redirect:/admin/customers/optionsset/list.html";
}
List<CustomerOptionSet> optionsSet = customerOptionSetService.listByStore(store, language);
if(optionsSet!=null && optionsSet.size()>0) {
for(CustomerOptionSet optSet : optionsSet) {
//CustomerOption opt = optSet.getPk().getCustomerOption();
CustomerOption opt = optSet.getCustomerOption();
//CustomerOptionValue optValue = optSet.getPk().getCustomerOptionValue();
CustomerOptionValue optValue = optSet.getCustomerOptionValue();
//if(opt.getId().longValue()==optionSet.getPk().getCustomerOption().getId().longValue()
if(opt.getId().longValue()==optionSet.getCustomerOption().getId().longValue()
//&& optValue.getId().longValue() == optionSet.getPk().getCustomerOptionValue().getId().longValue()) {
&& optValue.getId().longValue() == optionSet.getCustomerOptionValue().getId().longValue()) {
model.addAttribute("errorMessageAssociation",messages.getMessage("message.optionset.optionassociationexists", locale));
ObjectError error = new ObjectError("customerOptionValue.id",messages.getMessage("message.optionset.optionassociationexists", locale));
result.addError(error);
break;
}
}
}
if (result.hasErrors()) {
return ControllerConstants.Tiles.Customer.optionsSet;
}
//optionSet.getPk().setCustomerOption(option);
optionSet.setCustomerOption(option);
//optionSet.getPk().setCustomerOptionValue(optionValue);
optionSet.setCustomerOptionValue(optionValue);
customerOptionSetService.create(optionSet);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Customer.optionsSet;
}
@SuppressWarnings("unchecked")
@PreAuthorize("hasRole('CUSTOMER')")
@RequestMapping(value="/admin/customers/optionsset/paging.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> pageOptionsSet(HttpServletRequest request, HttpServletResponse response) {
AjaxResponse resp = new AjaxResponse();
try {
Language language = (Language)request.getAttribute("LANGUAGE");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
//List<CustomerOption> options = null;
List<CustomerOptionSet> optionSet = customerOptionSetService.listByStore(store, language);
//for(CustomerOption option : options) {
//Set<CustomerOptionSet> optionSet = option.getCustomerOptions();
if(optionSet!=null && optionSet.size()>0) {
for(CustomerOptionSet optSet : optionSet) {
//CustomerOption customerOption = optSet.getPk().getCustomerOption();
CustomerOption customerOption = optSet.getCustomerOption();
//CustomerOptionValue customerOptionValue = optSet.getPk().getCustomerOptionValue();
CustomerOptionValue customerOptionValue = optSet.getCustomerOptionValue();
@SuppressWarnings("rawtypes")
Map entry = new HashMap();
entry.put("id", optSet.getId());
CustomerOptionDescription description = customerOption.getDescriptionsSettoList().get(0);
CustomerOptionValueDescription valueDescription = customerOptionValue.getDescriptionsSettoList().get(0);
entry.put("optionCode", customerOption.getCode());
entry.put("optionName", description.getName());
entry.put("optionValueCode", customerOptionValue.getCode());
entry.put("optionValueName", valueDescription.getName());
entry.put("order", customerOptionValue.getSortOrder());
resp.addDataEntry(entry);
}
}
//}
resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
} catch (Exception e) {
LOGGER.error("Error while paging options", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
}
String returnString = resp.toJSONString();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
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("customer", "customer");
activeMenus.put("customer-options", "customer-options");
@SuppressWarnings("unchecked")
Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
Menu currentMenu = (Menu)menus.get("customer");
model.addAttribute("currentMenu",currentMenu);
model.addAttribute("activeMenus",activeMenus);
//
}
@PreAuthorize("hasRole('CUSTOMER')")
@RequestMapping(value="/admin/customers/optionsset/remove.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> deleteOptionSet(HttpServletRequest request, HttpServletResponse response, Locale locale) {
String sid = request.getParameter("id");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
try {
Long optionSetId = Long.parseLong(sid);
CustomerOptionSet entity = customerOptionSetService.getById(optionSetId);
//if(entity==null || entity.getPk().getCustomerOption().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
if(entity==null || entity.getCustomerOption().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
} else {
customerOptionSetService.delete(entity);
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
}
} catch (Exception e) {
LOGGER.error("Error while deleting option", 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);
}
@PreAuthorize("hasRole('CUSTOMER')")
@RequestMapping(value="/admin/customers/optionsset/update.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> updateOrder(HttpServletRequest request, HttpServletResponse response) {
String values = request.getParameter("_oldValues");
String order = request.getParameter("order");
AjaxResponse resp = new AjaxResponse();
try {
/**
* Values
*/
ObjectMapper mapper = new ObjectMapper();
@SuppressWarnings("rawtypes")
Map conf = mapper.readValue(values, Map.class);
String sid = (String)conf.get("id");
Long optionId = Long.parseLong(sid);
CustomerOptionSet entity = customerOptionSetService.getById(optionId);
if(entity!=null) {
entity.setSortOrder(Integer.parseInt(order));
customerOptionSetService.update(entity);
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
}
} catch (Exception e) {
LOGGER.error("Error while paging shipping countries", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
}
String returnString = resp.toJSONString();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
}