package br.com.ec.domain.service.impl;
import java.io.ByteArrayOutputStream;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.primefaces.event.FlowEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.PessoaDTO;
import br.com.ec.domain.model.Endereco;
import br.com.ec.domain.model.Funcionario;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.tipos.TipoComissionamento;
import br.com.ec.domain.model.tipos.TipoDependentes;
import br.com.ec.domain.model.tipos.TipoEscolaridade;
import br.com.ec.domain.model.tipos.TipoEstadoCivil;
import br.com.ec.domain.model.tipos.TipoRacaCor;
import br.com.ec.domain.model.tipos.TipoSexo;
import br.com.ec.domain.service.FuncionarioService;
import br.com.ec.domain.service.PessoaService;
import br.com.ec.repository.PessoaRepository;
@Service
public class PessoaServiceImpl
extends AbstractService
<Pessoa
> implements PessoaService
{
private FuncionarioService funcionarioService
;
private PessoaRepository pessoaRepository
;
@Autowired
public PessoaServiceImpl
(Validador validador, PessoaRepository pessoaRepository, FuncionarioService funcionarioService
) {
super(validador
);
this.
pessoaRepository = pessoaRepository
;
this.
funcionarioService = funcionarioService
;
}
@
Override
protected GenericRepository
<Pessoa
> getRepository
() {
return pessoaRepository
;
}
@
Override
protected void regrasNegocioCadastrar
(Pessoa pessoa
) {
if (VerificadorUtil.
estaNulo(pessoa.
getCadastroFinalizado())) {
pessoa.
setCadastroFinalizado(true);
}
pessoa.
setAtivo(true);
}
@
Override
public List<PessoaDTO
> consultarPessoasJuridicas
(String cnpj
) {
return pessoaRepository.
consultarPessoasJuridicas(cnpj
);
}
@
Override
public Pessoa consultarPessoaPorCpfOuCpnj
(String cpfCnpj
) {
return pessoaRepository.
consultarPessoaPorCpfOuCpnj(cpfCnpj
);
}
@
Override
public Pessoa cadastroExterno
(FlowEvent evento, Pessoa pessoa, Funcionario funcionario, Endereco endereco
) {
if (VerificadorUtil.
estaNulo(evento
)) {
pessoa.
setCpfCnpj(StringUtil.
retornarApenasNumeros(pessoa.
getCpfCnpj()));
Pessoa pessoaConsultada = consultarPessoaPorCpfOuCpnj
(StringUtil.
retornarApenasNumeros(pessoa.
getCpfCnpj()));
if (VerificadorUtil.
estaNulo(pessoaConsultada
)) {
pessoa.
setCadastroFinalizado(false);
this.
cadastrar(pessoa
);
Funcionario funcionarioNovo =
new Funcionario
(pessoa, TipoComissionamento.
COMISSSIONAMENTO_ESPACO_CASE.
getValor(),
true);
funcionarioService.
cadastrar(funcionarioNovo
);
pessoa.
setFuncionario(funcionarioNovo
);
this.
alterar(pessoa
);
return pessoa
;
}
Funcionario funcionarioPessoa = funcionarioService.
consultarFuncionarioPelaPessoa(pessoaConsultada.
getSequencial());
if (VerificadorUtil.
estaNulo(funcionarioPessoa
)) {
Funcionario funcionarioNovo =
new Funcionario
(pessoaConsultada, TipoComissionamento.
COMISSSIONAMENTO_ESPACO_CASE.
getValor(),
true);
funcionarioService.
cadastrar(funcionarioNovo
);
pessoaConsultada.
setFuncionario(funcionarioNovo
);
} else {
pessoaConsultada.
setFuncionario(funcionarioPessoa
);
}
if (pessoaConsultada.
getCadastroFinalizado()) {
throw new NegocioException
("CADASTRO INDISPONÍVEL");
}
return pessoaConsultada
;
}
if (VerificadorUtil.
naoEstaNulo(endereco
)) {
if (VerificadorUtil.
naoEstaNuloOuVazio(endereco.
getCep())) {
pessoa.
atualizarEndereco(endereco
);
}
}
this.
alterar(pessoa
);
funcionario.
setPessoa(pessoa
);
funcionarioService.
alterar(funcionario
);
pessoa = detalharPessoa
(pessoa.
getSequencial());
pessoa.
setFuncionario(funcionarioService.
consultarFuncionarioPelaPessoa(pessoa.
getSequencial()));
return pessoa
;
}
@
Override
public Pessoa detalharPessoa
(Long sequencialPessoa
) {
return pessoaRepository.
detalharPessoa(sequencialPessoa
);
}
@
Override
public byte[] emitirFichaColaboradorEsocial
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_formulario_esocial.doc", contexto, pessoa
);
}
@
Override
public byte[] emitirSolicitacaoExameAdmissional
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_exame_admissional.docx", contexto, pessoa
);
}
@
Override
public byte[] emitirSolicitacaoExameDemissional
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_exame_demissional.docx", contexto, pessoa
);
}
@
Override
public byte[] emitirSolicitacaoExamePeriodico
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_exame_periodico.docx", contexto, pessoa
);
}
@
Override
public byte[] emitirSolicitacaoAberturaContaBancaria
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_abertura_conta.docx", contexto, pessoa
);
}
@
Override
public byte[] emitirAdesaoValeTransporte
(ServletContext contexto,
Long sequencialPessoa
) {
Pessoa pessoa = pessoaRepository.
detalharPessoa(sequencialPessoa
);
return replaceTextosArquivos
("/arquivos/modelos/modelo_adesao_vale_transporte.docx", contexto, pessoa
);
}
@
SuppressWarnings("resource")
private byte[] replaceTextosArquivos
(String caminhoArquivo, ServletContext contexto, Pessoa pessoa
) {
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
XWPFDocument doc
;
try {
Funcionario funcionario = funcionarioService.
consultarFuncionarioPelaPessoa(pessoa.
getSequencial());
doc =
new XWPFDocument
(OPCPackage.
open(contexto.
getResourceAsStream(caminhoArquivo
)));
for (XWPFParagraph paragrafo : doc.
getParagraphs()) {
replaceParagrafo
(pessoa, funcionario, paragrafo
);
}
for (XWPFTable tbl : doc.
getTables()) {
for (XWPFTableRow row : tbl.
getRows()) {
for (XWPFTableCell cell : row.
getTableCells()) {
for (XWPFParagraph p : cell.
getParagraphs()) {
replaceParagrafo
(pessoa, funcionario, p
);
}
}
}
}
doc.
write(baos
);
return baos.
toByteArray();
} catch (Exception e
) {
e.
printStackTrace();
}
return null;
}
private void replaceParagrafo
(Pessoa pessoa, Funcionario funcionario, XWPFParagraph paragrafo
) {
String textoParagrafo =
"";
Integer posicao =
0;
for (XWPFRun r : paragrafo.
getRuns()) {
if (VerificadorUtil.
naoEstaNuloOuVazio(r.
text())) {
textoParagrafo = textoParagrafo + r.
text();
}
posicao++
;
}
posicao =
0;
if (textoParagrafo.
contains("#")) {
for (XWPFRun r : paragrafo.
getRuns()) {
if (posicao ==
0) {
r.
setText(replaceTextos
(textoParagrafo, pessoa, funcionario
),
0);
} else {
r.
setText("",
0);
}
posicao++
;
}
}
}
private String replaceTextos
(String texto, Pessoa pessoa, Funcionario funcionario
) {
texto = replaceTexto
(texto,
"#NOME", pessoa.
getNome());
texto = replaceTexto
(texto,
"#CPF", pessoa.
getCpfCnpjFormatado());
texto = replaceTexto
(texto,
"#RG_NUMERO", pessoa.
getRg());
texto = replaceTexto
(texto,
"#RG_DATAEXPEDICAO", pessoa.
getRgDataExpedicaoFormatada());
texto = replaceTexto
(texto,
"#RG_ORGAOEMISSOR", pessoa.
getRgOrgaoEmissor());
texto = replaceTexto
(texto,
"#NACIONALIDADE", pessoa.
getNacionalidade());
texto = replaceTexto
(texto,
"#PAI_NOME", pessoa.
getNomePai());
texto = replaceTexto
(texto,
"#MAE_NOME", pessoa.
getNomeMae());
texto = replaceTexto
(texto,
"#NASCIMENTO_DATA", pessoa.
getDataNascimentoFormatada());
texto = replaceTexto
(texto,
"#NASCIMENTO_LOCAL", pessoa.
getLocalNascimento());
texto = replaceTexto
(texto,
"#NASCIMENTO_UF", pessoa.
getUfNascimento());
texto = replaceTexto
(texto,
"#EMAIL", pessoa.
getEmail());
texto = replaceTexto
(texto,
"#TELEFONE", pessoa.
getTelefone());
texto = replaceTexto
(texto,
"#DEFICIENCIA_MOTORA_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? pessoa.
getPessoaDeficienteMotora()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_MOTORA_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? !pessoa.
getPessoaDeficienteMotora()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_VISUAL_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? pessoa.
getPessoaDeficienteVisual()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_VISUAL_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? !pessoa.
getPessoaDeficienteVisual()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_AUDITIVA_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? pessoa.
getPessoaDeficienteAuditiva()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_AUDITIVA_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? !pessoa.
getPessoaDeficienteAuditiva()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#REABILITADO_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? pessoa.
getPessoaReabilitado()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#REABILITADO_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getPessoaDeficienteMotora())? !pessoa.
getPessoaReabilitado()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEFICIENCIA_OBSERVACOES", pessoa.
getPessoaDeficienteObservacao());
for (TipoDependentes tipoDependente : TipoDependentes.
values()) {
texto = replaceTexto
(texto,
"#TIPO_DEPENDENTE[" + tipoDependente.
getValor() +
"]", VerificadorUtil.
naoEstaNulo(pessoa.
getTipoEstadoCivil())?
pessoa.
getTipoEstadoCivil().
equals(tipoDependente.
getValor())? "X" :
" " :
" ");
}
texto = replaceTexto
(texto,
"#DEPENDENTES_DADOS", pessoa.
getDadosDependentes());
texto = replaceTexto
(texto,
"#DEPENDENTES_IRRF_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getDependentesFinsIRRF())? pessoa.
getDependentesFinsIRRF()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEPENDENTES_IRRF_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getDependentesFinsIRRF())? !pessoa.
getDependentesFinsIRRF()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEPENDENTES_SAL_FAMILIA_SIM", VerificadorUtil.
naoEstaNulo(pessoa.
getDependentesFinsSalarioFamilia())? pessoa.
getDependentesFinsSalarioFamilia()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#DEPENDENTES_SAL_FAMILIA_NAO", VerificadorUtil.
naoEstaNulo(pessoa.
getDependentesFinsSalarioFamilia())? !pessoa.
getDependentesFinsSalarioFamilia()? "X" :
" " :
" ");
for (TipoEstadoCivil estadoCivil : TipoEstadoCivil.
values()) {
texto = replaceTexto
(texto,
"#ESTADOCIVIL[" + estadoCivil.
getValor() +
"]", VerificadorUtil.
naoEstaNulo(pessoa.
getTipoEstadoCivil())?
pessoa.
getTipoEstadoCivil().
equals(estadoCivil.
getValor())? "X" :
" " :
" ");
}
for (TipoSexo sexo : TipoSexo.
values()) {
texto = replaceTexto
(texto,
"#SEXO[" + sexo.
getValor() +
"]", VerificadorUtil.
naoEstaNulo(pessoa.
getSexo())?
pessoa.
getSexo().
equals(sexo.
getValor())? "X" :
" " :
" ");
}
for (TipoRacaCor racaCor : TipoRacaCor.
values()) {
texto = replaceTexto
(texto,
"#RACA_" + racaCor.
getValor(), VerificadorUtil.
naoEstaNulo(pessoa.
getTipoRacaCor())?
pessoa.
getTipoRacaCor().
equals(racaCor.
getValor())? "X" :
" " :
" ");
}
for (TipoEscolaridade escolaridade : TipoEscolaridade.
values()) {
texto = replaceTexto
(texto,
"#ESCOLARIDADE[" + escolaridade.
getValor() +
"]", VerificadorUtil.
naoEstaNulo(pessoa.
getTipoEscolaridade())?
pessoa.
getTipoEscolaridade().
equals(escolaridade.
getValor())? "X" :
" " :
" ");
}
if (VerificadorUtil.
naoEstaNulo(pessoa.
getEnderecoPrincipal())) {
texto = replaceTexto
(texto,
"#ENDERECO_LOGRADOURO", pessoa.
getEnderecoPrincipal().
getLogradouro());
texto = replaceTexto
(texto,
"#ENDERECO_NUMERO", pessoa.
getEnderecoPrincipal().
getNumero());
texto = replaceTexto
(texto,
"#ENDERECO_BAIRRO", pessoa.
getEnderecoPrincipal().
getBairro());
texto = replaceTexto
(texto,
"#ENDERECO_COMPLEMENTO", pessoa.
getEnderecoPrincipal().
getComplemento());
texto = replaceTexto
(texto,
"#ENDERECO_CIDADE", pessoa.
getEnderecoPrincipal().
getMunicipio());
texto = replaceTexto
(texto,
"#ENDERECO_CEP", pessoa.
getEnderecoPrincipal().
getCepFormatado());
texto = replaceTexto
(texto,
"#ENDERECO_PAIS",
"BRASIL");
texto = replaceTexto
(texto,
"#ENDERECO_PROPRIA", VerificadorUtil.
naoEstaNulo(pessoa.
getEnderecoPrincipal().
getIndicadorPropria())?
pessoa.
getEnderecoPrincipal().
getIndicadorPropria()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#ENDERECO_NAOPROPRIA", VerificadorUtil.
naoEstaNulo(pessoa.
getEnderecoPrincipal().
getIndicadorPropria())?
!pessoa.
getEnderecoPrincipal().
getIndicadorPropria()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#ENDERECO_COM_FGTS", VerificadorUtil.
naoEstaNulo(pessoa.
getEnderecoPrincipal().
getIndicadorUsoFgts())?
!pessoa.
getEnderecoPrincipal().
getIndicadorUsoFgts()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#ENDERECO_SEM_FGTS", VerificadorUtil.
naoEstaNulo(pessoa.
getEnderecoPrincipal().
getIndicadorUsoFgts())?
!pessoa.
getEnderecoPrincipal().
getIndicadorUsoFgts()? "X" :
" " :
" ");
}
if (VerificadorUtil.
naoEstaNulo(funcionario
)) {
texto = replaceTexto
(texto,
"#PIS", funcionario.
getPis());
texto = replaceTexto
(texto,
"#CTPS_NUMERO", funcionario.
getCtps());
texto = replaceTexto
(texto,
"#CTPS_SERIE", funcionario.
getCtpsSerie());
texto = replaceTexto
(texto,
"#CTPS_UF", funcionario.
getCtpsUf());
texto = replaceTexto
(texto,
"#PRIMEIRO_EMPREGO_SIM", VerificadorUtil.
naoEstaNulo(funcionario.
getPrimeiroEmprego())? funcionario.
getPrimeiroEmprego()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#PRIMEIRO_EMPREGO_NAO", VerificadorUtil.
naoEstaNulo(funcionario.
getPrimeiroEmprego())? !funcionario.
getPrimeiroEmprego()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#OPTANTE_FGTS_SIM", VerificadorUtil.
naoEstaNulo(funcionario.
getOptantePeloFGTS())? funcionario.
getOptantePeloFGTS()? "X" :
" " :
" ");
texto = replaceTexto
(texto,
"#OPTANTE_FGTS_NAO", VerificadorUtil.
naoEstaNulo(funcionario.
getOptantePeloFGTS())? !funcionario.
getOptantePeloFGTS()? "X" :
" " :
" ");
}
return texto
;
}
private String replaceTexto
(String texto,
String codigo,
String campo
) {
if (texto
!=
null && texto.
contains(codigo
)) {
if (VerificadorUtil.
naoEstaNulo(campo
)) {
return texto.
replace(codigo, campo
);
} else {
return texto.
replace(codigo,
" ");
}
}
return texto
;
}
/*
@Override
public List<Pessoa> consultarPessoasJuridicas() {
return pessoaRepository.consultarPessoasJuridicas();
}
*/
}