private OBError processButton(
      VariablesSecureApp vars,
      String strKey,
      String strProjectType,
      String strDateFrom,
      String windowId) {
    Connection conn = null;
    OBError myMessage = new OBError();
    if (strProjectType == null || strProjectType.equals("")) {
      try {
        releaseRollbackConnection(conn);
      } catch (Exception ignored) {
      }
      log4j.warn("Rollback in transaction");
      myMessage.setType("Error");
      myMessage.setTitle(Utility.messageBD(this, "Error", vars.getLanguage()));
      myMessage.setMessage(Utility.messageBD(this, "NoProjectTypeSelected", vars.getLanguage()));
    } else {
      try {
        conn = this.getTransactionConnection();
        ProjectSetTypeData[] data = ProjectSetTypeData.select(this, strProjectType);
        ProjectSetTypeData[] dataProject = ProjectSetTypeData.selectProject(this, strKey);
        String strProjectPhase = "";
        String strProjectTask = "";
        // Variables used for Project Scheduling purposes
        DateFormat DateFormatter = Utility.getDateFormatter(vars);
        int firstProjectPhase = 0;
        String strPhaseStartDate = "";
        String strPhaseContractDate = "";
        String strTaskStartDate = "";
        String strTaskContractDate = "";
        String strLastContractDate = "";

        for (int i = 0; data != null && i < data.length; i++) {
          strProjectPhase = SequenceIdData.getUUID();

          // Calculates the Starting Date of the Phase
          if (firstProjectPhase == 0) {
            strPhaseStartDate = strDateFrom;
          } else {
            strPhaseStartDate = calculateStartDate(strLastContractDate, DateFormatter);
          }
          // Calculates the Contract Date of the Phase
          strPhaseContractDate =
              calculateContractDate(strPhaseStartDate, data[i].stdduration, DateFormatter);

          try {
            if (ProjectSetTypeData.insertProjectPhase(
                    conn,
                    this,
                    strKey,
                    dataProject[0].adClientId,
                    dataProject[0].adOrgId,
                    vars.getUser(),
                    data[i].description,
                    data[i].mProductId,
                    data[i].cPhaseId,
                    strProjectPhase,
                    data[i].help,
                    data[i].name,
                    data[i].standardqty,
                    strPhaseStartDate,
                    strPhaseContractDate,
                    data[i].seqno)
                == 1) {
              strLastContractDate = strPhaseContractDate;
              ProjectSetTypeData[] data1 = ProjectSetTypeData.selectTask(this, data[i].cPhaseId);
              int firstProjectTask = 0;
              for (int j = 0; data1 != null && j < data1.length; j++) {
                strProjectTask = SequenceIdData.getUUID();

                // Calculates the Starting Date of the Task
                if (firstProjectTask == 0) {
                  strTaskStartDate = strPhaseStartDate;
                } else {
                  strTaskStartDate = calculateStartDate(strLastContractDate, DateFormatter);
                }
                // Calculates the Contract Date of the Task
                strTaskContractDate =
                    calculateContractDate(strTaskStartDate, data1[j].stdduration, DateFormatter);

                try {
                  ProjectSetTypeData.insertProjectTask(
                      conn,
                      this,
                      strProjectTask,
                      data1[j].cTaskId,
                      dataProject[0].adClientId,
                      dataProject[0].adOrgId,
                      vars.getUser(),
                      data1[j].seqno,
                      data1[j].name,
                      data1[j].description,
                      data1[j].help,
                      data1[j].mProductId,
                      strProjectPhase,
                      data1[j].standardqty,
                      strTaskStartDate,
                      strTaskContractDate);
                } catch (ServletException ex) {
                  myMessage =
                      Utility.translateError(this, vars, vars.getLanguage(), ex.getMessage());
                  releaseRollbackConnection(conn);
                  return myMessage;
                }

                strLastContractDate = strTaskContractDate;
                firstProjectTask++;
              }
              firstProjectPhase++;
            }
          } catch (ServletException ex) {
            myMessage = Utility.translateError(this, vars, vars.getLanguage(), ex.getMessage());
            releaseRollbackConnection(conn);
            return myMessage;
          }
        }

        // Updates project's Type and category
        String strProjectCategory = ProjectSetTypeData.selectProjectCategory(this, strProjectType);
        try {
          ProjectSetTypeData.update(
              conn, this, vars.getUser(), strProjectType, strProjectCategory, strKey);
        } catch (ServletException ex) {
          myMessage = Utility.translateError(this, vars, vars.getLanguage(), ex.getMessage());
          releaseRollbackConnection(conn);
          return myMessage;
        }

        // Updates project's Starting and Contract Dates
        ProjectSetTypeData[] dataDates = ProjectSetTypeData.selectDates(this, strKey);
        String strStartDate = strDateFrom.equals("") ? dataDates[0].startdate : strDateFrom;
        String strContractDate =
            strLastContractDate.equals("") ? dataDates[0].datecontract : strLastContractDate;
        try {
          ProjectSetTypeData.updateDates(
              conn, this, vars.getUser(), strStartDate, strContractDate, strKey);
        } catch (ServletException ex) {
          myMessage = Utility.translateError(this, vars, vars.getLanguage(), ex.getMessage());
          releaseRollbackConnection(conn);
          return myMessage;
        }

        releaseCommitConnection(conn);
        myMessage.setType("Success");
        myMessage.setTitle(Utility.messageBD(this, "Success", vars.getLanguage()));
      } catch (Exception e) {
        try {
          releaseRollbackConnection(conn);
        } catch (Exception ignored) {
        }
        e.printStackTrace();
        log4j.warn("Rollback in transaction");
        myMessage = Utility.translateError(this, vars, vars.getLanguage(), e.getMessage());
      }
    }
    return myMessage;
  }