Subversion Repositories Integrator Subversion

Rev

Rev 106 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.domain.service.arquivo.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.inject.Inject;
import javax.servlet.ServletContext;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.stereotype.Service;

import br.com.ec.controller.util.PdfUtil;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.util.TipoExtensao;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.ArquivoDTO;
import br.com.ec.domain.dto.ArquivoFuncionarioDTO;
import br.com.ec.domain.model.Funcionario;
import br.com.ec.domain.service.arquivo.ArquivoService;
import br.com.ec.domain.service.email.impl.GerenciadorEmailImpl;
import br.com.ec.domain.service.funcionario.FuncionarioService;

@Service
public class ArquivoServiceImpl extends AbstractService<ArquivoDTO> implements ArquivoService {

        private FuncionarioService funcionarioService;
       
        @Inject
        public ArquivoServiceImpl(Validador validador, FuncionarioService funcionarioService) {
                super(validador);
                this.funcionarioService = funcionarioService;
        }

        @Override
        protected GenericRepository<ArquivoDTO> getRepository() {
                return null;
        }
       
        @Override
        public StreamedContent gerarRecibos(ArquivoDTO arquivoDTO, ServletContext contexto) {
                ByteArrayInputStream input = new ByteArrayInputStream(gerarAquivos(arquivoDTO, contexto));
                return new DefaultStreamedContent(input, "application/zip", "recibos.zip");
        }
       
        private byte[] gerarAquivos(ArquivoDTO arquivoDTO, ServletContext contexto) {
                ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
                ZipOutputStream out = new ZipOutputStream(bytesOut);
                try {
                        List<byte[]> arquivos = PdfUtil.separarPDF(arquivoDTO.getArquivo());
                        int numeroArquivo = 1;
                        for (byte[] arquivo : arquivos) {
                                adicionarPaginaNoZip(arquivo, "recibo_" + numeroArquivo, ".pdf", out);
                                numeroArquivo++;
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                out.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
        }
                return bytesOut.toByteArray();
        }
       
        private void adicionarPaginaNoZip(byte[] input, String nomeArquivo, String extensaoArquivo, ZipOutputStream out) {
                try {
                        ZipEntry newEntry = new ZipEntry(nomeArquivo + extensaoArquivo);
                out.putNextEntry(newEntry);
                out.write(input, 0, input.length);
                out.closeEntry();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
        @Override
        public ArquivoDTO separarRecibos(ArquivoDTO arquivoDTO, String empresa, ServletContext servletContext) {
                List<byte[]> arquivos;
                try {
                        if (VerificadorUtil.estaNulo(empresa)) {
                                throw new NegocioException("SELECIONE A EMPRESA");
                        }
                        arquivos = PdfUtil.separarPDF(arquivoDTO.getArquivo());
                        int i = 1;
                        for (byte[] arquivo : arquivos) {
                                Funcionario funcionario = funcionarioService.consultarPorCodigoContabilidade(recuperarCodigoContabilidadeEmTexto(arquivo), empresa);
                                if (VerificadorUtil.naoEstaNulo(funcionario)) {
                                        funcionario.setValorLiquido(recuperarValorLiquidoEmTexto(arquivo));
                                        ArquivoFuncionarioDTO arquivoFuncionarioDTO = new ArquivoFuncionarioDTO();
                                        arquivoFuncionarioDTO.setArquivo(arquivo);
                                        arquivoFuncionarioDTO.setExtensao(TipoExtensao.PDF.getValue());
                                        arquivoFuncionarioDTO.setFuncionario(funcionario);
                                        arquivoDTO.getArquivosFuncionarios().add(arquivoFuncionarioDTO);
                                }
                                i++;
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                        throw new NegocioException(e.getMessage());
                }
                return arquivoDTO;
        }
       
        @Override
        public void enviarRecibos(ArquivoDTO arquivoDTO, String empresa, ServletContext servletContext) {
                for (ArquivoFuncionarioDTO arquivoFuncionario : arquivoDTO.getArquivosFuncionarios()) {
                        Funcionario funcionario = funcionarioService.consultarPorCodigoContabilidade(recuperarCodigoContabilidadeEmTexto(arquivoFuncionario.getArquivo()), empresa);
                        if (VerificadorUtil.naoEstaNulo(funcionario) && arquivoFuncionario.getEnviarEmail()) {
                                if (VerificadorUtil.naoEstaNuloOuVazio(funcionario.getEmailDaPessoa())) {
                                        new GerenciadorEmailImpl()
                                                .comEmailsDestino(funcionario.getEmailDaPessoa())
                                                .comAssunto(arquivoDTO.getTituloEmail())
                                                .comConteudoHtml("RECIBO DE PAGAMENTO EM ANEXO.")
                                                .adicionarAnexo("Recibo de Pagamento - " + funcionario.getNomeDaPessoa() + "." + TipoExtensao.PDF.getValue(), arquivoFuncionario.getArquivo(), arquivoFuncionario.getExtensao())
                                                .enviar();
//                                      GerenciadorEmailImpl gerenciadorEmail = new GerenciadorEmailImpl();
//                                      gerenciadorEmail.setDestinatarios(funcionario.getEmailDaPessoa());
//                                      gerenciadorEmail.setAssunto(arquivoDTO.getTituloEmail());
//                                      gerenciadorEmail.setConteudo("Em anexo.");
//                                      gerenciadorEmail.setNomeArquivo("Recibo de Pagamento - " + funcionario.getNomeDaPessoa() + "." + TipoExtensao.PDF.getValue());
//                                      gerenciadorEmail.setArquivoAnexo(arquivoFuncionario.getArquivo());
//                                      gerenciadorEmail.setContentTypeAnexo(arquivoFuncionario.getExtensao());
//                                      gerenciadorEmail.enviarEmail();
                                }
                        }
                }
        }
       
        @Override
        public void separarEnviarRecibos(ArquivoDTO arquivoDTO, String empresa, ServletContext servletContext) {
                List<byte[]> arquivos;
                try {
                        arquivos = PdfUtil.separarPDF(arquivoDTO.getArquivo());
                        int i = 1;
                        for (byte[] arquivo : arquivos) {
                                Funcionario funcionario = funcionarioService.consultarPorCodigoContabilidade(recuperarCodigoContabilidadeEmTexto(arquivo), empresa);
                                if (VerificadorUtil.naoEstaNulo(funcionario)) {
                                        if (VerificadorUtil.naoEstaNuloOuVazio(funcionario.getEmailDaPessoa())) {
                                                // enviarEmailComArquivoEmAnexo
                                                System.out.println(funcionario.getNomeDaPessoa());
                                                System.out.println(funcionario.getEmailDaPessoa());
                                        }
                                }
                                i++;
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
       
        private Integer recuperarCodigoContabilidadeEmTexto(byte[] arquivo) {
                String codigo = recuperarTexto("CC:", arquivo);
                return VerificadorUtil.naoEstaNuloOuVazio(codigo)? new Integer(codigo) : null;
        }
       
        private Double recuperarValorLiquidoEmTexto(byte[] arquivo) {
                try {
                        String valorLiquido = recuperarTexto(3, arquivo);
                        valorLiquido = valorLiquido.replace(".", "").replace(",", ".");
                        return Double.parseDouble(valorLiquido);
                } catch (Exception e) {}
                return null;
        }
       
        private String recuperarNomeEmTexto(byte[] arquivo) {
                return recuperarTexto("Código", arquivo);
        }
       
        private String recuperarTexto(Integer capturarLinha, byte[] arquivo) {
                try {
                        Integer numeroLinha = 1;
                        String[] linhas = PdfUtil.extrairPDFEmLinhas(arquivo);
                        for (String linha : linhas) {
                                if (capturarLinha == numeroLinha) {
                                        return linha.trim();
                                }
                                numeroLinha++;
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return "";
        }
       
        private String recuperarTexto(String contemLinha, byte[] arquivo) {
                try {
                        String[] linhas = PdfUtil.extrairPDFEmLinhas(arquivo);
                        boolean capturar = false;
                        for (String linha : linhas) {
                                if (capturar) {
                                        return linha.trim();
                                }
                                if (linha.contains(contemLinha)) {
                                        capturar = true;
                                }
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return "";
        }
       
}