public String editPermission(
      final B2BPermissionForm b2BPermissionForm,
      final BindingResult bindingResult,
      final Model model,
      final RedirectAttributes redirectModel)
      throws CMSItemNotFoundException, ParseException {
    b2BPermissionFormValidator.validate(b2BPermissionForm, bindingResult);
    if (bindingResult.hasErrors()) {
      model.addAttribute(b2BPermissionForm);
      GlobalMessages.addErrorMessage(model, "form.global.error");
      return editPermission(b2BPermissionForm.getOriginalCode(), model);
    }

    final B2BPermissionData b2BPermissionData =
        populateB2BPermissionDataFromForm(b2BPermissionForm);
    try {
      b2bCommercePermissionFacade.updatePermissionDetails(b2BPermissionData);
    } catch (final Exception e) {
      LOG.warn("Exception while saving the permission details " + e);
      model.addAttribute(b2BPermissionForm);
      GlobalMessages.addErrorMessage(model, "form.global.error");
      bindingResult.rejectValue("code", "text.company.managePermissions.code.exists.error.title");
      return editPermission(b2BPermissionForm.getOriginalCode(), model);
    }
    storeCmsPageInModel(model, getContentPageForLabelOrId(ORGANIZATION_MANAGEMENT_CMS_PAGE));
    setUpMetaDataForContentPage(
        model, getContentPageForLabelOrId(ORGANIZATION_MANAGEMENT_CMS_PAGE));
    final List<Breadcrumb> breadcrumbs =
        myCompanyBreadcrumbBuilder.createManagePermissionsBreadcrumb();
    breadcrumbs.add(
        new Breadcrumb(
            "/my-company/organization-management/manage-budgets/update",
            getMessageSource()
                .getMessage(
                    "text.company.budget.editPage", null, getI18nService().getCurrentLocale()),
            null));
    model.addAttribute("breadcrumbs", breadcrumbs);

    GlobalMessages.addFlashMessage(
        redirectModel, GlobalMessages.CONF_MESSAGES_HOLDER, "text.confirmation.permission.updated");
    return String.format(REDIRECT_TO_PERMISSION_DETAILS, urlEncode(b2BPermissionData.getCode()));
  }