package gcom.gui.relatorio.cobranca;
import gcom.arrecadacao.pagamento.FiltroPagamento;
import gcom.arrecadacao.pagamento.FiltroPagamentoHistorico;
import gcom.arrecadacao.pagamento.Pagamento;
import gcom.arrecadacao.pagamento.PagamentoHistorico;
import gcom.atendimentopublico.ordemservico.FiltroServicoTipo;
import gcom.atendimentopublico.ordemservico.OrdemServico;
import gcom.atendimentopublico.ordemservico.ServicoTipo;
import gcom.batch.Relatorio;
import gcom.cadastro.cliente.Cliente;
import gcom.cadastro.cliente.ClienteImovel;
import gcom.cadastro.cliente.ClienteRelacaoTipo;
import gcom.cadastro.imovel.Categoria;
import gcom.cadastro.imovel.FiltroCategoria;
import gcom.cadastro.imovel.FiltroImovelPerfil;
import gcom.cadastro.imovel.ImovelPerfil;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.cobranca.EmpresaCobrancaConta;
import gcom.fachada.Fachada;
import gcom.faturamento.debito.DebitoCreditoSituacao;
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.ConstantesSistema;
import gcom.util.ControladorException;
import gcom.util.Util;
import gcom.util.agendadortarefas.AgendadorTarefas;
import gcom.util.filtro.ParametroSimples;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
/**
*
*
* [UC1186] Gerar Relat�rio Ordem de Servi�o Cobran�a p/Resultado
*
* @author Hugo Azevedo
* @date 02/07/2011
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public class RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultado extends TarefaRelatorio {
private static final long serialVersionUID = 1L;
public RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultado(Usuario usuario) {
super(usuario, ConstantesRelatorios.RELATORIO_ACOMPANHAMENTO_OS_COBRANCA_RESULTADO);
}
@Deprecated
public RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultado() {
super(null, "");
}
public Object executar() throws TarefaException {
// ------------------------------------
Integer idFuncionalidadeIniciada = this.getIdFuncionalidadeIniciada();
// ------------------------------------
//Par�metros vindos do gerar relat�rio
Collection colecaoImovelOS = (Collection)getParametro("colecaoImovelOS");
String tipoServico = (String)getParametro("tipoServico");
int tipoFormatoRelatorio = (Integer)getParametro("tipoFormatoRelatorio");
String[] categoriaImovel = (String[])getParametro("categoriaImovel");
String[] perfilImovel = (String[])getParametro("perfilImovel");
String[] gerenciaRegional = (String[])getParametro("gerenciaRegional");
String[] unidadeNegocio = (String[])getParametro("unidadeNegocio");
String descLocalidadeInicial = (String)getParametro("descLocalidadeInicial");
String descLocalidadeFinal = (String)getParametro("descLocalidadeFinal");
String idSetorComercialInicial = (String)getParametro("idSetorComercialInicial");
String idSetorComercialFinal = (String)getParametro("idSetorComercialFinal");
String idQuadraInicial =(String)getParametro("idQuadraInicial");
String idQuadraFinal =(String)getParametro("idQuadraFinal");
//Vari�veis
Fachada fachada = Fachada.getInstancia();
SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();
Map parametros = new HashMap();
//valor de retorno
byte[] retorno = null;
//Verifica se a filtragem de ger�ncia regional foi realizada
boolean filtrouGerencia = false;
if(gerenciaRegional != null && gerenciaRegional.length > 0)
filtrouGerencia = true;
//Montar Cabe�alho
parametros = montarCabecalho(categoriaImovel,perfilImovel,gerenciaRegional,unidadeNegocio,descLocalidadeInicial,descLocalidadeFinal,
idSetorComercialInicial,idSetorComercialFinal,idQuadraInicial,idQuadraFinal,tipoServico,sistemaParametro, fachada);
//Montar Beans
RelatorioDataSource ds = montarBeans(colecaoImovelOS,fachada,tipoServico,filtrouGerencia);
//Montar relat�rio
retorno = gerarRelatorio(ConstantesRelatorios.RELATORIO_ACOMPANHAMENTO_OS_COBRANCA_RESULTADO,
parametros, ds, tipoFormatoRelatorio);
// ------------------------------------
// Grava o relat�rio no sistema
try {
persistirRelatorioConcluido(retorno,
Relatorio.RELATORIO_ACOMPANHAMENTO_OS_COBRANCA_RESULTADO,
idFuncionalidadeIniciada);
} catch (ControladorException e) {
e.printStackTrace();
throw new TarefaException("Erro ao gravar relat�rio no sistema", e);
}
// ------------------------------------
// retorna o relat�rio gerado
return retorno;
}
/**
*
* M�todo auxiliar para montar o cabe�alho do relat�rio
*
* @author Hugo Azevedo
* @data 02/07/2011
*/
private Map montarCabecalho(String[] categoriaImovel, String[] perfilImovel, String[] gerenciaRegional, String[] unidadeNegocio, String descLocalidadeInicial, String descLocalidadeFinal, String idSetorComercialInicial, String idSetorComercialFinal, String idQuadraInicial, String idQuadraFinal, String tipoServico,SistemaParametro sistemaParametro, Fachada fachada) {
HashMap parametros = new HashMap();
//Imagem do relat�rio
parametros.put("imagem", sistemaParametro.getImagemRelatorio());
/*
* Verifica se alguma categoria foi selecionada.
* Caso n�o haja, insere 'Todas'
*/
if(categoriaImovel != null && categoriaImovel.length > 0){
for(int i = 0;i < categoriaImovel.length; i ++){
Integer id = new Integer(categoriaImovel[i]);
categoriaImovel[i] = this.obterDescricaoCategoria(id,fachada);
}
String categorias = StringUtils.join(categoriaImovel,",");
parametros.put("categorias",categorias);
}
else{
parametros.put("categorias","Todas");
}
/*
* Verifica se algum perfil de im�vel foi selecionado.
* Caso n�o haja, insere 'Todas'
*/
if(perfilImovel != null && perfilImovel.length > 0){
for(int i = 0; i < perfilImovel.length; i++){
Integer id = new Integer(perfilImovel[i]);
perfilImovel[i] = this.obterDescricaoPerfil(id,fachada);
}
String perfilI = StringUtils.join(perfilImovel,",");
parametros.put("perfilI",perfilI);
}
else{
parametros.put("perfilI","Todas");
}
//Insere os par�metros na hash de retorno
parametros.put("descLocalidadeInicial",descLocalidadeInicial);
parametros.put("descLocalidadeFinal",descLocalidadeFinal);
parametros.put("descLocalidadeFinal",descLocalidadeFinal);
parametros.put("idSetorComercialInicial",idSetorComercialInicial);
parametros.put("idSetorComercialFinal",idSetorComercialFinal);
parametros.put("idQuadraInicial",idQuadraInicial);
parametros.put("idQuadraFinal",idQuadraFinal);
parametros.put("tipoServico",obterDescricaoTipoServico(new Integer(tipoServico),fachada));
//parametros.put("tipoServico",tipoServico);
//retorna ao m�todo principal
return parametros;
}
/**
*
* M�todo auxiliar para montar os dados do relat�rio
*
* @author Hugo Azevedo
* @data 02/07/2011
*/
private RelatorioDataSource montarBeans(Collection colecaoImovelOS, Fachada fachada, String tipoServico, boolean filtrouGerencia) {
//lista de retorno
ArrayList<RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultadoBean> beans = new ArrayList<RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultadoBean>();
//Itera��o com cada im�vel retornado pelo filtro
Iterator it = colecaoImovelOS.iterator();
while(it.hasNext()){
HashMap mapa = (HashMap)it.next();
Integer id = (Integer)mapa.get("imovel");
/*FiltroClienteImovel filtroCliIm = new FiltroClienteImovel();
filtroCliIm.adicionarCaminhoParaCarregamentoEntidade(FiltroClienteImovel.CLIENTE);
filtroCliIm.adicionarCaminhoParaCarregamentoEntidade(FiltroClienteImovel.IMOVEL);
filtroCliIm.adicionarCaminhoParaCarregamentoEntidade(FiltroClienteImovel.CLIENTE_RELACAO_TIPO);
filtroCliIm.adicionarParametro(new ParametroNulo(FiltroClienteImovel.DATA_FIM_RELACAO));
filtroCliIm.adicionarParametro(new ParametroSimples(FiltroClienteImovel.CLIENTE_RELACAO_TIPO_ID,ClienteRelacaoTipo.USUARIO));
filtroCliIm.adicionarParametro(new ParametroSimples(FiltroClienteImovel.IMOVEL_ID,id));*/
//Busca o cliente do tipo USUARIO do im�vel
Collection colecaoCliente = fachada.obterClienteImovelporRelacaoTipo(id,new Integer(ClienteRelacaoTipo.USUARIO));
Cliente cliente = null;
if(colecaoCliente.size() > 0){
ClienteImovel cliim = (ClienteImovel)Util.retonarObjetoDeColecao(colecaoCliente);
cliente = cliim.getCliente();
}else{
System.out.println("Aqui");
}
//Ordem Servico
/*FiltroOrdemServico filtroOS = new FiltroOrdemServico();
filtroOS.adicionarCaminhoParaCarregamentoEntidade(FiltroOrdemServico.IMOVEL);
filtroOS.adicionarCaminhoParaCarregamentoEntidade(FiltroOrdemServico.SERVICO_TIPO);
filtroOS.adicionarCaminhoParaCarregamentoEntidade(FiltroOrdemServico.ATENDIMENTO_MOTIVO_ENCERRAMENTO);
filtroOS.adicionarParametro(new ParametroSimples(FiltroOrdemServico.ID_IMOVEL,id));
if(tipoServico != null && !tipoServico.equals("-1"))
filtroOS.adicionarParametro(new ParametroSimples(FiltroOrdemServico.ID_SERVICO_TIPO,new Integer(tipoServico)));
Collection colecaoOS = fachada.pesquisar(filtroOS,OrdemServico.class.getName());*/
//Retorna as Ordens de Servi�o do im�vel com o tipo de servi�o selecionado
Collection colecaoOS = fachada.obterOSImovelTipoServico(id,new Integer(tipoServico));
//Cobranca Conta
/*FiltroEmpresaCobrancaConta filtroEmpresaCC = new FiltroEmpresaCobrancaConta();
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA);
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA_NAO_HISTORICO);
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA_HISTORICO);
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA_HISTORICO_DC_SITUACAO_ATUAL);
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA_NAO_HISTORICO_DC_SITUACAO_ATUAL);
filtroEmpresaCC.adicionarCaminhoParaCarregamentoEntidade(FiltroEmpresaCobrancaConta.CONTA_HISTORICO);
filtroEmpresaCC.adicionarParametro(new ParametroSimples(FiltroEmpresaCobrancaConta.IMOVEL_ID,id));
Collection colecaoEmpresaCC = fachada.pesquisar(filtroEmpresaCC,EmpresaCobrancaConta.class.getName());*/
//Retorna a cole��o de cobran�as do im�vel
Collection colecaoEmpresaCC = fachada.obterColecaoEmpresaCobrancaContaporImovel(id);
//Itera��o com cada ordem de servi�o retornada
Iterator it2 = colecaoOS.iterator();
while(it2.hasNext()){
OrdemServico os = (OrdemServico)it2.next();
RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultadoBean bean = new RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultadoBean();
bean.setClienteNome(cliente.getNome());
//Caso tenha filtrado por ger�ncia, colocar no bean o codigo e descri��o da mesma.
//Caso contr�rio, colocar 'Todas'
if(filtrouGerencia){
bean.setIdGerenciaRegional(((Integer)mapa.get("idGerenciaRegional")).toString());
bean.setDescGerenciaRegional((String)mapa.get("descGerenciaRegional"));
}
else
bean.setDescGerenciaRegional("Todas");
//Dados do bean
bean.setIdUnidadeNegocio(((Integer)mapa.get("idUnidadeNegocio")).toString());
bean.setDescUnidadeNegocio((String)mapa.get("descUnidadeNegocio"));
bean.setDataEncerramento(Util.formatarData(os.getDataEncerramento()));
bean.setDataGeracao(Util.formatarData(os.getDataGeracao()));
bean.setDescricaoServico(os.getServicoTipo().getDescricao());
bean.setImovelMatricula(os.getImovel().getId().toString());
if(os.getAtendimentoMotivoEncerramento() != null)
bean.setMotivoEncerramento(os.getAtendimentoMotivoEncerramento().getDescricao());
bean.setNumeroOS(os.getId().toString());
bean.setQtdContas(colecaoEmpresaCC.size()+"");
//Utiliza o m�todo auxiliar obterValorEnviado para calcular o valor
bean.setValorEnviado(this.obterValorEnviado(colecaoEmpresaCC,fachada));
//Utiliza o m�todo auxiliar obterValorPago para calcular o valor
bean.setValorPago(this.obterValorPago(colecaoEmpresaCC,fachada));
//adiciona o bean a cole��o de retorno
beans.add(bean);
}
}
RelatorioDataSource ds = new RelatorioDataSource(beans);
return ds;
}
/**
*
* M�todo auxiliar para retornar o valor enviado do im�vel
*
* @author Hugo Azevedo
* @data 02/07/2011
*/
private BigDecimal obterValorEnviado(Collection colecaoEmpresaCC, Fachada fachada){
BigDecimal retorno = new BigDecimal("0");
//Itera entre os comandos retornados
Iterator it = colecaoEmpresaCC.iterator();
while(it.hasNext()){
EmpresaCobrancaConta ecc = (EmpresaCobrancaConta)it.next();
//Contas que foram pra hist�rico
if(ecc.getContaGeral().getIndicadorHistorico() == ConstantesSistema.INDICADOR_USO_ATIVO){
/*
* Somat�rio dos valores das contas
* Valor = Consumo �gua + Consumo Esgoto + D�bitos - Cr�ditos
*/
BigDecimal valorConta = ecc.getContaGeral().getContaHistorico().getValorAgua()
.add(ecc.getContaGeral().getContaHistorico().getValorEsgoto())
.add(ecc.getContaGeral().getContaHistorico().getValorDebitos())
.subtract(ecc.getContaGeral().getContaHistorico().getValorCreditos());
/*
* Caso tenha impostos associado, diminuir do valor final
*/
if(ecc.getContaGeral().getContaHistorico().getValorImposto() != null)
valorConta = valorConta.subtract(ecc.getContaGeral().getContaHistorico().getValorImposto());
//Somar ao valor de retorno e iteragir com a pr�xima conta
retorno = retorno.add(valorConta);
}
//Contas que n�o foram pra hist�rico
else{
/*
* Somat�rio dos valores das contas
* Valor = Consumo �gua + Consumo Esgoto + D�bitos - Cr�ditos
*/
BigDecimal valorConta = ecc.getContaGeral().getConta().getValorAgua()
.add(ecc.getContaGeral().getConta().getValorEsgoto())
.add(ecc.getContaGeral().getConta().getDebitos())
.subtract(ecc.getContaGeral().getConta().getValorCreditos());
/*
* Caso tenha impostos associado, diminuir do valor final
*/
if(ecc.getContaGeral().getConta().getValorImposto() != null)
valorConta = valorConta.subtract(ecc.getContaGeral().getConta().getValorImposto());
//Somar ao valor de retorno e iteragir com a pr�xima conta
retorno = retorno.add(valorConta);
}
}
return retorno;
}
/**
*
* M�todo auxiliar para retornar o valor pago do im�vel
*
* @author Hugo Azevedo
* @data 02/07/2011
*/
private BigDecimal obterValorPago(Collection colecaoEmpresaCC, Fachada fachada){
BigDecimal retorno = new BigDecimal("0");
//Itera entre os comandos retornados
Iterator it = colecaoEmpresaCC.iterator();
while(it.hasNext()){
BigDecimal valorContaPaga = new BigDecimal("0");
BigDecimal valorContaParcelada = new BigDecimal("0");
EmpresaCobrancaConta ecc = (EmpresaCobrancaConta)it.next();
if(ecc.getContaGeral().getIndicadorHistorico() == ConstantesSistema.INDICADOR_USO_ATIVO){
//Conta Paga
FiltroPagamentoHistorico filtroPag = new FiltroPagamentoHistorico();
filtroPag.adicionarParametro(new ParametroSimples(FiltroPagamentoHistorico.CONTA_ID,ecc.getContaGeral().getContaHistorico().getId()));
ArrayList pag = new ArrayList(fachada.pesquisar(filtroPag,PagamentoHistorico.class.getName()));
if(pag.size() > 0){
PagamentoHistorico p = (PagamentoHistorico) pag.get(0);
valorContaPaga = valorContaPaga.add(p.getValorPagamento());
}
//Conta Parcelada
if(ecc.getContaGeral().getContaHistorico().getDebitoCreditoSituacaoAtual().getId().intValue() == DebitoCreditoSituacao.PARCELADA.intValue()){
valorContaParcelada = valorContaParcelada.add(ecc.getContaGeral().getContaHistorico().getValorAgua()
.add(ecc.getContaGeral().getContaHistorico().getValorEsgoto())
.add(ecc.getContaGeral().getContaHistorico().getValorDebitos())
.subtract(ecc.getContaGeral().getContaHistorico().getValorCreditos()));
if(ecc.getContaGeral().getContaHistorico().getValorImposto() != null)
valorContaParcelada = valorContaParcelada.subtract(ecc.getContaGeral().getContaHistorico().getValorImposto());
}
retorno = retorno.add(valorContaPaga)
.add(valorContaParcelada);
}
else{
//Conta Paga
FiltroPagamento filtroPag = new FiltroPagamento();
filtroPag.adicionarParametro(new ParametroSimples(FiltroPagamento.CONTA_ID,ecc.getContaGeral().getConta().getId()));
ArrayList pag = new ArrayList(fachada.pesquisar(filtroPag,Pagamento.class.getName()));
if(pag.size() > 0){
Pagamento p = (Pagamento) pag.get(0);
valorContaPaga = valorContaPaga.add(p.getValorPagamento());
}
//Conta Parcelada
if(ecc.getContaGeral().getConta().getDebitoCreditoSituacaoAtual().getId().intValue() == DebitoCreditoSituacao.PARCELADA.intValue()){
valorContaParcelada = valorContaParcelada.add(ecc.getContaGeral().getConta().getValorAgua()
.add(ecc.getContaGeral().getConta().getValorEsgoto())
.add(ecc.getContaGeral().getConta().getDebitos())
.subtract(ecc.getContaGeral().getConta().getValorCreditos()));
if(ecc.getContaGeral().getConta().getValorImposto() != null)
valorContaParcelada = valorContaParcelada.subtract(ecc.getContaGeral().getConta().getValorImposto());
}
retorno = retorno.add(valorContaPaga)
.add(valorContaParcelada);
}
}
return retorno;
}
//M�todo auxiliar para recuperar a descri��o do perfil
private String obterDescricaoPerfil(Integer id,Fachada fachada){
String retorno = "";
FiltroImovelPerfil filtroIP = new FiltroImovelPerfil();
filtroIP.adicionarParametro(new ParametroSimples(FiltroImovelPerfil.ID,id));
Collection colecao = fachada.pesquisar(filtroIP,ImovelPerfil.class.getName());
if(colecao.size() > 0){
ImovelPerfil ip = (ImovelPerfil)Util.retonarObjetoDeColecao(colecao);
retorno = ip.getDescricao();
}
return retorno;
}
// M�todo auxiliar para recuperar a descri��o da categoria
private String obterDescricaoCategoria(Integer id,Fachada fachada){
String retorno = "";
FiltroCategoria filtroCat = new FiltroCategoria();
filtroCat.adicionarParametro(new ParametroSimples(FiltroCategoria.CODIGO,id));
Collection colecao = fachada.pesquisar(filtroCat,Categoria.class.getName());
if(colecao.size() > 0){
Categoria cat = (Categoria)Util.retonarObjetoDeColecao(colecao);
retorno = cat.getDescricao();
}
return retorno;
}
//M�todo auxiliar para recuperar a descri��o do tipo de servi�o
private String obterDescricaoTipoServico(Integer id, Fachada fachada){
String retorno = "";
FiltroServicoTipo filtroST = new FiltroServicoTipo();
filtroST.adicionarParametro(new ParametroSimples(FiltroServicoTipo.ID,id));
Collection colecao = fachada.pesquisar(filtroST,ServicoTipo.class.getName());
if(colecao.size() > 0){
ServicoTipo st = (ServicoTipo)Util.retonarObjetoDeColecao(colecao);
retorno = st.getDescricao();
}
return retorno;
}
@Override
public int calcularTotalRegistrosRelatorio() {
HashMap mapa = this.retornarParametrosContadorOS();
Collection colecaoImovelOS = (Collection) mapa.get("colecaoImovelOS");
String tipoServico = (String) mapa.get("tipoServico");
int retorno = Fachada.getInstancia().obterTotalOSColecaoImovelTipoServico(colecaoImovelOS,new Integer(tipoServico));
//int retorno = 2;
return retorno;
}
public void agendarTarefaBatch() {
AgendadorTarefas.agendarTarefa("RelatorioGerarRelatorioOSAcompanhamentoCobrancaResultado", this);
}
//M�todo auxiliar para repassar os par�metros para o avaliador batch
private HashMap retornarParametrosContadorOS(){
HashMap mapa = new HashMap();
Collection colecaoImovelOS = (Collection)getParametro("colecaoImovelOS");
String tipoServico = (String)getParametro("tipoServico");
mapa.put("colecaoImovelOS",colecaoImovelOS);
mapa.put("tipoServico",tipoServico);
return mapa;
}
}