package gcom.gui.faturamento; import gcom.cadastro.imovel.FiltroImovel; import gcom.cadastro.imovel.Imovel; import gcom.cadastro.localidade.Localidade; import gcom.fachada.Fachada; import gcom.faturamento.bean.RetornoAtualizarFaturamentoMovimentoCelularHelper; import gcom.gui.ActionServletException; import gcom.gui.micromedicao.ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction; import gcom.micromedicao.ArquivoTextoRetornoIS; import gcom.micromedicao.ArquivoTextoRoteiroEmpresa; import gcom.micromedicao.ArquivoTextoRoteiroEmpresaDivisao; import gcom.micromedicao.SituacaoTransmissaoLeitura; import gcom.relatorio.ExibidorProcessamentoTarefaRelatorioAtualizacaoMovimentoCelular; import gcom.relatorio.faturamento.RelatorioErrosMovimentosContaPreFaturadas; import gcom.seguranca.acesso.usuario.Usuario; import gcom.tarefa.TarefaRelatorio; import gcom.util.IoUtil; import gcom.util.Util; import gcom.util.filtro.ParametroSimples; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.jboss.logging.Logger; public class AtualizarFaturamentoMovimentoCelularAction extends ExibidorProcessamentoTarefaRelatorioAtualizacaoMovimentoCelular { private static Logger logger = Logger.getLogger(AtualizarFaturamentoMovimentoCelularAction.class); @SuppressWarnings({ "rawtypes", "unchecked", "resource" }) public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ActionForward retorno = actionMapping.findForward("telaSucesso"); try { DiskFileUpload upload = new DiskFileUpload(); int indcFinalizacao = 0; Integer codRota = null; Integer setorComercial = null; Integer localidade = null; Integer idRota = 0; Integer anoMesReferencia = null; Integer diferenca = null; Integer numeroSequenciaArquivo = null; boolean temRegistroTipo0 = false; boolean indicadorSucessoAtualizacao = false; byte[] byteRelatorio = null; List itensForm = upload.parseRequest(httpServletRequest); Iterator iteItensForm = itensForm.iterator(); Fachada fachada = Fachada.getInstancia(); while ( iteItensForm.hasNext() ){ FileItem item = ( FileItem )iteItensForm.next(); // Caso n�o seja um field do formulario � o arquivo if ( !item.isFormField() ){ InputStreamReader reader = new InputStreamReader(item.getInputStream()); InputStreamReader inputSemRegistroZero = new InputStreamReader(item.getInputStream()); InputStreamReader readerOriginal = new InputStreamReader(item.getInputStream()); BufferedReader buffer = new BufferedReader(reader); BufferedReader bufferOriginal = new BufferedReader(readerOriginal); BufferedReader bufferSemRegistroZero = new BufferedReader(inputSemRegistroZero); String nomeArquivo = item.getName(); String registro0 = buffer.readLine(); logger.info("Linha arquivo String: " + registro0); if (registro0 != null && !registro0.trim().equals("")) { ArquivoTextoRetornoIS arquivoRetorno = new ArquivoTextoRetornoIS(); int registroTipo = Integer.parseInt(registro0.substring(0, 1)); if(registroTipo == 0){ bufferSemRegistroZero = null; inputSemRegistroZero = null; temRegistroTipo0 = true; indcFinalizacao = Integer.parseInt(registro0.substring(1,2)); codRota = Integer.parseInt(registro0.substring(8,15)); setorComercial = Integer.parseInt(registro0.substring(5,8)); localidade = Integer.parseInt(registro0.substring(2,5)); if (registro0.length() == 17) { numeroSequenciaArquivo = Integer.parseInt(registro0.substring(15, 17)); idRota = fachada.obterIdRotaPorSetorComercialELocalidade(codRota, setorComercial, localidade); } else { numeroSequenciaArquivo = Integer.parseInt(registro0.substring(19, 21)); idRota = Integer.parseInt(registro0.substring(15, 19)); } anoMesReferencia = fachada.retornaAnoMesFaturamentoGrupoDaRota(idRota); arquivoRetorno.setAnoMesReferencia(anoMesReferencia); arquivoRetorno.setCodigoRota(codRota); arquivoRetorno.setCodigoSetorComercial(setorComercial); arquivoRetorno.setLocalidade(new Localidade(localidade)); arquivoRetorno.setNomeArquivo(nomeArquivo); arquivoRetorno.setTempoRetornoArquivo(new Date()); arquivoRetorno.setUltimaAlteracao(new Date()); int tipoFinalizacao = ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO; arquivoRetorno.setTipoFinalizacao(new Short(tipoFinalizacao + "")); logger.info("Finalizando arquivo offline [Localidade: " + localidade + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"); if ( idRota == null ){ String primeiroRegistro = buffer.readLine(); Integer matricula = Integer.parseInt( primeiroRegistro.substring( 1, 10 ) ); FiltroImovel filtroImovel = new FiltroImovel(); filtroImovel.adicionarCaminhoParaCarregamentoEntidade( "rotaAlternativa.setorComercial" ); filtroImovel.adicionarParametro( new ParametroSimples( FiltroImovel.ID, matricula ) ); Collection<Imovel> colImovel = Fachada.getInstancia().pesquisar( filtroImovel, Imovel.class.getName() ); Imovel imo = (Imovel) Util.retonarObjetoDeColecao( colImovel ); localidade = imo.getLocalidade().getId(); setorComercial = imo.getRotaAlternativa().getSetorComercial().getCodigo(); codRota = imo.getRotaAlternativa().getCodigo().intValue(); idRota = fachada.obterIdRotaPorSetorComercialELocalidade(codRota,setorComercial,localidade); String linha; StringBuffer arquivo = new StringBuffer(); arquivo.append( primeiroRegistro + "\n" ); while( ( linha = buffer.readLine() ) != null ){ arquivo.append(linha + "\n"); } InputStream is = new ByteArrayInputStream( arquivo.toString().getBytes() ); InputStreamReader readerRetorno = new InputStreamReader( is ); buffer = new BufferedReader(readerRetorno); } // Caso o tipo de finaliza��o seja de arquivo com im�veis faltando, pesquisamos quais ja chegaram if ( indcFinalizacao == ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO ){ buffer = fachada.removerImoveisJaProcessadosBufferImpressaoSimultanea( idRota, buffer ); } } else { buffer = bufferSemRegistroZero; throw new ActionServletException("atencao.arquivo_sem_registro_tipo0", nomeArquivo); } RetornoAtualizarFaturamentoMovimentoCelularHelper helper = null; helper = fachada.atualizarFaturamentoMovimentoCelular(buffer, true, true, null, arquivoRetorno, bufferOriginal); byteRelatorio = helper.getRelatorioConsistenciaProcessamento(); indicadorSucessoAtualizacao = helper.getIndicadorSucessoAtualizacao(); } else { throw new ActionServletException("atencao.arquivo_sem_dados", nomeArquivo); } break; } } Integer[] idsSituacaoTransmissao = new Integer[1]; idsSituacaoTransmissao[0] = SituacaoTransmissaoLeitura.TRANSMITIDO; boolean indicadorRotaDividida = fachada.isRotaDividida(idRota, anoMesReferencia); String mensagemAtualizacao = null; ArquivoTextoRoteiroEmpresa arquivoTextoRoteiroEmpresa = fachada.pesquisarArquivosTextoRoteiroEmpresaTransmissaoOffline(localidade, idRota, anoMesReferencia); Integer contadorImoveisMovimentoContaPF = null; Integer quantidadeImoveisArquivoDividido = null; String textoInformacoesRota = "<br />"; textoInformacoesRota += "<br />"; textoInformacoesRota += "Localidade: " + localidade + ", Setor: " + setorComercial + ", Rota: " + codRota; String mensagemPrincipalSucesso = "Faturamento Movimento Celular foi Atualizado com sucesso. " +"Verifique o relat�rio gerado."+textoInformacoesRota; String mensagemPrincipalErro = "N�o foi poss�vel Atualizar Faturamento Movimento Celular. " +"Verifique o relat�rio gerado para identificar o problema."+textoInformacoesRota; String mensagemPrincipalErroNaoCorresponde = "N�o foi poss�vel Atualizar Faturamento Movimento Celular. " +"A quantidade de im�veis n�o corresponde ao esperado. Verifique o relat�rio gerado."+textoInformacoesRota; String mensagemFinalizadoIncompleto = "Faturamento Movimento Celular foi Finalizado Incompleto."; if(indicadorSucessoAtualizacao){ if ( temRegistroTipo0 ){ if( indcFinalizacao == ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.FINALIZAR_LEITURA || indcFinalizacao == ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO ){ diferenca = fachada.pesquisarDiferencaQuantidadeMovimentoContaPrefaturadaArquivoTextoRoteiroEmpresa(idRota, anoMesReferencia); if (diferenca == null) { diferenca = 0; } else if (diferenca < 0) { diferenca *= -1; } mensagemAtualizacao = mensagemPrincipalSucesso; if (!fachada.isRotaDividida(idRota, anoMesReferencia)) { if (diferenca != 0) { String msg = "Quantidade de im�veis enviados n�o corresponde ao esperado. "; msg += "[Im�veis faltando transmitir: " + diferenca + ", Localidade: " + localidade + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"; logger.info(msg); mensagemAtualizacao = mensagemPrincipalErroNaoCorresponde; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "Im�veis faltando transmitir: " + diferenca; indicadorSucessoAtualizacao = false; } else { fachada.atualizarArquivoTextoEnviadoPorRota(idRota,SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); } } else { mensagemAtualizacao += ". Parte: " + numeroSequenciaArquivo; ArquivoTextoRoteiroEmpresaDivisao arquivoTextoRoteiroEmpresaDivisao = fachada.pesquisarArquivoTextoRoteiroEmpresaDivisao(arquivoTextoRoteiroEmpresa.getId(), numeroSequenciaArquivo); quantidadeImoveisArquivoDividido = arquivoTextoRoteiroEmpresaDivisao.getQuantidadeImovel(); List<Integer> listaImoveisMovimentoContaPF = fachada.obterImoveisMovimentoContaPF(idRota, anoMesReferencia); File arquivoOriginal = new File(arquivoTextoRoteiroEmpresaDivisao.getNomeArquivo()); FileOutputStream out = new FileOutputStream(arquivoOriginal.getAbsolutePath()); out.write(arquivoTextoRoteiroEmpresaDivisao.getArquivoTexto()); out.close(); contadorImoveisMovimentoContaPF = new Integer(IoUtil.obterQuantidadeImoveisTransmitidos(arquivoOriginal, listaImoveisMovimentoContaPF)); if (contadorImoveisMovimentoContaPF >= quantidadeImoveisArquivoDividido) { fachada.atualizarArquivoTextoDividido(idRota, anoMesReferencia, numeroSequenciaArquivo, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); if (diferenca != 0) { String msg = "Quantidade de im�veis enviados n�o corresponde ao esperado. "; msg += "[Im�veis faltando transmitir: " + diferenca + ", Localidade: " + localidade + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "Im�veis faltando transmitir: " + diferenca; logger.info(msg); } else { if (!fachada.verificarExistenciaArquivosDivididosSituacaoDiferente(idRota, anoMesReferencia, idsSituacaoTransmissao)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); } } } else { mensagemAtualizacao = mensagemPrincipalErroNaoCorresponde + numeroSequenciaArquivo; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "<br />"; mensagemAtualizacao += "Im�veis faltando transmitir: " + diferenca; indicadorSucessoAtualizacao = false; } } } else if (indcFinalizacao == ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.FINALIZAR_LEITURA_INCOMPLETA) { mensagemAtualizacao = mensagemFinalizadoIncompleto; indicadorSucessoAtualizacao = false; if (!indicadorRotaDividida) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota,SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); } else { if (!fachada.verificarExistenciaArquivosDivididosSituacaoDiferente(idRota, anoMesReferencia, idsSituacaoTransmissao)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); } else { idsSituacaoTransmissao = new Integer[2]; idsSituacaoTransmissao[0] = SituacaoTransmissaoLeitura.TRANSMITIDO; idsSituacaoTransmissao[1] = SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO; if (!fachada.verificarExistenciaArquivosDivididosSituacaoDiferente(idRota, anoMesReferencia, idsSituacaoTransmissao)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota,SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); } } } } } } else { mensagemAtualizacao = mensagemPrincipalErro; } if (byteRelatorio != null) { RelatorioErrosMovimentosContaPreFaturadas relatorio = new RelatorioErrosMovimentosContaPreFaturadas((Usuario) (httpServletRequest.getSession(false)).getAttribute("usuarioLogado")); relatorio.setRelatorio(byteRelatorio); httpServletRequest.setAttribute("telaSucessoRelatorio", true); retorno = processarExibicaoRelatorio(relatorio,TarefaRelatorio.TIPO_PDF + "", indicadorSucessoAtualizacao, mensagemAtualizacao, httpServletRequest, httpServletResponse, actionMapping); } else { montarPaginaSucesso(httpServletRequest, mensagemAtualizacao, "Voltar", "/exibirAtualizarFaturamentoMovimentoCelularAction.do"); if (indicadorSucessoAtualizacao) { retorno = actionMapping.findForward("telaSucesso"); } else { retorno = actionMapping.findForward("telaAtencaoRelatorioAtualizarFaturamentoMovimentoCelular"); } } return retorno; } catch (ActionServletException ex) { throw ex; } catch (Exception ex) { throw new ActionServletException("erro.atualizacao.nao_concluida"); } } }