private void procesar(HttpServletRequest request, HttpServletResponse response)
      throws IOException {
    // TODO Auto-generated method stub

    // Obtiene session
    HttpSession sesion_actual = request.getSession(true);
    response.setCharacterEncoding("utf-8");
    PrintWriter out = response.getWriter();
    Parameters parameters = Parameters.getInstance();

    // Define objetos a utilizar
    TasaServicesImpl tasaServicesImpl = new TasaServicesImpl();
    SubProductoServicesImpl subProductoServicesImpl = new SubProductoServicesImpl();
    TipoPersonaServicesImpl tipoPersonaServicesImpl = new TipoPersonaServicesImpl();
    MonedaServicesImpl monedaServicesImpl = new MonedaServicesImpl();
    Tasa nuevoRangoTasa = new Tasa();
    Tasa anteriorRangoTasa = new Tasa();
    Tasa anteriorRangoTasaPlazo = new Tasa();
    long montoAnterior = 0;
    BigDecimal valorTasaAnteriorMin;
    BigDecimal valorTasaAnteriorMax;

    // Respuesta
    JSONObject responseJSON = new JSONObject();

    try {

      // Obtiene valores de formulario
      BigDecimal valorTasaMin = new BigDecimal(request.getParameter("valorTasaMin"));
      BigDecimal valorTasaMax = new BigDecimal(request.getParameter("valorTasaMax"));
      long montoMinimo = Long.parseLong(request.getParameter("mtoMinimo"));
      long montoMaximo = Long.parseLong(request.getParameter("mtoMaximo"));
      int plazoInicial = Integer.parseInt(request.getParameter("plazoInicial"));
      int plazoFinal = Integer.parseInt(request.getParameter("plazoFinal"));
      int unidadPlazo = Integer.parseInt(request.getParameter("unidadPlazo"));
      String descripcionPlazo = null;

      // Obtiene tipo de producto
      String tipoProducto = (String) sesion_actual.getAttribute("tipoProducto");

      // Obtiene plazo máximo
      int PLAZO_MAXIMO = Integer.parseInt(parameters.getKey("PLZO_MAXIMO").toString());

      // Obtiene valores de sesión
      String idTipoPersona = sesion_actual.getAttribute("idTipoPersona").toString();
      String idMoneda = sesion_actual.getAttribute("idMoneda").toString();

      // Descripcion
      if (tipoProducto.equals("A")) { // Productos Activos
        if (unidadPlazo == 0) { // dias
          descripcionPlazo = "De " + plazoInicial + " a " + plazoFinal + " dias";
        } else { // meses
          descripcionPlazo = "De " + plazoInicial + " a " + plazoFinal + " meses";
        }
      } else { // Productos Pasivos
        if (unidadPlazo == 0) { // dias
          if (idMoneda.equals("2")
              && idTipoPersona.equals("1")) { // caso particular persona natural - dolares
            if (plazoFinal == PLAZO_MAXIMO) {
              descripcionPlazo = "De " + plazoInicial + " dias a mas";
            } else {
              descripcionPlazo = "De " + plazoInicial + " a " + plazoFinal + " dias";
            }
          } else {
            if (plazoFinal == PLAZO_MAXIMO) {
              descripcionPlazo = "De " + plazoInicial + " dias a mas";
            } else {
              descripcionPlazo = "A " + plazoFinal + " dias";
            }
          }
        } else { // meses

          if (idMoneda.equals("2") && idTipoPersona.equals("1")) {
            if (plazoFinal == PLAZO_MAXIMO) {
              descripcionPlazo = "De " + plazoInicial + " meses a mas";
            } else {
              descripcionPlazo = "De " + plazoInicial + " a " + plazoFinal + " meses";
            }

          } else {
            if (plazoFinal == PLAZO_MAXIMO) {
              descripcionPlazo = "De " + plazoInicial + " meses a mas";
            } else {
              descripcionPlazo = "A " + plazoFinal + " meses";
            }
          }
        }
      }

      // Monto máximo por defecto
      // long montoMaximo = Long.parseLong(parameters.getKey("MTO_MAXIMO_PRODUCTOS"));

      // Recupera lista de tasas actuales de sesion
      // List<Tasa> listaRangoTasas = ((List<Tasa>) sesion_actual.getAttribute("listaRangoTasas"));
      List<Tasa> listaRangoTasasPlazo =
          tasaServicesImpl.listarTasasxPlazos(
              (String) sesion_actual.getAttribute("idSubProducto"),
              (String) sesion_actual.getAttribute("idTipoPersona"),
              (String) sesion_actual.getAttribute("idMoneda"),
              String.valueOf(plazoInicial),
              String.valueOf(plazoFinal),
              String.valueOf(unidadPlazo));

      // Obtiene cantidad de registros
      int cantidadRegistros = listaRangoTasasPlazo.size();

      // Recupera datos para validacion de rangos
      if (cantidadRegistros > 0) {
        anteriorRangoTasaPlazo = listaRangoTasasPlazo.get(cantidadRegistros - 1);
        valorTasaAnteriorMin = anteriorRangoTasaPlazo.getValTasaMin();
        valorTasaAnteriorMax = anteriorRangoTasaPlazo.getValTasaMax();
        montoAnterior = anteriorRangoTasaPlazo.getMtoInicial();
      } else {
        valorTasaAnteriorMin = new BigDecimal(0);
        valorTasaAnteriorMax = new BigDecimal(0);
      }

      // Valida montos y tasas ingresados
      if (validarMontosTasas(
              montoMinimo,
              valorTasaMin,
              valorTasaMax,
              montoAnterior,
              valorTasaAnteriorMin,
              valorTasaAnteriorMax,
              tipoProducto)
          || cantidadRegistros == 0) {

        // Si los datos son correctos se procede a grabar

        // Obtiene secuencial de nuevo rango
        int rango = cantidadRegistros + 1;

        // Setea valores de rango tasa a grabar
        nuevoRangoTasa.setSubProductos(
            subProductoServicesImpl.buscarSubProducto(
                (String) sesion_actual.getAttribute("idSubProducto")));
        nuevoRangoTasa.setTipoPersona(
            tipoPersonaServicesImpl.buscarTipoPersona(
                (String) sesion_actual.getAttribute("idTipoPersona")));
        nuevoRangoTasa.setMoneda(
            monedaServicesImpl.buscarMoneda((String) sesion_actual.getAttribute("idMoneda")));
        nuevoRangoTasa.setMtoInicial(montoMinimo);
        nuevoRangoTasa.setMtoFinal(montoMaximo);
        nuevoRangoTasa.setValTasaMin(valorTasaMin);
        nuevoRangoTasa.setValTasaMax(valorTasaMax);
        nuevoRangoTasa.setPlazoInicial(plazoInicial);
        nuevoRangoTasa.setPlazoFinal(plazoFinal);
        nuevoRangoTasa.setUnidadPlazo(unidadPlazo);
        nuevoRangoTasa.setDescripcionPlazo(descripcionPlazo);
        nuevoRangoTasa.setRango(rango);
        nuevoRangoTasa.setFechaReg(new Date());

        // Añade rango en base de datos
        tasaServicesImpl.insertarTasa(nuevoRangoTasa);

        // Valida si es primer rango o no
        if (rango > 1) {

          // Actualiza el valor del moto maximo para el rango anterior
          anteriorRangoTasa = listaRangoTasasPlazo.get(rango - 2);
          anteriorRangoTasa.setMtoFinal(montoMinimo - 1);

          // Actualiza rango anterior
          tasaServicesImpl.actualizarTasa(anteriorRangoTasa);
        }

        // Devuelve mensaje
        responseJSON.put("cod_retorno", parameters.getKey("COD_ING_RANGO_OK"));
        responseJSON.put("msj_retorno", parameters.getKey("MSJ_ING_RANGO_OK"));
        out.println(responseJSON.toString());

      } else {
        // Devuelve mensaje: error en datos ingresados
        responseJSON.put("cod_retorno", CODIGO_RETORNO);
        responseJSON.put("msj_retorno", MENSAJE_RETORNO);
        out.println(responseJSON.toString());
      }

    } catch (Exception e) {
      System.out.println(e.getMessage());
      // Devuelve mensaje
      responseJSON.put("cod_retorno", "6");
      responseJSON.put("msj_retorno", parameters.getKey("MSJ_ING_RANGO_NOK"));
      out.println(responseJSON.toString());
    }
  }
  /**
   * @param montoIngresado
   * @param valorTasaIngresado
   * @param montoAnterior
   * @param valorTasaAnteriorMin
   * @param valorTasaAnteriorMax
   * @param tipoProducto
   * @return
   */
  private boolean validarMontosTasas(
      long montoIngresado,
      BigDecimal valorTasaIngresadoMin,
      BigDecimal valorTasaIngresadoMax,
      long montoAnterior,
      BigDecimal valTasaAnteriorMin,
      BigDecimal valTasaAnteriorMax,
      String tipoProducto) {

    boolean validacion = false;
    Parameters parameters = Parameters.getInstance();

    // Valida montos
    if (montoIngresado > montoAnterior) {
      validacion = true;
      CODIGO_RETORNO = "0";

      // Validando tasas en función al tipo de producto
      // Si el producto es un activo: mayor monto , menor tasa
      /*if (tipoProducto.equals("A")){

      	if (valorTasaIngresadoMin.compareTo(valTasaAnteriorMin) < 0){

      		//Datos correctos, procede a grabar
      		if  (valorTasaIngresadoMax.compareTo(valTasaAnteriorMax) < 0){
      			validacion = true;
      			CODIGO_RETORNO ="0";
      		}else{
      			CODIGO_RETORNO = "4";
      			MENSAJE_RETORNO = parameters.getKey("MSJ_VAL_TMX_LW") + valTasaAnteriorMax + '%';
      		}
      	}else{
      		CODIGO_RETORNO = "2";
      		MENSAJE_RETORNO = parameters.getKey("MSJ_VAL_TMN_LW") + valTasaAnteriorMin + '%';
      	}

      }else{
      	// El producto es pasivo: mayor tasa, mayor tasa
      	if (valorTasaIngresadoMin.compareTo(valTasaAnteriorMin) > 0){

      		if (valorTasaIngresadoMax.compareTo(valTasaAnteriorMax) > 0){
      		//Datos cor,rectos, procede a grabar
      			validacion = true;
      			CODIGO_RETORNO ="0";
      		}else{
      			CODIGO_RETORNO = "5";
      			MENSAJE_RETORNO = parameters.getKey("MSJ_VAL_TMX_LW") + valTasaAnteriorMax + '%';
      		}
      	}else{
      		CODIGO_RETORNO = "3";
      		MENSAJE_RETORNO = parameters.getKey("MSJ_VAL_TMN_HG") + valTasaAnteriorMin + '%';
      	}
      }*/

    } else {
      CODIGO_RETORNO = "1";
      MENSAJE_RETORNO = parameters.getKey("MSJ_VAL_MTO") + montoAnterior;
    }

    // Retorna codigo de validación
    return validacion;
  }