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.FiltrarGestaoRAHelper;
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.Calendar;
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 RelatorioGestaoSolicitacoesRAPorChefia extends TarefaRelatorio {
private static final long serialVersionUID = 1L;
public RelatorioGestaoSolicitacoesRAPorChefia(Usuario usuario) {
super(usuario, ConstantesRelatorios.RELATORIO_GESTAO_SOLICITACOES_RA_POR_CHEFIA);
}
@Deprecated
public RelatorioGestaoSolicitacoesRAPorChefia() {
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("unidadeAtual", 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", "R0499");
// ------------------------------
// -- 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());
}
boolean unidadeUnica = false;
if (unidades.size() == 1) {
unidadeUnica = true;
}
FiltrarGestaoRAHelper filtro = new FiltrarGestaoRAHelper();
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.filtrarGestaoRA(filtro);
if (pesquisa == null || pesquisa.isEmpty()) {
throw new ActionServletException("atencao.pesquisa_inexistente", null, "Registros de Atendimento");
}
// 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<RelatorioGestaoSolicitacoesRAPorChefiaBean> beans = new ArrayList<RelatorioGestaoSolicitacoesRAPorChefiaBean>();
// hash id UnidadeOrganizacional -> um bean com a soma total dos beans dessa unidade
Map<Integer, RelatorioGestaoSolicitacoesRAPorChefiaBean> totalBeansUnidades =
new HashMap<Integer, RelatorioGestaoSolicitacoesRAPorChefiaBean>();
// ------------------------------
// -- 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
RelatorioGestaoSolicitacoesRAPorChefiaBean totalUnidadeBean = new RelatorioGestaoSolicitacoesRAPorChefiaBean();
totalUnidadeBean.setUnidade(unidade.getId() + " - " + unidade.getDescricao());
totalUnidadeBean.setDescricaoUnidade(unidade.getId() + " - " + unidade.getDescricao());
totalBeansUnidades.put(unidade.getId(), totalUnidadeBean);
// 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())) {
// quantidade solicitada
totalUnidadeBean.setQuantidadeSolicitada(totalUnidadeBean.getQuantidadeSolicitada() +1);
if (registro.getFlag0800()) {
totalUnidadeBean.setQuantidadeSolicitada0800(totalUnidadeBean.getQuantidadeSolicitada0800() +1);
}
// quantidade executada
if (registro.getSituacao() == 2) {
totalUnidadeBean.setQuantidadeExecutadaTotal(totalUnidadeBean.getQuantidadeExecutadaTotal() +1);
if (registro.getDataEncerramento() == null) continue;
if (registro.getDataEncerramento().getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setQuantidadeExecutadaNoPrazo(totalUnidadeBean.getQuantidadeExecutadaNoPrazo() +1);
} else {
totalUnidadeBean.setQuantidadeExecutadaForaPrazo(totalUnidadeBean.getQuantidadeExecutadaForaPrazo() +1);
}
// 0800
if (registro.getFlag0800()) {
totalUnidadeBean.setQuantidadeExecutadaTotal0800(totalUnidadeBean.getQuantidadeExecutadaTotal0800() +1);
if (registro.getDataEncerramento().getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setQuantidadeExecutadaNoPrazo0800(totalUnidadeBean.getQuantidadeExecutadaNoPrazo0800() +1);
} else {
totalUnidadeBean.setQuantidadeExecutadaForaPrazo0800(totalUnidadeBean.getQuantidadeExecutadaForaPrazo0800() +1);
}
}
}
// quantidade atendida
if (registro.getIdAtendimentoMotivoEncerramento() != null &&
registro.getIdAtendimentoMotivoEncerramento() == 2) {
totalUnidadeBean.setQuantidadeAtendidaTotal(totalUnidadeBean.getQuantidadeAtendidaTotal() +1);
if (registro.getDataEncerramento().getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setQuantidadeAtendidaNoPrazo(totalUnidadeBean.getQuantidadeAtendidaNoPrazo() +1);
} else {
totalUnidadeBean.setQuantidadeAtendidaForaPrazo(totalUnidadeBean.getQuantidadeAtendidaForaPrazo() +1);
}
// 0800
if (registro.getFlag0800()) {
totalUnidadeBean.setQuantidadeAtendidaTotal0800(totalUnidadeBean.getQuantidadeAtendidaTotal0800() +1);
if (registro.getDataEncerramento().getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setQuantidadeAtendidaNoPrazo0800(totalUnidadeBean.getQuantidadeAtendidaNoPrazo0800() +1);
} else {
totalUnidadeBean.setQuantidadeAtendidaForaPrazo0800(totalUnidadeBean.getQuantidadeAtendidaForaPrazo0800() +1);
}
}
}
Date atual = new Date();
Calendar calendario = Calendar.getInstance();
calendario.setTime(atual);
calendario.set(Calendar.HOUR, 0);
calendario.set(Calendar.MINUTE, 0);
calendario.set(Calendar.SECOND, 0);
calendario.set(Calendar.MILLISECOND, 0);
atual = calendario.getTime();
// residual
if (registro.getSituacao() != 2) {
if (atual.getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setResidualNoPrazo(totalUnidadeBean.getResidualNoPrazo() +1);
} else {
totalUnidadeBean.setResidualForaPrazo(totalUnidadeBean.getResidualForaPrazo() +1);
}
if (registro.getFlag0800()) {
if (atual.getTime() <= registro.getDataPrevistaAtual().getTime()) {
totalUnidadeBean.setResidualNoPrazo0800(totalUnidadeBean.getResidualNoPrazo0800() +1);
} else {
totalUnidadeBean.setResidualForaPrazo0800(totalUnidadeBean.getResidualForaPrazo0800() +1);
}
}
}
}
}
// ------------------------------
// -- 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.getDescricao();
// adicionar soma total para essa unidade
RelatorioGestaoSolicitacoesRAPorChefiaBean totalUnidade = totalBeansUnidades.get(idUnidade);
// se a unidade tiver filhos, criar uma nova pagina com resumo das atividades
Collection<UnidadeOrganizacional> filhos = filhosDaUnidade.get(idUnidade);
if (filhos != null) {
// criar uma linha para total dessa unidade
RelatorioGestaoSolicitacoesRAPorChefiaBean 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) {
RelatorioGestaoSolicitacoesRAPorChefiaBean 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, !unidadeUnica);
}
if (unidadeUnica) {
adicionarTotal(beans, totalUnidade.copy(), descricaoUnidade, !unidadeUnica);
}
}
byte[] retorno = this.gerarRelatorio(ConstantesRelatorios.RELATORIO_GESTAO_SOLICITACOES_RA_POR_CHEFIA,
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<RelatorioGestaoSolicitacoesRAPorChefiaBean> beans,
RelatorioGestaoSolicitacoesRAPorChefiaBean total,
String descricaoUnidade,
boolean resumoSuperior) {
RelatorioGestaoSolicitacoesRAPorChefiaBean somaTotal = total.copy();
somaTotal.setUnidade(descricaoUnidade);
somaTotal.setSuperior(resumoSuperior);
RelatorioGestaoSolicitacoesRAPorChefiaBean linhaEmBranco = new RelatorioGestaoSolicitacoesRAPorChefiaBean();
linhaEmBranco.setUnidade(descricaoUnidade);
linhaEmBranco.setDescricaoUnidade("");
linhaEmBranco.setNull();
linhaEmBranco.setSuperior(resumoSuperior);
if (resumoSuperior) {
somaTotal.setDescricaoUnidade("TOTAL DA CHEFIA: " + descricaoUnidade);
} else {
somaTotal.setDescricaoUnidade("TOTAL DA UNIDADE: " + descricaoUnidade);
}
if (!somaTotal.isEmpty()) {
beans.add(somaTotal);
if (resumoSuperior) beans.add(linhaEmBranco);
}
}
@Override
public int calcularTotalRegistrosRelatorio() {
return 1;
}
@Override
public void agendarTarefaBatch() {
AgendadorTarefas.agendarTarefa("RelatorioGestaoSolicitacoesRAPorChefia", this);
}
}