package gcom.relatorio.atendimentopublico; import gcom.atendimentopublico.bean.UnidadesFilhasHelper; import gcom.atendimentopublico.registroatendimento.FiltroSolicitacaoTipo; import gcom.atendimentopublico.registroatendimento.FiltroSolicitacaoTipoEspecificacao; import gcom.atendimentopublico.registroatendimento.SolicitacaoTipo; import gcom.atendimentopublico.registroatendimento.SolicitacaoTipoEspecificacao; import gcom.atendimentopublico.registroatendimento.bean.FiltrarRelatorioResumoSolicitacoesRAPorUnidadeHelper; import gcom.atendimentopublico.registroatendimento.bean.GestaoRegistroAtendimentoHelper; import gcom.cadastro.geografico.Bairro; import gcom.cadastro.geografico.FiltroBairro; import gcom.cadastro.geografico.FiltroMunicipio; import gcom.cadastro.geografico.Municipio; import gcom.cadastro.sistemaparametro.SistemaParametro; import gcom.cadastro.unidade.FiltroUnidadeOrganizacional; import gcom.cadastro.unidade.UnidadeOrganizacional; import gcom.fachada.Fachada; import gcom.gui.ActionServletException; import gcom.relatorio.ConstantesRelatorios; import gcom.relatorio.RelatorioDataSource; import gcom.seguranca.acesso.usuario.Usuario; import gcom.tarefa.TarefaException; import gcom.tarefa.TarefaRelatorio; import gcom.util.Util; import gcom.util.agendadortarefas.AgendadorTarefas; import gcom.util.filtro.ParametroSimples; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * [UC0497] Gerar Relatorio Resumo de Solicitacoes de RA por Unidade * * @author Victor Cisneiros * @date 20/06/2008 */ public class RelatorioResumoSolicitacoesRAPorUnidade extends TarefaRelatorio { private static final long serialVersionUID = 1L; public RelatorioResumoSolicitacoesRAPorUnidade(Usuario usuario) { super(usuario, ConstantesRelatorios.RELATORIO_RESUMO_SOLICITACOES_RA_POR_UNIDADE); } @Deprecated public RelatorioResumoSolicitacoesRAPorUnidade() { super(null, ""); } @Override public Object executar() throws TarefaException { Fachada fachada = Fachada.getInstancia(); Map<String, Object> parametros = new HashMap<String, Object>(); Short situacao = (Short) getParametro("situacao"); Collection<Integer> idsSolicitacaoTipo = (Collection<Integer>) getParametro("idsSolicitacaoTipo"); Collection<Integer> idsSolicitacaoTipoEspecificacao = (Collection<Integer>) getParametro("idsSolicitacaoTipoEspecificacao"); Date dataAtendimentoInicial = (Date) getParametro("dataAtendimentoInicial"); Date dataAtendimentoFinal = (Date) getParametro("dataAtendimentoFinal"); Integer idUnidadeOrganizacional = (Integer) getParametro("idUnidadeOrganizacional"); Integer idUnidadeSuperior = (Integer) getParametro("idUnidadeSuperior"); Integer idMunicipio = (Integer) getParametro("idMunicipio"); Integer codigoBairro = (Integer) getParametro("codigoBairro"); Integer tipoRelatorio = (Integer) getParametro("tipoRelatorio"); SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema(); UnidadeOrganizacional unidadeOrganizacional = null; UnidadeOrganizacional unidadeSuperior = null; Municipio municipio = null; Bairro bairro = null; // ------------------------------ // -- Situa��o // ------------------------------ String parametroSituacao = "AMBOS"; if (situacao != null) { if (situacao == 1) parametroSituacao = "PENDENTES"; if (situacao == 2) parametroSituacao = "ENCERRADOS"; if (situacao == 3) parametroSituacao = "SEM LOCAL DE OCORR�NCIA"; } // ------------------------------ // -- Unidade Organizacional // ------------------------------ String parametroUnidadeOrganizacional = ""; if (idUnidadeOrganizacional != null) { FiltroUnidadeOrganizacional filtroUnidade = new FiltroUnidadeOrganizacional(); filtroUnidade.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeOrganizacional)); Collection pesquisa = fachada.pesquisar(filtroUnidade, UnidadeOrganizacional.class.getName()); if (pesquisa == null || pesquisa.isEmpty()) { throw new ActionServletException("atencao.pesquisa_inexistente", null, "Unidade Organizacional"); } unidadeOrganizacional = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(pesquisa); parametroUnidadeOrganizacional = unidadeOrganizacional.getDescricao(); } // ------------------------------ // -- Unidade Superior // ------------------------------ String parametroUnidadeSuperior = ""; if (idUnidadeSuperior != null) { FiltroUnidadeOrganizacional filtroUnidade = new FiltroUnidadeOrganizacional(); filtroUnidade.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeSuperior)); Collection pesquisa = fachada.pesquisar(filtroUnidade, UnidadeOrganizacional.class.getName()); if (pesquisa == null || pesquisa.isEmpty()) { throw new ActionServletException("atencao.pesquisa_inexistente", null, "Unidade Superior"); } unidadeSuperior = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(pesquisa); parametroUnidadeSuperior = unidadeSuperior.getDescricao(); } // ------------------------------ // -- Municipio // ------------------------------ String parametroMunicipio = ""; if (idMunicipio != null) { FiltroMunicipio filtroMunicipio = new FiltroMunicipio(); filtroMunicipio.adicionarParametro(new ParametroSimples(FiltroMunicipio.ID, idMunicipio)); Collection pesquisa = fachada.pesquisar(filtroMunicipio, Municipio.class.getName()); if (pesquisa == null || pesquisa.isEmpty()) { throw new ActionServletException("atencao.pesquisa_inexistente", null, "Municipio"); } municipio = (Municipio) Util.retonarObjetoDeColecao(pesquisa); parametroMunicipio = municipio.getNome(); } // ------------------------------ // -- Bairro // ------------------------------ String parametroBairro = ""; if (codigoBairro != null) { FiltroBairro filtroBairro = new FiltroBairro(); filtroBairro.adicionarParametro(new ParametroSimples(FiltroBairro.MUNICIPIO_ID, new Integer(idMunicipio))); filtroBairro.adicionarParametro(new ParametroSimples(FiltroBairro.CODIGO, new Integer(codigoBairro))); Collection pesquisa = fachada.pesquisar(filtroBairro, Bairro.class.getName()); if (pesquisa == null || pesquisa.isEmpty()) { throw new ActionServletException("atencao.pesquisa_inexistente", null, "Bairro"); } bairro = (Bairro) Util.retonarObjetoDeColecao(pesquisa); parametroBairro = bairro.getNome(); } // ------------------------------ // -- Data atendimento // ------------------------------ SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy"); String parametroData = "de " + f.format(dataAtendimentoInicial) + " a " + f.format(dataAtendimentoFinal); // ------------------------------ // -- Solicitacoes/Especificacoes // ------------------------------ String parametroEspecificacoes = "Solicita��es: "; if (idsSolicitacaoTipo != null) { FiltroSolicitacaoTipo filtro = new FiltroSolicitacaoTipo(); Collection<SolicitacaoTipo> pesquisa = fachada.pesquisar(idsSolicitacaoTipo, filtro, SolicitacaoTipo.class.getName()); for (SolicitacaoTipo solicitacaoTipo : pesquisa) { parametroEspecificacoes += solicitacaoTipo.getDescricao() + "; "; } } else { if (idsSolicitacaoTipoEspecificacao != null) { parametroEspecificacoes = "Especifica��es: "; FiltroSolicitacaoTipoEspecificacao filtro = new FiltroSolicitacaoTipoEspecificacao(); Collection<SolicitacaoTipoEspecificacao> pesquisa = fachada.pesquisar(idsSolicitacaoTipoEspecificacao, filtro, SolicitacaoTipoEspecificacao.class.getName()); for (SolicitacaoTipoEspecificacao solicitacaoTipoEspecificacao : pesquisa) { parametroEspecificacoes += solicitacaoTipoEspecificacao.getDescricao() + "; "; } } else { parametroEspecificacoes += "TODAS"; } } // ------------------------------ // -- Parametros // ------------------------------ parametros.put("situacao", parametroSituacao); parametros.put("dataAtendimento", parametroData); parametros.put("especificacoes", "TODOS"); parametros.put("unidadeAtendimento", parametroUnidadeOrganizacional); parametros.put("unidadeSuperior", parametroUnidadeSuperior); parametros.put("municipio", parametroMunicipio); parametros.put("bairro", parametroBairro); parametros.put("imagem", sistemaParametro.getImagemRelatorio()); parametros.put("especificacoes", parametroEspecificacoes); parametros.put("tipoRelatorio", "R0497"); // ------------------------------ // -- Estruturas de Dados // ------------------------------ /* * Hash ordenada Id da UnidadeOrganizacional -> UnidadeOrganizacional * Os ids est�o ordenados de modo que uma unidade filha aparece sempre antes de sua superior */ LinkedHashMap<Integer, UnidadeOrganizacional> unidades = new LinkedHashMap<Integer, UnidadeOrganizacional>(); /* * Hash Id da UnidadeOrganizacional -> Colecao de Unidades Filhas dela */ Map<Integer, Collection<UnidadeOrganizacional>> filhosDaUnidade = new HashMap<Integer, Collection<UnidadeOrganizacional>>(); /* * Hash Id da UnidadeOrganizacional -> Colecao de OrdensDeServico cuja unidadeAtual possui o Id igual a chave */ Map<Integer, Collection<GestaoRegistroAtendimentoHelper>> registrosDaUnidade = new HashMap<Integer, Collection<GestaoRegistroAtendimentoHelper>>(); // ------------------------------ // -- Realizar Pesquisa // ------------------------------ if (idUnidadeOrganizacional != null) { unidades.put(idUnidadeOrganizacional, unidadeOrganizacional); filhosDaUnidade.put(idUnidadeOrganizacional, null); } else { UnidadesFilhasHelper helper = fachada.pesquisarUnidadesFilhas(unidadeSuperior.getId()); unidades = helper.getUnidades(); filhosDaUnidade = helper.getFilhosDaUnidade(); } Collection<Integer> idsUnidadeAtual = new ArrayList<Integer>(); for (UnidadeOrganizacional u : unidades.values()) { idsUnidadeAtual.add(u.getId()); } FiltrarRelatorioResumoSolicitacoesRAPorUnidadeHelper filtro = new FiltrarRelatorioResumoSolicitacoesRAPorUnidadeHelper(); if (situacao != null) filtro.setSituacao(situacao); filtro.setDataAtendimentoInicial(dataAtendimentoInicial); filtro.setDataAtendimentoFinal(dataAtendimentoFinal); filtro.setIdsUnidadeAtual(idsUnidadeAtual); if (idsSolicitacaoTipo != null) filtro.setIdsSolicitacaoTipo(idsSolicitacaoTipo); if (idsSolicitacaoTipoEspecificacao != null) filtro.setIdsSolicitacaoTipoEspecificacao(idsSolicitacaoTipoEspecificacao); if (idMunicipio != null) filtro.setIdMunicipio(idMunicipio); if (codigoBairro != null) filtro.setIdBairro(bairro.getId()); List<GestaoRegistroAtendimentoHelper> pesquisa = fachada.filtrarRelatorioResumoSolicitacoesRAPorUnidade(filtro); if (pesquisa == null || pesquisa.isEmpty()) { throw new ActionServletException("atencao.relatorio.vazio"); } // Separando os RegistrosAtendimento pesquisados por unidadeAtual for (GestaoRegistroAtendimentoHelper registro : pesquisa) { if (registro.getIdUnidadeAtual() != null) { Integer idUnidadeAtual = registro.getIdUnidadeAtual(); if (registrosDaUnidade.containsKey(idUnidadeAtual)) { registrosDaUnidade.get(idUnidadeAtual).add(registro); } else { List<GestaoRegistroAtendimentoHelper> list = new ArrayList<GestaoRegistroAtendimentoHelper>(); list.add(registro); registrosDaUnidade.put(idUnidadeAtual, list); } } } // ------------------------------ // -- Processando Linhas do Relat�rio // ------------------------------ List<RelatorioResumoSolicitacoesRAPorUnidadeBean> beans = new ArrayList<RelatorioResumoSolicitacoesRAPorUnidadeBean>(); // hash id da UnidadeOrganizacional -> cole��o de beans da sua pagina de relatorio Map<Integer, Collection<RelatorioResumoSolicitacoesRAPorUnidadeBean>> beansUnidades = new HashMap<Integer, Collection<RelatorioResumoSolicitacoesRAPorUnidadeBean>>(); // hash id UnidadeOrganizacional -> um bean com a soma total dos beans dessa unidade Map<Integer, RelatorioResumoSolicitacoesRAPorUnidadeBean> totalBeansUnidades = new HashMap<Integer, RelatorioResumoSolicitacoesRAPorUnidadeBean>(); // ------------------------------ // -- Processando Dados para Cada Unidade // ------------------------------ for (int idUnidade : unidades.keySet()) { UnidadeOrganizacional unidade = unidades.get(idUnidade); // cria um bean para a soma total dessa unidade e armazena na hash RelatorioResumoSolicitacoesRAPorUnidadeBean totalUnidadeBean = new RelatorioResumoSolicitacoesRAPorUnidadeBean(); totalUnidadeBean.setEspecificacao(unidade.getId() + " - " + unidade.getDescricao()); totalBeansUnidades.put(unidade.getId(), totalUnidadeBean); // hash id SolicitacaoTipoEspecificacao -> soma total para essa especificacao (dentro dessa unidade) Map<Integer, RelatorioResumoSolicitacoesRAPorUnidadeBean> especificacaoBeans = new HashMap<Integer, RelatorioResumoSolicitacoesRAPorUnidadeBean>(); // se n�o existirem registros para essa unidade parar if (!registrosDaUnidade.containsKey(unidade.getId())) continue; // para cada registro de atendimento da unidade atual for (GestaoRegistroAtendimentoHelper registro : registrosDaUnidade.get(unidade.getId())) { // Pega da hash o bean para a soma dos valores para essa especificacao dentro dessa unidade RelatorioResumoSolicitacoesRAPorUnidadeBean especificacaoBean = null; if (especificacaoBeans.containsKey(registro.getIdSolicitacaoTipoEspecificacao())) { especificacaoBean = especificacaoBeans.get(registro.getIdSolicitacaoTipoEspecificacao()); } else { especificacaoBean = new RelatorioResumoSolicitacoesRAPorUnidadeBean(); especificacaoBean.setUnidade(unidade.getId() + " - " + unidade.getDescricao()); especificacaoBean.setEspecificacao(registro.getIdSolicitacaoTipoEspecificacao() + " - " + registro.getDescricaoSolicitacaoTipoEspecificacao()); especificacaoBeans.put(registro.getIdSolicitacaoTipoEspecificacao(), especificacaoBean); } // quantidade solicitada especificacaoBean.setQuantidadeSolicitada(especificacaoBean.getQuantidadeSolicitada() +1); totalUnidadeBean.setQuantidadeSolicitada(totalUnidadeBean.getQuantidadeSolicitada() +1); // quantidade executada if (registro.getSituacao() == 2) { especificacaoBean.setQuantidadeExecutada(especificacaoBean.getQuantidadeExecutada() +1); totalUnidadeBean.setQuantidadeExecutada(totalUnidadeBean.getQuantidadeExecutada() +1); } // quantidade atendida if (registro.getIdAtendimentoMotivoEncerramento() != null && registro.getIdAtendimentoMotivoEncerramento() == 2) { especificacaoBean.setQuantidadeAtendida(especificacaoBean.getQuantidadeAtendida() +1); totalUnidadeBean.setQuantidadeAtendida(totalUnidadeBean.getQuantidadeAtendida() +1); } // residual if (registro.getSituacao() != 2) { especificacaoBean.setResidual(especificacaoBean.getResidual() +1); totalUnidadeBean.setResidual(totalUnidadeBean.getResidual() +1); } } // adicionando os beans de cada especifica��o na cole��o dessa unidade List<RelatorioResumoSolicitacoesRAPorUnidadeBean> beansUnidade = new ArrayList<RelatorioResumoSolicitacoesRAPorUnidadeBean>(); for (RelatorioResumoSolicitacoesRAPorUnidadeBean bean : especificacaoBeans.values()) { beansUnidade.add(bean); } beansUnidades.put(unidade.getId(), beansUnidade); } // ------------------------------ // -- Criacao das Linhas do Relatorio // ------------------------------ // criar o relatorio com as paginas das unidades come�ando da suas filhas, e pondo um // total de resumo de atividades para cada unidade superior que aparecer no loop for (int idUnidade : unidades.keySet()) { UnidadeOrganizacional unidade = unidades.get(idUnidade); String descricaoUnidade = unidade.getId() + " - " + unidade.getDescricao(); // adicionar as linhas da pagina da unidade Collection<RelatorioResumoSolicitacoesRAPorUnidadeBean> beansUnidade = beansUnidades.get(idUnidade); if (beansUnidade != null) { for (RelatorioResumoSolicitacoesRAPorUnidadeBean linha : beansUnidade) { linha.setSuperior(false); beans.add(linha); } } // adicionar soma total para essa unidade RelatorioResumoSolicitacoesRAPorUnidadeBean totalUnidade = totalBeansUnidades.get(idUnidade); adicionarTotal(beans, totalUnidade.copy(), descricaoUnidade, false); // se a unidade tiver filhos, criar uma nova pagina com resumo das atividades Collection<UnidadeOrganizacional> filhos = filhosDaUnidade.get(idUnidade); if (filhos != null) { descricaoUnidade += "."; // para diferenciar agrupamento do ireport // criar uma linha para total dessa unidade RelatorioResumoSolicitacoesRAPorUnidadeBean cloneSuperior = totalUnidade.copy(); cloneSuperior.setUnidade(descricaoUnidade); cloneSuperior.setSuperior(true); if (!cloneSuperior.isEmpty()) { beans.add(cloneSuperior); } // criar uma linha para cada unidade filha for (UnidadeOrganizacional filho : filhos) { RelatorioResumoSolicitacoesRAPorUnidadeBean totalFilhoBean = totalBeansUnidades.get(filho.getId()); totalFilhoBean.setUnidade(descricaoUnidade); totalFilhoBean.setSuperior(true); if (!totalFilhoBean.isEmpty()) { beans.add(totalFilhoBean); } // somar os valores da unidade superior atual com os valores do filho totalUnidade.sum(totalFilhoBean); } // adicionar linha com soma total para essa unidade adicionarTotal(beans, totalUnidade.copy(), descricaoUnidade, true); } } byte[] retorno = this.gerarRelatorio(ConstantesRelatorios.RELATORIO_RESUMO_SOLICITACOES_RA_POR_UNIDADE, parametros, new RelatorioDataSource(beans), tipoRelatorio); // try { // persistirRelatorioConcluido(retorno, // Relatorio.RELATORIO_GESTAO_SERVICOS_UPA, getIdFuncionalidadeIniciada()); // } catch (Exception e) { // e.printStackTrace(); // throw new TarefaException("Erro ao gravar relat�rio no sistema", e); // } return retorno; } /** * Adiciona uma linha de soma total no relatorio, antes adicionando uma linha em branco * * @param total Um bean com os valores totais a serem adicionados * @param resumoSuperior Flag indicando se a linha vai ser para unidade superior ou nao */ public void adicionarTotal( List<RelatorioResumoSolicitacoesRAPorUnidadeBean> beans, RelatorioResumoSolicitacoesRAPorUnidadeBean total, String descricaoUnidade, boolean resumoSuperior) { RelatorioResumoSolicitacoesRAPorUnidadeBean somaTotal = total.copy(); somaTotal.setUnidade(descricaoUnidade); somaTotal.setSuperior(resumoSuperior); RelatorioResumoSolicitacoesRAPorUnidadeBean linhaEmBranco = new RelatorioResumoSolicitacoesRAPorUnidadeBean(); linhaEmBranco.setUnidade(descricaoUnidade); linhaEmBranco.setEspecificacao(""); linhaEmBranco.setNull(); linhaEmBranco.setSuperior(resumoSuperior); if (resumoSuperior) { somaTotal.setEspecificacao("TOTAL POR UNIDADE SUPERIOR"); } else { somaTotal.setEspecificacao("TOTAL POR UNIDADE"); } if (!somaTotal.isEmpty()) { beans.add(linhaEmBranco); beans.add(somaTotal); } } @Override public int calcularTotalRegistrosRelatorio() { return 1; } @Override public void agendarTarefaBatch() { AgendadorTarefas.agendarTarefa("RelatorioResumoSolicitacoesRAPorUnidade", this); } }