Subversion Repositories Integrator Subversion

Rev

Rev 544 | Rev 580 | 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;
106 espaco 34
import br.com.ec.domain.model.tipos.TipoCorProduto;
35
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
36
import br.com.ec.domain.model.tipos.TipoGenero;
37
import br.com.ec.domain.model.tipos.TipoProduto;
144 espaco 38
import br.com.ec.domain.shared.ConstantesSEC;
106 espaco 39
import br.com.ec.domain.util.CodigoBarraEAN;
40
 
41
@Entity
42
@Table(name="sec_produto", schema="sc_sec")
43
public class Produto implements Serializable, Cloneable {
44
 
45
        private static final long serialVersionUID = 1L;
46
 
47
        private Long sequencial;
48
        private Modelo modelo;
49
        private Tributacao tributacao;
550 blopes 50
        private Estampa estampa;
106 espaco 51
        private String codigo;
52
        private String codigoRapido;
53
        private String codigoEAN;
54
        private String codigoEANTributado;
55
        private String descricao;
56
        private String descricaoEtiqueta;
170 espaco 57
        private String descricaoParaNotaFiscal;
106 espaco 58
        private String tipo;
59
        private String genero;
60
        private String estilo;
61
        private String cor;
62
        private String observacao;
63
        private Double valorCompra;
64
        private Double valorVarejo;
65
        private Double valorVarejoPromocional;
66
        private Double valorVarejoMaximo;
67
        private Double valorVarejoPopular;
68
        private Double valorAtacado;
69
        private Date dataOnline;
70
        private Date dataOnlineShoplog;
270 espaco 71
        private Date dataOnlineMercadoLivre;
106 espaco 72
        private Boolean indicadorFavorito;
73
        private Boolean indicadorComissionado;
305 espaco 74
        private Boolean indicadorPersonalizavel;
106 espaco 75
        private Boolean indicadorEmissaoNotaFiscal;
140 espaco 76
 
144 espaco 77
        private Double valorVarejoSimulacao;
140 espaco 78
        private Boolean sujeitoST;
144 espaco 79
        private Double aliquotaIPI;
152 espaco 80
        private Double aliquotaIPINotaFiscal;
144 espaco 81
        private Double aliquotaIcms;
152 espaco 82
        private Double aliquotaIcmsNotaFiscal;
144 espaco 83
        private Double aliquotaIcmsST;
84
        private Double aliquotaFecoep;
106 espaco 85
        private Boolean ativo;
86
 
87
        private String codigoNCM;
88
        private String codigoEST;
89
        private Set<ProdutoPedidoCompra> pedidosCompra;
90
        private Set<ProdutoLoja> estoques;
91
        private Set<FornecedorProduto> fornecedores;
92
        private Set<ProdutoRelacionado> relacionados;
93
        private Set<ProdutoRelacionado> relacionadosReverse;
94
 
95
        private List<TransferenciaProduto> transferenciasAbertas = new ArrayList<TransferenciaProduto>();
96
        private List<PedidoProduto> pedidosPendentes = new ArrayList<PedidoProduto>();
97
 
98
        private Boolean indicadorOnline;
99
        private Boolean indicadorOnlineShoplog;
270 espaco 100
        private Boolean indicadorOnlineMercadoLivre;
106 espaco 101
        private Date dataUltimaVenda;
102
//      private Set<ProdutoArquivo> fotos;
103
 
544 blopes 104
        public Produto() {}
105
 
106
        public Produto(Long sequencial) {
107
                this.sequencial = sequencial;
108
        }
109
 
106 espaco 110
        @Id
111
        @SequenceGenerator(name = "sq_produto")
112
        @GeneratedValue(strategy = GenerationType.IDENTITY)
113
        @Column(name="seq_produto", nullable=false)
114
        public Long getSequencial() {
115
                return sequencial;
116
        }
117
        public void setSequencial(Long sequencial) {
118
                this.sequencial = sequencial;
119
        }
120
 
121
        @ManyToOne
122
        @ForeignKey(name="fk_produto_modelo")
123
        @NotNull(message = "Parâmetro obrigatório não preenchido: Modelo do produto", groups = {Cadastrar.class, Alterar.class})
124
        @JoinColumn(name = "seq_modelo", referencedColumnName="seq_modelo", nullable=true)
125
        public Modelo getModelo() {
126
                return modelo;
127
        }
128
        public void setModelo(Modelo modelo) {
129
                this.modelo = modelo;
130
        }
131
 
132
        @ManyToOne
133
        @ForeignKey(name="fk_produto_tributacao")
134
        @JoinColumn(name = "seq_tributacao", referencedColumnName="seq_tributacao", nullable=true)
135
        public Tributacao getTributacao() {
136
                return tributacao;
137
        }
138
        public void setTributacao(Tributacao tributacao) {
139
                this.tributacao = tributacao;
140
        }
141
 
550 blopes 142
        @ManyToOne
143
        @ForeignKey(name="fk_produto_estampa")
144
        @JoinColumn(name = "seq_estampa", referencedColumnName="seq_estampa", nullable=true)
145
        public Estampa getEstampa() {
146
                return estampa;
147
        }
148
        public void setEstampa(Estampa estampa) {
149
                this.estampa = estampa;
150
        }
151
 
106 espaco 152
        @Column(name="cod_produto")
153
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código do Produto")
154
        @NotNull(message = "Parâmetro obrigatório não preenchido: Código do produto", groups = {Cadastrar.class, Alterar.class})
155
        @NotEmpty(message = "Parâmetro obrigatório não preenchido: Código do produto", groups = {Cadastrar.class, Alterar.class})
156
        public String getCodigo() {
157
                return codigo;
158
        }
159
        public void setCodigo(String codigo) {
160
                this.codigo = codigo;
161
        }
162
 
163
        @Column(name="cod_rapido_produto")
164
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código Rápido")
165
        public String getCodigoRapido() {
166
                return codigoRapido;
167
        }
168
        public void setCodigoRapido(String codigoRapido) {
169
                this.codigoRapido = codigoRapido;
170
        }
171
 
172
        @Column(name="cod_ean")
173
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código de Barras (EAN)")
174
        public String getCodigoEAN() {
175
                return codigoEAN;
176
        }
177
        public void setCodigoEAN(String codigoEAN) {
178
                this.codigoEAN = codigoEAN;
179
        }
180
 
181
        @Column(name="cod_ean_tributado")
182
        @Size(max = 20, message = "Limite de caracteres ultrapassado: Código de Barras Tributado (EAN)")
183
        public String getCodigoEANTributado() {
184
                return codigoEANTributado;
185
        }
186
        public void setCodigoEANTributado(String codigoEANTributado) {
187
                this.codigoEANTributado = codigoEANTributado;
188
        }
189
 
190
        @Column(name="dsc_produto")
191
        @Size(max = 250, message = "Limite de caracteres ultrapassado: Descrição do Produto")
192
        public String getDescricao() {
193
                return descricao;
194
        }
195
        public void setDescricao(String descricao) {
196
                this.descricao = StringUtil.setarUpperCaseComTrim(descricao);
197
        }
198
 
199
        @Column(name="dsc_etiqueta")
200
        @Size(max = 120, message = "Limite de caracteres ultrapassado: Descrição da Etiqueta")
201
        public String getDescricaoEtiqueta() {
202
                return descricaoEtiqueta;
203
        }
204
        public void setDescricaoEtiqueta(String descricaoEtiqueta) {
205
                this.descricaoEtiqueta = StringUtil.setarUpperCaseComTrim(descricaoEtiqueta);
206
        }
207
 
170 espaco 208
//      @Column(name="dsc_notafiscal")
209
//      @Size(max = 250, message = "Limite de caracteres ultrapassado: Descrição para Nota Fiscal do Produto")
210
        @Transient
211
        public String getDescricaoParaNotaFiscal() {
212
                return descricaoParaNotaFiscal;
213
        }
214
        public void setDescricaoParaNotaFiscal(String descricaoParaNotaFiscal) {
215
                this.descricaoParaNotaFiscal = descricaoParaNotaFiscal;
216
        }
217
 
106 espaco 218
        @Column(name="tip_produto")
219
        @NotNull(message = "Parâmetro obrigatório não preenchido: Tipo do produto", groups = {Cadastrar.class, Alterar.class})
220
        public String getTipo() {
221
                return tipo;
222
        }
223
        public void setTipo(String tipo) {
224
                this.tipo = tipo;
225
        }
226
 
227
        @Column(name="tip_genero")
228
        @NotNull(message = "Parâmetro obrigatório não preenchido: Gênero", groups = {Cadastrar.class, Alterar.class})
229
        public String getGenero() {
230
                return genero;
231
        }
232
        public void setGenero(String genero) {
233
                this.genero = genero;
234
        }
235
 
236
        @Column(name="tip_estilo")
237
        public String getEstilo() {
238
                return estilo;
239
        }
240
        public void setEstilo(String estilo) {
241
                this.estilo = estilo;
242
        }
243
 
244
        @Column(name="tip_cor")
245
        public String getCor() {
246
                return cor;
247
        }
248
        public void setCor(String cor) {
249
                this.cor = cor;
250
        }
251
 
252
        @Column(name="dsc_observacao")
253
        @Size(max = 1000, message = "Limite de caracteres ultrapassado: Observação")
254
        public String getObservacao() {
255
                return observacao;
256
        }
257
        public void setObservacao(String observacao) {
258
                this.observacao = StringUtil.setarUpperCaseComTrim(observacao);
259
        }
260
 
261
        @Column(name="val_compra")
262
        public Double getValorCompra() {
263
                return valorCompra;
264
        }
265
        public void setValorCompra(Double valorCompra) {
266
                this.valorCompra = valorCompra;
267
        }
268
 
269
        @Transient
270
        public String valorCompraFormatado() {
271
                if (VerificadorUtil.naoEstaNulo(getValorCompra())) {
272
                        return StringUtil.formatarValor(getValorCompra());
273
                }
274
                return StringUtil.formatarValor(0.0);
275
        }
276
 
277
        @Column(name="val_varejo")
278
        public Double getValorVarejo() {
279
                return valorVarejo;
280
        }
281
        public void setValorVarejo(Double valorVarejo) {
282
                this.valorVarejo = valorVarejo;
283
        }
284
 
285
        @Column(name="val_varejo_promocional")
286
        public Double getValorVarejoPromocional() {
287
                return valorVarejoPromocional;
288
        }
289
        public void setValorVarejoPromocional(Double valorVarejoPromocional) {
290
                this.valorVarejoPromocional = valorVarejoPromocional;
291
        }
292
 
293
        @Column(name="val_varejo_maximo")
294
        public Double getValorVarejoMaximo() {
295
                return valorVarejoMaximo;
296
        }
297
        public void setValorVarejoMaximo(Double valorVarejoMaximo) {
298
                this.valorVarejoMaximo = valorVarejoMaximo;
299
        }
300
 
301
        @Column(name="val_varejo_popular")
302
        public Double getValorVarejoPopular() {
303
                return valorVarejoPopular;
304
        }
305
        public void setValorAtacado(Double valorAtacado) {
306
                this.valorAtacado = valorAtacado;
307
        }
308
 
309
        @Column(name="val_atacado")
310
        public Double getValorAtacado() {
311
                return valorAtacado;
312
        }
313
        public void setValorVarejoPopular(Double valorVarejoPopular) {
314
                this.valorVarejoPopular = valorVarejoPopular;
315
        }
316
 
317
        @Column(name="dat_online")
318
        public Date getDataOnline() {
319
                return dataOnline;
320
        }
321
        public void setDataOnline(Date dataOnline) {
322
                this.dataOnline = dataOnline;
323
        }
324
 
325
        @Column(name="dat_online_shoplog")
326
        public Date getDataOnlineShoplog() {
327
                return dataOnlineShoplog;
328
        }
329
        public void setDataOnlineShoplog(Date dataOnlineShoplog) {
330
                this.dataOnlineShoplog = dataOnlineShoplog;
331
        }
332
 
270 espaco 333
        @Column(name="dat_online_mercadolivre")
334
        public Date getDataOnlineMercadoLivre() {
335
                return dataOnlineMercadoLivre;
336
        }
337
        public void setDataOnlineMercadoLivre(Date dataOnlineMercadoLivre) {
338
                this.dataOnlineMercadoLivre = dataOnlineMercadoLivre;
339
        }
340
 
106 espaco 341
        @Column(name="ind_favorito")
342
        public Boolean getIndicadorFavorito() {
343
                return indicadorFavorito;
344
        }
345
        public void setIndicadorFavorito(Boolean indicadorFavorito) {
346
                this.indicadorFavorito = indicadorFavorito;
347
        }
348
 
349
        @Column(name="ind_comissionado")
350
        public Boolean getIndicadorComissionado() {
351
                return indicadorComissionado;
352
        }
353
        public void setIndicadorComissionado(Boolean indicadorComissionado) {
354
                this.indicadorComissionado = indicadorComissionado;
355
        }
356
 
305 espaco 357
        @Column(name="ind_personalizavel")
358
        public Boolean getIndicadorPersonalizavel() {
359
                return indicadorPersonalizavel;
360
        }
361
        public void setIndicadorPersonalizavel(Boolean indicadorPersonalizavel) {
362
                this.indicadorPersonalizavel = indicadorPersonalizavel;
363
        }
364
 
106 espaco 365
        @Column(name="ind_emissao_nf")
366
        public Boolean getIndicadorEmissaoNotaFiscal() {
367
                if (VerificadorUtil.estaNulo(indicadorEmissaoNotaFiscal)) {
368
                        return false;
369
                }
370
                return indicadorEmissaoNotaFiscal;
371
        }
372
        public void setIndicadorEmissaoNotaFiscal(Boolean indicadorEmissaoNotaFiscal) {
373
                this.indicadorEmissaoNotaFiscal = indicadorEmissaoNotaFiscal;
374
        }
375
 
140 espaco 376
        @Column(name="ind_sujeito_st", nullable=false)
377
        public Boolean getSujeitoST() {
378
                if (VerificadorUtil.estaNulo(sujeitoST)) {
379
                        return false;
380
                }
381
                return sujeitoST;
382
        }
383
        public void setSujeitoST(Boolean sujeitoST) {
384
                this.sujeitoST = sujeitoST;
385
        }
144 espaco 386
 
387
        @Transient
388
        public Double getValorVarejoSimulacao() {
389
                if (VerificadorUtil.estaNulo(valorVarejoSimulacao)) {
390
                        return getValorVarejo();
391
                }
392
                return valorVarejoSimulacao;
393
        }
394
        public void setValorVarejoSimulacao(Double valorVarejoSimulacao) {
395
                this.valorVarejoSimulacao = valorVarejoSimulacao;
396
        }
140 espaco 397
 
277 espaco 398
        @Transient
399
        public Double getValorEm18x() {
400
                if (VerificadorUtil.naoEstaNulo(getValorVarejo())) {
401
                        return getValorVarejo() * 1.12;
402
                }
403
                return 0.0;
404
        }
405
 
406
        @Transient
407
        public Double getJurosValorEm18x() {
408
                if (VerificadorUtil.naoEstaNulo(getValorEm18x()) &&
409
                                VerificadorUtil.naoEstaNulo(getValorVarejo())) {
410
                        return getValorEm18x() - getValorVarejo();
411
                }
412
                return 0.0;
413
        }
414
 
415
        @Transient
416
        public Double getParcelasValorEm18x() {
417
                if (VerificadorUtil.naoEstaNulo(getValorEm18x())) {
418
                        if (getValorEm18x() > 0.0) {
419
                                return getValorEm18x()/18;
420
                        }
421
                }
422
                return 0.0;
423
        }
424
 
144 espaco 425
        @Column(name="val_aliquota_icms")
426
        public Double getAliquotaIcms() {
427
                return aliquotaIcms;
428
        }
429
        public void setAliquotaIcms(Double aliquotaIcms) {
430
                this.aliquotaIcms = aliquotaIcms;
431
        }
432
 
152 espaco 433
        @Transient
434
        public Double getAliquotaIcmsNotaFiscal() {
435
                return aliquotaIcmsNotaFiscal;
436
        }
437
        public void setAliquotaIcmsNotaFiscal(Double aliquotaIcmsNotaFiscal) {
438
                this.aliquotaIcmsNotaFiscal = aliquotaIcmsNotaFiscal;
439
        }
440
 
144 espaco 441
        @Column(name="val_aliquota_icms_st")
442
        public Double getAliquotaIcmsST() {
443
                return aliquotaIcmsST;
444
        }
445
        public void setAliquotaIcmsST(Double aliquotaIcmsST) {
446
                this.aliquotaIcmsST = aliquotaIcmsST;
447
        }
448
 
449
        @Column(name="val_aliquota_fecoep")
450
        public Double getAliquotaFecoep() {
451
                return aliquotaFecoep;
452
        }
453
        public void setAliquotaFecoep(Double aliquotaFecoep) {
454
                this.aliquotaFecoep = aliquotaFecoep;
455
        }
456
 
457
        @Column(name="val_aliquota_ipi")
458
        public Double getAliquotaIPI() {
459
                return aliquotaIPI;
460
        }
461
        public void setAliquotaIPI(Double aliquotaIPI) {
462
                this.aliquotaIPI = aliquotaIPI;
463
        }
464
 
152 espaco 465
        @Transient
466
        public Double getAliquotaIPINotaFiscal() {
467
                return aliquotaIPINotaFiscal;
468
        }
469
        public void setAliquotaIPINotaFiscal(Double aliquotaIPINotaFiscal) {
470
                this.aliquotaIPINotaFiscal = aliquotaIPINotaFiscal;
471
        }
472
 
106 espaco 473
        @Column(name="ind_ativo")
474
        public Boolean getAtivo() {
475
                return ativo;
476
        }
477
        public void setAtivo(Boolean ativo) {
478
                this.ativo = ativo;
479
        }
480
 
481
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
482
        public Set<ProdutoPedidoCompra> getPedidosCompra() {
483
                return pedidosCompra;
484
        }
485
        public void setPedidosCompra(Set<ProdutoPedidoCompra> pedidosCompra) {
486
                this.pedidosCompra = pedidosCompra;
487
        }
488
 
489
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
490
        public Set<ProdutoLoja> getEstoques() {
491
                return estoques;
492
        }
493
        public void setEstoques(Set<ProdutoLoja> estoques) {
494
                this.estoques = estoques;
495
        }
496
 
497
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
498
        public Set<FornecedorProduto> getFornecedores() {
499
                return fornecedores;
500
        }
501
        public void setFornecedores(Set<FornecedorProduto> fornecedores) {
502
                this.fornecedores = fornecedores;
503
        }
504
 
505
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
506
        public Set<ProdutoRelacionado> getRelacionados() {
507
                return relacionados;
508
        }
509
        public void setRelacionados(Set<ProdutoRelacionado> relacionados) {
510
                this.relacionados = relacionados;
511
        }
512
 
513
        @OneToMany(mappedBy="produtoRelacionado", cascade=CascadeType.ALL, orphanRemoval=true)
514
        public Set<ProdutoRelacionado> getRelacionadosReverse() {
515
                return relacionadosReverse;
516
        }
517
        public void setRelacionadosReverse(Set<ProdutoRelacionado> relacionadosReverse) {
518
                this.relacionadosReverse = relacionadosReverse;
519
        }
520
 
521
        @Transient
522
        public Boolean getIndicadorOnline() {
523
                if (VerificadorUtil.estaNulo(this.getDataOnline()) && VerificadorUtil.estaNulo(this.indicadorOnline)) {
524
                        setIndicadorOnline(false);
525
                } else {
526
                        setIndicadorOnline(true);
527
                }
528
                return indicadorOnline;
529
        }
530
        public void setIndicadorOnline(Boolean indicadorOnline) {
531
                this.indicadorOnline = indicadorOnline;
532
        }
533
        public void atualizarDataOnline() {
534
                if (VerificadorUtil.estaNulo(this.getDataOnline())) {
535
                        this.setDataOnline(DataUtils.getDataAtual());
536
                } else {
537
                        this.setDataOnline(null);
538
                }
539
        }
540
 
541
        @Transient
542
        public Boolean getIndicadorOnlineShoplog() {
543
                if (VerificadorUtil.estaNulo(this.getDataOnlineShoplog()) && VerificadorUtil.estaNulo(this.indicadorOnlineShoplog)) {
544
                        setIndicadorOnlineShoplog(false);
545
                } else {
546
                        setIndicadorOnlineShoplog(true);
547
                }
548
                return indicadorOnlineShoplog;
549
        }
550
        public void setIndicadorOnlineShoplog(Boolean indicadorOnlineShoplog) {
551
                this.indicadorOnlineShoplog = indicadorOnlineShoplog;
552
        }
553
        public void atualizarDataOnlineShoplog() {
554
                if (VerificadorUtil.estaNulo(this.getDataOnlineShoplog())) {
555
                        this.setDataOnlineShoplog(DataUtils.getDataAtual());
556
                } else {
557
                        this.setDataOnlineShoplog(null);
558
                }
559
        }
560
 
561
        @Transient
270 espaco 562
        public Boolean getIndicadorOnlineMercadoLivre() {
563
                if (VerificadorUtil.estaNulo(this.getDataOnlineMercadoLivre()) && VerificadorUtil.estaNulo(this.indicadorOnlineMercadoLivre)) {
564
                        setIndicadorOnlineMercadoLivre(false);
565
                } else {
566
                        setIndicadorOnlineMercadoLivre(true);
567
                }
568
                return indicadorOnlineMercadoLivre;
569
        }
570
        public void setIndicadorOnlineMercadoLivre(Boolean indicadorOnlineMercadoLivre) {
571
                this.indicadorOnlineMercadoLivre = indicadorOnlineMercadoLivre;
572
        }
573
        public void atualizarDataOnlineMercadoLivre() {
574
                if (VerificadorUtil.estaNulo(this.getDataOnlineMercadoLivre())) {
575
                        this.setDataOnlineMercadoLivre(DataUtils.getDataAtual());
576
                } else {
577
                        this.setDataOnlineMercadoLivre(null);
578
                }
579
        }
580
 
581
        @Transient
106 espaco 582
        public List<TransferenciaProduto> getTransferenciasAbertas() {
583
                return transferenciasAbertas;
584
        }
585
        public void setTransferenciasAbertas(List<TransferenciaProduto> transferenciasAbertas) {
586
                this.transferenciasAbertas = transferenciasAbertas;
587
        }
588
 
589
        @Transient
590
        public List<PedidoProduto> getPedidosPendentes() {
591
                return pedidosPendentes;
592
        }
593
        public void setPedidosPendentes(List<PedidoProduto> pedidosPendentes) {
594
                this.pedidosPendentes = pedidosPendentes;
595
        }
596
 
597
        @Transient
598
        public Date getDataUltimaVenda() {
599
                return dataUltimaVenda;
600
        }
601
        public void setDataUltimaVenda(Date dataUltimaVenda) {
602
                this.dataUltimaVenda = dataUltimaVenda;
603
        }
604
 
605
        @Transient
606
        public Integer getQuantidadeDiasUltimaVenda() {
607
                if (VerificadorUtil.naoEstaNulo(getDataUltimaVenda())) {
608
                        return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataAtual(), getDataUltimaVenda());
609
                }
610
                return null;
611
        }
612
 
613
        @Transient
614
        public ArrayList<ProdutoRelacionado> getCompativeis() {
615
                ArrayList<ProdutoRelacionado> compativeis = new ArrayList<ProdutoRelacionado>();
616
                if (VerificadorUtil.naoEstaNulo(getRelacionados())) {
617
                        compativeis.addAll(getRelacionados());
618
                }
619
                if (VerificadorUtil.naoEstaNulo(getRelacionadosReverse())) {
620
                        compativeis.addAll(getRelacionadosReverse());
621
                }
622
                return compativeis;
623
        }
624
 
625
        @Transient
626
        public String getCodigoNCM() {
627
                return codigoNCM;
628
        }
629
        public void setCodigoNCM(String codigoNCM) {
630
                this.codigoNCM = codigoNCM;
631
        }
632
 
633
        @Transient
634
        public String getCodigoEST() {
635
                return codigoEST;
636
        }
637
        public void setCodigoEST(String codigoEST) {
638
                this.codigoEST = codigoEST;
639
        }
640
 
641
        /*
642
        @OneToMany(mappedBy="produto", cascade=CascadeType.ALL, orphanRemoval=true)
643
        public Set<ProdutoArquivo> getFotos() {
644
                return fotos;
645
        }
646
        public void setFotos(Set<ProdutoArquivo> fotos) {
647
                this.fotos = fotos;
648
        }
649
        */
650
        /***************************************************************/
651
 
652
        @Transient
653
        public String getCodigoProdutoPadrao() {
654
                try {
655
                        return VerificadorUtil.naoEstaNulo(codigo) ? String.format("%06d", new Long(codigo.trim())) : "";
656
                } catch (Exception e) {
657
                        return "";
658
                }
659
        }
660
 
661
        public static void main(String[] args) {
662
//              System.out.println(String.format("%07d", new Long(12879)));
663
//              codigoBarras.gerarCodigoBarra(String.format("%012d", new Long(12879)));
664
//              System.out.println(codigoBarras.getCodigoBarra());
665
                System.out.println(CodigoBarraEAN.gerarCodigoBarras("6659"));
666
//              System.out.println(codigoBarras.longToEan13("900000012879"));
667
        }
668
 
669
        @Transient
670
        public String getCodigoDeBarrasProdutoPadrao() {
671
                try {
672
                        return VerificadorUtil.naoEstaNulo(codigo)? String.format("%07d", new Long(codigo)) : "";
673
//                      return VerificadorUtil.naoEstaNulo(codigo) ? StringUtils.rightPad(codigo, 12, "0") : "";
674
                } catch (Exception e) {
675
                        return "";
676
                }
677
        }
678
 
679
        @Transient
680
        public String getDescricaoDoModelo() {
681
                return VerificadorUtil.naoEstaNulo(modelo)? modelo.getDescricao() : "";
682
        }
683
 
684
        @Transient
685
        public String getDescricaoTecnicaDoModelo() {
686
                return VerificadorUtil.naoEstaNulo(modelo)? VerificadorUtil.naoEstaNulo(modelo.getDescricaoTecnica())? modelo.getDescricaoTecnica() : "" : "";
687
        }
688
 
689
        @Transient
690
        public String getDescricaoTecnicaDoModeloComParenteses() {
691
                return VerificadorUtil.naoEstaNulo(modelo)? VerificadorUtil.naoEstaNulo(modelo.getDescricaoTecnica())? " (" + modelo.getDescricaoTecnica() + ") " : "" : "";
692
        }
693
 
694
        @Transient
695
        public Long getSequencialDoModelo() {
696
                return VerificadorUtil.naoEstaNulo(modelo)? modelo.getSequencial() : null;
697
        }
698
 
699
        @Transient
700
        public Marca getMarcaDoModelo() {
701
                if (VerificadorUtil.naoEstaNulo(modelo)) {
702
                        if (VerificadorUtil.naoEstaNulo(modelo.getMarca())) {
703
                                return modelo.getMarca();
704
                        }
705
                }
706
                return null;
707
        }
708
 
709
        @Transient
710
        public String getDescricaoDaMarcaDoModelo() {
711
                return VerificadorUtil.naoEstaNulo(getMarcaDoModelo())? getMarcaDoModelo().getDescricao() : "";
712
        }
713
 
714
        @Transient
715
        public String getDescricaoComModeloCompletaComCodigo() {
716
                StringBuilder descricaoCompleta = new StringBuilder();
717
                descricaoCompleta.append("[");
718
                descricaoCompleta.append(getCodigoProdutoPadrao());
719
                descricaoCompleta.append("] ");
720
                if (VerificadorUtil.naoEstaNuloOuVazio(getDescricaoDoModelo())) {
721
                        descricaoCompleta.append(getDescricaoDoModelo());
722
                        descricaoCompleta.append(" - ");
723
                }
724
                descricaoCompleta.append(getDescricaoCompleta());
725
                return descricaoCompleta.toString();
726
        }
727
 
728
        @Transient
729
        public String getDescricaoComModeloCompleta() {
730
                StringBuilder descricaoCompleta = new StringBuilder();
731
                if (VerificadorUtil.naoEstaNuloOuVazio(getDescricaoDoModelo())) {
732
                        descricaoCompleta.append(getDescricaoDoModelo());
733
                        descricaoCompleta.append(" - ");
734
                }
735
                descricaoCompleta.append(getDescricaoCompleta());
736
                return descricaoCompleta.toString();
737
        }
738
 
739
        @Transient
740
        public String getDescricaoCompleta() {
741
                StringBuilder descricaoCompleta = new StringBuilder();
742
                if (VerificadorUtil.naoEstaNuloOuVazio(getEstilo())) {
743
                        descricaoCompleta.append(getDescricaoDoEstilo());
744
                        descricaoCompleta.append(" ");
745
                }
746
                descricaoCompleta.append(getDescricao());
747
                if (VerificadorUtil.naoEstaNuloOuVazio(getCor())) {
748
                        descricaoCompleta.append(" (");
749
                        descricaoCompleta.append(getDescricaoDaCor());
750
                        descricaoCompleta.append(")");
751
                }
752
                return descricaoCompleta.toString();
753
        }
754
 
755
        @Transient
756
        public String getDescricaoCompletaCapa() {
757
                StringBuilder descricaoCompleta = new StringBuilder();
758
                descricaoCompleta.append(getCodigo());
759
                descricaoCompleta.append(" - ");
760
                if (this.getTipo().equals(TipoProduto.CAPA.getValor())) {
761
                        descricaoCompleta.append("CAPA");
762
                }
763
                if (!this.getTipo().equals(TipoProduto.ACESSORIO.getValor())) {
764
                        descricaoCompleta.append(" ");
765
                        descricaoCompleta.append(getDescricaoDoModelo());
766
                }
767
                if (VerificadorUtil.naoEstaNuloOuVazio(this.getEstilo())) {
768
                        descricaoCompleta.append(" ");
769
                        descricaoCompleta.append(getDescricaoDoEstilo());
770
                }
771
                descricaoCompleta.append(" ");
772
                if (this.getDescricao().length() > 50) {
773
                        descricaoCompleta.append(getDescricao().substring(0, 50));
774
                } else {
775
                        descricaoCompleta.append(getDescricao());
776
                }
777
                if (VerificadorUtil.naoEstaNuloOuVazio(getCor())) {
778
                        descricaoCompleta.append(" (");
779
                        descricaoCompleta.append(getDescricaoDaCor());
780
                        descricaoCompleta.append(")");
781
                }
782
                return descricaoCompleta.toString();
783
        }
784
 
785
        @Transient
786
        public String getDescricaoDoTipo() {
787
                return VerificadorUtil.naoEstaNuloOuVazio(getTipo())? TipoProduto.parse(getTipo()).getDescricao() : null;
788
        }
789
 
790
        @Transient
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();
1164
                this.estilo = produto.getEstilo();
1165
                this.genero = produto.getGenero();
1166
                this.cor = produto.getCor();
1167
                this.observacao = produto.getObservacao();
1168
                this.valorCompra = produto.getValorCompra();
1169
                this.valorVarejo = produto.getValorVarejo();
1170
                this.valorVarejoPromocional = produto.getValorVarejoPromocional();
1171
                this.valorVarejoMaximo = produto.getValorVarejoMaximo();
1172
                this.valorVarejoPopular = produto.getValorVarejoPopular();
1173
                this.valorAtacado = produto.getValorAtacado();
1174
                this.indicadorComissionado = produto.getIndicadorComissionado();
1175
                this.indicadorEmissaoNotaFiscal = produto.getIndicadorEmissaoNotaFiscal();
1176
                this.codigoNCM = produto.getCodigoNCM();
1177
                this.codigoEST = produto.getCodigoEST();
145 espaco 1178
                this.setSujeitoST(produto.getSujeitoST());
1179
                this.setAliquotaIcms(produto.getAliquotaIcms());
1180
                this.setAliquotaIcmsST(produto.getAliquotaIcmsST());
1181
                this.setAliquotaFecoep(produto.getAliquotaFecoep());
1182
                this.setAliquotaIPI(produto.getAliquotaIPI());
106 espaco 1183
                this.setAtivo(true);
1184
        }
1185
 
144 espaco 1186
        @Transient
1187
        public void atualizarAliquotas(Fornecedor fornecedor) {
152 espaco 1188
                if (VerificadorUtil.naoEstaNulo(getTributacao())) {
1189
                        setAliquotaIPI(getTributacao().getAliquotaIPI());
1190
                }
1191
 
144 espaco 1192
                if (VerificadorUtil.naoEstaNulo(getTributacao())
1193
                                && VerificadorUtil.naoEstaNulo(getAliquotaIcms())
1194
                                && VerificadorUtil.naoEstaNulo(fornecedor)) {
1195
                        if (getTributacao().getSujeitoST() && fornecedor.getSujeitoST()) {
1196
                                setAliquotaIcmsST(getTributacao().mvaPorIcms(getAliquotaIcms()));
1197
                                setAliquotaFecoep(getTributacao().getAliquotaFecoep());
1198
                                setSujeitoST(true);
1199
                        } else {
1200
                                setAliquotaFecoep(null);
1201
                                setAliquotaIcmsST(null);
1202
                                setSujeitoST(false);
1203
                        }
1204
                } else if (VerificadorUtil.naoEstaNulo(getTributacao()) && VerificadorUtil.naoEstaNulo(getAliquotaIcms())) {
1205
                        if (getTributacao().getSujeitoST()) {
1206
                                setAliquotaIcmsST(getTributacao().mvaPorIcms(getAliquotaIcms()));
1207
                                setAliquotaFecoep(getTributacao().getAliquotaFecoep());
1208
                                setSujeitoST(true);
1209
                        } else {
1210
                                setAliquotaFecoep(null);
1211
                                setAliquotaIcmsST(null);
1212
                                setSujeitoST(false);
1213
                        }
1214
                }
1215
        }
1216
 
1217
        @Transient
1218
        public Double calculoIPI() {
318 espaco 1219
                return (VerificadorUtil.naoEstaNulo(getAliquotaIPI()) &&
1220
                                VerificadorUtil.naoEstaNulo(getValorCompra()))?
1221
                                        getAliquotaIPI()/100 * getValorCompra() : 0.0;
144 espaco 1222
        }
1223
 
1224
        @Transient
1225
        public Double calculoICMS() {
318 espaco 1226
                return (VerificadorUtil.naoEstaNulo(getAliquotaIcms()) &&
1227
                                VerificadorUtil.naoEstaNulo(getAliquotaFecoep()) &&
1228
                                VerificadorUtil.naoEstaNulo(getValorCompra()))?
144 espaco 1229
                                (getAliquotaIcms()/100 + getAliquotaFecoep()/100) * getValorCompra() : 0.0;
1230
        }
1231
 
1232
        @Transient
1233
        public Double calculoICMSST() {
1234
                if (getSujeitoST()) {
1235
                        return VerificadorUtil.naoEstaNulo(getAliquotaIcmsST())
1236
                                        && VerificadorUtil.naoEstaNulo(getAliquotaFecoep())
1237
                                        && VerificadorUtil.naoEstaNulo(getTributacao())?
1238
                                ((getTributacao().getAliquotaInterna()/100 + getAliquotaFecoep()/100) * baseCalculoICMSST()) - calculoICMS(): 0.0;
1239
                }
1240
                return 0.0;
1241
        }
1242
 
1243
        @Transient
1244
        public Double baseCalculoICMSST() {
1245
                if (getSujeitoST()) {
1246
                        if (VerificadorUtil.naoEstaNulo(getTributacao())) {
1247
                                Double baseCalculoIPI = getValorCompra() + calculoIPI();
1248
                                return baseCalculoIPI + (baseCalculoIPI * getTributacao().mvaPorIcms(getAliquotaIcms())/100);
1249
                        }
1250
                }
1251
                return 0.0;
1252
        }
1253
 
1254
        @Transient
1255
        public Double aliquotaMvaProduto() {
1256
                return VerificadorUtil.naoEstaNulo(getTributacao())? getTributacao().mvaPorIcms(getAliquotaIcms()) : 0.0;
1257
        }
1258
 
1259
        @Transient
1260
        public Double calculoTributosCompra() {
145 espaco 1261
                 return VerificadorUtil.naoEstaNulo(getValorCompra())? getValorCompra() + calculoIPI() + calculoICMSST() : 0.0;
144 espaco 1262
        }
1263
 
1264
        @Transient
1265
        public Double calculoOperacao() {
1266
                Double aliquota = ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MEDIA_SIMPLES_NACIONAL_11 +
162 espaco 1267
                                                  ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MEDIA_COMISSOES_2 +
1268
                                                  ConstantesSEC.NotaFiscal.Imposto.ALIQUOTA_MEDIA_CARTAO_2;
144 espaco 1269
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? calculoTributosCompra() + (getValorVarejoSimulacao()*aliquota/100) : 0.0;
1270
        }
1271
 
1272
        @Transient
152 espaco 1273
        public String valorCalculoOperacao() {
1274
                return StringUtil.formatarValor(calculoOperacao());
1275
        }
1276
 
1277
        @Transient
144 espaco 1278
        public Double calculoValorAposCustos() {
1279
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? getValorVarejoSimulacao() - calculoOperacao() : 0.0;
1280
        }
1281
 
1282
        @Transient
1283
        public Double calculoMargemAposCustos() {
1284
                return VerificadorUtil.naoEstaNulo(getValorVarejoSimulacao())? calculoValorAposCustos() * 100 / calculoOperacao() : 0.0;
1285
        }
1286
 
145 espaco 1287
        @Transient
1288
        public String retornarLucroBrutoFormatado() {
1289
                return StringUtil.formatarPercentual(calculoValorAposCustos());
1290
        }
1291
 
1292
        @Transient
1293
        public String retornarMargemBrutaFormatada() {
1294
                try {
1295
                        return StringUtil.formatarValorComDigitos(calculoMargemAposCustos().toString(), 2);
1296
                } catch (Exception e) {
1297
                        e.printStackTrace();
1298
                }
1299
                return "";
1300
        }
1301
 
152 espaco 1302
        @Transient
1303
        public Double calculoPrecoMinimo() {
1304
                Double valorVarejoSimulacao = getValorVarejoSimulacao();
1305
                setValorVarejoSimulacao(this.getValorCompra());
1306
                Double valorMinimo = this.calculoOperacao();
1307
                Double margem = 0.0;
1308
                valorMinimo = valorMinimo + (valorMinimo / 100);
1309
                if (valorMinimo > 0.0) {
1310
                        while (margem < 15.0) {
1311
                                valorMinimo = valorMinimo + (valorMinimo / 100);
1312
                                setValorVarejoSimulacao(valorMinimo);
1313
                                margem = calculoMargemAposCustos();
1314
                        }
1315
                }
1316
                setValorVarejoSimulacao(valorVarejoSimulacao);
1317
                return valorMinimo;
1318
        }
1319
 
106 espaco 1320
}