@SuppressWarnings({"unchecked", "rawtypes"})
  public void populaListaChamadaRealizada(Integer codChamada) {
    ArrayList<ChamadaWrapper> list = new ArrayList();

    for (FrequenciaAluno fa : frequenciaAlunoDao.getByProperty("fa.codChamada=", codChamada)) {
      Boolean presente = ("s".equals(fa.getPresente())) ? true : false;
      Boolean faltaJustificada = ("s".equals(fa.getFaltaJustificada()) && !presente) ? true : false;

      list.add(new ChamadaWrapper(presente, faltaJustificada, fa.getObservacao(), fa.getAluno()));
    }

    setListaDePresenca(list);
  }
  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 "";
  }