private void saveCategory(long masterId, PayrollCategory[] categories) throws SQLException {
    for (int i = 0; i < categories.length; i++) {
      PayrollCategory payrollCategory = categories[i];

      String sql =
          "INSERT INTO "
              + IDBConstants.TABLE_PAYROLL_CATEGORY_HISTORY
              + "("
              + IDBConstants.ATTR_HISTORY_MASTER
              + ","
              + IDBConstants.ATTR_NAME
              + ","
              + IDBConstants.ATTR_DESCRIPTION
              + ")"
              + " values (?, ?, ?)";

      PreparedStatement stm = connection.prepareStatement(sql);
      stm.setLong(1, masterId);
      stm.setString(2, payrollCategory.getName());
      stm.setString(3, payrollCategory.getDescription());

      stm.executeUpdate();

      long id = getMaxIndex(IDBConstants.TABLE_PAYROLL_CATEGORY_HISTORY);

      payrollCategory.setNewIndex(id);
    }
  }
  private void saveCategoryEmployee(long masterId, PayrollCategory[] categories) throws Exception {

    String sql =
        "INSERT INTO "
            + IDBConstants.TABLE_PAYROLL_CATEGORY_EMPLOYEE_HISTORY
            + "("
            + IDBConstants.ATTR_HISTORY_MASTER
            + ","
            + IDBConstants.ATTR_CATEGORY
            + ","
            + IDBConstants.ATTR_EMPLOYEE
            + ")"
            + " values (?, ?, ?)";

    for (int i = 0; i < categories.length; i++) {
      PayrollCategory payrollCategory = categories[i];

      IHRMSQL iSql = new HRMSQLSAP();
      Employee[] employees =
          iSql.getPayrollCategoryEmployee(payrollCategory.getIndex(), connection);

      for (int j = 0; j < employees.length; j++) {
        Employee emp = employees[j];

        PreparedStatement stm = connection.prepareStatement(sql);

        stm.setLong(1, masterId);
        stm.setLong(2, payrollCategory.getNewIndex());
        stm.setLong(3, emp.getIndex());

        stm.executeUpdate();
      }
    }
  }
  private void saveEmployeeComponent(long masterId, PayrollCategory[] categories) throws Exception {
    String sql =
        "INSERT INTO "
            + IDBConstants.TABLE_EMPLOYEE_PAYROLL_COMPONENT_HISTORY
            + "("
            + IDBConstants.ATTR_HISTORY_MASTER
            + ","
            + IDBConstants.ATTR_EMPLOYEE
            + ","
            + IDBConstants.ATTR_COMPONENT
            + ","
            + IDBConstants.ATTR_FORMULA
            + ","
            + IDBConstants.ATTR_FORMULA_MONTH
            + ","
            + IDBConstants.ATTR_ROUND_VALUE
            + ","
            + IDBConstants.ATTR_PRECISION
            + ")"
            + " values (?, ?, ?, ?, ?, ?, ?)";

    for (int i = 0; i < categories.length; i++) {
      PayrollCategory payrollCategory = categories[i];

      IHRMSQL iSql = new HRMSQLSAP();
      Employee[] employees =
          iSql.getPayrollCategoryEmployee(payrollCategory.getIndex(), connection);

      for (int j = 0; j < employees.length; j++) {
        Employee emp = employees[j];

        HRMBusinessLogic logic = new HRMBusinessLogic(connection);

        PayrollCategoryComponent[] components =
            logic.getAllPayrollCategoryComponent(
                sessionId,
                IDBConstants.MODUL_MASTER_DATA,
                emp.getIndex(),
                IDBConstants.TABLE_EMPLOYEE_PAYROLL_COMPONENT);

        for (int k = 0; k < components.length; k++) {
          PayrollCategoryComponent comp = components[k];

          PreparedStatement stm = connection.prepareStatement(sql);

          stm.setLong(1, masterId);
          stm.setLong(2, emp.getIndex());
          stm.setLong(3, comp.getPayrollComponent().getIndex());
          stm.setString(4, comp.getFormulaEntity().getFormulaCode());
          stm.setInt(5, (int) comp.getEveryWhichMonth());
          stm.setInt(6, (int) comp.getFormulaEntity().getNumberRounding().getRoundingMode());
          stm.setInt(7, comp.getFormulaEntity().getNumberRounding().getPrecision());

          stm.executeUpdate();
        }
      }
    }
  }