package gcom.gui.micromedicao; import gcom.fachada.Fachada; import gcom.gui.ActionServletException; import gcom.gui.GcomAction; import gcom.micromedicao.ArquivoTextoRoteiroEmpresa; import gcom.micromedicao.ArquivoTextoRoteiroEmpresaDivisao; import gcom.micromedicao.FiltroArquivoTextoRoteiroEmpresa; import gcom.micromedicao.FiltroArquivoTextoRoteiroEmpresaDivisao; import gcom.micromedicao.SituacaoTransmissaoLeitura; import gcom.tarefa.TarefaException; import gcom.util.IoUtil; import gcom.util.ZipUtil; import gcom.util.filtro.ParametroSimples; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.zip.ZipOutputStream; import javax.servlet.ServletOutputStream; 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; public class RetornarArquivoZipLeituraImoveisPFAction extends GcomAction { /** * Este caso de uso permite Retornar um Arquivo Txt Leitura contendo apenas * Im�veis com Conta em Situa��o PF * * [UC0629] Retornar Arquivo Txt Leitura * * * @author Felipe Santos (Adapta��o da Classe * RetornarArquivoZipLeituraAction feita por R�mulo Aur�lio) * @date 20/05/2011 * * @param actionMapping * @param actionForm * @param httpServletRequest * @param httpServletResponse * @return */ public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ActionForward retorno = null; ConsultarArquivoTextoLeituraActionForm form = (ConsultarArquivoTextoLeituraActionForm) actionForm; String[] idsRegistros = form.getIdsRegistros(); Fachada fachada = Fachada.getInstancia(); Collection colecaoArquivoTextoRoteiroEmpresa = fachada.pesquisarArquivosTextoRoteiroEmpresaCompletoParaArquivoZip(idsRegistros); Iterator colecaoArquivoTextoRoteiroEmpresaIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresa.iterator(); ArquivoTextoRoteiroEmpresa arquivoTextoRoteiroEmpresa = null; ZipOutputStream zos = null; // filtro para pesquisar os arquivos dividido caso a rota seja dividida. FiltroArquivoTextoRoteiroEmpresaDivisao filtroArquivoTextoRoteiroEmpresaDivisao = null; if (colecaoArquivoTextoRoteiroEmpresa != null && !colecaoArquivoTextoRoteiroEmpresa.isEmpty()) { if (colecaoArquivoTextoRoteiroEmpresaIterator.hasNext()) { arquivoTextoRoteiroEmpresa = (ArquivoTextoRoteiroEmpresa) colecaoArquivoTextoRoteiroEmpresaIterator.next(); } // Informa��es da rota ---------------------------------------------------------- String localidade = arquivoTextoRoteiroEmpresa.getLocalidade().getId()+""; String setorComercial = arquivoTextoRoteiroEmpresa.getCodigoSetorComercial1()+""; String codigoRota = arquivoTextoRoteiroEmpresa.getRota().getCodigo()+""; // -----------------------------------------------------------------------------/ String nomeArquivo = "Rol_Grupo"; String grupo = ""; // Verifica se o grupo de faturamento est� selecionado e // seta o grupo atrav�s do primeiro arquivo pesquisado. if (!form.getGrupoFaturamentoID().equals("-1")) { grupo = "_"+arquivoTextoRoteiroEmpresa.getFaturamentoGrupo().getId(); } String nomeArquivoZip = nomeArquivo + grupo + "_Imoveis_PF" + ".zip"; File compactadoTipo = new File(nomeArquivoZip); try { zos = new ZipOutputStream(new FileOutputStream(compactadoTipo)); } catch (FileNotFoundException e1) { e1.printStackTrace(); } colecaoArquivoTextoRoteiroEmpresaIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresa.iterator(); try { while (colecaoArquivoTextoRoteiroEmpresaIterator.hasNext()) { arquivoTextoRoteiroEmpresa = (ArquivoTextoRoteiroEmpresa) colecaoArquivoTextoRoteiroEmpresaIterator.next(); if (arquivoTextoRoteiroEmpresa.getSituacaoTransmissaoLeitura().getId().equals(SituacaoTransmissaoLeitura.LIBERADO) || arquivoTextoRoteiroEmpresa.getSituacaoTransmissaoLeitura().getId().equals(SituacaoTransmissaoLeitura.EM_CAMPO)) { // id da rota do arquivo principal Integer idRota = arquivoTextoRoteiroEmpresa.getRota().getId(); // ano e m�s de faturamento da rota Integer anoMesFaturamento = arquivoTextoRoteiroEmpresa.getAnoMesReferencia(); // quantidade de im�veis com contas PF Integer diferenca = null; try { diferenca = fachada.pesquisarDiferencaQuantidadeMovimentoContaPrefaturadaArquivoTextoRoteiroEmpresa(idRota, anoMesFaturamento); if (diferenca == null) { diferenca = 0; } else if (diferenca < 0) { diferenca *= -1; } } catch (Exception ex) { ex.printStackTrace(); } int quantidadeTotalImoveis = arquivoTextoRoteiroEmpresa.getQuantidadeImovel().intValue(); int leiturasRealizadas = quantidadeTotalImoveis - diferenca.intValue(); // A rota apenas ser� baixada caso a quantidade de leituras realizadas // seja maior que zero e menor que a quantidade total de im�veis da rota. if (leiturasRealizadas > 0 && leiturasRealizadas < arquivoTextoRoteiroEmpresa.getQuantidadeImovel()) { // Quantidades de im�veis transmitidos da rota List<Integer> listaImoveisFaltandoTransmitir = fachada.obterImoveisNaoEnviadosMovimentoContaPreFaturada(idRota, anoMesFaturamento); /* * * * Verifica se a rota � dividida para adicionar ao zip os * arquivos divididos. Caso contr�rio, adiciona o arquivo * normalmente. * * @author Felipe Santos * @date 20/07/2011 */ if (fachada.isRotaDividida(idRota, anoMesFaturamento)) { filtroArquivoTextoRoteiroEmpresaDivisao = new FiltroArquivoTextoRoteiroEmpresaDivisao(); filtroArquivoTextoRoteiroEmpresaDivisao.adicionarParametro(new ParametroSimples( FiltroArquivoTextoRoteiroEmpresaDivisao.ARQUIVO_TEXTO_ROTEIRO_EMPRESA_ID, arquivoTextoRoteiroEmpresa.getId())); // Array para ordenar a cole��o por Numero de Sequencia // do arquivo e Situacao de Transmissao String[] orderby = new String[] { FiltroArquivoTextoRoteiroEmpresaDivisao.NUMERO_SEQUENCIA_LEITURA, FiltroArquivoTextoRoteiroEmpresaDivisao.SITUACAO_TRANS_LEITURA }; filtroArquivoTextoRoteiroEmpresaDivisao.adicionarCaminhoParaCarregamentoEntidade( FiltroArquivoTextoRoteiroEmpresaDivisao.ARQUIVO_TEXTO_ROTEIRO_EMPRESA); filtroArquivoTextoRoteiroEmpresaDivisao.adicionarCaminhoParaCarregamentoEntidade( FiltroArquivoTextoRoteiroEmpresa.SITUACAO_TRANS_LEITURA); // Seta no filtro o crit�rio para ordena��o da cole��o filtroArquivoTextoRoteiroEmpresaDivisao.setCampoOrderBy(orderby); // Cole��o contendo os arquivos divididos da rota Collection colecaoArquivoTextoRoteiroEmpresaDivisao = fachada.pesquisar(filtroArquivoTextoRoteiroEmpresaDivisao, ArquivoTextoRoteiroEmpresaDivisao.class.getName()); Iterator colecaoArquivoTextoRoteiroEmpresaDivisaoIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresaDivisao.iterator(); /* * Para cada arquivo dividido, descomprime o arquivo e * adiciona o n�mnero de sequ�ncia do arquivo em seu * nome. Em seguida, comprime o arquivo novamente e * adiciona-o ao zip. */ while (colecaoArquivoTextoRoteiroEmpresaDivisaoIterator.hasNext()) { ArquivoTextoRoteiroEmpresaDivisao arquivoTextoRoteiroEmpresaDivisao = (ArquivoTextoRoteiroEmpresaDivisao) colecaoArquivoTextoRoteiroEmpresaDivisaoIterator.next(); // Arquivo dividido original File arquivoOriginal = new File(arquivoTextoRoteiroEmpresaDivisao.getNomeArquivo()); FileOutputStream out = new FileOutputStream(arquivoOriginal.getAbsolutePath()); out.write(arquivoTextoRoteiroEmpresaDivisao.getArquivoTexto()); out.close(); // Descomprime o arquivo dividido original File arquivoDescomprimido = ZipUtil.descomprimirGzip(arquivoOriginal); // Renomeia o arquivo descomprimido com sufixo // sendo o n�mero de sequ�ncia do arquivo dividido File arquivoDescomprimidoRenomeado = new File(arquivoDescomprimido.getAbsolutePath() + "-" + arquivoTextoRoteiroEmpresaDivisao.getNumeroSequenciaArquivo()); arquivoDescomprimido.renameTo(arquivoDescomprimidoRenomeado); // Gera novo arquivo apenas com im�veis com conta PF IoUtil.gerarArquivoTxtImoveisFaltandoTransmitir(arquivoDescomprimidoRenomeado, listaImoveisFaltandoTransmitir); // Quantidade de Im�veis com situa��o PF int quantidadeImoveisPF = IoUtil.verificaQuantidadeImoveis(arquivoDescomprimidoRenomeado); // Comprime o arquivo renomeado File arquivoComprimido = ZipUtil.comprimirGzip(arquivoDescomprimidoRenomeado); if (quantidadeImoveisPF > 0) { // Adiciona no arquivo zip final ZipUtil.adicionarArquivo(zos, arquivoComprimido); } arquivoDescomprimido.delete(); arquivoDescomprimidoRenomeado.delete(); arquivoComprimido.delete(); zos.closeEntry(); if (arquivoTextoRoteiroEmpresaDivisao.getSituacaoTransmissaoLeitura().getId().equals( SituacaoTransmissaoLeitura.DISPONIVEL) || arquivoTextoRoteiroEmpresaDivisao.getSituacaoTransmissaoLeitura().getId().equals( SituacaoTransmissaoLeitura.LIBERADO)) { // Atualiza situa��o do arquivo dividido para EM CAMPO fachada.atualizarArquivoTextoDivisaoEnviado(arquivoTextoRoteiroEmpresaDivisao.getId(), SituacaoTransmissaoLeitura.EM_CAMPO); } } fachada.atualizarArquivoTextoEnviado(arquivoTextoRoteiroEmpresa.getId(), SituacaoTransmissaoLeitura.EM_CAMPO); } else { // Arquivo original File arquivoOriginal = new File(arquivoTextoRoteiroEmpresa.getNomeArquivo()); FileOutputStream out = new FileOutputStream(arquivoOriginal.getAbsolutePath()); out.write(arquivoTextoRoteiroEmpresa.getArquivoTexto()); out.close(); // Descomprime arquivo original File arquivoDescomprimido = ZipUtil.descomprimirGzip(arquivoOriginal); // Gera novo arquivo apenas com im�veis com conta PF IoUtil.gerarArquivoTxtImoveisFaltandoTransmitir(arquivoDescomprimido, listaImoveisFaltandoTransmitir); // Comprime o novo arquivo File arquivoComprimido = ZipUtil.comprimirGzip(arquivoDescomprimido); // Adiciona no arquivo zip final ZipUtil.adicionarArquivo(zos, arquivoComprimido); arquivoDescomprimido.delete(); arquivoComprimido.delete(); zos.closeEntry(); // Atualiza situa��o para EM CAMPO fachada.atualizarArquivoTextoEnviado(arquivoTextoRoteiroEmpresa.getId(), SituacaoTransmissaoLeitura.EM_CAMPO); } } else { throw new ActionServletException("atencao.arquivo_nao_pode_baixar_rota_invalida", localidade, setorComercial, codigoRota); } } else { throw new ActionServletException("atencao.arquivo_nao_pode_baixar_rota_invalida", localidade, setorComercial, codigoRota); } } zos.flush(); zos.close(); httpServletResponse.setContentType("application/zip"); httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" + nomeArquivoZip); File arquivoZip = new File(nomeArquivoZip); ServletOutputStream sos = httpServletResponse.getOutputStream(); sos.write(IoUtil.getBytesFromFile(arquivoZip)); sos.flush(); sos.close(); arquivoZip.delete(); } catch (IOException ex) { ex.printStackTrace(); throw new TarefaException("Erro ao gerar o arquivo zip", ex); } catch (ActionServletException ex2) { throw ex2; } } try { zos.close(); } catch (IOException e) { e.printStackTrace(); throw new TarefaException("Erro ao fechar o zip do relat�rio", e); } return retorno; } }