package gcom.gui.relatorio.cobranca;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import gcom.cadastro.cliente.Cliente;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.cobranca.CobrancaDocumento;
import gcom.cobranca.DocumentoTipo;
import gcom.cobranca.bean.ContaValoresHelper;
import gcom.fachada.Fachada;
import gcom.faturamento.conta.Conta;
import gcom.gui.cobranca.ConsultarDebitoClienteActionForm;
import gcom.relatorio.ExibidorProcessamentoTarefaRelatorio;
import gcom.relatorio.RelatorioVazioException;
import gcom.relatorio.cobranca.RelatorioExtratoDebitoCliente;
import gcom.relatorio.cobranca.parcelamento.ExtratoDebitoRelatorioHelper;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.tarefa.TarefaRelatorio;
import gcom.util.CodigoBarras;
import gcom.util.ConstantesSistema;
import gcom.util.Util;
/**
* Gerar e Emitir Extrato de D�bito por Cliente
* @author Ana Maria
* @date 04/04/2007
*/
public class GerarRelatorioExtratoDebitoClienteAction extends
ExibidorProcessamentoTarefaRelatorio {
private String nomeCliente;
private String cpfCnpj;
private String tipoResponsavel;
private String dataEmissao;
private String debitosACobrar;
private Collection<ContaValoresHelper> colecaoContas;
private BigDecimal valorTotalContas;
private BigDecimal acrescimoImpontualidade;
private BigDecimal valorDocumento;
private String valorContas;
private void init() {
nomeCliente = "";
cpfCnpj = "";
tipoResponsavel = "";
dataEmissao = "";
debitosACobrar = "";
valorContas = "";
colecaoContas = null;
valorTotalContas = new BigDecimal("0.00");
acrescimoImpontualidade = new BigDecimal("0.00");
valorDocumento = new BigDecimal("0.00");
}
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
ActionForward retorno = null;
Fachada fachada = Fachada.getInstancia();
init();
HttpSession sessao = httpServletRequest.getSession(false);
Usuario usuario = (Usuario) sessao.getAttribute("usuarioLogado");
ConsultarDebitoClienteActionForm consultarDebitoClienteActionForm = (ConsultarDebitoClienteActionForm) actionForm;
colecaoContas = (Collection<ContaValoresHelper>)sessao.getAttribute("colecaoContaValores");
acrescimoImpontualidade = Util.formatarMoedaRealparaBigDecimal(sessao.getAttribute("valorAcrescimo").toString());
debitosACobrar = (String)sessao.getAttribute("valorDebitoACobrar");
valorContas = (String)sessao.getAttribute("valorConta");
Map mapContas = retirarContasEmRevisaoDeColecaoContas(colecaoContas);
colecaoContas = (Collection)mapContas.get("colecaoContasSemContasEmRevisao");
BigDecimal valorTotalContasRevisao = (BigDecimal) mapContas.get("valorTotalContasRevisao");
Date maiorDataVencimentoContas = (Date)mapContas.get("maiorDataVencimentoContas");
BigDecimal valorContasBigDecimal = Util.formatarMoedaRealparaBigDecimal(valorContas);
valorContas = Util.formatarMoedaReal(valorContasBigDecimal.subtract(valorTotalContasRevisao));
Integer idCliente = null;
if (consultarDebitoClienteActionForm.possuiCliente()){
idCliente = new Integer(consultarDebitoClienteActionForm.getCodigoCliente());
nomeCliente = consultarDebitoClienteActionForm.getNomeCliente();
cpfCnpj = consultarDebitoClienteActionForm.getCpfCnpj();
} else {
idCliente = new Integer(consultarDebitoClienteActionForm.getCodigoClienteSuperior());
nomeCliente = consultarDebitoClienteActionForm.getNomeClienteSuperior();
cpfCnpj = consultarDebitoClienteActionForm.getCpfCnpj();
}
Cliente cliente = fachada.pesquisarClienteDigitado(idCliente);
if(consultarDebitoClienteActionForm.getTipoRelacao() != null){
tipoResponsavel = consultarDebitoClienteActionForm.getTipoRelacao();
}
RelatorioExtratoDebitoCliente relatorioExtratoDebitoCliente = new RelatorioExtratoDebitoCliente((Usuario)(httpServletRequest.getSession(false)).getAttribute("usuarioLogado"));
String tipo = (String)httpServletRequest.getParameter("tipo");
ExtratoDebitoRelatorioHelper extratoDebitoRelatorioHelper = fachada.gerarEmitirExtratoDebito(
null, new Short("0"), colecaoContas, null, null,
getValorAcrescimos(tipo), new BigDecimal("0.00"), getValorDocumento(tipo), null, cliente,null, null, null);
CobrancaDocumento documentoCobranca = extratoDebitoRelatorioHelper.getColecaoCobrancaDocumentoItemContas().iterator().next().getCobrancaDocumento();
if(cliente.isClienteFederal()){
if(documentoCobranca.getValorImpostos()!=null){
relatorioExtratoDebitoCliente.addParametro("valorTotalImpostos",Util.formatarMoedaReal(documentoCobranca.getValorImpostos()));
}else{
relatorioExtratoDebitoCliente.addParametro("valorTotalImpostos",Util.formatarMoedaReal(new BigDecimal("0.0")));
}
relatorioExtratoDebitoCliente.addParametro("tipoFederal", "sim");
}
String seqDocCobranca = "";
if(httpServletRequest.getParameter("tipo") != null && tipo.equalsIgnoreCase("conta")){
//Linha 3
seqDocCobranca = ""+documentoCobranca.getNumeroSequenciaDocumento();
relatorioExtratoDebitoCliente.addParametro("seqDocCobranca",seqDocCobranca);
//Linha 4
dataEmissao = Util.formatarData(documentoCobranca.getEmissao());
String dataValidade = Util.formatarData(fachada.
obterDataValidadeDocumentoCobranca(documentoCobranca, usuario, maiorDataVencimentoContas));
valorTotalContas = extratoDebitoRelatorioHelper.getValorTotalConta();
//Linha 15
relatorioExtratoDebitoCliente.addParametro("dataValidade", dataValidade);
SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();
if(valorTotalContas!= null && sistemaParametro.getValorExtratoFichaComp() != null
&& !sistemaParametro.getValorExtratoFichaComp().equals(new BigDecimal("0.00"))
&& valorTotalContas.compareTo(sistemaParametro.getValorExtratoFichaComp()) >= 0){
StringBuilder nossoNumero = fachada.obterNossoNumeroFichaCompensacao(
DocumentoTipo.EXTRATO_DE_DEBITO.toString(),documentoCobranca.getId().toString()) ;
String nossoNumeroSemDV = nossoNumero.toString().substring(0,17);
relatorioExtratoDebitoCliente.addParametro("nossoNumero",nossoNumero.toString());
Date dataVencimentoMais75 = Util.adicionarNumeroDiasDeUmaData(new Date(),75);
String fatorVencimento = CodigoBarras.obterFatorVencimento(dataVencimentoMais75);
String especificacaoCodigoBarra = CodigoBarras.
obterEspecificacaoCodigoBarraFichaCompensacao(
ConstantesSistema.CODIGO_BANCO_FICHA_COMPENSACAO,
ConstantesSistema.CODIGO_MOEDA_FICHA_COMPENSACAO,
valorTotalContas, nossoNumeroSemDV.toString(),
ConstantesSistema.CARTEIRA_FICHA_COMPENSACAO, fatorVencimento);
String representacaoNumericaCodigoBarraFichaCompensacao =
CodigoBarras.obterRepresentacaoNumericaCodigoBarraFichaCompensacao(especificacaoCodigoBarra);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarraSemDigito",especificacaoCodigoBarra);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarra",representacaoNumericaCodigoBarraFichaCompensacao);
}else{
String representacaoNumericaCodBarra = "";
representacaoNumericaCodBarra = fachada
.obterRepresentacaoNumericaCodigoBarra(
8,
valorTotalContas,
0,
null,
null,
null,
null,
null,
seqDocCobranca,
documentoCobranca.getDocumentoTipo().getId(),
idCliente, null,null);
String representacaoNumericaCodBarraFormatada = representacaoNumericaCodBarra
.substring(0, 11)
+ "-"
+ representacaoNumericaCodBarra.substring(11, 12)
+ " "
+ representacaoNumericaCodBarra.substring(12, 23)
+ "-"
+ representacaoNumericaCodBarra.substring(23, 24)
+ " "
+ representacaoNumericaCodBarra.substring(24, 35)
+ "-"
+ representacaoNumericaCodBarra.substring(35, 36)
+ " "
+ representacaoNumericaCodBarra.substring(36, 47)
+ "-"
+ representacaoNumericaCodBarra.substring(47, 48);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarra",representacaoNumericaCodBarraFormatada);
String representacaoNumericaCodBarraSemDigito =
representacaoNumericaCodBarra.substring(0, 11)
+ representacaoNumericaCodBarra.substring(12, 23)
+ representacaoNumericaCodBarra.substring(24, 35)
+ representacaoNumericaCodBarra.substring(36, 47);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarraSemDigito",representacaoNumericaCodBarraSemDigito);
}
relatorioExtratoDebitoCliente.addParametro("colecaoDebitoACobrar",null);
relatorioExtratoDebitoCliente.addParametro("colecaoCreditoARealizar",null);
relatorioExtratoDebitoCliente.addParametro("colecaoGuiaPagamentoValores",null);
}else{
seqDocCobranca = ""+documentoCobranca.getNumeroSequenciaDocumento();
relatorioExtratoDebitoCliente.addParametro("seqDocCobranca",seqDocCobranca);
valorTotalContas = Util.formatarMoedaRealparaBigDecimal((String)sessao.getAttribute("valorTotalComAcrescimo"));
relatorioExtratoDebitoCliente.addParametro("debitosACobrar", debitosACobrar);
relatorioExtratoDebitoCliente.addParametro("acrescimoImpontualidade", Util.formatarMoedaReal(acrescimoImpontualidade));
valorTotalContas = valorTotalContas.subtract(valorTotalContasRevisao);
//Linha 4
dataEmissao = Util.formatarData(documentoCobranca.getEmissao());
Collection colecaoDebitoACobrar = (Collection)sessao.getAttribute("colecaoDebitoACobrar");
Collection colecaoCreditoARealizar = (Collection)sessao.getAttribute("colecaoCreditoARealizar");
Collection colecaoGuiaPagamentoValores = (Collection)sessao.getAttribute("colecaoGuiaPagamentoValores");
relatorioExtratoDebitoCliente.addParametro("colecaoDebitoACobrar",colecaoDebitoACobrar);
relatorioExtratoDebitoCliente.addParametro("colecaoCreditoARealizar",colecaoCreditoARealizar);
relatorioExtratoDebitoCliente.addParametro("colecaoGuiaPagamentoValores",colecaoGuiaPagamentoValores);
}
/**
* Data: 14/02/2011
* Gerar codigo de barra para a op��o de extrato de debito total(com acrescimo de impontualidade)
* Mudan�a de posi��o da condi��o a seguir, antes essa opera��o era realizada apenas quando o tipo era conta,
* agora � realizada sempre.
*/
SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();
if(valorTotalContas!= null && sistemaParametro.getValorExtratoFichaComp() != null
&& !sistemaParametro.getValorExtratoFichaComp().equals(new BigDecimal("0.00"))
&& valorTotalContas.compareTo(sistemaParametro.getValorExtratoFichaComp()) >= 0){
StringBuilder nossoNumero = fachada.obterNossoNumeroFichaCompensacao(
DocumentoTipo.EXTRATO_DE_DEBITO.toString(),documentoCobranca.getId().toString()) ;
String nossoNumeroSemDV = nossoNumero.toString().substring(0,17);
relatorioExtratoDebitoCliente.addParametro("nossoNumero",nossoNumero.toString());
Date dataVencimentoMais75 = Util.adicionarNumeroDiasDeUmaData(new Date(),75);
String fatorVencimento = CodigoBarras.obterFatorVencimento(dataVencimentoMais75);
String especificacaoCodigoBarra = CodigoBarras.
obterEspecificacaoCodigoBarraFichaCompensacao(
ConstantesSistema.CODIGO_BANCO_FICHA_COMPENSACAO,
ConstantesSistema.CODIGO_MOEDA_FICHA_COMPENSACAO,
valorTotalContas, nossoNumeroSemDV.toString(),
ConstantesSistema.CARTEIRA_FICHA_COMPENSACAO, fatorVencimento);
String representacaoNumericaCodigoBarraFichaCompensacao =
CodigoBarras.obterRepresentacaoNumericaCodigoBarraFichaCompensacao(especificacaoCodigoBarra);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarraSemDigito",especificacaoCodigoBarra);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarra",representacaoNumericaCodigoBarraFichaCompensacao);
}else{
String representacaoNumericaCodBarra = "";
representacaoNumericaCodBarra = fachada
.obterRepresentacaoNumericaCodigoBarra(
8,
valorTotalContas,
0,
null,
null,
null,
null,
null,
seqDocCobranca,
documentoCobranca.getDocumentoTipo().getId(),
idCliente, null,null);
String representacaoNumericaCodBarraFormatada = representacaoNumericaCodBarra
.substring(0, 11)
+ "-"
+ representacaoNumericaCodBarra.substring(11, 12)
+ " "
+ representacaoNumericaCodBarra.substring(12, 23)
+ "-"
+ representacaoNumericaCodBarra.substring(23, 24)
+ " "
+ representacaoNumericaCodBarra.substring(24, 35)
+ "-"
+ representacaoNumericaCodBarra.substring(35, 36)
+ " "
+ representacaoNumericaCodBarra.substring(36, 47)
+ "-"
+ representacaoNumericaCodBarra.substring(47, 48);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarra",representacaoNumericaCodBarraFormatada);
String representacaoNumericaCodBarraSemDigito =
representacaoNumericaCodBarra.substring(0, 11)
+ representacaoNumericaCodBarra.substring(12, 23)
+ representacaoNumericaCodBarra.substring(24, 35)
+ representacaoNumericaCodBarra.substring(36, 47);
relatorioExtratoDebitoCliente.addParametro("representacaoNumericaCodBarraSemDigito",representacaoNumericaCodBarraSemDigito);
}
relatorioExtratoDebitoCliente.addParametro("nomeCliente",nomeCliente);
relatorioExtratoDebitoCliente.addParametro("codigoClienteResponsavel", idCliente.toString());
relatorioExtratoDebitoCliente.addParametro("cpfCnpj", cpfCnpj);
relatorioExtratoDebitoCliente.addParametro("enderecoCliente", consultarDebitoClienteActionForm.getEnderecoCliente());
relatorioExtratoDebitoCliente.addParametro("tipoResponsavel", tipoResponsavel);
relatorioExtratoDebitoCliente.addParametro("dataEmissao",dataEmissao);
relatorioExtratoDebitoCliente.addParametro("valorContas",valorContas);
BigDecimal valorGuiasPagamento = Util.formatarMoedaRealparaBigDecimal( sessao.getAttribute("valorGuiaPagamento").toString() );
relatorioExtratoDebitoCliente.addParametro("valorGuiasPagamento", Util.formatarMoedaReal( valorGuiasPagamento ) );
BigDecimal valorDescontosCreditos = Util.formatarMoedaRealparaBigDecimal( sessao.getAttribute("valorCreditoARealizar").toString() );
relatorioExtratoDebitoCliente.addParametro("valorDescontosCreditos", Util.formatarMoedaReal( valorDescontosCreditos ) );
relatorioExtratoDebitoCliente.addParametro("valorTotalContas", Util.formatarMoedaReal(valorTotalContas));
relatorioExtratoDebitoCliente.addParametro("colecaoContas",colecaoContas);
String tipoRelatorio = TarefaRelatorio.TIPO_PDF + "";
relatorioExtratoDebitoCliente.addParametro("tipoFormatoRelatorio", Integer.parseInt(tipoRelatorio));
try {
retorno = processarExibicaoRelatorio(relatorioExtratoDebitoCliente,
tipoRelatorio, httpServletRequest, httpServletResponse,
actionMapping);
} catch (RelatorioVazioException ex) {
// manda o erro para a p�gina no request atual
reportarErros(httpServletRequest, "atencao.relatorio.vazio");
// seta o mapeamento de retorno para a tela de aten��o de popup
retorno = actionMapping.findForward("telaAtencaoPopup");
}
return retorno;
}
private Map retirarContasEmRevisaoDeColecaoContas(Collection<ContaValoresHelper> colecaoContas){
Map retorno = new HashMap();
BigDecimal valorTotalContasRevisao = BigDecimal.ZERO;
Collection<ContaValoresHelper> colecaoContasSemContasEmRevisao = new ArrayList<ContaValoresHelper>();
Date maiorDataVencimentoContas = Util.converteStringParaDate("01/01/0001");
if (colecaoContas != null && !colecaoContas.isEmpty()) {
Iterator iter = colecaoContas.iterator();
while (iter.hasNext()) {
ContaValoresHelper contaValoresHelper = (ContaValoresHelper) iter.next();
Conta conta = contaValoresHelper.getConta();
if (conta.getContaMotivoRevisao() != null){
valorTotalContasRevisao = valorTotalContasRevisao.
add(contaValoresHelper.getValorTotalConta());
}else{
colecaoContasSemContasEmRevisao.add(contaValoresHelper);
if(Util.compararData(conta.getDataVencimentoConta(),maiorDataVencimentoContas) == 1){
maiorDataVencimentoContas = conta.getDataVencimentoConta();
}
}
}
}
retorno.put("colecaoContasSemContasEmRevisao",colecaoContasSemContasEmRevisao);
retorno.put("valorTotalContasRevisao",valorTotalContasRevisao);
retorno.put("maiorDataVencimentoContas",maiorDataVencimentoContas);
return retorno;
}
private BigDecimal getValorAcrescimos(String tipo) {
BigDecimal acrescimo = new BigDecimal(0.00);
if (tipo != null && tipo.equals("total")) {
acrescimo = acrescimoImpontualidade;
}
return acrescimo;
}
private BigDecimal getValorDocumento(String tipo) {
BigDecimal valorDocumento = new BigDecimal(0.00);
if (tipo != null) {
if (tipo.equals("total")) {
valorDocumento = Util.formatarMoedaRealparaBigDecimal(valorContas).add(acrescimoImpontualidade);
} else if (tipo.equals("conta")) {
valorDocumento = Util.formatarMoedaRealparaBigDecimal(valorContas);
}
}
return valorDocumento;
}
}