@RequestMapping(value = BoUrls.STORE_LIST_URL, method = RequestMethod.GET)
  public ModelAndView storeList(
      final HttpServletRequest request,
      final Model model,
      @RequestParam(value = RequestConstants.REQUEST_PARAMETER_RETAILER_CODE) String retailerCode)
      throws Exception {
    ModelAndViewThemeDevice modelAndView =
        new ModelAndViewThemeDevice(
            getCurrentVelocityPath(request), BoUrls.STORE_LIST.getVelocityPage());
    final RequestData requestData = requestUtil.getRequestData(request);

    // SANITY CHECK
    if (StringUtils.isEmpty(retailerCode)) {
      final String urlRedirect =
          backofficeUrlService.generateUrl(BoUrls.RETAILER_LIST, requestData);
      return new ModelAndView(new RedirectView(urlRedirect));
    }

    final Retailer retailer = retailerService.getRetailerByCode(retailerCode);

    displayList(request, model, requestData, null);

    Object[] params = {retailer.getName() + " (" + retailer.getCode() + ")"};
    initPageTitleAndMainContentTitle(
        request, modelAndView, BoUrls.STORE_LIST.getKey() + ".by.retailer", params);

    model.addAttribute(
        ModelConstants.URL_ADD,
        backofficeUrlService.generateUrl(BoUrls.STORE_ADD, requestData, retailer));
    model.addAttribute(
        ModelConstants.URL_RETAILER_VIEW,
        backofficeUrlService.generateUrl(BoUrls.RETAILER_DETAILS, requestData, retailer));

    return modelAndView;
  }
  @RequestMapping(value = BoUrls.STORE_EDIT_URL, method = RequestMethod.POST)
  public ModelAndView submitRetailerEdit(
      final HttpServletRequest request,
      final Model model,
      @Valid @ModelAttribute(ModelConstants.STORE_FORM) StoreForm storeForm,
      BindingResult result,
      ModelMap modelMap)
      throws Exception {
    final RequestData requestData = requestUtil.getRequestData(request);
    final Locale locale = requestData.getLocale();

    if (result.hasErrors()) {
      return storeEdit(request, model, storeForm);
    }

    Store store = null;
    if (StringUtils.isNotEmpty(storeForm.getId())) {
      store = retailerService.getStoreById(storeForm.getId());
    }

    final String retailerCode =
        request.getParameter(RequestConstants.REQUEST_PARAMETER_RETAILER_CODE);
    Retailer retailer = null;
    if (StringUtils.isNotEmpty(retailerCode)) {
      retailer =
          retailerService.getRetailerByCode(
              retailerCode, FetchPlanGraphRetailer.fullStoreFetchPlan());
    }

    try {
      // CREATE OR UPDATE RETAILER
      Store savedStore = webBackofficeService.createOrUpdateStore(retailer, store, storeForm);

      if (store == null) {
        addSuccessMessage(
            request, getSpecificMessage(ScopeWebMessage.STORE, "create_success_message", locale));

      } else {
        addSuccessMessage(
            request, getSpecificMessage(ScopeWebMessage.STORE, "update_success_message", locale));
      }
      final String urlRedirect =
          backofficeUrlService.generateUrl(
              BoUrls.STORE_DETAILS, requestUtil.getRequestData(request), savedStore);
      return new ModelAndView(new RedirectView(urlRedirect));

    } catch (Exception e) {
      addMessageError(
          result,
          null,
          "code",
          "code",
          getSpecificMessage(ScopeWebMessage.RETAILER, "create_or_update_message", locale));
      logger.error(
          "Can't save or update Retailer:" + storeForm.getId() + "/" + storeForm.getCode(), e);
      return storeEdit(request, model, storeForm);
    }
  }