@Override
 protected JSONObject execute(Map<String, Object> parameters, String data) {
   JSONObject result = new JSONObject();
   JSONObject errorMessage = new JSONObject();
   OBContext.setAdminMode(true);
   try {
     final JSONObject jsonData = new JSONObject(data);
     boolean isReceipt = "true".equals(jsonData.getString("issotrx"));
     String strFinFinancialAccountId = jsonData.getString("finFinancialAccount");
     FIN_FinancialAccount finFinancialAccount =
         OBDal.getInstance().get(FIN_FinancialAccount.class, strFinFinancialAccountId);
     String strBusinessPartnerId = null;
     if (jsonData.get("receivedFrom") != JSONObject.NULL) {
       strBusinessPartnerId = jsonData.getString("receivedFrom");
       BusinessPartner businessPartner =
           OBDal.getInstance().get(BusinessPartner.class, strBusinessPartnerId);
       if (FIN_Utility.isBlockedBusinessPartner(businessPartner.getId(), isReceipt, 4)) {
         String strThebusinessPartner = OBMessageUtils.parseTranslation("@ThebusinessPartner@");
         String strBusinessPartnerBlocked =
             OBMessageUtils.parseTranslation("@BusinessPartnerBlocked@");
         errorMessage.put("severity", "error");
         errorMessage.put("title", "Error");
         errorMessage.put(
             "text",
             strThebusinessPartner
                 + " "
                 + businessPartner.getName()
                 + " "
                 + strBusinessPartnerBlocked);
         result.put("message", errorMessage);
         return result;
       }
     } else {
       JSONArray selectedPSDs = jsonData.getJSONArray("selectedRecords");
       for (int i = 0; i < selectedPSDs.length(); i++) {
         JSONObject psdRow = selectedPSDs.getJSONObject(i);
         strBusinessPartnerId = psdRow.getString("businessPartner");
         BusinessPartner businessPartner =
             OBDal.getInstance().get(BusinessPartner.class, strBusinessPartnerId);
         if (FIN_Utility.isBlockedBusinessPartner(businessPartner.getId(), isReceipt, 4)) {
           String strThebusinessPartner = OBMessageUtils.parseTranslation("@ThebusinessPartner@");
           String strBusinessPartnerBlocked =
               OBMessageUtils.parseTranslation("@BusinessPartnerBlocked@");
           errorMessage.put("severity", "error");
           errorMessage.put("title", "Error");
           errorMessage.put(
               "text",
               strThebusinessPartner
                   + " "
                   + businessPartner.getName()
                   + " "
                   + strBusinessPartnerBlocked);
           result.put("message", errorMessage);
           return result;
         }
       }
     }
     String message = "Ok";
     errorMessage.put("severity", "success");
     errorMessage.put("text", message);
     result.put("message", errorMessage);
     result.put("writeofflimit", finFinancialAccount.getWriteofflimit());
   } catch (Exception e) {
     OBDal.getInstance().rollbackAndClose();
     log.error(e.getMessage(), e);
     try {
       Throwable ex = DbUtility.getUnderlyingSQLException(e);
       String message = OBMessageUtils.translateError(ex.getMessage()).getMessage();
       errorMessage = new JSONObject();
       errorMessage.put("severity", "error");
       errorMessage.put("title", "Error");
       errorMessage.put("text", message);
       result.put("message", errorMessage);
     } catch (Exception e2) {
       log.error(e.getMessage(), e2);
       // do nothing, give up
     }
   } finally {
     OBContext.restorePreviousMode();
   }
   return result;
 }