Subversion Repositories Integrator Subversion

Rev

Rev 195 | Rev 697 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
106 espaco 1
package br.com.ec.domain.service.cupom.impl;
2
 
3
import org.springframework.beans.factory.annotation.Autowired;
4
import org.springframework.stereotype.Service;
5
 
195 espaco 6
import br.com.ec.core.exception.NegocioException;
7
import br.com.ec.core.generic.AbstractService;
8
import br.com.ec.core.generic.GenericRepository;
9
import br.com.ec.core.util.DataUtils;
10
import br.com.ec.core.util.VerificadorUtil;
11
import br.com.ec.core.validador.Validador;
693 blopes 12
import br.com.ec.domain.dto.ParametrosVendaDTO;
106 espaco 13
import br.com.ec.domain.model.Cupom;
693 blopes 14
import br.com.ec.domain.model.Lancamento;
15
import br.com.ec.domain.model.SubtipoProduto;
106 espaco 16
import br.com.ec.domain.model.tipos.TipoCupom;
693 blopes 17
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
18
import br.com.ec.domain.model.tipos.TipoProduto;
19
import br.com.ec.domain.model.tipos.TipoRegraCupom;
106 espaco 20
import br.com.ec.domain.service.cupom.CupomService;
21
import br.com.ec.domain.service.lancamento.LancamentoService;
693 blopes 22
import br.com.ec.domain.shared.ConstantesSEC;
106 espaco 23
import br.com.ec.infrastructure.repository.CupomRepository;
24
 
25
@Service
26
public class CupomServiceImpl extends AbstractService<Cupom> implements CupomService {
27
 
28
        private CupomRepository cupomRepository;
29
        private LancamentoService lancamentoService;
30
 
31
        @Autowired
32
        public CupomServiceImpl(Validador validador, CupomRepository cupomRepository, LancamentoService lancamentoService) {
33
                super(validador);
34
                this.cupomRepository = cupomRepository;
35
                this.lancamentoService = lancamentoService;
36
        }
37
 
38
        @Override
39
        protected GenericRepository<Cupom> getRepository() {
40
                return cupomRepository;
41
        }
42
 
43
        @Override
44
        protected void regrasNegocioCadastrar(Cupom cupom) {
45
                verificarSeCodigoJaExiste(cupom);
46
        }
47
 
48
        private void verificarSeCodigoJaExiste(Cupom cupom) {
49
                if (VerificadorUtil.naoEstaNulo(consultarCupomPorCodigo(cupom.getCodigo()))) {
50
                        throw new NegocioException("CÓDIGO DO CUPOM JÁ EXISTE");
51
                }
52
        }
53
 
54
        @Override
55
        public Cupom consultarCupomPorCodigo(String codigo) {
56
                return cupomRepository.consultarCupomPorCodigo(codigo);
57
        }
58
 
59
        @Override
60
        public String gerarCodigoValido() {
61
                Cupom cupomGerado = new Cupom();
62
                cupomGerado.gerarCodigo();
63
                if (VerificadorUtil.naoEstaNulo(consultarCupomPorCodigo(cupomGerado.getCodigo()))) {
64
                        return gerarCodigoValido();
65
                }
66
                return cupomGerado.getCodigo();
67
        }
68
 
69
        @Override
70
        public void excluirCupom(Cupom cupom) {
71
                if (existeCupomComLancamentoVendas(cupom)) {
72
                        throw new NegocioException("Não é permitido excluir um cupom com lançamentos em vendas");
73
                }
74
                super.excluir(cupom);
75
        }
76
 
77
        private Boolean existeCupomComLancamentoVendas(Cupom cupom) {
78
                Integer quantidadeUtilizada = lancamentoService.obterQuantidadeVendasComCupom(cupom);
79
                if (VerificadorUtil.naoEstaNulo(quantidadeUtilizada)) {
80
                        if (quantidadeUtilizada > 0) {
81
                                return true;
82
                        }
83
                }
84
                return false;
85
        }
86
 
87
        @Override
88
        public Cupom separarCupom(Cupom cupom, Double valorSeparacao) {
89
                verificarCupomValido(cupom);
90
                if (0.0 >= valorSeparacao || valorSeparacao >= cupom.getValor()) {
91
                        throw new NegocioException("VALOR NÃO PERMITIDO");
92
                }
93
                Cupom cupomNovo = new Cupom();
94
                try {
95
                        cupomNovo = cupom.clone();
96
                } catch (CloneNotSupportedException e) {
97
                        e.printStackTrace();
98
                }
99
                cupomNovo.setSequencial(null);
100
                cupomNovo.setCodigo(gerarCodigoValido());
101
                cupomNovo.setDataHoraEmissao(DataUtils.getDataAtual());
102
                cupomNovo.setValor(valorSeparacao);
103
                cupomNovo.setObservacao("PARCIAL DO CUPOM: " + cupom.getCodigo() + "\n" + cupomNovo.getObservacao());
104
                cadastrar(cupomNovo);
105
 
106
                cupom.setValor(cupom.getValor() - valorSeparacao);
107
                cupom.setObservacao("PARCIAL DO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupom.getObservacao());
108
                alterar(cupom);
109
 
110
                return cupomNovo;
111
        }
112
 
113
        @Override
114
        public Cupom unirCupons(Cupom cupom, Cupom cupomParaUnir) {
115
                verificarCupomValido(cupom);
116
                verificarCupomValido(cupomParaUnir);
117
                if (!cupom.getCliente().equals(cupomParaUnir.getCliente())) {
118
                        throw new NegocioException("OPERAÇÃO NÃO PERMITIRDA: CUPONS PARA DIFERENTES CLIENTES");
119
                }
120
                if (VerificadorUtil.naoEstaNulo(cupom.getPercentual()) || VerificadorUtil.naoEstaNulo(cupomParaUnir.getPercentual())) {
121
                        throw new NegocioException("OPERAÇÃO NÃO PERMITIRDA: CUPOM COM PERCENTUAL");
122
                }
123
                Cupom cupomNovo = new Cupom();
124
                try {
125
                        cupomNovo = cupom.clone();
126
                } catch (CloneNotSupportedException e) {
127
                        e.printStackTrace();
128
                }
129
                cupomNovo.setSequencial(null);
130
                cupomNovo.setCodigo(gerarCodigoValido());
131
                cupomNovo.setDataHoraEmissao(DataUtils.getDataAtual());
132
                cupomNovo.setValor(cupom.getValor() + cupomParaUnir.getValor());
133
                cupomNovo.setObservacao("UNIÃO DOS CUPONS: " + cupom.getCodigo() + " E " + cupomParaUnir.getCodigo() + "\n");
134
                cupomNovo.setObservacao(cupomNovo.getObservacao() + "\n" + cupom.getObservacao() + "\n" + cupomParaUnir.getObservacao());
135
                cadastrar(cupomNovo);
136
 
137
                cupom.setAtivo(false);
138
                cupom.setObservacao("UNIDO NO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupom.getObservacao());
139
                alterar(cupom);
140
 
141
                cupomParaUnir.setAtivo(false);
142
                cupomParaUnir.setObservacao("UNIDO NO CUPOM: " + cupomNovo.getCodigo() + "\n" + cupomParaUnir.getObservacao());
143
                alterar(cupomParaUnir);
144
                return cupomNovo;
145
        }
146
 
147
        private void verificarCupomValido(Cupom cupom) {
148
                if (VerificadorUtil.naoEstaNulo(cupom)) {
149
                        if (existeCupomComLancamentoVendas(cupom)) {
150
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA; CUPOM JÁ UTILIZADO");
151
                        }
152
                        if (!cupom.getAtivo() || !cupom.valido()) {
153
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA; CUPOM INDISPONÍVEL");
154
                        }
155
                        if (!cupom.getTipoCupom().equals(TipoCupom.REEMBOLSO.getValor())) {
156
                                throw new NegocioException("OPERAÇÃO NÃO PERMITIDA: CUPOM DEVE SER PARA REEMBOLSO");
157
                        }
158
                }
159
        }
693 blopes 160
 
161
        @Override
162
        public void validarRegrasCupom(ParametrosVendaDTO parametrosVenda, Cupom cupomSelecionado) {
163
//              APENAS_PELICULA_TPUSOFT_P1("P1", "REGRA: APENAS PARA PELÍCULA TPU SOFT"),
164
//              APENAS_PELICULA_TPUSOFTTPASEIRA_P2("P2", "REGRA: APENAS PARA PELÍCULA TPU SOFT TRASEIRA"),
165
//              APENAS_PELICULA_CAMERACOMFRONTAL_P3("P3", "REGRA: APENAS PARA PELÍCULA DE CÂMERA NA COMPRA DA FRONTAL"),
166
//              APENAS_CAPA_C1("C1", "REGRA: APENAS PARA CAPAS"),
167
//              APENAS_2CAPAS_C2("C2", "REGRA: APENAS PARA VENDAS COM 2 CAPAS"),
168
//              APENAS_3CAPAS_C3("C3", "REGRA: APENAS PARA VENDAS COM 3 CAPAS"),
169
//              APENAS_CAPA_SILICONE_C4("C4", "REGRA: APENAS PARA CAPAS DE SILICONE");
170
 
171
                Boolean verificarSeTemPeliculaFrontalParaP2P3 = false;
172
                Integer quantidadeCapas = 0;
173
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
174
                        if (lancamento.getProduto().getTipo().equals(TipoProduto.CAPA.getValor())) {
175
                                quantidadeCapas++;
176
                        }
177
                        if (lancamento.getProduto().getTipo().equals(TipoProduto.PELICULA.getValor()) &&
178
                                        VerificadorUtil.naoEstaNuloOuVazio(lancamento.getProduto().getSubtipoProduto())) {
179
                                if (!lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_CAMERA_47) ||
180
                                        !lancamento.getProduto().getSubtipoProduto().getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_CAMERA_48)) {
181
                                        verificarSeTemPeliculaFrontalParaP2P3 = true;
182
                                }
183
                        }
184
                }
185
 
186
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
187
                        if (lancamento.equals(cupomSelecionado.getLancamento()) && VerificadorUtil.naoEstaNuloOuVazio(cupomSelecionado.getTipoRegraCupom())) {
188
                                String tipoProdutoLancamento = lancamento.getProduto().getTipo();
189
                                SubtipoProduto subtipoProdutoLancamento = lancamento.getProduto().getSubtipoProduto();
190
 
191
                                // REGRAS PARA PELÍCULAS
192
                                if (TipoRegraCupom.APENAS_PELICULA_TPUSOFT_P1.getValor().equals(cupomSelecionado.getTipoRegraCupom()) ||
193
                                                TipoRegraCupom.APENAS_PELICULA_TPUSOFTTPASEIRA_P2.getValor().equals(cupomSelecionado.getTipoRegraCupom()) ||
194
                                                TipoRegraCupom.APENAS_PELICULA_CAMERACOMFRONTAL_P3.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
195
                                        if (!tipoProdutoLancamento.equals(TipoProduto.PELICULA.getValor())) {
196
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
197
                                        }
198
                                        if (TipoRegraCupom.APENAS_PELICULA_TPUSOFT_P1.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
199
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
200
                                                        if (!subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) ||
201
                                                                !subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43)) {
202
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
203
                                                        }
204
                                                }
205
                                        }
206
 
207
                                        if (TipoRegraCupom.APENAS_PELICULA_TPUSOFTTPASEIRA_P2.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
208
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
209
                                                        if (!subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_TRASEIRA_46)) {
210
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
211
                                                        }
212
                                                }
213
                                        }
214
 
215
                                        if (TipoRegraCupom.APENAS_PELICULA_CAMERACOMFRONTAL_P3.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
216
                                                if (VerificadorUtil.naoEstaNulo(subtipoProdutoLancamento)) {
217
                                                        if (verificarSeTemPeliculaFrontalParaP2P3 &&
218
                                                                (!subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_TPU_SOFT_CAMERA_47) ||
219
                                                                !subtipoProdutoLancamento.getSequencial().equals(ConstantesSEC.SubtipoProduto.SEQUENCIAL_SUBTIPO_VIDRO_CAMERA_48))) {
220
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
221
                                                        }
222
                                                }
223
                                        }
224
                                }
106 espaco 225
 
693 blopes 226
                                // REGRAS PARA CAPAS
227
                                if (TipoRegraCupom.APENAS_CAPA_C1.getValor().equals(cupomSelecionado.getTipoRegraCupom()) ||
228
                                                TipoRegraCupom.APENAS_2CAPAS_C2.getValor().equals(cupomSelecionado.getTipoRegraCupom()) ||
229
                                                TipoRegraCupom.APENAS_3CAPAS_C3.getValor().equals(cupomSelecionado.getTipoRegraCupom()) ||
230
                                                TipoRegraCupom.APENAS_CAPA_SILICONE_C4.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
231
                                        if (!tipoProdutoLancamento.equals(TipoProduto.CAPA.getValor())) {
232
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
233
                                        }
234
                                        if (TipoRegraCupom.APENAS_2CAPAS_C2.getValor().equals(cupomSelecionado.getTipoRegraCupom()) && quantidadeCapas<2) {
235
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
236
                                        }
237
                                        if (TipoRegraCupom.APENAS_3CAPAS_C3.getValor().equals(cupomSelecionado.getTipoRegraCupom()) && quantidadeCapas<3) {
238
                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
239
                                        }
240
                                        if (TipoRegraCupom.APENAS_CAPA_SILICONE_C4.getValor().equals(cupomSelecionado.getTipoRegraCupom())) {
241
                                                if (VerificadorUtil.naoEstaNuloOuVazio(lancamento.getProduto().getEstilo())) {
242
                                                        if (!lancamento.getProduto().getEstilo().equals(TipoEstiloProduto.SILICONE_CASE.getValor())) {
243
                                                                throw new RuntimeException(cupomSelecionado.getDescricaoDoTipoRegraCupom());
244
                                                        }
245
                                                }
246
                                        }
247
                                }
248
 
249
                                break;
250
                        }
251
                }
252
 
253
        }
254
 
106 espaco 255
}