Subversion Repositories Integrator Subversion

Rev

Rev 182 | 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.domain.model.Cupom;
import br.com.ec.domain.model.tipos.TipoCupom;
import br.com.ec.domain.service.cupom.CupomService;
import br.com.ec.domain.service.lancamento.LancamentoService;
import br.com.ec.infrastructure.repository.CupomRepository;
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.DataUtils;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.core.validador.Validador;

@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");
                        }
                }
        }

}