/**
   * Obtiene una lista de objetos de tipo SelectedItem.
   *
   * @return la lista
   */
  public List<SelectItem> getSelectedItemSubespecialidad() {
    try {
      List<CexEspecialidad> listaSelEsp = new ArrayList<>();
      List<SelectItem> items = new ArrayList<>();
      for (CexEspecialidad obj : especialidad.getCexEspecialidadList()) {
        for (CexEspecialidadMedico objSelEspmed : obj.getCexEspecialidadMedicoList()) {
          if (objSelEspmed.getAdmMedico().getAmeEstado() == 1
              && objSelEspmed.getCexEspecialidad().getCesEstado() == 1) {
            for (CexHorario objSelHor : objSelEspmed.getCexHorarioList()) {
              if (((objSelHor.getChoFechaFin().after(fechaAgenda)
                          || objSelHor.getChoFechaFin().equals(fechaAgenda))
                      && objSelHor.getAdmInstitucion().equals(user.getUser().getAdmInstitucion()))
                  && objSelHor.getAdmTipoConsulta().getAtcTipo().equals(1)) {
                if (!listaSelEsp.isEmpty()) {
                  if (!listaSelEsp.contains(obj)) {
                    listaSelEsp.add(obj);
                    items.add(new SelectItem(obj, obj.getCesNombre()));
                  }
                } else {
                  listaSelEsp.add(obj);
                  items.add(new SelectItem(obj, obj.getCesNombre()));
                }
              }
            }
          }
        }
      }

      return items;
    } catch (Exception e) {
      log.error("getSelectedItemSubespecialidad() {} ", e.getMessage());
    }
    return null;
  }
 /**
  * Obtiene una lista de objetos de tipo SelectedItem de la entidad CexMedico.
  *
  * @return la lista
  */
 public List<SelectItem> getSelectedItemMedico() {
   try {
     Calendar c1 = Calendar.getInstance();
     c1.setTime(fechaAgenda);
     dia = c1.get(Calendar.DAY_OF_WEEK);
     List<CexEspecialidadMedico> listEspMed = new ArrayList<>();
     // Filtra los horarios segun el dia actual
     List<SelectItem> items = new ArrayList<>();
     for (CexEspecialidadMedico cexEspMed : subEspecialidad.getCexEspecialidadMedicoList()) {
       if (cexEspMed.getAdmMedico().getAmeEstado() == 1
           && cexEspMed.getCexEspecialidad().getCesEstado() == 1) {
         for (CexHorario cexHorario : cexEspMed.getCexHorarioList()) {
           if (((cexHorario.getChoFechaFin().after(fechaAgenda)
                       || cexHorario.getChoFechaFin().equals(fechaAgenda))
                   && cexHorario.getAdmInstitucion().equals(user.getUser().getAdmInstitucion()))
               && cexHorario.getAdmTipoConsulta().getAtcTipo().equals(1)) {
             for (CexHorariosDia cexHorarioDia1 : cexHorario.getCexHorariosDiaList()) {
               // Validar que sea el dia actual
               if (cexHorarioDia1.getCexDia().getCdiId().equals(dia)) {
                 if (cexHorarioDia1.getChdHoraInicioAm() != null
                     || cexHorarioDia1.getChdHoraFinAm() != null) {
                   if (!listEspMed.contains(
                       cexHorarioDia1.getCexHorario().getCexEspecialidadMedico())) {
                     items.add(
                         new SelectItem(
                             cexHorarioDia1.getCexHorario().getCexEspecialidadMedico(),
                             cexHorarioDia1
                                 .getCexHorario()
                                 .getCexEspecialidadMedico()
                                 .getAdmMedico()
                                 .getAmeNombreFull()));
                     listEspMed.add(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico());
                   }
                 }
               }
             }
           }
         }
       }
     }
     return items;
   } catch (Exception e) {
     log.error("getSelectedItemMedico() {} ", e.getMessage());
   }
   return null;
 }
  /**
   * Metodo que busca segun la especialidad , el Doctor y el horario que tiene asignado cada doctor
   * el turno mas cerca dispible
   *
   * @author David Carranza
   */
  public void buscarTurnoListener() {
    String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
    FacesContext context = FacesContext.getCurrentInstance();
    int contHor = 0;
    listaHorarioDia.clear();
    listaAgenda.clear();
    List<CexAgenda> listTempAgen;
    try {

      // Recupera permiso para saber si se puede agendar en la fecha seleccionada
      List<AdmPermiso> objLicencia =
          (List<AdmPermiso>)
              adminObject.queryEJB(
                  "select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2",
                  fechaAgenda,
                  object.getAdmMedico());
      // List<CexPermiso> objLicencia = adminObject.ejecutarQueryNativoLista("SELECT * FROM
      // cex_Permiso where med_id = " +
      // object.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedId() + " and date('"
      // + fecha + "') between per_fecha_inicio and per_fecha_fin;", CexPermiso.class);
      // Verifica si tiene permiso
      if (objLicencia.size() < 0 || objLicencia.isEmpty()) {
        // Recuper la lista del horario de acuerdo al dia seleciconado
        for (CexHorario objTemH : object.getCexHorarioList()) {
          // Agregar horario de acuerdo a la fecha
          if ((fechaAgenda.after(objTemH.getChoFechaInicio())
                  || objTemH.getChoFechaInicio().equals(fechaAgenda))
              && (fechaAgenda.before(objTemH.getChoFechaFin())
                  || objTemH.getChoFechaFin().equals(fechaAgenda))) {
            // Verificar los horarios segun el tipo de consulta de la agenda
            if (objTemH.getAdmTipoConsulta().getAtcTipo().equals(1)
                && objTemH.getAdmInstitucion().equals(user.getUser().getAdmInstitucion())) {
              // Recorrer los horarios dias de cada horario
              for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                if (objTemHd.getCexDia().getCdiId().equals(dia)) {
                  // Añadir solo el horario que tenga asignado hora inicio y hora fin
                  if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                    listaHorarioDia.add(objTemHd);
                  }
                }
              }
            }
          }
        }

        // Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
        for (CexHorariosDia objHorDia : listaHorarioDia) {
          // Asignar numero de horario
          objHorDia.setOrdenHorario(contHor);
          listTempAgen =
              adminObject.listarOrdenada(
                  CexAgenda.class,
                  "cagFecha",
                  fechaAgenda,
                  "cexHorariosDia",
                  objHorDia,
                  "cagHora",
                  true);
          for (CexAgenda objA : listTempAgen) {
            objA.setNumeroHorario(contHor);
            listaAgenda.add(objA);
          }
          listTempAgen.clear();
          contHor++;
        }

      } else {
        AdmPermiso permiso = objLicencia.get(0);
        FacesContext.getCurrentInstance()
            .addMessage(
                findComponent(context.getViewRoot(), "formDatos").getClientId(),
                new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Agenda no disponible",
                    "Médico no disponible en la fecha ha seleccioanda por motico de "
                        + permiso.getApeMotivo()
                        + ""));
      }

    } catch (Exception e) {
      log.error("{}: {} ", nombreMetodo, e);
    }
  }