Subversion Repositories Integrator Subversion

Rev

Rev 195 | Rev 686 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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.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 ClienteRepository clienteRepository;

        @Autowired
        public ClienteServiceImpl(Validador validador, PedidoService pedidoService, ClienteRepository clienteRepository) {
                super(validador);
                this.pedidoService = pedidoService;
                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));
                return clienteDetalhado;
        }
       
        @Override
        public Cliente consultarClientePorCpfCnpj(String cpfCnpj) {
                return clienteRepository.consultarClientePorCpfCnpj(cpfCnpj, null);
        }
       
        @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;
        }
       
}