public void changeListener(ValueChangeEvent e) {
    if ("filtroTurma".equals(e.getComponent().getId())) {
      setCodTurma((e.getNewValue() != null) ? Integer.valueOf(e.getNewValue().toString()) : null);
      setCodDiscTurma(null);

      setListaDePresenca(null);
      populaListaChamadaRealizada(null);
      populaChamadasRealizadas(null);

      return;

    } else if ("filtroDisciplina".equals(e.getComponent().getId())) {
      setCodDiscTurma(
          (e.getNewValue() != null) ? Integer.valueOf(e.getNewValue().toString()) : null);

      populaChamadasRealizadas(getCodDiscTurma());
    } else if ("filtroData".equals(e.getComponent().getId())) {
      setDataAula((e.getNewValue() != null) ? (Date) e.getNewValue() : null);

      if (getCodTurma() == null || getCodDiscTurma() == null) {
        setListaDePresenca(null);
        populaListaChamadaRealizada(null);
        populaChamadasRealizadas(null);

        return;
      }
    }

    Frequencia frequenciaExistente = frequenciaDao.getChamada(getCodDiscTurma(), getDataAula());

    if (frequenciaExistente == null) {
      // Ativa/desativa campos
      acessibilidadeCampos(null, null);

      // Esconde mensagem chamada realizada
      setChamadaRealizada(null);

      populaListaParaChamada();
    } else {
      // Ativa/desativa campos
      acessibilidadeCampos(
          frequenciaExistente.getCodUsuario(), frequenciaExistente.getDataChamada());

      // Mostra mensagem chamada realizada
      setChamadaRealizada(frequenciaExistente.getDataChamada());

      populaListaChamadaRealizada(frequenciaExistente.getCodChamada());
    }
  }
  public String gravarChamada() {
    if (getDataAula().before(new Date())) {
      try {
        Frequencia frequenciaExistente = frequenciaDao.getChamada(getCodDiscTurma(), getDataAula());

        if (frequenciaExistente == null) {
          Frequencia frequencia = new Frequencia();
          frequencia.setCodDiscTurma(getCodDiscTurma());
          frequencia.setDataAula(getDataAula());
          frequencia.setDataChamada(new Date());
          frequencia.setCodUsuario(usuarioLogado.getCodUsuario());

          frequenciaDao.insert(frequencia);

          if (frequencia.getCodChamada() != null) {
            for (ChamadaWrapper c : getListaDePresenca()) {
              String presente = (c.estaPresente) ? "s" : "n";
              String faltaJustificada = (c.faltaJustificada && !c.estaPresente) ? "s" : "n";

              frequenciaAlunoDao.insert(
                  new FrequenciaAluno(
                      c.aluno.getCodAluno(),
                      frequencia.getCodChamada(),
                      presente,
                      faltaJustificada,
                      c.observacao));
            }

            // Ativa/desativa campos
            acessibilidadeCampos(frequencia.getCodUsuario(), dataHoje());

            populaListaChamadaRealizada(frequencia.getCodChamada());

            populaChamadasRealizadas(frequencia.getCodDiscTurma());

            Message.successMessage("Chamada gravada com sucesso");
          } else {
            Message.errorMessage("Houve um erro ao gravar chamada");
          }
        } else {
          // Garante que somente pessoas autorizadas podem editar a chamada
          if ("a".equals(usuarioLogado.getTipo())
              || "s".equals(usuarioLogado.getTipo())
              || usuarioLogado.getCodUsuario().equals(frequenciaExistente.getCodUsuario())) {

            for (ChamadaWrapper c : getListaDePresenca()) {
              String presente = (c.estaPresente) ? "s" : "n";
              String faltaJustificada = (c.faltaJustificada && !c.estaPresente) ? "s" : "n";

              frequenciaAlunoDao.update(
                  new FrequenciaAluno(
                      c.aluno.getCodAluno(),
                      frequenciaExistente.getCodChamada(),
                      presente,
                      faltaJustificada,
                      c.observacao));
            }

            populaListaChamadaRealizada(frequenciaExistente.getCodChamada());

            Message.successMessage("Chamada editada com sucesso");
          }
        }
      } catch (Exception e) {
        Message.errorMessage(e.getMessage());
      }
    } else {
      Message.warningMessage("Não é permitido fazer chamadas para datas futuras");
    }

    return "";
  }