br_nfe 2.3.2 → 3.0.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/README.markdown +1 -1
- data/br_nfe.gemspec +0 -0
- data/lib/br_nfe/constants.rb +2 -2
- data/lib/br_nfe/product/nf_xml_value.rb +6 -11
- data/lib/br_nfe/product/nfe/cobranca/pagamento.rb +39 -12
- data/lib/br_nfe/product/nfe/item.rb +83 -36
- data/lib/br_nfe/product/nfe/item_tax/icms.rb +182 -46
- data/lib/br_nfe/product/nfe/item_tax/icms_uf_destino.rb +33 -22
- data/lib/br_nfe/product/nfe/item_tax/ipi.rb +18 -18
- data/lib/br_nfe/product/nfe/transporte/base.rb +17 -15
- data/lib/br_nfe/product/nota_fiscal.rb +72 -6
- data/lib/br_nfe/product/operation/base.rb +14 -13
- data/lib/br_nfe/product/reader/item.rb +19 -2
- data/lib/br_nfe/product/reader/nfe.rb +28 -9
- data/lib/br_nfe/product/xml/v3_10/infNFe/det/_tc_prod.xml.slim +2 -2
- data/lib/br_nfe/product/xml/v3_10/infNFe/det/imposto/_tc_ICMSUFDest.xml.slim +1 -1
- data/lib/br_nfe/product/xml/v4_00/_tc_infNFe.xml.slim +45 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/_tc_ide.xml.slim +30 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/_tc_total.xml.slim +84 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/_tc_prod.xml.slim +62 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS00.xml.slim +11 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS10.xml.slim +28 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS20.xml.slim +18 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS201.xml.slim +21 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS202.xml.slim +20 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS30.xml.slim +23 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS500.xml.slim +13 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS51.xml.slim +25 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS60.xml.slim +12 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS70.xml.slim +35 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS90.xml.slim +38 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/ICMS/_tc_ICMS900.xml.slim +31 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/_tc_ICMSUFDest.xml.slim +15 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/det/imposto/_tc_IPI.xml.slim +27 -0
- data/lib/br_nfe/product/xml/v4_00/infNFe/pag/_tc_detPag.xml.slim +17 -0
- data/lib/br_nfe/version.rb +4 -4
- data/lib/config/settings/nfe/reader_xml_paths.yml +40 -9
- data/lib/config/settings/nfe/v4_00/operation.yml +843 -0
- data/lib/config/settings/nfe/v4_00/soap_client.yml +807 -0
- data/lib/config/settings/nfe/v4_00/xml_paths.yml +577 -0
- data/test/br_nfe/product/nfe/item_tax/icms_uf_destino_test.rb +9 -8
- data/test/br_nfe/product/nota_fiscal_test.rb +28 -36
- data/test/br_nfe/product/reader/nfe_test.rb +31 -31
- data/test/factories/product/nfe/item_tax/icms_uf_destino.rb +1 -1
- data/test/factories/product/operation/nfe_autorizacao.rb +3 -3
- metadata +26 -4
@@ -24,7 +24,7 @@ module BrNfe
|
|
24
24
|
# <b>Example: </b> _00_
|
25
25
|
# <b>Length: </b> _2_
|
26
26
|
# <b>tag: </b> CST
|
27
|
-
#
|
27
|
+
#
|
28
28
|
attr_accessor :codigo_cst
|
29
29
|
def codigo_cst
|
30
30
|
"#{@codigo_cst}".rjust(2, '0') if @codigo_cst.present?
|
@@ -40,11 +40,11 @@ module BrNfe
|
|
40
40
|
# <b>Example: </b> _C1324_
|
41
41
|
# <b>Length: </b> _max: 5_
|
42
42
|
# <b>tag: </b> clEnq
|
43
|
-
#
|
43
|
+
#
|
44
44
|
attr_accessor :classe_enquadramento
|
45
45
|
alias_attribute :clEnq, :classe_enquadramento
|
46
46
|
|
47
|
-
# CNPJ DO PRODUTOR DA MERCADORIA, QUANDO DIFERENTE DO EMITENTE.
|
47
|
+
# CNPJ DO PRODUTOR DA MERCADORIA, QUANDO DIFERENTE DO EMITENTE.
|
48
48
|
# SOMENTE PARA OS CASOS DE EXPORTAÇÃO DIRETA OU INDIRETA.
|
49
49
|
# Informar os zeros não significativos
|
50
50
|
#
|
@@ -53,7 +53,7 @@ module BrNfe
|
|
53
53
|
# <b>Example: </b> _00.000.000/0001-00 OU 01234567890123_
|
54
54
|
# <b>Length: </b> _14_
|
55
55
|
# <b>tag: </b> CNPJProd
|
56
|
-
#
|
56
|
+
#
|
57
57
|
attr_accessor :cnpj_produtor
|
58
58
|
def cnpj_produtor
|
59
59
|
"#{@cnpj_produtor}".gsub(/[^\d]/,'')
|
@@ -69,7 +69,7 @@ module BrNfe
|
|
69
69
|
# <b>Example: </b> _SELO12345654_
|
70
70
|
# <b>Length: </b> _max: 60_
|
71
71
|
# <b>tag: </b> cSelo
|
72
|
-
#
|
72
|
+
#
|
73
73
|
attr_accessor :codigo_selo
|
74
74
|
alias_attribute :cSelo, :codigo_selo
|
75
75
|
|
@@ -80,24 +80,24 @@ module BrNfe
|
|
80
80
|
# <b>Example: </b> _50_
|
81
81
|
# <b>Length: </b> _max: 12_
|
82
82
|
# <b>tag: </b> qSelo
|
83
|
-
#
|
83
|
+
#
|
84
84
|
attr_accessor :quantidade_selo
|
85
85
|
def quantidade_selo
|
86
86
|
"#{@quantidade_selo}".gsub(/[^\d]/,'')
|
87
87
|
end
|
88
88
|
alias_attribute :qSelo, :quantidade_selo
|
89
|
-
|
89
|
+
|
90
90
|
# CÓDIGO DE ENQUADRAMENTO LEGAL DO IPI
|
91
|
-
#
|
92
|
-
#
|
91
|
+
# Preenchimento conforme Anexo XIV da Nota Técnica 2015.002.
|
92
|
+
# http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=hDS5co/qWOc=
|
93
93
|
#
|
94
94
|
# <b>Type: </b> _String_
|
95
95
|
# <b>Required: </b> _Yes_
|
96
|
-
# <b>Example: </b>
|
96
|
+
# <b>Example: </b> _265_
|
97
97
|
# <b>Default: </b> _999_
|
98
98
|
# <b>Length: </b> _max: 3_
|
99
99
|
# <b>tag: </b> cEnq
|
100
|
-
#
|
100
|
+
#
|
101
101
|
attr_accessor :codigo_enquadramento
|
102
102
|
alias_attribute :cEnq, :codigo_enquadramento
|
103
103
|
|
@@ -108,7 +108,7 @@ module BrNfe
|
|
108
108
|
# <b>Required: </b> _No_
|
109
109
|
# <b>Example: </b> _152.38_
|
110
110
|
# <b>tag: </b> vBC
|
111
|
-
#
|
111
|
+
#
|
112
112
|
attr_accessor :base_calculo
|
113
113
|
alias_attribute :vBC, :base_calculo
|
114
114
|
|
@@ -118,18 +118,18 @@ module BrNfe
|
|
118
118
|
# <b>Required: </b> _No_
|
119
119
|
# <b>Example: </b> _12.00_
|
120
120
|
# <b>tag: </b> pIPI
|
121
|
-
#
|
121
|
+
#
|
122
122
|
attr_accessor :aliquota
|
123
123
|
alias_attribute :pIPI, :aliquota
|
124
124
|
|
125
|
-
# QUANTIDADE TOTAL NA UNIDADE PADRÃO PARA TRIBUTAÇÃO
|
125
|
+
# QUANTIDADE TOTAL NA UNIDADE PADRÃO PARA TRIBUTAÇÃO
|
126
126
|
# (SOMENTE PARA OS PRODUTOS TRIBUTADOS POR UNIDADE)
|
127
127
|
#
|
128
128
|
# <b>Type: </b> _Float_
|
129
129
|
# <b>Required: </b> _No_
|
130
130
|
# <b>Example: </b> _12.00_
|
131
131
|
# <b>tag: </b> qUnid
|
132
|
-
#
|
132
|
+
#
|
133
133
|
attr_accessor :quantidade_unidade
|
134
134
|
alias_attribute :qUnid, :quantidade_unidade
|
135
135
|
|
@@ -139,7 +139,7 @@ module BrNfe
|
|
139
139
|
# <b>Required: </b> _No_
|
140
140
|
# <b>Example: </b> _12.00_
|
141
141
|
# <b>tag: </b> vUnid
|
142
|
-
#
|
142
|
+
#
|
143
143
|
attr_accessor :total_unidade
|
144
144
|
alias_attribute :vUnid, :total_unidade
|
145
145
|
|
@@ -149,13 +149,13 @@ module BrNfe
|
|
149
149
|
# <b>Required: </b> _No_ (Yes if CST [00 49 50 99])
|
150
150
|
# <b>Example: </b> _12.00_
|
151
151
|
# <b>tag: </b> vIPI
|
152
|
-
#
|
152
|
+
#
|
153
153
|
attr_accessor :total
|
154
154
|
alias_attribute :vIPI, :total
|
155
155
|
|
156
156
|
def default_values
|
157
157
|
{
|
158
|
-
codigo_enquadramento: '999',
|
158
|
+
codigo_enquadramento: '999',
|
159
159
|
}
|
160
160
|
end
|
161
161
|
|
@@ -3,13 +3,15 @@ module BrNfe
|
|
3
3
|
module Nfe
|
4
4
|
module Transporte
|
5
5
|
class Base < BrNfe::ActiveModelBase
|
6
|
-
|
6
|
+
|
7
7
|
# Modalidade do frete
|
8
|
-
# 0
|
9
|
-
# 1
|
10
|
-
# 2
|
11
|
-
#
|
12
|
-
#
|
8
|
+
# 0=Contratação do Frete por conta do Remetente (CIF);
|
9
|
+
# 1=Contratação do Frete por conta do Destinatário (FOB);
|
10
|
+
# 2=Contratação do Frete por conta de Terceiros;
|
11
|
+
# 3=Transporte Próprio por conta do Remetente;
|
12
|
+
# 4=Transporte Próprio por conta do Destinatário;
|
13
|
+
# 9=Sem Ocorrência de Transporte.
|
14
|
+
#
|
13
15
|
# <b>Type: </b> _Number_
|
14
16
|
# <b>Required: </b> _Yes_
|
15
17
|
# <b>Default: </b> _9_
|
@@ -22,7 +24,7 @@ module BrNfe
|
|
22
24
|
|
23
25
|
##############################################################################
|
24
26
|
#################### Dados da retenção ICMS do Transporte ####################
|
25
|
-
|
27
|
+
|
26
28
|
# Método para saber se há retenção de ICMS, e se houver,
|
27
29
|
# aplica as validações e adiciona a tag no XML
|
28
30
|
#
|
@@ -54,7 +56,7 @@ module BrNfe
|
|
54
56
|
alias_attribute :vBCRet, :retencao_base_calculo_icms
|
55
57
|
|
56
58
|
# Percentual de aliquota da retenção do ICMS
|
57
|
-
# Exemplo:
|
59
|
+
# Exemplo:
|
58
60
|
# Se a aliquota for de 2,56% então deve setar o valor para
|
59
61
|
# o atrubuto assim: self.retencao_aliquota = 2.56
|
60
62
|
#
|
@@ -91,7 +93,7 @@ module BrNfe
|
|
91
93
|
attr_accessor :retencao_cfop
|
92
94
|
alias_attribute :CFOP, :retencao_cfop
|
93
95
|
|
94
|
-
# Código do município de ocorrência do fato gerador
|
96
|
+
# Código do município de ocorrência do fato gerador
|
95
97
|
# do ICMS do transporte
|
96
98
|
#
|
97
99
|
# <b>Type: </b> _Number_
|
@@ -102,7 +104,7 @@ module BrNfe
|
|
102
104
|
attr_accessor :retencao_codigo_municipio
|
103
105
|
alias_attribute :cMunFG, :retencao_codigo_municipio
|
104
106
|
|
105
|
-
# Attr utilizado para saber como será validado os dados do
|
107
|
+
# Attr utilizado para saber como será validado os dados do
|
106
108
|
# 'veiculo' utilizado para transportar a carga.
|
107
109
|
#
|
108
110
|
# <b>Type: </b> _Symbol_
|
@@ -111,7 +113,7 @@ module BrNfe
|
|
111
113
|
# <b>Default: </b> _:veiculo_
|
112
114
|
#
|
113
115
|
attr_accessor :forma_transporte
|
114
|
-
|
116
|
+
|
115
117
|
# Veículo de transporte
|
116
118
|
# Utilizado quando a forma de transporte for com :veiculo
|
117
119
|
#
|
@@ -198,8 +200,8 @@ module BrNfe
|
|
198
200
|
#
|
199
201
|
has_one :transportador, 'BrNfe.transportador_product_class'
|
200
202
|
alias_attribute :transporta, :transportador
|
201
|
-
|
202
|
-
|
203
|
+
|
204
|
+
|
203
205
|
def default_values
|
204
206
|
{
|
205
207
|
modalidade_frete: 9, # 9 = Sem frete
|
@@ -207,11 +209,11 @@ module BrNfe
|
|
207
209
|
}
|
208
210
|
end
|
209
211
|
|
210
|
-
validates :modalidade_frete, inclusion: [0, '0',
|
212
|
+
validates :modalidade_frete, inclusion: [0, 1, 2, 3, 4, 9, '0', '1', '2', '3', '4', '9']
|
211
213
|
validates :forma_transporte, presence: true
|
212
214
|
validates :forma_transporte, inclusion: [:veiculo, :balsa, :vagao]
|
213
215
|
validate_has_one :transportador
|
214
|
-
|
216
|
+
|
215
217
|
validate_has_many :volumes, message: :invalid_volume
|
216
218
|
validate_has_many :reboques, message: :invalid_reboque
|
217
219
|
validates :reboques, length: {maximum: 5}
|
@@ -120,6 +120,9 @@ module BrNfe
|
|
120
120
|
# 1=Pagamento a prazo;
|
121
121
|
# 2=Outros.
|
122
122
|
#
|
123
|
+
# NA VERSÃO 4.0 essa informação está em cada pagamento (tag: indPag, id: YA01b).
|
124
|
+
#
|
125
|
+
#
|
123
126
|
# <b>Type: </b> _Number_ OR _String_
|
124
127
|
# <b>Required: </b> _Yes_
|
125
128
|
# <b>Default: </b> _0_
|
@@ -237,6 +240,7 @@ module BrNfe
|
|
237
240
|
# 2=Operação não presencial, pela Internet;
|
238
241
|
# 3=Operação não presencial, Teleatendimento;
|
239
242
|
# 4=NFC-e em operação com entrega a domicílio;
|
243
|
+
# 5=Operação presencial, fora do estabelecimento;
|
240
244
|
# 9=Operação não presencial, outros. (Default)
|
241
245
|
#
|
242
246
|
# <b>Required: </b> _Yes_
|
@@ -380,7 +384,6 @@ module BrNfe
|
|
380
384
|
alias_attribute :cobr, :fatura
|
381
385
|
|
382
386
|
# Array com as informações dos pagamentos
|
383
|
-
# IMPORTANTE: Utilizado apenas para NFC-e
|
384
387
|
#
|
385
388
|
# Pode ser adicionado os dados dos pagamentos em forma de `Hash`
|
386
389
|
# ou o próprio objeto da classe BrNfe.pagamento_product_class.
|
@@ -398,7 +401,7 @@ module BrNfe
|
|
398
401
|
# Sempre vai retornar um Array de objetos da class configurada em `BrNfe.pagamento_product_class`
|
399
402
|
#
|
400
403
|
# <b>Tipo: </b> _BrNfe.pagamento_product_class (BrNfe::Product::Nfe::Cobranca::Pagamento)_
|
401
|
-
# <b>Min: </b>
|
404
|
+
# <b>Min: </b> _1_
|
402
405
|
# <b>Max: </b> _100_
|
403
406
|
# <b>Default: </b> _[]_
|
404
407
|
# <b>tag: </b> pag
|
@@ -406,6 +409,19 @@ module BrNfe
|
|
406
409
|
has_many :pagamentos, 'BrNfe.pagamento_product_class'
|
407
410
|
alias_attribute :pag, :pagamentos
|
408
411
|
|
412
|
+
# VALOR DO TROCO
|
413
|
+
# O valor do Troco na NFe deve ser informado quando o valor da NFe (campo vNF)
|
414
|
+
# for diferente dos valores dos Pagamentos (campos vPag).
|
415
|
+
#
|
416
|
+
# <b>Type: </b> _Float_
|
417
|
+
# <b>Required: </b> _No_
|
418
|
+
# <b>Example: </b> _108.46_
|
419
|
+
# <b>Length: </b> _13v2_
|
420
|
+
# <b>tag: </b> vTroco
|
421
|
+
#
|
422
|
+
attr_accessor :pagamento_troco
|
423
|
+
alias_attribute :vTroco, :pagamento_troco
|
424
|
+
|
409
425
|
# DETALHAMENTO DE PRODUTOS E SERVIÇOS
|
410
426
|
#
|
411
427
|
# <b>Type: </b> _BrNfe.item_product_class (BrNfe::Product::Nfe::Item)_
|
@@ -654,6 +670,59 @@ module BrNfe
|
|
654
670
|
attr_accessor :total_tributos
|
655
671
|
alias_attribute :ICMSTot_vTotTrib, :total_tributos
|
656
672
|
validates :total_tributos, numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
|
673
|
+
|
674
|
+
# VALOR TOTAL DO FCP (FUNDO DE COMBATE À POBREZA)
|
675
|
+
# Corresponde ao total da soma dos campos id: N17c
|
676
|
+
#
|
677
|
+
# <b>Type: </b> _Float_
|
678
|
+
# <b>Required: </b> _Yes_
|
679
|
+
# <b>Example: </b> _178.46_
|
680
|
+
# <b>Length: </b> _13v2_
|
681
|
+
# <b>tag: </b> vFCP
|
682
|
+
#
|
683
|
+
attr_accessor :total_fcp
|
684
|
+
alias_attribute :vFCP, :total_fcp
|
685
|
+
|
686
|
+
# VALOR TOTAL DO FCP (FUNDO DE COMBATE À POBREZA) RETIDO POR SUBSTITUIÇÃO TRIBUTÁRIA
|
687
|
+
# Corresponde ao total da soma dos campos id: N23d
|
688
|
+
#
|
689
|
+
# <b>Type: </b> _Float_
|
690
|
+
# <b>Required: </b> _Yes_
|
691
|
+
# <b>Example: </b> _178.46_
|
692
|
+
# <b>Length: </b> _13v2_
|
693
|
+
# <b>tag: </b> vFCPST
|
694
|
+
#
|
695
|
+
attr_accessor :total_fcp_st
|
696
|
+
alias_attribute :vFCPST, :total_fcp_st
|
697
|
+
|
698
|
+
# VALOR TOTAL DO FCP RETIDO ANTERIORMENTE POR SUBSTITUIÇÃO TRIBUTÁRIA
|
699
|
+
# Corresponde ao total da soma dos campos id: N27d
|
700
|
+
#
|
701
|
+
# <b>Type: </b> _Float_
|
702
|
+
# <b>Required: </b> _Yes_
|
703
|
+
# <b>Example: </b> _178.46_
|
704
|
+
# <b>Length: </b> _13v2_
|
705
|
+
# <b>tag: </b> vFCPSTRet
|
706
|
+
#
|
707
|
+
attr_accessor :total_fcp_st_retido
|
708
|
+
alias_attribute :vFCPSTRet, :total_fcp_st_retido
|
709
|
+
|
710
|
+
# VALOR TOTAL DO IPI DEVOLVIDO
|
711
|
+
# Deve ser informado quando preenchido o Grupo Tributos
|
712
|
+
# Devolvidos na emissão de nota finNFe=4 (devolução) nas
|
713
|
+
# operações com não contribuintes do IPI. Corresponde ao
|
714
|
+
# total da soma dos campos id:UA04.
|
715
|
+
# Deve ser preenchido no XML mesmo que zerado
|
716
|
+
#
|
717
|
+
# <b>Type: </b> _Float_
|
718
|
+
# <b>Required: </b> _Yes_
|
719
|
+
# <b>Example: </b> _178.46_
|
720
|
+
# <b>Length: </b> _13v2_
|
721
|
+
# <b>tag: </b> vIPIDevol
|
722
|
+
#
|
723
|
+
attr_accessor :total_ipi_devolvido
|
724
|
+
alias_attribute :vIPIDevol, :total_ipi_devolvido
|
725
|
+
|
657
726
|
##########################################################################
|
658
727
|
######################### TOTAIS PARA SERVIÇOS #########################
|
659
728
|
# VALOR TOTAL DOS SERVIÇOS SOB NÃO-INCIDÊNCIA OU NÃO TRIBUTADOS PELO ICMS
|
@@ -1099,9 +1168,6 @@ module BrNfe
|
|
1099
1168
|
|
1100
1169
|
validates :natureza_operacao, presence: true
|
1101
1170
|
|
1102
|
-
validates :forma_pagamento, presence: true
|
1103
|
-
validates :forma_pagamento, inclusion: [0, 1, 2, '0', '1', '2']
|
1104
|
-
|
1105
1171
|
validates :modelo_nf, presence: true
|
1106
1172
|
validates :modelo_nf, inclusion: [55, 65, '55', '65']
|
1107
1173
|
|
@@ -1115,7 +1181,7 @@ module BrNfe
|
|
1115
1181
|
validates :tipo_impressao, inclusion: [0, 1, 2, 3, 4, 5, '0', '1', '2', '3', '4', '5']
|
1116
1182
|
|
1117
1183
|
validates :presenca_comprador, presence: true
|
1118
|
-
validates :presenca_comprador, inclusion: [0, 1, 2, 3, 4, 9, '0', '1', '2', '3', '4', '9']
|
1184
|
+
validates :presenca_comprador, inclusion: [0, 1, 2, 3, 4, 5, 9, '0', '1', '2', '3', '4', '5', '9']
|
1119
1185
|
|
1120
1186
|
validates :processo_emissao, presence: true
|
1121
1187
|
validates :processo_emissao, inclusion: [0, 1, 2, 3, '0', '1', '2', '3']
|
@@ -17,7 +17,7 @@ module BrNfe
|
|
17
17
|
attr_accessor :tipo_emissao
|
18
18
|
def tipo_emissao= value
|
19
19
|
if "#{value}" == '1'
|
20
|
-
@tipo_emissao = :normal
|
20
|
+
@tipo_emissao = :normal
|
21
21
|
elsif "#{value}" == '9'
|
22
22
|
@tipo_emissao = :offline_nfce
|
23
23
|
elsif "#{value}".in?(%w[6 7])
|
@@ -45,9 +45,9 @@ module BrNfe
|
|
45
45
|
#
|
46
46
|
# <b>Required: </b> _No_
|
47
47
|
# <b>Type: </b> _String_ XML
|
48
|
-
#
|
48
|
+
#
|
49
49
|
attr_accessor :original_xml
|
50
|
-
|
50
|
+
|
51
51
|
validates :tipo_emissao, inclusion: {in: [:normal, :svc]}
|
52
52
|
validates :inicio_contingencia, presence: true, if: :contingencia?
|
53
53
|
validates :motivo_contingencia, length: { minimum: 15, maximum: 256 }, if: :contingencia?
|
@@ -90,7 +90,7 @@ module BrNfe
|
|
90
90
|
# - :soap_client => Contém as configurações para instanciar o client Soap com o Savon.
|
91
91
|
# - :xml_paths => Contém os caminhos com namespace para encontrar os valores dentro dos XMLS
|
92
92
|
#
|
93
|
-
# <b>Tipo de retorno: </b> _Symbol_
|
93
|
+
# <b>Tipo de retorno: </b> _Symbol_
|
94
94
|
#
|
95
95
|
def gateway_settings
|
96
96
|
nfe_settings[:gateway][gateway]
|
@@ -109,7 +109,7 @@ module BrNfe
|
|
109
109
|
# 'AM', 'BA', 'CE', 'GO', 'MA', 'MS', 'MT', 'PA', 'PE', 'PI', 'PR'
|
110
110
|
when '13', '29', '23', '52', '21', '50', '51', '15', '26', '22', '41'
|
111
111
|
:svc_rs
|
112
|
-
else # AC, AL, AP, DF, ES, MG, PB, RJ, RN, RO, RR, RS, SC, SE, SP, TO
|
112
|
+
else # AC, AL, AP, DF, ES, MG, PB, RJ, RN, RO, RR, RS, SC, SE, SP, TO
|
113
113
|
:svc_an
|
114
114
|
end
|
115
115
|
end
|
@@ -118,7 +118,7 @@ module BrNfe
|
|
118
118
|
#
|
119
119
|
# <b>Tipo de retorno: </b> _Hash_
|
120
120
|
#
|
121
|
-
def get_gateway_by_normal_operation
|
121
|
+
def get_gateway_by_normal_operation
|
122
122
|
case "#{ibge_code_of_issuer_uf}"
|
123
123
|
when '13'
|
124
124
|
:am
|
@@ -144,7 +144,7 @@ module BrNfe
|
|
144
144
|
:sp
|
145
145
|
when '21', '15' # MA, PA
|
146
146
|
:svan
|
147
|
-
else
|
147
|
+
else
|
148
148
|
# AC, AL, AP, ES, DF, PB, RJ, RM, RO, RR, SC, PI
|
149
149
|
# 12, 27, 16, 32, 53, 25, 33, 24, 11, 14, 42, 22
|
150
150
|
:svrs
|
@@ -175,7 +175,7 @@ module BrNfe
|
|
175
175
|
end
|
176
176
|
|
177
177
|
# Versão utilizada pelo webservice do estado para determinada ação.
|
178
|
-
# Irá retornar a versão setada de acordo com o serviço e estado conforme
|
178
|
+
# Irá retornar a versão setada de acordo com o serviço e estado conforme
|
179
179
|
# descrito em: http://www.nfe.fazenda.gov.br/portal/webServices.aspx
|
180
180
|
#
|
181
181
|
# <b>Tipo de retorno: </b> _Symbol_
|
@@ -250,11 +250,12 @@ module BrNfe
|
|
250
250
|
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v1_10" if gateway_xml_version >= :v1_10
|
251
251
|
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v2_00" if gateway_xml_version >= :v2_00
|
252
252
|
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v2_01" if gateway_xml_version >= :v2_01
|
253
|
-
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v3_10" if gateway_xml_version
|
254
|
-
|
253
|
+
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v3_10" if gateway_xml_version >= :v3_10
|
254
|
+
paths << "#{BrNfe.root}/lib/br_nfe/product/xml/v4_00" if gateway_xml_version == :v4_00
|
255
|
+
|
255
256
|
@xml_current_dir_path = paths.reverse+["#{BrNfe.root}/lib/br_nfe/product/xml"]+super
|
256
257
|
end
|
257
|
-
|
258
|
+
|
258
259
|
# Método utilizado para saber se a operação será em contingência.
|
259
260
|
#
|
260
261
|
# <b>Tipo de retorno: </b> _Boolean_
|
@@ -271,13 +272,13 @@ module BrNfe
|
|
271
272
|
# ✕ 5=Contingência FS-DA, com impressão do DANFE em formulário de segurança;
|
272
273
|
# ✓ 6=Contingência SVC-AN (SEFAZ Virtual de Contingência do AN);
|
273
274
|
# ✓ 7=Contingência SVC-RS (SEFAZ Virtual de Contingência do RS);
|
274
|
-
# ✓ 9=Contingência off-line da NFC-e (as demais opções de contingência são válidas
|
275
|
+
# ✓ 9=Contingência off-line da NFC-e (as demais opções de contingência são válidas
|
275
276
|
# também para a NFC-e).
|
276
277
|
# Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9.
|
277
278
|
def codigo_tipo_emissao(nfe)
|
278
279
|
return 9 if nfe.nfce?
|
279
280
|
case tipo_emissao
|
280
|
-
when :normal
|
281
|
+
when :normal
|
281
282
|
1
|
282
283
|
when :svc
|
283
284
|
if gateway == :svc_rs
|
@@ -66,6 +66,11 @@ module BrNfe
|
|
66
66
|
@item.total_ipi_devolucao = @xml.css( @path[:total_ipi_devolucao] ).text.to_f
|
67
67
|
@item.informacoes_adicionais = @xml.css( @path[:informacoes_adicionais] ).text
|
68
68
|
@item.total_tributos = @xml.css( @path[:total_tributos] ).text.to_f
|
69
|
+
|
70
|
+
# NF-e 4.0
|
71
|
+
@item.escala_relevante = @xml.css( @path[:escala_relevante] ).text
|
72
|
+
@item.cnpj_fabricante = @xml.css( @path[:cnpj_fabricante] ).text
|
73
|
+
@item.codigo_beneficio_fiscal = @xml.css( @path[:codigo_beneficio_fiscal] ).text
|
69
74
|
end
|
70
75
|
|
71
76
|
def set_icms
|
@@ -93,7 +98,18 @@ module BrNfe
|
|
93
98
|
total_base_calculo_st_retido: @xml.css( @path[:icms][:total_base_calculo_st_retido]).text.to_f,
|
94
99
|
total_st_retido: @xml.css( @path[:icms][:total_st_retido] ).text.to_f,
|
95
100
|
aliquota_credito_sn: @xml.css( @path[:icms][:aliquota_credito_sn] ).text.to_f,
|
96
|
-
total_credito_sn: @xml.css( @path[:icms][:total_credito_sn] ).text.to_f
|
101
|
+
total_credito_sn: @xml.css( @path[:icms][:total_credito_sn] ).text.to_f,
|
102
|
+
# NF-e 4.0
|
103
|
+
cfp_base_calculo: @xml.css( @path[:icms][:cfp_base_calculo] ).text.to_f,
|
104
|
+
cfp_percentual: @xml.css( @path[:icms][:cfp_percentual] ).text.to_f,
|
105
|
+
cfp_valor: @xml.css( @path[:icms][:cfp_valor] ).text.to_f,
|
106
|
+
cfp_st_base_calculo: @xml.css( @path[:icms][:cfp_st_base_calculo] ).text.to_f,
|
107
|
+
cfp_st_percentual: @xml.css( @path[:icms][:cfp_st_percentual] ).text.to_f,
|
108
|
+
cfp_st_valor: @xml.css( @path[:icms][:cfp_st_valor] ).text.to_f,
|
109
|
+
cfp_st_retido_base_calculo: @xml.css( @path[:icms][:cfp_st_retido_base_calculo] ).text.to_f,
|
110
|
+
cfp_st_retido_percentual: @xml.css( @path[:icms][:cfp_st_retido_percentual] ).text.to_f,
|
111
|
+
cfp_st_retido_valor: @xml.css( @path[:icms][:cfp_st_retido_valor] ).text.to_f,
|
112
|
+
aliquota_consumidor_final: @xml.css( @path[:icms][:aliquota_consumidor_final] ).text.to_f,
|
97
113
|
}
|
98
114
|
end
|
99
115
|
def set_ipi
|
@@ -134,7 +150,8 @@ module BrNfe
|
|
134
150
|
def set_icms_uf_destino
|
135
151
|
@item.icms_uf_destino do |icms_uf_destino|
|
136
152
|
icms_uf_destino.total_base_calculo = @xml.css( @path[:icms_uf_destino][:total_base_calculo] ).text.to_f
|
137
|
-
icms_uf_destino.
|
153
|
+
icms_uf_destino.bc_fcp_uf_destino = @xml.css( @path[:icms_uf_destino][:bc_fcp_uf_destino] ).text.to_f
|
154
|
+
icms_uf_destino.percentual_fcp_uf_destino = @xml.css( @path[:icms_uf_destino][:percentual_fcp_uf_destino] ).text.to_f
|
138
155
|
icms_uf_destino.aliquota_interna_uf_destino = @xml.css( @path[:icms_uf_destino][:aliquota_interna_uf_destino]).text.to_f
|
139
156
|
icms_uf_destino.aliquota_interestadual = @xml.css( @path[:icms_uf_destino][:aliquota_interestadual] ).text.to_f
|
140
157
|
icms_uf_destino.percentual_partilha_destino = @xml.css( @path[:icms_uf_destino][:percentual_partilha_destino]).text.to_f
|
@@ -17,7 +17,7 @@ module BrNfe
|
|
17
17
|
def xml_version
|
18
18
|
@xml_version
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
private
|
22
22
|
|
23
23
|
def path
|
@@ -29,7 +29,12 @@ module BrNfe
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def find_xml_version
|
32
|
-
"v#{@xml.css("infNFe").attr("versao")}".gsub('.','_').to_sym
|
32
|
+
v = "v#{@xml.css("infNFe").attr("versao")}".gsub('.','_').to_sym
|
33
|
+
if v.in?( %i[v3_10 v4_00] )
|
34
|
+
v
|
35
|
+
else
|
36
|
+
:v4_00
|
37
|
+
end
|
33
38
|
end
|
34
39
|
|
35
40
|
def populate_invoice!
|
@@ -44,7 +49,9 @@ module BrNfe
|
|
44
49
|
@invoice.codigo_tipo_emissao = @xml_nfe.css(path[:codigo_tipo_emissao]).text
|
45
50
|
@invoice.codigo_nf = @xml_nfe.css(path[:codigo_nf]).text
|
46
51
|
@invoice.natureza_operacao = @xml_nfe.css(path[:natureza_operacao]).text
|
47
|
-
|
52
|
+
|
53
|
+
@invoice.forma_pagamento = @xml_nfe.css(path[:forma_pagamento]).text # Removido na NF-e 4.0
|
54
|
+
|
48
55
|
@invoice.modelo_nf = @xml_nfe.css(path[:modelo_nf]).text
|
49
56
|
@invoice.serie = @xml_nfe.css(path[:serie]).text
|
50
57
|
@invoice.numero_nf = @xml_nfe.css(path[:numero_nf]).text.to_i
|
@@ -96,6 +103,11 @@ module BrNfe
|
|
96
103
|
@invoice.total_outras_despesas = @xml_nfe.css(path[:total_icms][:total_outras_despesas]).text.to_f
|
97
104
|
@invoice.total_nf = @xml_nfe.css(path[:total_icms][:total_nf]).text.to_f
|
98
105
|
@invoice.total_tributos = @xml_nfe.css(path[:total_icms][:total_tributos]).text.to_f
|
106
|
+
# NF-e v4
|
107
|
+
@invoice.total_fcp = @xml_nfe.css(path[:total_icms][:total_fcp]).text.to_f
|
108
|
+
@invoice.total_fcp_st = @xml_nfe.css(path[:total_icms][:total_fcp_st]).text.to_f
|
109
|
+
@invoice.total_fcp_st_retido = @xml_nfe.css(path[:total_icms][:total_fcp_st_retido]).text.to_f
|
110
|
+
@invoice.total_ipi_devolvido = @xml_nfe.css(path[:total_icms][:total_ipi_devolvido]).text.to_f
|
99
111
|
end
|
100
112
|
|
101
113
|
def build_service_total_values!
|
@@ -147,14 +159,21 @@ module BrNfe
|
|
147
159
|
end
|
148
160
|
|
149
161
|
def build_pagamentos!
|
162
|
+
if (path[:pagamentos][:troco])
|
163
|
+
# NF-e v4
|
164
|
+
@invoice.pagamento_troco = @xml_nfe.css(path[:pagamentos][:troco]).text.to_f
|
165
|
+
end
|
166
|
+
|
150
167
|
@xml_nfe.css(path[:pagamentos][:root]).each do |xml_pag|
|
151
168
|
@invoice.pagamentos << {
|
152
|
-
forma_pagamento:
|
153
|
-
total:
|
154
|
-
tipo_integracao:
|
155
|
-
cartao_cnpj:
|
156
|
-
cartao_bandeira:
|
157
|
-
cartao_autorizacao:
|
169
|
+
forma_pagamento: xml_pag.css(path[:pagamentos][:forma_pagamento]).text,
|
170
|
+
total: xml_pag.css(path[:pagamentos][:total]).text.to_f,
|
171
|
+
tipo_integracao: xml_pag.css(path[:pagamentos][:tipo_integracao]).text,
|
172
|
+
cartao_cnpj: xml_pag.css(path[:pagamentos][:cartao_cnpj]).text,
|
173
|
+
cartao_bandeira: xml_pag.css(path[:pagamentos][:cartao_bandeira]).text,
|
174
|
+
cartao_autorizacao: xml_pag.css(path[:pagamentos][:cartao_autorizacao]).text,
|
175
|
+
# NF-e v4
|
176
|
+
indicacao_pagamento: xml_pag.css(path[:pagamentos][:indicacao_pagamento]).text,
|
158
177
|
}
|
159
178
|
end
|
160
179
|
end
|
@@ -6,9 +6,9 @@ NCM = nf_xml_value_NCM( item.codigo_ncm )
|
|
6
6
|
- item.codigos_nve.each do |nve|
|
7
7
|
NVE = nf_xml_value_NVE(nve)
|
8
8
|
|
9
|
-
- item.codigo_cest.present?
|
9
|
+
- if item.codigo_cest.present?
|
10
10
|
CEST = nf_xml_value_CEST( item.codigo_cest )
|
11
|
-
|
11
|
+
|
12
12
|
- if item.codigo_extipi.present?
|
13
13
|
EXTIPI = nf_xml_value_EXTIPI( item.codigo_extipi )
|
14
14
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
vBCUFDest = nf_xml_value_monetary( icms.total_base_calculo )
|
2
|
-
pFCPUFDest = nf_xml_value_monetary( icms.
|
2
|
+
pFCPUFDest = nf_xml_value_monetary( icms.percentual_fcp_uf_destino )
|
3
3
|
pICMSUFDest = nf_xml_value_monetary( icms.aliquota_interna_uf_destino )
|
4
4
|
pICMSInter = nf_xml_value_monetary( icms.aliquota_interestadual )
|
5
5
|
pICMSInterPart = nf_xml_value_monetary( icms.percentual_partilha_destino )
|
@@ -0,0 +1,45 @@
|
|
1
|
+
ide = render_xml 'infNFe/_tc_ide', nfe: nfe
|
2
|
+
emit = render_xml 'infNFe/_tc_emit'
|
3
|
+
/ avulsa
|
4
|
+
dest = render_xml 'infNFe/_tc_dest', nfe: nfe
|
5
|
+
|
6
|
+
- if nfe.endereco_retirada
|
7
|
+
retirada = render_xml 'infNFe/_tc_retirada', nfe: nfe
|
8
|
+
|
9
|
+
- if nfe.endereco_entrega
|
10
|
+
entrega = render_xml 'infNFe/_tc_entrega', nfe: nfe
|
11
|
+
|
12
|
+
- nfe.autorizados_download_xml.each do |auth|
|
13
|
+
autXML
|
14
|
+
= render_xml('_tc_cpf_cnpj', cpf_cnpj: auth)
|
15
|
+
|
16
|
+
- nfe.itens.each_with_index do |item, i|
|
17
|
+
det nItem="#{i+1}"
|
18
|
+
= render_xml 'infNFe/_tc_det', item: item
|
19
|
+
|
20
|
+
total
|
21
|
+
= render_xml 'infNFe/_tc_total', nfe: nfe
|
22
|
+
|
23
|
+
transp
|
24
|
+
= render_xml('infNFe/_tc_transp', nfe: nfe)
|
25
|
+
|
26
|
+
- if nfe.fatura
|
27
|
+
cobr
|
28
|
+
= render_xml 'infNFe/_tc_cobr', nfe: nfe
|
29
|
+
|
30
|
+
pag
|
31
|
+
- nfe.pagamentos.each do |pagamento|
|
32
|
+
= render_xml 'infNFe/pag/_tc_detPag', pagamento: pagamento
|
33
|
+
- if nfe.pagamento_troco.to_f > 0
|
34
|
+
vTroco = nf_xml_value_monetary( nfe.pagamento_troco )
|
35
|
+
|
36
|
+
- if nfe.informacoes_fisco.present? || nfe.informacoes_contribuinte.present? || nfe.processos_referenciados.present?
|
37
|
+
infAdic
|
38
|
+
= render_xml 'infNFe/_tc_infAdic', nfe: nfe
|
39
|
+
|
40
|
+
- if nfe.exportacao_uf_saida.present? && nfe.exportacao_local_embarque.present?
|
41
|
+
exporta
|
42
|
+
= render_xml 'infNFe/_tc_exporta', nfe: nfe
|
43
|
+
|
44
|
+
/ compra
|
45
|
+
/ cana
|
@@ -0,0 +1,30 @@
|
|
1
|
+
cUF = emitente.endereco.codigo_ibge_uf
|
2
|
+
cNF = nf_xml_value_codigo_nf( nfe.codigo_nf )
|
3
|
+
natOp = nf_xml_value_text( nfe.natureza_operacao )
|
4
|
+
mod = nfe.modelo_nf
|
5
|
+
serie = nfe.serie
|
6
|
+
nNF = nfe.numero_nf
|
7
|
+
dhEmi = nf_xml_value_date_time( nfe.data_hora_emissao )
|
8
|
+
- if nfe.nfe?
|
9
|
+
dhSaiEnt = nf_xml_value_date_time( nfe.data_hora_expedicao )
|
10
|
+
tpNF = nfe.tipo_operacao
|
11
|
+
idDest = nf_xml_value_id_local_destino( nfe.destinatario.endereco )
|
12
|
+
cMunFG = nf_xml_value_codigo_ibge_municipio( emitente.endereco.codigo_municipio )
|
13
|
+
tpImp = nfe.tipo_impressao
|
14
|
+
tpEmis = codigo_tipo_emissao( nfe )
|
15
|
+
cDV = nfe.chave_de_acesso_dv
|
16
|
+
tpAmb = nf_xml_value_tipo_ambiente( env )
|
17
|
+
finNFe = nfe.finalidade_emissao
|
18
|
+
indFinal = nf_xml_value_consumidor_final( nfe.consumidor_final )
|
19
|
+
indPres = nfe.presenca_comprador
|
20
|
+
procEmi = nfe.processo_emissao
|
21
|
+
verProc = nfe.versao_aplicativo
|
22
|
+
|
23
|
+
- if contingencia?
|
24
|
+
dhCont = nf_xml_value_date_time(inicio_contingencia)
|
25
|
+
xJust = nf_xml_value_text( motivo_contingencia, 255 )
|
26
|
+
|
27
|
+
- if nfe.notas_referenciadas.size > 0
|
28
|
+
NFref
|
29
|
+
- nfe.notas_referenciadas.each do |ref|
|
30
|
+
refNFe = ref
|