br_danfe 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +7 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +5 -0
- data/README.md +116 -0
- data/Rakefile +39 -0
- data/br_danfe.gemspec +27 -0
- data/config/locales/pt-BR.yml +125 -0
- data/lib/br_danfe.rb +12 -0
- data/lib/br_danfe/cep.rb +7 -0
- data/lib/br_danfe/cnpj.rb +7 -0
- data/lib/br_danfe/cpf.rb +7 -0
- data/lib/br_danfe/cst.rb +28 -0
- data/lib/br_danfe/danfe_generator.rb +54 -0
- data/lib/br_danfe/dest.rb +21 -0
- data/lib/br_danfe/det.rb +69 -0
- data/lib/br_danfe/document.rb +103 -0
- data/lib/br_danfe/dup.rb +25 -0
- data/lib/br_danfe/emit.rb +45 -0
- data/lib/br_danfe/helper.rb +38 -0
- data/lib/br_danfe/icmstot.rb +19 -0
- data/lib/br_danfe/ie.rb +68 -0
- data/lib/br_danfe/infadic.rb +53 -0
- data/lib/br_danfe/issqn.rb +12 -0
- data/lib/br_danfe/options.rb +22 -0
- data/lib/br_danfe/phone.rb +11 -0
- data/lib/br_danfe/plate.rb +7 -0
- data/lib/br_danfe/ruby_danfe.rb +42 -0
- data/lib/br_danfe/ticket.rb +10 -0
- data/lib/br_danfe/transp.rb +18 -0
- data/lib/br_danfe/version.rb +3 -0
- data/lib/br_danfe/vol.rb +23 -0
- data/lib/br_danfe/xml.rb +32 -0
- data/lib/br_danfe/xprod.rb +41 -0
- data/spec/features/ruby_danfe_spec.rb +48 -0
- data/spec/fixtures/nfe_simples_nacional.xml +1 -0
- data/spec/fixtures/nfe_with_extra_volumes.xml +4 -0
- data/spec/fixtures/nfe_with_fci.xml +1 -0
- data/spec/fixtures/nfe_with_ns.xml +4 -0
- data/spec/fixtures/nfe_without_ns.xml +2 -0
- data/spec/lib/cep_spec.rb +10 -0
- data/spec/lib/cnpj_spec.rb +10 -0
- data/spec/lib/cpf_spec.rb +10 -0
- data/spec/lib/cst_spec.rb +51 -0
- data/spec/lib/helper_spec.rb +84 -0
- data/spec/lib/ie_spec.rb +230 -0
- data/spec/lib/options_spec.rb +13 -0
- data/spec/lib/phone_spec.rb +19 -0
- data/spec/lib/plate_spec.rb +10 -0
- data/spec/lib/ruby_danfe_spec.rb +40 -0
- data/spec/lib/xprod_spec.rb +124 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/be_same_file_as.rb +9 -0
- metadata +223 -0
data/spec/lib/ie_spec.rb
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BrDanfe::Ie do
|
4
|
+
describe ".format" do
|
5
|
+
context "when UF is AC" do
|
6
|
+
it "returns a formated ie" do
|
7
|
+
ie = "1234567890123"
|
8
|
+
expect(BrDanfe::Ie.format(ie, "AC")).to eq "12.345.678/901-23"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when UF is AL" do
|
13
|
+
it "returns a formated ie" do
|
14
|
+
ie = "123456789"
|
15
|
+
expect(BrDanfe::Ie.format(ie, "AL")).to eq "123456789"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when UF is AP" do
|
20
|
+
it "returns a formated ie" do
|
21
|
+
ie = "123456789"
|
22
|
+
expect(BrDanfe::Ie.format(ie, "AP")).to eq "123456789"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when UF is AM" do
|
27
|
+
it "returns a formated ie" do
|
28
|
+
ie = "123456789"
|
29
|
+
expect(BrDanfe::Ie.format(ie, "AM")).to eq "12.345.678-9"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when UF is BA" do
|
34
|
+
context "when IE have 8 digits" do
|
35
|
+
it "returns a formated ie" do
|
36
|
+
ie = "12345678"
|
37
|
+
expect(BrDanfe::Ie.format(ie, "BA")).to eq "123456-78"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when IE have 9 digits" do
|
42
|
+
it "returns a formated ie" do
|
43
|
+
ie = "123456789"
|
44
|
+
expect(BrDanfe::Ie.format(ie, "BA")).to eq "1234567-89"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when UF is CE" do
|
50
|
+
it "returns a formated ie" do
|
51
|
+
ie = "123456789"
|
52
|
+
expect(BrDanfe::Ie.format(ie, "CE")).to eq "12345678-9"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when UF is DF" do
|
57
|
+
it "returns a formated ie" do
|
58
|
+
ie = "1234567890123"
|
59
|
+
expect(BrDanfe::Ie.format(ie, "DF")).to eq "12345678901-23"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when UF is ES" do
|
64
|
+
it "returns a formated ie" do
|
65
|
+
ie = "123456789"
|
66
|
+
expect(BrDanfe::Ie.format(ie, "ES")).to eq "123456789"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when UF is GO" do
|
71
|
+
it "returns a formated ie" do
|
72
|
+
ie = "123456789"
|
73
|
+
expect(BrDanfe::Ie.format(ie, "GO")).to eq "12.345.678-9"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when UF is MA" do
|
78
|
+
it "returns a formated ie" do
|
79
|
+
ie = "123456789"
|
80
|
+
expect(BrDanfe::Ie.format(ie, "MA")).to eq "123456789"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "when UF is MT" do
|
85
|
+
it "returns a formated ie" do
|
86
|
+
ie = "12345678901"
|
87
|
+
expect(BrDanfe::Ie.format(ie, "MT")).to eq "1234567890-1"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when UF is MS" do
|
92
|
+
it "returns a formated ie" do
|
93
|
+
ie = "12345678"
|
94
|
+
expect(BrDanfe::Ie.format(ie, "MS")).to eq "12345678"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when UF is MG" do
|
99
|
+
it "returns a formated ie" do
|
100
|
+
ie = "1234567890123"
|
101
|
+
expect(BrDanfe::Ie.format(ie, "MG")).to eq "123.456.789/0123"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "when UF is PA" do
|
106
|
+
it "returns a formated ie" do
|
107
|
+
ie = "123456789"
|
108
|
+
expect(BrDanfe::Ie.format(ie, "PA")).to eq "12-345678-9"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when UF is PB" do
|
113
|
+
it "returns a formated ie" do
|
114
|
+
ie = "123456789"
|
115
|
+
expect(BrDanfe::Ie.format(ie, "PB")).to eq "12345678-9"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "when UF is PR" do
|
120
|
+
it "returns a formated ie" do
|
121
|
+
ie = "1234567890"
|
122
|
+
expect(BrDanfe::Ie.format(ie, "PR")).to eq "12345678-90"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "when UF is PE" do
|
127
|
+
it "returns a formated ie" do
|
128
|
+
ie = "123456789"
|
129
|
+
expect(BrDanfe::Ie.format(ie, "PE")).to eq "1234567-89"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "when UF is PI" do
|
134
|
+
it "returns a formated ie" do
|
135
|
+
ie = "123456789"
|
136
|
+
expect(BrDanfe::Ie.format(ie, "PI")).to eq "123456789"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when UF is RJ" do
|
141
|
+
it "returns a formated ie" do
|
142
|
+
ie = "12345678"
|
143
|
+
expect(BrDanfe::Ie.format(ie, "RJ")).to eq "12.345.67-8"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "when UF is RN" do
|
148
|
+
context "when IE have 9 digits" do
|
149
|
+
it "returns a formated ie" do
|
150
|
+
ie = "123456789"
|
151
|
+
expect(BrDanfe::Ie.format(ie, "RN")).to eq "12.345.678-9"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "when IE have 10 digits" do
|
156
|
+
it "eturns a formated ie" do
|
157
|
+
ie = "1234567890"
|
158
|
+
expect(BrDanfe::Ie.format(ie, "RN")).to eq "12.3.456.789-0"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when UF is RS" do
|
164
|
+
it "returns a formated ie" do
|
165
|
+
ie = "1234567890"
|
166
|
+
expect(BrDanfe::Ie.format(ie, "RS")).to eq "123/4567890"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
context "when UF is RO" do
|
171
|
+
context "when IE have 9 digits" do
|
172
|
+
it "returns a formated ie" do
|
173
|
+
ie = "123456789"
|
174
|
+
expect(BrDanfe::Ie.format(ie, "RO")).to eq "123.45678-9"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context "when IE have 14 digits" do
|
179
|
+
it "returns a formated ie" do
|
180
|
+
ie = "12345678901234"
|
181
|
+
expect(BrDanfe::Ie.format(ie, "RO")).to eq "1234567890123-4"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context "when UF is RR" do
|
187
|
+
it "returns a formated ie" do
|
188
|
+
ie = "123456789"
|
189
|
+
expect(BrDanfe::Ie.format(ie, "RR")).to eq "12345678-9"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "when UF is SC" do
|
194
|
+
it "returns a formated ie" do
|
195
|
+
ie = "123456789"
|
196
|
+
expect(BrDanfe::Ie.format(ie, "SC")).to eq "123.456.789"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context "when UF is SP" do
|
201
|
+
context "when IE have 12 digits" do
|
202
|
+
it "returns a formated ie" do
|
203
|
+
ie = "123456789012"
|
204
|
+
expect(BrDanfe::Ie.format(ie, "SP")).to eq "123.456.789.012"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context "when IE have 13 digits" do
|
209
|
+
it "returns a formated ie" do
|
210
|
+
ie = "A123456789012"
|
211
|
+
expect(BrDanfe::Ie.format(ie, "SP")).to eq "A-12345678.9/012"
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "when UF is SE" do
|
217
|
+
it "returns a formated ie" do
|
218
|
+
ie = "123456789"
|
219
|
+
expect(BrDanfe::Ie.format(ie, "SE")).to eq "12345678-9"
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "when UF is TO" do
|
224
|
+
it "returns a formated ie" do
|
225
|
+
ie = "12345678901"
|
226
|
+
expect(BrDanfe::Ie.format(ie, "TO")).to eq "12345678901"
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BrDanfe::Options do
|
4
|
+
it "should return default config set in code" do
|
5
|
+
options = BrDanfe::Options.new
|
6
|
+
expect(options.logo_path).to eq("")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return config set in params" do
|
10
|
+
options = BrDanfe::Options.new({"logo_path" => "/fake/path/file.png"})
|
11
|
+
expect(options.logo_path).to eq("/fake/path/file.png")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BrDanfe::Phone do
|
4
|
+
describe ".format" do
|
5
|
+
context "when phone have 10 digits" do
|
6
|
+
it "returns a formated phone" do
|
7
|
+
phone = "1234567890"
|
8
|
+
expect(BrDanfe::Phone.format(phone)).to eq "(12) 3456-7890"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when phone have 11 digits" do
|
13
|
+
it "returns a formated phone" do
|
14
|
+
phone = "12345678901"
|
15
|
+
expect(BrDanfe::Phone.format(phone)).to eq "(12) 34567-8901"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BrDanfe do
|
4
|
+
let(:base_dir) { "./spec/fixtures/"}
|
5
|
+
let(:output_pdf) { "#{base_dir}output.pdf" }
|
6
|
+
|
7
|
+
before { File.delete(output_pdf) if File.exist?(output_pdf) }
|
8
|
+
|
9
|
+
describe ".generate" do
|
10
|
+
it "saves the PDF document to file based on a xml file" do
|
11
|
+
expect(File.exist?(output_pdf)).to be_false
|
12
|
+
|
13
|
+
BrDanfe.generate(output_pdf, "#{base_dir}nfe_with_ns.xml")
|
14
|
+
|
15
|
+
expect("#{base_dir}nfe_with_ns.xml.fixture.pdf").to be_same_file_as(output_pdf)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".render" do
|
20
|
+
it "renders the PDF document to string based on a xml string" do
|
21
|
+
xml_string = File.new("#{base_dir}nfe_with_ns.xml")
|
22
|
+
|
23
|
+
pdf_string = BrDanfe.render(xml_string)
|
24
|
+
|
25
|
+
expect(pdf_string).to include "%PDF-1.3\n%"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".render_file" do
|
30
|
+
it "renders the PDF document to file based on a xml string" do
|
31
|
+
expect(File.exist?(output_pdf)).to be_false
|
32
|
+
|
33
|
+
xml_string = File.new("#{base_dir}nfe_with_ns.xml")
|
34
|
+
|
35
|
+
BrDanfe.render_file(output_pdf, xml_string)
|
36
|
+
|
37
|
+
expect("#{base_dir}nfe_with_ns.xml.fixture.pdf").to be_same_file_as(output_pdf)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe BrDanfe::Xprod do
|
6
|
+
let(:xml_fci) do
|
7
|
+
xml = <<-eos
|
8
|
+
<det nItem="1">
|
9
|
+
<prod>
|
10
|
+
<xProd>MONITOR DE ARCO ELETRICO</xProd>
|
11
|
+
<nFCI>12232531-74B2-4FDD-87A6-CF0AD3E55386</nFCI>
|
12
|
+
</prod>
|
13
|
+
</det>
|
14
|
+
eos
|
15
|
+
|
16
|
+
Nokogiri::XML(xml)
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:xml_st) do
|
20
|
+
xml = <<-eos
|
21
|
+
<det nItem="1">
|
22
|
+
<prod>
|
23
|
+
<xProd>MONITOR DE ARCO ELETRICO</xProd>
|
24
|
+
</prod>
|
25
|
+
<imposto>
|
26
|
+
<vTotTrib>96.73</vTotTrib>
|
27
|
+
<ICMS>
|
28
|
+
<ICMSSN202>
|
29
|
+
<pMVAST>56.00</pMVAST>
|
30
|
+
<vBCST>479.82</vBCST>
|
31
|
+
<pICMSST>17.00</pICMSST>
|
32
|
+
<vICMSST>29.28</vICMSST>
|
33
|
+
</ICMSSN202>
|
34
|
+
</ICMS>
|
35
|
+
</imposto>
|
36
|
+
</det>
|
37
|
+
eos
|
38
|
+
|
39
|
+
Nokogiri::XML(xml)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:xml_infAdProd) do
|
43
|
+
xml = <<-eos
|
44
|
+
<det nItem="1">
|
45
|
+
<prod>
|
46
|
+
<xProd>MONITOR DE ARCO ELETRICO</xProd>
|
47
|
+
</prod>
|
48
|
+
<infAdProd>Informações adicionais do produto</infAdProd>
|
49
|
+
</det>
|
50
|
+
eos
|
51
|
+
|
52
|
+
Nokogiri::XML(xml)
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:xml_IFC_ST_infAdProd) do
|
56
|
+
xml = <<-eos
|
57
|
+
<det nItem="1">
|
58
|
+
<prod>
|
59
|
+
<xProd>MONITOR DE ARCO ELETRICO</xProd>
|
60
|
+
<nFCI>12232531-74B2-4FDD-87A6-CF0AD3E55386</nFCI>
|
61
|
+
</prod>
|
62
|
+
<imposto>
|
63
|
+
<vTotTrib>96.73</vTotTrib>
|
64
|
+
<ICMS>
|
65
|
+
<ICMSSN202>
|
66
|
+
<pMVAST>56.00</pMVAST>
|
67
|
+
<vBCST>479.82</vBCST>
|
68
|
+
<pICMSST>17.00</pICMSST>
|
69
|
+
<vICMSST>29.28</vICMSST>
|
70
|
+
</ICMSSN202>
|
71
|
+
</ICMS>
|
72
|
+
</imposto>
|
73
|
+
<infAdProd>Informações adicionais do produto</infAdProd>
|
74
|
+
</det>
|
75
|
+
eos
|
76
|
+
|
77
|
+
Nokogiri::XML(xml)
|
78
|
+
end
|
79
|
+
|
80
|
+
describe ".generate" do
|
81
|
+
context "when have FCI" do
|
82
|
+
it "returns product + FCI" do
|
83
|
+
expected = "MONITOR DE ARCO ELETRICO"
|
84
|
+
expected += "\n"
|
85
|
+
expected +="FCI: 12232531-74B2-4FDD-87A6-CF0AD3E55386"
|
86
|
+
expect(BrDanfe::Xprod.generate(xml_fci)).to eq expected
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when have ST" do
|
91
|
+
it "returns product + ST" do
|
92
|
+
expected = "MONITOR DE ARCO ELETRICO"
|
93
|
+
expected += "\n"
|
94
|
+
expected += "ST: MVA: 56.00% * Alíq: 17.00% * BC: 479.82 * Vlr: 29.28"
|
95
|
+
|
96
|
+
expect(BrDanfe::Xprod.generate(xml_st)).to eq expected
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when have infAdProd" do
|
101
|
+
it "returns product + infAdProd" do
|
102
|
+
expected = "MONITOR DE ARCO ELETRICO"
|
103
|
+
expected += "\n"
|
104
|
+
expected += "Informações adicionais do produto"
|
105
|
+
|
106
|
+
expect(BrDanfe::Xprod.generate(xml_infAdProd)).to eq expected
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when have FCI + ST + infAdProd" do
|
111
|
+
it "returns product + FCI + ST + infAdProd" do
|
112
|
+
expected = "MONITOR DE ARCO ELETRICO"
|
113
|
+
expected += "\n"
|
114
|
+
expected += "Informações adicionais do produto"
|
115
|
+
expected += "\n"
|
116
|
+
expected +="FCI: 12232531-74B2-4FDD-87A6-CF0AD3E55386"
|
117
|
+
expected += "\n"
|
118
|
+
expected += "ST: MVA: 56.00% * Alíq: 17.00% * BC: 479.82 * Vlr: 29.28"
|
119
|
+
|
120
|
+
expect(BrDanfe::Xprod.generate(xml_IFC_ST_infAdProd)).to eq expected
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
SimpleCov.start
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "br_danfe"
|
6
|
+
|
7
|
+
Bundler.require(:default, :development)
|
8
|
+
Dir[File.dirname(__FILE__) + "/support/*.rb"].each { |f| require f }
|
9
|
+
I18n.locale = "pt-BR";
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.expect_with :rspec do |c|
|
13
|
+
c.syntax = :expect
|
14
|
+
end
|
15
|
+
|
16
|
+
config.order = "random"
|
17
|
+
end
|