package gcom.relatorio.atendimentopublico;
import gcom.atendimentopublico.registroatendimento.bean.FiltrarRelatorioRegistroAtendimentoPorUnidadePorUsuarioHelper;
import gcom.atendimentopublico.registroatendimento.bean.RAPorUnidadePorUsuarioHelper;
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.FiltroUsuario;
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;
public class RelatorioRegistroAtendimentoPorUnidadePorUsuario extends TarefaRelatorio {
private static final long serialVersionUID = 1L;
public RelatorioRegistroAtendimentoPorUnidadePorUsuario(Usuario usuario) {
super(usuario, ConstantesRelatorios.RELATORIO_REGISTRO_ATENDIMENTO_POR_UNIDADE_POR_USUARIO);
}
@Deprecated
public RelatorioRegistroAtendimentoPorUnidadePorUsuario() {
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");
Date dataAtendimentoInicial = (Date) getParametro("dataAtendimentoInicial");
Date dataAtendimentoFinal = (Date) getParametro("dataAtendimentoFinal");
Integer idUnidadeAtendimento = (Integer) getParametro("idUnidadeAtendimento");
Integer tipoRelatorio = (Integer) getParametro("tipoRelatorio");
SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();
UnidadeOrganizacional unidadeOrganizacional = 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 (idUnidadeAtendimento != null) {
FiltroUnidadeOrganizacional filtroUnidade = new FiltroUnidadeOrganizacional();
filtroUnidade.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeAtendimento));
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();
}
// ------------------------------
// -- Data atendimento
// ------------------------------
SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
String parametroData = "de " + f.format(dataAtendimentoInicial) + " a " + f.format(dataAtendimentoFinal);
// ------------------------------
// -- Parametros
// ------------------------------
parametros.put("situacao", parametroSituacao);
parametros.put("dataAtendimento", parametroData);
parametros.put("especificacoes", "TODOS");
parametros.put("unidadeAtendimento", parametroUnidadeOrganizacional);
parametros.put("imagem", sistemaParametro.getImagemRelatorio());
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, Usuario> usuarios = new LinkedHashMap<Integer, Usuario>();
/*
* Hash Id da UnidadeOrganizacional -> Colecao de Unidades Filhas dela
*/
Map<Integer, Collection<Usuario>> usuariosDaUnidade = new HashMap<Integer, Collection<Usuario>>();
/*
* Hash Id da UnidadeOrganizacional -> Colecao de OrdensDeServico
* cuja usuarioAtual possui o Id igual a chave
*/
Map<Integer, Collection<RAPorUnidadePorUsuarioHelper>> registrosDoUsuario = new HashMap<Integer, Collection<RAPorUnidadePorUsuarioHelper>>();
// ------------------------------
// -- Realizar Pesquisa
// ------------------------------
/*if (idUnidadeAtendimento != null) {
usuarios.put(idUnidadeAtendimento, unidadeOrganizacional);
//usuariosDaUnidade.put(idUnidadeAtendimento, null);
}
Collection<Integer> idsUnidadeAtual = new ArrayList<Integer>();
for (UnidadeOrganizacional u : usuarios.values()) {
idsUnidadeAtual.add(u.getId());
}*/
Collection<Integer> idsUnidadeAtual = new ArrayList<Integer>();
/**
* @author Adriana Muniz
* @Date 07/08/2013
* Verifica��o se o atributo � nulo antes de adicion�-lo ao array
* */
if(idUnidadeAtendimento != null)
idsUnidadeAtual.add(idUnidadeAtendimento);
FiltrarRelatorioRegistroAtendimentoPorUnidadePorUsuarioHelper filtro = new FiltrarRelatorioRegistroAtendimentoPorUnidadePorUsuarioHelper();
if (situacao != null) filtro.setSituacao(situacao);
filtro.setDataAtendimentoInicial(dataAtendimentoInicial);
filtro.setDataAtendimentoFinal(dataAtendimentoFinal);
filtro.setIdsUnidadeAtual(idsUnidadeAtual);
List<RAPorUnidadePorUsuarioHelper> pesquisa = fachada.filtrarRelatorioRegistroAtendimentoPorUnidadePorUsuario(filtro);
if (pesquisa == null || pesquisa.isEmpty()) {
throw new ActionServletException("atencao.relatorio.vazio");
}
FiltroUsuario filtroUsuario = new FiltroUsuario();
if(idUnidadeAtendimento != null)
filtroUsuario.adicionarParametro( new ParametroSimples( FiltroUsuario.UNIDADE_ORGANIZACIONAL_ID, idUnidadeAtendimento));
Collection<Usuario> colecaoUsuario = fachada.pesquisar(filtroUsuario,
Usuario.class.getName() );
for (Usuario usur : colecaoUsuario) {
usuarios.put(usur.getId(), usur);
}
// Separando os RegistrosAtendimento pesquisados por usuario
for (RAPorUnidadePorUsuarioHelper registro : pesquisa) {
if (registro.getIdUsuarioAtendimento() != null) {
Integer idUsuarioAtendimento = registro.getIdUsuarioAtendimento();
if (registrosDoUsuario.containsKey(idUsuarioAtendimento)) {
registrosDoUsuario.get(idUsuarioAtendimento).add(registro);
} else {
List<RAPorUnidadePorUsuarioHelper> list = new ArrayList<RAPorUnidadePorUsuarioHelper>();
list.add(registro);
registrosDoUsuario.put(idUsuarioAtendimento, list);
}
}
}
// ------------------------------
// -- Processando Linhas do Relat�rio
// ------------------------------
List<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beans = new ArrayList<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
// hash id da UnidadeOrganizacional -> cole��o de beans da sua pagina de relatorio
Map<Integer, Collection<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>> beansUsuario =
new HashMap<Integer, Collection<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>>();
// hash id UnidadeOrganizacional -> um bean com a soma total dos beans dessa unidade
Map<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> totalBeansUsuario =
new HashMap<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
// ------------------------------
// -- Processando Dados para Cada Unidade
// ------------------------------
for (int idUsuario : usuarios.keySet()) {
Usuario usuario = usuarios.get(idUsuario);
// cria um bean para a soma total dessa unidade e armazena na hash
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean totalUsuarioBean = new RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean();
totalUsuarioBean.setEspecificacao("TOTAL DO USU�RIO: ");
totalBeansUsuario.put(usuario.getId(), totalUsuarioBean);
// hash id SolicitacaoTipoEspecificacao -> soma total para essa especificacao (para esse usuario)
Map<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> especificacaoBeans =
new HashMap<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
// se n�o existirem registros para esse usuario parar
if (!registrosDoUsuario.containsKey(usuario.getId())) continue;
// para cada registro de atendimento do usuario atual
for (RAPorUnidadePorUsuarioHelper registro : registrosDoUsuario.get(usuario.getId())) {
// Pega da hash o bean para a soma dos valores para essa especificacao desse Usuario
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean especificacaoBean = null;
if (especificacaoBeans.containsKey(registro.getIdSolicitacaoTipoEspecificacao())) {
especificacaoBean = especificacaoBeans.get(registro.getIdSolicitacaoTipoEspecificacao());
} else {
especificacaoBean = new RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean();
especificacaoBean.setUsuario(usuario.getId() + " - " + usuario.getNomeUsuario());
especificacaoBean.setUnidade(usuario.getId() + " - " + usuario.getNomeUsuario());
especificacaoBean.setEspecificacao(registro.getDescricaoSolicitacaoTipoEspecificacao());
especificacaoBeans.put(registro.getIdSolicitacaoTipoEspecificacao(), especificacaoBean);
}
// quantidade solicitada
especificacaoBean.setQuantidadeSolicitada(especificacaoBean.getQuantidadeSolicitada() +1);
totalUsuarioBean.setQuantidadeSolicitada(totalUsuarioBean.getQuantidadeSolicitada() +1);
}
// adicionando os beans de cada especifica��o na cole��o desse usuario
List<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beansDoUsuario = new ArrayList<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
for (RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean bean : especificacaoBeans.values()) {
beansDoUsuario.add(bean);
}
//beansDoUsuario.add(totalUsuarioBean);
beansUsuario.put(usuario.getId(), beansDoUsuario);
}
//******************************************************************************
Map<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> especificacaoBeansUnidade =
new HashMap<Integer, RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean totalUnidadeBean = new RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean();
totalUnidadeBean.setEspecificacao("TOTAL DA UNIDADE: ");
totalBeansUsuario.put(0, totalUnidadeBean);
for (int idUsuario : usuarios.keySet()) {
Usuario usuario = usuarios.get(idUsuario);
// cria um bean para a soma total dessa unidade e armazena na hash
// hash id SolicitacaoTipoEspecificacao -> soma total para essa especificacao (para essa unidade)
// se n�o existirem registros para esse usuario parar
if (!registrosDoUsuario.containsKey(usuario.getId())) continue;
// para cada registro de atendimento do usuario atual
for (RAPorUnidadePorUsuarioHelper registro : registrosDoUsuario.get(usuario.getId())) {
// Pega da hash o bean para a soma dos valores para essa especificacao desse Usuario
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean especificacaoBean = null;
if (especificacaoBeansUnidade.containsKey(registro.getIdSolicitacaoTipoEspecificacao())) {
especificacaoBean = especificacaoBeansUnidade.get(registro.getIdSolicitacaoTipoEspecificacao());
} else {
especificacaoBean = new RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean();
especificacaoBean.setUsuario("Total da Unidade");
especificacaoBean.setUnidade("Total da Unidade");
especificacaoBean.setEspecificacao(registro.getDescricaoSolicitacaoTipoEspecificacao());
especificacaoBeansUnidade.put(registro.getIdSolicitacaoTipoEspecificacao(), especificacaoBean);
}
// quantidade solicitada
especificacaoBean.setQuantidadeSolicitada(especificacaoBean.getQuantidadeSolicitada() +1);
totalUnidadeBean.setQuantidadeSolicitada(totalUnidadeBean.getQuantidadeSolicitada() +1);
}
// adicionando os beans de cada especifica��o na cole��o desse usuario
List<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beansDoUsuario = new ArrayList<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean>();
for (RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean bean : especificacaoBeansUnidade.values()) {
beansDoUsuario.add(bean);
}
//beansDoUsuario.add(totalUsuarioBean);
beansUsuario.put(0, beansDoUsuario);
}
// ------------------------------
// -- 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 idUsuario : usuarios.keySet()) {
Usuario usuario = usuarios.get(idUsuario);
String descricaoUsuario = usuario.getId() + " - " + usuario.getNomeUsuario();
// adicionar as linhas da pagina da unidade
Collection<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beansUnidade = beansUsuario.get(idUsuario);
if (beansUnidade != null) {
for (RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean linha : beansUnidade) {
//linha.setSuperior(false);
beans.add(linha);}
}
// adicionar soma total para essa unidade
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean totalUnidade = totalBeansUsuario.get(idUsuario);
adicionarTotal(beans, totalUnidade.copy(), descricaoUsuario, false);
// se a unidade tiver filhos, criar uma nova pagina com resumo das atividades
/*Collection<Usuario> filhos = usuariosDaUnidade.get(idUsuario);
if (filhos != null) {
descricaoUsuario += "."; // para diferenciar agrupamento do ireport
// criar uma linha para total dessa unidade
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean cloneSuperior = totalUnidade.copy();
cloneSuperior.setUsuario(descricaoUsuario);
//cloneSuperior.setSuperior(true);
if (!cloneSuperior.isEmpty()) {
beans.add(cloneSuperior);
}
// criar uma linha para cada unidade filha
for (Usuario filho : filhos) {
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean totalFilhoBean = totalBeansUsuario.get(filho.getId());
totalFilhoBean.setUsuario(descricaoUsuario);
//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(), descricaoUsuario, true);
}*/
}
String descricaoUsuario = "Total da Unidade";
// adicionar as linhas da pagina da unidade
Collection<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beansUnidade = beansUsuario.get(new Integer("0"));
if (beansUnidade != null) {
for (RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean linha : beansUnidade) {
//linha.setSuperior(false);
beans.add(linha);}
}
adicionarTotal(beans, totalUnidadeBean.copy(), descricaoUsuario, true);
byte[] retorno = this.gerarRelatorio(ConstantesRelatorios.RELATORIO_REGISTRO_ATENDIMENTO_POR_UNIDADE_POR_USUARIO,
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<RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean> beans,
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean total,
String descricaoUsuario,
boolean resumoSuperior) {
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean somaTotal = total.copy();
somaTotal.setUsuario(descricaoUsuario);
somaTotal.setUnidade(descricaoUsuario);
//somaTotal.setSuperior(resumoSuperior);
RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean linhaEmBranco = new RelatorioRegistroAtendimentoPorUnidadePorUsuarioBean();
linhaEmBranco.setUsuario(descricaoUsuario);
linhaEmBranco.setUnidade(descricaoUsuario);
linhaEmBranco.setEspecificacao("");
linhaEmBranco.setNull();
//linhaEmBranco.setSuperior(resumoSuperior);
if (resumoSuperior) {
somaTotal.setEspecificacao("TOTAL DA UNIDADE: ");
} else {
somaTotal.setEspecificacao("TOTAL DO USUARIO: ");
}
if (!somaTotal.isEmpty()) {
beans.add(linhaEmBranco);
beans.add(somaTotal);
}
}
@Override
public int calcularTotalRegistrosRelatorio() {
return 1;
}
@Override
public void agendarTarefaBatch() {
AgendadorTarefas.agendarTarefa("RelatorioRegistroAtendimentoPorUnidadePorUsuario", this);
}
}