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.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;
import br.edu.cesmac.core.exception.NegocioException;
import br.edu.cesmac.core.generic.AbstractService;
import br.edu.cesmac.core.generic.GenericRepository;
import br.edu.cesmac.core.util.TipoExtensao;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.core.validador.Validador;
@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 "";
}
}