Subversion Repositories Integrator Subversion

Rev

Rev 633 | 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.model;
2
 
3
import java.io.Serializable;
4
import java.util.ArrayList;
5
import java.util.Date;
6
import java.util.List;
7
import java.util.Set;
8
 
9
import javax.persistence.CascadeType;
10
import javax.persistence.Column;
11
import javax.persistence.Entity;
12
import javax.persistence.GeneratedValue;
13
import javax.persistence.GenerationType;
14
import javax.persistence.Id;
15
import javax.persistence.JoinColumn;
16
import javax.persistence.ManyToOne;
17
import javax.persistence.OneToMany;
18
import javax.persistence.SequenceGenerator;
19
import javax.persistence.Table;
20
import javax.persistence.Transient;
21
import javax.validation.constraints.NotNull;
22
import javax.validation.constraints.Size;
144 espaco 23
import javax.xml.bind.JAXBElement;
106 espaco 24
 
25
import org.hibernate.annotations.ForeignKey;
26
import org.hibernate.validator.constraints.NotEmpty;
27
 
28
import br.com.ec.controller.util.UtilBean;
195 espaco 29
import br.com.ec.core.interfaces.Alterar;
30
import br.com.ec.core.interfaces.Cadastrar;
31
import br.com.ec.core.util.DataUtils;
32
import br.com.ec.core.util.StringUtil;
33
import br.com.ec.core.util.VerificadorUtil;
633 blopes 34
import br.com.ec.domain.dto.ProdutoCustosDTO;
106 espaco 35
import br.com.ec.domain.model.tipos.TipoCorProduto;
36
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
37
import br.com.ec.domain.model.tipos.TipoGenero;
38
import br.com.ec.domain.model.tipos.TipoProduto;
144 espaco 39
import br.com.ec.domain.shared.ConstantesSEC;
106 espaco 40
import br.com.ec.domain.util.CodigoBarraEAN;
41
 
42
@Entity
43
@Table(name="sec_produto", schema="sc_sec")
44
public class Produto implements Serializable, Cloneable {
45
 
46
        private static final long serialVersionUID = 1L;
47
 
48
        private Long sequencial;
49
        private Modelo modelo;
50
        private Tributacao tributacao;
550 blopes 51
        private Estampa estampa;
581 blopes 52
        private SubtipoProduto subtipoProduto;
106 espaco 53
        private String codigo;
54
        private String codigoRapido;
55
        private String codigoEAN;
56
        private String codigoEANTributado;
57
        private String descricao;
58
        private String descricaoEtiqueta;
170 espaco 59
        private String descricaoParaNotaFiscal;
106 espaco 60
        private String tipo;
61
        private String genero;
62
        private String estilo;
63
        private String cor;
64
        private String observacao;
65
        private Double valorCompra;
66
        private Double valorVarejo;
67
        private Double valorVarejoPromocional;
68
        private Double valorVarejoMaximo;
69
        private Double valorVarejoPopular;
70
        private Double valorAtacado;
71
        private Date dataOnline;
270 espaco 72
        private Date dataOnlineMercadoLivre;
106 espaco 73
        private Boolean indicadorFavorito;
74
        private Boolean indicadorComissionado;
305 espaco 75
        private Boolean indicadorPersonalizavel;
106 espaco 76
        private Boolean indicadorEmissaoNotaFiscal;
140 espaco 77
 
144 espaco 78
        private Double valorVarejoSimulacao;
140 espaco 79
        private Boolean sujeitoST;
144 espaco 80
        private Double aliquotaIPI;
152 espaco 81
        private Double aliquotaIPINotaFiscal;
144 espaco 82
        private Double aliquotaIcms;
152 espaco 83
        private Double aliquotaIcmsNotaFiscal;
144 espaco 84
        private Double aliquotaIcmsST;
85
        private Double aliquotaFecoep;
106 espaco 86
        private Boolean ativo;
87
 
88
        private String codigoNCM;
89
        private String codigoEST;
90
        private Set<ProdutoPedidoCompra> pedidosCompra;
91
        private Set<ProdutoLoja> estoques;
92
        private Set<FornecedorProduto> fornecedores;
93
        private Set<ProdutoRelacionado> relacionados;
94
        private Set<ProdutoRelacionado> relacionadosReverse;
95
 
96
        private List<TransferenciaProduto> transferenciasAbertas = new ArrayList<TransferenciaProduto>();
97
        private List<PedidoProduto> pedidosPendentes = new ArrayList<PedidoProduto>();
98
 
99
        private Boolean indicadorOnline;
270 espaco 100
        private Boolean indicadorOnlineMercadoLivre;
106 espaco 101
        private Date dataUltimaVenda;
102
//      private Set<ProdutoArquivo> fotos;
103
 
642 blopes 104
        /*
105
        private Double pesoLiquido;
106
        private Double pesoBruto;
107
        private Double largura;
108
        private Double altura;
109
        private Double profundidade;
110
 
111
        private String descricaoTituloLojaVirtual; // TÍTULO NA LOJA VIRTUAL
112
        private String descricaoLojaVirtual; // UTILIZADO NA EXPORTAÇÃO DO PRODUTO PARA LOJAS VIRTUAIS
113
        private String descricaoComplementar; // UTILIZADO EM PEDIDOS DE VENDA/COMPRA
114
        private String descricaoHomologacao;
115
        */
116
 
544 blopes 117
        public Produto() {}
118
 
119
        public Produto(Long sequencial) {
120
                this.sequencial = sequencial;
121
        }
122
 
106 espaco 123
        @Id
124
        @SequenceGenerator(name = "sq_produto")
125
        @GeneratedValue(strategy = GenerationType.IDENTITY)
126
        @Column(name="seq_produto", nullable=false)
127
        public Long getSequencial() {
128
                return sequencial;
129
        }
130
        public void setSequencial(Long sequencial) {
131
                this.sequencial = sequencial;
132
        }
133
 
134
        @ManyToOne
135
        @ForeignKey(name="fk_produto_modelo")
136
        @NotNull(message = "Parâmetro obrigatório não preenchido: Modelo do produto", groups = {Cadastrar.class, Alterar.class})
137
        @JoinColumn(name = "seq_modelo", referencedColumnName="seq_modelo", nullable=true)
138
        public Modelo getModelo() {
139
                return modelo;
140
        }
141
        public void setModelo(Modelo modelo) {
142
                this.modelo = modelo;
143
        }
144
 
145
        @ManyToOne
146
        @ForeignKey(name="fk_produto_tributacao")
147
        @JoinColumn(name = "seq_tributacao", referencedColumnName="seq_tributacao", nullable=true)
148
        public Tributacao getTributacao() {
149
                return tributacao;
150
        }
151
        public void setTributacao(Tributacao tributacao) {
152
                this.tributacao = tributacao;
153
        }
154
 
550 blopes 155
        @ManyToOne
156
        @ForeignKey(name="fk_produto_estampa")
157
        @JoinColumn(name = "seq_estampa", referencedColumnName="seq_estampa", nullable=true)
158
        public Estampa getEstampa() {
159
                return estampa;
160
        }
161
        public void setEstampa(Estampa estampa) {
162
                this.estampa = estampa;
163
        }
164
 
106 espaco 165
        @Column(name="cod_produto")
166
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código do Produto")
167
        @NotNull(message = "Parâmetro obrigatório não preenchido: Código do produto", groups = {Cadastrar.class, Alterar.class})
168
        @NotEmpty(message = "Parâmetro obrigatório não preenchido: Código do produto", groups = {Cadastrar.class, Alterar.class})
169
        public String getCodigo() {
170
                return codigo;
171
        }
172
        public void setCodigo(String codigo) {
173
                this.codigo = codigo;
174
        }
175
 
176
        @Column(name="cod_rapido_produto")
177
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código Rápido")
178
        public String getCodigoRapido() {
179
                return codigoRapido;
180
        }
181
        public void setCodigoRapido(String codigoRapido) {
182
                this.codigoRapido = codigoRapido;
183
        }
184
 
185
        @Column(name="cod_ean")
186
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código de Barras (EAN)")
187
        public String getCodigoEAN() {
188
                return codigoEAN;
189
        }
190
        public void setCodigoEAN(String codigoEAN) {
191
                this.codigoEAN = codigoEAN;
192
        }
193
 
194
        @Column(name="cod_ean_tributado")
195
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código de Barras Tributado (EAN)")
196
        public String getCodigoEANTributado() {
197
                return codigoEANTributado;
198
        }
199
        public void setCodigoEANTributado(String codigoEANTributado) {
200
                this.codigoEANTributado = codigoEANTributado;
201
        }
202
 
203
        @Column(name="dsc_produto")
204
        @Size(max = 250, message = "Limite de caracteres ultrapassado: Descrição do Produto")
205
        public String getDescricao() {
206
                return descricao;
207
        }
208
        public void setDescricao(String descricao) {
209
                this.descricao = StringUtil.setarUpperCaseComTrim(descricao);
210
        }
211
 
212
        @Column(name="dsc_etiqueta")
213
        @Size(max = 120, message = "Limite de caracteres ultrapassado: Descrição da Etiqueta")
214
        public String getDescricaoEtiqueta() {
215
                return descricaoEtiqueta;
216
        }
217
        public void setDescricaoEtiqueta(String descricaoEtiqueta) {
218
                this.descricaoEtiqueta = StringUtil.setarUpperCaseComTrim(descricaoEtiqueta);
219
        }
220
 
170 espaco 221
//      @Column(name="dsc_notafiscal")
222
//      @Size(max = 250, message = "Limite de caracteres ultrapassado: Descrição para Nota Fiscal do Produto")
223
        @Transient
224
        public String getDescricaoParaNotaFiscal() {
225
                return descricaoParaNotaFiscal;
226
        }
227
        public void setDescricaoParaNotaFiscal(String descricaoParaNotaFiscal) {
228
                this.descricaoParaNotaFiscal = descricaoParaNotaFiscal;
229
        }
230
 
106 espaco 231
        @Column(name="tip_produto")
232
        @NotNull(message = "Parâmetro obrigatório não preenchido: Tipo do produto", groups = {Cadastrar.class, Alterar.class})
233
        public String getTipo() {
234
                return tipo;
235
        }
236
        public void setTipo(String tipo) {
237
                this.tipo = tipo;
238
        }
239
 
580 blopes 240
        @ManyToOne
581 blopes 241
        @ForeignKey(name="fk_produto_subtipoproduto")
580 blopes 242
        @JoinColumn(name = "seq_subtipoproduto", referencedColumnName="seq_subtipoproduto", nullable=true)
581 blopes 243
        public SubtipoProduto getSubtipoProduto() {
244
                return subtipoProduto;
580 blopes 245
        }
581 blopes 246
        public void setSubtipoProduto(SubtipoProduto subtipoProduto) {
247
                this.subtipoProduto = subtipoProduto;
580 blopes 248
        }
249
 
106 espaco 250
        @Column(name="tip_genero")
251
        @NotNull(message = "Parâmetro obrigatório não preenchido: Gênero", groups = {Cadastrar.class, Alterar.class})
252
        public String getGenero() {
253
                return genero;
254
        }
255
        public void setGenero(String genero) {
256
                this.genero = genero;
257
        }
258
 
259
        @Column(name="tip_estilo")
260
        public String getEstilo() {
261
                return estilo;
262
        }
263
        public void setEstilo(String estilo) {
264
                this.estilo = estilo;
265
        }
266
 
267
        @Column(name="tip_cor")
268
        public String getCor() {
269
                return cor;
270
        }
271
        public void setCor(String cor) {
272
                this.cor = cor;
273
        }
274
 
275
        @Column(name="dsc_observacao")
276
        @Size(max = 1000, message = "Limite de caracteres ultrapassado: Observação")
277
        public String getObservacao() {
278
                return observacao;
279
        }
280
        public void setObservacao(String observacao) {
281
                this.observacao = StringUtil.setarUpperCaseComTrim(observacao);
282
        }
283
 
284
        @Column(name="val_compra")
285
        public Double getValorCompra() {
286
                return valorCompra;
287
        }
288
        public void setValorCompra(Double valorCompra) {
289
                this.valorCompra = valorCompra;
290
        }
291
 
292
        @Transient
293
        public String valorCompraFormatado() {
294
                if (VerificadorUtil.naoEstaNulo(getValorCompra())) {
295
                        return StringUtil.formatarValor(getValorCompra());
296
                }
297
                return StringUtil.formatarValor(0.0);
298
        }
299
 
300
        @Column(name="val_varejo")
301
        public Double getValorVarejo() {
302
                return valorVarejo;
303
        }
304
        public void setValorVarejo(Double valorVarejo) {
305
                this.valorVarejo = valorVarejo;
306
        }
307
 
308
        @Column(name="val_varejo_promocional")
309
        public Double getValorVarejoPromocional() {
310
                return valorVarejoPromocional;
311
        }
312
        public void setValorVarejoPromocional(Double valorVarejoPromocional) {
313
                this.valorVarejoPromocional = valorVarejoPromocional;
314
        }
315
 
316
        @Column(name="val_varejo_maximo")
317
        public Double getValorVarejoMaximo() {
318
                return valorVarejoMaximo;
319
        }
320
        public void setValorVarejoMaximo(Double valorVarejoMaximo) {
321
                this.valorVarejoMaximo = valorVarejoMaximo;
322
        }
323
 
324
        @Column(name="val_varejo_popular")
325
        public Double getValorVarejoPopular() {
326
                return valorVarejoPopular;
327
        }
328
        public void setValorAtacado(Double valorAtacado) {
329
                this.valorAtacado = valorAtacado;
330
        }
331
 
332
        @Column(name="val_atacado")
333
        public Double getValorAtacado() {
334
                return valorAtacado;
335
        }
336
        public void setValorVarejoPopular(Double valorVarejoPopular) {
337
                this.valorVarejoPopular = valorVarejoPopular;
338
        }
339
 
340
        @Column(name="dat_online")
341
        public Date getDataOnline() {
342
                return dataOnline;
343
        }
344
        public void setDataOnline(Date dataOnline) {
345
                this.dataOnline = dataOnline;
346
        }
347
 
270 espaco 348
        @Column(name="dat_online_mercadolivre")
349
        public Date getDataOnlineMercadoLivre() {
350
                return dataOnlineMercadoLivre;
351
        }
352
        public void setDataOnlineMercadoLivre(Date dataOnlineMercadoLivre) {
353
                this.dataOnlineMercadoLivre = dataOnlineMercadoLivre;
354
        }
355
 
106 espaco 356
        @Column(name="ind_favorito")
357
        public Boolean getIndicadorFavorito() {
358
                return indicadorFavorito;
359
        }
360
        public void setIndicadorFavorito(Boolean indicadorFavorito) {
361
                this.indicadorFavorito = indicadorFavorito;
362
        }
363
 
364
        @Column(name="ind_comissionado")
365
        public Boolean getIndicadorComissionado() {
366
                return indicadorComissionado;
367
        }
368
        public void setIndicadorComissionado(Boolean indicadorComissionado) {
369
                this.indicadorComissionado = indicadorComissionado;
370
        }
371
 
305 espaco 372
        @Column(name="ind_personalizavel")
373
        public Boolean getIndicadorPersonalizavel() {
374
                return indicadorPersonalizavel;
375
        }
376
        public void setIndicadorPersonalizavel(Boolean indicadorPersonalizavel) {
377
                this.indicadorPersonalizavel = indicadorPersonalizavel;
378
        }
379
 
106 espaco 380
        @Column(name="ind_emissao_nf")
381
        public Boolean getIndicadorEmissaoNotaFiscal() {
382
                if (VerificadorUtil.estaNulo(indicadorEmissaoNotaFiscal)) {
383
                        return false;
384
                }
385
                return indicadorEmissaoNotaFiscal;
386
        }
387
        public void setIndicadorEmissaoNotaFiscal(Boolean indicadorEmissaoNotaFiscal) {
388
                this.indicadorEmissaoNotaFiscal = indicadorEmissaoNotaFiscal;
389
        }
390
 
140 espaco 391
        @Column(name="ind_sujeito_st", nullable=false)
392
        public Boolean getSujeitoST() {
393
                if (VerificadorUtil.estaNulo(sujeitoST)) {
394
                        return false;
395
                }
396
                return sujeitoST;
397
        }
398
        public void setSujeitoST(Boolean sujeitoST) {
399
                this.sujeitoST = sujeitoST;
400
        }
144 espaco 401
 
402
        @Transient
403
        public Double getValorVarejoSimulacao() {
404
                if (VerificadorUtil.estaNulo(valorVarejoSimulacao)) {
405
                        return getValorVarejo();
406
                }
407
                return valorVarejoSimulacao;
408
        }
409
        public void setValorVarejoSimulacao(Double valorVarejoSimulacao) {
410
                this.valorVarejoSimulacao = valorVarejoSimulacao;
411
        }
140 espaco 412
 
277 espaco 413
        @Transient
414
        public Double getValorEm18x() {
415
                if (VerificadorUtil.naoEstaNulo(getValorVarejo())) {
416
                        return getValorVarejo() * 1.12;
417
                }
418
                return 0.0;
419
        }
420
 
421
        @Transient
422
        public Double getJurosValorEm18x() {
423
                if (VerificadorUtil.naoEstaNulo(getValorEm18x()) &&
424
                                VerificadorUtil.naoEstaNulo(getValorVarejo())) {
425
                        return getValorEm18x() - getValorVarejo();
426
                }
427
                return 0.0;
428
        }
429
 
430
        @Transient
431
        public Double getParcelasValorEm18x() {
432
                if (VerificadorUtil.naoEstaNulo(getValorEm18x())) {
433
                        if (getValorEm18x() > 0.0) {
434
                                return getValorEm18x()/18;
435
                        }
436
                }
437
                return 0.0;
438
        }
439
 
144 espaco 440
        @Column(name="val_aliquota_icms")
441
        public Double getAliquotaIcms() {
442
                return aliquotaIcms;
443
        }
444
        public void setAliquotaIcms(Double aliquotaIcms) {
445
                this.aliquotaIcms = aliquotaIcms;
446
        }
447
 
152 espaco 448
        @Transient
449
        public Double getAliquotaIcmsNotaFiscal() {
450
                return aliquotaIcmsNotaFiscal;
451
        }
452
        public void setAliquotaIcmsNotaFiscal(Double aliquotaIcmsNotaFiscal) {
453
                this.aliquotaIcmsNotaFiscal = aliquotaIcmsNotaFiscal;
454
        }
455
 
144 espaco 456
        @Column(name="val_aliquota_icms_st")
457
        public Double getAliquotaIcmsST() {
458
                return aliquotaIcmsST;
459
        }
460
        public void setAliquotaIcmsST(Double aliquotaIcmsST) {
461
                this.aliquotaIcmsST = aliquotaIcmsST;
462
        }
463
 
464
        @Column(name="val_aliquota_fecoep")
465
        public Double getAliquotaFecoep() {
466
                return aliquotaFecoep;
467
        }
468
        public void setAliquotaFecoep(Double aliquotaFecoep) {
469
                this.aliquotaFecoep = aliquotaFecoep;
470
        }
471
 
472
        @Column(name="val_aliquota_ipi")
473
        public Double getAliquotaIPI() {
474
                return aliquotaIPI;
475
        }
476
        public void setAliquotaIPI(Double aliquotaIPI) {
477
                this.aliquotaIPI = aliquotaIPI;
478
        }
479
 
152 espaco 480
        @Transient
481
        public Double getAliquotaIPINotaFiscal() {
482
                return aliquotaIPINotaFiscal;
483
        }
484
        public void setAliquotaIPINotaFiscal(Double aliquotaIPINotaFiscal) {
485
                this.aliquotaIPINotaFiscal = aliquotaIPINotaFiscal;
486
        }
487
 
106 espaco 488
        @Column(name="ind_ativo")
489
        public Boolean getAtivo() {
490
                return ativo;
491
        }
492
        public void setAtivo(Boolean ativo) {
493
                this.ativo = ativo;
494
        }
495
 
496
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
497
        public Set<ProdutoPedidoCompra> getPedidosCompra() {
498
                return pedidosCompra;
499
        }
500
        public void setPedidosCompra(Set<ProdutoPedidoCompra> pedidosCompra) {
501
                this.pedidosCompra = pedidosCompra;
502
        }
503
 
504
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
505
        public Set<ProdutoLoja> getEstoques() {
506
                return estoques;
507
        }
508
        public void setEstoques(Set<ProdutoLoja> estoques) {
509
                this.estoques = estoques;
510
        }
511
 
512
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
513
        public Set<FornecedorProduto> getFornecedores() {
514
                return fornecedores;
515
        }
516
        public void setFornecedores(Set<FornecedorProduto> fornecedores) {
517
                this.fornecedores = fornecedores;
518
        }
519
 
520
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
521
        public Set<ProdutoRelacionado> getRelacionados() {
522
                return relacionados;
523
        }
524
        public void setRelacionados(Set<ProdutoRelacionado> relacionados) {
525
                this.relacionados = relacionados;
526
        }
527
 
528
        @OneToMany(mappedBy="produtoRelacionado", cascade=CascadeType.ALL, orphanRemoval=true)
529
        public Set<ProdutoRelacionado> getRelacionadosReverse() {
530
                return relacionadosReverse;
531
        }
532
        public void setRelacionadosReverse(Set<ProdutoRelacionado> relacionadosReverse) {
533
                this.relacionadosReverse = relacionadosReverse;
534
        }
535
 
536
        @Transient
537
        public Boolean getIndicadorOnline() {
538
                if (VerificadorUtil.estaNulo(this.getDataOnline()) && VerificadorUtil.estaNulo(this.indicadorOnline)) {
539
                        setIndicadorOnline(false);
540
                } else {
541
                        setIndicadorOnline(true);
542
                }
543
                return indicadorOnline;
544
        }
545
        public void setIndicadorOnline(Boolean indicadorOnline) {
546
                this.indicadorOnline = indicadorOnline;
547
        }
548
        public void atualizarDataOnline() {
549
                if (VerificadorUtil.estaNulo(this.getDataOnline())) {
550
                        this.setDataOnline(DataUtils.getDataAtual());
551
                } else {
552
                        this.setDataOnline(null);
553
                }
554
        }
555
 
556
        @Transient
270 espaco 557
        public Boolean getIndicadorOnlineMercadoLivre() {
558
                if (VerificadorUtil.estaNulo(this.getDataOnlineMercadoLivre()) && VerificadorUtil.estaNulo(this.indicadorOnlineMercadoLivre)) {
559
                        setIndicadorOnlineMercadoLivre(false);
560
                } else {
561
                        setIndicadorOnlineMercadoLivre(true);
562
                }
563
                return indicadorOnlineMercadoLivre;
564
        }
565
        public void setIndicadorOnlineMercadoLivre(Boolean indicadorOnlineMercadoLivre) {
566
                this.indicadorOnlineMercadoLivre = indicadorOnlineMercadoLivre;
567
        }
568
        public void atualizarDataOnlineMercadoLivre() {
569
                if (VerificadorUtil.estaNulo(this.getDataOnlineMercadoLivre())) {
570
                        this.setDataOnlineMercadoLivre(DataUtils.getDataAtual());
571
                } else {
572
                        this.setDataOnlineMercadoLivre(null);
573
                }
574
        }
575
 
576
        @Transient
106 espaco 577
        public List<TransferenciaProduto> getTransferenciasAbertas() {
578
                return transferenciasAbertas;
579
        }
580
        public void setTransferenciasAbertas(List<TransferenciaProduto> transferenciasAbertas) {
581
                this.transferenciasAbertas = transferenciasAbertas;
582
        }
583
 
584
        @Transient
585
        public List<PedidoProduto> getPedidosPendentes() {
586
                return pedidosPendentes;
587
        }
588
        public void setPedidosPendentes(List<PedidoProduto> pedidosPendentes) {
589
                this.pedidosPendentes = pedidosPendentes;
590
        }
591
 
592
        @Transient
593
        public Date getDataUltimaVenda() {
594
                return dataUltimaVenda;
595
        }
596
        public void setDataUltimaVenda(Date dataUltimaVenda) {
597
                this.dataUltimaVenda = dataUltimaVenda;
598
        }
599
 
600
        @Transient
601
        public Integer getQuantidadeDiasUltimaVenda() {
602
                if (VerificadorUtil.naoEstaNulo(getDataUltimaVenda())) {
603
                        return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataAtual(), getDataUltimaVenda());
604
                }
605
                return null;
606
        }
607
 
608
        @Transient
609
        public ArrayList<ProdutoRelacionado> getCompativeis() {
610
                ArrayList<ProdutoRelacionado> compativeis = new ArrayList<ProdutoRelacionado>();
611
                if (VerificadorUtil.naoEstaNulo(getRelacionados())) {
612
                        compativeis.addAll(getRelacionados());
613
                }
614
                if (VerificadorUtil.naoEstaNulo(getRelacionadosReverse())) {
615
                        compativeis.addAll(getRelacionadosReverse());
616
                }
617
                return compativeis;
618
        }
619
 
620
        @Transient
621
        public String getCodigoNCM() {
622
                return codigoNCM;
623
        }
624
        public void setCodigoNCM(String codigoNCM) {
625
                this.codigoNCM = codigoNCM;
626
        }
627
 
628
        @Transient
629
        public String getCodigoEST() {
630
                return codigoEST;
631
        }
632
        public void setCodigoEST(String codigoEST) {
633
                this.codigoEST = codigoEST;
634
        }
635
 
636
        /*
637
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
638
        public Set<ProdutoArquivo> getFotos() {
639
                return fotos;
640
        }
641
        public void setFotos(Set<ProdutoArquivo> fotos) {
642
                this.fotos = fotos;
643
        }
644
        */
645
        /***************************************************************/
646
 
647
        @Transient
648
        public String getCodigoProdutoPadrao() {
649
                try {
650
                        return VerificadorUtil.naoEstaNulo(codigo) ? String.format("%06d", new Long(codigo.trim())) : "";
651
                } catch (Exception e) {
652
                        return "";
653
                }
654
        }
655
 
656
        public static void main(String[] args) {
657
//              System.out.println(String.format("%07d", new Long(12879)));
658
//              codigoBarras.gerarCodigoBarra(String.format("%012d", new Long(12879)));
659
//              System.out.println(codigoBarras.getCodigoBarra());
660
                System.out.println(CodigoBarraEAN.gerarCodigoBarras("6659"));
661
//              System.out.println(codigoBarras.longToEan13("900000012879"));
662
        }
663
 
664
        @Transient
665
        public String getCodigoDeBarrasProdutoPadrao() {
666
                try {
667
                        return VerificadorUtil.naoEstaNulo(codigo)? String.format("%07d", new Long(codigo)) : "";
668
//                      return VerificadorUtil.naoEstaNulo(codigo) ? StringUtils.rightPad(codigo, 12, "0") : "";
669
                } catch (Exception e) {
670
                        return "";
671
                }
672
        }
673
 
674
        @Transient
675
        public String getDescricaoDoModelo() {
676
                return VerificadorUtil.naoEstaNulo(modelo)? modelo.getDescricao() : "";
677
        }
678
 
679
        @Transient
680
        public String getDescricaoTecnicaDoModelo() {
681
                return VerificadorUtil.naoEstaNulo(modelo)? VerificadorUtil.naoEstaNulo(modelo.getDescricaoTecnica())? modelo.getDescricaoTecnica() : "" : "";
682
        }
683
 
684
        @Transient
685
        public String getDescricaoTecnicaDoModeloComParenteses() {
686
                return VerificadorUtil.naoEstaNulo(modelo)? VerificadorUtil.naoEstaNulo(modelo.getDescricaoTecnica())? " (" + modelo.getDescricaoTecnica() + ") " : "" : "";
687
        }
688
 
689
        @Transient
690
        public Long getSequencialDoModelo() {
691
                return VerificadorUtil.naoEstaNulo(modelo)? modelo.getSequencial() : null;
692
        }
693
 
694
        @Transient
695
        public Marca getMarcaDoModelo() {
696
                if (VerificadorUtil.naoEstaNulo(modelo)) {
697
                        if (VerificadorUtil.naoEstaNulo(modelo.getMarca())) {
698
                                return modelo.getMarca();
699
                        }
700
                }
701
                return null;
702
        }
703
 
704
        @Transient
705
        public String getDescricaoDaMarcaDoModelo() {
706
                return VerificadorUtil.naoEstaNulo(getMarcaDoModelo())? getMarcaDoModelo().getDescricao() : "";
707
        }
708
 
709
        @Transient
710
        public String getDescricaoComModeloCompletaComCodigo() {
711
                StringBuilder descricaoCompleta = new StringBuilder();
712
                descricaoCompleta.append("[");
713
                descricaoCompleta.append(getCodigoProdutoPadrao());
714
                descricaoCompleta.append("] ");
715
                if (VerificadorUtil.naoEstaNuloOuVazio(getDescricaoDoModelo())) {
716
                        descricaoCompleta.append(getDescricaoDoModelo());
717
                        descricaoCompleta.append(" - ");
718
                }
719
                descricaoCompleta.append(getDescricaoCompleta());
720
                return descricaoCompleta.toString();
721
        }
722
 
723
        @Transient
724
        public String getDescricaoComModeloCompleta() {
725
                StringBuilder descricaoCompleta = new StringBuilder();
726
                if (VerificadorUtil.naoEstaNuloOuVazio(getDescricaoDoModelo())) {
727
                        descricaoCompleta.append(getDescricaoDoModelo());
728
                        descricaoCompleta.append(" - ");
729
                }
730
                descricaoCompleta.append(getDescricaoCompleta());
731
                return descricaoCompleta.toString();
732
        }
733
 
734
        @Transient
735
        public String getDescricaoCompleta() {
736
                StringBuilder descricaoCompleta = new StringBuilder();
737
                if (VerificadorUtil.naoEstaNuloOuVazio(getEstilo())) {
738
                        descricaoCompleta.append(getDescricaoDoEstilo());
739
                        descricaoCompleta.append(" ");
740
                }
741
                descricaoCompleta.append(getDescricao());
742
                if (VerificadorUtil.naoEstaNuloOuVazio(getCor())) {
743
                        descricaoCompleta.append(" (");
744
                        descricaoCompleta.append(getDescricaoDaCor());
745
                        descricaoCompleta.append(")");
746
                }
747
                return descricaoCompleta.toString();
748
        }
749
 
750
        @Transient
751
        public String getDescricaoCompletaCapa() {
752
                StringBuilder descricaoCompleta = new StringBuilder();
753
                descricaoCompleta.append(getCodigo());
754
                descricaoCompleta.append(" - ");
755
                if (this.getTipo().equals(TipoProduto.CAPA.getValor())) {
756
                        descricaoCompleta.append("CAPA");
757
                }
758
                if (!this.getTipo().equals(TipoProduto.ACESSORIO.getValor())) {
759
                        descricaoCompleta.append(" ");
760
                        descricaoCompleta.append(getDescricaoDoModelo());
761
                }
762
                if (VerificadorUtil.naoEstaNuloOuVazio(this.getEstilo())) {
763
                        descricaoCompleta.append(" ");
764
                        descricaoCompleta.append(getDescricaoDoEstilo());
765
                }
766
                descricaoCompleta.append(" ");
767
                if (this.getDescricao().length() > 50) {
768
                        descricaoCompleta.append(getDescricao().substring(0, 50));
769
                } else {
770
                        descricaoCompleta.append(getDescricao());
771
                }
772
                if (VerificadorUtil.naoEstaNuloOuVazio(getCor())) {
773
                        descricaoCompleta.append(" (");
774
                        descricaoCompleta.append(getDescricaoDaCor());
775
                        descricaoCompleta.append(")");
776
                }
777
                return descricaoCompleta.toString();
778
        }
779
 
780
        @Transient
781
        public String getDescricaoDoTipo() {
782
                return VerificadorUtil.naoEstaNuloOuVazio(getTipo())? TipoProduto.parse(getTipo()).getDescricao() : null;
783
        }
784
 
785
        @Transient
581 blopes 786
        public String getDescricaoDoSubtipo() {
787
                return VerificadorUtil.naoEstaNuloOuVazio(getSubtipoProduto())? getSubtipoProduto().getDescricao() : "";
788
        }
789
 
790
        @Transient
106 espaco 791
        public String getDescricaoDoGenero() {
792
                return VerificadorUtil.naoEstaNuloOuVazio(getGenero())? TipoGenero.parse(getGenero()).getDescricao() : null;
793
        }
794
 
795
        @Transient
796
        public String getDescricaoDoEstilo() {
797
                return VerificadorUtil.naoEstaNuloOuVazio(getEstilo())? TipoEstiloProduto.parse(getEstilo()).getDescricao() : null;
798
        }
799
 
800
        @Transient
801
        public String getDescricaoDaCor() {
802
                return VerificadorUtil.naoEstaNuloOuVazio(getCor())? TipoCorProduto.parse(getCor()).getDescricao() : null;
803
        }
804
 
805
        @Transient
806
        public String getDescricaoNotaFiscal(String observacaoNotaFiscal) {
807
                StringBuilder descricaoCompleta = new StringBuilder();
808
                if (this.getTipo().equals(TipoProduto.CAPA.getValor())) {
809
                        descricaoCompleta.append("CAPA");
810
                }
811
                if (!this.getTipo().equals(TipoProduto.ACESSORIO.getValor()) /*&&
812
                                !this.getTipo().equals(TipoProduto.RESTAURANTE.getValor())*/) {
813
                        descricaoCompleta.append(" ");
814
                        descricaoCompleta.append(this.getDescricaoDoModelo());
815
                }
816
                if (VerificadorUtil.naoEstaNuloOuVazio(this.getEstilo())) {
817
                        descricaoCompleta.append(" ");
818
                        descricaoCompleta.append(this.getDescricaoDoEstilo());
819
                }
820
                descricaoCompleta.append(" ");
821
                if (this.getDescricao().length() > 50) {
822
                        descricaoCompleta.append(this.getDescricao().substring(0, 50));
823
                } else {
824
                        descricaoCompleta.append(this.getDescricao());
825
                }
826
                if (VerificadorUtil.naoEstaNuloOuVazio(this.getCor())) {
827
                        descricaoCompleta.append(" (");
828
                        descricaoCompleta.append(this.getDescricaoDaCor());
829
                        descricaoCompleta.append(")");
830
                }
831
                if (VerificadorUtil.naoEstaNuloOuVazio(observacaoNotaFiscal)) {
832
                        descricaoCompleta.append(" ");
833
                        descricaoCompleta.append(observacaoNotaFiscal);
834
                }
835
                return descricaoCompleta.toString().trim();
836
        }
837
 
838
        @Transient
839
        public Integer getQuantidadeEstoqueTotal() {
840
                Integer total = 0;
841
                /*
842
                for (ProdutoLoja estoque : estoques) {
843
                        total = total + estoque.getQuantidadeEstoque();
844
                }
845
                */
846
                return total;
847
        }
848
 
849
        @Transient
850
        public Boolean verificarSeQuantidadeEhMenor(Integer primeiro, Integer segundo) {
851
                if (VerificadorUtil.naoEstaNulo(primeiro) && VerificadorUtil.naoEstaNulo(segundo)) {
852
                        return primeiro <= segundo ? true : false;
853
                }
854
                return false;
855
        }
856
 
857
        public void atualizarDados(Produto produto) {
858
                this.codigo = produto.getCodigo();
859
                this.descricao = produto.getDescricao();
860
                this.valorCompra = produto.getValorCompra();
861
                this.valorVarejo = produto.getValorVarejo();
862
                if (produto.getQuantidadeEstoqueTotal() > 0) {
863
                        this.setAtivo(true);
864
                }
865
        }
866
 
867
        public void atualizarDadosNfe(nfce.java.TNFe.InfNFe.Det produtoNota) {
868
                if (VerificadorUtil.estaNuloOuVazio(this.getDescricao())) {
869
                        this.setDescricao(produtoNota.getProd().getXProd());
870
                }
871
                if (VerificadorUtil.estaNuloOuVazio(this.getGenero())) {
872
                        this.setGenero(TipoGenero.UNISSEX.getValor());
873
                }
874
 
875
                this.setCodigoEAN(StringUtil.retornarApenasNumeros(produtoNota.getProd().getCEAN()));
876
                this.setCodigoEANTributado(StringUtil.retornarApenasNumeros(produtoNota.getProd().getCEANTrib()));
457 blopes 877
                if (VerificadorUtil.naoEstaNulo(produtoNota.getProd().getNCM())) {             
106 espaco 878
                        this.setCodigoNCM(produtoNota.getProd().getNCM());
879
                }
880
                if (VerificadorUtil.naoEstaNulo(produtoNota.getProd().getCEST())) {
881
                        this.setCodigoEST(produtoNota.getProd().getCEST());
882
                }
144 espaco 883
 
884
                for (JAXBElement<?> elemento : produtoNota.getImposto().getContent()) {
885
                        if (elemento.getDeclaredType().equals(nfce.java.TNFe.InfNFe.Det.Imposto.ICMS.class)) {
886
                                nfce.java.TNFe.InfNFe.Det.Imposto.ICMS icms = (nfce.java.TNFe.InfNFe.Det.Imposto.ICMS) elemento.getValue();
145 espaco 887
                                if (VerificadorUtil.naoEstaNulo(icms.getICMS00())) {
161 espaco 888
                                        preencherAliquotaIcms(Double.valueOf(icms.getICMS00().getPICMS()));
145 espaco 889
                                }
161 espaco 890
                                if (VerificadorUtil.naoEstaNulo(icms.getICMS10())) {
891
                                        preencherAliquotaIcms(Double.valueOf(icms.getICMS10().getPICMS()));
892
                                }
144 espaco 893
                        }
894
                        if (elemento.getDeclaredType().equals(nfce.java.TIpi.class)) {
895
                                nfce.java.TIpi ipi = (nfce.java.TIpi) elemento.getValue();
145 espaco 896
                                if (VerificadorUtil.naoEstaNulo(ipi.getIPITrib())) {
457 blopes 897
                                        if (VerificadorUtil.naoEstaNulo(ipi.getIPITrib().getPIPI())) {
898
                                                Double aliquotaIPITrib = Double.valueOf(ipi.getIPITrib().getPIPI());
899
                                                if (aliquotaIPITrib > 0.0) {
900
                                                        this.setAliquotaIPINotaFiscal(aliquotaIPITrib);
901
                                                }
152 espaco 902
                                        }
145 espaco 903
                                }
144 espaco 904
                        }
905
                }
152 espaco 906
                if (VerificadorUtil.estaNulo(getAliquotaIcms())) {
907
                        this.setAliquotaIcmsNotaFiscal(0.0);
908
                        this.setAliquotaIcms(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_INTERNA_ICMS_PADRAO_12);
909
                }
145 espaco 910
 
911
                if (VerificadorUtil.estaNulo(this.getValorCompra())) {
912
                        if (VerificadorUtil.naoEstaNulo(produtoNota.getProd().getVUnCom())) {
913
                                this.setValorCompra(retornarValorComDesconto(produtoNota.getProd()));
914
                        }
915
                }
106 espaco 916
        }
161 espaco 917
        private void preencherAliquotaIcms(Double aliquotaIcms) {
918
                if (aliquotaIcms > 0.0) {
919
                        this.setAliquotaIcmsNotaFiscal(aliquotaIcms);
920
                        this.setAliquotaIcms(aliquotaIcms);
921
                } else {
922
                        this.setAliquotaIcmsNotaFiscal(0.0);
923
                        this.setAliquotaIcms(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_INTERNA_ICMS_PADRAO_12);
924
                }
925
        }
106 espaco 926
 
927
        public Double retornarValorComDesconto(nfce.java.TNFe.InfNFe.Det.Prod produto) {
145 espaco 928
                Double valor = 0.0;
106 espaco 929
                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getVDesc())) {
145 espaco 930
                        valor = (new Double(produto.getVProd()) - new Double(produto.getVDesc())) / new Double(produto.getQCom()).intValue();
931
                } else {
932
                        valor = new Double(produto.getVUnCom());
106 espaco 933
                }
145 espaco 934
                return valor;
106 espaco 935
        }
936
 
937
        public Double retornarLucroBruto() {
938
                if (VerificadorUtil.naoEstaNulo(getValorCompra()) && VerificadorUtil.naoEstaNulo(getValorVarejo())) {
939
                        if (VerificadorUtil.naoEstaNulo(getValorVarejoPromocional())) {
940
                                return (getValorVarejoPromocional() / getValorCompra()) - 1.0;
941
                        } else {
942
                                return (getValorVarejo() / getValorCompra()) - 1.0;
943
                        }
944
                }
945
                return 0.0;
946
        }
947
 
948
        public Double retornarMargemBruta() {
949
                if (VerificadorUtil.naoEstaNulo(getValorCompra()) && VerificadorUtil.naoEstaNulo(getValorVarejo())) {
950
                        if (VerificadorUtil.naoEstaNulo(getValorVarejoPromocional())) {
951
                                return (100 - (getValorCompra()*100/getValorVarejoPromocional())) / 100;
952
                        } else {
953
                                return (100 - (getValorCompra()*100/getValorVarejo())) / 100;
954
                        }
955
                }
956
                return 0.0;
957
        }
958
 
959
        public Double retornarValorMargemBruta() {
960
                Double margemBruta = retornarMargemBruta();
961
                if (margemBruta > 0.0) {
962
                        if (VerificadorUtil.naoEstaNulo(getValorVarejoPromocional())) {
963
                                return margemBruta * getValorVarejoPromocional();
964
                        } else {
965
                                return margemBruta * getValorVarejo();
966
                        }
967
                }
968
                return 0.0;
969
        }
970
 
971
        @Transient
972
        public String retornarCorMargem() {
973
                Double margemBruta = retornarMargemBruta();
974
                if (margemBruta > 0.50) return "green";
975
                if (margemBruta > 0.34) return "orange";
976
                if (margemBruta < 0.35) return "red";
977
                return "black";
978
        }
979
 
144 espaco 980
        @Transient
981
        public String retornarCorMargemLucro() {
982
                Double margemBruta = calculoMargemAposCustos();
983
                if (margemBruta > 29.99) return "green";
984
                if (margemBruta > 14.99) return "orange";
985
                if (margemBruta < 15.0) return "red";
986
                return "black";
987
        }
988
 
106 espaco 989
        @Transient
990
        public String getFornecedorMenorValorComprado(Fornecedor fornecedorComprar) {
991
                FornecedorProduto menorValor = null;
992
                for (FornecedorProduto fornecedorProduto : this.getFornecedores()) {
993
                        if (menorValor == null) {
994
                                menorValor = fornecedorProduto;
995
                        } else {
996
                                if (VerificadorUtil.estaNulo(menorValor.getValorCompra()) &&
997
                                                VerificadorUtil.naoEstaNulo(fornecedorProduto.getValorCompra())) {
998
                                        menorValor = fornecedorProduto;
999
                                }
1000
                                if (VerificadorUtil.naoEstaNulo(menorValor.getValorCompra()) &&
1001
                                                VerificadorUtil.naoEstaNulo(fornecedorProduto.getValorCompra())) {
1002
                                        if (menorValor.getValorCompra() > fornecedorProduto.getValorCompra()) {
1003
                                                menorValor = fornecedorProduto;
1004
                                        }
1005
                                }
1006
                        }
1007
                }
1008
                String menorValorComprado = "";
1009
                if (VerificadorUtil.naoEstaNulo(menorValor)) {
1010
                        menorValorComprado = "R$ " + formatarValor(menorValor.getValorCompra());
1011
                        if (VerificadorUtil.naoEstaNulo(menorValor.getFornecedor().getNomeDaPessoa())) {
1012
                                if (!menorValor.getFornecedor().equals(fornecedorComprar)) {
1013
                                        menorValorComprado = menorValorComprado + ", " + menorValor.getFornecedor().getNomeDaPessoa();
1014
                                }
1015
                        }
1016
                }
1017
                return menorValorComprado;
1018
        }
1019
 
1020
        private String formatarValor(Double valor) {
1021
                return VerificadorUtil.naoEstaNulo(valor)? String.format("%.2f", valor) : "0,00";
1022
        }
1023
 
1024
        @Override
1025
        public int hashCode() {
1026
                final int prime = 31;
1027
                int result = 1;
1028
                result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
1029
                result = prime * result + ((sequencial == null) ? 0 : sequencial.hashCode());
1030
                return result;
1031
        }
1032
 
1033
        @Override
1034
        public boolean equals(Object obj) {
1035
                if (this == obj)
1036
                        return true;
1037
                if (obj == null)
1038
                        return false;
1039
                if (getClass() != obj.getClass())
1040
                        return false;
1041
                Produto other = (Produto) obj;
1042
                if (codigo == null) {
1043
                        if (other.codigo != null)
1044
                                return false;
1045
                } else if (!codigo.equals(other.codigo))
1046
                        return false;
1047
                if (sequencial == null) {
1048
                        if (other.sequencial != null)
1049
                                return false;
1050
                } else if (!sequencial.equals(other.sequencial))
1051
                        return false;
1052
                return true;
1053
        }
1054
 
1055
        @Transient
1056
        public void prepararNovoProduto() {
1057
                setAtivo(true);
1058
                setIndicadorFavorito(false);
1059
                setIndicadorComissionado(true);
1060
                setIndicadorEmissaoNotaFiscal(false);
140 espaco 1061
                setSujeitoST(false);
106 espaco 1062
        }
1063
 
1064
        @Transient
1065
        public boolean tipoProdutoEhCapa() {
1066
                return getTipo().equals(TipoProduto.CAPA.getValor());
1067
        }
1068
 
1069
        @Transient
1070
        public boolean tipoProdutoEhPelicula() {
1071
                return getTipo().equals(TipoProduto.PELICULA.getValor());
1072
        }
1073
 
1074
        @Transient
1075
        public boolean tipoProdutoEhCapaOuAcessorio() {
1076
                return tipoProdutoEhCapa() || getTipo().equals(TipoProduto.ACESSORIO.getValor());
1077
        }
1078
 
1079
        @Transient
1080
        public boolean tipoProdutoEhCapaOuPelicula() {
1081
                return tipoProdutoEhCapa() || tipoProdutoEhPelicula();
1082
        }
1083
 
1084
        @Transient
1085
        public boolean tipoProdutoEhServico() {
1086
                return getTipo().equals(TipoProduto.SERVICO.getValor());
1087
        }
1088
 
1089
        /*@Transient
1090
        public boolean tipoProdutoEhRemedioOuOutros() {
1091
                return getTipo().equals(TipoProduto.REMEDIO.getValor()) ||
1092
                                getTipo().equals(TipoProduto.REMEDIO_CARTELA.getValor()) ||
1093
                                getTipo().equals(TipoProduto.OUTROS.getValor());
1094
        }*/
1095
 
1096
        @Transient
1097
        public boolean tipoProdutoTributado() {
1098
                return getTipo().equals(TipoProduto.ACESSORIO.getValor()) ||
1099
                                getTipo().equals(TipoProduto.APARELHOS.getValor()) ||
1100
                                getTipo().equals(TipoProduto.CAPA.getValor()) ||
1101
                                getTipo().equals(TipoProduto.PELICULA.getValor());
1102
        }
1103
 
1104
        @Transient
1105
        public boolean tipoProdutoNaoTributado() {
1106
                return /*getTipo().equals(TipoProduto.REMEDIO.getValor()) ||
1107
                                getTipo().equals(TipoProduto.REMEDIO_CARTELA.getValor()) ||
1108
                                getTipo().equals(TipoProduto.OUTROS.getValor()) ||*/
1109
                                getTipo().equals(TipoProduto.SERVICO.getValor());
1110
        }
1111
 
1112
        @Transient
1113
        public Boolean verificarSeCodigoEhIgual(String codigoProduto) {
1114
                if (codigoProduto.length() > 6 && VerificadorUtil.naoEstaNuloOuVazio(this.getCodigoEAN())) {
1115
                        if (this.getCodigoEAN().equals(codigoProduto)) {
1116
                                return true;
1117
                        }
1118
                }
1119
                if (CodigoBarraEAN.validarCodigoBarras(codigoProduto)) {
1120
                        return this.getCodigoProdutoPadrao().equals(CodigoBarraEAN.retornarCodigoDoCodigoBarras(codigoProduto));
1121
                } else {
1122
                        return this.getCodigoProdutoPadrao().equals(UtilBean.padraoCodigoProduto(codigoProduto));
1123
                }
1124
        }
1125
 
1126
        @Transient
1127
        public String getCodigoNCMDaTributacao() {
1128
                return VerificadorUtil.naoEstaNulo(getTributacao())? getTributacao().getCodigoNCM() : null;
1129
        }
1130
 
1131
        @Transient
1132
        public String getCodigoESTDaTributacao() {
1133
                return VerificadorUtil.naoEstaNulo(getTributacao())? getTributacao().getCodigoEST() : null;
1134
        }
1135
 
1136
        @Override
1137
        public Produto clone() throws CloneNotSupportedException {
1138
                return (Produto) super.clone();
1139
        }
1140
 
1141
        @Transient
1142
        public String corDaDescricaoPeloGenero() {
1143
                if (VerificadorUtil.naoEstaNulo(getGenero())) {
1144
                        if (getGenero().equals(TipoGenero.MASCULINO.getValor())) return "#1c82df";
1145
                        if (getGenero().equals(TipoGenero.FEMININO.getValor())) return "#f06364";
1146
                }
1147
                return "black";
1148
        }
1149
 
1150
        @Transient
1151
        public Boolean getProdutoEmPromocao() {
1152
                if (VerificadorUtil.naoEstaNulo(getValorVarejoPromocional())) {
1153
                        return getValorVarejoPromocional() > 0.00;
1154
                }
1155
                return false;
1156
        }
1157
 
1158
        @Transient
1159
        public void prepararDadosParaDuplicacao(Produto produto) {
1160
                this.modelo = produto.getModelo();
1161
                this.tributacao = produto.getTributacao();
1162
                this.descricao = produto.getDescricao();
1163
                this.tipo = produto.getTipo();
591 blopes 1164
                this.subtipoProduto = produto.getSubtipoProduto();
106 espaco 1165
                this.estilo = produto.getEstilo();
1166
                this.genero = produto.getGenero();
1167
                this.cor = produto.getCor();
1168
                this.observacao = produto.getObservacao();
1169
                this.valorCompra = produto.getValorCompra();
1170
                this.valorVarejo = produto.getValorVarejo();
1171
                this.valorVarejoPromocional = produto.getValorVarejoPromocional();
1172
                this.valorVarejoMaximo = produto.getValorVarejoMaximo();
1173
                this.valorVarejoPopular = produto.getValorVarejoPopular();
1174
                this.valorAtacado = produto.getValorAtacado();
1175
                this.indicadorComissionado = produto.getIndicadorComissionado();
1176
                this.indicadorEmissaoNotaFiscal = produto.getIndicadorEmissaoNotaFiscal();
1177
                this.codigoNCM = produto.getCodigoNCM();
1178
                this.codigoEST = produto.getCodigoEST();
145 espaco 1179
                this.setSujeitoST(produto.getSujeitoST());
1180
                this.setAliquotaIcms(produto.getAliquotaIcms());
1181
                this.setAliquotaIcmsST(produto.getAliquotaIcmsST());
1182
                this.setAliquotaFecoep(produto.getAliquotaFecoep());
1183
                this.setAliquotaIPI(produto.getAliquotaIPI());
106 espaco 1184
                this.setAtivo(true);
1185
        }
1186
 
144 espaco 1187
        @Transient
1188
        public void atualizarAliquotas(Fornecedor fornecedor) {
152 espaco 1189
                if (VerificadorUtil.naoEstaNulo(getTributacao())) {
1190
                        setAliquotaIPI(getTributacao().getAliquotaIPI());
1191
                }
1192
 
144 espaco 1193
                if (VerificadorUtil.naoEstaNulo(getTributacao())
1194
                                && VerificadorUtil.naoEstaNulo(getAliquotaIcms())
1195
                                && VerificadorUtil.naoEstaNulo(fornecedor)) {
1196
                        if (getTributacao().getSujeitoST() && fornecedor.getSujeitoST()) {
1197
                                setAliquotaIcmsST(getTributacao().mvaPorIcms(getAliquotaIcms()));
1198
                                setAliquotaFecoep(getTributacao().getAliquotaFecoep());
1199
                                setSujeitoST(true);
1200
                        } else {
1201
                                setAliquotaFecoep(null);
1202
                                setAliquotaIcmsST(null);
1203
                                setSujeitoST(false);
1204
                        }
1205
                } else if (VerificadorUtil.naoEstaNulo(getTributacao()) && VerificadorUtil.naoEstaNulo(getAliquotaIcms())) {
1206
                        if (getTributacao().getSujeitoST()) {
1207
                                setAliquotaIcmsST(getTributacao().mvaPorIcms(getAliquotaIcms()));
1208
                                setAliquotaFecoep(getTributacao().getAliquotaFecoep());
1209
                                setSujeitoST(true);
1210
                        } else {
1211
                                setAliquotaFecoep(null);
1212
                                setAliquotaIcmsST(null);
1213
                                setSujeitoST(false);
1214
                        }
1215
                }
1216
        }
1217
 
1218
        @Transient
1219
        public Double calculoIPI() {
318 espaco 1220
                return (VerificadorUtil.naoEstaNulo(getAliquotaIPI()) &&
1221
                                VerificadorUtil.naoEstaNulo(getValorCompra()))?
1222
                                        getAliquotaIPI()/100 * getValorCompra() : 0.0;
144 espaco 1223
        }
1224
 
1225
        @Transient
1226
        public Double calculoICMS() {
318 espaco 1227
                return (VerificadorUtil.naoEstaNulo(getAliquotaIcms()) &&
1228
                                VerificadorUtil.naoEstaNulo(getAliquotaFecoep()) &&
1229
                                VerificadorUtil.naoEstaNulo(getValorCompra()))?
144 espaco 1230
                                (getAliquotaIcms()/100 + getAliquotaFecoep()/100) * getValorCompra() : 0.0;
1231
        }
1232
 
1233
        @Transient
1234
        public Double calculoICMSST() {
1235
                if (getSujeitoST()) {
1236
                        return VerificadorUtil.naoEstaNulo(getAliquotaIcmsST())
1237
                                        && VerificadorUtil.naoEstaNulo(getAliquotaFecoep())
1238
                                        && VerificadorUtil.naoEstaNulo(getTributacao())?
1239
                                ((getTributacao().getAliquotaInterna()/100 + getAliquotaFecoep()/100) * baseCalculoICMSST()) - calculoICMS(): 0.0;
1240
                }
1241
                return 0.0;
1242
        }
1243
 
1244
        @Transient
1245
        public Double baseCalculoICMSST() {
1246
                if (getSujeitoST()) {
1247
                        if (VerificadorUtil.naoEstaNulo(getTributacao())) {
1248
                                Double baseCalculoIPI = getValorCompra() + calculoIPI();
1249
                                return baseCalculoIPI + (baseCalculoIPI * getTributacao().mvaPorIcms(getAliquotaIcms())/100);
1250
                        }
1251
                }
1252
                return 0.0;
1253
        }
1254
 
1255
        @Transient
1256
        public Double aliquotaMvaProduto() {
1257
                return VerificadorUtil.naoEstaNulo(getTributacao())? getTributacao().mvaPorIcms(getAliquotaIcms()) : 0.0;
1258
        }
1259
 
1260
        @Transient
1261
        public Double calculoTributosCompra() {
145 espaco 1262
                 return VerificadorUtil.naoEstaNulo(getValorCompra())? getValorCompra() + calculoIPI() + calculoICMSST() : 0.0;
144 espaco 1263
        }
1264
 
1265
        @Transient
633 blopes 1266
        public List<ProdutoCustosDTO> custosProduto() {
1267
                List<ProdutoCustosDTO> lista = new ArrayList<ProdutoCustosDTO>();
1268
                ProdutoCustosDTO produtoCustosPix = new ProdutoCustosDTO();
1269
                produtoCustosPix.setDescricaoFormaPagamento("PIX");
1270
                produtoCustosPix.setValorVarejo(getValorVarejo());
1271
                produtoCustosPix.setValorSimulacao(getValorVarejoSimulacao());
1272
                produtoCustosPix.setValorCompra(getValorCompra());
1273
                produtoCustosPix.setCustoTributosCompras(calculoTributosCompra());
1274
                produtoCustosPix.setAliquotaMargemMinima(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MARGEM_MINIMA_DEB_PIX_15);
1275
                lista.add(produtoCustosPix);
1276
 
1277
                ProdutoCustosDTO produtoCustosDebito = new ProdutoCustosDTO();
1278
                produtoCustosDebito.setDescricaoFormaPagamento("DÉBITO");
1279
                produtoCustosDebito.setValorVarejo(getValorVarejo());
1280
                produtoCustosDebito.setValorSimulacao(getValorVarejoSimulacao());
1281
                produtoCustosDebito.setValorCompra(getValorCompra());
1282
                produtoCustosDebito.setCustoTributosCompras(calculoTributosCompra());
1283
                produtoCustosDebito.setAliquotaFormaPagamento(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MAIOR_CARTAO_DEB_PIX_1);
1284
                produtoCustosDebito.setAliquotaMargemMinima(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MARGEM_MINIMA_DEB_PIX_15);
1285
                lista.add(produtoCustosDebito);
1286
 
1287
                ProdutoCustosDTO produtoCustosCredito = new ProdutoCustosDTO();
1288
                produtoCustosCredito.setDescricaoFormaPagamento("CRÉDITO À VISTA");
1289
                produtoCustosCredito.setValorVarejo(getValorVarejo());
1290
                produtoCustosCredito.setValorSimulacao(getValorVarejoSimulacao());
1291
                produtoCustosCredito.setValorCompra(getValorCompra());
1292
                produtoCustosCredito.setCustoTributosCompras(calculoTributosCompra());
1293
                produtoCustosCredito.setAliquotaFormaPagamento(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MAIOR_CARTAO_CRED_1X_3);
1294
                produtoCustosCredito.setAliquotaMargemMinima(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MARGEM_MINIMA_CRED_1X_17_5);
1295
                lista.add(produtoCustosCredito);
1296
 
1297
                ProdutoCustosDTO produtoCustosCreditoParcelado = new ProdutoCustosDTO();
1298
                produtoCustosCreditoParcelado.setDescricaoFormaPagamento("PARCELADO");
1299
                produtoCustosCreditoParcelado.setValorVarejo(getValorVarejo());
1300
                produtoCustosCreditoParcelado.setValorSimulacao(getValorVarejoSimulacao());
1301
                produtoCustosCreditoParcelado.setValorCompra(getValorCompra());
1302
                produtoCustosCreditoParcelado.setCustoTributosCompras(calculoTributosCompra());
1303
                produtoCustosCreditoParcelado.setAliquotaFormaPagamento(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MAIOR_CARTAO_PARCELADO_10_88);
1304
                produtoCustosCreditoParcelado.setAliquotaMargemMinima(ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MARGEM_MINIMA_PARCELADO_20);
1305
                lista.add(produtoCustosCreditoParcelado);;
1306
                return lista;
1307
        }
1308
 
1309
        @Transient
144 espaco 1310
        public Double calculoOperacao() {
1311
                Double aliquota = ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MEDIA_SIMPLES_NACIONAL_11 +
162 espaco 1312
                                                  ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MEDIA_COMISSOES_2 +
633 blopes 1313
                                                  ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MAIOR_CARTAO_PARCELADO_10_88;
144 espaco 1314
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? calculoTributosCompra() + (getValorVarejoSimulacao()*aliquota/100) : 0.0;
1315
        }
1316
 
1317
        @Transient
152 espaco 1318
        public String valorCalculoOperacao() {
1319
                return StringUtil.formatarValor(calculoOperacao());
1320
        }
1321
 
1322
        @Transient
144 espaco 1323
        public Double calculoValorAposCustos() {
1324
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? getValorVarejoSimulacao() - calculoOperacao() : 0.0;
1325
        }
1326
 
1327
        @Transient
1328
        public Double calculoMargemAposCustos() {
1329
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? calculoValorAposCustos() * 100 / calculoOperacao() : 0.0;
1330
        }
1331
 
145 espaco 1332
        @Transient
1333
        public String retornarLucroBrutoFormatado() {
1334
                return StringUtil.formatarPercentual(calculoValorAposCustos());
1335
        }
1336
 
1337
        @Transient
1338
        public String retornarMargemBrutaFormatada() {
1339
                try {
1340
                        return StringUtil.formatarValorComDigitos(calculoMargemAposCustos().toString(), 2);
1341
                } catch (Exception e) {
1342
                        e.printStackTrace();
1343
                }
1344
                return "";
1345
        }
1346
 
152 espaco 1347
        @Transient
1348
        public Double calculoPrecoMinimo() {
1349
                Double valorVarejoSimulacao = getValorVarejoSimulacao();
1350
                setValorVarejoSimulacao(this.getValorCompra());
1351
                Double valorMinimo = this.calculoOperacao();
1352
                Double margem = 0.0;
1353
                valorMinimo = valorMinimo + (valorMinimo / 100);
1354
                if (valorMinimo > 0.0) {
1355
                        while (margem < 15.0) {
1356
                                valorMinimo = valorMinimo + (valorMinimo / 100);
1357
                                setValorVarejoSimulacao(valorMinimo);
1358
                                margem = calculoMargemAposCustos();
1359
                        }
1360
                }
1361
                setValorVarejoSimulacao(valorVarejoSimulacao);
1362
                return valorMinimo;
1363
        }
1364
 
106 espaco 1365
}