package br.com.ec.domain.service.pedido.impl;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ec.controller.util.ExcelUtil;
import br.com.ec.core.consulta.ParametrosConsulta;
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.ArquivoUtil;
import br.com.ec.core.util.DataUtils;
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.ParametrosVendaDTO;
import br.com.ec.domain.dto.RankingPedidoDTO;
import br.com.ec.domain.model.Cliente;
import br.com.ec.domain.model.Lancamento;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Pedido;
import br.com.ec.domain.model.PedidoHistorico;
import br.com.ec.domain.model.PedidoProduto;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.Venda;
import br.com.ec.domain.model.tipos.TipoPedido;
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
import br.com.ec.domain.service.pedido.PedidoService;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.infrastructure.repository.PedidoRepository;
@Service
public class PedidoServiceImpl
extends AbstractService
<Pedido
> implements PedidoService
{
private UsuarioService usuarioService
;
private PedidoRepository pedidoRepository
;
@Autowired
public PedidoServiceImpl
(Validador validador, UsuarioService usuarioService, PedidoRepository pedidoRepository
) {
super(validador
);
this.
usuarioService = usuarioService
;
this.
pedidoRepository = pedidoRepository
;
}
@
Override
protected GenericRepository
<Pedido
> getRepository
() {
return pedidoRepository
;
}
@
Override
public Pedido consultarPedidoCompleto
(Pedido pedido
) {
return pedidoRepository.
consultarPedidoCompleto(pedido
);
}
@
Override
protected void regrasNegocioAlterar
(Pedido pedido
) {
super.
regrasNegocioAlterar(pedido
);
verificarParametros
(pedido
);
}
@
Override
public Pedido adicionarPedido
(final Pedido pedido,
final String senhaUsuario
) {
verificarParametros
(pedido
);
pedido.
setUsuarioPedido(usuarioService.
consultarUsuarioPorSenha(senhaUsuario
));
pedido.
setDataPedido(DataUtils.
getDataAtual());
pedido.
setDataUltimaAlteracaoSituacao(DataUtils.
getDataAtual());
List<PedidoProduto
> produtos = pedido.
getProdutos();
if (produtos.
isEmpty()) {
produtos =
null;
}
pedido.
setProdutos(null);
cadastrar
(pedido
);
pedido.
setProdutos(produtos
);
alterar
(pedido
);
return pedido
;
}
@
Override
public Long cadastrarPedidoVendaPersonalizada
(Venda vendaCadastrada, ParametrosVendaDTO parametrosVendaDTO
) {
Boolean cadastrarPedido =
false;
for (Lancamento lancamento : parametrosVendaDTO.
getLancamentos()) {
if (VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getTipoPersonalizacao())) {
cadastrarPedido =
true;
break;
}
if (VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getEstampa())) {
cadastrarPedido =
true;
break;
}
}
if (cadastrarPedido
) {
Pedido pedido =
new Pedido
();
pedido.
setTipoPedido(TipoPedido.
PERSONALIZACAO.
getValor());
pedido.
setTipoSituacao(TipoSituacaoPedido.
NOVO.
getValor());
pedido.
setDataPedido(DataUtils.
getDataAtual());
pedido.
setLoja(vendaCadastrada.
getLoja());
if (VerificadorUtil.
estaNulo(vendaCadastrada.
getCliente())) {
pedido.
setContatoCliente(vendaCadastrada.
getObservacao());
}
pedido.
setCliente(vendaCadastrada.
getCliente());
pedido.
setObservacao(vendaCadastrada.
getObservacao());
pedido.
setUsuarioPedido(usuarioService.
consultarUsuarioPorPessoa(vendaCadastrada.
getVendedor().
getPessoa()));
pedido.
setVenda(vendaCadastrada
);
this.
cadastrar(pedido
);
List<PedidoHistorico
> historico =
new ArrayList<PedidoHistorico
>();
PedidoHistorico pedidoHistorico =
new PedidoHistorico
();
pedidoHistorico.
setPedido(pedido
);
pedidoHistorico.
setDataHistorico(DataUtils.
getDataAtual());
pedidoHistorico.
setObservacao("VENDA: " + vendaCadastrada.
getSequencial());
pedidoHistorico.
setTipoSituacao(TipoSituacaoPedido.
NOVO.
getValor());
pedidoHistorico.
setUsuario(pedido.
getUsuarioPedido());
historico.
add(pedidoHistorico
);
pedido.
setHistorico(historico
);
List<PedidoProduto
> pedidosProduto =
new ArrayList<PedidoProduto
>();
for (Lancamento lancamento : parametrosVendaDTO.
getLancamentos()) {
if ((VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getTipoPersonalizacao())) ||
(VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getEstampa()))) {
PedidoProduto pedidoProduto =
new PedidoProduto
();
pedidoProduto.
setPedido(pedido
);
pedidoProduto.
setProduto(lancamento.
getProduto());
pedidoProduto.
setValor(lancamento.
getValorVenda());
pedidoProduto.
setEstampa(lancamento.
getEstampa());
pedidoProduto.
setTipoPersonalizacao(lancamento.
getTipoPersonalizacao());
pedidoProduto.
setObservacao(lancamento.
getObservacao());
pedidosProduto.
add(pedidoProduto
);
}
}
pedido.
setProdutos(pedidosProduto
);
this.
alterar(pedido
);
return pedido.
getSequencial();
}
return null;
}
private void verificarParametros
(final Pedido pedido
) {
if (VerificadorUtil.
estaNulo(pedido.
getCliente()) &&
VerificadorUtil.
estaNuloOuVazio(pedido.
getContatoCliente())) {
throw new NegocioException
("Informe o contato do cliente.");
}
if (VerificadorUtil.
estaNulo(pedido.
getProdutos())) {
pedido.
setProdutos(new ArrayList<PedidoProduto
>());
}
if (pedido.
getProdutos().
isEmpty() && (VerificadorUtil.
estaNulo(pedido.
getModelo()))) {
throw new NegocioException
("Informe algum produto ou o modelo");
}
if (VerificadorUtil.
naoEstaNuloOuVazio(pedido.
getProdutos())) {
if (pedido.
getProdutos().
size() ==
1) {
Produto primeiroProduto = pedido.
getProdutos().
get(0).
getProduto();
pedido.
setModelo(primeiroProduto.
getModelo());
pedido.
setTipoProduto(primeiroProduto.
getTipo());
pedido.
setGenero(primeiroProduto.
getGenero());
pedido.
setEstiloProduto(primeiroProduto.
getEstilo());
pedido.
setCorProduto(primeiroProduto.
getCor());
}
}
if (VerificadorUtil.
estaNuloOuVazio(pedido.
getTipoSituacao())) {
pedido.
setTipoSituacao(TipoSituacaoPedido.
NOVO.
getValor());
}
}
@
Override
public List<RankingPedidoDTO
> consultarRankingPedidosNaoAtendidos
(String generoPedidos,
Date dataInicial,
Date dataFinal
) {
return pedidoRepository.
consultarRankingPedidosNaoAtendidos(generoPedidos, dataInicial, dataFinal
);
}
@
Override
public List<RankingPedidoDTO
> consultarRankingPedidos
(String generoPedidos,
Date dataInicial,
Date dataFinal
) {
return pedidoRepository.
consultarRankingPedidos(generoPedidos, dataInicial, dataFinal
);
}
@
Override
public Integer obterQuantidadePedidosPorSituacao
(String tipoPedido,
String tipoSituacaoPedido
) {
return pedidoRepository.
obterQuantidadePedidosPorSituacao(tipoPedido, tipoSituacaoPedido
);
}
@
Override
public Integer obterQuantidadePedidosPorSituacaoEePeriodo
(String tipoPedido,
String tipoSituacaoPedido,
Date dataInicial,
Date dataFinal
) {
return pedidoRepository.
obterQuantidadePedidosPorSituacaoEePeriodo(tipoPedido, tipoSituacaoPedido, dataInicial, dataFinal
);
}
@
Override
public void excluirHistoricosDoPedido
(Pedido pedido
) {
pedidoRepository.
excluirHistoricosDoPedido(pedido
);
}
@
Override
public void solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante
(Loja lojaEntrada, Produto produto
) {
pedidoRepository.
solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(lojaEntrada, produto
);
}
@
Override
public List<PedidoProduto
> consultarPedidosNaoAtendidos
(Produto produto
) {
return pedidoRepository.
consultarPedidosNaoAtendidos(produto
);
}
@
Override
public List<Pedido
> consultarPedidosDoProdutoOuModeloPendentes
(Produto produto
) {
return pedidoRepository.
consultarPedidosDoProdutoOuModeloPendentes(produto
);
}
@
Override
public List<Pedido
> consultarPedidosDoCliente
(Cliente cliente
) {
return pedidoRepository.
consultarPedidosDoCliente(cliente
);
}
@
Override
public Pedido consultarPedidoCompletoDaVenda
(Venda venda
) {
return pedidoRepository.
consultarPedidoCompletoDaVenda(venda
);
}
@
Override
public StreamedContent gerarArquivoExcel
(ParametrosConsulta
<Pedido
> parametrosConsulta
) {
HSSFWorkbook wb =
new HSSFWorkbook
();
HSSFSheet aba = ExcelUtil.
criarAbas(wb,
"PEDIDOS");
ExcelUtil.
configurarCabecalho(wb, aba
);
// CONSULTAR
ArrayList<Pedido
> pedidos =
(ArrayList<Pedido
>) pedidoRepository.
consultarPassandoParametrosConsulta(parametrosConsulta,
0,
pedidoRepository.
obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta
),
null,
null,
new HashMap<String,
Object>());
// PREENCHER
Integer numeroLinha =
1;
for (Pedido pedido : pedidos
) {
Row linha = aba.
createRow(numeroLinha
);
ExcelUtil.
criarCelula(wb, aba, linha,
0, ExcelUtil.
configurarCelulaTexto(wb
), pedido.
getSequencial().
toString());
StringBuilder produtos =
new StringBuilder();
for (PedidoProduto pedidoProduto : pedido.
getProdutos()) {
produtos.
append(pedidoProduto.
getProduto().
getDescricaoComModeloCompletaComCodigo());
produtos.
append(", ");
produtos.
append(pedidoProduto.
getProduto().
getDescricaoDoEstilo());
produtos.
append("; ");
}
ExcelUtil.
criarCelula(wb, aba, linha,
1, ExcelUtil.
configurarCelulaTexto(wb
), produtos.
toString());
ExcelUtil.
criarCelula(wb, aba, linha,
2, ExcelUtil.
configurarCelulaNumerico(wb
), pedido.
getObservacao());
numeroLinha++
;
}
try {
ByteArrayOutputStream stream =
new ByteArrayOutputStream();
wb.
write(stream
);
stream.
close();
wb.
close();
System.
out.
println("Finalizado!");
return new DefaultStreamedContent
(ArquivoUtil.
gerarInputStreamDeArquivo(stream.
toByteArray()), TipoExtensao.
EXCEL.
getDescricao(),
"pedidos.xls");
} catch (FileNotFoundException e
) {
e.
printStackTrace();
} catch (IOException e
) {
e.
printStackTrace();
}
return null;
}
}