package gcom.faturamento;
import gcom.cadastro.imovel.Categoria;
import gcom.cadastro.imovel.ControladorImovelLocal;
import gcom.cadastro.imovel.ControladorImovelLocalHome;
import gcom.cadastro.imovel.Imovel;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.faturamento.bean.ApagarDadosFaturamentoHelper;
import gcom.faturamento.bean.DeterminarValoresFaturamentoAguaEsgotoHelper;
import gcom.faturamento.credito.CreditoARealizar;
import gcom.faturamento.credito.CreditoARealizarCategoria;
import gcom.faturamento.credito.CreditoARealizarCategoriaPK;
import gcom.faturamento.credito.CreditoARealizarGeral;
import gcom.faturamento.credito.CreditoOrigem;
import gcom.faturamento.credito.CreditoTipo;
import gcom.faturamento.debito.DebitoCreditoSituacao;
import gcom.financeiro.lancamento.LancamentoItemContabil;
import gcom.micromedicao.ControladorMicromedicaoLocal;
import gcom.micromedicao.ControladorMicromedicaoLocalHome;
import gcom.micromedicao.consumo.ConsumoHistorico;
import gcom.micromedicao.consumo.ConsumoTipo;
import gcom.micromedicao.consumo.LigacaoTipo;
import gcom.util.ConstantesJNDI;
import gcom.util.ConstantesSistema;
import gcom.util.ControladorException;
import gcom.util.ControladorUtilLocal;
import gcom.util.ControladorUtilLocalHome;
import gcom.util.ErroRepositorioException;
import gcom.util.ServiceLocator;
import gcom.util.ServiceLocatorException;
import gcom.util.SistemaException;
import gcom.util.Util;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import javax.ejb.CreateException;
import javax.ejb.SessionContext;
/**
* Esta classe tem como finalidade encapsular o caso de uso [UC0876] - Gerar Cr�dito Situa��o Especial
* de Faturamento, gerando maior facilidade na manuten��o do mesmo.
*
* @author Raphael Rossiter
* @date 22/01/2009
*/
public class UC0876GerarCreditoSituacaoEspecialFaturamento {
private static UC0876GerarCreditoSituacaoEspecialFaturamento instancia;
@SuppressWarnings("unused")
private IRepositorioFaturamento repositorioFaturamento;
@SuppressWarnings("unused")
private SessionContext sessionContext;
private UC0876GerarCreditoSituacaoEspecialFaturamento(IRepositorioFaturamento repositorioFaturamento,
SessionContext sessionContext) {
this.repositorioFaturamento = repositorioFaturamento;
this.sessionContext = sessionContext;
}
public static UC0876GerarCreditoSituacaoEspecialFaturamento getInstancia(IRepositorioFaturamento repositorioFaturamento,
SessionContext sessionContext) {
if (instancia == null) {
instancia = new UC0876GerarCreditoSituacaoEspecialFaturamento(repositorioFaturamento, sessionContext);
}
return instancia;
}
/**
* Controlador Imovel
*
* @author Raphael Rossiter
* @date 22/01/2009
*
* @return ControladorImovelLocal
*/
protected ControladorImovelLocal getControladorImovel() {
ControladorImovelLocalHome localHome = null;
ControladorImovelLocal local = null;
ServiceLocator locator = null;
try {
locator = ServiceLocator.getInstancia();
localHome = (ControladorImovelLocalHome) locator
.getLocalHome(ConstantesJNDI.CONTROLADOR_IMOVEL_SEJB);
// guarda a referencia de um objeto capaz de fazer chamadas �
// objetos remotamente
local = localHome.create();
return local;
} catch (CreateException e) {
throw new SistemaException(e);
} catch (ServiceLocatorException e) {
throw new SistemaException(e);
}
}
/**
* Controlador Micromedicao
*
* @author Raphael Rossiter
* @date 22/01/2009
*
* @return ControladorMicromedicaoLocal
*/
protected ControladorMicromedicaoLocal getControladorMicromedicao() {
ControladorMicromedicaoLocalHome localHome = null;
ControladorMicromedicaoLocal local = null;
ServiceLocator locator = null;
try {
locator = ServiceLocator.getInstancia();
localHome = (ControladorMicromedicaoLocalHome) locator
.getLocalHomePorEmpresa(ConstantesJNDI.CONTROLADOR_MICROMEDICAO_SEJB);
// guarda a referencia de um objeto capaz de fazer chamadas �
// objetos remotamente
local = localHome.create();
return local;
} catch (CreateException e) {
throw new SistemaException(e);
} catch (ServiceLocatorException e) {
throw new SistemaException(e);
}
}
/**
* Controlador Faturamento
*
* @author Raphael Rossiter
* @date 22/01/2009
*
* @return ControladorFaturamentoLocal
*/
protected ControladorFaturamentoLocal getControladorFaturamento() {
ControladorFaturamentoLocalHome localHome = null;
ControladorFaturamentoLocal local = null;
ServiceLocator locator = null;
try {
locator = ServiceLocator.getInstancia();
localHome = (ControladorFaturamentoLocalHome) locator
.getLocalHomePorEmpresa(ConstantesJNDI.CONTROLADOR_FATURAMENTO_SEJB);
// guarda a referencia de um objeto capaz de fazer chamadas �
// objetos remotamente
local = localHome.create();
return local;
} catch (CreateException e) {
throw new SistemaException(e);
} catch (ServiceLocatorException e) {
throw new SistemaException(e);
}
}
/**
* Controlador Util
*
* @author Raphael Rossiter
* @date 22/01/2009
*
* @return ControladorUtilLocal
*/
protected ControladorUtilLocal getControladorUtil() {
ControladorUtilLocalHome localHome = null;
ControladorUtilLocal local = null;
ServiceLocator locator = null;
try {
locator = ServiceLocator.getInstancia();
localHome = (ControladorUtilLocalHome) locator
.getLocalHome(ConstantesJNDI.CONTROLADOR_UTIL_SEJB);
// guarda a referencia de um objeto capaz de fazer chamadas �
// objetos remotamente
local = localHome.create();
return local;
} catch (CreateException e) {
throw new SistemaException(e);
} catch (ServiceLocatorException e) {
throw new SistemaException(e);
}
}
/**
* [UC0876] - Gerar Cr�dito Situa��o Especial Faturamento
*
* @author Raphael Rossiter
* @date 23/01/2009
*
* @param imovel
* @param faturamentoGrupo
* @param sistemaParametro
* @throws ControladorException
*/
public void gerarCreditoSituacaoEspecialFaturamentoImovel(Imovel imovel, FaturamentoGrupo faturamentoGrupo,
SistemaParametro sistemaParametro,int atividade) throws ControladorException {
/*
* CASO O IM�VEL ESTEJA COM A SITUA��O ESPECIAL DE FATURAMENTO IGUAL
* "Situa��o Especial de Nitrato" (C�digo 10) (FTST_ID da tabela IMOVEL com valor igual a 10)
*/
if (imovel.getFaturamentoSituacaoTipo() != null &&
imovel.getFaturamentoSituacaoTipo().getId().equals(FaturamentoSituacaoTipo.NITRATO)) {
// [UC0108] - Obter Quantidade de Economias por Categoria
Collection colecaoCategorias = this.getControladorImovel().obterQuantidadeEconomiasCategoria(imovel);
Collection colecaoCategoriaOUSubcategoria = getControladorImovel().obterColecaoCategoriaOuSubcategoriaDoImovel(imovel);
//Caso a atividade seja gerar dados para leitura, � gerado um credito a realizar com o valor zerado,
//e a situa��o do d�bito cr�dito fica como pr�-faturada
if(atividade == FaturamentoAtividade.GERAR_ARQUIVO_LEITURA){
BigDecimal valorCredito = new BigDecimal("0.00");
Integer idDebitoCreditoSituacaoAtual = DebitoCreditoSituacao.PRE_FATURADA;
//GERANDO O CR�DITO A REALIZAR
this.gerarCreditoARealizarImovel(imovel, faturamentoGrupo.getAnoMesReferencia(), valorCredito,
colecaoCategorias, sistemaParametro,idDebitoCreditoSituacaoAtual);
}else{
Integer idDebitoCreditoSituacaoAtual = DebitoCreditoSituacao.NORMAL;
Object[] dadosCreditoARealizar = null;
try{
dadosCreditoARealizar = repositorioFaturamento.pesquisarCreditoARealizar(imovel.getId(),CreditoTipo.CREDITO_NITRATO,
idDebitoCreditoSituacaoAtual,faturamentoGrupo.getAnoMesReferencia());
} catch (ErroRepositorioException ex) {
sessionContext.setRollbackOnly();
new ControladorException("erro.sistema", ex);
}
//Caso o cr�dito n�o tenha sido atualizado, n�o tenha sido atualizado o cr�dito de nitrato por impress�o simult�nea,
//atualiza o cr�dito de nitrato.
if(dadosCreditoARealizar == null || dadosCreditoARealizar.equals("") ){
//Inicializando o objeto que armazenar� as informa��es que ser�o utilizadas no c�lculo da conta
DeterminarValoresFaturamentoAguaEsgotoHelper helperValoresAguaEsgoto =
new DeterminarValoresFaturamentoAguaEsgotoHelper();
//Obtendo os consumos de �gua e esgoto do im�vel a ser faturado
//LIGACAO_TIPO_AGUA
LigacaoTipo ligacaoTipoAgua = new LigacaoTipo();
ligacaoTipoAgua.setId(LigacaoTipo.LIGACAO_AGUA);
// LIGACAO_TIPO_ESGOTO
LigacaoTipo ligacaoTipoEsgoto = new LigacaoTipo();
ligacaoTipoEsgoto.setId(LigacaoTipo.LIGACAO_ESGOTO);
//CONSUMO_HISTORICO_AGUA
ConsumoHistorico consumoHistoricoAgua = this.getControladorMicromedicao()
.obterConsumoHistoricoMedicaoIndividualizada(imovel, ligacaoTipoAgua,
faturamentoGrupo.getAnoMesReferencia());
Integer consumoAgua = null;
ConsumoTipo consumoTipoAgua = null;
if (consumoHistoricoAgua != null){
consumoAgua = consumoHistoricoAgua.getNumeroConsumoFaturadoMes();
consumoTipoAgua = consumoHistoricoAgua.getConsumoTipo();
}
//CONSUMO_HISTORICO_ESGOTO
ConsumoHistorico consumoHistoricoEsgoto = this.getControladorMicromedicao()
.obterConsumoHistoricoMedicaoIndividualizada(imovel, ligacaoTipoEsgoto,
faturamentoGrupo.getAnoMesReferencia());
Integer consumoEsgoto = null;
ConsumoTipo consumoTipoEsgoto = null;
if (consumoHistoricoEsgoto != null){
consumoEsgoto = consumoHistoricoEsgoto.getNumeroConsumoFaturadoMes();
consumoTipoEsgoto = consumoHistoricoEsgoto.getConsumoTipo();
}
if (this.getControladorFaturamento().permiteFaturamentoParaAgua(imovel.getLigacaoAguaSituacao(),
consumoAgua, consumoTipoAgua) ||
this.getControladorFaturamento().permiteFaturamentoParaEsgoto(imovel.getLigacaoEsgotoSituacao(),
consumoEsgoto, consumoTipoEsgoto)) {
//Determinar Valores para Faturamento de �gua e/ou Esgoto
helperValoresAguaEsgoto = this.getControladorFaturamento()
.determinarValoresFaturamentoAguaEsgoto(imovel, faturamentoGrupo.getAnoMesReferencia(),
colecaoCategoriaOUSubcategoria, faturamentoGrupo, consumoHistoricoAgua, consumoHistoricoEsgoto);
}
/*
* O sistema calcula 50% do valor calculado da �gua e gera um cr�dito a realizar para cada
* um dos im�veis selecionados
*/
if (helperValoresAguaEsgoto.getValorTotalAgua().compareTo(ConstantesSistema.VALOR_ZERO) == 1) {
BigDecimal valorCredito =
helperValoresAguaEsgoto.getValorTotalAgua().divide(new BigDecimal(2));
//GERANDO O CR�DITO A REALIZAR
this.gerarCreditoARealizarImovel(imovel, faturamentoGrupo.getAnoMesReferencia(), valorCredito,
colecaoCategorias, sistemaParametro,idDebitoCreditoSituacaoAtual);
}
}
}
}
}
/**
* [UC0876] - Gerar Cr�dito Situa��o Especial Faturamento
*
* @author Raphael Rossiter
* @date 23/01/2009
*
* @param imovel
* @param anoMesFaturamento
* @param valorCredito
* @param colecaoCategoria
* @param sistemaParametro
* @throws ControladorException
*/
protected void gerarCreditoARealizarImovel(Imovel imovel, Integer anoMesFaturamento,
BigDecimal valorCredito, Collection colecaoCategoria, SistemaParametro sistemaParametro,int idDebitoCreditoSituacaoAtual) throws ControladorException{
//CREDITO_A_REALIZAR_GERAL
//=====================================================================================================
CreditoARealizarGeral creditoARealizarGeral = new CreditoARealizarGeral();
creditoARealizarGeral.setIndicadorHistorico(ConstantesSistema.NAO);
creditoARealizarGeral.setUltimaAlteracao(new Date());
//INSERINDO NA BASE
Integer idCreditoARealizarGeral = (Integer) this
.getControladorUtil().inserir(creditoARealizarGeral);
creditoARealizarGeral.setId(idCreditoARealizarGeral);
//=====================================================================================================
//CREDITO_A_REALIZAR
//=====================================================================================================
CreditoARealizar creditoARealizar = new CreditoARealizar();
creditoARealizar.setCreditoARealizarGeral(creditoARealizarGeral);
creditoARealizar.setId(idCreditoARealizarGeral);
//IMOVEL
creditoARealizar.setImovel(imovel);
//CREDITO_TIPO
CreditoTipo creditoTipo = new CreditoTipo();
creditoTipo.setId(CreditoTipo.CREDITO_NITRATO);
creditoARealizar.setCreditoTipo(creditoTipo);
//GERACAO_CREDITO
creditoARealizar.setGeracaoCredito(new Date());
//REFERENCIA_CREDITO
creditoARealizar.setAnoMesReferenciaCredito(anoMesFaturamento);
//REFERENCIA COBRANCA
creditoARealizar.setAnoMesCobrancaCredito(sistemaParametro.getAnoMesArrecadacao());
//REFERENCIA CONTABIL
creditoARealizar.setAnoMesReferenciaContabil(sistemaParametro.getAnoMesFaturamento());
//VALOR CREDITO
creditoARealizar.setValorCredito(valorCredito);
//VALOR RESIDUAL MES ANTERIOR
creditoARealizar.setValorResidualMesAnterior(BigDecimal.ZERO);
//NUMERO PRESTACAO
creditoARealizar.setNumeroPrestacaoCredito(new Short("1"));
//PRESTACOES REALIZADAS
creditoARealizar.setNumeroPrestacaoRealizada(new Short("0"));
//LOCALIDADE
creditoARealizar.setLocalidade(imovel.getLocalidade());
//QUADRA
creditoARealizar.setQuadra(imovel.getQuadra());
//CODIGO_SETOR_COMERCIAL
creditoARealizar.setCodigoSetorComercial(imovel.getSetorComercial().getCodigo());
//NUMERO_QUADRA
creditoARealizar.setNumeroQuadra(imovel.getQuadra().getNumeroQuadra());
//LOTE
creditoARealizar.setNumeroLote(imovel.getLote());
//SUBLOTE
creditoARealizar.setNumeroSubLote(imovel.getSubLote());
//LANCAMENTO_ITEM_CONTABIL
LancamentoItemContabil lancamentoItemContabil = new LancamentoItemContabil();
lancamentoItemContabil.setId(LancamentoItemContabil.ACRESCIMOS_POR_IMPONTUALIDADE);
creditoARealizar.setLancamentoItemContabil(lancamentoItemContabil);
//DEBITO_CREDITO_SITUACAO_ATUAL
DebitoCreditoSituacao debitoCreditoSituacaoAtual = new DebitoCreditoSituacao();
debitoCreditoSituacaoAtual.setId(idDebitoCreditoSituacaoAtual);
creditoARealizar.setDebitoCreditoSituacaoAtual(debitoCreditoSituacaoAtual);
//CREDITO_ORIGEM
CreditoOrigem creditoOrigem = new CreditoOrigem();
creditoOrigem.setId(CreditoOrigem.SERVICOS_INDIRETOS_PAGOS_INDEVIDAMENTE);
creditoARealizar.setCreditoOrigem(creditoOrigem);
creditoARealizar.setUltimaAlteracao(new Date());
//INSERINDO NA BASE
this.getControladorUtil().inserir(creditoARealizar);
//=====================================================================================================
//CREDITO_A_REALIZAR_CATEGORIA
//=====================================================================================================
if (colecaoCategoria != null && !colecaoCategoria.isEmpty()){
Iterator iteratorCategoria = colecaoCategoria.iterator();
//[UC0185] - Obter Valor por Categoria
Collection colecaoValorPorCategoria = this.getControladorImovel()
.obterValorPorCategoria(colecaoCategoria, valorCredito);
Iterator iteratorValorPorCategoria = colecaoValorPorCategoria.iterator();
while (iteratorCategoria.hasNext()){
Categoria categoria = (Categoria) iteratorCategoria.next();
BigDecimal valorPorCategoria = (BigDecimal) iteratorValorPorCategoria.next();
CreditoARealizarCategoria creditoARealizarCategoria = new CreditoARealizarCategoria();
//PK
CreditoARealizarCategoriaPK creditoARealizarCategoriaPK = new CreditoARealizarCategoriaPK();
creditoARealizarCategoriaPK.setCategoriaId(categoria.getId());
creditoARealizarCategoriaPK.setCreditoARealizarId(creditoARealizar.getId());
creditoARealizarCategoria.setComp_id(creditoARealizarCategoriaPK);
//CREDITO_A_REALIZAR
creditoARealizarCategoria.setCreditoARealizar(creditoARealizar);
//CATEGORIA
creditoARealizarCategoria.setCategoria(categoria);
//QUANTIDADE_ECONOMIAS_CATEGORIA
creditoARealizarCategoria.setQuantidadeEconomia(categoria.getQuantidadeEconomiasCategoria());
//VALOR_POR_CATEGORIA
creditoARealizarCategoria.setValorCategoria(valorPorCategoria);
creditoARealizarCategoria.setUltimaAlteracao(new Date());
//INSERINDO NA BASE
this.getControladorUtil().inserir(creditoARealizarCategoria);
}
}
//=====================================================================================================
}
/**
* [UC0876] - Gerar Cr�dito Situa��o Especial Faturamento
*
* @author Raphael Rossiter
* @date 27/01/2009
*
* @param helper
* @throws ControladorException
*/
public void apagarDadosGeradosCreditoSituacaoEspecialFaturamento(ApagarDadosFaturamentoHelper helper)
throws ControladorException {
/*
* Retorna a quantidade de cr�ditos a realizar existentes para uma rota em um determinado anoM�s de
* refer�ncia e de acordo com o tipo de cr�dito recebido.
*/
Integer quantidadeCreditosARealizar = null;
try {
quantidadeCreditosARealizar = repositorioFaturamento.quantidadeCreditosARealizarRota(
helper.getAnoMesFaturamento(), helper.getRota(), helper.getIdCreditoTipo());
} catch (ErroRepositorioException e) {
throw new ControladorException("erro.sistema", e);
}
if (quantidadeCreditosARealizar != null && quantidadeCreditosARealizar.intValue() > 0) {
/*
* Caso a situa��o atual N�O seja PR�-FATURAMENTO:
*
* DELETAR apenas os cr�ditos com data de gera��o entre a data atual menos 3 dias e a data atual
* Desenvolvedor: Raphael Rossiter em 27/01/2009
* Analista: Aryed Lins
*/
if (!helper.getIdDebitoCreditoSituacaoAtual().equals(DebitoCreditoSituacao.PRE_FATURADA)){
helper.setDataEmissaoInicial(Util.subtrairNumeroDiasDeUmaData(new Date(), 3));
helper.setDataEmissaoFinal(Util.adaptarDataFinalComparacaoBetween(new Date()));
}
try {
// deleta CREDITO_A_REALIZAR_CATEGORIA
repositorioFaturamento.apagarCreditoARealizarCategoria(helper);
// update CREDITO_A_REALIZAR_GERAL
repositorioFaturamento.atualizarCreditoARealizarGeral(helper);
// deleta CREDITO_A_REALIZAR
repositorioFaturamento.apagarCreditoARealizar(helper);
// delete CREDITO_A_REALIZAR_GERAL
repositorioFaturamento.apagarCreditoARealizarGeral(helper);
} catch (ErroRepositorioException e) {
throw new ControladorException("erro.sistema", e);
}
}
}
}