// TODO Mandar notificación por correo al ente proveedor. Un mensaje
  // cualquier para ir probando...
  public String solicitarSuscripcion() {

    if (!sessionValidate()) return INPUT;
    prepareRequest();
    solicitud.setTelefono(codigo + solicitud.getTelefono());
    create(solicitud);
    setSuscripcion_form(false);
    addActionMessage("Su solicitud de suscripción ha sido procesada.");
    System.out.println(solicitud.toString());
    return SUCCESS;
  }
  private void prepareRequest() {

    session = ActionContext.getContext().getSession();
    Usuario user = (Usuario) session.get("usuario");
    ente = (Ente) session.get("ente");
    solicitud.setId_ente_proveedor(
        ((ServicioInformacion) read(servicio, id_servicio)).getId_ente());
    solicitud.setId_ente_solicitante(user.getId_ente());
    solicitud.setId_servicio_informacion(id_servicio);
    solicitud.setId_usuario(user.getId_usuario());
    solicitud.setSentencia(PENDIENTE);
  }
  @SkipValidation
  public String examinarSolicitud() {

    if (!sessionValidate()) return INPUT;
    session = ActionContext.getContext().getSession();
    Usuario user = (Usuario) session.get("usuario");
    solicitud = (SolicitudSuscripcion) read(solicitud, id_solicitud_suscripcion);
    // Valida que un trol quiera acceder a las solicitudes de otros entes
    if (!detalles_respuesta) {
      if (user.getId_ente() != solicitud.getId_ente_proveedor()) return INPUT;
    } else {
      if (user.getId_ente() != solicitud.getId_ente_solicitante()) return INPUT;
    }
    // Guardo que la solicitud ya ha sido revisada y por quien fue leida
    if (!solicitud.isLeido()) {
      solicitud.setLeido(true);
      solicitud.setId_usuario(user.getId_usuario());
      update(solicitud, id_solicitud_suscripcion);
    }
    if (!detalles_respuesta) {
      detalles_solicitud = true;
      ente = (Ente) read(ente, solicitud.getId_ente_solicitante());
    } else {
      ente = (Ente) read(ente, solicitud.getId_ente_proveedor());
    }
    servicio = (ServicioInformacion) read(servicio, solicitud.getId_servicio_informacion());
    return SUCCESS;
  }
  @SkipValidation
  public String prepararAprobarRechazarSuscripcion() {

    if (!sessionValidate()) return INPUT;
    // Lee los detalles de la suscripción
    session = ActionContext.getContext().getSession();
    Usuario user = (Usuario) session.get("usuario");
    solicitud = (SolicitudSuscripcion) read(solicitud, id_solicitud_suscripcion);
    // Valida que un trol quiera acceder a las solicitudes de otros entes
    if (user.getId_ente() != solicitud.getId_ente_proveedor()) return INPUT;
    // Valida que la solicitud.sentencia sea igual a cero (0 = pendiente).
    if (!(solicitud.getSentencia() == 0)) return INPUT;
    ente = (Ente) read(ente, solicitud.getId_ente_solicitante());
    servicio = (ServicioInformacion) read(servicio, solicitud.getId_servicio_informacion());
    // Variable necesaria para la vista.
    aprobarRechazar = true;
    return SUCCESS;
  }
  @SkipValidation
  public String prepararSuscripcion() {

    if (!sessionValidate()) return INPUT;
    if (!verificarLong(id_servicio)) return INPUT;
    servicio = (ServicioInformacion) read(servicio, id_servicio);
    suscripcion_form = true;
    prepareRequest();
    if (read(solicitud).size() > 0)
      if (verifySuscriptionRequest(
          solicitud.getId_servicio_informacion(),
          solicitud.getId_ente_proveedor(),
          solicitud.getId_ente_solicitante())) {
        addFieldError(
            "error",
            error
                .getProperties()
                .getProperty("error.suscripcion.duplicated")
                .replace("{0}", ente.getSiglas().toUpperCase()));
        id_solicitud_suscripcion =
            getId_solicitud_sucripcion(
                solicitud.getId_servicio_informacion(),
                solicitud.getId_ente_proveedor(),
                solicitud.getId_ente_solicitante());
        setInvalid(true);
        setRequested(true);
      }
    return SUCCESS;
  }
  // TODO Enviar notificación por correo, falta colocar el mensaje registro
  // exitoso para la vista
  @SkipValidation
  public String aprobarRechazarSuscripcion() {

    if (!sessionValidate()) return INPUT;
    boolean err = false;
    String motivo_proveedor;
    int decision;
    // validar datos y guardar
    motivo_proveedor = solicitud.getMotivo_proveedor();
    decision = solicitud.getSentencia();
    session = ActionContext.getContext().getSession();
    Usuario user = (Usuario) session.get("usuario");
    if (solicitud.getMotivo_proveedor().trim().isEmpty()) {
      addFieldError(
          "motivo_proveedor",
          error.getProperties().getProperty("error.suscripcion.motivo_proveedor"));
      err = true;
    } else if (!solicitud.getMotivo_proveedor().toUpperCase().matches(REGEX_TITLE)) {
      addFieldError("motivo_proveedor", error.getProperties().getProperty("error.regex.title"));
      err = true;
    }
    if (!(solicitud.getSentencia() >= 1 && solicitud.getSentencia() <= 2)) {
      addFieldError("sentencia", error.getProperties().getProperty("error.suscripcion.sentencia"));
      err = true;
    }
    solicitud = (SolicitudSuscripcion) read(solicitud, id_solicitud_suscripcion);
    solicitud.setSentencia(decision);
    solicitud.setMotivo_proveedor(motivo_proveedor);
    ente = (Ente) read(ente, solicitud.getId_ente_solicitante());
    servicio = (ServicioInformacion) read(servicio, solicitud.getId_servicio_informacion());
    if (err) return INPUT;
    // Valida que un trol quiera acceder a las solicitudes de otros entes
    if (user.getId_ente() != solicitud.getId_ente_proveedor()) return INPUT;
    // Valida que la solicitud.sentencia sea igual a cero (0 = pendiente).
    if (solicitud.getSentencia() == 0) return INPUT;
    // Si la desición es ACEPTADO se crea el registro suscrito
    if (decision == 1) {
      Suscrito suscrito = new Suscrito();
      suscrito.setId_ente(solicitud.getId_ente_solicitante());
      suscrito.setId_servicio_informacion(solicitud.getId_servicio_informacion());
      create(suscrito);
    }
    // Coloco a false leido para utilizarlo con el ente solicitante, en las
    // notificaciones.
    solicitud.setLeido(false);
    // Actualiza la solicitud de suscripción
    update(solicitud, solicitud.getId_solicitud_suscripcion());
    addActionMessage("EL VEREDICTO DE LA SOLICITUD DE SUSCRIPCIÓN HA SIDO PROCESADA CORRECTAMENTE");
    aprobarRechazar = false;
    return SUCCESS;
  }
  @Override
  public void validate() {

    if (!isRequested()) {
      if (solicitud.getSolicitante().trim().isEmpty()) {
        addFieldError(
            "solicitante", error.getProperties().getProperty("error.suscripcion.solicitante"));
        setInvalid(true);
      }
      if (!solicitud.getSolicitante().toUpperCase().matches(REGEX_TITLE)) {
        addFieldError("solicitante", error.getProperties().getProperty("error.regex.title"));
        setInvalid(true);
      }
      if (solicitud.getCargo().trim().isEmpty()) {
        addFieldError("cargo", error.getProperties().getProperty("error.suscripcion.cargo"));
        setInvalid(true);
      }
      if (!solicitud.getCargo().toUpperCase().matches(REGEX_TITLE)) {
        addFieldError("cargo", error.getProperties().getProperty("error.regex.title"));
        setInvalid(true);
      }
      if (solicitud.getCorreo().trim().isEmpty()) {
        addFieldError("correo", error.getProperties().getProperty("error.suscripcion.email"));
        setInvalid(true);
      }
      if (!solicitud.getCorreo().matches(REGEX_EMAIL)) {
        addFieldError("correo", error.getProperties().getProperty("error.regex.email"));
        setInvalid(true);
      }
      if (solicitud.getTelefono().trim().isEmpty()) {
        addFieldError("telefono", error.getProperties().getProperty("error.suscripcion.telefono"));
        setInvalid(true);
      }
      if (solicitud.getTelefono().length() > 0 && solicitud.getTelefono().length() < 7) {
        addFieldError(
            "telefono", error.getProperties().getProperty("error.suscripcion.telefono.digit"));
        setInvalid(true);
      }
      if (!solicitud.getTelefono().matches("\\d.*") && !solicitud.getTelefono().trim().isEmpty()) {
        addFieldError(
            "telefono", error.getProperties().getProperty("error.suscripcion.telefono.regex"));
        setInvalid(true);
      }
      if (solicitud.getMotivo_solicitante().trim().isEmpty()) {
        addFieldError("motivo", error.getProperties().getProperty("error.suscripcion.motivo"));
        setInvalid(true);
      }
      if (!solicitud.getMotivo_solicitante().matches(REGEX_DESCRIPTION)) {
        addFieldError("motivo", error.getProperties().getProperty("error.regex.description"));
        setInvalid(true);
      }
    }
    if (isInvalid()) prepararSuscripcion();
    else solicitarSuscripcion();
  }