Subversion Repositories Integrator Subversion

Rev

Rev 697 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.domain.service.cupom.impl;

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.DataUtils;
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.model.Cupom;
import br.com.ec.domain.model.Lancamento;
import br.com.ec.domain.model.SubtipoProduto;
import br.com.ec.domain.model.tipos.TipoCupom;
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.model.tipos.TipoRegraCupom;
import br.com.ec.domain.service.cupom.CupomService;
import br.com.ec.domain.service.lancamento.LancamentoService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.infrastructure.repository.CupomRepository;

@Service
public class CupomServiceImpl extends AbstractService<Cupom> implements CupomService {
       
        private CupomRepository cupomRepository;
        private LancamentoService lancamentoService;

        @Autowired
        public CupomServiceImpl(Validador validador, CupomRepository cupomRepository, LancamentoService lancamentoService) {
                super(validador);
                this.cupomRepository = cupomRepository;
                this.lancamentoService = lancamentoService;
        }

        @Override
        protected GenericRepository<Cupom> getRepository() {
                return cupomRepository;
        }
       
        @Override
        protected void regrasNegocioCadastrar(Cupom cupom) {
                verificarSeCodigoJaExiste(cupom);
        }
       
        private void verificarSeCodigoJaExiste(Cupom cupom) {
                if (VerificadorUtil.naoEstaNulo(consultarCupomPorCodigo(cupom.getCodigo()))) {
                        throw new NegocioException("CÓDIGO DO CUPOM JÁ EXISTE");
                }
        }
       
        @Override
        public Cupom consultarCupomPorCodigo(String codigo) {
                return cupomRepository.consultarCupomPorCodigo(codigo);
        }
       
        @Override
        public String gerarCodigoValido() {
                Cupom cupomGerado = new Cupom();
                cupomGerado.gerarCodigo();
                if (VerificadorUtil.naoEstaNulo(consultarCupomPorCodigo(cupomGerado.getCodigo()))) {
                        return gerarCodigoValido();
                }
                return cupomGerado.getCodigo();
        }
       
        @Override
        public void excluirCupom(Cupom cupom) {
                if (existeCupomComLancamentoVendas(cupom)) {
                        throw new NegocioException("Não é permitido excluir um cupom com lançamentos em vendas");
                }
                super.excluir(cupom);
        }
       
        private Boolean existeCupomComLancamentoVendas(Cupom cupom) {
                Integer quantidadeUtilizada = lancamentoService.obterQuantidadeVendasComCupom(cupom);
                if (VerificadorUtil.naoEstaNulo(quantidadeUtilizada)) {
                        if (quantidadeUtilizada > 0) {
                                return true;
                        }
                }
                return false;
        }
       
        @Override
        public Cupom separarCupom(Cupom cupom, Double valorSeparacao) {
                verificarCupomValido(cupom);
                if (0.0 >= valorSeparacao || valorSeparacao >= cupom.getValor()) {
                        throw new NegocioException("VALOR NÃO PERMITIDO");
                }
                Cupom cupomNovo = new Cupom();
                try {
                        cupomNovo = cupom.clone();
                } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                }
                cupomNovo.setSequencial(null);
                cupomNovo.setCodigo(gerarCodigoValido());
                cupomNovo.setDataHoraEmissao(DataUtils.getDataAtual());
                cupomNovo.setValor(valorSeparacao);
                cupomNovo.setObservacao("PARCIAL DO CUPOM: " + cupom.getCodigo() + "\n" + cupomNovo.getObservacao());
                cadastrar(cupomNovo);
               
                cupom.setValor(cupom.getValor() - valorSeparacao);
                cupom.setObservacao("PARCIAL DO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupom.getObservacao());
                alterar(cupom);
               
                return cupomNovo;
        }
       
        @Override
        public Cupom unirCupons(Cupom cupom, Cupom cupomParaUnir) {
                verificarCupomValido(cupom);
                verificarCupomValido(cupomParaUnir);
                if (!cupom.getCliente().equals(cupomParaUnir.getCliente())) {
                        throw new NegocioException("OPERAÇÃO NÃO PERMITIRDA: CUPONS PARA DIFERENTES CLIENTES");
                }
                if (VerificadorUtil.naoEstaNulo(cupom.getPercentual()) || VerificadorUtil.naoEstaNulo(cupomParaUnir.getPercentual())) {
                        throw new NegocioException("OPERAÇÃO NÃO PERMITIRDA: CUPOM COM PERCENTUAL");
                }
                Cupom cupomNovo = new Cupom();
                try {
                        cupomNovo = cupom.clone();
                } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                }
                cupomNovo.setSequencial(null);
                cupomNovo.setCodigo(gerarCodigoValido());
                cupomNovo.setDataHoraEmissao(DataUtils.getDataAtual());
                cupomNovo.setValor(cupom.getValor() + cupomParaUnir.getValor());
                cupomNovo.setObservacao("UNIÃO DOS CUPONS: " + cupom.getCodigo() + " E " + cupomParaUnir.getCodigo() + "\n");
                cupomNovo.setObservacao(cupomNovo.getObservacao() + "\n" + cupom.getObservacao() + "\n" + cupomParaUnir.getObservacao());
                cadastrar(cupomNovo);
               
                cupom.setAtivo(false);
                cupom.setObservacao("UNIDO NO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupom.getObservacao());
                alterar(cupom);
               
                cupomParaUnir.setAtivo(false);
                cupomParaUnir.setObservacao("UNIDO NO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupomParaUnir.getObservacao());
                alterar(cupomParaUnir);
                return cupomNovo;
        }
       
        private void verificarCupomValido(Cupom cupom) {
                if (VerificadorUtil.naoEstaNulo(cupom)) {
                        if (existeCupomComLancamentoVendas(cupom)) {
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA; CUPOM JÁ UTILIZADO");
                        }
                        if (!cupom.getAtivo() || !cupom.valido()) {
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA; CUPOM INDISPONÍVEL");
                        }
                        if (!cupom.getTipoCupom().equals(TipoCupom.REEMBOLSO.getValor())) {
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA: CUPOM DEVE SER PARA REEMBOLSO");
                        }
                }
        }
       
        @Override
        public void validarRegrasCupom(ParametrosVendaDTO parametrosVenda, Cupom cupomSelecionado) {
//              APENAS_CAPA_PELICULA_C0("C0", "REGRA: APENAS PARA CAPA OU PELÍCULA");
//              APENAS_PELICULA_TPUSOFT_P1("P1", "REGRA: APENAS PARA PELÍCULA TPU SOFT"),
//              APENAS_PELICULA_TPUSOFTTPASEIRA_P2("P2", "REGRA: APENAS PARA PELÍCULA TPU SOFT TRASEIRA"),
//              APENAS_PELICULA_CAMERACOMFRONTAL_P3("P3", "REGRA: APENAS PARA PELÍCULA DE CÂMERA NA COMPRA DA FRONTAL"),
//              APENAS_PELICULA_VIDRO_COM_CAPA_P4("P4", "REGRA: APENAS PARA PELÍCULA DE VIDRO, NA COMPRA DE UMA CAPA"),
//              APENAS_CAPA_C1("C1", "REGRA: APENAS PARA CAPAS"),
//              APENAS_2CAPAS_C2("C2", "REGRA: APENAS PARA VENDAS COM 2 CAPAS"),
//              APENAS_3CAPAS_C3("C3", "REGRA: APENAS PARA VENDAS COM 3 CAPAS"),
//              APENAS_CAPA_SILICONE_C4("C4", "REGRA: APENAS PARA CAPAS DE SILICONE");
               
                Boolean verificarSeTemPeliculaTPUFrontalParaP2 = false;
                Boolean verificarSeTemPeliculaFrontalParaP3 = false;
                Integer quantidadeCapas = 0;
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
                        if (lancamento.getProduto().getTipo().equals(TipoProduto.CAPA.getValor())) {
                                quantidadeCapas++;
                        }
                        if (lancamento.getProduto().getTipo().equals(TipoProduto.PELICULA.getValor()) &&
                                        VerificadorUtil.naoEstaNuloOuVazio(lancamento.getProduto().getSubtipoProduto())) {
                                if (lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) ||
                                                lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43)) {
                                        verificarSeTemPeliculaTPUFrontalParaP2 = true;
                                }
                                if (lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) ||
                                        lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43) ||
                                        lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_3D_NORMAL_44) ||
                                        lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_3D_PRIVACIDADE_45)) {
                                        verificarSeTemPeliculaFrontalParaP3 = true;
                                }
                        }
                }
               
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
                        if (lancamento.equals(cupomSelecionado.getLancamento()) && VerificadorUtil.naoEstaNuloOuVazio(cupomSelecionado.getTipoRegraCupom())) {
                                String tipoProdutoLancamento = lancamento.getProduto().getTipo();
                                SubtipoProduto subtipoProdutoLancamento = lancamento.getProduto().getSubtipoProduto();
                               
                                // REGRAS PARA PELÍCULAS
                                if (ehPelicula(cupomSelecionado.getTipoRegraCupom())) {
                                        if (!tipoProdutoLancamento.equals(TipoProduto.PELICULA.getValor())) {
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                        }
                                        if (TipoRegraCupom.APENAS_PELICULA_TPUSOFT_P1.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
                                                        if (!subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) &&
                                                                !subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43)) {
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                                        }
                                                }
                                        }
                               
                                        if (TipoRegraCupom.APENAS_PELICULA_TPUSOFTTPASEIRA_P2.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
                                                        if (!verificarSeTemPeliculaTPUFrontalParaP2 ||
                                                                !subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_TRASEIRA_46)) {
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                                        }
                                                }
                                        }
                                       
                                        if (TipoRegraCupom.APENAS_PELICULA_CAMERACOMFRONTAL_P3.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
                                                        if (!verificarSeTemPeliculaFrontalParaP3 ||
                                                                !(subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_CAMERA_47) ||
                                                                subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_CAMERA_48))) {
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                                        }
                                                }
                                        }
                                       
                                        if (TipoRegraCupom.APENAS_PELICULA_VIDRO_COM_CAPA_P4.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
                                                if (!(quantidadeCapas > 0 &&
                                                        subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_3D_NORMAL_44))) {
                                                        throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                                }
                                        }
                                }

                                // REGRAS PARA CAPAS
                                if (ehCapa(cupomSelecionado.getTipoRegraCupom())) {
                                        if (!tipoProdutoLancamento.equals(TipoProduto.CAPA.getValor())) {
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                        }
                                        if (TipoRegraCupom.APENAS_2CAPAS_C2.getValor().equals(cupomSelecionado.getTipoRegraCupom()) && quantidadeCapas<2) {
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                        }
                                        if (TipoRegraCupom.APENAS_3CAPAS_C3.getValor().equals(cupomSelecionado.getTipoRegraCupom()) && quantidadeCapas<3) {
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                        }
                                        if (TipoRegraCupom.APENAS_CAPA_SILICONE_C4.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
                                                if (VerificadorUtil.naoEstaNuloOuVazio(lancamento.getProduto().getEstilo())) {
                                                        if (!lancamento.getProduto().getEstilo().equals(TipoEstiloProduto.SILICONE_CASE.getValor())) {
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
                                                        }
                                                }
                                        }
                                }
                               
                                break;
                        }
                }
               
        }
       
        private Boolean ehPelicula(String tipoRegraCupom) {
                return TipoRegraCupom.APENAS_PELICULA_TPUSOFT_P1.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_PELICULA_TPUSOFTTPASEIRA_P2.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_PELICULA_CAMERACOMFRONTAL_P3.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_PELICULA_VIDRO_COM_CAPA_P4.getValor().equals(tipoRegraCupom);
        }
       
        private Boolean ehCapa(String tipoRegraCupom) {
                return TipoRegraCupom.APENAS_CAPA_C1.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_2CAPAS_C2.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_3CAPAS_C3.getValor().equals(tipoRegraCupom) ||
                                TipoRegraCupom.APENAS_CAPA_SILICONE_C4.getValor().equals(tipoRegraCupom);
        }

}