package gcom.gui.micromedicao; 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.GcomAction; import gcom.micromedicao.ArquivoTextoRetornoIS; import gcom.micromedicao.ServicoTipoCelular; import gcom.micromedicao.SituacaoTransmissaoLeitura; import gcom.util.Util; import gcom.util.filtro.ParametroSimples; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Collection; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction extends GcomAction { private static final char RESPOSTA_ERRO = '#'; private static final byte RESPOSTA_OK = '*'; private static final int CONFIRMAR_ARQUIVO_RECEBIDO = 3; private static final int PACOTE_BAIXAR_ARQUIVO = 0; private static final int ATUALIZAR_MOVIMENTO = 1; public static final int FINALIZAR_LEITURA = 2; public static final int FINALIZAR_LEITURA_INCOMPLETA = 6; private static final int BAIXAR_NOVA_VERSAO_JAD = 4; private static final int BAIXAR_NOVA_VERSAO_JAR = 5; public static final int FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO = 7; private Logger logger = Logger.getLogger(ProcessarRequisicaoDipositivoMovelImpressaoSimultaneaAction.class); public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { InputStream in = null; OutputStream out = null; try { out = response.getOutputStream(); } catch (IOException e) { logger.error("Erro: " + e.getMessage()); } try { in = request.getInputStream(); DataInputStream din = new DataInputStream(in); int pacote = din.readByte(); logger.info("Solicitacao Mobile : " + pacote); switch (pacote) { case PACOTE_BAIXAR_ARQUIVO: this.baixarArquivo(din, response, out); break; case ATUALIZAR_MOVIMENTO: this.atualizarMovimentacao(din, response, out); break; case FINALIZAR_LEITURA: this.finalizarMovimentacao(din, response, out, FINALIZAR_LEITURA); break; case FINALIZAR_LEITURA_INCOMPLETA: this.finalizarMovimentacao(din, response, out, FINALIZAR_LEITURA_INCOMPLETA); break; case CONFIRMAR_ARQUIVO_RECEBIDO: this.confirmacaoArquivoRecebido(din, response, out); break; case BAIXAR_NOVA_VERSAO_JAD: this.baixarNovaVersaoJad(din, response, out); break; case BAIXAR_NOVA_VERSAO_JAR: this.baixarNovaVersaoJar(din, response, out); break; case FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO: this.finalizarMovimentacao(din, response, out,FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO); break; } } catch (Exception e) { e.printStackTrace(); logger.error("Erro: " + e.getMessage()); response.setContentLength(1); try { out.write(RESPOSTA_ERRO); out.flush(); } catch (IOException e1) { logger.error("Erro: " + e.getMessage()); } } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * [UC0811] Processar Requisi��es do Dispositivo M�vel Impressao Simultanea. */ public void baixarArquivo(DataInputStream data, HttpServletResponse response, OutputStream out) throws IOException { Fachada fachada = Fachada.getInstancia(); long imei = data.readLong(); logger.info("imei: " + imei); try { Object[] retorno = fachada.baixarArquivoTextoParaLeituristaImpressaoSimulanea(imei, ServicoTipoCelular.IMPRESSAO_SIMULTANEA); byte[] arq = (byte[]) retorno[0]; String nomeArquivo = (String) retorno[1]; if (arq != null) { logger.info("Inicio : Baixando arquivo Mobile"); String tipoArquivo = ""; if (nomeArquivo.endsWith(".txt")) { tipoArquivo = "tipoArquivo=T&"; } else { tipoArquivo = "tipoArquivo=G&"; } String parametroArquivoBaixarRota = "arquivoRoteiro="; response.setContentLength(1 + tipoArquivo.getBytes().length + parametroArquivoBaixarRota.getBytes().length + arq.length); out.write(RESPOSTA_OK); out.write(tipoArquivo.getBytes()); out.write(parametroArquivoBaixarRota.getBytes()); out.write(arq); out.flush(); logger.info("Fim: Baixando arquivo Mobile"); } else { logger.info("Erro ao Baixar arquivo Mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } catch (Exception e) { logger.error("Erro ao baixar arquivo mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } /** * [UC0811] Processar Requisi��es do Dispositivo M�vel. */ public void atualizarMovimentacao(DataInputStream data, HttpServletResponse response, OutputStream out) throws IOException { InputStreamReader reader = new InputStreamReader(data); BufferedReader buffer = new BufferedReader(reader); try { RetornoAtualizarFaturamentoMovimentoCelularHelper retorno = Fachada .getInstancia().atualizarFaturamentoMovimentoCelular(buffer, false, false, null, null, buffer); if (retorno.getRelatorioConsistenciaProcessamento() != null) { logger.info("Erro ao atualizar faturamento movimento celular"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } else if (retorno.getMensagemComunicacaoServidorCelular() != null) { logger.info("Valida��o encontrada. Retornando para o celular."); response.setContentLength(1 + retorno.getMensagemComunicacaoServidorCelular().length()); if (retorno.getIndicadorSucessoAtualizacao()) { out.write(RESPOSTA_OK); } else { out.write(RESPOSTA_ERRO); } out.write(retorno.getMensagemComunicacaoServidorCelular().getBytes()); out.flush(); } else { response.setContentLength(1); out.write(RESPOSTA_OK); out.flush(); logger.info("Fim: atualizar faturamento movimento celular"); } } catch (Exception e) { e.printStackTrace(); logger.error("Erro ao atualizar faturamento movimento celular"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } @SuppressWarnings({ "unchecked", "resource" }) public void finalizarMovimentacao(DataInputStream data, HttpServletResponse response, OutputStream out, int tipoFinalizacao) throws IOException { Fachada fachada = Fachada.getInstancia(); long imei = data.readLong(); Integer idRota = 0; InputStreamReader reader = new InputStreamReader(data); InputStreamReader readerOriginal = new InputStreamReader(data); BufferedReader buffer = new BufferedReader(reader); BufferedReader bufferOriginal = new BufferedReader(readerOriginal); Integer codRota = null; Integer setorComercial = null; Integer idLocalidade = null; Integer numeroSequenciaArquivo = null; try { String registro0 = buffer.readLine(); int indcFinalizacao = Integer.parseInt(registro0.substring(1, 2)); idLocalidade = Integer.parseInt(registro0.substring(2, 5)); setorComercial = Integer.parseInt(registro0.substring(5, 8)); codRota = Integer.parseInt(registro0.substring(8,15)); if (registro0.length() == 17) { numeroSequenciaArquivo = Integer.parseInt(registro0.substring(15, 17)); idRota = fachada.obterIdRotaPorSetorComercialELocalidade(codRota, setorComercial, idLocalidade); } else { idRota = Integer.parseInt(registro0.substring(15, 19)); numeroSequenciaArquivo = Integer.parseInt(registro0.substring(19, 21)); } 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); idLocalidade = imo.getLocalidade().getId(); setorComercial = imo.getRotaAlternativa().getSetorComercial().getCodigo(); codRota = imo.getRotaAlternativa().getCodigo().intValue(); idRota = fachada.obterIdRotaPorSetorComercialELocalidade(codRota, setorComercial, idLocalidade); 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); } Integer anoMesFaturamento = fachada.retornaAnoMesFaturamentoGrupoDaRota(idRota); Localidade localidade = new Localidade(idLocalidade); ArquivoTextoRetornoIS arquivoRetorno = new ArquivoTextoRetornoIS(); arquivoRetorno.setAnoMesReferencia(anoMesFaturamento); arquivoRetorno.setCodigoRota(codRota); arquivoRetorno.setCodigoSetorComercial(setorComercial); arquivoRetorno.setLocalidade(localidade); arquivoRetorno.setNomeArquivo(fachada.obterNomeArquivoRetorno(arquivoRetorno).toString()); arquivoRetorno.setTempoRetornoArquivo(new Date()); arquivoRetorno.setTipoFinalizacao(new Short(tipoFinalizacao + "")); arquivoRetorno.setUltimaAlteracao(new Date()); logger.info("Finalizando arquivo Mobile [Imei=" + imei + ", Localidade: " + localidade.getId() + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"); if (indcFinalizacao == FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO) { buffer = fachada.removerImoveisJaProcessadosBufferImpressaoSimultanea(idRota, buffer); } RetornoAtualizarFaturamentoMovimentoCelularHelper retorno = null; if (buffer != null) { retorno = fachada.atualizarFaturamentoMovimentoCelular(buffer, false, true, idRota, arquivoRetorno, bufferOriginal); } if (retorno != null && (retorno.getRelatorioConsistenciaProcessamento() != null || retorno.getMensagemComunicacaoServidorCelular() != null)) { logger.info("Erro ao finalizar rota [Imei=" + imei + ", Localidade: " + localidade.getId() + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } else { Integer[] idsSituacaoTransmissao = new Integer[1]; idsSituacaoTransmissao[0] = SituacaoTransmissaoLeitura.TRANSMITIDO; if (indcFinalizacao == FINALIZAR_LEITURA || indcFinalizacao == FINALIZAR_LEITURA_ARQUIVO_IMOVEIS_FALTANDO) { Integer diferenca = fachada.pesquisarDiferencaQuantidadeMovimentoContaPrefaturadaArquivoTextoRoteiroEmpresa(idRota, anoMesFaturamento); if (!fachada.isRotaDividida(idRota, anoMesFaturamento)) { if (diferenca != 0) { String msg = "Valida��o encontrada. Retornando para o celular"; msg += "[Diferen�a de imoveis: " + diferenca; msg += ", Imei=" + imei + ", Localidade: " + localidade.getId() + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"; logger.info(msg); String mensagem = "mensagem=A quantidade de im�veis enviados n�o corresponde ao esperado"; response.setContentLength(1 + mensagem.getBytes().length); out.write(RESPOSTA_ERRO); out.write(mensagem.getBytes()); out.flush(); } else { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); } } else { fachada.atualizarArquivoTextoDividido(idRota, anoMesFaturamento, numeroSequenciaArquivo, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); if (diferenca != 0) { String msg = "Valida��o encontrada. Retornando para o celular"; msg += "[Diferen�a de imoveis: " + diferenca; msg += ", Imei=" + imei + ", Localidade: " + localidade + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"; logger.info(msg); String mensagem = "mensagem=A quantidade de im�veis enviados n�o corresponde ao esperado"; response.setContentLength(1 + mensagem.getBytes().length); out.write(RESPOSTA_ERRO); out.write(mensagem.getBytes()); out.flush(); } else { fachada.atualizarArquivoTextoEnviado(imei, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.TRANSMITIDO); if (!fachada.verificarExistenciaArquivosDivididosSituacaoDiferente(idRota, anoMesFaturamento, 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, anoMesFaturamento, idsSituacaoTransmissao)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); } } } } response.setContentLength(1); out.write(RESPOSTA_OK); out.flush(); logger.info("Fim: finalizar rota [Localidade: " + localidade.getId() + ", Setor: " + setorComercial + ", Rota: " + codRota + "]"); } else if (indcFinalizacao == FINALIZAR_LEITURA_INCOMPLETA) { if (!fachada.isRotaDividida(idRota, anoMesFaturamento)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); } else { fachada.atualizarArquivoTextoEnviado(imei, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); if (!fachada.verificarExistenciaArquivosDivididosSituacaoDiferente(idRota, anoMesFaturamento, 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, anoMesFaturamento,idsSituacaoTransmissao)) { fachada.atualizarArquivoTextoEnviadoPorRota(idRota, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_INCOMPLETO); } } } response.setContentLength(1); out.write(RESPOSTA_OK); out.flush(); logger.info("Fim: finalizar rota [Localidade: " + localidade.getId() + ", Setor: " + setorComercial + ", Rota: " + codRota); } } } catch (Exception e) { e.printStackTrace(); logger.error("Erro ao atualizar faturamento movimento celular [Localidade: " + idLocalidade + ", Setor: " + setorComercial + ", Rota: " + codRota); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } /** * * M�todo de Comfirma��o do Recebimento do Arquivo * * @since 23/05/08 * @param data * @throws IOException */ public void confirmacaoArquivoRecebido(DataInputStream data, HttpServletResponse response, OutputStream out) throws IOException { Fachada fachada = Fachada.getInstancia(); long imei = data.readLong(); logger.info("Confirmando Recebimento do arquivo Mobile imei = " + imei); try { fachada.atualizarArquivoTextoEnviado(imei, SituacaoTransmissaoLeitura.EM_CAMPO, SituacaoTransmissaoLeitura.FINALIZADO_NAO_TRANSMITIDO); fachada.atualizarArquivoTextoEnviado(imei,SituacaoTransmissaoLeitura.LIBERADO, SituacaoTransmissaoLeitura.EM_CAMPO); if (fachada.liberaProximoArquivoImpressaoSimultaneaOnLine()) { fachada.atualizarArquivoTextoMenorSequencialLeitura(imei, SituacaoTransmissaoLeitura.DISPONIVEL, SituacaoTransmissaoLeitura.LIBERADO, ServicoTipoCelular.IMPRESSAO_SIMULTANEA); } response.setContentLength(1); out.write(RESPOSTA_OK); out.flush(); logger.info("Fim: atualizar faturamento movimento celular"); } catch (Exception e) { e.printStackTrace(); logger.error("Erro ao atualizar faturamento movimento celular"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } /** * [UC0811] Processar Requisi��es do Dispositivo M�vel Impressao Simultanea. */ public void baixarNovaVersaoJad(DataInputStream data, HttpServletResponse response, OutputStream out) throws IOException { Fachada fachada = Fachada.getInstancia(); try { byte[] arq = fachada.baixarNovaVersaoJad(); if (arq != null) { String parametroTipoArquivo = "jad="; logger.info("Inicio : Baixando NOVA VERS�O, ARQUIVO JAD Mobile"); response.setContentLength(arq.length + parametroTipoArquivo.getBytes().length + 1); out.write(RESPOSTA_OK); out.write(parametroTipoArquivo.getBytes()); out.write(arq); out.flush(); logger.info("Fim: Baixando NOVA VERS�O, ARQUIVO JAD Mobile"); } else { logger.info("Erro ao Baixar arquivo Mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } catch (Exception e) { logger.error("Erro ao Baixar arquivo Mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } /** * [UC0811] Processar Requisi��es do Dispositivo M�vel Impressao Simultanea. */ public void baixarNovaVersaoJar(DataInputStream data, HttpServletResponse response, OutputStream out) throws IOException { Fachada fachada = Fachada.getInstancia(); try { byte[] arq = fachada.baixarNovaVersaoJar(); if (arq != null) { String parametroTipoArquivo = "jar="; logger.info("Inicio : Baixando NOVA VERS�O, ARQUIVO JAR Mobile"); response.setContentLength(arq.length+ parametroTipoArquivo.getBytes().length + 1); out.write(RESPOSTA_OK); out.write(parametroTipoArquivo.getBytes()); out.write(arq); out.flush(); logger.info("Fim: Baixando NOVA VERS�O, ARQUIVO JAR Mobile"); } else { logger.info("Erro ao Baixar arquivo Mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } catch (Exception e) { logger.info("Erro ao Baixar arquivo Mobile"); response.setContentLength(1); out.write(RESPOSTA_ERRO); out.flush(); } } }