package br.com.elotech.social.dao.Impl;

import br.com.elotech.config.ConnectionUtil;
import br.com.elotech.enuns.SistemaEnum;
import br.com.elotech.enuns.TipoRelEnum;
import br.com.elotech.social.dao.SocialDao;
import br.com.elotech.social.filters.FormatFilters;
import br.com.elotech.social.model.atendimento.CertidaoLiberatoria;
import br.com.elotech.social.model.cadastros.AtaReuniao;
import br.com.elotech.social.model.cadastros.Declaracao;
import br.com.elotech.social.model.cadastros.ReuniaoParticipantes;
import br.com.elotech.social.model.familiaacolhedora.*;
import br.com.elotech.social.model.filters.*;
import br.com.elotech.social.model.prontuarioSuas.*;
import br.com.elotech.social.model.relatorio.*;
import br.com.elotech.social.scripts.*;
import br.com.elotech.util.Extenso;
import br.com.elotech.util.JasperCreator;
import br.com.elotech.util.Util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import static br.com.elotech.util.Util.naoInformadoWhenNull;
import static br.com.elotech.util.Util.vazioWhenNull;

public class SocialDaoImpl implements SocialDao {

  private final String ATENDIMENTO_BASICO = "atendimento_basico";
  private final String BENEFICIOS_OFERTADOS = "beneficios_ofertados";
  private final String ATIVIDADE_COLETIVA = "atividade_coletiva";
  private final String RELATORIO_GERAL = "relatorio_geral";
  private Connection conn;
  private ResultSet rs;
  private JasperCreator creator;
  private Map<String, Object> params = new HashMap<>();

  @Override
  public void resumoGeral(ResumoGeralFilter filter) throws Exception {
    ResumoGeral resumoGeral = new ResumoGeral();
    switch (filter.getTipo()) {
    case ATENDIMENTO_BASICO:
      resumoGeral.imprimeAtendimentoBasico(filter);
      break;
    case BENEFICIOS_OFERTADOS:
      resumoGeral.imprimeBeneficiosOfertados(filter);
      break;
    case ATIVIDADE_COLETIVA:
      resumoGeral.imprimeAtividadeColetiva(filter);
      break;
    case RELATORIO_GERAL:
      resumoGeral.imprimeRelatorioGeral(filter);
      break;
    }
  }

  @Override
  public void certidaoLiberatoria(CertidaoLiberatoriaFilter filter) throws Exception {
    params.put("asclCodigo", filter.getAsclCodigo());
    rs = Util.resolveResultSet(CertidaoLiberatoriaScript.getSqlCertidaoLiberatoria(), params);
    List<CertidaoLiberatoria> data = new ArrayList<>();
    while (rs.next()) {
      CertidaoLiberatoria certidao = new CertidaoLiberatoria();
      certidao.setUnidade(rs.getString("uni_desc"));
      certidao.setCnpjUnidade(rs.getString("uni_cnpj"));
      certidao.setLei(rs.getString("ascl_lei"));
      certidao.setDecreto(rs.getString("ascl_decreto"));
      certidao.setDataValidade(rs.getDate("ascl_data_validade"));
      certidao.setDataConcessao(rs.getDate("ascl_data_concessao"));
      certidao.setNumero(rs.getInt("ascl_numero"));
      certidao.setExercicio(rs.getInt("ascl_exercicio"));
      certidao.setProfissional(rs.getString("usr_nome"));
      certidao.setCargo(rs.getString("crg_nome"));
      data.add(certidao);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Certidão Liberatória";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
    creator.setFiltro(FormatFilters.filterCertidaoLiberatoria(filter));
    creator.gerarPdf();
  }

  @Override
  public void atividadeColetivaInscricaoAberta(AtividadeColetivaInscricaoAbertaFilter filter) throws Exception {
    if (filter.getUniCodigo() != null) {
      params.put("unidade", filter.getUniCodigo());
    }
    params.put("usr_codigo", filter.getUsr_logado());
    rs = Util
      .resolveResultSet(AtividadeColetivaInscricaoAbertaScript.getSqlAtividadeColetivaInscricaoAberta(filter), params);
    List<AtividadeColetivaInscricaoAberta> data = new ArrayList<>();
    while (rs.next()) {
      AtividadeColetivaInscricaoAberta atividade = new AtividadeColetivaInscricaoAberta();
      atividade.setUnidade(rs.getString("uni_desc"));
      atividade.setGruDescricao(rs.getString("asag_titulo"));
      atividade.setGruQtdePermitida(rs.getInt("asag_quantidade_grupo"));
      if ((rs.getInt("asag_quantidade_grupo") - rs.getInt("gruQtdeVagasOcupadas")) >= 0) {
        atividade.setGruQtdeVagasAbertas(rs.getInt("asag_quantidade_grupo") - rs.getInt("gruQtdeVagasOcupadas"));
      } else {
        atividade.setGruQtdeVagasAbertas(0);
      }

      atividade.setPrograma(rs.getString("programa"));
      data.add(atividade);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Relatório de Atividade Coletiva com Inscrição Aberta";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
    creator.setFiltro(FormatFilters.filterAtividadeColetivaInscricaoAberta(filter));
    creator.gerarPdf();
  }

  @Override
  public void ataReuniao(AtaReuniaoFilter filter) throws Exception {
    params.put("asreuCodigo", filter.getAsreu_codigo());
    rs = Util.resolveResultSet(AtaReuniaoScript.getSqlAtaReuniao(), params);
    List<AtaReuniao> data = new ArrayList<>();
    int aux = 0;
    String titulo = "Ata de Reunião";
    if (rs.next()) {
      AtaReuniao ataReuniao = new AtaReuniao();
      ataReuniao.setUnidade(rs.getString("uni_desc"));
      ataReuniao.setTitulo(rs.getString("asreu_titulo"));
      ataReuniao.setNumero(rs.getString("asreu_numero"));
      if (ataReuniao.getNumero() != null && !ataReuniao.getNumero().isEmpty()) {
        titulo = titulo.concat(" Nº ").concat(ataReuniao.getNumero());
      }
      ataReuniao.setDescricao(rs.getString("asreu_desc"));
      ataReuniao.setData(rs.getDate("asreu_data"));
      ataReuniao.setHoraInicio(rs.getTime("asreu_hora_inicio"));
      ataReuniao.setHoraTermino(rs.getTime("asreu_hora_fim"));
      Map<String, Object> p2 = new HashMap<>();
      p2.put("asreuCodigo", filter.getAsreu_codigo());
      ResultSet rsp = Util.resolveResultSet(AtaReuniaoScript.getSqlReuniaoParticipantes(), p2);
      while (rsp.next()) {

        ReuniaoParticipantes rpc = new ReuniaoParticipantes();
        rpc.setParticipante(rsp.getString("usr_nome"));
        rpc.setCargo(rsp.getString("crg_nome"));
        if ((aux % 2) == 0) {
          ataReuniao.getParticipantespar().add(rpc);
        } else {
          ataReuniao.getParticipantesimpar().add(rpc);
        }
        aux++;
      }
      data.add(ataReuniao);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
    creator.setFiltro(FormatFilters.filterAtaReuniao(filter));
    creator.gerarPdf();
  }

  public void atendimentoRealizadoAosMunicipes(AtendimentoRealizadoAosMunicipesFilter filter) throws Exception {

    if (filter.getUniCodigo() != null) {
      params.put("unidade", filter.getUniCodigo());
    }
    params.put("dt_inicial", Util.dateToTimeStamp(filter.getDt_inicial()));
    params.put("dt_final", Util.dateToTimeStamp(filter.getDt_final()));

    rs = Util
      .resolveResultSet(AtendimentoRealizadoAosMunicipesScript.getSqlAtendimentoRealizadoAosMunicipes(filter), params);
    List<AtendimentoRealizadoAosMunicipes> data = new ArrayList<>();
    while (rs.next()) {
      AtendimentoRealizadoAosMunicipes att = new AtendimentoRealizadoAosMunicipes();
      att.setUnidade(rs.getString("uni_desc"));
      att.setFaixaEtaria(rs.getString("faixa_etaria"));
      att.setQtdeAtendimento(rs.getInt("qtdeAtendimento"));
      switch (att.getFaixaEtaria()) {
      case "00 e 05 ANOS":
        att.setQtde_0_5(att.getQtdeAtendimento());
        break;
      case "06 e 14 ANOS":
        att.setQtde_6_14(att.getQtdeAtendimento());
        break;
      case "15 e 17 ANOS":
        att.setQtde_15_17(att.getQtdeAtendimento());
        break;
      case "18 e 59 ANOS":
        att.setQtde_18_59(att.getQtdeAtendimento());
        break;
      case "60 ANOS OU MAIS":
        att.setQtde_60(att.getQtdeAtendimento());
        break;
      }
      data.add(att);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Relatório de Atendimentos Realizados aos Munícipes por Faixa Etária";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
    creator.setFiltro(FormatFilters.filterAtendimentoRealizadoAosMunicipes(filter));
    creator.gerarPdf();
  }

  @Override
  public void prontuarioSuas(ProntuarioSuasFilter filter) throws Exception {
    params.put("aspsCodigo", filter.getAspsCodigo());
    conn = ConnectionUtil.getConnection();
    List<ProntuarioSuas> data = new ArrayList<>();
    ProntuarioSuas pront = new ProntuarioSuas();

    //Pessoa de Referência
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlPessoaReferencia(), params, conn);
    if (rs.next()) {
      PessoaReferencia pes = new PessoaReferencia();
      pes.setUsuCodigo(rs.getInt("codigo"));
      pes.setNome(rs.getString("nome"));
      pes.setSexo(rs.getString("sexo"));
      pes.setDataNascimento(rs.getDate("data_nascimento"));
      pes.setIdade(rs.getInt("idade"));
      pes.setNis(rs.getString("nis"));
      String end = "".concat(rs.getString("tipoLog") != null ? rs.getString("tipoLog") : "").concat(" ")
        .concat(rs.getString("rua_nome") != null ? rs.getString("rua_nome") : "").concat(" ")
        .concat((rs.getString("domicilio_numero") != null ? rs.getString("domicilio_numero") : "")).concat(" ")
        .concat((rs.getString("domicilio_complemento") != null ? rs.getString("domicilio_complemento") : ""))
        .concat(", ")
        .concat((rs.getString("bairro_nome") != null ? rs.getString("bairro_nome") : "")).concat(" ")
        .concat((rs.getString("cidade_nome") != null ? rs.getString("cidade_nome") : ""))
        .concat(rs.getString("cidade_nome") != null ? "/" : "")
        .concat((rs.getString("estado_sigla") != null ? rs.getString("estado_sigla") : ""));
      pes.setEndereco(end);
      pront.setPessoaReferencia(pes);
    }

    //Forma de Acesso e Primeiro Atendimento
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlFormaIngresso(), params, conn);
    if (rs.next()) {
      pront.setFormaAcesso(rs.getString("formaAcesso"));
      pront.setRazoesNecessidades(rs.getString("razoesNecessidades"));
      pront.setFamiliaBolsa(rs.getBoolean("bolsaFamilia"));
      pront.setFamiliaBpc(rs.getBoolean("bpc"));
      pront.setFamiliaPeti(rs.getBoolean("peti"));
      pront.setFamiliaPaefi(rs.getBoolean("paefi"));
      pront.setFamiliaOutras(rs.getBoolean("prog_outros"));
      pront.setFamiliaPaif(rs.getBoolean("paif"));
      pront.setFamiliaScfv(rs.getBoolean("scfv"));
      pront.setFamiliaProgPrioritario(rs.getString("prog_prioritario"));
    }
    //Atendimento Basico
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlAtendimentoBasico(), params, conn);
    List<AtendimentoBasico> listAtend = new ArrayList<>();
    while (rs.next()) {
      AtendimentoBasico atend = new AtendimentoBasico();
      atend.setData(rs.getDate("data"));
      atend.setDescricao(rs.getString("descricao"));
      atend.setParecer(rs.getString("parecer"));
      atend.setParecerSocial(rs.getString("parecer_social"));
      atend.setUnidade(rs.getString("unidade"));
      atend.setProfissional(rs.getString("profissional"));
      atend.setCidadao(rs.getString("cidadao"));
      atend.setTipoAtendimento(rs.getString("tipo"));

      listAtend.add(atend);
    }
    pront.setAtendimentosBasicos(listAtend);

    //Beneficios Eventuais

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlBeneficio(), params, conn);
    List<BeneficioEventual> listBen = new ArrayList<>();
    while (rs.next()) {
      BeneficioEventual ben = new BeneficioEventual();
      ben.setUnidade(rs.getString("unidade"));
      ben.setCidadao(rs.getString("cidadao"));
      ben.setEstabelecimento(rs.getString("estabelecimento"));
      ben.setObservacao(rs.getString("observacao"));
      ben.setDataEntrega(rs.getDate("dataEntrega"));
      ben.setDataConcessao(rs.getDate("dataConcessao"));

      Map<String, Object> params2 = new HashMap<>();
      params2.put("asbdCodigo", rs.getInt("codigo"));
      ResultSet rs2 = Util.subResultSet(ProntuarioSuasScript.getSqlBeneficioItem(), params2, conn);
      List<BeneficioItem> listItem = new ArrayList<>();
      while (rs2.next()) {
        BeneficioItem item = new BeneficioItem();
        item.setBeneficio(rs2.getString("beneficio"));
        item.setTipo(rs2.getString("tipo"));
        item.setQuantidade(rs2.getInt("quantidade"));
        item.setValor(rs2.getDouble("valor"));
        item.setConcedido(rs2.getBoolean("concedido"));
        listItem.add(item);
      }
      ben.setItens(listItem);
      listBen.add(ben);
    }
    pront.setBeneficios(listBen);

    //Encaminhamentos
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlEncaminhamento(), params, conn);
    List<Encaminhamento> listEnc = new ArrayList<>();
    while (rs.next()) {
      Encaminhamento enc = new Encaminhamento();
      enc.setUnidade(rs.getString("unidade"));
      enc.setProfissional(rs.getString("profissional"));
      enc.setLocal(rs.getString("local"));
      enc.setCidadao(rs.getString("cidadao"));
      enc.setData(rs.getDate("data"));

      listEnc.add(enc);

    }
    pront.setEncaminhamentos(listEnc);

    //Grupos
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlGrupos(), params, conn);
    List<AtendimentoColetivo> listGrupo = new ArrayList<>();
    while (rs.next()) {
      AtendimentoColetivo atend = new AtendimentoColetivo();
      atend.setUnidade(rs.getString("unidade"));
      atend.setGrupo(rs.getString("grupo"));
      atend.setAtivo(rs.getBoolean("ativo"));
      atend.setDataInsercao(rs.getDate("data"));
      atend.setCidadao(rs.getString("cidadao"));

      listGrupo.add(atend);
    }
    pront.setGrupos(listGrupo);

    // Composição Familiar
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlComposicaoFamiliar(), params, conn);
    List<PessoaFamilia> listPesf = new ArrayList<>();
    while (rs.next()) {
      PessoaFamilia pesf = new PessoaFamilia();
      pesf.setOrdem(rs.getInt("ordem"));
      pesf.setParentesco(rs.getString("parentesco"));
      pesf.setNome(rs.getString("nome"));
      pesf.setSexo(rs.getString("sexo"));
      pesf.setDataNascimento(rs.getDate("data_nascimento"));
      pesf.setDeficiencia(rs.getBoolean("deficiencia"));
      pesf.setIdade(rs.getInt("idade"));
      pesf.setAlfabetizado(rs.getBoolean("alfabetizado"));
      pesf.setEstudante(rs.getBoolean("estuda"));
      pesf.setEscolaridade(rs.getString("escolaridade"));
      pesf.setCtps(rs.getBoolean("possui_ctps"));
      pesf.setCondicaoOcupacao(rs.getString("condicao_ocupacao"));
      pesf.setPossuiQualificacao(rs.getBoolean("possui_qualificacao"));
      pesf.setQualificacao(rs.getString("qualificacao"));
      pesf.setRendaMensal(rs.getDouble("renda_mensal"));
      pesf.setTipoDeficiencia(rs.getString("tipo_deficiencia"));
      pesf.setCuidadoConstante(rs.getBoolean("cuidado_constante"));
      pesf.setResponsavelCuidado(rs.getString("resp_cuidado"));

      listPesf.add(pesf);
    }
    pront.setComposicaoFamiliar(listPesf);

    // Perfil Etario Grupo Familiar
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlPerfilEtario(), params, conn);
    List<FaixaEtaria> listFaxEt = new ArrayList<>();
    while (rs.next()) {
      FaixaEtaria faxEt = new FaixaEtaria();

      faxEt.setFaixaEtaria(rs.getString("faixa_etaria"));
      faxEt.setQtdeFamiliares(rs.getInt("qtdeFamiliares"));

      listFaxEt.add(faxEt);
    }
    pront.setFaixaEtaria(listFaxEt);

    //ESPECIFICIDADES SOCIAIS, ÉTNICAS OU CULTURAIS DA FAMÍLIA
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlEspecificidadesFamilia(), params, conn);
    while (rs.next()) {
      pront.setSituacaoRua(rs.getBoolean("aspses_fam_situacao_rua"));
      pront.setFamiliaQuilombola(rs.getBoolean("aspses_fam_quilombada"));
      pront.setFamiliaRibeirinha(rs.getBoolean("aspses_fam_ribeirinha"));
      pront.setFamiliaCigana(rs.getBoolean("aspses_fam_cigana"));
      pront.setFamiliaIndigenaResidente(rs.getBoolean("aspses_fam_indigena_residente"));
      pront.setFamiliaIndigenaResidenteEtnia(rs.getString("aspses_fam_indigena_retnia"));
      pront.setFamiliaIndigenaNaoResidente(rs.getBoolean("aspses_fam_indigena_nretnia"));
      pront.setFamiliaIndigenaNaoResidenteEtnia(rs.getString("aspses_fam_indigena_nretnia"));
      pront.setFamiliaOutras(rs.getBoolean("aspses_outros"));
    }

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlComposicaoFamiliarObservacao(), params, conn);
    List<Observacao> obs = new ArrayList<>();

    while (rs.next()) {
      Observacao obsFam = new Observacao();

      obsFam.setData(rs.getDate("data"));
      obsFam.setObservacao(rs.getString("observacao"));
      obsFam.setResponsavel(rs.getString("responsavel"));

      obs.add(obsFam);

    }
    pront.setObsCompFamiliar(obs);

    // CONDIÇÕES HABITACIONAIS
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlCondicoesHabitacionais(), params, conn);
    CondicoesHabitacionais condHab = new CondicoesHabitacionais();

    if (rs.next()) {
      condHab.setTipoResidencia(rs.getString("aspsch_tipo_residencia"));
      condHab.setMaterialResidencia(rs.getString("aspsch_material"));
      condHab.setAcessoEnergia(rs.getString("aspsch_acesso_energia"));
      condHab.setPossuiAgua(rs.getBoolean("aspsch_possui_agua"));
      condHab.setFormaAbastecimento(rs.getString("aspsch_forma_abastecimento"));
      condHab.setEscoamentoSanitario(rs.getString("aspsch_escoamento_sanit"));
      condHab.setColetaLixo(rs.getString("aspsch_coleta_lixo"));
      condHab.setNumeroComodos(rs.getInt("aspsch_num_comodos"));
      condHab.setNumeroComodosUtilizados(rs.getInt("aspsch_num_comodos_utilizado"));
      condHab.setNumeroPessoasComodo(rs.getInt("aspsch_num_pessoas_comodos"));
      condHab.setAcessibilidade(rs.getString("aspsch_acessibilidade"));
      condHab.setDomAreaRisco(rs.getBoolean("aspsch_domicilio_area_risco"));
      condHab.setDomAreaGeografica(rs.getBoolean("aspsch_domicilio_area_geografica"));
      condHab.setDomAreaConflito(rs.getBoolean("aspsch_domicilio_area_conflito"));
    }

    pront.setCondicoesHabitacionais(condHab);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlCondicoesHabitacionaisObservacao(), params, conn);
    obs = new ArrayList<>();
    while (rs.next()) {
      Observacao obsHab = new Observacao();

      obsHab.setData(rs.getDate("data"));
      obsHab.setObservacao(rs.getString("observacao"));
      obsHab.setResponsavel(rs.getString("responsavel"));

      obs.add(obsHab);

    }
    pront.setObsHabitacionais(obs);

    //VULNERABILIDADE EDUCACIONAL
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlVulnerabilidadeEducacionalNaoFreqEsc(), params, conn);
    List<NaoFrequentaEscola> naoFrequentaEscola = new ArrayList<>();
    while (rs.next()) {
      NaoFrequentaEscola nFreqEsc = new NaoFrequentaEscola();

      nFreqEsc.setFaixaEtaria(rs.getString("faixa_etaria"));
      nFreqEsc.setQtdeNFreqEscola(rs.getInt("qtdeNFreqEsc"));

      naoFrequentaEscola.add(nFreqEsc);
    }
    pront.setNaoFrequentaEscola(naoFrequentaEscola);
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlVulnerabilidadeEducacionalAnalfabeto(), params, conn);
    List<Analfabeto> analfabetos = new ArrayList<>();
    while (rs.next()) {
      Analfabeto analf = new Analfabeto();

      analf.setFaixaEtaria(rs.getString("faixa_etaria"));
      analf.setQtdeAnalfabeto(rs.getInt("qtdeAnalfabeto"));

      analfabetos.add(analf);
    }
    pront.setAnalfabeto(analfabetos);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlCondicoesEducacionaisDescPrograma(), params, conn);
    List<CondicoesEducacionais> listCondEduc = new ArrayList<>();

    while (rs.next()) {
      CondicoesEducacionais condEduc = new CondicoesEducacionais();
      condEduc.setDataOcorrencia(rs.getDate("data_ocorrencia"));
      condEduc.setEfeito(rs.getString("efeito"));
      condEduc.setSuspenso(rs.getBoolean("suspenso"));
      condEduc.setDataCadastro(rs.getDate("data_cadastro"));
      condEduc.setNome(rs.getString("nome"));

      listCondEduc.add(condEduc);
    }
    pront.setCondicoesEducacionais(listCondEduc);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlObsCondicoesEducacionais(), params, conn);
    obs = new ArrayList<>();
    while (rs.next()) {
      Observacao obsEdu = new Observacao();

      obsEdu.setData(rs.getDate("data"));
      obsEdu.setObservacao(rs.getString("observacao"));
      obsEdu.setResponsavel(rs.getString("responsavel"));

      obs.add(obsEdu);

    }
    pront.setObsEducacionais(obs);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlAnotProgramasFamilia(), params, conn);
    List<AnotacoesProgramasFamilia> listAnotFam = new ArrayList<>();

    while (rs.next()) {
      AnotacoesProgramasFamilia anotProgFam = new AnotacoesProgramasFamilia();
      anotProgFam.setProgramaNome(rs.getString("programa_nome"));
      anotProgFam.setValorRecebido(rs.getDouble("valor_recebido"));
      anotProgFam.setDataInicio(rs.getDate("data_inicio"));
      anotProgFam.setDataFinal(rs.getDate("data_final"));
      listAnotFam.add(anotProgFam);
    }
    pront.setAnotacoesProgramasFamilia(listAnotFam);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlAnotProgramasCidadao(), params, conn);
    List<AnotacoesProgramasCidadao> listAnotCid = new ArrayList<>();

    while (rs.next()) {
      AnotacoesProgramasCidadao anotProgCid = new AnotacoesProgramasCidadao();
      anotProgCid.setProgramaNome(rs.getString("programa_nome"));
      anotProgCid.setValorRecebido(rs.getDouble("valor_recebido"));
      anotProgCid.setDataInicio(rs.getDate("data_inicio"));
      anotProgCid.setDataFinal(rs.getDate("data_final"));
      anotProgCid.setNome(rs.getString("nome"));
      listAnotCid.add(anotProgCid);
    }
    pront.setAnotacoesProgramasCidadao(listAnotCid);

    Double rendaFamiliarProgramas = 0.0;
    Double rendaPerCapitaProgramas = 0.0;
    rs = Util.subResultSet(ProntuarioSuasScript.getSqlInfRendaFamiliar(), params, conn);
    if (rs.next()) {
      rendaFamiliarProgramas = rs.getDouble("renda_progs");
    }

    rs = Util.subResultSet(ProntuarioSuasScript.getsqlRendaFamiliar(), params, conn);
    if (rs.next()) {
      pront.setQtdMembros(rs.getInt("qtd_membros"));
      pront.setRendaFamiliar(rs.getDouble("renda_familia"));
      pront.setRendaPerCapita(rs.getDouble("renda_percapita"));
    }
    rendaFamiliarProgramas += pront.getRendaFamiliar();
    rendaPerCapitaProgramas = rendaFamiliarProgramas / pront.getQtdMembros();

    pront.setRendaFamiliarProgramas(rendaFamiliarProgramas);
    pront.setRendaPerCapitaProgramas(rendaPerCapitaProgramas);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlObsCondTrabalho(), params, conn);
    obs = new ArrayList<>();
    while (rs.next()) {
      Observacao obsConT = new Observacao();

      obsConT.setData(rs.getDate("data"));
      obsConT.setObservacao(rs.getString("observacao"));
      obsConT.setResponsavel(rs.getString("responsavel"));

      obs.add(obsConT);

    }
    pront.setObsTrabalho(obs);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlAnotSaudeFamilia(), params, conn);
    if (rs.next()) {
      AnotacoesSaude ant = new AnotacoesSaude();
      ant.setCuidadoConstante(rs.getBoolean("cuidado_constante"));
      ant.setResponsavelCuidado(rs.getString("responsavel_cuidado"));
      ant.setInsegurancaAlimentar(rs.getBoolean("inseguranca_alimentar"));
      ant.setInsegurancaAlimentarData(rs.getDate("inseguranca_alimentar_data"));
      ant.setDoencaGrave(rs.getBoolean("doenca_grave"));
      ant.setTipoDoencaGrave(rs.getString("tipo_doenca_grave"));
      ant.setRemedioControlado(rs.getBoolean("remedio_controlado"));
      ant.setAlcoolatra(rs.getBoolean("alcoolatra"));
      ant.setAlcoolatraData(rs.getDate("alcoolatra_data"));
      ant.setDrogado(rs.getBoolean("drogado"));
      ant.setTipoDroga(rs.getString("tipo_droga"));
      ant.setDrogadoData(rs.getDate("drogado_data"));
      pront.setAnotacoesSaude(ant);
    }

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlObsSaudeFam(), params, conn);
    obs = new ArrayList<>();
    while (rs.next()) {
      Observacao obsSau = new Observacao();

      obsSau.setData(rs.getDate("data"));
      obsSau.setObservacao(rs.getString("observacao"));
      obsSau.setResponsavel(rs.getString("responsavel"));

      obs.add(obsSau);

    }
    pront.setObsSaudeFamilia(obs);

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlConvivencia(), params, conn);
    while (rs.next()) {

      ConvivenciaFamiliar conv = new ConvivenciaFamiliar();
      conv.setAnosEstado(rs.getInt("aspscf_anos_estado"));
      conv.setSempreResEstado(rs.getBoolean("aspscf_res_estado"));
      conv.setAnosMunicipio(rs.getInt("aspscf_anos_municipio"));
      conv.setSempreResMunicipio(rs.getBoolean("aspscf_res_municipio"));
      conv.setAnosBairro(rs.getInt("aspscf_anos_bairro"));
      conv.setSempreResBairro(rs.getBoolean("aspscf_res_bairro"));
      conv.setAmeacadaComunidade(rs.getBoolean("aspscf_ameacada"));
      conv.setParentesRede(rs.getBoolean("aspscf_parente_rede"));
      conv.setVizinhosRede(rs.getBoolean("aspscf_vizinho_rede"));
      conv.setGrupoRede(rs.getBoolean("aspscf_grupo_rede"));
      conv.setParticipaMovimento(rs.getBoolean("aspscf_movimento"));
      conv.setCriancaLazer(rs.getBoolean("aspscf_crianca_lazer"));
      conv.setIdosoLazer(rs.getBoolean("aspscf_idoso_lazer"));
      conv.setCompanhia(rs.getBoolean("aspscf_companhia"));
      conv.setConflito(rs.getString("aspscf_conflito"));
      conv.setRelConjugal(rs.getString("aspscf_rel_conjugal"));
      conv.setRelFamiliar(rs.getString("aspscf_rel_familiar"));
      conv.setRelIrmaos(rs.getString("aspscf_rel_irmaos"));

      pront.setConvivenciaFamiliar(conv);

    }

    rs = Util.subResultSet(ProntuarioSuasScript.getSqlConvivenciaObs(), params, conn);
    obs = new ArrayList<>();
    while (rs.next()) {
      Observacao obsConv = new Observacao();

      obsConv.setData(rs.getDate("data"));
      obsConv.setObservacao(rs.getString("observacao"));
      obsConv.setResponsavel(rs.getString("responsavel"));

      obs.add(obsConv);

    }
    pront.setObsConvivencia(obs);
    if (filter.getTipoUnidade() != null) {
      pront.setTipoUnidade(filter.getTipoUnidade());
      if (filter.getTipoUnidade().contains("CREAS")) {

        // VIOLENCIA E VIOLAÇÃO
        rs = Util.subResultSet(ProntuarioSuasScript.getSqlRegistrosViolacao(), params, conn);
        List<RegistroViolacao> listRegVio = new ArrayList<>();
        while (rs.next()) {
          RegistroViolacao reg = new RegistroViolacao();
          reg.setPersiste(rs.getBoolean("persiste"));
          reg.setDataInicio(rs.getDate("data_inicio"));
          reg.setDataFinal(rs.getDate("data_final"));
          reg.setNome(rs.getString("nome"));
          reg.setSituacao(rs.getString("situacao"));
          listRegVio.add(reg);
        }
        pront.setRegistroViolacao(listRegVio);

        rs = Util.subResultSet(ProntuarioSuasScript.getSqlHistAcolhimento(), params, conn);
        List<HistoricoAcolhimento> listHist = new ArrayList<>();
        while (rs.next()) {
          HistoricoAcolhimento hist = new HistoricoAcolhimento();
          hist.setOrdem(rs.getInt("ordem"));
          hist.setNome(rs.getString("nome"));
          hist.setMotivo(rs.getString("motivo"));
          hist.setDataInicio(rs.getDate("data_inicio"));
          hist.setDataFinal(rs.getDate("data_final"));
          listHist.add(hist);
        }
        pront.setHistoricoAcolhimento(listHist);

        rs = Util.subResultSet(ProntuarioSuasScript.getSqlMedSocEduc(), params, conn);
        List<MedidaSocioEducativa> listMed = new ArrayList<>();
        while (rs.next()) {
          MedidaSocioEducativa med = new MedidaSocioEducativa();
          med.setOrdem(rs.getInt("ordem"));
          med.setNome(rs.getString("nome"));
          med.setMedidaSocioeducativa(rs.getString("medida_socioeducativa"));
          med.setProcesso(rs.getString("processo"));
          med.setDataInicio(rs.getDate("data_inicio"));
          med.setDataFinal(rs.getDate("data_final"));
          med.setAtendidoCreas(rs.getBoolean("atendido_creas"));
          listMed.add(med);
        }
        pront.setMedidaSocioEducativa(listMed);

        rs = Util.subResultSet(ProntuarioSuasScript.getSqlMedSocEducObs(), params, conn);
        obs = new ArrayList<>();
        while (rs.next()) {
          Observacao obsMed = new Observacao();

          obsMed.setData(rs.getDate("data"));
          obsMed.setObservacao(rs.getString("observacao"));
          obsMed.setResponsavel(rs.getString("responsavel"));

          obs.add(obsMed);

        }
        pront.setObsMedSocEduc(obs);

        rs = Util.subResultSet(ProntuarioSuasScript.getSqlHistAcolObs(), params, conn);
        obs = new ArrayList<>();
        while (rs.next()) {
          Observacao obsHist = new Observacao();

          obsHist.setData(rs.getDate("data"));
          obsHist.setObservacao(rs.getString("observacao"));
          obsHist.setResponsavel(rs.getString("responsavel"));

          obs.add(obsHist);

        }
        pront.setObsHistAlcoolismo(obs);

        rs = Util.subResultSet(ProntuarioSuasScript.getSqlViolacaoObs(), params, conn);
        obs = new ArrayList<>();
        while (rs.next()) {
          Observacao obsViol = new Observacao();

          obsViol.setData(rs.getDate("data"));
          obsViol.setObservacao(rs.getString("observacao"));
          obsViol.setResponsavel(rs.getString("responsavel"));

          obs.add(obsViol);

        }
        pront.setObsViolacao(obs);

      }
    }

    data.add(pront);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Relatório Prontuário SUAS";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterProntuarioSuas(filter));
    creator.gerarPdf();

  }

  @Override
  public void beneficiosPorAtendente(BeneficiosPorAtendenteFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToTimeStamp(filter.getDtFinal()));
    params.put("usrLogado", filter.getUsrLogado());
    if (filter.getUniCodigo() != null) {
      params.put("unidade", filter.getUniCodigo());
    }
    if (filter.getProfissional() != null) {
      params.put("profissional", filter.getProfissional());
    }
    if (filter.getBeneficio() != null) {
      params.put("beneficio", filter.getBeneficio());
    }
    rs = Util.resolveResultSet(BeneficiosPorAtendenteScript.getSql(filter), params);
    List<BeneficiosPorAtendente> data = new ArrayList<>();

    while (rs.next()) {
      BeneficiosPorAtendente ben = new BeneficiosPorAtendente();
      ben.setDataCadastro(rs.getDate("data_cadastro"));
      ben.setDataEntrega(rs.getDate("data_entrega"));
      ben.setUnidade(rs.getString("unidade"));
      ben.setProfissional(rs.getString("atendente"));
      ben.setCidadao(rs.getString("beneficiario"));
      ben.setBeneficio(rs.getString("beneficio"));
      ben.setConcedido(rs.getString("concedido"));
      ben.setQuantidade(rs.getInt("quantidade"));
      ben.setEstabelecimento(rs.getString("estabelecimento"));

      data.add(ben);
    }
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Relatório de Benefícios por Atendente";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterBeneficiosPorAtendente(filter));
    creator.gerarPdf();

  }

  @Override
  public void cidadaosCadastrados(CidadaosCadastradosFilter filter) throws Exception {
    params.put("uniCodigo", filter.getUniCodigo());

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

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

    if (filter.getDtFinal() != null) {
      params.put("dtFinal", filter.getDtFinal());
    }

    if (filter.getCidadao() != null) {
      params.put("cidadao", filter.getCidadao());
    }

    rs = Util.resolveResultSet(CidadaosCadastradosScript.getSqlCidadaosCadastrados(filter), params);
    List<CidadaosCadastrados> data = new ArrayList<>();
    while (rs.next()) {
      CidadaosCadastrados cidadaos = new CidadaosCadastrados();
      cidadaos.setCidadao(rs.getString("usuNome"));
      cidadaos.setDataCadastro(rs.getDate("dataCadastro"));
      cidadaos.setUnidade(rs.getString("nomeUnidade"));
      cidadaos.setProfissional(rs.getString("nomeProfissional"));
      data.add(cidadaos);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();

    String titulo = "Cidadãos Cadastrados";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro(FormatFilters.filterCidadaosCadastrados(filter));
    creator.gerarPdf();
  }

  @Override
  public void atividadeColetivaProfissional(AtividadeColetivaProfissionalFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToTimeStamp(filter.getDtFinal()));
    params.put("unidade", filter.getUniCodigo());

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

    if (filter.getAtivo() != null) {
      params.put("ativo", filter.getAtivo());
    }

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

    while (rs.next()) {
      AtividadeColetivaProfissional atv = new AtividadeColetivaProfissional();
      atv.setUnidade(rs.getString("unidade"));
      atv.setGrupo(rs.getString("grupo"));
      atv.setProfissional(rs.getString("profissional"));
      atv.setEncontro(rs.getString("encontro"));
      atv.setDataEncontro(rs.getDate("dt_encontro"));
      atv.setHoraInicio(rs.getTimestamp("hr_inicial"));
      atv.setHoraFinal(rs.getTimestamp("hr_final"));
      atv.setQtdeParticipantes(rs.getInt("qtd_participantes"));

      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        atv.setCidadao(rs.getString("cidadao"));
        atv.setDtNascimento(rs.getDate("dt_nasc"));
        atv.setNis(rs.getString("nis"));
      }

      data.add(atv);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório Atividade Coletiva por Profissional";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAtividadeColetivaProfissional(filter));
    creator.gerarPdf();
  }

  @Override
  public void atendimentoBasico(AtendimentoBasicoFilter filter) throws Exception {
    params.put("dtInicial", Util.dateToTimeStamp(filter.getDtInicial()));
    params.put("dtFinal", Util.dateToTimeStamp(filter.getDtFinal()));
    params.put("unidade", filter.getUniCodigo());

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

    if (filter.getMotivo() != null) {
      params.put("motivo", filter.getMotivo());
    }

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

    while (rs.next()) {
      AtendimentoBasico atb = new AtendimentoBasico();
      atb.setUnidade(rs.getString("unidade"));
      atb.setMotivo(rs.getString("motivo"));
      atb.setTipoAtendimento(rs.getString("tipo_atendimento"));

      if (filter.getTpRel().equals(TipoRelEnum.ANALITICO)) {
        atb.setProfissional(rs.getString("profissional"));
        atb.setData(rs.getDate("data"));
        atb.setCidadao(rs.getString("cidadao"));
      } else {
        atb.setQtdAtendimentos(rs.getInt("qtd_atendimentos"));
      }

      data.add(atb);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório de Atendimentos Básicos";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTpRel());
    creator.setFiltro(FormatFilters.filterAtendimentoBasico(filter));
    creator.gerarPdf();
  }

  @Override
  public void termoAdesaoFamiliaAcolhedora(TermoAdesaoFamiliaAcolhedoraFilter filter) throws Exception {
    params.put("aspsaiCodigo", filter.getAspsaiCodigo());
    rs = Util.resolveResultSet(FamiliaAcolhedoraScript.getSqlFamiliaAcolhedoraAdesao(), params);
    List<TermoAdesao> data = new ArrayList<>();
    String titulo = "TERMO DE ADESÃO DE ACOLHIMENTO FAMILIAR";
    if (rs.next()) {
      TermoAdesao termoAdesao = new TermoAdesao();
      termoAdesao.setMunicipio(rs.getString("municipio"));
      termoAdesao.setLegislacao(rs.getString("legislacao"));
      termoAdesao.setResponsavelPrincipal(rs.getString("responsavelPrincipal"));
      termoAdesao.setRgPrincipal(rs.getString("rgPrincipal"));
      termoAdesao.setResponsavelSecundario(rs.getString("responsavelSecundario"));
      termoAdesao.setRgSecundario(rs.getString("rgSecundario"));
      termoAdesao.setRgSiglaPrincipal(rs.getString("rgSiglaPrincipal"));
      termoAdesao.setRgSiglaSecundario(rs.getString("rgSiglaSecundario"));
      data.add(termoAdesao);
    }
    rs.close();
    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override
  public void desligamentoFamiliaAcolhedora(DesligamentoFamiliaAcolhedoraFilter filter) throws Exception {
    params.put("aspsaiCodigo", filter.getAspsaiCodigo());

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

    while (rs.next()) {
      DesligamentoFamiliaAcolhedora dfa = new DesligamentoFamiliaAcolhedora();

      dfa.setResponsavelPrincipal(rs.getString("responsavelPrincipal"));
      dfa.setRgPrincipal(rs.getString("rgPrincipal"));
      dfa.setNascPrincipal(Util.formatDateBR(rs.getDate("nascPrincipal")));
      dfa.setLogradouro(rs.getString("logradouro"));
      dfa.setRua(rs.getString("rua"));
      dfa.setNumero(rs.getString("numero"));
      dfa.setBairro(rs.getString("bairro"));
      dfa.setCidade(rs.getString("cidade"));
      dfa.setUf(rs.getString("uf"));
      dfa.setResponsavelSecundario(rs.getString("responsavelSecundario"));
      dfa.setRgSecundario(rs.getString("rgSecundario"));
      dfa.setMotivo(rs.getString("motivo"));
      dfa.setDataDaImpressao(Util.formatDateBR(new Date()));
      dfa.setDataDesligamento(Util.formatDateBR(rs.getDate("dataDesligamento")));

      Date nascSecundario = rs.getDate("nascSecundario");
      if (nascSecundario != null) {
        dfa.setNascSecundario(Util.formatDateBR(nascSecundario));
      }

      data.add(dfa);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Termo de Desligamento";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override
  public void termoAcolhimentoFamiliaAcolhedora(TermoAcolhimentoFamiliaAcolhedoraFilter filter) throws Exception {

    params.put("aspsaiCodigo", filter.getAspsaiCodigo());

    rs = Util.resolveResultSet(FamiliaAcolhedoraScript.getSqlTermoAdesao(filter), params);
    List<TermoAcolhimento> data = new ArrayList<>();
    Map<String, Object> paramsEndereco = new HashMap<>();

    while (rs.next()) {
      TermoAcolhimento termoAcolhimento = new TermoAcolhimento();

      termoAcolhimento.setAuto(rs.getString("auto"));

      StringBuilder sb = new StringBuilder();
      sb.append("Pelo presente fica formalizado, conforme decisão de vossa excelência expressa no mov. ");
      sb.append(naoInformadoWhenNull(rs.getString("numero_movimento"))); // Número movimento
      sb.append(" o acolhimento de ").append(rs.getString("nome")); //Nome Acolhido
      sb.append(", nascido(a) em ")
        .append(Util.formatDateBR(rs.getDate("data_nascimento"))); // Data Nascimento Acolhido
      sb.append(", junto a Família Acolhedora ");

      ResultSet rsResponsavel = buscarDadosResponsavelFamiliaAcolhedora(rs.getInt("responsavel_principal"));
      if (rsResponsavel.next()) {
        termoAcolhimento.setResponsavelPrincipal(rsResponsavel.getString("usu_nome"));
        paramsEndereco.put("domCodigo", rsResponsavel.getInt("dom_codigo"));

        sb.append(rsResponsavel.getString("usu_nome")); //Nome Responsável Principal
        sb.append(", RG: ").append(naoInformadoWhenNull(rsResponsavel.getString("usu_rg")));
        if (rsResponsavel.getString("usu_rg") != null) {
          sb.append("/").append(vazioWhenNull(rsResponsavel.getString("usu_rg_emissor"))); // RG e Órgão Expeditor
        }
        sb.append(", CPF: ").append(naoInformadoWhenNull(rsResponsavel.getString("usu_cpf"))); // CPF
        sb.append(", brasileiro(a)");
        if (rsResponsavel.getString("no_ocupacao") != null) {
          sb.append(", ").append(vazioWhenNull(rsResponsavel.getString("no_ocupacao"))); // Profissão
        }
      }
      rsResponsavel.close();

      if (rs.getInt("responsavel_secundario") != 0
        && rs.getInt("parentesco") == 2) { //Verifica se existe um responsável secundário e se é conjuge
        ResultSet rsResponsavelSecundario = buscarDadosResponsavelFamiliaAcolhedora(
          rs.getInt("responsavel_secundario"));
        if (rsResponsavelSecundario.next()) {
          termoAcolhimento.setResponsavelSecundario(rsResponsavelSecundario.getString("usu_nome"));
          sb.append(", casado(a) com ");
          sb.append(rsResponsavelSecundario.getString("usu_nome")); //Nome Responsável Principal
          sb.append(", RG: ").append(naoInformadoWhenNull(rsResponsavelSecundario.getString("usu_rg")));
          if (rsResponsavelSecundario.getString("usu_rg") != null) {
            sb.append("/")
              .append(vazioWhenNull(rsResponsavelSecundario.getString("usu_rg_emissor"))); // RG e Órgão Expeditor
          }
          sb.append(", CPF: ").append(naoInformadoWhenNull(rsResponsavelSecundario.getString("usu_cpf"))); // CPF
          sb.append(", brasileiro(a)");
          if (rsResponsavelSecundario.getString("no_ocupacao") != null) {
            sb.append(", ").append(rsResponsavelSecundario.getString("no_ocupacao")); // Profissão
          }
          sb.append(", residentes no(a) ");
        }
        rsResponsavelSecundario.close();
      } else {
        sb.append(", residente no(a) ");
      }

      ResultSet rsEndereco = Util.resolveResultSet(FamiliaAcolhedoraScript.getDadosEndereco(), paramsEndereco);
      if (rsEndereco.next()) {
        sb.append(rsEndereco.getString("tipo_logradouro")).append(" ");
        sb.append(rsEndereco.getString("rua")); // Endereço
        sb.append(", Nº ").append(rsEndereco.getString("numero")); // Número
        sb.append(", ").append(rsEndereco.getString("bairro")); // Bairro
        sb.append(", CEP: ").append(rsEndereco.getString("cep")); // CEP
        sb.append(", no município de ").append(rsEndereco.getString("cidade")).append("/")
          .append(rsEndereco.getString("sigla"));
      }
      rsEndereco.close();

      termoAcolhimento.setDescricaoTermo(sb.toString());

      termoAcolhimento.setDataImpressao(Util.getDataPorExtenso(new Date()));
      termoAcolhimento.setDocumentos(Objects.toString(rs.getString("documentos"), "Não houve entrega de documentos"));

      ResultSet resultSetCidade = Util.resolveResultSet(FamiliaAcolhedoraScript.getNomeCidade(), new HashMap<>());
      if (resultSetCidade.next()) {
        termoAcolhimento.setCidade(resultSetCidade.getString("nome_cidade"));
      }
      resultSetCidade.close();

      Map<String, Object> paramsProfissionais = new HashMap<>();
      paramsProfissionais.put("aspshaCodigo", rs.getInt("aspsha_codigo"));
      ResultSet resultSetProfissionais = Util
        .resolveResultSet(FamiliaAcolhedoraScript.getDadosProfissionais(), paramsProfissionais);
      if (resultSetProfissionais.next()) { // Profissional Principal
        ProfissionalFamiliaAcolhedora profissional = new ProfissionalFamiliaAcolhedora();
        profissional.setNome(resultSetProfissionais.getString("nome_principal"));
        profissional.setEspecialidade(resultSetProfissionais.getString("especialidade_principal").trim());
        profissional.setConselho(resultSetProfissionais.getString("conselho_principal"));
        profissional.setNumeroConselho(resultSetProfissionais.getString("numero_conselho_principal"));
        termoAcolhimento.setProfissional1(profissional);

        ProfissionalFamiliaAcolhedora profissional2 = new ProfissionalFamiliaAcolhedora();
        profissional2.setNome(resultSetProfissionais.getString("nome_secundario"));
        profissional2.setEspecialidade(resultSetProfissionais.getString("especialidade_secundario").trim());
        profissional2.setConselho(resultSetProfissionais.getString("conselho_secundario"));
        profissional2.setNumeroConselho(resultSetProfissionais.getString("numero_conselho_secundario"));
        termoAcolhimento.setProfissional2(profissional2);
      }
      resultSetProfissionais.close();

      data.add(termoAcolhimento);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Termo de Acolhimento";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  private ResultSet buscarDadosResponsavelFamiliaAcolhedora(Integer codResponsavel) throws SQLException {
    Map<String, Object> paramsSql = new HashMap<>();
    paramsSql.put("usuCodigo", codResponsavel);
    return Util.resolveResultSet(FamiliaAcolhedoraScript.getDadosResponsavel(), paramsSql);
  }

  @Override
  public void declaracao(DeclaracaoFilter filter) throws Exception {
    params.put("asdCodigo", filter.getAsdCodigo());

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

    while (rs.next()) {
      Declaracao declaracao = new Declaracao();

      declaracao.setUnidade(rs.getString("unidade"));
      declaracao.setCidadao(rs.getString("cidadao"));
      declaracao.setProfissionalPrincipal(rs.getString("profissionalPrincipal"));
      declaracao.setProfissionalSecundario(rs.getString("profissionalSecundario"));
      declaracao.setDataDeclaracao(Util.formatDateBR(rs.getDate("dataDeclaracao")));
      declaracao.setFinalidade(formatarFinalidade(rs.getString("finalidade"), rs.getString("tipoDeclaracao")));
      declaracao.setMotivo(rs.getString("motivo"));
      declaracao.setPeriodo(rs.getString("periodo"));
      declaracao.setCidade(rs.getString("cidade"));
      declaracao.setEspecialidadePrincipal(rs.getString("especialidadePrincipal"));
      declaracao.setEspecialidadeSecundario(rs.getString("especialidadeSecundario"));
      declaracao.setNumConselhoPrincipal(rs.getString("numConselhoPrincipal"));
      declaracao.setNumConselhoSecundario(rs.getString("numConselhoSecundario"));
      declaracao.setConselhoPrincipal(rs.getString("conselhoPrincipal"));
      declaracao.setConselhoSecundario(rs.getString("conselhoSecundario"));
      declaracao.setDataDaImpressao(Util.formatDateBR(new Date()));

      data.add(declaracao);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Declaração";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  private String formatarFinalidade(String finalidade, String tipoDeclaracao) {
    final String CODIGO_COMPARECIMENTO = "C";
    final String EMPTY_STRING = "";

    if (CODIGO_COMPARECIMENTO.equals(finalidade)) {
      return "compareceu";
    }

    if (!EMPTY_STRING.equals(tipoDeclaracao) && tipoDeclaracao != null) {
      return tipoDeclaracao;
    }

    return null;
  }

  @Override
  public void atendimentoMensalCentroPop(AtendimentoMensalCentroPopFilter filter) throws Exception {
    params.put("uniCodigo", filter.getUniCodigo());
    params.put("ano", filter.getAno());
    params.put("mes", filter.getMes());

    List<AtendimentoMensalCentroPop> data = new ArrayList<>();
    AtendimentoMensalCentroPop atendimentoMensalCentroPop = new AtendimentoMensalCentroPop();

    setHeaderAtendimentoMensalCentroPop(atendimentoMensalCentroPop, filter);
    setBloco1AtendimentoMensalCentroPop(atendimentoMensalCentroPop);

    ResultSet naoRealizaOfertaServicoRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlNaoRealizaOfertaServico(), params);
    naoRealizaOfertaServicoRs.next();
    atendimentoMensalCentroPop
      .setNaoRealizaOfertaServico(naoRealizaOfertaServicoRs.getString("naoRealizaOfertaServico").equals("S"));

    if (naoRealizaOfertaServicoRs.getString("naoRealizaOfertaServico").equals("S")) {
      setBloco2AtendimentoMensalCentroPop(atendimentoMensalCentroPop);
    }
    naoRealizaOfertaServicoRs.close();

    data.add(atendimentoMensalCentroPop);

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Relatório Mensal do Centro Pop";

    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro(FormatFilters.filterAtendimentoMensalCentroPop(filter));
    creator.gerarPdf();
  }

  private void setHeaderAtendimentoMensalCentroPop(AtendimentoMensalCentroPop atendimentoMensalCentroPop,
    AtendimentoMensalCentroPopFilter filter) throws Exception {
    ResultSet headerDadosRs = Util.resolveResultSet(AtendimentoMensalCentroPopScript.getSqlHeader(), params);
    headerDadosRs.next();
    atendimentoMensalCentroPop.setMes(filter.getMes().toString());

    atendimentoMensalCentroPop.setUnidade(headerDadosRs.getString("unidade"));

    String numeroUnidade = headerDadosRs.getString("numeroUnidade").equals("") ?
      "S/N" :
      headerDadosRs.getString("numeroUnidade");
    atendimentoMensalCentroPop.setNumeroUnidade(numeroUnidade);

    String enderecoUnidade = headerDadosRs.getString("uni_endereco") +
      (headerDadosRs.getString("uni_numero").equals("") ? ", S/N" : ", " + headerDadosRs.getString("uni_numero")) +
      (headerDadosRs.getString("uni_asbairro").equals("") ? "" : ", " + headerDadosRs.getString("uni_asbairro"));
    atendimentoMensalCentroPop.setEnderecoUnidade(enderecoUnidade);
    headerDadosRs.close();

    ResultSet headerCidadeRs = Util.resolveResultSet(AtendimentoMensalCentroPopScript.getSqlCidadeUnidade(), params);
    headerCidadeRs.next();
    atendimentoMensalCentroPop.setNomeCidade(headerCidadeRs.getString("nome_cidade"));
    headerCidadeRs.close();

    ResultSet headerUfRs = Util.resolveResultSet(AtendimentoMensalCentroPopScript.getSqlUfUnidade(), params);
    headerUfRs.next();
    atendimentoMensalCentroPop.setUfUnidade(headerUfRs.getString("uf_sigla"));
    headerUfRs.close();
  }

  private void setBloco1AtendimentoMensalCentroPop(AtendimentoMensalCentroPop atendimentoMensalCentroPop)
    throws Exception {
    ResultSet a1TotalSituacaoRuaRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRua(), params);
    a1TotalSituacaoRuaRs.next();
    atendimentoMensalCentroPop.setA1TotalSituacaoRua(a1TotalSituacaoRuaRs.getString("a1TotalSituacaoRua"));
    a1TotalSituacaoRuaRs.close();

    ResultSet a1TotalSituacaoRuaMasc0A12Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaMasc0A12(), params);
    a1TotalSituacaoRuaMasc0A12Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaMasc0A12(a1TotalSituacaoRuaMasc0A12Rs.getString("a1TotalSituacaoRuaMasc0A12"));
    a1TotalSituacaoRuaMasc0A12Rs.close();

    ResultSet a1TotalSituacaoRuaMasc13A17Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaMasc13A17(), params);
    a1TotalSituacaoRuaMasc13A17Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaMasc13A17(a1TotalSituacaoRuaMasc13A17Rs.getString("a1TotalSituacaoRuaMasc13A17"));
    a1TotalSituacaoRuaMasc13A17Rs.close();

    ResultSet a1TotalSituacaoRuaMasc18A39Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaMasc18A39(), params);
    a1TotalSituacaoRuaMasc18A39Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaMasc18A39(a1TotalSituacaoRuaMasc18A39Rs.getString("a1TotalSituacaoRuaMasc18A39"));
    a1TotalSituacaoRuaMasc18A39Rs.close();

    ResultSet a1TotalSituacaoRuaMasc40A59Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaMasc40A59(), params);
    a1TotalSituacaoRuaMasc40A59Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaMasc40A59(a1TotalSituacaoRuaMasc40A59Rs.getString("a1TotalSituacaoRuaMasc40A59"));
    a1TotalSituacaoRuaMasc40A59Rs.close();

    ResultSet a1TotalSituacaoRuaMasc60OuMaisRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaMasc60OuMais(), params);
    a1TotalSituacaoRuaMasc60OuMaisRs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaMasc60OuMais(a1TotalSituacaoRuaMasc60OuMaisRs.getString("a1TotalSituacaoRuaMasc60OuMais"));
    a1TotalSituacaoRuaMasc60OuMaisRs.close();

    ResultSet a1TotalSituacaoRuaFem0A12Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaFem0A12(), params);
    a1TotalSituacaoRuaFem0A12Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaFem0A12(a1TotalSituacaoRuaFem0A12Rs.getString("a1TotalSituacaoRuaFem0A12"));
    a1TotalSituacaoRuaFem0A12Rs.close();

    ResultSet a1TotalSituacaoRuaFem13A17Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaFem13A17(), params);
    a1TotalSituacaoRuaFem13A17Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaFem13A17(a1TotalSituacaoRuaFem13A17Rs.getString("a1TotalSituacaoRuaFem13A17"));
    a1TotalSituacaoRuaFem13A17Rs.close();

    ResultSet a1TotalSituacaoRuaFem18A39Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaFem18A39(), params);
    a1TotalSituacaoRuaFem18A39Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaFem18A39(a1TotalSituacaoRuaFem18A39Rs.getString("a1TotalSituacaoRuaFem18A39"));
    a1TotalSituacaoRuaFem18A39Rs.close();

    ResultSet a1TotalSituacaoRuaFem40A59Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaFem40A59(), params);
    a1TotalSituacaoRuaFem40A59Rs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaFem40A59(a1TotalSituacaoRuaFem40A59Rs.getString("a1TotalSituacaoRuaFem40A59"));
    a1TotalSituacaoRuaFem40A59Rs.close();

    ResultSet a1TotalSituacaoRuaFem60OuMaisRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlA1TotalSituacaoRuaFem60OuMais(), params);
    a1TotalSituacaoRuaFem60OuMaisRs.next();
    atendimentoMensalCentroPop
      .setA1TotalSituacaoRuaFem60OuMais(a1TotalSituacaoRuaFem60OuMaisRs.getString("a1TotalSituacaoRuaFem60OuMais"));
    a1TotalSituacaoRuaFem60OuMaisRs.close();

    ResultSet b1TotalUsuariosCrackRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlB1TotalUsuariosCrack(), params);
    b1TotalUsuariosCrackRs.next();
    atendimentoMensalCentroPop.setB1TotalUsuariosCrack(b1TotalUsuariosCrackRs.getString("b1TotalUsuariosCrack"));
    b1TotalUsuariosCrackRs.close();

    ResultSet b2TotalMigrantesRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlB2TotalMigrantes(), params);
    b2TotalMigrantesRs.next();
    atendimentoMensalCentroPop.setB2TotalMigrantes(b2TotalMigrantesRs.getString("b2TotalMigrantes"));
    b2TotalMigrantesRs.close();

    ResultSet b3TotalTranstornoMentalRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlB3TotalTranstornoMental(), params);
    b3TotalTranstornoMentalRs.next();
    atendimentoMensalCentroPop
      .setB3TotalTranstornoMental(b3TotalTranstornoMentalRs.getString("b3TotalTranstornoMental"));
    b3TotalTranstornoMentalRs.close();

    ResultSet c1TotalIncluidosCadUnicoRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlC1TotalIncluidosCadUnico(), params);
    c1TotalIncluidosCadUnicoRs.next();
    atendimentoMensalCentroPop
      .setC1TotalIncluidosCadUnico(c1TotalIncluidosCadUnicoRs.getString("c1TotalIncluidosCadUnico"));
    c1TotalIncluidosCadUnicoRs.close();

    ResultSet c2TotalAtualizadosCadUnicoRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlC2TotalAtualizadosCadUnico(), params);
    c2TotalAtualizadosCadUnicoRs.next();
    atendimentoMensalCentroPop
      .setC2TotalAtualizadosCadUnico(c2TotalAtualizadosCadUnicoRs.getString("c2TotalAtualizadosCadUnico"));
    c2TotalAtualizadosCadUnicoRs.close();

    ResultSet d1TotalAtendimentosRealizadosRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlD1TotalAtendimentosRealizados(), params);
    d1TotalAtendimentosRealizadosRs.next();
    atendimentoMensalCentroPop
      .setD1TotalAtendimentosRealizados(d1TotalAtendimentosRealizadosRs.getString("d1TotalAtendimentosRealizados"));
    d1TotalAtendimentosRealizadosRs.close();
  }

  private void setBloco2AtendimentoMensalCentroPop(AtendimentoMensalCentroPop atendimentoMensalCentroPop)
    throws Exception {
    ResultSet e1TotalAbordagemSocialRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocial(), params);
    e1TotalAbordagemSocialRs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocial(e1TotalAbordagemSocialRs.getString("e1TotalAbordagemSocial"));
    e1TotalAbordagemSocialRs.close();

    ResultSet e1TotalAbordagemSocialMasc0A12Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialMasc0A12(), params);
    e1TotalAbordagemSocialMasc0A12Rs.next();
    atendimentoMensalCentroPop
      .setE1TotalAbordagemSocialMasc0A12(e1TotalAbordagemSocialMasc0A12Rs.getString("e1TotalAbordagemSocialMasc0A12"));
    e1TotalAbordagemSocialMasc0A12Rs.close();

    ResultSet e1TotalAbordagemSocialMasc13A17Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialMasc13A17(), params);
    e1TotalAbordagemSocialMasc13A17Rs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocialMasc13A17(
      e1TotalAbordagemSocialMasc13A17Rs.getString("e1TotalAbordagemSocialMasc13A17"));
    e1TotalAbordagemSocialMasc13A17Rs.close();

    ResultSet e1TotalAbordagemSocialMasc18A39Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialMasc18A39(), params);
    e1TotalAbordagemSocialMasc18A39Rs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocialMasc18A39(
      e1TotalAbordagemSocialMasc18A39Rs.getString("e1TotalAbordagemSocialMasc18A39"));
    e1TotalAbordagemSocialMasc18A39Rs.close();

    ResultSet e1TotalAbordagemSocialMasc40A59Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialMasc40A59(), params);
    e1TotalAbordagemSocialMasc40A59Rs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocialMasc40A59(
      e1TotalAbordagemSocialMasc40A59Rs.getString("e1TotalAbordagemSocialMasc40A59"));
    e1TotalAbordagemSocialMasc40A59Rs.close();

    ResultSet e1TotalAbordagemSocialMasc60OuMaisRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialMasc60OuMais(), params);
    e1TotalAbordagemSocialMasc60OuMaisRs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocialMasc60OuMais(
      e1TotalAbordagemSocialMasc60OuMaisRs.getString("e1TotalAbordagemSocialMasc60OuMais"));
    e1TotalAbordagemSocialMasc60OuMaisRs.close();

    ResultSet e1TotalAbordagemSocialFem0A12Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialFem0A12(), params);
    e1TotalAbordagemSocialFem0A12Rs.next();
    atendimentoMensalCentroPop
      .setE1TotalAbordagemSocialFem0A12(e1TotalAbordagemSocialFem0A12Rs.getString("e1TotalAbordagemSocialFem0A12"));
    e1TotalAbordagemSocialFem0A12Rs.close();

    ResultSet e1TotalAbordagemSocialFem13A17Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialFem13A17(), params);
    e1TotalAbordagemSocialFem13A17Rs.next();
    atendimentoMensalCentroPop
      .setE1TotalAbordagemSocialFem13A17(e1TotalAbordagemSocialFem13A17Rs.getString("e1TotalAbordagemSocialFem13A17"));
    e1TotalAbordagemSocialFem13A17Rs.close();

    ResultSet e1TotalAbordagemSocialFem18A39Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialFem18A39(), params);
    e1TotalAbordagemSocialFem18A39Rs.next();
    atendimentoMensalCentroPop
      .setE1TotalAbordagemSocialFem18A39(e1TotalAbordagemSocialFem18A39Rs.getString("e1TotalAbordagemSocialFem18A39"));
    e1TotalAbordagemSocialFem18A39Rs.close();

    ResultSet e1TotalAbordagemSocialFem40A59Rs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialFem40A59(), params);
    e1TotalAbordagemSocialFem40A59Rs.next();
    atendimentoMensalCentroPop
      .setE1TotalAbordagemSocialFem40A59(e1TotalAbordagemSocialFem40A59Rs.getString("e1TotalAbordagemSocialFem40A59"));
    e1TotalAbordagemSocialFem40A59Rs.close();

    ResultSet e1TotalAbordagemSocialFem60OuMaisRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE1TotalAbordagemSocialFem60OuMais(), params);
    e1TotalAbordagemSocialFem60OuMaisRs.next();
    atendimentoMensalCentroPop.setE1TotalAbordagemSocialFem60OuMais(
      e1TotalAbordagemSocialFem60OuMaisRs.getString("e1TotalAbordagemSocialFem60OuMais"));
    e1TotalAbordagemSocialFem60OuMaisRs.close();

    ResultSet e2TotalCriancasAdolescentesTrabFnfantilRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE2TotalCriancasAdolescentesTrabFnfantil(), params);
    e2TotalCriancasAdolescentesTrabFnfantilRs.next();
    atendimentoMensalCentroPop.setE2TotalCriancasAdolescentesTrabFnfantil(
      e2TotalCriancasAdolescentesTrabFnfantilRs.getString("e2TotalCriancasAdolescentesTrabFnfantil"));
    e2TotalCriancasAdolescentesTrabFnfantilRs.close();

    ResultSet e3TotalCriancasAdolescentesExplorSexualRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE3TotalCriancasAdolescentesExplorSexual(), params);
    e3TotalCriancasAdolescentesExplorSexualRs.next();
    atendimentoMensalCentroPop.setE3TotalCriancasAdolescentesExplorSexual(
      e3TotalCriancasAdolescentesExplorSexualRs.getString("e3TotalCriancasAdolescentesExplorSexual"));
    e3TotalCriancasAdolescentesExplorSexualRs.close();

    ResultSet e4TotalCriancasAdolescentesUsuarioCrackRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE4TotalCriancasAdolescentesUsuarioCrack(), params);
    e4TotalCriancasAdolescentesUsuarioCrackRs.next();
    atendimentoMensalCentroPop.setE4TotalCriancasAdolescentesUsuarioCrack(
      e4TotalCriancasAdolescentesUsuarioCrackRs.getString("e4TotalCriancasAdolescentesUsuarioCrack"));
    e4TotalCriancasAdolescentesUsuarioCrackRs.close();

    ResultSet e5TotalAdultosUsuarioCrackRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE5TotalAdultosUsuarioCrack(), params);
    e5TotalAdultosUsuarioCrackRs.next();
    atendimentoMensalCentroPop
      .setE5TotalAdultosUsuarioCrack(e5TotalAdultosUsuarioCrackRs.getString("e5TotalAdultosUsuarioCrack"));
    e5TotalAdultosUsuarioCrackRs.close();

    ResultSet e6TotalMigrantesRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlE6TotalMigrantes(), params);
    e6TotalMigrantesRs.next();
    atendimentoMensalCentroPop.setE6TotalMigrantes(e6TotalMigrantesRs.getString("e6TotalMigrantes"));
    e6TotalMigrantesRs.close();

    ResultSet f1TotalAbordagensRealizadasRs = Util
      .resolveResultSet(AtendimentoMensalCentroPopScript.getSqlF1TotalAbordagensRealizadas(), params);
    f1TotalAbordagensRealizadasRs.next();
    atendimentoMensalCentroPop
      .setF1TotalAbordagensRealizadas(f1TotalAbordagensRealizadasRs.getString("f1TotalAbordagensRealizadas"));
    f1TotalAbordagensRealizadasRs.close();
  }

  @Override
  public void reciboBolsaAuxilio(ReciboBolsaAuxilioFilter filter) throws Exception {
    params.put("asbdCodigo", filter.getAsbdCodigo());

    rs = Util.resolveResultSet(ReciboBolsaAuxilioScript.getSql(), params);
    List<ReciboBolsaAuxilio> data = new ArrayList<>();

    while (rs.next()) {
      ReciboBolsaAuxilio reciboBolsaAuxilio = new ReciboBolsaAuxilio();

      Double quantia = rs.getInt("qtd") * rs.getDouble("valor");

      reciboBolsaAuxilio.setCpf(rs.getString("cpf"));
      reciboBolsaAuxilio.setLei(rs.getString("lei"));
      reciboBolsaAuxilio.setNome(rs.getString("nome"));
      reciboBolsaAuxilio.setQuantia(quantia.toString());
      reciboBolsaAuxilio.setReferencia(rs.getString("referencia"));
      reciboBolsaAuxilio.setDataConsessaoBeneficio(Util.formatDateBR(rs.getDate("dataConcessaoBeneficio")));
      reciboBolsaAuxilio.setQuantiaExtenso(new Extenso(quantia).toString());
      reciboBolsaAuxilio.setBeneficio(rs.getString("beneficio"));

      data.add(reciboBolsaAuxilio);
    }

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Recibo de Bolsa Auxílio";

    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

  @Override public void planoIndividualAtendimento(PlanoIdividualAtendimentoFilter filter) throws Exception {
    params.put("aspshaCodigo", filter.getAspshaCodigo());
    conn = ConnectionUtil.getConnection();

    rs = Util.resolveResultSet(PlanoIndividualAtendimentoScript.getSql(), params);
    List<PlanoIndividualAtendimento> data = new ArrayList<>();

    if (rs.next()) {
      PlanoIndividualAtendimento pia = new PlanoIndividualAtendimento();
      Map<String, Object> paramsOutroAcolhimento = new HashMap<>();
      paramsOutroAcolhimento.put("aspshaCodigo", filter.getAspshaCodigo());
      paramsOutroAcolhimento.put("usuCodigo", rs.getInt("usuCodigo"));
      params.put("aspsCodigo", rs.getInt("aspsCodigo"));
      params.put("usuCodigo", rs.getInt("usuCodigo"));
      pia.setJaAcolhido(false);
      pia.setAcolhidoOutroServico(false);
      ResultSet rsOutroAcolhimento =
        Util.subResultSet(
          PlanoIndividualAtendimentoScript.verificaOutroAcolhimento(),
          paramsOutroAcolhimento,
          conn);
      if (rsOutroAcolhimento.next()) {
        pia.setAcolhidoOutroServico(true);
        pia.setInicioOutroServico(rsOutroAcolhimento.getDate("inicioOutroServico"));
        pia.setFimOutroServico(rsOutroAcolhimento.getDate("fimOutroServico"));
      }
      rsOutroAcolhimento.close();

      ResultSet rsOutraFamilia =
        Util.subResultSet(
          PlanoIndividualAtendimentoScript.verificaOutraFamiliaAcolhedora(),
          params,
          conn);
      if (rsOutraFamilia.next()) {
        pia.setJaAcolhido(true);
      }
      rsOutraFamilia.close();

      pia.setDataAcolhimento(rs.getDate("dataAcolhimento"));
      pia.setAuto(rs.getString("auto"));
      pia.setResponsavelAcolhimento(rs.getString("responsavelAcolhimento"));
      pia.setMotivoAcolhimento(rs.getString("motivoAcolhimento"));
      pia.setOrigemAcolhimento(rs.getString("origemAcolhimento"));
      pia.setParecer(rs.getString("parecer"));
      pia.setSaude(rs.getString("saude"));
      pia.setEducacao(rs.getString("educacao"));
      pia.setNomeAcolhido(rs.getString("nomeAcolhido"));
      pia.setSexo(rs.getString("sexo"));
      pia.setIdade(rs.getInt("idade"));
      pia.setRaca(rs.getString("raca"));
      pia.setRg(rs.getString("rg"));
      pia.setCpf(rs.getString("cpf"));
      pia.setDataEmissao(rs.getDate("dataEmissao"));
      pia.setNaturalidade(rs.getString("naturalidade"));
      pia.setSocializacao(rs.getString("socializacao"));
      pia.setDataNascimento(rs.getDate("dataNascimento"));
      pia.setDocumentacao(rs.getString("documentacao"));
      pia.setFamiliaAcolhedora(rs.getString("familiaAcolhedora"));
      pia.setFamiliaNatural(rs.getString("familiaNatural"));
      pia.setFamiliaExtensa(rs.getString("familiaExtensa"));
      pia.setPsicologia(rs.getString("psicologia"));
      pia.setServicoSocial(rs.getString("servicoSocial"));
      pia.setInstituicaoReligiosa(rs.getString("instituicaoReligiosa"));
      pia.setAtividades(rs.getString("atividades"));
      pia.setRedeRelacionamento(rs.getString("redeRelacionamento"));
      pia.setObsTrabalho(rs.getString("obsTrabalho"));
      pia.setRenda(rs.getFloat("renda"));
      pia.setSerie(rs.getString("serie"));
      pia.setDataInicioEmpresa(rs.getDate("dataInicioEmpresa"));
      pia.setOcupacao(rs.getString("ocupacao"));
      pia.setEmpresa(rs.getString("empresa"));
      pia.setEscola(rs.getString("escola"));
      pia.setPeso(rs.getFloat("peso"));
      pia.setAltura(rs.getFloat("altura"));
      pia.setTipoSanguineo(rs.getString("tipoSanguineo"));
      pia.setFatorRh(rs.getString("fatorRh"));
      pia.setCondicoesChegada(rs.getString("condicoesChegada"));
      pia.setProblemaSaude(rs.getString("problemaSaude"));
      pia.setFazTratamento(rs.getString("fazTratamento"));
      pia.setDescricaoTratamento(rs.getString("descricaoTratamento"));
      pia.setUsaMedicamento(rs.getString("usaMedicamento"));
      pia.setDescricaoMedicamento(rs.getString("descricaoMedicamento"));
      pia.setUsaDroga(rs.getBoolean("usaDroga"));
      pia.setDescricaoDroga(rs.getString("descricaoDroga"));
      pia.setServicosBeneficios(rs.getString("servicosBeneficios"));
      pia.setHistoricoVida(rs.getString("historicoVida"));

      ResultSet resultSetMedidasSocioEducativas = Util
        .subResultSet(PlanoIndividualAtendimentoScript.getSqlMedSocEduc(), params, conn);
      List<MedidaSocioEducativa> medidaSocioEducativaList = new ArrayList<>();
      while (resultSetMedidasSocioEducativas.next()) {
        MedidaSocioEducativa medidaSocioEducativa = new MedidaSocioEducativa();
        medidaSocioEducativa.setMedidaSocioeducativa(
          resultSetMedidasSocioEducativas.getString("medida_socioeducativa"));
        medidaSocioEducativa.setProcesso(resultSetMedidasSocioEducativas.getString("processo"));
        medidaSocioEducativa.setDataInicio(resultSetMedidasSocioEducativas.getDate("data_inicio"));
        medidaSocioEducativa.setDataFinal(resultSetMedidasSocioEducativas.getDate("data_final"));
        medidaSocioEducativaList.add(medidaSocioEducativa);
      }
      pia.setMedidasSocioEducativas(medidaSocioEducativaList);
      resultSetMedidasSocioEducativas.close();

      ResultSet resultSetProfissionais = Util
        .subResultSet(FamiliaAcolhedoraScript.getDadosProfissionais(), params,conn);
      if (resultSetProfissionais.next()) { // Profissional Principal
        ProfissionalFamiliaAcolhedora profissional = new ProfissionalFamiliaAcolhedora();
        profissional.setNome(resultSetProfissionais.getString("nome_principal"));
        profissional.setEspecialidade(resultSetProfissionais.getString("especialidade_principal").trim());
        profissional.setConselho(resultSetProfissionais.getString("conselho_principal"));
        profissional.setNumeroConselho(resultSetProfissionais.getString("numero_conselho_principal"));
        pia.setProfissional1(profissional);

        ProfissionalFamiliaAcolhedora profissional2 = new ProfissionalFamiliaAcolhedora();
        profissional2.setNome(resultSetProfissionais.getString("nome_secundario"));
        profissional2.setEspecialidade(resultSetProfissionais.getString("especialidade_secundario").trim());
        profissional2.setConselho(resultSetProfissionais.getString("conselho_secundario"));
        profissional2.setNumeroConselho(resultSetProfissionais.getString("numero_conselho_secundario"));
        pia.setProfissional2(profissional2);
      }
      resultSetProfissionais.close();

      ResultSet rsAtend = Util.subResultSet(ProntuarioSuasScript.getSqlAtendimentoBasico(), params, conn);
      List<AtendimentoBasico> listAtend = new ArrayList<>();
      while (rsAtend.next()) {
        AtendimentoBasico atend = new AtendimentoBasico();
        atend.setData(rsAtend.getDate("data"));
        atend.setDescricao(rsAtend.getString("descricao"));
        atend.setParecer(rsAtend.getString("parecer"));
        atend.setParecerSocial(rsAtend.getString("parecer_social"));
        atend.setUnidade(rsAtend.getString("unidade"));
        atend.setProfissional(rsAtend.getString("profissional"));
        atend.setCidadao(rsAtend.getString("cidadao"));
        atend.setTipoAtendimento(rsAtend.getString("tipo"));

        listAtend.add(atend);
      }
      pia.setAtendimentosBasicos(listAtend);
      rsAtend.close();

      //Encaminhamentos
      ResultSet rsEnc = Util.subResultSet(ProntuarioSuasScript.getSqlEncaminhamento(), params, conn);
      List<Encaminhamento> listEnc = new ArrayList<>();
      while (rsEnc.next()) {
        Encaminhamento enc = new Encaminhamento();
        enc.setUnidade(rsEnc.getString("unidade"));
        enc.setProfissional(rsEnc.getString("profissional"));
        enc.setLocal(rsEnc.getString("local"));
        enc.setCidadao(rsEnc.getString("cidadao"));
        enc.setData(rsEnc.getDate("data"));

        listEnc.add(enc);

      }
      pia.setEncaminhamentos(listEnc);
      rsEnc.close();

      //Grupos
      ResultSet rsGrupo = Util.subResultSet(ProntuarioSuasScript.getSqlGrupos(), params, conn);
      List<AtendimentoColetivo> listGrupo = new ArrayList<>();
      while (rsGrupo.next()) {
        AtendimentoColetivo atend = new AtendimentoColetivo();
        atend.setUnidade(rsGrupo.getString("unidade"));
        atend.setGrupo(rsGrupo.getString("grupo"));
        atend.setAtivo(rsGrupo.getBoolean("ativo"));
        atend.setDataInsercao(rsGrupo.getDate("data"));
        atend.setCidadao(rsGrupo.getString("cidadao"));

        listGrupo.add(atend);
      }
      pia.setGrupos(listGrupo);
      rsGrupo.close();

      //Familia natural ou extensa
      ResultSet rsFamilia = Util.subResultSet(PlanoIndividualAtendimentoScript.getSqlFamiliaNaturalExtensa(),params,conn);
      List<PessoaFamiliaNaturalExtensa> familiaNatural = new ArrayList<>();
      List<PessoaFamiliaNaturalExtensa> familiaExtensa = new ArrayList<>();
      Integer pai = 12;
      Integer mae = 13;
      Integer irmao = 8;
      ArrayList<Integer> codigosFamiliaNatural = new ArrayList<>();
      codigosFamiliaNatural.add(pai);
      codigosFamiliaNatural.add(mae);
      codigosFamiliaNatural.add(irmao);
      while(rsFamilia.next()){
        PessoaFamiliaNaturalExtensa pessoa = new PessoaFamiliaNaturalExtensa();
        pessoa.setNome(rsFamilia.getString("nome"));
        pessoa.setParentesco(rsFamilia.getString("parentesco"));
        pessoa.setDataNascimento(rsFamilia.getDate("dataNascimento"));
        pessoa.setEndereco(rsFamilia.getString("endereco"));

        if( codigosFamiliaNatural.contains(pessoa.getCodigoParentesco())){
          familiaNatural.add(pessoa);
        } else {
          familiaExtensa.add(pessoa);
        }
      }
      pia.setFamiliaresNatural(familiaNatural);
      pia.setFamiliaresExtensa(familiaExtensa);

      data.add(pia);
    }
    rs.close();

    String filename = Thread.currentThread().getStackTrace()[2].getMethodName();
    String titulo = "Plano Individual de Atendimento";
    creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, TipoRelEnum.SINTETICO);
    creator.setFiltro("");
    creator.gerarPdf();
  }

}
