package br.com.ec.domain.service.cliente.impl;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
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.model.Cliente;
import br.com.ec.domain.model.tipos.TipoCashback;
import br.com.ec.domain.service.cashback.CashbackService;
import br.com.ec.domain.service.cliente.ClienteService;
import br.com.ec.domain.service.pedido.PedidoService;
import br.com.ec.infrastructure.repository.ClienteRepository;
@Service
public class ClienteServiceImpl
extends AbstractService
<Cliente
> implements ClienteService
{
private PedidoService pedidoService
;
private CashbackService cashbackService
;
private ClienteRepository clienteRepository
;
@Autowired
public ClienteServiceImpl
(Validador validador, PedidoService pedidoService, CashbackService cashbackService, ClienteRepository clienteRepository
) {
super(validador
);
this.
pedidoService = pedidoService
;
this.
cashbackService = cashbackService
;
this.
clienteRepository = clienteRepository
;
}
@
Override
protected GenericRepository
<Cliente
> getRepository
() {
return clienteRepository
;
}
@
Override
protected void regrasNegocioCadastrar
(Cliente cliente
) {
cliente.
setAtivo(true);
cliente.
setDataCadastro(DataUtils.
getDataAtual());
verificarSeCpfCnpjJaExiste
(cliente
);
}
@
Override
protected void regrasNegocioAlterar
(Cliente cliente
) {
super.
regrasNegocioAlterar(cliente
);
verificarSeCpfCnpjJaExiste
(cliente
);
}
private void verificarSeCpfCnpjJaExiste
(Cliente cliente
) {
if (VerificadorUtil.
naoEstaNulo(clienteRepository.
consultarClientePorCpfCnpj(cliente.
getCpfCnpj(), cliente.
getSequencial()))) {
throw new NegocioException
("CPF/CNPJ JÁ EXISTE.");
}
}
@
Override
public Cliente detalharCliente
(Cliente cliente
) {
Cliente clienteDetalhado = clienteRepository.
detalharCliente(cliente
);
clienteDetalhado.
setPedidos(pedidoService.
consultarPedidosDoCliente(cliente
));
clienteDetalhado.
setListaCashback(cashbackService.
consultarCashbackCliente(cliente.
getSequencial()));
return clienteDetalhado
;
}
@
Override
public Cliente consultarClientePorCpfCnpj
(String cpfCnpj
) {
Cliente cliente = clienteRepository.
consultarClientePorCpfCnpj(cpfCnpj,
null);
cliente.
setValorCashbackDisponivel(cashbackService.
consultarSaldoCliente(cliente.
getSequencial()));
return cliente
;
}
@
Override
public Cliente consultarClientePorCpfCnpjOuContato
(String cpfCnpj,
String contatoCliente
) {
return clienteRepository.
consultarClientePorCpfCnpjOuContato(cpfCnpj, contatoCliente
);
}
@
Override
protected void regrasNegocioExcluir
(Cliente cliente
) {
if (verificarSeClientePossuiVendas
(cliente
)) {
throw new NegocioException
("Não é permitido excluir o cliente que possui vendas");
}
}
private boolean verificarSeClientePossuiVendas
(Cliente cliente
) {
return clienteRepository.
verificarSeClientePossuiVendas(cliente
);
}
@
Override
public StreamedContent gerarArquivoExcel
(ParametrosConsulta
<Cliente
> parametrosConsulta
) {
HSSFWorkbook wb =
new HSSFWorkbook
();
HSSFSheet aba = ExcelUtil.
criarAbas(wb,
"CLIENTES");
CellStyle headerStyle = ExcelUtil.
configurarCelulaCabecalho(wb
);
Row linhaHeader = aba.
createRow(0);
ExcelUtil.
criarCelula(wb, aba, linhaHeader,
0, headerStyle,
"NOME");
ExcelUtil.
criarCelula(wb, aba, linhaHeader,
1, headerStyle,
"CPF/CNPJ");
ExcelUtil.
criarCelula(wb, aba, linhaHeader,
2, headerStyle,
"CONTATO");
ExcelUtil.
criarCelula(wb, aba, linhaHeader,
3, headerStyle,
"TELEFONE");
ExcelUtil.
criarCelula(wb, aba, linhaHeader,
4, headerStyle,
"EMAIL");
// CONSULTAR
ArrayList<Cliente
> clientes =
(ArrayList<Cliente
>) clienteRepository.
consultarPassandoParametrosConsulta(parametrosConsulta,
0,
clienteRepository.
obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta
),
null,
null,
new HashMap<String,
Object>());
// PREENCHER
Integer numeroLinha =
1;
CellStyle estilo = ExcelUtil.
configurarCelulaTexto(wb
);
for (Cliente cliente : clientes
) {
Row linha = aba.
createRow(numeroLinha
);
ExcelUtil.
criarCelula(wb, aba, linha,
0, estilo, cliente.
getNome());
ExcelUtil.
criarCelula(wb, aba, linha,
1, estilo, cliente.
getCpfCnpjFormatado());
ExcelUtil.
criarCelula(wb, aba, linha,
2, estilo, cliente.
getContato());
ExcelUtil.
criarCelula(wb, aba, linha,
3, estilo, cliente.
getTelefone());
ExcelUtil.
criarCelula(wb, aba, linha,
4, estilo, cliente.
getEmail());
numeroLinha++
;
}
try {
ByteArrayOutputStream stream =
new ByteArrayOutputStream();
wb.
write(stream
);
stream.
close();
wb.
close();
return new DefaultStreamedContent
(ArquivoUtil.
gerarInputStreamDeArquivo(stream.
toByteArray()), TipoExtensao.
EXCEL.
getDescricao(),
"clientes.xls");
} catch (FileNotFoundException e
) {
e.
printStackTrace();
} catch (IOException e
) {
e.
printStackTrace();
}
return null;
}
}