package br.com.ec.domain.service.pedido.impl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
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.domain.dto.RankingPedidoDTO;
import br.com.ec.domain.model.Cliente;
import br.com.ec.domain.model.CompraProduto;
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.tipos.TipoGenero;
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
import br.com.ec.domain.service.pedido.PedidoService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.infrastructure.repository.PedidoRepository;
import br.edu.cesmac.core.consulta.ParametrosConsulta;
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.ArquivoUtil;
import br.edu.cesmac.core.util.DataUtils;
import br.edu.cesmac.core.util.TipoExtensao;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.core.validador.Validador;
@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
;
}
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 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;
}
}