/** [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();
    }
  }