package gcom.gui.arrecadacao.pagamento;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
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 org.apache.struts.validator.DynaValidatorActionForm;
import gcom.arrecadacao.bean.PagamentoHelperCodigoBarras;
import gcom.arrecadacao.bean.RegistroHelperFichaCompensacao;
import gcom.arrecadacao.pagamento.bean.InserirPagamentoViaCanetaHelper;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.util.CodigoBarras;
import gcom.util.ConstantesSistema;
import gcom.util.Util;
/**
* @author Raphael Rossiter
* @date 25/11/2010
*/
public class ExibirInserirPagamentosTipoInclusaoFichaCompensacaoAction extends GcomAction {
/**
* Inserir pagamentos no sistema
*
* [UC0265] Inserir Pagamentos
*
* @author Raphael Rossiter
* @date 26/11/2010
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
//Seta o mapeamento de retorno de retorno para po iniserir pagamento por caneta
ActionForward retorno = actionMapping.findForward("inserirPagamentosTipoInclusaoFichaCompensacao");
//Recupera o form de pagamento
DynaValidatorActionForm pagamentoActionForm = (DynaValidatorActionForm) actionForm;
//Cria uma inst�ncia da sess�o
HttpSession sessao = httpServletRequest.getSession(false);
//Cria uma inst�ncia da fachada
Fachada fachada = Fachada.getInstancia();
//Usuario Logado
Usuario usuarioLogado = (Usuario) sessao.getAttribute("usuarioLogado");
//Verifica se o usu�rio selecionou um documento para remo��o da cole�a�de c�dgos de barra
String codigoBarraRemocao = httpServletRequest.getParameter("codigoBarraRemocao");
//Recupera a data do pagamento e verifica se a data � uma data v�lida
//Caso contr�rio levanta uma exce��o para o usu�rio indicando que a data de
//pagamento n�o � uma data v�lida
String dataPagamentoString = (String)pagamentoActionForm.get("dataPagamento");
Date dataPagamento = null;
SimpleDateFormat dataFormato = new SimpleDateFormat("dd/MM/yyyy");
try {
dataPagamento = dataFormato.parse(dataPagamentoString);
} catch (ParseException ex) {
throw new ActionServletException("atencao.data_pagamento_invalida");
}
//Recupera o c�digo da forma de arrecada��o
String idFormaArrecadacao = (String)pagamentoActionForm.get("idFormaArrecadacao");
//Recupera os par�metros do sistemas
SistemaParametro sistemaParametro = fachada.pesquisarParametrosDoSistema();
//Recupera a cole��o dos objetos que armazenam as informa��es necess�rias dos c�digos de barra
Collection<InserirPagamentoViaCanetaHelper> colecaoInserirPagamentoViaCanetaHelper = (Collection<InserirPagamentoViaCanetaHelper>) sessao.getAttribute("colecaoInserirPagamentoViaCanetaHelper");
//Se nenhum documento de c�digo de barra na sess�o
if(colecaoInserirPagamentoViaCanetaHelper == null ){
//Inst�ncia a cole��o de documentos
colecaoInserirPagamentoViaCanetaHelper = new ArrayList();
//Caso exista documentos de c�digo de barra na sess�o
}else if(!colecaoInserirPagamentoViaCanetaHelper.isEmpty()){
//Verifica se o usu�rio indicou um documento para ser removido da cole��o
if(codigoBarraRemocao != null && !codigoBarraRemocao.trim().equalsIgnoreCase("")){
Iterator iteratorRemocaoCodigoBarra = colecaoInserirPagamentoViaCanetaHelper.iterator();
//La�o para encontrar o documento para ser removido
lacoWhile : while(iteratorRemocaoCodigoBarra.hasNext()){
//Recupera o documento do iterator
InserirPagamentoViaCanetaHelper inserirPagamentoViaCanetaHelperParaRemocao = (InserirPagamentoViaCanetaHelper) iteratorRemocaoCodigoBarra.next();
//Se o c�digo de barra indicado pelo usu�rio for igual ao
//c�digo de barra do documento
if(inserirPagamentoViaCanetaHelperParaRemocao.getCodigoBarra().equalsIgnoreCase(codigoBarraRemocao)){
//Remove o documento e termina o la�o
iteratorRemocaoCodigoBarra.remove();
break lacoWhile;
}
}
}
}
//Cria a vari�vel que vai armazenar o valor do pagamento
BigDecimal valorPagamento = null;
//Cria a vari�vel que vai armazenar o c�digo de barras
String codigoBarra = null;
//Cria as vari�veis que v�o armazenar o c�digo de barra separado por campos
//e seus respectivos d�gitos verificadores se existirem
String codigoBarraDigitadoCampo1 = null;
String codigoBarraDigitadoCampo1Parte1 = null;
String codigoBarraDigitadoCampo1Parte2 = null;
String codigoBarraDigitadoCampo2 = null;
String codigoBarraDigitadoCampo2Parte1 = null;
String codigoBarraDigitadoCampo2Parte2 = null;
String codigoBarraDigitadoCampo3 = null;
String codigoBarraDigitadoCampo3Parte1 = null;
String codigoBarraDigitadoCampo3Parte2 = null;
String codigoBarraDigitadoDigitoVerificador = null;
String codigoBarraDigitadoCampo4 = null;
//Verifica se o c�digo de barras foi lido por caneta �ptica
String codigoBarraLeituraOtica = (String)pagamentoActionForm.get("codigoBarraPorLeituraOtica");
//Caso o c�digo de barras foi indicado por leitura �tica, recupera todos os campos do c�digo de barra
//Caso contr�rio recupera os campos de c�digo de barra digitado e seus d�gitos verificadores
if(codigoBarraLeituraOtica != null && !codigoBarraLeituraOtica.equalsIgnoreCase("")){
//PRIMEIRO QUADRANTE
/*codigoBarraDigitadoCampo1Parte1 = codigoBarraLeituraOtica.substring(0,5);
codigoBarraDigitadoCampo1Parte2 = codigoBarraLeituraOtica.substring(5,10);
codigoBarraDigitadoCampo1 = codigoBarraDigitadoCampo1Parte1 + codigoBarraDigitadoCampo1Parte2;
//SEGUNDO QUADRANTE
codigoBarraDigitadoCampo2Parte1 = codigoBarraLeituraOtica.substring(10,15);
codigoBarraDigitadoCampo2Parte2 = codigoBarraLeituraOtica.substring(15,21);
codigoBarraDigitadoCampo2 = codigoBarraDigitadoCampo2Parte1 + codigoBarraDigitadoCampo2Parte2;
//TERCEIRO QUADRANTE
codigoBarraDigitadoCampo3Parte1 = codigoBarraLeituraOtica.substring(21,26);
codigoBarraDigitadoCampo3Parte2 = codigoBarraLeituraOtica.substring(26,32);
codigoBarraDigitadoCampo3 = codigoBarraDigitadoCampo3Parte1 + codigoBarraDigitadoCampo3Parte2;
//D�GITO VERIFICADOR DO M�DULO 11
codigoBarraDigitadoDigitoVerificador = codigoBarraLeituraOtica.substring(32,33);
//FATOR DE VENCIMENTO E VALOR DO T�TULO
codigoBarraDigitadoCampo4 = codigoBarraLeituraOtica.substring(33,47);*/
codigoBarra = CodigoBarras.obterRepresentacaoNumericaCodigoBarraFichaCompensacao(codigoBarraLeituraOtica);
codigoBarra = codigoBarra.replace(".", "");
codigoBarra = codigoBarra.replace(" ", "");
}
else{
//PRIMEIRO QUADRANTE
codigoBarraDigitadoCampo1Parte1 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo1Parte1");
if (pagamentoActionForm.get("codigoBarraDigitadoCampo1Parte2") != null &&
((String)pagamentoActionForm.get("codigoBarraDigitadoCampo1Parte2")).length() == 5){
codigoBarraDigitadoCampo1Parte2 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo1Parte2");
codigoBarraDigitadoCampo1 = codigoBarraDigitadoCampo1Parte1 + codigoBarraDigitadoCampo1Parte2;
}
else{
codigoBarraDigitadoCampo1Parte2 = "";
codigoBarraDigitadoCampo1 = "";
}
//SEGUNDO QUADRANTE
codigoBarraDigitadoCampo2Parte1 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo2Parte1");
if (pagamentoActionForm.get("codigoBarraDigitadoCampo2Parte2") != null &&
((String)pagamentoActionForm.get("codigoBarraDigitadoCampo2Parte2")).length() == 6){
codigoBarraDigitadoCampo2Parte2 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo2Parte2");
codigoBarraDigitadoCampo2 = codigoBarraDigitadoCampo2Parte1 + codigoBarraDigitadoCampo2Parte2;
}
else{
codigoBarraDigitadoCampo2Parte2 = "";
codigoBarraDigitadoCampo2 = "";
}
//TERCEIRO QUADRANTE
codigoBarraDigitadoCampo3Parte1 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo3Parte1");
if (pagamentoActionForm.get("codigoBarraDigitadoCampo3Parte2") != null &&
((String)pagamentoActionForm.get("codigoBarraDigitadoCampo3Parte2")).length() == 6){
codigoBarraDigitadoCampo3Parte2 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo3Parte2");
codigoBarraDigitadoCampo3 = codigoBarraDigitadoCampo3Parte1 + codigoBarraDigitadoCampo3Parte2;
}
else{
codigoBarraDigitadoCampo3Parte2 = "";
codigoBarraDigitadoCampo3 = "";
}
//D�GITO VERIFICADOR DO M�DULO 11
codigoBarraDigitadoDigitoVerificador = (String)pagamentoActionForm.get("codigoBarraDigitadoDigitoVerificador");
//FATOR DE VENCIMENTO E VALOR DO T�TULO
codigoBarraDigitadoCampo4 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo4");
//Monta o c�digo de barra sem os d�gitos verificadores
codigoBarra = codigoBarraDigitadoCampo1 +
codigoBarraDigitadoCampo2 +
codigoBarraDigitadoCampo3 +
codigoBarraDigitadoDigitoVerificador +
codigoBarraDigitadoCampo4 ;
}
//Se o c�digo de barra n�o estiver vazio e o tamanho for igual a 44(quarenta e quatro)
if(codigoBarra != null && !codigoBarra.trim().equalsIgnoreCase("") && codigoBarra.trim().length() == 47){
//Caso o usu�rio n�o tenha informado a remo��o de c�digo de barra
if(codigoBarraRemocao == null || codigoBarraRemocao.trim().equalsIgnoreCase("")){
RegistroHelperFichaCompensacao codigoBarraFichaCompensacaoHelper = fachada.distribuirDadosFichaCompensacao(codigoBarra);
StringBuilder nossoNumero = fachada.obterNossoNumeroFichaCompensacao(codigoBarraFichaCompensacaoHelper.getIdDocumentoTipo(),
codigoBarraFichaCompensacaoHelper.getIdCobrancaDocumento()) ;
String nossoNumeroSemDV = nossoNumero.toString().substring(0,17);
//Caso o c�digo de barra tenha sido informado por digita��o
if(codigoBarraLeituraOtica == null || codigoBarraLeituraOtica.equalsIgnoreCase("")){
//[FS0003] E [FS0005] - Validar d�gito verificador do c�digo de barra
this.validarDigitoVerificador(fachada, codigoBarraFichaCompensacaoHelper, nossoNumeroSemDV);
}
//Caso o c�digo de barra j� tenha sido informado pelo usu�rio e esteja na lista de documentos
//[FS0004] - Verificar exist�ncia do documento na lista
if(this.verificarExistenciaDocumentoNaLista(codigoBarra, colecaoInserirPagamentoViaCanetaHelper)){
//Levanta a exce��o para o usu�rio indicando que o documento j� foi informado
throw new ActionServletException("atencao.documento_informado");
}else{
//[SB0008] � Processar Pagamento Ficha de Compensa��o.
PagamentoHelperCodigoBarras pagamentoHelperCodigoBarras = fachada.processarPagamentosFichaCompensacao(
sistemaParametro, dataPagamento, codigoBarraFichaCompensacaoHelper.getValorDocumento(), nossoNumeroSemDV
,new Integer(idFormaArrecadacao), usuarioLogado);
//Recupera a descri��o a ocorr�ncia do movimento
String descricaoOcorrenciaMovimento = pagamentoHelperCodigoBarras.getDescricaoOcorrencia();
//Recupera o inidicador de aceita��o do registro do movimento
Integer indicadorAceitacaoRegistroMovimento = Integer.parseInt(pagamentoHelperCodigoBarras.getIndicadorAceitacaoRegistro());
//Caso o inidicador de aceita��o do registro do movimento seja igual a 1 (SIM) e
//a descri��o a ocorr�ncia do movimento seja igual a "OK"
//Caso contr�rio levanta uma exce��o com a descri��o da ocorr�ncia do movimento
if(indicadorAceitacaoRegistroMovimento == 1 && descricaoOcorrenciaMovimento.equalsIgnoreCase("OK")){
/*
* Colocado por Raphael Rossiter em 30/10/2007
* OBJ: Gerar as devoluc�es
*/
//Cria o documento para o c�digo de barras informado pelo usu�rio
InserirPagamentoViaCanetaHelper inserirPagamentoViaCanetaHelper = new InserirPagamentoViaCanetaHelper();
//Adiciona a cole��o de pagamentos retornada pelo [SB0003]
inserirPagamentoViaCanetaHelper.setColecaoPagamento(pagamentoHelperCodigoBarras.getColecaoPagamentos());
//Adiciona a devolucao retornada pelo [SB0003]
inserirPagamentoViaCanetaHelper.setColecaoDevolucao(pagamentoHelperCodigoBarras.getColecaoDevolucao());
//Recupera o valor do pagamento do c�digo de barra
//valorPagamento = (Util.formatarMoedaRealparaBigDecimal(distribuirDadosCodigoBarras.getValorPagamento())).divide(new BigDecimal("100.00"));
valorPagamento = codigoBarraFichaCompensacaoHelper.getValorDocumento();
if(codigoBarraLeituraOtica == null || codigoBarraLeituraOtica.equals("")) {
inserirPagamentoViaCanetaHelper.setCodigoBarra(codigoBarraDigitadoCampo1 + codigoBarraDigitadoCampo2 + codigoBarraDigitadoCampo3 +
codigoBarraDigitadoDigitoVerificador + codigoBarraDigitadoCampo4);
}
else {
inserirPagamentoViaCanetaHelper.setCodigoBarra(codigoBarra);
}
inserirPagamentoViaCanetaHelper.setValorPagamento(valorPagamento);
//Adiciona o documento na cole��o
colecaoInserirPagamentoViaCanetaHelper.add(inserirPagamentoViaCanetaHelper);
//Limpa os c�digos de barras do form
pagamentoActionForm.set("codigoBarraDigitadoCampo1Parte1","");
pagamentoActionForm.set("codigoBarraDigitadoCampo1Parte2","");
pagamentoActionForm.set("codigoBarraDigitadoCampo2Parte1","");
pagamentoActionForm.set("codigoBarraDigitadoCampo2Parte2","");
pagamentoActionForm.set("codigoBarraDigitadoCampo3Parte1","");
pagamentoActionForm.set("codigoBarraDigitadoCampo3Parte2","");
pagamentoActionForm.set("codigoBarraDigitadoDigitoVerificador","");
pagamentoActionForm.set("codigoBarraDigitadoCampo4","");
pagamentoActionForm.set("codigoBarraPorLeituraOtica","");
}else{
throw new ActionServletException("atencao.descricao_ocorrencia_movimento",null,descricaoOcorrenciaMovimento);
}
}
}
}
//Seta na sess�o a cole��o de documento de c�digos de barra informados e a cole��o de pagamentos gerados
sessao.setAttribute("colecaoInserirPagamentoViaCanetaHelper",colecaoInserirPagamentoViaCanetaHelper);
//Retorna o mapeamento contido na vari�vel retorno
return retorno;
}
/**
* Verifica se o c�digode barras informado pelo usu�rio j� est� contido na lista de documentos
*
* [FS0004] Verificar exist�ncia do documento na lista
*
* @author Pedro Alexandre
* @date 16/02/2006
*
* @param codigoBarra
* @param colecaoPagamentos
* @return
*/
private boolean verificarExistenciaDocumentoNaLista(String codigoBarra, Collection<InserirPagamentoViaCanetaHelper> colecaoInserirPagamentoViaCanetaHelper){
//Flag para indicar se o c�digode barras j� est� contido na lista de documentos
boolean retorno = false;
//Caso a lista de documentos n�o esteja vazia
if(colecaoInserirPagamentoViaCanetaHelper != null && !colecaoInserirPagamentoViaCanetaHelper.isEmpty()){
//La�o para verificar se o documento j� esta na cole��o
loopPagamento : for(InserirPagamentoViaCanetaHelper inserirPagamentoViaCanetaHelper : colecaoInserirPagamentoViaCanetaHelper){
//Caso o c�digo de barras do documento seja igual ao informado pelo usu�rio
if(inserirPagamentoViaCanetaHelper.getCodigoBarra().equals(codigoBarra)){
//Indica que o documento j� existe na cole��o
retorno = true;
//Para o loop
break loopPagamento;
}
}
}
//Retorna a flag indicando se o documento est� na cole��o
return retorno;
}
/**
* Valida o c�digo de barras, caso esse tenha sido digitado com seus d�gitos verificadores
*
* [FS0005] Validar D�gito verificador do C�digo de Barras
*
* @author Pedro Alexandre
* @date 16/02/2006
*/
private void validarDigitoVerificador(Fachada fachada, RegistroHelperFichaCompensacao codigoBarraFichaCompensacaoHelper,
String nossoNumeroSemDV){
//Cria as vari�veis quevai armazenar os d�gitos verificadores do m�dulo 11 e 10 respectivamente
String dvModulo11 = null;
String dvModulo10 = null;
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(codigoBarraFichaCompensacaoHelper.getCampo1SemDigito())).toString();
if(!dvModulo10.equals(codigoBarraFichaCompensacaoHelper.getDigitoVerificadorModulo10Campo1())){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(codigoBarraFichaCompensacaoHelper.getCampo2SemDigito())).toString();
if(!dvModulo10.equals(codigoBarraFichaCompensacaoHelper.getDigitoVerificadorModulo10Campo2())){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(codigoBarraFichaCompensacaoHelper.getCampo3SemDigito())).toString();
if(!dvModulo10.equals(codigoBarraFichaCompensacaoHelper.getDigitoVerificadorModulo10Campo3())){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
//DIGITO VERIFICADOR GERAL
String especificacaoCodigoBarra = CodigoBarras.obterEspecificacaoCodigoBarraFichaCompensacao(
ConstantesSistema.CODIGO_BANCO_FICHA_COMPENSACAO, ConstantesSistema.CODIGO_MOEDA_FICHA_COMPENSACAO,
codigoBarraFichaCompensacaoHelper.getValorDocumento(), nossoNumeroSemDV.toString(),
ConstantesSistema.CARTEIRA_FICHA_COMPENSACAO, codigoBarraFichaCompensacaoHelper.getFatorVencimento());
dvModulo11 = especificacaoCodigoBarra.substring(4, 5);
if (!dvModulo11.equals(codigoBarraFichaCompensacaoHelper.getDigitoVerificadorModulo11())){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
}
}