package br.com.ec.domain.service.impl;
import java.util.ArrayList;
import java.util.List;
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.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.AvaliacaoDTO;
import br.com.ec.domain.dto.AvaliacaoFuncionarioDTO;
import br.com.ec.domain.dto.AvaliacaoLojaDTO;
import br.com.ec.domain.dto.AvaliacaoLojaFuncionarioDTO;
import br.com.ec.domain.dto.FuncionarioDTO;
import br.com.ec.domain.dto.LojaDTO;
import br.com.ec.domain.dto.VigenciaDTO;
import br.com.ec.domain.model.Avaliacao;
import br.com.ec.domain.model.AvaliacaoFuncionario;
import br.com.ec.domain.model.AvaliacaoFuncionarioId;
import br.com.ec.domain.model.AvaliacaoLoja;
import br.com.ec.domain.model.AvaliacaoProduto;
import br.com.ec.domain.model.Funcionario;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.Vigencia;
import br.com.ec.domain.service.AvaliacaoFuncionarioService;
import br.com.ec.domain.service.AvaliacaoLojaService;
import br.com.ec.domain.service.AvaliacaoProdutoService;
import br.com.ec.domain.service.AvaliacaoService;
import br.com.ec.domain.service.FuncionarioService;
import br.com.ec.domain.service.LojaService;
import br.com.ec.domain.service.ProdutoService;
import br.com.ec.repository.AvaliacaoRepository;
@Service
public class AvaliacaoServiceImpl
extends AbstractService
<Avaliacao
> implements AvaliacaoService
{
private AvaliacaoRepository avaliacaoRepository
;
private ProdutoService produtoService
;
private AvaliacaoProdutoService avaliacaoProdutoService
;
private AvaliacaoLojaService avaliacaoLojaService
;
private AvaliacaoFuncionarioService avaliacaoFuncionarioService
;
private FuncionarioService funcionarioService
;
private LojaService lojaService
;
@Autowired
public AvaliacaoServiceImpl
(Validador validador, AvaliacaoRepository avaliacaoRepository,
ProdutoService produtoService, AvaliacaoProdutoService avaliacaoProdutoService,
AvaliacaoLojaService avaliacaoLojaService, AvaliacaoFuncionarioService avaliacaoFuncionarioService,
FuncionarioService funcionarioService, LojaService lojaService
) {
super(validador
);
this.
avaliacaoRepository = avaliacaoRepository
;
this.
produtoService = produtoService
;
this.
avaliacaoProdutoService = avaliacaoProdutoService
;
this.
avaliacaoLojaService = avaliacaoLojaService
;
this.
avaliacaoFuncionarioService = avaliacaoFuncionarioService
;
this.
funcionarioService = funcionarioService
;
this.
lojaService = lojaService
;
}
@
Override
protected GenericRepository
<Avaliacao
> getRepository
() {
return avaliacaoRepository
;
}
@
Override
public AvaliacaoDTO consultarAvaliacao
(Long sequencialVigencia
) {
return avaliacaoRepository.
consultarAvaliacao(sequencialVigencia
);
}
@
Override
public List<AvaliacaoProduto
> consultarProdutosPromocaoInterna
(Long sequencialAvaliacao
) {
return avaliacaoRepository.
consultarProdutosPromocaoInterna(sequencialAvaliacao
);
}
@
Override
public void excluirProdutoPromocaoInterna
(AvaliacaoProduto avaliacaoProduto
) {
avaliacaoRepository.
excluirProdutoPromocaoInterna(avaliacaoProduto
);
}
@
Override
public void cadastrarProdutoPromocaoInterna
(Avaliacao avaliacao,
String codigoProduto
) {
Produto produto = produtoService.
consultarProdutoPorCodigo(codigoProduto
);
if (VerificadorUtil.
estaNulo(produto
)) {
throw new NegocioException
("Produto não identificado");
}
AvaliacaoProduto avaliacaoProduto =
new AvaliacaoProduto
();
avaliacaoProduto.
setProduto(produto
);
avaliacaoProduto.
setAvaliacao(avaliacaoRepository.
consultarPorId(avaliacao
));
avaliacaoProdutoService.
cadastrar(avaliacaoProduto
);
}
@
Override
public AvaliacaoDTO consultarAvaliacaoCompleta
(Long sequencialAvaliacao
) {
List<AvaliacaoLojaFuncionarioDTO
> avaliacaoLojaFuncionarioDTOs =
new ArrayList<AvaliacaoLojaFuncionarioDTO
>();
AvaliacaoDTO avaliacaoDetalhada = avaliacaoRepository.
consultarAvaliacaoDetalhada(sequencialAvaliacao
);
// CONSULTAR AVALIAÇÕES DAS LOJAS
List<AvaliacaoLojaDTO
> avaliacoesLojas = avaliacaoLojaService.
consultarAvaliacaoLojaDaAvaliacao(avaliacaoDetalhada.
getSequencial());
// CONSULTAR AVALIAÇÕES DOS FUNCIONÁRIOS
for (AvaliacaoLojaDTO avaliacaoLojaDTO : avaliacoesLojas
) {
AvaliacaoLojaFuncionarioDTO avaliacaoLojaFuncionarioDTO =
new AvaliacaoLojaFuncionarioDTO
();
avaliacaoLojaFuncionarioDTO.
setLoja(avaliacaoLojaDTO
);
avaliacaoLojaFuncionarioDTO.
setObservacao(avaliacaoLojaDTO.
getObservacao());
avaliacaoLojaFuncionarioDTO.
setValorMetaMensal(avaliacaoLojaDTO.
getValorMetaMensal());
avaliacaoLojaFuncionarioDTO.
setValorMargemContribuicao(avaliacaoLojaDTO.
getValorMargemContribuicao());
List<AvaliacaoFuncionarioDTO
> avaliacaoFuncionarioDTOs = avaliacaoFuncionarioService.
consultarAvaliacoesFuncionarioDaLoja(avaliacaoLojaDTO.
getAvaliacaoDTO().
getSequencial(), avaliacaoLojaDTO.
getLojaDTO().
getSequencial());
// CONSULTAR DADOS COMPLETOS (FUNCIONARIO E USUARIO)
for (AvaliacaoFuncionarioDTO avaliacaoFuncionarioDTO : avaliacaoFuncionarioDTOs
) {
FuncionarioDTO funcionarioDTOConsultado = funcionarioService.
consultar(avaliacaoFuncionarioDTO.
getSequencialDoFuncionario());
avaliacaoFuncionarioDTO.
setFuncionarioDTO(funcionarioDTOConsultado
);
}
avaliacaoLojaFuncionarioDTO.
setFuncionarios(avaliacaoFuncionarioDTOs
);
avaliacaoLojaFuncionarioDTOs.
add(avaliacaoLojaFuncionarioDTO
);
}
avaliacaoDetalhada.
setAvaliacoesLojas(avaliacaoLojaFuncionarioDTOs
);
return avaliacaoDetalhada
;
}
@
Override
public void importarAvaliacaoAnterior
(VigenciaDTO vigencia, VigenciaDTO vigenciaSelecionadaParaImportar
) {
Avaliacao avaliacaoNova =
new Avaliacao
();
avaliacaoNova.
setVigencia(new Vigencia
(vigencia.
getSequencial()));
this.
cadastrar(avaliacaoNova
);
AvaliacaoDTO avaliacaoAnterior =
this.
consultarAvaliacao(vigenciaSelecionadaParaImportar.
getSequencial());
avaliacaoAnterior =
this.
consultarAvaliacaoCompleta(avaliacaoAnterior.
getSequencial());
List<AvaliacaoLoja
> lojasParticipantesNovas =
new ArrayList<AvaliacaoLoja
>();
List<AvaliacaoFuncionario
> participantesNovos =
new ArrayList<AvaliacaoFuncionario
>();
for (AvaliacaoLojaFuncionarioDTO avaliacaoLojaFuncionarioDTO : avaliacaoAnterior.
getAvaliacoesLojas()) {
AvaliacaoLoja avaliacaoLojaNovo =
new AvaliacaoLoja
();
avaliacaoLojaNovo.
setAvaliacao(avaliacaoNova
);
avaliacaoLojaNovo.
setLoja(new Loja
(avaliacaoLojaFuncionarioDTO.
getLoja().
getLojaDTO().
getSequencial()));
avaliacaoLojaNovo.
setValorMetaMensal(avaliacaoLojaFuncionarioDTO.
getValorMetaMensal());
avaliacaoLojaNovo.
setValorMargemContribuicao(avaliacaoLojaFuncionarioDTO.
getValorMargemContribuicao());
lojasParticipantesNovas.
add(avaliacaoLojaNovo
);
for (AvaliacaoFuncionarioDTO avaliacaoFuncionarioDTO : avaliacaoLojaFuncionarioDTO.
getFuncionarios()) {
AvaliacaoFuncionario avaliacaoFuncionarioNovo =
new AvaliacaoFuncionario
();
avaliacaoFuncionarioNovo.
setAvaliacao(avaliacaoNova
);
avaliacaoFuncionarioNovo.
setFuncionario(new Funcionario
(avaliacaoFuncionarioDTO.
getSequencialDoFuncionario()));
avaliacaoFuncionarioNovo.
setLoja(new Loja
(avaliacaoFuncionarioDTO.
getSequencialDaLoja()));
avaliacaoFuncionarioNovo.
setValorMetaMensal(avaliacaoFuncionarioDTO.
getValorMetaMensal());
participantesNovos.
add(avaliacaoFuncionarioNovo
);
}
}
avaliacaoNova.
getParticipantes().
addAll(participantesNovos
);
avaliacaoNova.
getLojasParticipantes().
addAll(lojasParticipantesNovas
);
this.
alterar(avaliacaoNova
);
}
@
Override
public void adicionarLojaNaAvaliacao
(AvaliacaoDTO avaliacao, LojaDTO lojaParticipante
) {
// VERIFICAR SE LOJA JÁ CONTA NA AVALIAÇÃO
for (AvaliacaoLojaFuncionarioDTO avaliacaoLojaFuncionarioDTO : avaliacao.
getAvaliacoesLojas()) {
if (avaliacaoLojaFuncionarioDTO.
getLoja().
getLojaDTO().
getSequencial().
equals(lojaParticipante.
getSequencial())) {
throw new NegocioException
("LOJA JÁ PRESENTE NA AVALIAÇÃO");
}
}
AvaliacaoLoja avaliacaoLoja =
new AvaliacaoLoja
();
avaliacaoLoja.
setAvaliacao(consultarPorId
(new Avaliacao
(avaliacao.
getSequencial())));
avaliacaoLoja.
setLoja(lojaService.
consultarPorId(new Loja
(lojaParticipante.
getSequencial())));
avaliacaoLojaService.
cadastrar(avaliacaoLoja
);
}
@
Override
public void removerLojaDaAvaliacao
(AvaliacaoDTO avaliacao, LojaDTO lojaParticipante
) {
AvaliacaoLoja avaliacaoLoja =
new AvaliacaoLoja
();
avaliacaoLoja.
setAvaliacao(consultarPorId
(new Avaliacao
(avaliacao.
getSequencial())));
avaliacaoLoja.
setLoja(lojaService.
consultarPorId(new Loja
(lojaParticipante.
getSequencial())));
avaliacaoLoja = avaliacaoLojaService.
consultarPorId(avaliacaoLoja
);
avaliacaoLojaService.
excluir(avaliacaoLoja
);
}
@
Override
public void adicionarParticipanteNaAvaliacao
(AvaliacaoDTO avaliacao, LojaDTO lojaParticipante, FuncionarioDTO funcionarioParticipante
) {
// VERIFICAR SE PARTICIPANTE JÁ CONTA NA AVALIAÇÃO
for (AvaliacaoLojaFuncionarioDTO avaliacaoLojaFuncionarioDTO : avaliacao.
getAvaliacoesLojas()) {
for (AvaliacaoFuncionarioDTO avaliacaoFuncionarioDTO : avaliacaoLojaFuncionarioDTO.
getFuncionarios()) {
if (avaliacaoFuncionarioDTO.
getFuncionarioDTO().
getSequencialFuncionario().
equals(funcionarioParticipante.
getSequencialFuncionario())) {
throw new NegocioException
("FUNCIONÁRIO JÁ PRESENTE NA AVALIAÇÃO");
}
}
}
AvaliacaoFuncionario avaliacaoFuncionario =
new AvaliacaoFuncionario
();
avaliacaoFuncionario.
setAvaliacao(consultarPorId
(new Avaliacao
(avaliacao.
getSequencial())));
avaliacaoFuncionario.
setLoja(lojaService.
consultarPorId(new Loja
(lojaParticipante.
getSequencial())));
Funcionario funcionario =
new Funcionario
(funcionarioParticipante.
getSequencialFuncionario());
avaliacaoFuncionario.
setFuncionario(funcionarioService.
consultarPorId(funcionario
));
avaliacaoFuncionarioService.
cadastrar(avaliacaoFuncionario
);
}
@
Override
public void removerParticipanteDaAvaliacao
(AvaliacaoFuncionarioDTO avaliacaoFuncionarioDTO
) {
AvaliacaoFuncionarioId avaliacaoFuncionarioId =
new AvaliacaoFuncionarioId
();
avaliacaoFuncionarioId.
setSequencialAvaliacao(avaliacaoFuncionarioDTO.
getSequencialDaAvaliacao());
avaliacaoFuncionarioId.
setSequencialFuncionario(avaliacaoFuncionarioDTO.
getSequencialDoFuncionario());
avaliacaoFuncionarioService.
excluir(avaliacaoFuncionarioId
);
}
/*
@Override
public Avaliacao detalhar(Avaliacao avaliacao) {
return avaliacaoRepository.detalhar(avaliacao);
}
@Override
public Avaliacao consultarAvaliacaoDaVigencia(Vigencia vigencia) {
return avaliacaoRepository.consultarAvaliacaoDaVigencia(vigencia);
}
@Override
public List<Avaliacao> consultarAvaliacoesDivulgadas() {
return avaliacaoRepository.consultarAvaliacoesDivulgadas();
}
@Override
public void solicitarReavaliacao(RankingVendedorDTO rankingVendedor, String solicitacao) {
StringBuilder conteudo = new StringBuilder();
conteudo.append("SOLICITANTE: " + rankingVendedor.getVendedor().getNomeDaPessoa() + "\n");
conteudo.append("DATA DA SOLICITAÇÃO: " + DataUtil.retornarDataFormatadaEmFormatoTexto("dd/MM/yyyy 'às' HH:mm", DataUtils.getDataAtual()) + "\n");
conteudo.append("OBSERVAÇÕES: \n");
conteudo.append(solicitacao);
Pendencia pendencia = new Pendencia();
pendencia.setDescricao("SOLICITAÇÃO DE REAVALIAÇÃO: " + rankingVendedor.getVendedor().getNomeDaPessoa());
pendencia.setUsuario(usuarioService.consultarUsuarioPorPessoa(rankingVendedor.getVendedor().getPessoa()));
pendencia.setData(DataUtils.getDataAtual());
if (VerificadorUtil.estaNulo(rankingVendedor.getVendedor().getLoja())) {
pendencia.setLoja(new Loja(ConstantesSEC.SEQUENCIAL_MATRIZ_ESTOQUE_9.longValue()));
} else {
pendencia.setLoja(rankingVendedor.getVendedor().getLoja());
}
Perfil perfilRh = new Perfil();
perfilRh.setCodigo(ConstantesSEC.PERFIL_RECURSOS_HUMANOS_11);
pendencia.setPerfil(perfilRh);
pendenciaService.cadastrar(pendencia);
new GerenciadorEmailImpl()
.comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO)
.comAssunto("SOLICITAÇÃO DE REAVALIAÇÃO")
.comConteudo(conteudo.toString())
.enviar();
}
@Override
public byte[] emitirRelatorioImportacaoFolhaPagamento(ServletContext contexto, Avaliacao avaliacao, Long empresa) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
String caminhoArquivo = "/arquivos/modelos/Relatório de Importação - Folha de Pagamento Espaço Case.xls";
InputStream arquivo = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(caminhoArquivo);
HSSFWorkbook workbook = new HSSFWorkbook(arquivo);
HSSFSheet sheet = workbook.getSheetAt(0);
Iterator rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = (Row) rowIterator.next();
if (row.getRowNum() < 11) {
continue;
} else {
Iterator cellIterator = row.cellIterator();
Integer codigoFolha = null;
while (cellIterator.hasNext()) {
Boolean atualizar = true;
Cell cell = (Cell) cellIterator.next();
switch (cell.getColumnIndex()) {
case 1:
Integer tipoCelula = cell.getCellType();
if (tipoCelula.equals(Cell.CELL_TYPE_NUMERIC)) {
Double codigo = cell.getNumericCellValue();
codigoFolha = codigo.intValue();
} else {
atualizar = false;
}
break;
case 3:
if (atualizar) {
for (AvaliacaoFuncionario avaliacaoFunc : avaliacao.getParticipantes()) {
if (VerificadorUtil.estaNulo(avaliacaoFunc.getFuncionario().getCodigoContabilidade())) {
throw new NegocioException("Participante " + avaliacaoFunc.getFuncionario().getNomeDaPessoa() + " sem código contábil cadastrado");
}
if (avaliacaoFunc.getFuncionario().getTipoComissionamento().equals(TipoComissionamento.parse(empresa).getValor()) &&
avaliacaoFunc.getFuncionario().getCodigoContabilidade().equals(codigoFolha)) {
Double valorComissao = avaliacaoFunc.getValorComissao();
if (VerificadorUtil.estaNulo(valorComissao)) {
throw new NegocioException("Obrigatório informar todas as comissões");
}
String valor = StringUtil.formatarValorComDoisDigitos(valorComissao.toString());
cell.setCellValue(valor.replace(".", ","));
break;
}
}
}
break;
}
}
}
}
try {
workbook.write(baos);
return baos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
baos.close();
arquivo.close();
workbook.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NegocioException ne) {
throw new NegocioException(ne.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
*/
}