package gcom.gui.arrecadacao.pagamento;
import gcom.arrecadacao.bean.PagamentoHelperCodigoBarras;
import gcom.arrecadacao.bean.RegistroHelperCodigoBarras;
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.Util;
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;
/**
* Action que inicializa a segunda p�gina do processo de inserir pagamentos
* se o tipo de inclus�o for por leitura de c�digo de barras
* Este action tamb�m � respons�vel por inserir ou remover um documento na lista de c�digos de barra
* e gerar os pagamento para cada c�digo de barra informado por leitura �ptica ou por digita��o
*
* @author Pedro Alexandre
* @date 16/02/2006
*/
public class ExibirInserirPagamentosTipoInclusaoCanetaAction extends GcomAction {
/**
* Inserir pagamentos no sistema
*
* [UC0265] Inserir Pagamentos
*
* @author Pedro Alexandre
* @date 16/02/2006
*
* @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("inserirPagamentosTipoInclusaoCaneta");
//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 o c�digo da forma de arrecada��o
String idFormaArrecadacao = (String)pagamentoActionForm.get("idFormaArrecadacao");
//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 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 codigoBarraDigitadoDigitoVerificadorCampo1 = null;
String codigoBarraDigitadoCampo2 = null;
String codigoBarraDigitadoDigitoVerificadorCampo2 = null;
String codigoBarraDigitadoCampo3 = null;
String codigoBarraDigitadoDigitoVerificadorCampo3 = null;
String codigoBarraDigitadoCampo4 = null;
String codigoBarraDigitadoDigitoVerificadorCampo4 = 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("")){
codigoBarraDigitadoCampo1 = codigoBarraLeituraOtica.substring(0,11);
codigoBarraDigitadoCampo2 = codigoBarraLeituraOtica.substring(11,22);
codigoBarraDigitadoCampo3 = codigoBarraLeituraOtica.substring(22,33);
codigoBarraDigitadoCampo4 = codigoBarraLeituraOtica.substring(33,44);
}else{
codigoBarraDigitadoCampo1 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo1");
codigoBarraDigitadoDigitoVerificadorCampo1 = (String)pagamentoActionForm.get("codigoBarraDigitadoDigitoVerificadorCampo1");
codigoBarraDigitadoCampo2 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo2");
codigoBarraDigitadoDigitoVerificadorCampo2 = (String)pagamentoActionForm.get("codigoBarraDigitadoDigitoVerificadorCampo2");
codigoBarraDigitadoCampo3 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo3");
codigoBarraDigitadoDigitoVerificadorCampo3 = (String)pagamentoActionForm.get("codigoBarraDigitadoDigitoVerificadorCampo3");
codigoBarraDigitadoCampo4 = (String)pagamentoActionForm.get("codigoBarraDigitadoCampo4");
codigoBarraDigitadoDigitoVerificadorCampo4 = (String)pagamentoActionForm.get("codigoBarraDigitadoDigitoVerificadorCampo4");
}
//Monta o c�digo de barra sem os d�gitos verificadores
codigoBarra = codigoBarraDigitadoCampo1 +
codigoBarraDigitadoCampo2 +
codigoBarraDigitadoCampo3 +
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() == 44){
//Caso o usu�rio n�o tenha informado a remo��o de c�digo de barra
if(codigoBarraRemocao == null || codigoBarraRemocao.trim().equalsIgnoreCase("")){
//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(codigoBarraDigitadoCampo1,codigoBarraDigitadoDigitoVerificadorCampo1,codigoBarraDigitadoCampo2,codigoBarraDigitadoDigitoVerificadorCampo2,codigoBarraDigitadoCampo3,codigoBarraDigitadoDigitoVerificadorCampo3,codigoBarraDigitadoCampo4,codigoBarraDigitadoDigitoVerificadorCampo4);
}
//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{
//[SB0003] - Processar pagamento com C�digo de Barra
PagamentoHelperCodigoBarras pagamentoHelperCodigoBarras = fachada.processarPagamentosCodigoBarras(codigoBarra, dataPagamento,new Integer(idFormaArrecadacao),sistemaParametro, 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());
//Chama o caso de uso [UC0264] para recuperar todos os dados contidos no c�digode barras
RegistroHelperCodigoBarras distribuirDadosCodigoBarras = fachada.distribuirDadosCodigoBarras(codigoBarra);
//Recupera o valor do pagamento do c�digo de barra
valorPagamento = (Util.formatarMoedaRealparaBigDecimal(distribuirDadosCodigoBarras.getValorPagamento())).divide(new BigDecimal("100.00"));
//valorPagamento = new BigDecimal(distribuirDadosCodigoBarras.getValorPagamento());
inserirPagamentoViaCanetaHelper.setCodigoBarra(codigoBarraDigitadoCampo1 + codigoBarraDigitadoCampo2 + codigoBarraDigitadoCampo3 + codigoBarraDigitadoCampo4);
inserirPagamentoViaCanetaHelper.setValorPagamento(valorPagamento);
//Adiciona o documento na cole��o
colecaoInserirPagamentoViaCanetaHelper.add(inserirPagamentoViaCanetaHelper);
//Limpa os c�digos de barras do form
pagamentoActionForm.set("codigoBarraDigitadoCampo1","");
pagamentoActionForm.set("codigoBarraDigitadoDigitoVerificadorCampo1","");
pagamentoActionForm.set("codigoBarraDigitadoCampo2","");
pagamentoActionForm.set("codigoBarraDigitadoDigitoVerificadorCampo2","");
pagamentoActionForm.set("codigoBarraDigitadoCampo3","");
pagamentoActionForm.set("codigoBarraDigitadoDigitoVerificadorCampo3","");
pagamentoActionForm.set("codigoBarraDigitadoCampo4","");
pagamentoActionForm.set("codigoBarraDigitadoDigitoVerificadorCampo4","");
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
*
* @param campo1
* @param dvCampo1
* @param campo2
* @param dvCampo2
* @param campo3
* @param dvCampo3
* @param campo4
* @param dvCampo4
* @return
*/
private void validarDigitoVerificador(String campo1,String dvCampo1, String campo2,String dvCampo2,String campo3,String dvCampo3,String campo4,String dvCampo4){
//Cria as vari�veis quevai armazenar os d�gitos verificadores do m�dulo 11 e 10 respectivamente
String dvModulo11 = null;
String dvModulo10 = null;
//Caso a terceira posi��o do primeiro campo do c�digo de barras for igual a 6(seis)
//Obt�m o digito verificador para o modulo 10(dez)
if((campo1.substring(2,3)).equals("6")){
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(campo1)).toString();
if(!dvModulo10.equals(dvCampo1)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(campo2)).toString();
if(!dvModulo10.equals(dvCampo2)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(campo3)).toString();
if(!dvModulo10.equals(dvCampo3)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo10 = Util.obterDigitoVerificadorModulo10(new Long(campo4)).toString();
if(!dvModulo10.equals(dvCampo4)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
//Caso a terceira posi��o do primeiro campo do c�digo de barras for igual a 8(oito)
//Obt�m o digito verificador para o modulo 11(onze)
}else if((campo1.substring(2,3)).equals("8")){
dvModulo11 = Util.obterDigitoVerificadorModulo11(new Long(campo1)).toString();
if(!dvModulo11.equals(dvCampo1)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo11 = Util.obterDigitoVerificadorModulo11(new Long(campo2)).toString();
if(!dvModulo11.equals(dvCampo2)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo11 = Util.obterDigitoVerificadorModulo11(new Long(campo3)).toString();
if(!dvModulo11.equals(dvCampo3)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
dvModulo11 = Util.obterDigitoVerificadorModulo11(new Long(campo4)).toString();
if(!dvModulo11.equals(dvCampo4)){
throw new ActionServletException("atencao.digitoverificador_invalido");
}
//Caso a terceira posi��o do primeiro campo do c�digo de barras n�o for igual a 6(seis)
//ou n�o for igual a 8(oito), levanta uma exce��o indicando que a indica��o do m�dulo � inv�lida
}else{
throw new ActionServletException("atencao.indicacaomodulo_invalido");
}
}
}