Subversion Repositories Integrator Subversion

Rev

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

Rev Author Line No. Line
259 espaco 1
package br.com.ec.domain.model;
2
 
3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.IOException;
6
import java.io.Serializable;
7
import java.io.StringReader;
8
import java.util.Date;
9
import java.util.List;
10
 
11
import javax.persistence.Column;
12
import javax.persistence.Entity;
13
import javax.persistence.GeneratedValue;
14
import javax.persistence.GenerationType;
15
import javax.persistence.Id;
16
import javax.persistence.JoinColumn;
17
import javax.persistence.ManyToOne;
474 blopes 18
import javax.persistence.OneToOne;
259 espaco 19
import javax.persistence.SequenceGenerator;
20
import javax.persistence.Table;
21
import javax.persistence.Transient;
22
import javax.validation.constraints.NotNull;
23
import javax.validation.constraints.Size;
24
import javax.xml.bind.JAXBContext;
25
import javax.xml.bind.JAXBException;
26
import javax.xml.bind.Unmarshaller;
27
import javax.xml.parsers.DocumentBuilder;
28
import javax.xml.parsers.DocumentBuilderFactory;
29
import javax.xml.transform.Transformer;
30
import javax.xml.transform.TransformerFactory;
31
import javax.xml.transform.dom.DOMSource;
32
import javax.xml.transform.stream.StreamResult;
33
import javax.xml.transform.stream.StreamSource;
34
 
35
import org.apache.commons.io.IOUtils;
36
import org.hibernate.annotations.ForeignKey;
37
import org.primefaces.model.DefaultStreamedContent;
38
import org.w3c.dom.Document;
39
 
40
import br.com.ec.core.exception.NegocioException;
41
import br.com.ec.core.generic.identidade.Identidade;
42
import br.com.ec.core.interfaces.Alterar;
43
import br.com.ec.core.interfaces.Cadastrar;
44
import br.com.ec.core.util.StringUtil;
45
import br.com.ec.core.util.VerificadorUtil;
449 blopes 46
import br.com.ec.domain.dto.NotaFiscalProdutoDTO;
259 espaco 47
import br.com.ec.domain.model.nfe.TipoModeloNotaFiscal;
48
import br.com.ec.domain.model.nfe.TipoNotaFiscal;
489 blopes 49
import br.com.ec.domain.model.nfe.TipoNotaFiscalDestino;
50
import br.com.ec.domain.model.nfe.TipoNotaFiscalIntermediario;
259 espaco 51
import br.com.ec.domain.model.nfe.TipoNotaFiscalNaturezaOperacao;
52
import br.com.ec.domain.model.nfe.TipoNotaFiscalPresencaComprador;
53
import br.com.ec.domain.model.nfe.TipoNotaFiscalStatusRetorno;
54
import br.com.ec.relatorio.util.RelatorioUtils;
55
import br.com.ec.web.util.DataUtil;
489 blopes 56
import nfce.java.TNfeProc;
259 espaco 57
 
58
@Entity
59
@Table(name="sec_nota_fiscal", schema="sc_sec")
60
public class NotaFiscal implements Serializable, Identidade {
61
 
62
        private static final long serialVersionUID = 1L;
63
 
64
        private Long sequencial;
65
        private String tipoModeloNotaFiscal;
66
        private String serie;
67
        private Long numeroNotaFiscal;
68
        private Date dataHoraEmissao;
69
 
70
        private String chave;
71
 
72
        private String tipoNotaFiscalNaturezaOperacao; // NOVO
73
        private String tipoNotaFiscalPresencaComprador; //NOVO
489 blopes 74
        private String tipoNotaFiscalIntermediario; //NOVO
75
        private String tipoNotaFiscalDestino; //NOVO
259 espaco 76
        private Boolean indicadorOperacaoConsumidorFinal;
77
 
78
        private Venda venda;
79
        private Pessoa pessoaEmitente;
80
        private Pessoa pessoaDestinatario;
81
        private String observacaoVenda;
474 blopes 82
 
259 espaco 83
        private String descricaoComplementares;
84
 
85
        private String textoXml;
86
        private String tipoNotaFiscal;
87
 
88
        private String protocoloAutorizacao;
89
        private String caminhoQrcode;
90
 
91
        private String statusRetorno;
92
        private String motivoRetorno;
93
        private Date dataHoraEvento;
94
        private String textoXmlEvento;
95
 
474 blopes 96
        private Double valorFrete;
97
        private Double valorSeguro;
98
        private Double valorDesconto;
99
        private Double outrasDespesas;
100
 
101
        private Transporte transporte;
102
 
259 espaco 103
        private byte[] arquivoXml;
104
 
105
//      private List<Parcela> listaParcelas;
106
//      private List<CompraProduto> listaCompraProduto;
107
        private List<Lancamento> listaLancamento;
108
        private List<VendaFormaPagamento> listaFormaPagamento;
109
 
449 blopes 110
        private List<NotaFiscalProdutoDTO> listaProdutosVinculadosDTO;
111
 
259 espaco 112
        private Boolean notaFiscalPendente;
113
 
414 espaco 114
        public NotaFiscal() {}
115
 
116
        public NotaFiscal(Long sequencial) {
117
                this.sequencial = sequencial;
118
        }
119
 
259 espaco 120
        @Override
121
        @Transient
122
        public Object getId() {
123
                return this.getSequencial();
124
        }
125
        @Override
126
        public void setId(Object id) {
127
                this.sequencial = (Long) id;
128
        }
129
 
130
        @Id
131
        @SequenceGenerator(name = "sq_notafiscal")
132
        @GeneratedValue(strategy = GenerationType.IDENTITY)
133
        @Column(name="seq_nota_fiscal", nullable=false)
134
        public Long getSequencial() {
135
                return sequencial;
136
        }
137
        public void setSequencial(Long sequencial) {
138
                this.sequencial = sequencial;
139
        }
140
 
141
        @Column(name="dsc_serie")
142
        public String getSerie() {
143
                return serie;
144
        }
145
        public void setSerie(String serie) {
146
                this.serie = serie;
147
        }
148
 
149
        @Column(name="num_nota_fiscal", nullable=false)
150
        public Long getNumeroNotaFiscal() {
151
                return numeroNotaFiscal;
152
        }
153
        public void setNumeroNotaFiscal(Long numeroNotaFiscal) {
154
                this.numeroNotaFiscal = numeroNotaFiscal;
155
        }
156
 
157
        @Column(name="cod_nota_fiscal")
158
        public String getChave() {
159
                return chave;
160
        }
161
        public void setChave(String chave) {
162
                this.chave = chave;
163
        }
164
 
489 blopes 165
        //TODO: ACRESCENTAR NO BANCO DE DADOS (TIPOS)
259 espaco 166
        @Transient
167
        public String getTipoNotaFiscalNaturezaOperacao() {
168
                return tipoNotaFiscalNaturezaOperacao;
169
        }
170
        public void setTipoNotaFiscalNaturezaOperacao(String tipoNotaFiscalNaturezaOperacao) {
171
                this.tipoNotaFiscalNaturezaOperacao = tipoNotaFiscalNaturezaOperacao;
172
        }
173
        @Transient
174
        public String descricaoTipoNotaFiscalNaturezaOperacao() {
175
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoNotaFiscalNaturezaOperacao())? TipoNotaFiscalNaturezaOperacao.parse(getTipoNotaFiscalNaturezaOperacao()).getDescricao() : null;
176
        }
177
 
178
        @Transient
179
        public String getTipoNotaFiscalPresencaComprador() {
180
                return tipoNotaFiscalPresencaComprador;
181
        }
182
        public void setTipoNotaFiscalPresencaComprador(String tipoNotaFiscalPresencaComprador) {
183
                this.tipoNotaFiscalPresencaComprador = tipoNotaFiscalPresencaComprador;
184
        }
185
        @Transient
186
        public String descricaoTipoNotaFiscalPresencaComprador() {
187
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoNotaFiscalPresencaComprador())? TipoNotaFiscalPresencaComprador.parse(getTipoNotaFiscalPresencaComprador()).getDescricao() : null;
188
        }
189
 
489 blopes 190
        public String getTipoNotaFiscalIntermediario() {
191
                return tipoNotaFiscalIntermediario;
192
        }
193
        public void setTipoNotaFiscalIntermediario(String tipoNotaFiscalIntermediario) {
194
                this.tipoNotaFiscalIntermediario = tipoNotaFiscalIntermediario;
195
        }
196
        @Transient
197
        public String descricaoTipoNotaFiscalIntermediario() {
198
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoNotaFiscalIntermediario())? TipoNotaFiscalIntermediario.parse(getTipoNotaFiscalIntermediario()).getDescricao() : null;
199
        }
200
 
201
        public String getTipoNotaFiscalDestino() {
202
                return tipoNotaFiscalDestino;
203
        }
204
        public void setTipoNotaFiscalDestino(String tipoNotaFiscalDestino) {
205
                this.tipoNotaFiscalDestino = tipoNotaFiscalDestino;
206
        }
207
        @Transient
208
        public String descricaoTipoNotaFiscalDestino() {
209
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoNotaFiscalDestino())? TipoNotaFiscalDestino.parse(getTipoNotaFiscalDestino()).getDescricao() : null;
210
        }
211
 
259 espaco 212
        @ManyToOne
213
        @ForeignKey(name = "fk_notafiscal_venda")
214
        @JoinColumn(name="seq_venda", referencedColumnName="seq_venda", insertable=true, updatable=false)
215
        public Venda getVenda() {
216
                return venda;
217
        }
218
        public void setVenda(Venda venda) {
219
                this.venda = venda;
220
        }
221
 
222
        @ManyToOne
223
        @ForeignKey(name = "fk_notafiscal_emitente")
224
        @JoinColumn(name="seq_pessoa_emitente", referencedColumnName="seq_pessoa", insertable=true, updatable=true)
225
        public Pessoa getPessoaEmitente() {
226
                return pessoaEmitente;
227
        }
228
        public void setPessoaEmitente(Pessoa pessoaEmitente) {
229
                this.pessoaEmitente = pessoaEmitente;
230
        }
231
 
232
        @ManyToOne
233
        @ForeignKey(name = "fk_notafiscal_destinatario")
234
        @JoinColumn(name="seq_pessoa_destinatario", referencedColumnName="seq_pessoa", insertable=true, updatable=true)
235
        public Pessoa getPessoaDestinatario() {
236
                return pessoaDestinatario;
237
        }
238
        public void setPessoaDestinatario(Pessoa pessoaDestinatario) {
239
                this.pessoaDestinatario = pessoaDestinatario;
240
        }
241
 
242
        @Column(name="dsc_obs_venda")
243
        @Size(max = 100, message = "Limite de caracteres ultrapassado: Observação da Venda")
244
        public String getObservacaoVenda() {
245
                return observacaoVenda;
246
        }
247
        public void setObservacaoVenda(String observacaoVenda) {
248
                this.observacaoVenda = observacaoVenda;
249
        }
250
 
251
        @Column(name="dsc_complementares")
252
        @Size(max = 1500, message = "Limite de caracteres ultrapassado: Descrição Complementares")
253
        public String getDescricaoComplementares() {
254
                return descricaoComplementares;
255
        }
256
        public void setDescricaoComplementares(String descricaoComplementares) {
257
                this.descricaoComplementares = descricaoComplementares;
258
        }
259
 
465 blopes 260
        @Column(name="dth_emissao")
259 espaco 261
        public Date getDataHoraEmissao() {
262
                return dataHoraEmissao;
263
        }
264
        public void setDataHoraEmissao(Date dataHoraEmissao) {
265
                this.dataHoraEmissao = dataHoraEmissao;
266
        }
267
 
268
        @Column(name="txt_xml")
269
        public String getTextoXml() {
270
                return textoXml;
271
        }
272
        public void setTextoXml(String textoXml) {
273
                this.textoXml = textoXml;
274
        }
275
 
276
        @Column(name="tip_nota_fiscal", nullable=false)
277
        @NotNull(message="Obrigatório informar o tipo da nota fiscal", groups={Cadastrar.class, Alterar.class})
278
        public String getTipoNotaFiscal() {
279
                return tipoNotaFiscal;
280
        }
281
        public void setTipoNotaFiscal(String tipoNotaFiscal) {
282
                this.tipoNotaFiscal = tipoNotaFiscal;
283
        }
284
        @Transient
285
        public String getDescricaoDoTipoNotaFiscal() {
286
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoNotaFiscal())? TipoNotaFiscal.parse(getTipoNotaFiscal()).getDescricao() : null;
287
        }
288
 
289
        @Column(name="tip_modelo_notafiscal", nullable=false)
290
        @NotNull(message="Obrigatório informar o tipo do modelo da nota fiscal", groups={Cadastrar.class, Alterar.class})
291
        public String getTipoModeloNotaFiscal() {
292
                return tipoModeloNotaFiscal;
293
        }
294
        public void setTipoModeloNotaFiscal(String tipoModeloNotaFiscal) {
295
                this.tipoModeloNotaFiscal = tipoModeloNotaFiscal;
296
        }
297
        @Transient
298
        public String getDescricaoDoTipoModeloNotaFiscal() {
299
                return VerificadorUtil.naoEstaNuloOuVazio(getTipoModeloNotaFiscal())? TipoModeloNotaFiscal.parse(getTipoModeloNotaFiscal()).getDescricao() : null;
300
        }
301
 
302
        @Column(name="dsc_protocolo_autorizacao")
303
        @Size(max = 100, message = "Limite de caracteres ultrapassado: Protocolo da Autorização")
304
        public String getProtocoloAutorizacao() {
305
                return protocoloAutorizacao;
306
        }
307
        public void setProtocoloAutorizacao(String protocoloAutorizacao) {
308
                this.protocoloAutorizacao = protocoloAutorizacao;
309
        }
310
 
311
        @Column(name="dsc_caminho_qrcode")
312
        @Size(max = 500, message = "Limite de caracteres ultrapassado: Caminho QRCode")
313
        public String getCaminhoQrcode() {
314
                return caminhoQrcode;
315
        }
316
        public void setCaminhoQrcode(String caminhoQrcode) {
317
                this.caminhoQrcode = caminhoQrcode;
318
        }
319
 
320
        @Column(name="dsc_status_retorno")
321
        @Size(max = 100, message = "Limite de caracteres ultrapassado: Status do Retorno")
322
        public String getStatusRetorno() {
323
                return statusRetorno;
324
        }
325
        public void setStatusRetorno(String statusRetorno) {
326
                this.statusRetorno = statusRetorno;
327
        }
328
        @Transient
329
        public String resultadoStatusRetorno() {
330
                TipoNotaFiscalStatusRetorno tipoStatus = TipoNotaFiscalStatusRetorno.parse(new Long(getStatusRetorno()));
331
                return VerificadorUtil.naoEstaNulo(tipoStatus)? tipoStatus.getDescricao() : getStatusRetorno();
332
        }
333
 
334
        @Column(name="dsc_motivo_retorno")
335
        @Size(max = 100, message = "Limite de caracteres ultrapassado: Motivo do Retorno")
336
        public String getMotivoRetorno() {
337
                return motivoRetorno;
338
        }
339
        public void setMotivoRetorno(String motivoRetorno) {
340
                this.motivoRetorno = motivoRetorno;
341
        }
342
 
343
        @Column(name="dth_evento")
344
        public Date getDataHoraEvento() {
345
                return dataHoraEvento;
346
        }
347
        public void setDataHoraEvento(Date dataHoraEvento) {
348
                this.dataHoraEvento = dataHoraEvento;
349
        }
350
 
351
        @Column(name="txt_xml_evento", nullable=false)
352
        public String getTextoXmlEvento() {
353
                return textoXmlEvento;
354
        }
355
        public void setTextoXmlEvento(String textoXmlEvento) {
356
                this.textoXmlEvento = textoXmlEvento;
357
        }
358
 
480 blopes 359
        @Column(name="val_frete")
360
        public Double getValorFrete() {
361
                return valorFrete;
362
        }
363
        public void setValorFrete(Double valorFrete) {
364
                this.valorFrete = valorFrete;
365
        }
366
 
367
        @Column(name="val_seguro")
368
        public Double getValorSeguro() {
369
                return valorSeguro;
370
        }
371
        public void setValorSeguro(Double valorSeguro) {
372
                this.valorSeguro = valorSeguro;
373
        }
374
 
375
        @Column(name="val_desconto")
376
        public Double getValorDesconto() {
377
                return valorDesconto;
378
        }
379
        public void setValorDesconto(Double valorDesconto) {
380
                this.valorDesconto = valorDesconto;
381
        }
382
 
383
        @Column(name="val_outrasdespesas")
384
        public Double getOutrasDespesas() {
385
                return outrasDespesas;
386
        }
387
        public void setOutrasDespesas(Double outrasDespesas) {
388
                this.outrasDespesas = outrasDespesas;
389
        }
390
 
474 blopes 391
        @OneToOne
392
        @JoinColumn(name="seq_transporte", referencedColumnName="seq_transporte", insertable=true, updatable=true,  nullable=true)
393
        public Transporte getTransporte() {
394
                return transporte;
395
        }
396
        public void setTransporte(Transporte transporte) {
397
                this.transporte = transporte;
398
        }
399
 
400
        /********************************************/
401
 
259 espaco 402
        @Transient
403
        public Boolean temPessoaJuridica() {
404
                if (VerificadorUtil.estaNulo(getVenda())) return false;
405
                if (VerificadorUtil.estaNulo(getVenda().getLoja())) return false;
406
                return VerificadorUtil.naoEstaNulo(getVenda().getLoja().getPessoaJuridica());
407
        }
408
 
409
        @Transient
410
        public String getRazaoSocialDaLoja() {
411
                return temPessoaJuridica()? getVenda().getLoja().getPessoaJuridica().getRazaoSocial() : "";
412
        }
413
 
414
        @Transient
415
        public String getCnpjDaLoja() {
416
                return temPessoaJuridica()? StringUtil.formatarCnpj(getVenda().getLoja().getPessoaJuridica().getCpfCnpj()) : "";
417
        }
418
 
419
        @Transient
420
        public byte[] getArquivoXml() {
421
                return arquivoXml;
422
        }
423
        public void setArquivoXml(byte[] arquivoXml) {
424
                this.arquivoXml = arquivoXml;
425
        }
426
 
427
        /*
428
        @Transient
429
        public List<Parcela> getListaParcelas() {
430
                return listaParcelas;
431
        }
432
        public void setListaParcelas(List<Parcela> listaParcelas) {
433
                this.listaParcelas = listaParcelas;
434
        }
435
        */
436
 
437
        /*
438
        @Transient
439
        public List<CompraProduto> getListaCompraProduto() {
440
                return listaCompraProduto;
441
        }
442
        public void setListaCompraProduto(List<CompraProduto> listaCompraProduto) {
443
                this.listaCompraProduto = listaCompraProduto;
444
        }
445
        */
446
 
447
        @Transient
448
        public List<Lancamento> getListaLancamento() {
449
                return listaLancamento;
450
        }
451
        public void setListaLancamento(List<Lancamento> listaLancamento) {
452
                this.listaLancamento = listaLancamento;
453
        }
454
 
455
        @Transient
456
        public List<VendaFormaPagamento> getListaFormaPagamento() {
457
                return listaFormaPagamento;
458
        }
459
        public void setListaFormaPagamento(List<VendaFormaPagamento> listaFormaPagamento) {
460
                this.listaFormaPagamento = listaFormaPagamento;
461
        }
462
 
449 blopes 463
 
464
//      @OneToMany(mappedBy="notaFiscal", cascade=CascadeType.ALL, orphanRemoval=true)
259 espaco 465
        @Transient
449 blopes 466
        public List<NotaFiscalProdutoDTO> getListaProdutosVinculadosDTO() {
467
                return listaProdutosVinculadosDTO;
468
        }
469
        public void setListaProdutosVinculadosDTO(List<NotaFiscalProdutoDTO> listaProdutosVinculadosDTO) {
470
                this.listaProdutosVinculadosDTO = listaProdutosVinculadosDTO;
471
        }
472
 
473
        @Transient
259 espaco 474
        public Boolean getNotaFiscalPendente() {
475
                return notaFiscalPendente;
476
        }
477
        public void setNotaFiscalPendente(Boolean notaFiscalPendente) {
478
                this.notaFiscalPendente = notaFiscalPendente;
479
        }
480
 
481
        @Override
482
        public int hashCode() {
483
                final int prime = 31;
484
                int result = 1;
485
                result = prime * result + ((chave == null) ? 0 : chave.hashCode());
486
                return result;
487
        }
488
 
489
        @Override
490
        public boolean equals(Object obj) {
491
                if (this == obj)
492
                        return true;
493
                if (obj == null)
494
                        return false;
495
                if (getClass() != obj.getClass())
496
                        return false;
497
                NotaFiscal other = (NotaFiscal) obj;
498
                if (chave == null) {
499
                        if (other.chave != null)
500
                                return false;
501
                } else if (!chave.equals(other.chave))
502
                        return false;
503
                return true;
504
        }
505
 
506
        @Transient
507
        public Double getTotalLancamentos() {
508
                Double total = 0.0;
509
                if (!VerificadorUtil.isListaNulaOuVazia(getListaLancamento())) {
510
                        for (Lancamento lancamento : getListaLancamento()) {
511
                                total = total + lancamento.getValorVenda();
512
                        }
513
                }
514
                return total;  
515
        }
516
 
517
        @Transient
518
        public Double getTotalPago() {
519
                Double total = 0.0;
520
                if (!VerificadorUtil.isListaNulaOuVazia(getListaFormaPagamento())) {
521
                        for (VendaFormaPagamento vendaFormaPagamento : getListaFormaPagamento()) {
522
                                total = total + vendaFormaPagamento.getValorPagamento();
523
                        }
524
                }
525
                return total;  
526
        }
527
 
528
        @Transient
529
        public Double getValorNotaFiscal() {
530
                if (VerificadorUtil.naoEstaNuloOuVazio(getTextoXml())) {
531
                        if (getTextoXml().indexOf("<vNF>") > 0) {
532
                                String valorLocalizado = getTextoXml().substring(getTextoXml().indexOf("<vNF>"), getTextoXml().indexOf("</vNF>"))
533
                                                                                        .replace("<vNF>", "").replace("</vNF>", "");
534
                                return new Double(valorLocalizado);
535
                        }
536
                }
537
                return 0.0;
538
        }
539
 
540
        @Transient
480 blopes 541
        public Double getTotalValorProdutosVinculados() {
259 espaco 542
                Double total = new Double(0.0);
480 blopes 543
                if (VerificadorUtil.naoEstaNuloOuVazio(getListaProdutosVinculadosDTO())) {
544
                        for (NotaFiscalProdutoDTO notaFiscalProdutoDTO : getListaProdutosVinculadosDTO()) {
485 blopes 545
                                total = total + (notaFiscalProdutoDTO.getValor() * notaFiscalProdutoDTO.getQuantidade());
259 espaco 546
                        }
547
                }
548
                return total;
549
        }
550
 
480 blopes 551
 
259 espaco 552
        @Transient
553
        public Boolean ehNotaFiscalDeRemessa() {
554
                return VerificadorUtil.naoEstaNulo(getTipoNotaFiscal()) ? getTipoNotaFiscal().equals(TipoNotaFiscal.NFE_REMESSA.getValor()) : false;
555
        }
556
 
557
        @Transient
558
        public byte[] criarArquivoXml() {
559
                ByteArrayInputStream in = null;
560
                ByteArrayOutputStream bos = null;
561
                try {
562
                        in = new ByteArrayInputStream(getTextoXml().getBytes());
563
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
564
                        DocumentBuilder builder = dbf.newDocumentBuilder();
565
                        Document xml = builder.parse(in);
566
 
567
                        bos = new ByteArrayOutputStream();
568
                        TransformerFactory transformerFactory = TransformerFactory.newInstance();
569
                        Transformer transformer = transformerFactory.newTransformer();
570
                        DOMSource source = new DOMSource(xml);
571
                        StreamResult result = new StreamResult(bos);
572
                        transformer.transform(source, result);
573
 
574
                        DefaultStreamedContent arquivo = (DefaultStreamedContent) RelatorioUtils.gerarArquivo(bos.toByteArray(), "ArquivoXML", "xml");
575
                        return IOUtils.toByteArray(arquivo.getStream());
576
                } catch (Exception e) {
577
                        e.printStackTrace();
578
                } finally {
579
                        try {
580
                                in.close();
581
                                bos.close();
582
                        } catch (IOException e) {
583
                                e.printStackTrace();
584
                        }
585
                }
586
                return null;
587
        }
588
 
589
        @Transient
590
        public byte[] getRetornarArquivoXml() {
591
                setArquivoXml(criarArquivoXml());
592
                return getArquivoXml();
593
        }
594
 
595
        @Transient
596
        public void gerarChaveAcessoNfe(String codigoUFEmitente, String dataAAMM, String cnpjCpfEmitente, String modeloNf,
597
                        String serieNF, String tpEmissao, String numeroNF) {
598
                try {
599
            StringBuilder chave = new StringBuilder();
600
            chave.append(StringUtil.lpadTo(codigoUFEmitente, 2, '0'));
601
            chave.append(StringUtil.lpadTo(dataAAMM, 4, '0'));
602
            chave.append(StringUtil.lpadTo(cnpjCpfEmitente.replaceAll("\\D",""), 14, '0'));
603
            chave.append(StringUtil.lpadTo(modeloNf, 2, '0'));
604
            chave.append(StringUtil.lpadTo(serieNF, 3, '0'));
605
            chave.append(StringUtil.lpadTo(String.valueOf(numeroNF), 9, '0'));
606
            chave.append(StringUtil.lpadTo(tpEmissao, 1, '0'));
607
            chave.append(StringUtil.lpadTo(numeroNF, 8, '0'));
608
            chave.append(StringUtil.modulo11(chave.toString()));
609
            chave.insert(0, "NFe");
610
            setChave(chave.toString());
611
        } catch (Exception e) {
612
                System.out.println(e.toString());
613
                throw new NegocioException(e.getMessage());
614
        }
615
        }
616
 
617
        @Transient
618
        public Long getSequencialDaVenda() {
619
                return VerificadorUtil.naoEstaNulo(getVenda())? getVenda().getSequencial() : null;
620
        }
621
 
622
        @Transient
623
        public void preencherNumeroPelaChave() {
624
                if (VerificadorUtil.naoEstaNuloOuVazio(getChave())) {
625
                        setNumeroNotaFiscal(new Long(getChave().substring(25, 34)));
626
                }
627
        }
628
 
629
        @Transient
630
        public void preencherMotivoPadrao() {
631
                setMotivoRetorno("Autorizado o uso da NF-e");
632
        }
633
 
634
        @Transient
635
        public void preencherSeriePadrao() {
636
                setSerie("1");
637
        }
638
 
639
        @Transient
640
        public void preencherStatusPadrao() {
641
                setStatusRetorno("100");
642
        }
643
 
644
        @Transient
645
        public void preencherQRCodePadrao() {
646
                setCaminhoQrcode("http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?p=" + getChave() + "|2|1|1|437A52AD9DE9BDD04D6BFF55ED997C5199ECC64D");
647
        }
648
 
649
        @Transient
650
        public String retornarCodigoNumerico() {
651
                if (VerificadorUtil.naoEstaNuloOuVazio(getChave())) {
652
                        if (getChave().length() > 42) {
653
                                return getChave().substring(35, 43);
654
                        }
655
                }
656
                return "";
657
        }
658
 
659
        @Transient
660
        public void preencherComXML() {
661
                if (VerificadorUtil.naoEstaNuloOuVazio(this.getTextoXml())) {
662
                        TNfeProc tNfeProc = unmarshal(this.getTextoXml());
663
                        preencher(tNfeProc);
664
                }
665
 
666
        }
667
 
668
        @Transient
669
        public void preencher(TNfeProc nfeProc) {
670
                if (VerificadorUtil.naoEstaNulo(nfeProc)) {
671
                        if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe())) {
672
                                if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe().getInfNFe())) {
673
                                        if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe().getInfNFe().getIde())) {
674
                                                //this.setCodigoNotaFiscal(new Long(nfeProc.getNFe().getInfNFe().getIde().getCNF()));
675
                                                this.setNumeroNotaFiscal(new Long(nfeProc.getNFe().getInfNFe().getIde().getNNF()));
676
                                                this.setSerie(nfeProc.getNFe().getInfNFe().getIde().getSerie());
677
                                                this.setDataHoraEmissao(DataUtil.retornarDataApartirString("yyyy-MM-dd'T'HH:mm:ss", nfeProc.getNFe().getInfNFe().getIde().getDhEmi()));
678
                                        }
679
                                        if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe().getInfNFe().getInfAdic())) {
680
                                                this.setDescricaoComplementares(nfeProc.getNFe().getInfNFe().getInfAdic().getInfCpl());
681
                                        }
682
                                }
683
                                if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe().getInfNFeSupl())) {}
684
                                if (VerificadorUtil.naoEstaNulo(nfeProc.getNFe().getSignature())) {}
685
                        }
686
                        if (VerificadorUtil.naoEstaNulo(nfeProc.getProtNFe())) {
687
                                if (VerificadorUtil.naoEstaNulo(nfeProc.getProtNFe().getInfProt())) {
688
                                        this.setChave(nfeProc.getProtNFe().getInfProt().getChNFe());
689
                                        this.setDataHoraEvento(DataUtil.retornarDataApartirString("yyyy-MM-dd'T'HH:mm:ss", nfeProc.getProtNFe().getInfProt().getDhRecbto()));
690
                                        this.setProtocoloAutorizacao(nfeProc.getProtNFe().getInfProt().getNProt());
691
                                        this.setStatusRetorno(nfeProc.getProtNFe().getInfProt().getCStat());
692
                                        this.setMotivoRetorno(nfeProc.getProtNFe().getInfProt().getXMotivo());
693
                                }
694
                        }
695
                }
696
        }
697
 
698
        @Transient
699
        public TNfeProc unmarshal(String stringXml) {
700
        JAXBContext context = null;
701
        try {
702
            context = JAXBContext.newInstance(nfce.TNfeProc.class);
703
            Unmarshaller unmarshaller = context.createUnmarshaller();
704
            return (TNfeProc) unmarshaller.unmarshal(new StreamSource(new StringReader(stringXml)));
705
        } catch (JAXBException e) {
706
            e.printStackTrace();
707
        }
708
        return null;
709
    }
710
 
711
}