@RoleAdmin
  @RoleAdminMissao
  @RoleAdminMissaoComplexo
  public static void salvar(@Valid Afastamento afastamento) throws Exception {
    String template;

    if ((afastamento.dataHoraInicio != null)
        && (afastamento.dataHoraFim != null)
        && (!afastamento.descricao.equals(""))) {
      if (!afastamento.ordemDeDatasCorreta()) {
        Validation.addError("dataHoraInicio", "afastamentos.dataHoraInicio.validation");
      }
    }

    template = afastamento.id > 0 ? "Afastamentos/editar.html" : "Afastamentos/incluir.html";

    if (Validation.hasErrors()) {
      List<Condutor> condutores = Condutor.listarTodos(AutorizacaoGI.titular().getOrgaoUsuario());
      renderTemplate(template, afastamento, condutores);
    } else {
      List<Missao> missoes =
          Missao.retornarMissoes(
              "condutor.id",
              afastamento.condutor.id,
              afastamento.condutor.cpOrgaoUsuario.getId(),
              afastamento.dataHoraInicio,
              afastamento.dataHoraFim);
      String listaMissoes = "";
      String delimitador = "";

      for (Missao item : missoes) {
        listaMissoes += delimitador;
        listaMissoes += item.getSequence();
        delimitador = ",";
      }

      if (missoes.size() > 0) {
        Validation.addError("LinkErroCondutor", listaMissoes);
        renderTemplate(template, afastamento);
      } else {
        afastamento.save();
        listarPorCondutor(afastamento.condutor.id);
      }
    }
  }
  public static void listarAgendaPorVeiculo(
      @As(
              lang = {"*"},
              value = {"dd/MM/yyyy"})
          Calendar dataPesquisa,
      Long idVeiculo)
      throws ParseException {

    String registros = "";

    Calendar dataHoraPesquisa = Calendar.getInstance();
    SimpleDateFormat formatar = new SimpleDateFormat("dd/MM/yyyy HH:mm");

    String strDataPesquisa = null;

    if (dataPesquisa != null) {
      dataHoraPesquisa = dataPesquisa;
    }

    strDataPesquisa =
        String.format("%02d", dataHoraPesquisa.get(Calendar.DAY_OF_MONTH))
            + "/"
            + String.format("%02d", dataHoraPesquisa.get(Calendar.MONTH) + 1)
            + "/"
            + String.format("%04d", dataHoraPesquisa.get(Calendar.YEAR));
    dataHoraPesquisa.setTime(formatar.parse(strDataPesquisa + " 00:00"));

    List<Missao> missoes = Missao.buscarPorVeiculos(idVeiculo, strDataPesquisa);
    List<Missao> missoesFiltradas = filtrarPorOrgao(missoes, Missao.class);

    List<ServicoVeiculo> servicosVeiculos =
        ServicoVeiculo.buscarPorVeiculo(idVeiculo, strDataPesquisa);
    List<ServicoVeiculo> servicosFiltrados =
        filtrarPorOrgao(servicosVeiculos, ServicoVeiculo.class);

    // registros = gerarTimeLine(dataHoraPesquisa,"", new ArrayList<Afastamento>(),new
    // ArrayList<Plantao>(), missoes, servicosVeiculos, "veiculo" );
    registros =
        gerarTimeLine(
            dataHoraPesquisa,
            "",
            new ArrayList<Afastamento>(),
            new ArrayList<Plantao>(),
            missoesFiltradas,
            servicosFiltrados,
            "veiculo");

    renderArgs.put("dataPesquisa", dataHoraPesquisa);

    render(registros, idVeiculo);
  }
  public static void listarMissoesEmAndamento() {
    List<Missao> missoes = Missao.buscarEmAndamento();
    List<Missao> missoesFiltradas = filtrarPorOrgao(missoes, Missao.class);

    String registros = "";
    SimpleDateFormat formatoData = new SimpleDateFormat("yyyy,M,d,H,m,s");

    //		for(int i=0; i < missoes.size(); i++){
    for (int i = 0; i < missoesFiltradas.size(); i++) {
      //			registros += "[ \'" + missoes.get(i).getSequence() + " <a href=\"a.htm\">t</a>\'"  + " ,
      // \'" + missoes.get(i).condutor.getNome() + "\', new Date(" +
      //	formatoData.format(missoes.get(i).dataHoraSaida.getTime()) + "), new Date(";
      registros +=
          "[ \'"
              + missoes.get(i).getSequence()
              + " - "
              + missoes.get(i).veiculo.placa
              + "\', \'"
              + missoes.get(i).condutor.getNome()
              + "\', new Date("
              + formatoData.format(missoes.get(i).dataHoraSaida.getTime())
              + "), new Date(";

      if (missoes.get(i).dataHoraRetorno != null) {
        registros += formatoData.format(missoes.get(i).dataHoraRetorno.getTime()) + ") ]";
      } else {
        Calendar dataHora =
            recuperarDataEHora(
                missoes.get(i).dataHoraSaida,
                HORA_FINAL_EXPEDIENTE,
                MINUTO_FINAL_EXPEDIENTE,
                SEGUNDO_FINAL_EXPEDIENTE);
        registros += formatoData.format(dataHora.getTime()) + ") ]";
      }
      if (i < missoes.size() - 1) registros += ", ";
    }
    render(registros);
  }
 public static void listarDadosDaMissao(Long id) throws Exception {
   Missao missao = Missao.findById(id);
   render(missao);
 }
  private static String gerarTimeLine(
      Calendar dataHoraPesquisa,
      String registros,
      List<Afastamento> afastamentos,
      List<Plantao> plantoes,
      List<Missao> missoes,
      List<ServicoVeiculo> servicosVeiculos,
      String entidade) {

    String delim = "";
    if (!registros.isEmpty()) delim = ", ";

    for (Afastamento afastamento : afastamentos) {
      registros += delim;
      SimpleDateFormat formatoData = new SimpleDateFormat("yyyy,M,d,H,m,s");

      registros +=
          "[ \'" + "Afastamentos" + "\', \'" + afastamento.condutor.getNome() + "\', new Date(";

      if (afastamento.dataHoraInicio.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
          && afastamento.dataHoraInicio.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
          && afastamento.dataHoraInicio.get(Calendar.DAY_OF_MONTH)
              == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
          && afastamento.dataHoraInicio.after(dataHoraPesquisa)) {
        registros += formatoData.format(afastamento.dataHoraInicio.getTime()) + "), new Date(";
      } else {
        Calendar dataHora =
            recuperarDataEHora(
                dataHoraPesquisa, HORA_INICIAL_DIA, MINUTO_INICIAL_DIA, SEGUNDO_INICIAL_DIA);
        registros += formatoData.format(dataHora.getTime()) + "), new Date(";
      }

      if (afastamento.dataHoraFim != null) {
        if (afastamento.dataHoraFim.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
            && afastamento.dataHoraFim.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
            && afastamento.dataHoraFim.get(Calendar.DAY_OF_MONTH)
                == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
            && afastamento.dataHoraFim.after(dataHoraPesquisa)) {
          registros += formatoData.format(afastamento.dataHoraFim.getTime()) + ") ]";
          delim = ", ";
          continue;
        }
      }
      Calendar dataHora =
          recuperarDataEHora(
              dataHoraPesquisa,
              HORA_FINAL_EXPEDIENTE,
              MINUTO_FINAL_EXPEDIENTE,
              SEGUNDO_FINAL_EXPEDIENTE);
      registros += formatoData.format(dataHora.getTime()) + ") ]";
      delim = ", ";
    }

    for (Plantao plantao : plantoes) {
      registros += delim;
      SimpleDateFormat formatoData = new SimpleDateFormat("yyyy,M,d,H,m,s");

      registros += "[ \'" + "Plantoes" + "\', \'" + plantao.condutor.getNome() + "\', new Date(";

      if (plantao.dataHoraInicio.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
          && plantao.dataHoraInicio.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
          && plantao.dataHoraInicio.get(Calendar.DAY_OF_MONTH)
              == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
          && plantao.dataHoraInicio.after(dataHoraPesquisa)) {
        registros += formatoData.format(plantao.dataHoraInicio.getTime()) + "), new Date(";
      } else {
        Calendar dataHora =
            recuperarDataEHora(
                dataHoraPesquisa, HORA_INICIAL_DIA, MINUTO_INICIAL_DIA, SEGUNDO_INICIAL_DIA);
        registros += formatoData.format(dataHora.getTime()) + "), new Date(";
      }

      if (plantao.dataHoraFim != null) {
        if (plantao.dataHoraFim.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
            && plantao.dataHoraFim.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
            && plantao.dataHoraFim.get(Calendar.DAY_OF_MONTH)
                == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
            && plantao.dataHoraFim.after(dataHoraPesquisa)) {
          registros += formatoData.format(plantao.dataHoraFim.getTime()) + ") ]";
          delim = ", ";
          continue;
        }
      }
      Calendar dataHora =
          recuperarDataEHora(
              dataHoraPesquisa,
              HORA_FINAL_EXPEDIENTE,
              MINUTO_FINAL_EXPEDIENTE,
              SEGUNDO_FINAL_EXPEDIENTE);
      registros += formatoData.format(dataHora.getTime()) + ") ]";
      delim = ", ";
    }

    for (ServicoVeiculo servicoVeiculo : servicosVeiculos) {
      registros += delim;
      SimpleDateFormat formatoData = new SimpleDateFormat("yyyy,M,d,H,m,s");

      registros += "[ \'" + "Servicos" + "\', \'" + servicoVeiculo.veiculo.placa + "\', new Date(";

      if (servicoVeiculo.dataHoraInicio.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
          && servicoVeiculo.dataHoraInicio.get(Calendar.MONTH)
              == dataHoraPesquisa.get(Calendar.MONTH)
          && servicoVeiculo.dataHoraInicio.get(Calendar.DAY_OF_MONTH)
              == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
          && servicoVeiculo.dataHoraInicio.after(dataHoraPesquisa)) {
        registros += formatoData.format(servicoVeiculo.dataHoraInicio.getTime()) + "), new Date(";
      } else {
        Calendar dataHora =
            recuperarDataEHora(
                dataHoraPesquisa, HORA_INICIAL_DIA, MINUTO_INICIAL_DIA, SEGUNDO_INICIAL_DIA);
        registros += formatoData.format(dataHora.getTime()) + "), new Date(";
      }

      if (servicoVeiculo.dataHoraFim != null) {
        if (servicoVeiculo.dataHoraFim.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
            && servicoVeiculo.dataHoraFim.get(Calendar.MONTH)
                == dataHoraPesquisa.get(Calendar.MONTH)
            && servicoVeiculo.dataHoraFim.get(Calendar.DAY_OF_MONTH)
                == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
            && servicoVeiculo.dataHoraFim.after(dataHoraPesquisa)) {
          registros += formatoData.format(servicoVeiculo.dataHoraFim.getTime()) + ") ]";
          delim = ", ";
          continue;
        }
      }
      Calendar dataHora =
          recuperarDataEHora(
              dataHoraPesquisa,
              HORA_FINAL_EXPEDIENTE,
              MINUTO_FINAL_EXPEDIENTE,
              SEGUNDO_FINAL_EXPEDIENTE);
      registros += formatoData.format(dataHora.getTime()) + ") ]";
      delim = ", ";
    }

    String label = "condutor";
    for (Missao missao : missoes) {
      registros += delim;
      SimpleDateFormat formatoData = new SimpleDateFormat("yyyy,M,d,H,m,s");

      if (entidade.equals("condutor")) {
        label = missao.getSequence() + "-" + missao.condutor.getNome();
      } else {
        label = missao.getSequence() + "-" + missao.veiculo.placa;
      }

      registros += "[ \'" + "Missoes" + "\', \'" + label + "\', new Date(";

      if (missao.dataHoraSaida.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
          && missao.dataHoraSaida.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
          && missao.dataHoraSaida.get(Calendar.DAY_OF_MONTH)
              == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
          && missao.dataHoraSaida.after(dataHoraPesquisa)) {
        registros += formatoData.format(missao.dataHoraSaida.getTime()) + "), new Date(";
      } else {
        Calendar dataHora =
            recuperarDataEHora(
                dataHoraPesquisa, HORA_INICIAL_DIA, MINUTO_INICIAL_DIA, SEGUNDO_INICIAL_DIA);
        registros += formatoData.format(dataHora.getTime()) + "), new Date(";
      }

      if (missao.dataHoraRetorno != null) {
        if (missao.dataHoraRetorno.get(Calendar.YEAR) == dataHoraPesquisa.get(Calendar.YEAR)
            && missao.dataHoraRetorno.get(Calendar.MONTH) == dataHoraPesquisa.get(Calendar.MONTH)
            && missao.dataHoraRetorno.get(Calendar.DAY_OF_MONTH)
                == dataHoraPesquisa.get(Calendar.DAY_OF_MONTH)
            && missao.dataHoraRetorno.after(dataHoraPesquisa)) {
          registros += formatoData.format(missao.dataHoraRetorno.getTime()) + ") ]";
          delim = ", ";
          continue;
        }
      }
      Calendar dataHora =
          recuperarDataEHora(
              dataHoraPesquisa,
              HORA_FINAL_EXPEDIENTE,
              MINUTO_FINAL_EXPEDIENTE,
              SEGUNDO_FINAL_EXPEDIENTE);
      registros += formatoData.format(dataHora.getTime()) + ") ]";
      delim = ", ";
    }
    return registros;
  }
  public static void listarAgendaPorCondutor(
      @As(
              lang = {"*"},
              value = {"dd/MM/yyyy"})
          Calendar dataPesquisa,
      Long idCondutor)
      throws ParseException {

    String registros = "";

    Calendar dataHoraPesquisa = Calendar.getInstance();
    SimpleDateFormat formatar = new SimpleDateFormat("dd/MM/yyyy HH:mm");

    String strDataPesquisa = null;

    if (dataPesquisa != null) {
      dataHoraPesquisa = dataPesquisa;
    }

    strDataPesquisa =
        String.format("%02d", dataHoraPesquisa.get(Calendar.DAY_OF_MONTH))
            + "/"
            + String.format("%02d", dataHoraPesquisa.get(Calendar.MONTH) + 1)
            + "/"
            + String.format("%04d", dataHoraPesquisa.get(Calendar.YEAR));
    dataHoraPesquisa.setTime(formatar.parse(strDataPesquisa + " 00:00"));

    List<EscalaDeTrabalho> escalas =
        EscalaDeTrabalho.buscarPorCondutores(idCondutor, strDataPesquisa);
    List<EscalaDeTrabalho> escalasFiltradas = filtrarPorOrgao(escalas, EscalaDeTrabalho.class);

    List<Afastamento> afastamentos = Afastamento.buscarPorCondutores(idCondutor, strDataPesquisa);
    List<Afastamento> afastamentosFiltrados = filtrarPorOrgao(afastamentos, Afastamento.class);

    List<Plantao> plantoes = Plantao.buscarPorCondutores(idCondutor, strDataPesquisa);
    List<Plantao> plantoesFiltrados = filtrarPorOrgao(plantoes, Plantao.class);

    List<Missao> missoes = Missao.buscarPorCondutores(idCondutor, strDataPesquisa);
    List<Missao> missoesFiltradas = filtrarPorOrgao(missoes, Missao.class);

    String delim = "";
    // for (EscalaDeTrabalho escala : escalas) {
    for (EscalaDeTrabalho escala : escalasFiltradas) {

      SimpleDateFormat formatar1 = new SimpleDateFormat("dd/MM/yyyy HH:mm");
      String srtDataPesquisa = formatar1.format(dataHoraPesquisa.getTime());

      DiaDaSemana diaDePesquisa = DiaDaSemana.getDiaDaSemana(srtDataPesquisa);

      SimpleDateFormat formatoData1 = new SimpleDateFormat("yyyy,M,d,H,m,s");

      Calendar dataHoraInicioTemp = Calendar.getInstance();
      Calendar dataHoraFimTemp =
          recuperarDataEHora(
              escala.dataVigenciaInicio, HORA_FINAL_DIA, MINUTO_FINAL_DIA, SEGUNDO_FINAL_DIA);

      for (DiaDeTrabalho dia : escala.diasDeTrabalho) {
        if (diaDePesquisa.equals(dia.diaEntrada)) {
          dataHoraInicioTemp =
              recuperarDataEHora(
                  dataHoraPesquisa,
                  dia.horaEntrada.get(Calendar.HOUR_OF_DAY),
                  dia.horaEntrada.get(Calendar.MINUTE),
                  dia.horaEntrada.get(Calendar.SECOND));
          if (diaDePesquisa.equals(dia.diaSaida)) {
            dataHoraFimTemp =
                recuperarDataEHora(
                    dataHoraPesquisa,
                    dia.horaSaida.get(Calendar.HOUR_OF_DAY),
                    dia.horaSaida.get(Calendar.MINUTE),
                    dia.horaSaida.get(Calendar.SECOND));
          } else {
            dataHoraFimTemp =
                recuperarDataEHora(
                    dataHoraPesquisa,
                    HORA_FINAL_EXPEDIENTE,
                    MINUTO_FINAL_EXPEDIENTE,
                    SEGUNDO_FINAL_EXPEDIENTE);
          }

          registros += delim;
          registros +=
              "[ \'"
                  + "Escalas"
                  + "\', \'"
                  + escala.condutor.getNome()
                  + "\', new Date("
                  + formatoData1.format(dataHoraInicioTemp.getTime())
                  + "), new Date(";
          registros += formatoData1.format(dataHoraFimTemp.getTime()) + ") ]";
          delim = ", ";
        }
      }
    }

    String registrosEscala = registros;
    // registros = gerarTimeLine(dataHoraPesquisa,registrosEscala, afastamentos, plantoes, missoes,
    // new ArrayList<ServicoVeiculo>(), "condutor");
    registros =
        gerarTimeLine(
            dataHoraPesquisa,
            registrosEscala,
            afastamentosFiltrados,
            plantoesFiltrados,
            missoesFiltradas,
            new ArrayList<ServicoVeiculo>(),
            "condutor");

    renderArgs.put("dataPesquisa", dataHoraPesquisa);

    render(registros, idCondutor);
  }