package br.com.elotech.saude.dao.impl;

import br.com.elotech.config.ConnectionUtil;
import br.com.elotech.enuns.SistemaEnum;
import br.com.elotech.enuns.TipoRelEnum;
import br.com.elotech.saude.dao.SaudeDao;
import br.com.elotech.saude.filters.FormatFilters;
import br.com.elotech.saude.model.agendamento.*;
import br.com.elotech.saude.model.atendimento.AtendimentoClassificacao;
import br.com.elotech.saude.model.bpa.BpaIdade;
import br.com.elotech.saude.model.bpa.ProcedimentosGerais;
import br.com.elotech.saude.model.bpa.ProcedimentosUnidade;
import br.com.elotech.saude.model.farmacia.ConsultaDadosHorus;
import br.com.elotech.saude.model.farmacia.DispensacaoTipoReceita;
import br.com.elotech.saude.model.filters.*;
import br.com.elotech.saude.model.filters.agendamento.*;
import br.com.elotech.saude.model.filters.atendimento.AtendimentoClassificacaoFilter;
import br.com.elotech.saude.model.filters.bpa.BpaIdadeFilter;
import br.com.elotech.saude.model.filters.bpa.ProcedimentosGeraisFilter;
import br.com.elotech.saude.model.filters.bpa.ProcedimentosUnidadeFilter;
import br.com.elotech.saude.model.filters.estratificacao.*;
import br.com.elotech.saude.model.filters.farmacia.ConsultaDadosHorusFilter;
import br.com.elotech.saude.model.filters.farmacia.DispensacaoTipoReceitaFilter;
import br.com.elotech.saude.model.filters.laboratorio.ExamesPorPrestadorFilter;
import br.com.elotech.saude.model.filters.materiais.ContagemEstoqueFilter;
import br.com.elotech.saude.model.filters.materiais.InventarioFilter;
import br.com.elotech.saude.model.filters.materiais.MovimentoSaidaFilter;
import br.com.elotech.saude.model.filters.materiais.SaidaTransferenciaMateriaisFilter;
import br.com.elotech.saude.model.filters.prontuario.ConcessaoFilter;
import br.com.elotech.saude.model.filters.paciente.EtiquetaFilter;
import br.com.elotech.saude.model.filters.prontuario.ConcessaoFilter;
import br.com.elotech.saude.model.filters.prontuario.LaudoApacFilter;
import br.com.elotech.saude.model.filters.prontuario.ReceitaMedicaEspecialFilter;
import br.com.elotech.saude.model.filters.prontuario.ReceitaMedicaFilter;
import br.com.elotech.saude.model.filters.psf.BuscaAtivaFilter;
import br.com.elotech.saude.model.filters.psf.DomicilioVinculadoFilter;
import br.com.elotech.saude.model.filters.psf.PrescricaoMedicamentosFilter;
import br.com.elotech.saude.model.filters.psf.VisitaDomiciliarFilter;
import br.com.elotech.saude.model.filters.transporte.ViagemFilter;
import br.com.elotech.saude.model.filters.transporte.ViagensFilter;
import br.com.elotech.saude.model.filters.vacinacao.CarteirinhaVacinacaoFilter;
import br.com.elotech.saude.model.filters.vacinas.AtestadoVacinaFilter;
import br.com.elotech.saude.model.filters.vacinas.ControleVacinadosPorVacinaFilter;
import br.com.elotech.saude.model.laboratorio.ExamesPorPrestador;
import br.com.elotech.saude.model.materiais.ContagemEstoque;
import br.com.elotech.saude.model.materiais.Inventario;
import br.com.elotech.saude.model.materiais.MovimentoSaida;
import br.com.elotech.saude.model.materiais.SaidaTransferenciaMateriais;
import br.com.elotech.saude.model.pacientes.EtiquetaPaciente;
import br.com.elotech.saude.model.pacientes.PacientesFaixaSexo;
import br.com.elotech.saude.model.prontuario.*;
import br.com.elotech.saude.model.psf.areamicroarea.EstatisticasAreaMicroArea;
import br.com.elotech.saude.model.psf.domiciliovinculado.DomicilioVinculado;
import br.com.elotech.saude.model.psf.domiciliovinculado.Participantes;
import br.com.elotech.saude.model.psf.estratificacao.*;
import br.com.elotech.saude.model.psf.prescricaomedicamentos.PrescricaoMedicamentos;
import br.com.elotech.saude.model.psf.visitadomiciliar.BuscaAtiva;
import br.com.elotech.saude.model.psf.visitadomiciliar.Motivos;
import br.com.elotech.saude.model.psf.visitadomiciliar.VisitaDomiciliar;
import br.com.elotech.saude.model.transporte.Acompanhante;
import br.com.elotech.saude.model.transporte.ListaViagem;
import br.com.elotech.saude.model.transporte.Viagens;
import br.com.elotech.saude.model.vacinacao.Carteirinha;
import br.com.elotech.saude.model.vacinacao.CarteirinhaPaciente;
import br.com.elotech.saude.model.vacinacao.InformacoesCarteirinha;
import br.com.elotech.saude.model.vacinas.AtestadoVacina;
import br.com.elotech.saude.model.vacinas.ControleVacinadosPorVacina;
import br.com.elotech.saude.model.vacinas.VacinaAprazada;
import br.com.elotech.saude.scripts.*;
import br.com.elotech.util.JasperCreator;
import br.com.elotech.util.Util;
import org.apache.commons.lang3.StringUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.*;

import static br.com.elotech.enuns.TipoRelEnum.SINTETICO;

public class SaudeDaoImpl implements SaudeDao {

  private Connection conn;
  private ResultSet rs;
  private JasperCreator creator;
  private Map<String, Object> params = new HashMap<>();

  @Override
  public void agendamentoPorUnidade(AgendamentoPorUnidadeFilter filter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("uni_codigo", filter.getUnidade());
    }
    rs = Util.resolveResultSet(AgendamentoScript.getSqlAgendamentoPorUnidade(filter), params);

    List<AgendamentoPorUnidade> data = new ArrayList<>();
    while (rs.next()) {
      AgendamentoPorUnidade apu = new AgendamentoPorUnidade();
      apu.setUnidade(rs.getString("unidade"));
      switch (filter.getTpRel()) {
      case SINTETICO:
        apu.setTotal(rs.getInt("quantidade"));
        break;
      case ANALITICO:
        apu.setMedico(rs.getString("medico"));
        apu.setPaciente(rs.getString("paciente"));
        apu.setTelefone(rs.getString("telefone"));
        apu.setData(rs.getString("data"));
        apu.setHora(rs.getString("hora"));
        break;
      }
      data.add(apu);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Agendamento por Unidade";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAgendamentoPorUnidade(filter));
    creator.gerarPdf();
  }

  @Override
  public void filaDeEspera(FilaDeEsperaFilter filter) throws Exception {
    if (filter.getFilaCodigo() != null) {
      params.put("fila_codigo", filter.getFilaCodigo());
    }
    if (filter.getUsuCodigo() != null) {
      params.put("usu_codigo", filter.getUsuCodigo());
    }
    if (filter.getEspCodigo() != null) {
      params.put("esp_codigo", filter.getEspCodigo());
    }
    if (filter.getFitiCodigo() != null) {
      params.put("fiti_codigo", filter.getFitiCodigo());
    }
    if (filter.getFiprCodigo() != null) {
      params.put("fipr_codigo", filter.getFiprCodigo());
    }
    if (filter.getStatus() != null) {
      params.put("fiusu_status", filter.getStatus());
    }
    if (filter.getUniCodigo() != null) {
      params.put("uni_codigo", filter.getUniCodigo());
    }
    if (filter.getProcCodigo() != null) {
      params.put("proc_codigo", filter.getProcCodigo());
    }
    if (filter.getUsrCodigo() != null) {
      params.put("usr_codigo", filter.getUsrCodigo());
    }
    if (filter.getDataEntrada() != null) {
      params.put("fiusu_data_entrada", Util.dateToTimeStamp(filter.getDataEntrada()));
    }
    rs = Util.resolveResultSet(FilaDeEsperaScript.getSql(filter), params);
    List<FilaDeEspera> data = new ArrayList<>();
    while (rs.next()) {
      FilaDeEspera fe = new FilaDeEspera();
      fe.setFila(rs.getString("fila_nome"));
      fe.setOrdem(rs.getInt("fiusu_ordem"));
      fe.setUsuario(rs.getString("usu_nome"));
      fe.setCartaoSus(rs.getString("usu_cartao_sus"));
      fe.setCelular(rs.getString("usu_celular"));
      fe.setTelefone(rs.getString("usu_fone"));
      fe.setMedicoSolicitante(rs.getString("medico_solicitante"));
      fe.setAtendimento(rs.getString("fiti_nome"));
      fe.setPrioridade(rs.getString("fipr_nome"));
      fe.setDataEntrada(rs.getTimestamp("fiusu_data_entrada"));
      fe.setStatus(rs.getString("fiusu_status"));
      fe.setProcedimento(rs.getString("proc_nome"));
      fe.setEspecialidade(rs.getString("especialidade"));

      data.add(fe);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Filas de Espera";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterFilaDeEspera(filter));
    creator.addParameter("AGRUPAMENTO", filter.getAgrupamento());
    creator.gerarPdf();
  }

  @Override
  public void producaoFilaDeEspera(ProducaoFilaDeEsperaFilter filter) throws Exception {
    if (filter.getFilaCodigo() != null) {
      params.put("fila_codigo", filter.getFilaCodigo());
    }

    if (filter.getStatus() != null) {
      params.put("status", filter.getStatus());
    }

    if (filter.getUsrCodigo() != null) {
      params.put("usr_codigo", filter.getUsrCodigo());
    }

    if (filter.getDataInicial() != null) {
      params.put("data_inicial", Util.dateToTimeStamp(filter.getDataInicial()));
    }

    if (filter.getDataFinal() != null) {
      params.put("data_final", Util.dateToTimeStamp(filter.getDataFinal()));
    }

    rs = Util.resolveResultSet(ProducaoFilaDeEsperaScript.getSql(filter), params);
    List<ProducaoFilaDeEspera> data = new ArrayList<>();

    while (rs.next()) {
      ProducaoFilaDeEspera pfe = new ProducaoFilaDeEspera();
      pfe.setFilaNome(rs.getString("fila_nome"));
      pfe.setUsrNome(rs.getString("usr_nome"));
      pfe.setQuantidade(rs.getInt("quantidade"));

      switch (rs.getString("fihi_status")) {
      case "AR":
        pfe.setStatus("Solicitação Aguardando Liberação");
        break;
      case "ES":
        pfe.setStatus("Solicitação Liberada");
        break;
      case "SA":
        pfe.setStatus("Solicitação Agendada");
        break;
      case "AT":
        pfe.setStatus("Atendimento Realizado");
        break;
      case "SR":
        pfe.setStatus("Solicitação Retornada");
        break;
      case "CA":
        pfe.setStatus("Solicitação Cancelada");
        break;
      }

      data.add(pfe);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Filas de Espera";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterProducaoFilaDeEspera(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoHdi(EstratificacaoHdiFilter filter) throws Exception {

    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }
    if (filter.getEquipe() != null) {
      params.put("equipe", filter.getEquipe());

    }
    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }
    if (filter.getRisco() != null) {
      params.put("risco", filter.getRisco());
    }

    rs = Util.resolveResultSet(EstratificacaoRiscoScript.getSqlEstratificacaoHdi(filter), params);

    List<EstratificacaoHdi> data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoHdi hdi = new EstratificacaoHdi();
      hdi.setUnidade(rs.getString("unidade"));
      hdi.setIneEquipe(rs.getString("ineEquipe"));
      hdi.setNomeEquipe(rs.getString("nomeEquipe"));
      hdi.setMicroArea(rs.getString("microArea"));
      hdi.setTpRel(filter.getTpRel().name());
      hdi.setResponsavel(rs.getString("responsavel"));

      switch (filter.getTpRel()) {
      case SINTETICO:
        hdi.setQtdeHipertenso(rs.getInt("qtde_hipertenso"));
        hdi.setQtdeDiabete(rs.getInt("qtde_diabetico"));
        hdi.setQtdeIdoso(rs.getInt("qtde_idoso"));
        hdi.setFiltroHipertenso(filter.getHipertenso());
        hdi.setFiltroDiabete(filter.getDiabetico());
        hdi.setFiltroIdoso(filter.getIdoso());
        break;
      case ANALITICO:
        hdi.setNome(rs.getString("nome"));
        hdi.setDataNascimento(rs.getString("dataNascimento"));
        hdi.setIdade(rs.getInt("idade"));
        hdi.setCns(rs.getString("cns"));
        if (hdi.getIdade() >= 60) {
          hdi.setIdoso("t");
        } else {
          hdi.setIdoso("f");
        }
        hdi.setHipertensao(rs.getString("hipertenso"));
        hdi.setDiabete(rs.getString("diabetico"));
        hdi.setRiscoHipertensao(rs.getString("riscoHipertensao"));
        hdi.setRiscoDiabete(rs.getString("riscoDiabetes"));
        hdi.setRiscoIdoso(rs.getString("riscoIdoso"));
        hdi.setFiltroHipertenso(filter.getHipertenso());
        hdi.setFiltroDiabete(filter.getDiabetico());
        hdi.setFiltroIdoso(filter.getIdoso());
        break;
      }
      if (filter.getFaixaEtaria() != null) {
        hdi.setFaixaEtaria(rs.getString("faixa"));
      }
      data.add(hdi);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name().toLowerCase());
    String titulo = "Relatório de Estratificação Hipertensos, Diabéticos e Idosos";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstratificacaoHdi(filter));
    creator.gerarPdf();
  }

  @Override
  public void prescricaoMedicamentos(PrescricaoMedicamentosFilter filter) throws Exception {

    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }

    if (filter.getEquipe() != null) {
      params.put("equipe", filter.getEquipe());
    }

    if (filter.getRiscoDiabetico() != null) {
      params.put("riscoDiabetico", filter.getRiscoDiabetico());
    }

    if (filter.getRiscoHipertenso() != null) {
      params.put("riscoHipertenso", filter.getRiscoHipertenso());
    }

    if(filter.getDataInicial() != null) {
      params.put("dataInicial", Util.dateToTimeStamp(filter.getDataInicial()));
    }

    if(filter.getDataFinal() != null) {
      params.put("dataFinal", Util.dateToTimeStamp(filter.getDataFinal()));
    }

    rs = Util.resolveResultSet(PrescricaoMedicamentosScript.getSql(filter), params);

    List<PrescricaoMedicamentos> data = new ArrayList<>();
    while (rs.next()) {
      PrescricaoMedicamentos prescricaoMedicamentos = new PrescricaoMedicamentos();
      prescricaoMedicamentos.setNomePaciente(rs.getString("nomePaciente"));
      prescricaoMedicamentos.setDiabete(rs.getString("diabete"));
      prescricaoMedicamentos.setRiscoDiabete(rs.getString("riscoDiabete"));
      prescricaoMedicamentos.setHipertensao(rs.getString("hipertensao"));
      prescricaoMedicamentos.setRiscoHipertensao(rs.getString("riscoHipertensao"));
      prescricaoMedicamentos.setNomeMedicacao(rs.getString("nomeMedicacao"));
      prescricaoMedicamentos.setProfissionalQuePrescreveu(rs.getString("profissionalQuePrescreveu"));
      prescricaoMedicamentos.setQtdMedicacaoPrescrita(rs.getString("qtdMedicacaoPrescrita"));

      Date dataReceita = rs.getDate("dataReceita");

      prescricaoMedicamentos.setDataReceita(new SimpleDateFormat("dd/MM/yyyy").format(dataReceita));

      data.add(prescricaoMedicamentos);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Prescrição de Medicamentos";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterPrescricaoMedicamentos(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoGestantesPuerperas(EstratificacaoGestantesPuerperasFilter filter) throws Exception {
    params.put("uni_codigo", filter.getUnidade());
    params.put("tipo_consulta", filter.getTpDados().getRet());

    if (filter.getEquipe() != null) {
      params.put("nu_equipe", filter.getEquipe());
    }
    if (filter.getProfissional() != null) {
      params.put("mic_responsavel", filter.getProfissional());
    }
    if (filter.getRisco() != null) {
      params.put("risco_gestacao", filter.getRisco());
    }

    if (filter.getTpRel().equals(SINTETICO)) {
      rs = Util.resolveResultSet(EstratificacaoRiscoScript.getSqlGestantesPuerperasSintetico(filter), params);
    } else {
      rs = Util.resolveResultSet(EstratificacaoRiscoScript.getSqlGestantesPuerperasAnalitico(filter), params);
    }

    List data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoGestantesPuerperas erf = new EstratificacaoGestantesPuerperas();
      erf.setRiscoGestacao(rs.getString("risco_gestacao"));
      erf.setMicroarea(rs.getString("microarea"));
      erf.setResponsavel(rs.getString("responsavel"));
      erf.setEquipe(rs.getString("equipe"));
      erf.setQtdeAtendimentoGestacao(rs.getInt("qtde_atendimentos_gestacao"));
      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        erf.setCidadao(rs.getString("cidadao"));
        erf.setDtNascimento(rs.getDate("dt_nascimento"));
        erf.setIdade(rs.getInt("idade"));
        erf.setCns(rs.getString("cns"));
        erf.setAteCodigo(rs.getInt("ate_codigo"));
        erf.setTipoConsulta(rs.getString("tipo_consulta"));
        erf.setNumGestacao(rs.getInt("num_gestacao"));
        erf.setIdadeGestacional(rs.getInt("idade_gestacional"));
        erf.setDtProvavelParto(rs.getDate("dt_provavel_parto"));
        erf.setDtUltimoParto(rs.getDate("dt_ultimo_parto"));
      }
      data.add(erf);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name());
    String titulo = "Relatório de Estratificação de Risco - Gestantes e Puérperas";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.addParameter("TP_DADOS", filter.getTpDados().name());
    creator.setFiltro(FormatFilters.filterEstratificacao(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoSaudeBucal(EstratificacaoSaudeBucalFilter filter) throws Exception {
    params.put("uni_codigo", filter.getUnidade());
    if (filter.getEquipe() != null) {
      params.put("nu_equipe", filter.getEquipe());
    }
    if (filter.getProfissional() != null) {
      params.put("mic_responsavel", filter.getProfissional());
    }
    if (filter.getRisco() != null) {
      params.put("risco", filter.getRisco());
    }
    String sql = (filter.getTpRel().equals(SINTETICO)
      ? EstratificacaoRiscoScript.getSqlSaudeBucalSintetico(filter)
      : EstratificacaoRiscoScript.getSqlSaudeBucalAnalitico(filter));
    rs = Util.resolveResultSet(sql, params);
    List<EstratificacaoSaudeBucal> data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoSaudeBucal esb = new EstratificacaoSaudeBucal();
      esb.setRisco(rs.getString("risco"));
      esb.setEquipe(rs.getString("equipe"));
      esb.setMicroarea(rs.getString("microarea"));
      esb.setResponsavel(rs.getString("responsavel"));
      if (filter.getTpRel().equals(SINTETICO)) {
        esb.setQuantidade(rs.getInt("quantidade"));
      } else {
        esb.setCidadao(rs.getString("cidadao"));
        esb.setDtNascimento(rs.getDate("dt_nascimento"));
        esb.setIdade(rs.getInt("idade"));
        esb.setCns(rs.getString("cns"));
      }
      data.add(esb);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Estratificação de Risco - Saúde Bucal";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstratificacao(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoFamiliar(EstratificacaoFamiliarFilter familiarFilter) throws Exception {
    params.put("unidade", familiarFilter.getUnidade());
    if (familiarFilter.getEquipe() != null) {
      params.put("equipe", familiarFilter.getEquipe());
    }
    if (familiarFilter.getProfissional() != null) {
      params.put("profissional", familiarFilter.getProfissional());
    }
    if (familiarFilter.getRisco() != null && !(familiarFilter.getRisco().contains("N"))) {
      params.put("riscoFamiliar", familiarFilter.getRisco());
    }

    if (familiarFilter.getTpRel().equals(SINTETICO)) {
      rs = Util
        .resolveResultSet(EstratificacaoRiscoScript.getSqlEstratificacaoFamiliarSintetico(familiarFilter), params);
    } else {
      rs = Util
        .resolveResultSet(EstratificacaoRiscoScript.getSqlEstratificacaoFamiliarAnalitico(familiarFilter), params);
    }

    List data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoFamiliar erf = new EstratificacaoFamiliar();
      erf.setUnidade(rs.getString("unidade"));
      erf.setNomeEquipe(rs.getString("nomeEquipe"));
      erf.setIneEquipe(rs.getString("ineEquipe"));
      erf.setMicroArea(rs.getString("microarea"));
      erf.setResponsavelMicroArea(rs.getString("profissional_responsavel"));
      erf.setRiscoFamiliar(rs.getString("estrat_risco_familiar"));

      if (familiarFilter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        erf.setResponsavelDomicilio(rs.getString("usuario_responsavel"));
        erf.setCns(rs.getString("cns"));
        erf.setEndereco(
          rs.getString("tipoLog").toUpperCase()
            .concat(" ")
            .concat(rs.getString("logradouro"))
            .concat(", ")
            .concat((rs.getString("numero").contentEquals("0") ? "S/N " : rs.getString("numero")))
            .concat(rs.getString("complemento") != null ? ", " + rs.getString("complemento").toUpperCase() : ""));
        erf.setDomCodigo(rs.getInt("domCodigo"));
      } else {
        erf.setQtde(rs.getInt("qtde"));
      }
      data.add(erf);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(familiarFilter.getTpRel().name());
    String titulo = "Relatório de Estratificação de Risco - Familiar";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, familiarFilter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstratificacao(familiarFilter));
    creator.gerarPdf();

  }

  @Override
  public void estatisticasAreaMicroArea(EstatisticasAreaMicroAreaFilter filter) throws Exception {
    params.put("uni_codigo", filter.getUnidade());
    if (filter.getEquipe() != null) {
      params.put("nu_equipe", filter.getEquipe());
    }
    if (filter.getMicroarea() != null) {
      params.put("mic_codigo", filter.getMicroarea());
    }

    String sql = (filter.getTpRel().equals(SINTETICO)
      ? EstatisticasAreaMicroAreaScript.getSqlSintetico(filter)
      : EstatisticasAreaMicroAreaScript.getSqlAnalitico(filter));

    rs = Util.resolveResultSet(sql, params);
    List<EstatisticasAreaMicroArea> data = new ArrayList();
    while (rs.next()) {
      EstatisticasAreaMicroArea eam = new EstatisticasAreaMicroArea();
      eam.setEquipe(rs.getString("equipe"));
      eam.setMicroarea(rs.getString("microarea"));
      eam.setResponsavel(rs.getString("responsavel"));
      if (filter.getTpRel().equals(SINTETICO)) {
        eam.setHanseniaseSIM(rs.getInt("hanseniase_sim"));
        eam.setHanseniaseNAO(rs.getInt("hanseniase_nao"));
        eam.setHanseniaseNI(rs.getInt("hanseniase_ninformado"));

        eam.setTabagistaSIM(rs.getInt("tabagistas_sim"));
        eam.setTabagistaNAO(rs.getInt("tabagistas_nao"));
        eam.setTabagistaNI(rs.getInt("tabagistas_ninformado"));

        eam.setTuberculoseSIM(rs.getInt("tuberculose_sim"));
        eam.setTuberculoseNAO(rs.getInt("tuberculose_nao"));
        eam.setTuberculoseNI(rs.getInt("tuberculose_ninformado"));
      } else {
        eam.setCidadao(rs.getString("cidadao"));
        eam.setDtNascimento(rs.getDate("dt_nascimento"));
        eam.setIdade(rs.getInt("idade"));
        eam.setCns(rs.getString("cns"));
        eam.setHanseniase(rs.getString("hanseniase"));
        eam.setTabagista(rs.getString("tabagista"));
        eam.setTuberculose(rs.getString("tuberculose"));
      }

      data.add(eam);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name().toLowerCase());
    String titulo = "Relatório de Estatísticas de Área e Micro-Área";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstatistica(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoSaudeMental(EstratificacaoSaudeMentalFilter filter) throws Exception {
    params.put("uni_codigo", filter.getUnidade());
    if (filter.getEquipe() != null) {
      params.put("nu_equipe", filter.getEquipe());
    }
    if (filter.getProfissional() != null) {
      params.put("mic_responsavel", filter.getProfissional());
    }
    if (filter.getRisco() != null) {
      params.put("risco", filter.getRisco());
    }
    String sql = (filter.getTpRel().equals(SINTETICO)
      ? EstratificacaoRiscoScript.getSqlSaudeMentalSintetico(filter)
      : EstratificacaoRiscoScript.getSqlSaudeMentalAnalitico(filter));
    rs = Util.resolveResultSet(sql, params);
    List<EstratificacaoSaudeMental> data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoSaudeMental esb = new EstratificacaoSaudeMental();
      esb.setRisco(rs.getString("risco"));
      esb.setEquipe(rs.getString("equipe"));
      esb.setMicroarea(rs.getString("microarea"));
      esb.setResponsavel(rs.getString("responsavel"));
      if (filter.getTpRel().equals(SINTETICO)) {
        esb.setQuantidade(rs.getInt("quantidade"));
      } else {
        esb.setCidadao(rs.getString("cidadao"));
        esb.setCns(rs.getString("cns"));
        esb.setDtNascimento(rs.getDate("dt_nascimento"));
        esb.setIdade(rs.getInt("idade"));
        esb.setUsaAlcool(rs.getString("usa_alcool"));
        esb.setUsaFumante(rs.getString("usa_fumante"));
        esb.setUsaDrogas(rs.getString("usa_drogas"));
      }
      data.add(esb);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Estratificação de Risco - Saúde Mental";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstratificacao(filter));
    creator.gerarPdf();
  }

  @Override
  public void estratificacaoCrianca(EstratificacaoCriancaFilter criancaFilter) throws Exception {
    Integer qtdeRiscoAlto = 0;
    Integer qtdeRiscoInt = 0;
    Integer qtdeRiscoHab = 0;
    Integer qtdeRiscoNaoEx = 0;

    if (criancaFilter.getUnidade() != null) {
      params.put("unidade", criancaFilter.getUnidade());
    }
    if (criancaFilter.getEquipe() != null) {
      params.put("equipe", criancaFilter.getEquipe());
    }
    if (criancaFilter.getProfissional() != null) {
      params.put("profissional", criancaFilter.getProfissional());
    }
    if (criancaFilter.getRisco() != null) {
      params.put("riscoCrianca", criancaFilter.getRisco());
    }
    String sql = (criancaFilter.getTpRel().equals(SINTETICO)
      ? EstratificacaoRiscoScript.getSqlEstratificacaoCriancaSintetico(criancaFilter)
      : EstratificacaoRiscoScript.getSqlEstratificacaoCriancaAnalitico(criancaFilter));
    rs = Util.resolveResultSet(sql, params);
    List<EstratificacaoCrianca> data = new ArrayList<>();
    while (rs.next()) {
      EstratificacaoCrianca esc = new EstratificacaoCrianca();
      esc.setUnidade(rs.getString("unidade"));
      esc.setIneEquipe(rs.getString("ineEquipe"));
      esc.setNomeEquipe(rs.getString("nomeEquipe"));
      esc.setMicroArea(rs.getString("microArea"));
      esc.setResponsavel(rs.getString("profissional_responsavel"));
      esc.setIdade(rs.getInt("idade"));
      esc.setFaixaEtaria(rs.getString("faixaEtaria"));
      esc.setRiscoCrianca(rs.getString("risco"));
      if (criancaFilter.getTpRel().equals(SINTETICO)) {
        esc.setQtde(rs.getInt("qtde"));
        switch (esc.getRiscoCrianca()) {
        case "Alto":
          qtdeRiscoAlto += esc.getQtde();
          break;
        case "Intermediário":
          qtdeRiscoInt += esc.getQtde();
          break;
        case "Habitual":
          qtdeRiscoHab += esc.getQtde();
          break;
        case "Não Estratificado":
          qtdeRiscoNaoEx += esc.getQtde();
          break;
        }
      } else {
        esc.setNome(rs.getString("nome"));
        esc.setDataNascimento(rs.getString("dataNascimento"));
        esc.setIdade(rs.getInt("idade"));
        esc.setCns(rs.getString("cns"));
        switch (esc.getRiscoCrianca()) {
        case "Alto":
          qtdeRiscoAlto++;
          break;
        case "Intermediário":
          qtdeRiscoInt++;
          break;
        case "Habitual":
          qtdeRiscoHab++;
          break;
        case "Não Estratificado":
          qtdeRiscoNaoEx++;
          break;
        }
      }
      esc.setQtdeRiscoAlto(qtdeRiscoAlto);
      esc.setQtdeRiscoInt(qtdeRiscoInt);
      esc.setQtdeRiscoHab(qtdeRiscoHab);
      esc.setQtdeRiscoNaoEx(qtdeRiscoNaoEx);
      data.add(esc);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(criancaFilter.getTpRel().name());
    String titulo = "Relatório de Estratificação de Risco - Criança";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, criancaFilter.getTpRel());
    creator.setFiltro(FormatFilters.filterEstratificacaoCrianca(criancaFilter));
    creator.gerarPdf();

  }

  @Override
  public void agendamentoPorProfissional(AgendamentoPorProfissionalFilter filter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("uni_codigo", filter.getUnidade());
    }
    if (filter.getProfissional() != null) {
      params.put("usr_codigo", filter.getProfissional());
    }
    if (filter.getSituacao() != null && filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
      switch (filter.getSituacao()) {
      case ATENDIDOS:
        params.put("age_atendido", "A");
        break;
      case FALTOSOS:
        params.put("age_atendido", "F");
        break;
      case FALTA_MEDICA:
        params.put("age_atendido", "M");
        break;
      }
    }

    String sql = (filter.getTpRel().equals(SINTETICO)
      ? AgendamentoScript.getSqlAgendamentoPorProfissionalSintetico(filter)
      : AgendamentoScript.getSqlAgendamentoPorProfissionalAnalitico(filter));
    rs = Util.resolveResultSet(sql, params);
    List<AgendamentoPorProfissional> data = new ArrayList<>();
    while (rs.next()) {
      AgendamentoPorProfissional app = new AgendamentoPorProfissional();
      app.setUnidade(rs.getString("unidade"));
      app.setProfissional(rs.getString("profissional"));
      if (filter.getTpRel().equals(SINTETICO)) {
        app.setQtdAgendado(rs.getInt("qtd_agendado"));
        app.setQtdAtendido(rs.getInt("qtd_atendido"));
        app.setQtdFaltoso(rs.getInt("qtd_faltoso"));
        app.setQtdFaltaMedica(rs.getInt("qtd_falta_medica"));
        app.setQtdOutros(rs.getInt("qtd_outros"));
        app.setQtdTotal(rs.getInt("qtd_total"));
      } else {
        app.setCidadao(rs.getString("cidadao"));
        app.setDtNascimento(rs.getDate("dt_nascimento"));
        app.setIdade(rs.getInt("idade"));
        app.setCartaoSus(rs.getString("cartao_sus"));
        app.setDtAgendamento(rs.getDate("dt_agendamento"));
        app.setHrAgendamento(rs.getTime("hr_agendamento"));
        app.setStatus(rs.getString("status"));
        app.setAgeTransferido(rs.getString("age_transferido"));
      }
      data.add(app);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Agendamento por Profissional";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAgendamentoPorMedico(filter));
    creator.addParameter("SITUACAO", (filter.getSituacao() != null ? filter.getSituacao().name() : null));
    creator.gerarPdf();
  }

  @Override
  public void saidaTransferenciaMateriais(SaidaTransferenciaMateriaisFilter saidaFilter) throws Exception {
    params.put("setorOrigem", saidaFilter.getSetorOrigem());
    if (saidaFilter.getSetorDestino() != null) {
      params.put("setorDestino", saidaFilter.getSetorDestino());
    }
    if (saidaFilter.getDtInicial() != null) {
      params.put("dtInicial", Util.dateToSqlDate(saidaFilter.getDtInicial()));
    }
    if (saidaFilter.getDtFinal() != null) {
      params.put("dtFinal", Util.dateToSqlDate(saidaFilter.getDtFinal()));
    }
    if (saidaFilter.getGrupo() != null) {
      params.put("grupo", saidaFilter.getGrupo());
    }
    rs = Util
      .resolveResultSet(SaidaTransferenciaMateriaisScript.getSqlSaidaTransferenciaMateriais(saidaFilter), params);
    List<SaidaTransferenciaMateriais> saidaTransferenciaMateriais = new ArrayList<>();
    while (rs.next()) {
      SaidaTransferenciaMateriais mat = new SaidaTransferenciaMateriais();
      mat.setCodigo(rs.getInt("codigo"));
      mat.setProduto(rs.getString("nome"));
      mat.setCustoUnitario(rs.getDouble("custo_unitario"));
      if (saidaFilter.getSaida() != null) {
        mat.setSaida(rs.getInt("saida"));
      }
      if (saidaFilter.getPerda() != null) {
        mat.setPerda(rs.getInt("perda"));
      }
      if (saidaFilter.getTransferencia() != null) {
        mat.setTransferencia(rs.getInt("transferencia"));
      }
      mat.setLote(rs.getString("lote"));
      mat.setGrupo(rs.getString("grupo"));

      Double valorTotal = mat.getCustoUnitario() * (saidaFilter.getSaida() != null ? mat.getSaida() : 0);
      valorTotal += mat.getCustoUnitario() * (saidaFilter.getPerda() != null ? mat.getPerda() : 0);
      valorTotal += mat.getCustoUnitario() * (saidaFilter.getTransferencia() != null ? mat.getTransferencia() : 0);
      mat.setValorTotal(valorTotal);

      if (saidaFilter.getSaida() != null && saidaFilter.getPerda() == null && saidaFilter.getTransferencia() == null) {
        if (mat.getSaida() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else if (saidaFilter.getPerda() != null && saidaFilter.getTransferencia() == null
        && saidaFilter.getSaida() == null) {
        if (mat.getPerda() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else if (saidaFilter.getTransferencia() != null && saidaFilter.getSaida() == null
        && saidaFilter.getPerda() == null) {
        if (mat.getTransferencia() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else if (saidaFilter.getSaida() != null && saidaFilter.getPerda() != null
        && saidaFilter.getTransferencia() == null) {
        if (mat.getSaida() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
        if (mat.getPerda() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else if (saidaFilter.getSaida() != null && saidaFilter.getPerda() == null
        && saidaFilter.getTransferencia() != null) {
        if (mat.getSaida() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
        if (mat.getTransferencia() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else if (saidaFilter.getSaida() == null && saidaFilter.getPerda() != null
        && saidaFilter.getTransferencia() != null) {
        if (mat.getPerda() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
        if (mat.getTransferencia() > 0) {
          saidaTransferenciaMateriais.add(mat);
        }
      } else {
        saidaTransferenciaMateriais.add(mat);
      }

    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Saídas e Transferências de Materiais";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, saidaTransferenciaMateriais,
      SINTETICO);
    creator.setFiltro(FormatFilters.filterSaidaTransferenciaMateriais(saidaFilter));
    creator.gerarPdf();
  }

  public void atestadoVacina(AtestadoVacinaFilter filter) throws Exception {
    params.put("usuCodigo", filter.getUsuCodigo());
    params.put("usrLogado", filter.getUsrLogado());

    ResultSet rsPaciente = Util.resolveResultSet(AtestadoVacinaScript.getDadosPaciente(), params);
    ResultSet rsUsrlogado = Util.resolveResultSet(AtestadoVacinaScript.getDadosUsrLogado(), params);
    ResultSet rsVacinaAprazada = Util.resolveResultSet(AtestadoVacinaScript.getVacinasAprazadas(), params);

    AtestadoVacina atestado = new AtestadoVacina();
    ArrayList<VacinaAprazada> vacinas = new ArrayList<>();
    if (rsPaciente.next()) {
      atestado.setUsuNome(rsPaciente.getString("nome"));
      atestado.setUsuProntuario(rsPaciente.getString("prontuario"));
      atestado.setUsuCartaoSus(rsPaciente.getString("cartaosus"));
      atestado.setUsuDataNascimento(rsPaciente.getDate("datanascimento"));
      atestado.setUsuIdade(rsPaciente.getInt("idade"));
      atestado.setUsuSexo(rsPaciente.getString("sexo"));
    }

    if (rsUsrlogado.next()) {
      atestado.setUsrLogadoNome(rsUsrlogado.getString("nome"));
      atestado.setUsrLogadoConselho(rsUsrlogado.getString("conselho"));
      atestado.setUsrLogadoEstado(rsUsrlogado.getString("estado"));
      atestado.setUsrLogadoNumeroConselho(rsUsrlogado.getString("numeroconselho"));
    }
    while (rsVacinaAprazada.next()) {
      VacinaAprazada vacina = new VacinaAprazada();
      vacina.setData(rsVacinaAprazada.getDate("data"));
      vacina.setVacina(rsVacinaAprazada.getString("vacina"));
      vacinas.add(vacina);
    }
    atestado.setVacinasAprazadas(vacinas);

    atestado.setDataValidade(filter.getDataAtestado());

    List<AtestadoVacina> atestadoVacinas = new ArrayList<>();
    atestadoVacinas.add(atestado);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Atestado de Vacinação";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, atestadoVacinas, SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override
  public void controleVacinadosPorVacina(ControleVacinadosPorVacinaFilter controleFilter) throws Exception {

    params.put("unidade", controleFilter.getUnidade());
    params.put("dt_inicial", Util.dateToTimeStamp(controleFilter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(controleFilter.getDtFinal()));
    if (controleFilter.getProfissional() != null) {
      params.put("profissional", controleFilter.getProfissional());
    }
    if (controleFilter.getVacina() != null) {
      params.put("vacina", controleFilter.getVacina());
    }

    rs = Util.resolveResultSet(ControleVacinadosPorVacinaScript.getSql(controleFilter), params);
    List<ControleVacinadosPorVacina> data = new ArrayList<>();
    while (rs.next()) {
      ControleVacinadosPorVacina vacina = new ControleVacinadosPorVacina();
      vacina.setDataAplicacao(rs.getDate("data_aplicacao"));
      vacina.setPaciente(rs.getString("paciente"));
      vacina.setDataNascimento(rs.getDate("data_nascimento"));
      vacina.setIdade(rs.getInt("idade"));
      vacina.setGestante(rs.getString("gestante"));
      vacina.setPuerpera(rs.getString("puerpera"));
      vacina.setHanseniase(rs.getString("hanseniase"));
      vacina.setEstrategia(rs.getString("estrategia"));
      vacina.setLaboratorio(rs.getString("laboratorio"));
      vacina.setLote(rs.getString("lote"));
      vacina.setDose(rs.getString("dose"));
      vacina.setVacina(rs.getString("vacina"));
      vacina.setProfissional(rs.getString("profissional"));
      vacina.setUnidade(rs.getString("unidade"));

      data.add(vacina);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Controle de Vacinados por Vacina";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterControleDeVacinadosPorVacina(controleFilter));
    creator.gerarPdf();

  }

  @Override
  public void consultasAgendadas(ConsultasAgendadasFilter consultasFilter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(consultasFilter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(consultasFilter.getDtFinal()));
    if (consultasFilter.getUnidade() != null) {
      params.put("uni_codigo", consultasFilter.getUnidade());
    }
    if (consultasFilter.getProfissional() != null) {
      params.put("usr_codigo", consultasFilter.getProfissional());
    }

    rs = Util.resolveResultSet(AgendamentoScript.getSqlConsultasAgendadas(consultasFilter), params);

    List<ConsultasAgendadas> data = new ArrayList<>();
    while (rs.next()) {
      ConsultasAgendadas consultas = new ConsultasAgendadas();
      consultas.setUnidade(rs.getString("unidade"));
      consultas.setProfissional(rs.getString("profissional"));
      consultas.setCidadao(rs.getString("cidadao"));
      consultas.setDtNascimento(rs.getDate("dt_nascimento"));
      consultas.setProntuario(rs.getString("prontuario"));
      consultas.setTelefone(rs.getString("telefone"));
      consultas.setCelular(rs.getString("celular"));
      consultas.setDtAgendamento(rs.getDate("dt_agendamento"));
      consultas.setHrAgendamento(rs.getTime("hr_agendamento"));
      data.add(consultas);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Listagem de Consultas Agendadas";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, consultasFilter.getTpRel());
    creator.setFiltro(FormatFilters.filterConsultasAgendadas(consultasFilter));
    creator.gerarPdf();

  }

  @Override
  public void procedimentosGerais(ProcedimentosGeraisFilter filter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }

    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }

    if (filter.getProcedimento() != null) {
      params.put("procedimento", filter.getProcedimento());
    }
    rs = Util.resolveResultSet(BpaScript.getSqlProcedimentosGerais(filter), params);
    List<ProcedimentosGerais> data = new ArrayList<>();
    while (rs.next()) {
      ProcedimentosGerais proger = new ProcedimentosGerais();
      proger.setUnidade(rs.getString("unidade"));
      proger.setProfissional(rs.getString("profissional"));
      proger.setProcedimento(rs.getString("procedimento"));
      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        proger.setCidadao(rs.getString("cidadao"));
        proger.setDtNascimento(rs.getDate("dtnascimento"));
        proger.setIdade(rs.getInt("idade"));
        proger.setCartaosus(rs.getString("cartaosus"));
        proger.setDtAtendimento(rs.getTimestamp("dtatendimento"));
      } else {
        proger.setTotal(rs.getInt("total"));
      }
      if (Util.existColumn(rs, "faixa")) {
        proger.setFaixa(rs.getString("faixa"));
      }
      data.add(proger);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Procedimentos Gerais";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterProcedimentosGerais(filter));
    if (filter.getFaixaEtaria() != null) {
      StringBuilder bd = new StringBuilder("Faixa Etária: ");
      for (String faixa : filter.getFaixaEtaria()) {
        if (faixa.contains("<")) {
          bd.append(faixa.replace("<", "Menores que")).append(" anos | ");
        }
        if (faixa.contains("=")) {
          bd.append(faixa.replace("=", "")).append(" anos | ");
        }
        if (faixa.contains("BETWEEN")) {
          bd.append(faixa.replace("BETWEEN", "Entre").replace("AND", "e")).append(" anos | ");
        }
        if (faixa.contains(">")) {
          bd.append(faixa.replace(">", "Maiores que")).append(" anos | ");
        }

      }
      if (StringUtils.isNotBlank(bd)) {
        creator.addParameter(
          "FAIXA_ETARIA",
          bd
            .replace(bd.length() - 3, bd.length(), "")
            .toString()
        );
      }
    }
    creator.gerarPdf();
  }

  @Override
  public void procedimentosUnidade(ProcedimentosUnidadeFilter filter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
    params.put("unidade", filter.getUnidade());

    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }

    if (filter.getProcedimento() != null) {
      params.put("procedimento", filter.getProcedimento());
    }
    rs = Util.resolveResultSet(BpaScript.getSqlProcedimentosUnidade(filter), params);
    List<ProcedimentosUnidade> data = new ArrayList<>();
    while (rs.next()) {
      ProcedimentosUnidade proger = new ProcedimentosUnidade();
      proger.setUnidade(rs.getString("unidade"));
      proger.setProfissional(rs.getString("profissional"));
      proger.setProcedimento(rs.getString("procedimento"));
      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        proger.setCidadao(rs.getString("cidadao"));
        proger.setDtNascimento(rs.getDate("dtnascimento"));
        proger.setIdade(rs.getInt("idade"));
        proger.setCartaosus(rs.getString("cartaosus"));
        proger.setDtAtendimento(rs.getTimestamp("dtatendimento"));
      } else {
        proger.setTotal(rs.getInt("total"));
      }
      if (Util.existColumn(rs, "faixa")) {
        proger.setFaixa(rs.getString("faixa"));
      }
      data.add(proger);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Procedimentos Unidade";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterProcedimentosUnidade(filter));
    if (filter.getFaixaEtaria() != null) {
      StringBuilder bd = new StringBuilder("Faixa Etária: ");
      for (String faixa : filter.getFaixaEtaria()) {
        if (faixa.contains("<")) {
          bd.append(faixa.replace("<", "Menores que")).append(" anos | ");
        }
        if (faixa.contains("=")) {
          bd.append(faixa.replace("=", "")).append(" anos | ");
        }
        if (faixa.contains("BETWEEN")) {
          bd.append(faixa.replace("BETWEEN", "Entre").replace("AND", "e")).append(" anos | ");
        }
        if (faixa.contains(">")) {
          bd.append(faixa.replace(">", "Maiores que")).append(" anos | ");
        }

      }
      if (StringUtils.isNotBlank(bd)) {
        creator.addParameter(
          "FAIXA_ETARIA",
          bd
            .replace(bd.length() - 3, bd.length(), "")
            .toString()
        );
      }
    }
    creator.gerarPdf();
  }

  @Override
  public void carteirinhaVacinacao(CarteirinhaVacinacaoFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    rs = Util.subResultSet(CarteirinhaVacinacaoScript.montaCarterinha(), params, conn);
    List<Carteirinha> data = new ArrayList<>();
    while (rs.next()) {
      Carteirinha carteirinha = new Carteirinha();

      Map<String, Boolean> dosesExistentes = new LinkedHashMap<String, Boolean>();
      Map<String, Integer> numerosDoses = new LinkedHashMap<String, Integer>();

      dosesExistentes.put("Dose", rs.getBoolean("dose"));
      dosesExistentes.put("Dose inicial", rs.getBoolean("dose_inicial"));
      dosesExistentes.put("Dose Adicional", rs.getBoolean("dose_adicional"));
      dosesExistentes.put("Única", rs.getBoolean("dose_unica"));
      dosesExistentes.put("1ª Dose", rs.getBoolean("dose_um"));
      dosesExistentes.put("2ª Dose", rs.getBoolean("dose_dois"));
      dosesExistentes.put("3ª Dose", rs.getBoolean("dose_tres"));
      dosesExistentes.put("4ª Dose", rs.getBoolean("dose_quatro"));
      dosesExistentes.put("5ª Dose", rs.getBoolean("dose_cinco"));
      dosesExistentes.put("1º Reforço", rs.getBoolean("reforco"));
      dosesExistentes.put("2º Reforço", rs.getBoolean("reforco2"));
      dosesExistentes.put("Revacinação", rs.getBoolean("revacinacao"));
      dosesExistentes.put("1ª Dose Revacinação", rs.getBoolean("revacinacao_um"));
      dosesExistentes.put("2ª Dose Revacinação", rs.getBoolean("revacinacao_dois"));
      dosesExistentes.put("3ª Dose Revacinação", rs.getBoolean("revacinacao_tres"));
      dosesExistentes.put("4ª Dose Revacinação", rs.getBoolean("revacinacao_quatro"));
      dosesExistentes.put("Reforço", rs.getBoolean("reforco_unico"));

      numerosDoses.put("Dose", 8);
      numerosDoses.put("Dose inicial", 36);
      numerosDoses.put("Dose Adicional", 37);
      numerosDoses.put("Única", 9);
      numerosDoses.put("1ª Dose", 1);
      numerosDoses.put("2ª Dose", 2);
      numerosDoses.put("3ª Dose", 3);
      numerosDoses.put("4ª Dose", 4);
      numerosDoses.put("5ª Dose", 5);
      numerosDoses.put("1º Reforço", 6);
      numerosDoses.put("2º Reforço", 7);
      numerosDoses.put("Revacinação", 10);
      numerosDoses.put("1ª Dose Revacinação", 32);
      numerosDoses.put("2ª Dose Revacinação", 33);
      numerosDoses.put("3ª Dose Revacinação", 34);
      numerosDoses.put("4ª Dose Revacinação", 35);
      numerosDoses.put("Reforço", 38);

      carteirinha.setProduto(rs.getString("pro_nome"));
      carteirinha.setInfoDoses(new ArrayList<>());

      for (Map.Entry<String, Boolean> dose : dosesExistentes.entrySet()) {
        if (dose.getValue()) {
          InformacoesCarteirinha ic = new InformacoesCarteirinha();
          ic.setDose(dose.getKey());
          ic.setNumeroDose(numerosDoses.get(dose.getKey()));
          carteirinha.getInfoDoses().add(ic);
        }
      }

      while (carteirinha.getInfoDoses().size() < 7) {
        InformacoesCarteirinha i = new InformacoesCarteirinha();
        carteirinha.getInfoDoses().add(i);
      }

      Map<String, Object> pDados = new HashMap<>();
      pDados.put("pro_codigo", rs.getInt("pro_codigo"));
      pDados.put("usu_codigo", filter.getUsuario());

      ResultSet rsPaciente = Util.subResultSet(CarteirinhaVacinacaoScript.getDadosPaciente(), pDados, conn);
      if (rsPaciente.next()) {
        CarteirinhaPaciente paciente = new CarteirinhaPaciente();
        paciente.setPaciente(rsPaciente.getString("paciente"));
        paciente.setDtNascimento(rsPaciente.getDate("datanasc"));
        paciente.setCartaoSus(rsPaciente.getString("cartaosus"));
        paciente.setProntuario(rsPaciente.getString("prontuario"));
        paciente.setUsuarioMae(rsPaciente.getString("usu_mae"));
        carteirinha.setPaciente(paciente);
      }

      ResultSet rsDados = Util.subResultSet(CarteirinhaVacinacaoScript.sqlDadosCarteirinha(), pDados, conn);
      while (rsDados.next()) {
        Integer vacDose = rsDados.getInt("vac_dose");
        InformacoesCarteirinha info = carteirinha.getInfoDoses().stream().filter(i -> vacDose.equals(i.getNumeroDose()))
          .findFirst().orElse(null);

        if (info != null) {
          int index = carteirinha.getInfoDoses().indexOf(info);
          carteirinha.getInfoDoses().get(index).setAcao(rsDados.getString("vac_acao"));
          carteirinha.getInfoDoses().get(index).setAplicado(rsDados.getBoolean("aplicado"));
          carteirinha.getInfoDoses().get(index).setLote(rsDados.getString("ite_lote"));
          carteirinha.getInfoDoses().get(index).setDtAplicacao(rsDados.getDate("vac_data"));
          carteirinha.getInfoDoses().get(index).setDtValidade(rsDados.getDate("ite_validade"));
          carteirinha.getInfoDoses().get(index).setUnidade(rsDados.getString("uni_desc"));
          carteirinha.getInfoDoses().get(index).setUsuario(rsDados.getString("usr_nome"));
        }
      }
      data.add(carteirinha);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Carteirinha de Vacinação";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, null);
    creator.gerarPdf();
  }

  @Override
  public void guiaEncaminhamentoExterno(GuiaEncaminhamentoExternoFilter guiaFilter) throws Exception {
    params.put("codigo", guiaFilter.getCodigo());
    rs = Util.resolveResultSet(GuiaEncaminhamentoExternoScript.getSql(guiaFilter), params);
    List<GuiaEncaminhamentoExterno> guia = new ArrayList<>();

    if (rs.next()) {
      GuiaEncaminhamentoExterno g = new GuiaEncaminhamentoExterno();
      g.setDataCadastro(rs.getDate("dataCadastro"));
      g.setAgendadoPara(rs.getString("agendadoPara"));
      g.setContato(rs.getString("contato"));
      g.setDataAgendamento(rs.getDate("dataAgendamento"));
      g.setHoraAgendamento(rs.getString("horaAgendamento"));
      g.setInternacao(rs.getBoolean("internacao"));
      g.setUrgencia(rs.getBoolean("urgencia"));
      g.setDescricao(Util.removeHtmlFrom(rs.getString("descricao")));
      g.setUnidade(rs.getString("unidade"));
      g.setCnes(rs.getString("cnes"));
      g.setProfissional(rs.getString("profissional"));
      g.setConselho(rs.getString("conselho"));
      g.setEstado(rs.getString("estado"));
      g.setNumeroConselho(rs.getString("numeroConselho"));
      g.setNome(rs.getString("nome"));
      g.setCns(rs.getString("cns"));
      g.setDataNascimento(rs.getDate("dataNascimento"));
      g.setIdade(rs.getInt("idade"));
      g.setProntuario(rs.getString("prontuario"));
      g.setSexo(rs.getString("sexo"));
      g.setNomeMae(rs.getString("mae"));
      g.setCelular(rs.getString("celular"));
      g.setMunicipioNascimento(rs.getString("cidade"));
      g.setEstadoNascimento(rs.getString("estadoNascimento"));
      g.setContraReferencia(guiaFilter.getContraReferencia());
      g.setEspecialidade(rs.getString("especialidade"));
      g.setRg(rs.getString("rg"));
      g.setDataEmissao(rs.getDate("dataEmissao"));
      g.setCpf(rs.getString("cpf"));
      guia.add(g);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Guia de Encaminhamento Externo";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, guia, SINTETICO);
    creator.gerarPdf();
  }

  @Override
  public void pacientesFaixaSexo(PacientesFaixaSexoFilter pacientesFaixaSexoFilter) throws Exception {
    if (pacientesFaixaSexoFilter.getUnidade() != null) {
      params.put("unidade", pacientesFaixaSexoFilter.getUnidade());
    }
    if (pacientesFaixaSexoFilter.getEquipe() != null) {
      params.put("equipe", pacientesFaixaSexoFilter.getEquipe());
    }
    if (pacientesFaixaSexoFilter.getProfissional() != null) {
      params.put("profissional", pacientesFaixaSexoFilter.getProfissional());
    }
    if (pacientesFaixaSexoFilter.getSexo() != null) {
      params.put("sexo", pacientesFaixaSexoFilter.getSexo());
    }
    rs = Util.resolveResultSet(PacientesFaixaSexoScript.getSql(pacientesFaixaSexoFilter), params);
    List<PacientesFaixaSexo> pac = new ArrayList<>();

    while (rs.next()) {
      PacientesFaixaSexo p = new PacientesFaixaSexo();
      p.setUnidade(rs.getString("unidade"));
      if (pacientesFaixaSexoFilter.getAgrUsr()) {
        p.setIneEquipe(rs.getString("ineEquipe"));
        p.setNomeEquipe(rs.getString("nomeEquipe"));
        p.setProfissional(rs.getString("profissional"));
      }
      p.setFaixa(rs.getString("faixa"));
      p.setCidadao(rs.getString("cidadao"));
      p.setDtNascimento(rs.getDate("dataNascimento"));
      p.setIdade(rs.getInt("idade"));
      p.setCartaosus(rs.getString("cartaoSus"));
      pac.add(p);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(pacientesFaixaSexoFilter.getTpRel().name()).toLowerCase();
    String titulo = "Relatório Pacientes por Faixa Etária e Sexo";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, pac, pacientesFaixaSexoFilter.getTpRel());
    creator.setFiltro("");
    creator.addParameter("AGR_USR", pacientesFaixaSexoFilter.getAgrUsr());
    creator.gerarPdf();
  }

  @Override
  public void movimentoSaida(MovimentoSaidaFilter filter) throws Exception {
    if (filter.getSetor() != null) {
      params.put("setor", filter.getSetor());
    }
    if (filter.getProduto() != null) {
      params.put("produto", filter.getProduto());
    }
    if (StringUtils.isNotBlank(filter.getTpSaida())) {
      params.put("tpSaida", filter.getTpSaida());
    }
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));

    rs = Util.resolveResultSet(MateriaisScript.getSqlMovimentoSaida(filter), params);
    List<MovimentoSaida> movimentos = new ArrayList<>();
    while (rs.next()) {
      MovimentoSaida ms = new MovimentoSaida();
      ms.setSetor(rs.getString("setor"));
      ms.setTipoSaida(rs.getString("tipo_saida"));
      ms.setProduto(rs.getString("produto"));
      ms.setDtMovimento(rs.getDate("data_movimento"));
      ms.setQuantidade(rs.getInt("quantidade"));
      movimentos.add(ms);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.toLowerCase();
    String titulo = "Relatório Movimentação de Saída";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, movimentos, null);
    creator.setFiltro(FormatFilters.filterMovimentoSaida(filter));
    creator.gerarPdf();
  }

  @Override
  public void visitaDomiciliar(VisitaDomiciliarFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    params.put("unidade", filter.getUnidade());
    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }
    if (filter.getDesfecho() != null) {
      params.put("desfecho", filter.getDesfecho());
    }
    if (filter.getPaciente() != null) {
      params.put("paciente", filter.getPaciente());
    }
    rs = Util.resolveResultSet(VisitaDomiciliarScript.getSqlVisitasDomiciliares(filter), params);
    List<VisitaDomiciliar> visitas = new ArrayList<>();

    while (rs.next()) {
      VisitaDomiciliar vis = new VisitaDomiciliar();
      vis.setUnidade(rs.getString("unidade"));
      vis.setProfissional(rs.getString("profissional"));
      vis.setDesfecho(rs.getString("desfecho"));

      if (filter.getTpRel().equals(SINTETICO)) {
        vis.setQuantidade(rs.getInt("qtde"));
      } else {
        vis.setCodigo(rs.getInt("codigo"));
        vis.setData(rs.getDate("data"));
        vis.setHora(rs.getString("hora"));
        if (rs.getString("observacao") != null) {
          vis.setObservacao(Util.removeHtmlFrom(rs.getString("observacao")));
        }
        vis.setPaciente(rs.getString("paciente"));
        vis.setTipoLogradouro(rs.getString("tipoLogradouro"));
        vis.setRua(rs.getString("rua"));
        vis.setNumero(rs.getInt("numero"));
        vis.setBairro(rs.getString("bairro"));
        vis.setCidade(rs.getString("cidade"));
        vis.setSigla(rs.getString("sigla"));

        Map<String, Object> subParams = new HashMap<>();
        subParams.put("codigo", vis.getCodigo());
        ResultSet subRs = Util.subResultSet(VisitaDomiciliarScript.getSqlVisitasMotivos(), subParams, conn);
        List<Motivos> motivos = new ArrayList<>();
        while (subRs.next()) {
          Motivos mot = new Motivos();
          mot.setMotivo(subRs.getString("motivo"));
          motivos.add(mot);
        }
        vis.setMotivos(motivos);
      }

      visitas.add(vis);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Relatório de Visitas Domiciliares - ".concat(filter.getTpRel().name());

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, visitas, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterVisitaDomiciliar(filter));
    creator.gerarPdf();
  }

  @Override
  public void buscaAtiva(BuscaAtivaFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }
    if (filter.getEquipe() != null) {
      params.put("equipe", filter.getEquipe());
    }
    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }
    rs = Util.resolveResultSet(BuscaAtivaScript.getSqlBuscaAtiva(filter), params);
    List<BuscaAtiva> buscas = new ArrayList<>();

    while (rs.next()) {
      BuscaAtiva bus = new BuscaAtiva();
      bus.setUnidade(rs.getString("unidade"));
      bus.setProfissional(rs.getString("profissional"));
      bus.setBusca(rs.getString("motivo"));
      bus.setDesfecho(rs.getString("desfecho"));
      bus.setEquipe(rs.getString("nomeEquipe"));
      bus.setIne(rs.getString("ineEquipe"));

      if (filter.getTpRel().equals(SINTETICO)) {
        bus.setQuantidade(rs.getInt("qtde"));
      } else {
        bus.setCodigo(rs.getInt("codigo"));
        bus.setData(rs.getDate("data"));
        bus.setHora(rs.getString("hora"));
        bus.setObservacao(rs.getString("observacao"));
        bus.setPaciente(rs.getString("paciente"));
        bus.setTipoLogradouro(rs.getString("tipoLogradouro"));
        bus.setRua(rs.getString("rua"));
        bus.setNumero(rs.getInt("numero"));
        bus.setBairro(rs.getString("bairro"));
        bus.setCidade(rs.getString("cidade"));
        bus.setSigla(rs.getString("sigla"));
      }

      buscas.add(bus);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Relatório de Buscas Ativas - ".concat(filter.getTpRel().name());

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, buscas, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterBuscaAtiva(filter));
    creator.gerarPdf();

  }

  @Override
  public void bpaIdade(BpaIdadeFilter filter) throws Exception {
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
    params.put("unidade", filter.getUnidade());

    if (filter.getIdade() != null) {
      params.put("idade", filter.getIdade());
    }

    if (filter.getProcedimento() != null) {
      params.put("procedimento", filter.getProcedimento());
    }
    rs = Util.resolveResultSet(BpaScript.getSqlBpaIdade(filter), params);
    List<BpaIdade> data = new ArrayList<>();
    while (rs.next()) {
      BpaIdade bpa = new BpaIdade();
      bpa.setUnidade(rs.getString("unidade"));
      bpa.setProcedimento(rs.getString("procedimento"));
      bpa.setIdade(rs.getInt("idade"));
      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        bpa.setCidadao(rs.getString("cidadao"));
        bpa.setDtNascimento(rs.getDate("dtnascimento"));
        bpa.setCartaosus(rs.getString("cartaosus"));
        bpa.setDtAtendimento(rs.getTimestamp("dtatendimento"));
      } else {
        bpa.setTotal(rs.getInt("total"));
      }
      data.add(bpa);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "BPA por Idade";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterBpaIdade(filter));
    creator.gerarPdf();
  }

  @Override
  public void agendamentoExternoMedico(AgendamentoExternoMedicoFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }
    if (filter.getEspecialidade() != null) {
      params.put("especialidade", filter.getEspecialidade());
    }
    if (filter.getMedicoDestino() != null) {
      params.put("medicoDestino", filter.getMedicoDestino());
    }
    if (filter.getMedicoSolicitante() != null) {
      params.put("medicoSolicitante", filter.getMedicoSolicitante());
    }
    if (filter.getPrestador() != null) {
      params.put("prestador", filter.getPrestador());
    }
    if (filter.getSituacao() != null) {
      params.put("situacao", filter.getSituacao());
    }
    if (filter.getGrauRisco() != null) {
      params.put("grauRisco", filter.getGrauRisco());
    }

    rs = Util.resolveResultSet(AgendamentoScript.getSqlAgendamentoExternoMedico(filter), params);
    List<AgendamentoExternoMedico> agendamentos = new ArrayList<>();

    while (rs.next()) {
      AgendamentoExternoMedico age = new AgendamentoExternoMedico();
      age.setUnidade(rs.getString("unidade"));
      age.setEspecialidade(rs.getString("especialidade"));
      age.setMedicoDestino(rs.getString("medico_destino"));
      age.setMedicoSolicitante(rs.getString("medico_solicitante"));
      age.setPrioridade(rs.getString("prioridade"));
      age.setSituacao(rs.getString("situacao"));
      if (filter.getTpRel().equals(SINTETICO)) {
        age.setTotal(rs.getInt("total"));
      } else {
        age.setData(rs.getDate("data"));
        age.setPaciente(rs.getString("paciente"));
        age.setTelefone(rs.getString("telefone"));
        age.setCelular(rs.getString("celular"));
      }

      agendamentos.add(age);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Agendamento Externo por Médico e Especialidade - ".concat(filter.getTpRel().name());

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, agendamentos, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAgendamentoExternoMedico(filter));
    creator.gerarPdf();
  }

  @Override
  public void agendamentoExternoUnidade(AgendamentoExternoUnidadeFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }
    if (filter.getEspecialidade() != null) {
      params.put("especialidade", filter.getEspecialidade());
    }
    if (filter.getProcedimento() != null) {
      params.put("procedimento", filter.getProcedimento());
    }
    if (filter.getSituacao() != null) {
      params.put("situacao", filter.getSituacao());
    }
    if (filter.getGrauRisco() != null) {
      params.put("grauRisco", filter.getGrauRisco());
    }
    if (filter.getPrestadorServicos() != null) {
      params.put("prestadorServicos", filter.getPrestadorServicos());
    }
    rs = Util.resolveResultSet(AgendamentoScript.getSqlAgendamentoExternoUnidade(filter), params);
    List<AgendamentoExternoUnidade> agendamentos = new ArrayList<>();

    while (rs.next()) {
      AgendamentoExternoUnidade age = new AgendamentoExternoUnidade();
      age.setUnidade(rs.getString("unidade"));
      age.setEspecialidade(rs.getString("especialidade"));
      age.setMedicoDestino(rs.getString("medico_destino"));
      age.setProcedimento(rs.getString("procedimento"));
      age.setPrioridade(rs.getString("prioridade"));
      age.setSituacao(rs.getString("situacao"));
      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        age.setData(rs.getDate("data"));
        age.setPaciente(rs.getString("paciente"));
        age.setTelefone(rs.getString("telefone"));
        age.setCelular(rs.getString("celular"));
        age.setCns(rs.getString("cns"));
        age.setTipoLogradouro(rs.getString("tipoLogradouro"));
        age.setRua(rs.getString("rua"));
        age.setNumero(rs.getInt("numero"));
        age.setBairro(rs.getString("bairro"));
        age.setCidade(rs.getString("cidade"));
        age.setSigla(rs.getString("sigla"));
      } else {
        age.setTotal(rs.getInt("total"));
      }
      agendamentos.add(age);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    filename = filename.concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Agendamento Externo por Unidade e Especialidade - ".concat(filter.getTpRel().name());

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, agendamentos, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAgendamentoExternoUnidade(filter));
    creator.gerarPdf();
  }

  @Override
  public void laudoApac(LaudoApacFilter laudoApacFilter) throws Exception {
    params.put("codigoAtendimento", laudoApacFilter.getCodigoAtendimento());

    rs = Util.resolveResultSet(LaudoApacScript.getSql(), params);

    List<LaudoApac> data = new ArrayList<>();

    if (rs.next()) {
      LaudoApac lau = new LaudoApac();
      lau.setUniDesc(rs.getString("uniDesc"));
      lau.setUniCnes(rs.getString("uniCnes"));
      lau.setUsuNome(rs.getString("usuNome"));
      lau.setUsuProntuario(rs.getString("usuProntuario"));
      lau.setUsuCns(rs.getString("usuCns"));
      lau.setUsuDatanasc(rs.getDate("usuDatanasc"));
      lau.setUsuSexo(rs.getString("usuSexo"));
      lau.setUsuRacacor(rs.getString("usuRacacor"));
      lau.setUsuMae(rs.getString("usuMae"));
      lau.setUsuResponsavel(rs.getString("usuResponsavel"));
      lau.setUsuCelular(rs.getString("usuCelular"));
      lau.setUsuFone(rs.getString("usuFone"));
      lau.setCidadeNome(rs.getString("cidadeNome"));
      lau.setCidadeUf(rs.getString("cidadeUf"));
      lau.setCidadeIbge(rs.getString("cidadeIbge"));
      lau.setUsuCep(rs.getString("usuCep"));
      lau.setUsuEndereco(rs.getString("usuEndereco"));
      data.add(lau);

    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Laudo para Solicitação/Autorização de Procedimento Ambulatorial";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.gerarPdf();

  }

  @Override
  public void inventario(InventarioFilter inventarioFilter) throws Exception {
    params.put("codigo", inventarioFilter.getCodigo());
    rs = Util.resolveResultSet(Util.getStatus(inventarioFilter.getStatus()) ?
      InventarioScript.getSqlInventarioAberto() :
      InventarioScript.getSqlInventarioFinalizado(), params);
    conn = ConnectionUtil.getConnection();
    List<Inventario> data = new ArrayList<>();
    while (rs.next()) {
      Inventario inv = new Inventario();
      inv.setUnidade(rs.getString("unidade"));
      inv.setCodigo(rs.getInt("codigo"));
      inv.setGrupo(rs.getString("grupo"));
      inv.setSetor(rs.getString("setor"));
      inv.setProduto(rs.getString("produto"));
      inv.setValidade(rs.getDate("validade"));
      inv.setLote(rs.getString("lote"));
      inv.setSaldoInicial(rs.getInt("saldoInicial"));
      inv.setSaldoFinal(rs.getInt("saldoFinal"));
      if (Util.getStatus(inventarioFilter.getStatus())) {
        inv.setFracao(rs.getInt("fracao"));
        Map<String, Object> params2 = new HashMap<>();
        params2.put("invp_codigo", rs.getInt("inv_pro"));
        ResultSet rs2 = Util.subResultSet(InventarioScript.getSqlProdutos(), params2, conn);

        while (rs2.next()) {
          Inventario inv2 = new Inventario();
          inv2.setUnidade(rs.getString("unidade"));
          inv2.setCodigo(rs.getInt("codigo"));
          inv2.setGrupo(rs.getString("grupo"));
          inv2.setSetor(rs.getString("setor"));
          inv2.setProduto(rs2.getString("produto"));
          inv2.setValidade(rs2.getDate("validade"));
          inv2.setLote(rs2.getString("lote"));
          inv2.setSaldoInicial(rs2.getInt("saldoInicial"));
          inv2.setSaldoFinal(rs2.getInt("saldoFinal"));
          inv2.setFracao(rs2.getInt("fracao"));

          data.add(inv2);
        }
      }
      data.add(inv);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Produtos Inventariados";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.gerarPdf();
  }

  @Override
  public void dispensacaoTipoReceita(DispensacaoTipoReceitaFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    params.put("unidade", filter.getUnidade());
    if (filter.getTpRec() != null) {
      params.put("tpRec", filter.getTpRec());
    }
    rs = Util.resolveResultSet(DispensacaoTipoReceitaScript.getSql(filter), params);

    List<DispensacaoTipoReceita> data = new ArrayList<>();

    while (rs.next()) {
      DispensacaoTipoReceita dis = new DispensacaoTipoReceita();
      dis.setUnidade(rs.getString("unidade"));
      dis.setTipoReceita(rs.getString("tipo_receita"));
      dis.setData(rs.getDate("data"));
      dis.setPaciente(rs.getString("paciente"));
      dis.setProfissional(rs.getString("profissional"));
      dis.setMovimento(rs.getInt("movimento"));
      data.add(dis);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Dispensação por Tipo de Receita";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterDispensacaoTipoReceita(filter));
    creator.gerarPdf();

  }

  @Override
  public void listaViagem(ViagemFilter viagemFilter) throws Exception {
    conn = ConnectionUtil.getConnection();
    params.put("via_codigo", viagemFilter.getViaCodigo());
    rs = Util.resolveResultSet(ListaViagemScript.getSql(), params);
    List<ListaViagem> data = new ArrayList<>();

    while (rs.next()) {
      ListaViagem list = new ListaViagem();
      list.setViaCodigo(rs.getInt("codigo"));
      list.setData(rs.getDate("data"));
      list.setMotorista(rs.getString("motorista"));
      list.setVeiculo(rs.getString("veiculo"));
      list.setOrigem(rs.getString("origem"));
      list.setDestino(rs.getString("destino"));
      list.setPaciente(rs.getString("paciente"));
      list.setCns(rs.getString("cns"));
      list.setTelefone(rs.getString("telefone"));
      list.setCelular(rs.getString("celular"));
      list.setLocalEmbarque(rs.getString("local_emb"));
      list.setHoraEmbarque(rs.getString("hora_emb"));
      list.setLocalDesembarque(rs.getString("local_desemb"));
      list.setHoraDesembarque(rs.getString("hora_desemb"));
      list.setLocalAtendimento(rs.getString("local_atend"));
      list.setHoraAtendimento(rs.getString("hora_atend"));
      String obs = rs.getString("obs");
      if (obs != null && !obs.isEmpty()) {
        list.setObservacao(Util.removeHtmlFrom(obs));
      }
      Map<String, Object> paramAcomp = new HashMap<>();
      paramAcomp.put("codigo", rs.getInt("viausu_codigo"));

      ResultSet rsAcomp = Util.subResultSet(ListaViagemScript.getSqlAcomp(), paramAcomp, conn);
      List<Acompanhante> acomps = new ArrayList<>();
      while (rsAcomp.next()) {
        Acompanhante acomp = new Acompanhante();
        acomp.setNome(rsAcomp.getString("nome"));
        acomp.setCelular(rsAcomp.getString("celular"));
        acomp.setTelefone(rsAcomp.getString("telefone"));
        acomps.add(acomp);
      }
      list.setAcompanhantes(acomps);
      data.add(list);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Lista de Viagem";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override
  public void examesPorPrestador(ExamesPorPrestadorFilter examesPorPrestadorFilter) throws Exception {

    params.put("dataInicial", Util.dateToTimeStamp(examesPorPrestadorFilter.getDataInicial()));
    params.put("dataFinal", Util.dateToTimeStamp(examesPorPrestadorFilter.getDataFinal()));
    if (examesPorPrestadorFilter.getUsuCodigo() != null) {
      params.put("paciente", examesPorPrestadorFilter.getUsuCodigo());
    }
    if (examesPorPrestadorFilter.getAgeiStatus() != null) {
      params.put("status", examesPorPrestadorFilter.getAgeiStatus());
    }
    if (examesPorPrestadorFilter.getUsrCodigo() != null) {
      params.put("solicitante", examesPorPrestadorFilter.getUsrCodigo());
    }
    if (examesPorPrestadorFilter.getConvCodigo() != null) {
      params.put("convenio", examesPorPrestadorFilter.getConvCodigo());
    }
    if (examesPorPrestadorFilter.getMedCodigo() != null) {
      params.put("prestador", examesPorPrestadorFilter.getMedCodigo());
    }

    String sql = (examesPorPrestadorFilter.getTpRel().equals(SINTETICO) ?
      ExamesPorPrestadorScript.getSqlSintetico(examesPorPrestadorFilter) :
      ExamesPorPrestadorScript.getSqlAnalitico(examesPorPrestadorFilter));
    rs = Util.resolveResultSet(sql, params);

    List<ExamesPorPrestador> data = new ArrayList<>();
    if (examesPorPrestadorFilter.getTpRel().equals(SINTETICO)) {
      while (rs.next()) {
        ExamesPorPrestador exa = new ExamesPorPrestador();
        exa.setPrestador(rs.getString("prestador"));
        if (examesPorPrestadorFilter.getAgrSolicitante()) {
          exa.setSolicitante(rs.getString("solicitante"));
        }
        exa.setProcedimento(rs.getString("procedimento"));
        exa.setApelido(rs.getString("apelido"));
        exa.setCodigoSus(rs.getString("codigoSus"));
        exa.setSituacao(rs.getString("situacao"));
        exa.setTotal(rs.getInt("total"));
        exa.setValorUnitario(rs.getDouble("valorUnitario"));
        exa.setValorTotal(rs.getDouble("valorTotal"));
        exa.setTipoConvenio(rs.getString("tipoConvenio"));

        data.add(exa);
      }
    } else {
      while (rs.next()) {
        ExamesPorPrestador exa = new ExamesPorPrestador();
        exa.setPrestador(rs.getString("prestador"));
        exa.setData(rs.getDate("data"));
        exa.setDataRealizacao(rs.getDate("dataRealizacao"));
        if (examesPorPrestadorFilter.getAgrSolicitante() || examesPorPrestadorFilter.getAgrPaciente()) {
          exa.setSolicitante(rs.getString("solicitante"));
          exa.setProntuario(rs.getString("prontuario"));
        }
        exa.setProcedimento(rs.getString("procedimento"));
        exa.setApelido(rs.getString("apelido"));
        exa.setCodigoSus(rs.getString("codigoSus"));
        exa.setSituacao(rs.getString("situacao"));
        exa.setValorUnitario(rs.getDouble("valorUnitario"));
        exa.setPaciente(rs.getString("paciente"));
        exa.setCns(rs.getString("cns"));
        exa.setDataNascimento(rs.getDate("dataNascimento"));
        exa.setData(rs.getDate("data"));
        exa.setIdade(rs.getInt("idade"));
        exa.setTipoConvenio(rs.getString("tipoConvenio"));

        data.add(exa);
      }
    }

    String filename = "";

    if (examesPorPrestadorFilter.getAgrSolicitante() && examesPorPrestadorFilter.getAgrPaciente()) {
      filename = "examesporprestadoragrupadoporpacienteesolicitante";
    } else if (examesPorPrestadorFilter.getAgrPaciente()) {
      filename = "examesporprestadoragrupadoporpaciente";
    } else if (examesPorPrestadorFilter.getAgrSolicitante()) {
      filename = "examesporprestadoragrupadoporsolicitante";
    } else {
      filename = "examesporprestador";
    }

    String titulo = "Relatório de Exames por Prestador";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, examesPorPrestadorFilter.getTpRel());
    creator.setFiltro(FormatFilters.filterExamesPorPrestador(examesPorPrestadorFilter));
    creator.addParameter("AGR_SOLICITANTE", examesPorPrestadorFilter.getAgrSolicitante());
    creator.gerarPdf();
  }

  @Override
  public void domicilioVinculado(DomicilioVinculadoFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));

    if (filter.getDtInicial() != null) {
      params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    }

    if (filter.getUnidade() != null) {
      params.put("unidade", filter.getUnidade());
    }

    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }

    if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
      if (filter.getPaciente() != null) {
        params.put("paciente", filter.getPaciente());
      }
      rs = Util.resolveResultSet(DomicilioVinculadoScript.getSqlAnalitico(filter), params);
    } else {
      rs = Util.resolveResultSet(DomicilioVinculadoScript.getSqlSintetico(filter), params);
    }

    List<DomicilioVinculado> data = new ArrayList<>();

    while (rs.next()) {
      DomicilioVinculado dom = new DomicilioVinculado();
      dom.setUnidade(rs.getString("unidade"));
      dom.setEquipe(rs.getString("equipe"));
      dom.setIne(rs.getString("ine"));
      dom.setProfissional(rs.getString("profissional"));
      dom.setQtdPacientes(rs.getInt("qtdPacientes"));

      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        dom.setCodigo(rs.getInt("codigo"));
        dom.setNumero(rs.getInt("numero"));
        dom.setComplemento(rs.getString("complemento"));
        dom.setResponsavel(rs.getString("responsavel"));
        dom.setRua(rs.getString("rua"));
        dom.setTipoLogradouro(rs.getString("tipoLogradouro"));
        dom.setBairro(rs.getString("bairro"));
        List<Participantes> participantes = new ArrayList<>();

        if (filter.getIntegrantes().contains("S")) {
          Map<String, Object> subParams = new HashMap<>();
          subParams.put("codigo", dom.getCodigo());
          ResultSet rs2 = Util.subResultSet(DomicilioVinculadoScript.getSqlParticipantes(), subParams, conn);

          while (rs2.next()) {
            Participantes part = new Participantes();
            part.setPaciente(rs2.getString("paciente"));
            part.setProntuario(rs2.getString("prontuario"));
            part.setCns(rs2.getString("cns"));
            part.setDataNascimento(rs2.getDate("dataNascimento"));
            part.setTelefone(rs2.getString("telefone"));
            part.setCelular(rs2.getString("celular"));

            participantes.add(part);
          }
        }

        dom.setParticipantes(participantes);
      } else {
        dom.setQtde(rs.getInt("qtde"));
      }

      data.add(dom);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName().concat(filter.getTpRel().name())
      .toLowerCase();
    String titulo = "Domicílios com Usuários Vinculados";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterDomicilioVinculado(filter));
    creator.gerarPdf();
  }

  @Override
  public void viagens(ViagensFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    params.put("dtInicial", Util.dateToSqlDate(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(filter.getDtFinal()));
    if (filter.getVeiculo() != null) {
      params.put("veiculo", filter.getVeiculo());
    }
    if (filter.getPaciente() != null) {
      params.put("paciente", filter.getPaciente());
    }
    if (filter.getMunicipio() != null) {
      params.put("municipio", filter.getMunicipio());
    }
    List<Viagens> data = new ArrayList<>();

    if (filter.getTpRel().equals(SINTETICO)) {
      rs = Util.resolveResultSet(ViagensScript.getSqlSintetico(filter), params);

      while (rs.next()) {
        Viagens via = new Viagens();
        via.setViaCodigo(rs.getInt("codigo"));
        via.setData(rs.getDate("data"));
        via.setMotorista(rs.getString("motorista"));
        via.setVeiculo(rs.getString("veiculo"));
        Integer qtde = rs.getInt("qtdeAcompanhantes") + rs.getInt("qtdePacientes");
        via.setQuantidade(qtde);
        via.setOrigem(rs.getString("origem"));
        via.setDestino(rs.getString("destino"));
        via.setAgrupamento(filter.getAgrupamento());
        data.add(via);
      }
    } else {
      rs = Util.resolveResultSet(ViagensScript.getSqlAnalitico(filter), params);

      while (rs.next()) {
        Viagens via = new Viagens();
        via.setViaCodigo(rs.getInt("codigo"));
        via.setData(rs.getDate("data"));
        via.setMotorista(rs.getString("motorista"));
        via.setVeiculo(rs.getString("veiculo"));
        via.setDestino(rs.getString("destino"));
        via.setOrigem(rs.getString("origem"));
        via.setCns(rs.getString("cns"));
        via.setPaciente(rs.getString("paciente"));
        via.setCelular(rs.getString("celular"));
        via.setTelefone(rs.getString("telefone"));
        via.setHoraEmbarque(rs.getString("hora_emb"));
        via.setLocalEmbarque(rs.getString("local_emb"));
        via.setHoraDesembarque(rs.getString("hora_desemb"));
        via.setLocalDesembarque(rs.getString("local_desemb"));
        via.setHoraAtendimento(rs.getString("hora_atend"));
        via.setLocalAtendimento(rs.getString("local_atend"));
        String obs = rs.getString("obs");
        if (obs != null && !obs.isEmpty()) {
          via.setObservacao(Util.removeHtmlFrom(obs));
        }
        Map<String, Object> paramAcomp = new HashMap<>();
        paramAcomp.put("codigo", rs.getInt("viausu_codigo"));

        ResultSet rsAcomp = Util.subResultSet(ListaViagemScript.getSqlAcomp(), paramAcomp, conn);
        List<Acompanhante> acomps = new ArrayList<>();
        while (rsAcomp.next()) {
          Acompanhante acomp = new Acompanhante();
          acomp.setNome(rsAcomp.getString("nome"));
          acomp.setCelular(rsAcomp.getString("celular"));
          acomp.setTelefone(rsAcomp.getString("telefone"));
          acomps.add(acomp);
        }
        via.setAcompanhantes(acomps);
        via.setAgrupamento(filter.getAgrupamento());
        data.add(via);

      }

    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName()
      .concat(filter.getTpRel().name()).toLowerCase();
    String titulo = "Relatório de Viagens";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterViagens(filter));
    creator.gerarPdf();
  }

  @Override
  public void receitaMedica(ReceitaMedicaFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    List<ReceitaMedica> data = new ArrayList<>();

    Map<String, Object> paramUsu = new HashMap<>();
    paramUsu.put("usuCodigo", filter.getUsuCodigo());
    ResultSet rsUsu = Util.subResultSet(UsuarioScript.getInfo(), paramUsu, conn);

    Map<String, Object> paramUsr = new HashMap<>();
    paramUsr.put("usrCodigo", filter.getUsrCodigo());
    ResultSet rsUsr = Util.subResultSet(UsuariosScript.getUsuario(), paramUsr, conn);

    ReceitaMedica rm = new ReceitaMedica();

    rm.setCodigoDeBarras(filter.getCodigoDeBarras());

    if (filter.getSegundaVia() != null) {
      rm.setSegundaVia(filter.getSegundaVia() == 1);
    }

    if (rsUsr.next()) {
      rm.setNomeEmitente(rsUsr.getString("nomeEmitente"));
      rm.setCrm(rsUsr.getString("crm"));
      rm.setUfEmitente(rsUsr.getString("ufEmitente"));
      rm.setEspecialidadeEmitente(rsUsr.getString("especialidade"));
      rm.setConselhoSigla(rsUsr.getString("conselhoSigla"));
    }

    if (rsUsu.next()) {
      rm.setProntuarioPaciente(rsUsu.getString("prontuarioPaciente"));
      rm.setNomePaciente(rsUsu.getString("nomePaciente"));
      StringBuilder endereco = new StringBuilder();
      endereco.append(
        rsUsu.getString("tipoLogradouroPaciente") != null ? rsUsu.getString("tipoLogradouroPaciente").concat(", ") : "")
        .append(rsUsu.getString("nomeRuaPaciente") != null ? rsUsu.getString("nomeRuaPaciente").concat(", ") : "")
        .append(
          rsUsu.getString("domicilioNumeroPaciente") != null ?
            rsUsu.getInt("domicilioNumeroPaciente") != 0 ?
              rsUsu.getString("domicilioNumeroPaciente") : "S/N" : "");
      rm.setEnderecoPaciente(endereco.length() > 0 ? endereco.toString() : null);
      rm.setCns(rsUsu.getString("cns"));
    }

    Map<String, Object> paramItens = new HashMap<>();

    if (filter.getSelecionados() != null) {
      paramItens.put("selecionados", filter.getSelecionados());
    }

    List<ReceitaItem> itens = new ArrayList<>();

    if (filter.getIoCodigo() != null) {
      paramItens.put("ioCodigo", filter.getIoCodigo());
      ResultSet rsItens = Util.subResultSet(ReceitaItemScript.getSqlItensInternacao(filter), paramItens, conn);
      while (rsItens.next()) {
        ReceitaItem receitaItem = new ReceitaItem();
        receitaItem.setItemProduto(rsItens.getString("itemProduto"));
        receitaItem.setItemDescricaoProduto(rsItens.getString("itemDescricaoProduto"));
        receitaItem.setItemNomeProduto(rsItens.getString("itemNomeProduto"));
        receitaItem.setItemQuantidade(rsItens.getInt("itemQuantidade"));
        receitaItem.setItemRecomendacao(rsItens.getString("itemRecomendacao"));
        receitaItem.setItemUnidadeMedida(rsItens.getString("itemUnidadeMedida"));
        rm.setValidade(rsItens.getDate("validade"));
        rm.setData(rsItens.getDate("data"));
        itens.add(receitaItem);
      }

      rm.setItens(itens);
    } else {
      paramItens.put("tipo", filter.getTipo());
      paramItens.put("codigoAtendimento", filter.getCodigoAtendimento());
      ResultSet rsItens = Util.subResultSet(ReceitaItemScript.getSqlItens(filter), paramItens, conn);
      while (rsItens.next()) {
        ReceitaItem receitaItem = new ReceitaItem();
        receitaItem.setItemProduto(rsItens.getString("itemProduto"));
        receitaItem.setItemDescricaoProduto(rsItens.getString("itemDescricaoProduto"));
        receitaItem.setItemNomeProduto(rsItens.getString("itemNomeProduto"));
        receitaItem.setItemQuantidade(rsItens.getInt("itemQuantidade"));
        receitaItem.setItemRecomendacao(rsItens.getString("itemRecomendacao"));
        receitaItem.setItemUnidadeMedida(rsItens.getString("itemUnidadeMedida"));
        rm.setValidade(rsItens.getDate("validade"));
        rm.setData(rsItens.getDate("data"));
        itens.add(receitaItem);
      }

      rm.setItens(itens);
    }

    data.add(rm);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Receituário";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.gerarPdf();
  }

  @Override
  public void receitaMedicaEspecial(ReceitaMedicaEspecialFilter filter) throws Exception {
    conn = ConnectionUtil.getConnection();
    List<ReceitaMedica> data = new ArrayList<>();

    Map<String, Object> paramUsu = new HashMap<>();
    paramUsu.put("usuCodigo", filter.getUsuCodigo());
    ResultSet rsUsu = Util.subResultSet(UsuarioScript.getInfo(), paramUsu, conn);

    Map<String, Object> paramUsr = new HashMap<>();
    paramUsr.put("usrCodigo", filter.getUsrCodigo());
    ResultSet rsUsr = Util.subResultSet(UsuariosScript.getUsuario(), paramUsr, conn);

    ReceitaMedicaEspecial rm = new ReceitaMedicaEspecial();

    rm.setCodigoDeBarras(filter.getCodigoDeBarras());

    if (filter.getSegundaVia() != null) {
      rm.setSegundaVia(filter.getSegundaVia() == 1);
    }

    if (rsUsr.next()) {
      rm.setNomeEmitente(rsUsr.getString("nomeEmitente"));
      rm.setCrm(rsUsr.getString("crm"));
      rm.setTelefoneEmitente(rsUsr.getString("telefoneEmitente"));
      rm.setEnderecoEmitente(rsUsr.getString("enderecoEmitente"));
      rm.setNumeroEmitente(rsUsr.getString("numeroEmitente"));
      rm.setCidadeEmitente(rsUsr.getString("cidadeEmitente"));
      rm.setUfEmitente(rsUsr.getString("ufEmitente"));
      rm.setEspecialidadeEmitente(rsUsr.getString("especialidade"));
      rm.setConselhoSigla(rsUsr.getString("conselhoSigla"));
    }

    if (rsUsu.next()) {
      rm.setProntuarioPaciente(rsUsu.getString("prontuarioPaciente"));
      rm.setNomePaciente(rsUsu.getString("nomePaciente"));
      StringBuilder endereco = new StringBuilder();
      endereco.append(
        rsUsu.getString("tipoLogradouroPaciente") != null ? rsUsu.getString("tipoLogradouroPaciente").concat(", ") : "")
        .append(rsUsu.getString("nomeRuaPaciente") != null ? rsUsu.getString("nomeRuaPaciente").concat(", ") : "")
        .append(
          rsUsu.getString("domicilioNumeroPaciente") != null ?
            rsUsu.getInt("domicilioNumeroPaciente") != 0 ?
              rsUsu.getString("domicilioNumeroPaciente") : "S/N" : "");
      rm.setEnderecoPaciente(endereco.length() > 0 ? endereco.toString() : null);
      rm.setCns(rsUsu.getString("cns"));
    }

    Map<String, Object> paramItens = new HashMap<>();

    if (filter.getSelecionados() != null) {
      paramItens.put("selecionados", filter.getSelecionados());
    }

    List<ReceitaItem> itens = new ArrayList<>();

    if (filter.getIoCodigo() != null) {
      paramItens.put("ioCodigo", filter.getIoCodigo());
      ResultSet rsItens = Util.subResultSet(ReceitaItemScript.getSqlItensInternacao(filter), paramItens, conn);
      while (rsItens.next()) {
        ReceitaItem receitaItem = new ReceitaItem();
        receitaItem.setItemProduto(rsItens.getString("itemProduto"));
        receitaItem.setItemDescricaoProduto(rsItens.getString("itemDescricaoProduto"));
        receitaItem.setItemNomeProduto(rsItens.getString("itemNomeProduto"));
        receitaItem.setItemQuantidade(rsItens.getInt("itemQuantidade"));
        receitaItem.setItemRecomendacao(rsItens.getString("itemRecomendacao"));
        receitaItem.setItemUnidadeMedida(rsItens.getString("itemUnidadeMedida"));
        rm.setData(rsItens.getDate("data"));
        rm.setValidade(rsItens.getDate("validade"));
        itens.add(receitaItem);
      }

      rm.setItens(itens);
    } else {
      paramItens.put("tipo", filter.getTipo());
      paramItens.put("codigoAtendimento", filter.getCodigoAtendimento());
      ResultSet rsItens = Util.subResultSet(ReceitaItemScript.getSqlItens(filter), paramItens, conn);
      while (rsItens.next()) {
        ReceitaItem receitaItem = new ReceitaItem();
        receitaItem.setItemProduto(rsItens.getString("itemProduto"));
        receitaItem.setItemDescricaoProduto(rsItens.getString("itemDescricaoProduto"));
        receitaItem.setItemNomeProduto(rsItens.getString("itemNomeProduto"));
        receitaItem.setItemQuantidade(rsItens.getInt("itemQuantidade"));
        receitaItem.setItemRecomendacao(rsItens.getString("itemRecomendacao"));
        receitaItem.setItemUnidadeMedida(rsItens.getString("itemUnidadeMedida"));
        rm.setData(rsItens.getDate("data"));
        rm.setValidade(rsItens.getDate("validade"));
        itens.add(receitaItem);
      }

      rm.setItens(itens);
    }

    data.add(rm);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Receituário de Controle Especial";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, filter.getTpRel());
    creator.gerarPdf();
  }

  @Override
  public void atendimentosClassificacao(AtendimentoClassificacaoFilter atendimentoClassificacaoFilter)
    throws Exception {
    params.put("unidade", atendimentoClassificacaoFilter.getUnidade());
    params.put("dtInicial", Util.dateToSqlDate(atendimentoClassificacaoFilter.getDtInicial()));
    params.put("dtFinal", Util.dateToSqlDate(atendimentoClassificacaoFilter.getDtFinal()));

    rs = Util.resolveResultSet(AtendimentosClassificacaoScript.getSql(), params);

    List<AtendimentoClassificacao> data = new ArrayList<>();

    while (rs.next()) {
      AtendimentoClassificacao ate = new AtendimentoClassificacao();

      ate.setData(rs.getDate("data"));
      ate.setUnidade(rs.getString("unidade"));
      ate.setImediato(rs.getInt("imediato"));
      ate.setMuitoUrgente(rs.getInt("muitoUrgente"));
      ate.setUrgente(rs.getInt("urgente"));
      ate.setPoucoUrgente(rs.getInt("poucoUrgente"));
      ate.setNaoUrgente(rs.getInt("naoUrgente"));
      ate.setTotal(rs.getInt("total"));
      data.add(ate);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Quantidade de Atendimentos por Classificação de Risco";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro(FormatFilters.filterAtendimentoClassificacao(atendimentoClassificacaoFilter));
    creator.gerarPdf();

  }

  @Override
  public void concessao(ConcessaoFilter concessaoFilter) throws Exception {
    conn = ConnectionUtil.getConnection();
    List<Concessao> data = new ArrayList<>();

    Map<String, Object> param = new HashMap<>();
    param.put("conCodigo", concessaoFilter.getConCodigo());
    ResultSet rs = Util.subResultSet(ConcessaoScript.getDadosConcessao(), param, conn);

    Concessao con = new Concessao();

    con.setCodigoDeBarras(concessaoFilter.getCodigoDeBarras());

    if (concessaoFilter.getSegundaVia() != null) {
      con.setSegundaVia(concessaoFilter.getSegundaVia() == 1);
    }

    if (rs.next()) {
      con.setEstabelecimentoRetirada(rs.getString("estabelecimentoRetirada"));
      con.setObservacao(rs.getString("observacao"));
      con.setObservacaoSigilosa(rs.getString("observacaoSigilosa"));
      con.setDataConcessao(rs.getDate("dataConcessao"));

      con.setNomeCidadao(rs.getString("nomeCidadao"));
      StringBuilder endereco = new StringBuilder();
      endereco
        .append(rs.getString("tipoLogradouroCidadao") != null ? rs.getString("tipoLogradouroCidadao").concat(", ") : "")
        .append(rs.getString("nomeRuaCidadao") != null ? rs.getString("nomeRuaCidadao").concat(", ") : "")
        .append(
          rs.getString("domicilioNumeroCidadao") != null ?
            rs.getInt("domicilioNumeroCidadao") != 0 ?
              rs.getString("domicilioNumeroCidadao") : "S/N" : "");
      con.setEnderecoCidadao(endereco.length() > 0 ? endereco.toString() : null);
      con.setCnsCidadao(rs.getString("cnsCidadao"));
    }

    Map<String, Object> paramUsr = new HashMap<>();
    paramUsr.put("usrCodigo", concessaoFilter.getUsrCodigo());
    ResultSet rsUsr = Util.subResultSet(UsuariosScript.getUsuario(), paramUsr, conn);

    if (rsUsr.next()) {
      con.setNomeResponsavel(rsUsr.getString("nomeEmitente"));
    }

    Map<String, Object> paramItens = new HashMap<>();
    List<ConcessaoItem> itens = new ArrayList<>();

    paramItens.put("conCodigo", concessaoFilter.getConCodigo());
    ResultSet rsItens = Util.subResultSet(ConcessaoItemScript.getSqlItensConcessao(concessaoFilter), paramItens, conn);
    while (rsItens.next()) {
      ConcessaoItem concessaoItem = new ConcessaoItem();
      concessaoItem.setItemNomeProduto(rsItens.getString("itemNomeProduto"));
      concessaoItem.setItemQuantidade(rsItens.getInt("itemQuantidade"));
      itens.add(concessaoItem);
    }

    con.setItens(itens);

    data.add(con);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Concessão";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.gerarPdf();
  }

  @Override public void etiquetaPaciente(EtiquetaFilter etiquetaFilter) throws Exception {
    params.put("usuCodigo", etiquetaFilter.getUsuario());

    rs = Util.resolveResultSet(EtiquetaPacienteScript.getSql(), params);

    List<EtiquetaPaciente> data = new ArrayList<>();

    while (rs.next()) {
      EtiquetaPaciente etp = new EtiquetaPaciente();
      etp.setProntuario(rs.getString("prontuarioPaciente"));
      etp.setNome(rs.getString("nomePaciente"));
      etp.setCns(rs.getString("cns"));
      etp.setDataNascimento(rs.getDate("dataNascimento"));
      etp.setSexo(rs.getString("sexo"));
      etp.setMae(rs.getString("nomeMae"));
      etp.setNomeSocial(rs.getString("nomeSocial"));

      data.add(etp);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "";
    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, data, SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override public void contagemEstoque(ContagemEstoqueFilter contagemEstoqueFilter) throws Exception {
    params.put("centroEstocador", contagemEstoqueFilter.getCentroEstocador());

    if (contagemEstoqueFilter.getGrupo() != null) {
      params.put("grupo", contagemEstoqueFilter.getGrupo());
    }

    if (contagemEstoqueFilter.getSubgrupo() != null) {
      params.put("subgrupo", contagemEstoqueFilter.getSubgrupo());
    }


    rs = Util.resolveResultSet(ContagemEstoqueScript.getDadosContagemEstoque(contagemEstoqueFilter), params);
    List<ContagemEstoque> contagemEstoques = new ArrayList<>();

    while (rs.next()) {
      ContagemEstoque contagemEstoque = new ContagemEstoque();
      contagemEstoque.setCodigoProduto(rs.getString("pro_codigo"));
      contagemEstoque.setDescricaoProduto(rs.getString("pro_nome"));
      contagemEstoques.add(contagemEstoque);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName().toLowerCase();
    String titulo = "Relatório Contagem Estoque";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, contagemEstoques, null);
    creator.gerarPdf();
  }

  @Override
  public void consultaDadosHorus(ConsultaDadosHorusFilter consultaDadosHorusFilter) throws Exception {
    params.put("tiposRegistros", consultaDadosHorusFilter.getTiposRegistros());
    params.put("dataInicial", Util.dateToTimeStamp(consultaDadosHorusFilter.getDtInicial()));
    params.put("dataFinal", Util.dateToTimeStamp(consultaDadosHorusFilter.getDtFinal()));

    rs = Util.resolveResultSet(ConsultaDadosHorusScript.getSql(consultaDadosHorusFilter), params);
    List<ConsultaDadosHorus> consultasDados = new ArrayList<>();

    while (rs.next()) {
      ConsultaDadosHorus c = new ConsultaDadosHorus();
      Float qtd = rs.getFloat("quantidade");

      c.setData(new SimpleDateFormat("dd/MM/yyyy").format(rs.getDate("data")));
      c.setCatmat(rs.getString("catmat"));
      c.setCodigoMovimentacao(rs.getString("codMovimentacao"));
      c.setNumeroProtocolo(rs.getString("numProtocolo"));
      c.setQuantidade(qtd.toString());
      c.setResponsavelEnvio(rs.getString("responsavelEnvio"));
      c.setTipoRegistro(c.getDescricaoTipoRegistro(rs.getString("tipoRegistro")));
      consultasDados.add(c);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName().toLowerCase();
    String titulo = "Relatório de Consulta de Dados do Horus";

    creator = new JasperCreator(SistemaEnum.SAUDE, filename, titulo, consultasDados, null);
    creator.setFiltro(FormatFilters.filterConsultaDadosHorus(consultaDadosHorusFilter));
    creator.gerarPdf();
  }
}
