package com.salesmanager.admin.controller.taxconfigurations;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.admin.common.utils.LabelUtils;
import com.salesmanager.admin.constants.Constants;
import com.salesmanager.admin.controller.ControllerConstants;
import com.salesmanager.admin.controller.pages.AbstractAdminController;
import com.salesmanager.admin.data.Menu;
import com.salesmanager.admin.data.response.ResponseData;
import com.salesmanager.admin.data.tax.TaxClassData;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.tax.TaxClassService;
import com.salesmanager.core.business.utils.ajax.AjaxDataTableResponse;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.tax.taxclass.TaxClass;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
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 org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* Created by umesh on 3/23/17.
*/
@Controller
public class TaxClassController extends AbstractAdminController {
@Inject
private TaxClassService taxClassService = null;
@Inject
private ProductService productService = null;
@Inject
LabelUtils messages;
private static final Logger LOGGER = LoggerFactory.getLogger(TaxClassController.class);
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = {"/admin/tax/taxclass/list.html"}, method = RequestMethod.GET)
public String displayTaxClasses(final Model model, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
setupMenu(model, request);
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
TaxClass taxClass = new TaxClass();
taxClass.setMerchantStore(store);
model.addAttribute("taxClass", taxClass);
return ControllerConstants.Tiles.Tax.taxClasses;
}
private void setupMenu(final Model model, final HttpServletRequest request) throws Exception {
Map<String,Object> mapModel = model.asMap();
if(MapUtils.isNotEmpty(mapModel)) {
if (mapModel.get("response") != null) {
model.addAttribute("response", model.asMap().get("response"));
}
if (mapModel.get("currentMenu") != null || mapModel.get("activeMenus") != null) {
model.addAttribute("currentMenu", mapModel.get("currentMenu"));
model.addAttribute("activeMenus", mapModel.get("activeMenus"));
}
}
else{
Map<String, String> activeMenus = new HashMap<String, String>();
activeMenus.put("tax", "tax");
activeMenus.put("taxclass", "taxclass");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "tax", activeMenus);
}
}
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = "/admin/tax/taxclass/paging.html", method = {RequestMethod.POST, RequestMethod.GET})
public
@ResponseBody
ResponseEntity<String> pageTaxClasses(HttpServletRequest request,
HttpServletResponse response, Locale locale) throws JsonProcessingException {
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
final HttpHeaders httpHeaders = new HttpHeaders();
AjaxDataTableResponse ajaxDataTableResponse = new AjaxDataTableResponse();
List<TaxClassData> taxDataList = new ArrayList<TaxClassData>();
try {
List<TaxClass> taxClasses = taxClassService.listByStore(store);
if (CollectionUtils.isNotEmpty(taxClasses)) {
ajaxDataTableResponse.setiTotalRecords(taxClasses.size());
ajaxDataTableResponse.setiTotalDisplayRecords(taxClasses.size());
for (TaxClass tax : taxClasses) {
if (!tax.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
TaxClassData taxClassData = new TaxClassData();
taxClassData.setId(tax.getId());
taxClassData.setCode(tax.getCode());
taxClassData.setTitle(tax.getTitle());
taxDataList.add(taxClassData);
}
}
}
} catch (Exception e) {
LOGGER.error("Error while paging permissions", e);
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return new ResponseEntity<String>("", httpHeaders, HttpStatus.OK);
}
ajaxDataTableResponse.setData(taxDataList);
ObjectMapper mapper = new ObjectMapper();
String returnString = mapper.writeValueAsString(ajaxDataTableResponse);
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return new ResponseEntity<String>(returnString, httpHeaders, HttpStatus.OK);
}
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = "/admin/tax/taxclass/save.html", method = RequestMethod.POST)
public String saveTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, RedirectAttributes model, HttpServletRequest request, Locale locale) throws Exception {
Map<String, String> activeMenus = new HashMap<String, String>();
activeMenus.put("tax", "tax");
activeMenus.put("taxclass", "taxclass");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "tax", activeMenus);
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
ResponseData responseData = new ResponseData();
//requires code and name
if (taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
ObjectError error = new ObjectError("code", messages.getMessage("message.taxclass.alreadyexist", locale));
result.addError(error);
}
//check if the code already exist
TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(), store);
if (taxClassDb != null) {
ObjectError error = new ObjectError("code", messages.getMessage("message.taxclass.alreadyexist", locale));
result.addError(error);
}
if (result.hasErrors()) {
return ControllerConstants.Tiles.Tax.taxClasses;
}
taxClassService.create(taxClass);
responseData.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
responseData.setMessage("Request completed successfully");
model.addFlashAttribute("response", responseData);
return ControllerConstants.REDIRECT_PREFIX+"/admin/tax/taxclass/list.html";
}
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = "/admin/tax/taxclass/update.html", method = RequestMethod.POST)
public String updateTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, RedirectAttributes model, HttpServletRequest request, Locale locale) throws Exception {
Map<String, String> activeMenus = new HashMap<String, String>();
activeMenus.put("tax", "tax");
activeMenus.put("taxclass", "taxclass");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "tax", activeMenus);
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
ResponseData responseData= new ResponseData();
//requires code and name
if (taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
ObjectError error = new ObjectError("code", messages.getMessage("message.taxclass.alreadyexist", locale));
result.addError(error);
}
//check if the code already exist
TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(), store);
if (taxClassDb != null && taxClassDb.getId().longValue() != taxClass.getId().longValue()) {
ObjectError error = new ObjectError("code", messages.getMessage("message.taxclass.alreadyexist", locale));
result.addError(error);
}
if (result.hasErrors()) {
return ControllerConstants.Tiles.Tax.taxClass;
}
taxClassService.update(taxClass);
responseData.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
responseData.setMessage("Request completed successfully");
model.addFlashAttribute("response", responseData);
return ControllerConstants.REDIRECT_PREFIX+"/admin/tax/taxclass/list.html";
}
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = "/admin/tax/taxclass/remove.html", method = {RequestMethod.POST, RequestMethod.GET})
public String removeTaxClass(HttpServletRequest request, Locale locale, final RedirectAttributes model) throws Exception {
//do not remove super admin
long taxClassId = Long.parseLong(request.getParameter("taxClassId"));
ResponseData response = new ResponseData();
response.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
response.setMessage("Request completed successfully");
try {
/**
* In order to remove a User the logged in ser must be STORE_ADMIN
* or SUPER_USER
*/
TaxClass taxClass = taxClassService.getById(taxClassId);
if (taxClass == null) {
LOGGER.error("Invalid taxClassId {} ", taxClassId);
response.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
response.setMessage(messages.getMessage("message.unauthorized", locale));
model.addAttribute("response", response);
return ControllerConstants.Tiles.Tax.taxClasses;
}
//look if the taxclass is used for products
List<Product> products = productService.listByTaxClass(taxClass);
if (products != null && products.size() > 0) {
response.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
response.setMessage(messages.getMessage("message.product.association", locale));
model.addAttribute("response", response);
return ControllerConstants.Tiles.Tax.taxClasses;
}
taxClassService.delete(taxClass);
} catch (Exception e) {
LOGGER.error("Error while deleting tax class {} ", e);
response.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
response.setMessage("Error while deleting tax class");
}
// this needs to be moved to common method
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
TaxClass taxClass = new TaxClass();
taxClass.setMerchantStore(store);
model.addAttribute("taxClass", taxClass);
model.addFlashAttribute("response", response);
return ControllerConstants.REDIRECT_PREFIX+"/admin/tax/taxclass/list.html";
}
@PreAuthorize("hasRole('TAX')")
@RequestMapping(value = "/admin/tax/taxclass/edit.html", method = RequestMethod.GET)
public String editTaxClass(@ModelAttribute("id") long taxClassId, final Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
Map<String, String> activeMenus = new HashMap<String, String>();
activeMenus.put("tax", "tax");
activeMenus.put("taxclass", "taxclass");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "tax", activeMenus);
MerchantStore store = (MerchantStore) request.getAttribute(Constants.ADMIN_STORE);
TaxClass taxClass = null;
try {
taxClass = taxClassService.getById(taxClassId);
} catch (Exception e) {
LOGGER.error("Unable to find tax information for the ID {} " , taxClassId);
}
if (taxClass == null || taxClass.getMerchantStore().getId() != store.getId()) {
taxClass = new TaxClass();
taxClass.setMerchantStore(store);
model.addAttribute("taxClass", taxClass);
return ControllerConstants.Tiles.Tax.taxClasses;
}
model.addAttribute("taxClass", taxClass);
return ControllerConstants.Tiles.Tax.taxClasses;
}
}