dfe-taxweb 0.1.0

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.
@@ -0,0 +1,3 @@
1
+ module DfeTaxweb
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,71 @@
1
+ require "spec_helper"
2
+
3
+ describe DfeTaxweb::Conjunto do
4
+ subject {described_class.new({fake: true})}
5
+
6
+ describe "#initialize" do
7
+ it "atribui o hash informado como conjunto" do
8
+ expect(subject.conjunto).to eq({fake: true})
9
+ end
10
+ end
11
+
12
+ describe "#to_h" do
13
+ it "retorna o conjunto informado como hash" do
14
+ expect(subject.to_h).to eq(subject.conjunto)
15
+ end
16
+ end
17
+
18
+ describe "#[]" do
19
+ it "retorna o item do conjunto pela chave" do
20
+ expect(subject[:fake]).to eq(true)
21
+ end
22
+ end
23
+
24
+ describe "#atributo" do
25
+ it "retorna um objeto quando o caminho indica um hash" do
26
+ expect(subject).to receive(:conjunto).and_return({a: {b: 1}})
27
+ expect(subject.atributo('a')).to be_a(DfeTaxweb::Conjunto)
28
+ end
29
+ it "retorna uma array de objeto quando o caminho indica uma array" do
30
+ expect(subject).to receive(:conjunto).and_return({a: {b: [{c: 1}]}})
31
+ atributo = subject.atributo('a.b')
32
+ expect(atributo).to be_a(Array)
33
+ expect(atributo.first).to be_a(DfeTaxweb::Conjunto)
34
+ end
35
+ it "retorna o atributo do conjunto pelo caminho" do
36
+ expect(subject).to receive(:conjunto).and_return({a: {b: 1}})
37
+ expect(subject.atributo('a.b')).to eq(1)
38
+ end
39
+ it "retorna o atributo do conjunto pelo caminho mesmo com array" do
40
+ expect(subject).to receive(:conjunto).and_return({a: {b: [{c: 1}]}})
41
+ expect(subject.atributo('a.b[0].c')).to eq(1)
42
+ end
43
+ it "retorna nil para caminho inválido" do
44
+ expect(subject).to receive(:conjunto).and_return({a: {b: 1}})
45
+ expect(subject.atributo('a.c')).to be_nil
46
+ end
47
+ end
48
+
49
+ describe "#atualizar" do
50
+ let(:conjunto_obj){described_class.new({a: :b, c: :d})}
51
+ it "faz um merge do hash informado com o hash do conjunto" do
52
+ conjunto_obj.atualizar({a: :z})
53
+ expect(conjunto_obj.conjunto).to eq({a: :z, c: :d})
54
+ end
55
+ it "retorna o proprio objeto possibilitando method chain" do
56
+ conjunto_obj.atualizar(a: 1).atualizar(a: 2)
57
+ expect(conjunto_obj.conjunto).to eq({a: 2, c: :d})
58
+ end
59
+ end
60
+
61
+ describe "#normaliza_valores" do
62
+ it "retorna uma nova instancia do conjunto caso o valor informado seja um Hash" do
63
+ expect(subject.send(:normaliza_valores, {teste: true})).to be_a(DfeTaxweb::Conjunto)
64
+ end
65
+ it "retorna o valor informado caso ele não seja um hash" do
66
+ expect(subject.send(:normaliza_valores, 'teste')).to eq('teste')
67
+ end
68
+ end
69
+
70
+
71
+ end
@@ -0,0 +1,560 @@
1
+ require "spec_helper"
2
+
3
+ describe DfeTaxweb::Nfe do
4
+ # let(:nfe_xml_string) {File.read("spec/fixtures/files/nfe.xml")}
5
+ subject {described_class.new('<xml></xml>')}
6
+
7
+ describe "#initialize" do
8
+ it "requer o envio de 1 parametro" do
9
+ expect{described_class.new}.to raise_error(ArgumentError)
10
+ end
11
+ it "requer o parametro como sendo hash ou xml_string" do
12
+ expect(described_class.new({fake: true})).to be_a(DfeTaxweb::Nfe)
13
+ expect(described_class.new('<xml></xml>')).to be_a(DfeTaxweb::Nfe)
14
+ end
15
+ it "retorna TypeError caso o parametro não seja Hash ou XmlString" do
16
+ expect{described_class.new([])}.to raise_error(TypeError)
17
+ expect{described_class.new('')}.to raise_error(TypeError)
18
+ expect{described_class.new(1)}.to raise_error(TypeError)
19
+ expect{described_class.new(Object.new)}.to raise_error(TypeError)
20
+ end
21
+ end
22
+
23
+ describe "#to_dfe" do
24
+ it "atribui o mapeamento do documento" do
25
+ expect(subject).to receive(:mapear_documento).and_return({})
26
+ expect(subject.to_dfe).to be_a(Hash)
27
+ end
28
+ end
29
+
30
+ describe "#mapear_documento" do
31
+ it "retorna o hash do documento fiscal mapeado com os valores da nfe" do
32
+ expect(subject).to receive(:data_de_emissao).and_return(nil)
33
+ expect(subject).to receive(:tipo_de_operacao).and_return(nil)
34
+ expect(subject).to receive(:emitente).and_return({})
35
+ expect(subject).to receive(:destinatario).and_return({})
36
+ expect(subject).to receive(:retirada).and_return({})
37
+ expect(subject).to receive(:entrega).and_return({})
38
+ expect(subject).to receive(:itens).and_return([])
39
+ documento = subject.mapear_documento
40
+ expect(documento).to be_a(Hash)
41
+ expect(documento.keys.sort).to eq([:destinatario, :emitente, :entrega, :itensDocFiscal, :naturezaOperacao, :retirada, :tpDocFiscal].sort)
42
+ end
43
+ end
44
+
45
+ describe "#emitente" do
46
+ it "retorna o hash de emitente" do
47
+ expect(subject).to receive(:endereco).and_return({})
48
+ expect(subject.emitente.keys.sort).to eq([:contribuinteCOFINS, :contribuinteICMS, :contribuinteII, :contribuinteISS, :contribuintePIS, :contribuinteST, :simplesNac].sort)
49
+ end
50
+ end
51
+
52
+ describe "#destinatario" do
53
+ it "retorna o hash de destinatario" do
54
+ expect(subject).to receive(:endereco).and_return({})
55
+ expect(subject.destinatario.keys.sort).to eq([:contribuinteCOFINS, :contribuinteICMS, :contribuinteII, :contribuintePIS].sort)
56
+ end
57
+ end
58
+
59
+ describe "#endereco" do
60
+ it "retorna o hash dos dados do endereço quando informado um hash válido" do
61
+ fake_hash = DfeTaxweb::Conjunto.new({fake: true})
62
+ expect(subject).to receive(:codigo_pais).and_return('')
63
+ expect(subject.endereco(fake_hash).keys.sort).to eq([:cdPais].sort)
64
+ end
65
+ it "retorna {} quando não é informado um endereço válido" do
66
+ expect(subject.endereco({})).to eq({})
67
+ expect(subject.endereco(nil)).to eq({})
68
+ end
69
+ end
70
+
71
+ describe "#retirada" do
72
+ it "retorna o hash de retirada" do
73
+ expect(subject).to receive_message_chain(:inf_nfe).and_return(DfeTaxweb::Conjunto.new({retirada: {fake: true}}))
74
+ expect(subject.retirada).to be_a(DfeTaxweb::Conjunto)
75
+ end
76
+ it "retorna nil quando não há retirada" do
77
+ expect(subject.retirada).to be_nil
78
+ end
79
+ end
80
+
81
+ describe "#entrega" do
82
+ it "retorna o hash de entrega" do
83
+ expect(subject).to receive(:inf_nfe).and_return(DfeTaxweb::Conjunto.new({entrega: {fake: true}}))
84
+ expect(subject.entrega).to be_a(DfeTaxweb::Conjunto)
85
+ end
86
+ it "retorna nil quando não há entrega" do
87
+ expect(subject.retirada).to be_nil
88
+ end
89
+ end
90
+
91
+ describe "#itens" do
92
+ it "retorna o hash de entrega" do
93
+ expect(subject).to receive(:inf_nfe).and_return(DfeTaxweb::Conjunto.new({det: [{prod: {fake: true}}]}))
94
+ expect(subject).to receive(:cst_icms_do_item).and_return(true)
95
+ expect(subject).to receive(:cst_ipi_do_item).and_return(true)
96
+ expect(subject).to receive(:cst_pis_do_item).and_return(true)
97
+ expect(subject).to receive(:cst_cofins_do_item).and_return(true)
98
+ expect(subject).to receive(:quantidade_tributaria_do_item).and_return(true)
99
+ expect(subject).to receive(:produto_do_item).and_return({})
100
+ expect(subject).to receive(:enquadramentos_do_item).and_return([])
101
+ itens = subject.itens
102
+ expect(itens).to be_a(Array)
103
+ item = itens.first
104
+ expect(item).to be_a(Hash)
105
+ expect(item[:cdClassificacao]).to eq('M')
106
+ end
107
+ it "retorna array vazia quando não há itens" do
108
+ expect(subject).to receive(:inf_nfe).and_return(DfeTaxweb::Conjunto.new({det: []}))
109
+ expect(subject.itens).to eq([])
110
+ end
111
+ end
112
+
113
+ describe "#produto_do_item" do
114
+ it "retorna os atributos do produto do item informado" do
115
+ item = DfeTaxweb::Conjunto.new({prod: {fake: true}})
116
+ expect(subject.produto_do_item(item).keys.sort).to eq([:aplicacao].sort)
117
+ end
118
+ it "retorna {} quando não produto no item" do
119
+ item = DfeTaxweb::Conjunto.new({prod: {}})
120
+ expect(subject.produto_do_item(item)).to eq({})
121
+ end
122
+ end
123
+
124
+ describe "#icms_do_item" do
125
+ it "retorna o hash de informações do imposto ICMS" do
126
+ ['ICMS00', 'ICMS10', 'ICMS20', 'ICMS30', 'ICMS40', 'ICMS51', 'ICMS60', 'ICMS70', 'ICMS90'].each do |tipo|
127
+ item = DfeTaxweb::Conjunto.new({imposto: {ICMS: {tipo => {fake: true}}}})
128
+ imposto = subject.icms_do_item(item)
129
+ expect(imposto).to be_a(DfeTaxweb::Conjunto)
130
+ expect(imposto.atributo('tipo')).to eq(tipo)
131
+ end
132
+ end
133
+ it "retorna nil quando o icms não existe" do
134
+ item = DfeTaxweb::Conjunto.new({imposto: {ICMS: {:ICMSFAKE => {fake: true}}}})
135
+ expect(subject.icms_do_item(item)).to be_nil
136
+ end
137
+ end
138
+
139
+ describe "#ipi_do_item" do
140
+ it "retorna o hash de informações do imposto IPI" do
141
+ ['IPINT', 'IPITrib'].each do |tipo|
142
+ item = DfeTaxweb::Conjunto.new({imposto: {IPI: {tipo => {fake: true}}}})
143
+ imposto = subject.ipi_do_item(item)
144
+ expect(imposto).to be_a(DfeTaxweb::Conjunto)
145
+ expect(imposto.atributo('tipo')).to eq(tipo)
146
+ end
147
+ end
148
+ it "retorna apenas os dados básicos do IPI, caso subgrupo não exista" do
149
+ item = DfeTaxweb::Conjunto.new({imposto: {IPI: {:IPIFAKE => {fake: true}}}})
150
+ imposto = subject.ipi_do_item(item)
151
+ expect(imposto).to be_a(DfeTaxweb::Conjunto)
152
+ expect(imposto.atributo('tipo')).to be_nil
153
+ end
154
+ end
155
+
156
+ describe "#pis_do_item" do
157
+ it "retorna o hash de informações do imposto ICMS" do
158
+ ['PISNT', 'PISAliq', 'PISQtde', 'PISOutr'].each do |tipo|
159
+ item = DfeTaxweb::Conjunto.new({imposto: {PIS: {tipo => {fake: true}}}})
160
+ imposto = subject.pis_do_item(item)
161
+ expect(imposto).to be_a(DfeTaxweb::Conjunto)
162
+ expect(imposto.atributo('tipo')).to eq(tipo)
163
+ end
164
+ end
165
+ it "retorna nil quando o icms não existe" do
166
+ item = DfeTaxweb::Conjunto.new({imposto: {PIS: {:PISFAKE => {fake: true}}}})
167
+ expect(subject.pis_do_item(item)).to be_nil
168
+ end
169
+ end
170
+
171
+ describe "#cofins_do_item" do
172
+ it "retorna o hash de informações do imposto ICMS" do
173
+ ['COFINSAliq', 'COFINSQtde', 'COFINSNT', 'COFINSOutr'].each do |tipo|
174
+ item = DfeTaxweb::Conjunto.new({imposto: {COFINS: {tipo => {fake: true}}}})
175
+ imposto = subject.cofins_do_item(item)
176
+ expect(imposto).to be_a(DfeTaxweb::Conjunto)
177
+ expect(imposto.atributo('tipo')).to eq(tipo)
178
+ end
179
+ end
180
+ it "retorna nil quando o icms não existe" do
181
+ item = DfeTaxweb::Conjunto.new({imposto: {COFINS: {:COFINSFAKE => {fake: true}}}})
182
+ expect(subject.cofins_do_item(item)).to be_nil
183
+ end
184
+ end
185
+
186
+ describe "#enquadramentos_do_item" do
187
+ it "retorna um array com os impostos para enquadramento do item" do
188
+ expect(subject).to receive(:enquadramento_icms).and_return(true)
189
+ expect(subject).to receive(:enquadramento_icmsst).and_return(true)
190
+ expect(subject).to receive(:enquadramento_icmsste).and_return(true)
191
+ expect(subject).to receive(:enquadramento_ipi).and_return(true)
192
+ expect(subject).to receive(:enquadramento_ii).and_return(true)
193
+ expect(subject).to receive(:enquadramento_pis).and_return(true)
194
+ expect(subject).to receive(:enquadramento_pisst).and_return(true)
195
+ expect(subject).to receive(:enquadramento_cofins).and_return(true)
196
+ expect(subject).to receive(:enquadramento_cofinsst).and_return(true)
197
+ expect(subject.enquadramentos_do_item(nil).size).to eq(10)
198
+ end
199
+ end
200
+
201
+ describe "#enquadramento_icms" do
202
+ it "retorna hash com os atributos documento fiscal do icms" do
203
+ expect(subject).to receive(:situacao_do_icms_cst).exactly(7).and_return(true)
204
+ ['ICMS00', 'ICMS10', 'ICMS20', 'ICMS40', 'ICMS51', 'ICMS70', 'ICMS90'].each do |tipo|
205
+ item = DfeTaxweb::Conjunto.new({tipo: tipo})
206
+ enquadramento = subject.enquadramento_icms(item)
207
+ expect(enquadramento).to be_a(Hash)
208
+ expect(enquadramento[:dsSigla]).to eq('ICMS')
209
+ end
210
+ end
211
+ it "retorna nil caso o item não exista ou não seja um dos grupos de icms esperados" do
212
+ item = DfeTaxweb::Conjunto.new({tipo: :fake})
213
+ expect(subject.enquadramento_icms(nil)).to be_nil
214
+ expect(subject.enquadramento_icms(item)).to be_nil
215
+ end
216
+ end
217
+
218
+ describe "#enquadramento_icmsst" do
219
+ it "retorna hash com os atributos documento fiscal do icmsst" do
220
+ expect(subject).to receive(:situacao_do_icms_cst).exactly(4).and_return(true)
221
+ ['ICMS10', 'ICMS30', 'ICMS70', 'ICMS90'].each do |tipo|
222
+ item = DfeTaxweb::Conjunto.new({tipo: tipo})
223
+ enquadramento = subject.enquadramento_icmsst(item)
224
+ expect(enquadramento).to be_a(Hash)
225
+ expect(enquadramento[:dsSigla]).to eq('ST')
226
+ end
227
+ end
228
+ it "retorna nil caso o item não exista ou não seja um dos grupos de icmsst esperados" do
229
+ item = DfeTaxweb::Conjunto.new({tipo: :fake})
230
+ expect(subject.enquadramento_icmsst(nil)).to be_nil
231
+ expect(subject.enquadramento_icmsst(item)).to be_nil
232
+ end
233
+ end
234
+
235
+ describe "#enquadramento_icmsste" do
236
+ it "retorna hash com os atributos documento fiscal do icmsste" do
237
+ expect(subject).to receive(:situacao_do_icms_cst).exactly(1).and_return(true)
238
+ ['ICMS60'].each do |tipo|
239
+ item = DfeTaxweb::Conjunto.new({tipo: tipo})
240
+ enquadramento = subject.enquadramento_icmsste(item)
241
+ expect(enquadramento).to be_a(Hash)
242
+ expect(enquadramento[:dsSigla]).to eq('STE')
243
+ end
244
+ end
245
+ it "retorna nil caso o item não exista ou não seja um dos grupos de icmsste esperados" do
246
+ item = DfeTaxweb::Conjunto.new({tipo: :fake})
247
+ expect(subject.enquadramento_icmsste(nil)).to be_nil
248
+ expect(subject.enquadramento_icmsste(item)).to be_nil
249
+ end
250
+ end
251
+
252
+ describe "#enquadramento_ipi" do
253
+ it "retorna hash com os atributos documento fiscal do ipi" do
254
+ item = DfeTaxweb::Conjunto.new({fake: true})
255
+ enquadramento = subject.enquadramento_ipi(item)
256
+ expect(enquadramento).to be_a(Hash)
257
+ expect(enquadramento[:dsSigla]).to eq('IPI')
258
+ end
259
+ it "retorna nil caso o item do ipi seja enviado em branco" do
260
+ expect(subject.enquadramento_icmsste(nil)).to be_nil
261
+ expect(subject.enquadramento_icmsste({})).to be_nil
262
+ end
263
+ end
264
+
265
+ describe "#enquadramento_ii" do
266
+ it "retorna hash com os atributos documento fiscal do ii" do
267
+ item = DfeTaxweb::Conjunto.new({vII: 1})
268
+ enquadramento = subject.enquadramento_ii(item)
269
+ expect(enquadramento).to be_a(Hash)
270
+ expect(enquadramento[:dsSigla]).to eq('II')
271
+ end
272
+ it "retorna nil caso o item ii seja enviado em branco ou o atributo VII seja menor ou igual a zero" do
273
+ item = DfeTaxweb::Conjunto.new({vII: 0})
274
+ expect(subject.enquadramento_ii(nil)).to be_nil
275
+ expect(subject.enquadramento_ii({})).to be_nil
276
+ expect(subject.enquadramento_ii(item)).to be_nil
277
+ end
278
+ end
279
+
280
+ describe "#enquadramento_pis" do
281
+ it "retorna hash com os atributos documento fiscal do pis" do
282
+ item = DfeTaxweb::Conjunto.new({fake: true})
283
+ enquadramento = subject.enquadramento_pis(item)
284
+ expect(enquadramento).to be_a(Hash)
285
+ expect(enquadramento[:dsSigla]).to eq('PIS')
286
+ end
287
+ it "retorna nil caso o item pis seja enviado em branco" do
288
+ expect(subject.enquadramento_pis(nil)).to be_nil
289
+ expect(subject.enquadramento_pis({})).to be_nil
290
+ end
291
+ end
292
+
293
+ describe "#enquadramento_pisst" do
294
+ it "retorna hash com os atributos documento fiscal do pisst" do
295
+ item = DfeTaxweb::Conjunto.new({fake: true})
296
+ enquadramento = subject.enquadramento_pisst(item)
297
+ expect(enquadramento).to be_a(Hash)
298
+ expect(enquadramento[:dsSigla]).to eq('PISST')
299
+ end
300
+ it "retorna nil caso o item pisst seja enviado em branco" do
301
+ expect(subject.enquadramento_pisst(nil)).to be_nil
302
+ expect(subject.enquadramento_pisst({})).to be_nil
303
+ end
304
+ end
305
+
306
+ describe "#enquadramento_cofins" do
307
+ it "retorna hash com os atributos documento fiscal do cofins" do
308
+ item = DfeTaxweb::Conjunto.new({fake: true})
309
+ enquadramento = subject.enquadramento_cofins(item)
310
+ expect(enquadramento).to be_a(Hash)
311
+ expect(enquadramento[:dsSigla]).to eq('COFINS')
312
+ expect(enquadramento[:situacao]).to eq('T')
313
+ end
314
+ it "retorna situacao N caso o tipo seja COFINSNT" do
315
+ item = DfeTaxweb::Conjunto.new({tipo: 'COFINSNT'})
316
+ enquadramento = subject.enquadramento_cofins(item)
317
+ expect(enquadramento[:situacao]).to eq('N')
318
+ end
319
+ it "retorna nil caso o item pisst seja enviado em branco" do
320
+ expect(subject.enquadramento_cofins(nil)).to be_nil
321
+ expect(subject.enquadramento_cofins({})).to be_nil
322
+ end
323
+ end
324
+
325
+ describe "#enquadramento_cofinsst" do
326
+ it "retorna hash com os atributos documento fiscal do cofinsst" do
327
+ item = DfeTaxweb::Conjunto.new({fake: true})
328
+ enquadramento = subject.enquadramento_cofinsst(item)
329
+ expect(enquadramento).to be_a(Hash)
330
+ expect(enquadramento[:dsSigla]).to eq('COFINSST')
331
+ end
332
+ it "retorna nil caso o item cofinsst seja enviado em branco" do
333
+ expect(subject.enquadramento_cofinsst(nil)).to be_nil
334
+ expect(subject.enquadramento_cofinsst({})).to be_nil
335
+ end
336
+ end
337
+
338
+ describe "#data_de_emissao" do
339
+ let(:inf_nfe) {DfeTaxweb::Conjunto.new({ide: {dEmi: nil, dhEmi: nil}})}
340
+ it "retorna data de emissão dEmi" do
341
+ expect(subject).to receive(:inf_nfe).and_return(inf_nfe)
342
+ expect(inf_nfe).to receive(:atributo).with('ide.dEmi').and_return(1)
343
+ expect(subject.data_de_emissao).to eq(1)
344
+ end
345
+ it "retorna data de emissão dhEmi caso dEmi não exista" do
346
+ expect(subject).to receive(:inf_nfe).twice.and_return(inf_nfe)
347
+ expect(inf_nfe).to receive(:atributo).with('ide.dEmi').and_return(nil)
348
+ expect(inf_nfe).to receive(:atributo).with('ide.dhEmi').and_return(2)
349
+ expect(subject.data_de_emissao).to eq(2)
350
+ end
351
+ end
352
+
353
+ describe "#tipo_de_operacao" do
354
+ let(:inf_nfe) {DfeTaxweb::Conjunto.new({emit: {UF: nil}, dest: {UF: nil}})}
355
+ before(:each) {expect(subject).to receive(:inf_nfe).twice.and_return(inf_nfe)}
356
+ it "retorna E caso UF do emitente seja igual a UF do destinatário" do
357
+ expect(inf_nfe).to receive(:atributo).with('emit.UF').and_return('SP')
358
+ expect(inf_nfe).to receive(:atributo).with('dest.UF').and_return('SP')
359
+ expect(subject.tipo_de_operacao).to eq('E')
360
+ end
361
+ it "retorna I caso UF do emitente seja diferente da UF do destinatário" do
362
+ expect(inf_nfe).to receive(:atributo).with('emit.UF').and_return('SP')
363
+ expect(inf_nfe).to receive(:atributo).with('dest.UF').and_return('RJ')
364
+ expect(subject.tipo_de_operacao).to eq('I')
365
+ end
366
+ it "retorna nil caso a UF do emitente ou a UF do destinatário não tenha sido informada" do
367
+ expect(inf_nfe).to receive(:atributo).with('emit.UF').and_return('SP')
368
+ expect(inf_nfe).to receive(:atributo).with('dest.UF').and_return(nil)
369
+ expect(subject.tipo_de_operacao).to be_nil
370
+ end
371
+ end
372
+
373
+ describe "#codigo_pais" do
374
+ it "retorna 105 caso o código do país seja nil ou 1058" do
375
+ expect(subject.codigo_pais(nil)).to eq('105')
376
+ expect(subject.codigo_pais('1058')).to eq('105')
377
+ end
378
+ it "retorna o valor informado quando diferentes de nil e 1058" do
379
+ expect(subject.codigo_pais('0000')).to eq('0000')
380
+ end
381
+ end
382
+
383
+
384
+ describe "#origem_do_produto" do
385
+ it "retorna a origem do produto do ipi possua o atributo orig" do
386
+ expect(subject).to receive_message_chain(:ipi_do_item, :atributo).and_return(1)
387
+ expect(subject.origem_do_produto({})).to eq(1)
388
+ end
389
+ it "retorna a orig do produto do icms caso não possua a orig no ipi" do
390
+ expect(subject).to receive_message_chain(:ipi_do_item, :atributo).and_return(nil)
391
+ expect(subject).to receive_message_chain(:icms_do_item, :atributo).and_return(2)
392
+ expect(subject.origem_do_produto({})).to eq(2)
393
+ end
394
+ it "retorna nil caso não tenha orig no ipi e nem no icms" do
395
+ expect(subject).to receive_message_chain(:ipi_do_item, :atributo).and_return(nil)
396
+ expect(subject).to receive_message_chain(:icms_do_item, :atributo).and_return(nil)
397
+ expect(subject.origem_do_produto({})).to be_nil
398
+ end
399
+ end
400
+
401
+ describe "#cst_icms_do_item" do
402
+ let(:icms_do_item){Hash.new}
403
+ it "retorna os atributos orig e CST concatenados caso ambos existam" do
404
+ expect(subject).to receive(:icms_do_item).and_return(icms_do_item)
405
+ expect(icms_do_item).to receive(:atributo).with('orig').and_return("A")
406
+ expect(icms_do_item).to receive(:atributo).with('CST').and_return("B")
407
+ expect(subject.cst_icms_do_item(icms_do_item)).to eq('AB')
408
+ end
409
+ it "retorna o atributo orig caso não haja CST" do
410
+ expect(subject).to receive(:icms_do_item).and_return(icms_do_item)
411
+ expect(icms_do_item).to receive(:atributo).with('orig').and_return("A")
412
+ expect(icms_do_item).to receive(:atributo).with('CST').and_return(nil)
413
+ expect(subject.cst_icms_do_item(icms_do_item)).to eq('A')
414
+ end
415
+ it "retorna o atributo CST caso orig" do
416
+ expect(subject).to receive(:icms_do_item).and_return(icms_do_item)
417
+ expect(icms_do_item).to receive(:atributo).with('orig').and_return(nil)
418
+ expect(icms_do_item).to receive(:atributo).with('CST').and_return("B")
419
+ expect(subject.cst_icms_do_item(icms_do_item)).to eq('B')
420
+ end
421
+ it "retorna nil caso não haja CST nem orig" do
422
+ expect(subject).to receive(:icms_do_item).and_return(icms_do_item)
423
+ expect(icms_do_item).to receive(:atributo).with('orig').and_return(nil)
424
+ expect(icms_do_item).to receive(:atributo).with('CST').and_return(nil)
425
+ expect(subject.cst_icms_do_item(icms_do_item)).to be_nil
426
+ end
427
+ end
428
+
429
+ describe "#cst_ipi_do_item" do
430
+ let(:ipi_do_item){Hash.new}
431
+ it "retorna o CST do IPI" do
432
+ expect(subject).to receive(:ipi_do_item).and_return(ipi_do_item)
433
+ expect(ipi_do_item).to receive(:atributo).with('CST').and_return("A")
434
+ expect(subject.cst_ipi_do_item(ipi_do_item)).to eq('A')
435
+ end
436
+ it "retorna nil caso não haja CST no IPI" do
437
+ expect(subject).to receive(:ipi_do_item).and_return(ipi_do_item)
438
+ expect(ipi_do_item).to receive(:atributo).with('CST').and_return(nil)
439
+ expect(subject.cst_ipi_do_item(ipi_do_item)).to be_nil
440
+ end
441
+ end
442
+
443
+ describe "#cst_pis_do_item" do
444
+ let(:pis_do_item){Hash.new}
445
+ it "retorna o CST do PIS" do
446
+ expect(subject).to receive(:pis_do_item).and_return(pis_do_item)
447
+ expect(pis_do_item).to receive(:atributo).with('CST').and_return("A")
448
+ expect(subject.cst_pis_do_item(pis_do_item)).to eq('A')
449
+ end
450
+ it "retorna nil caso não haja CST no PIS" do
451
+ expect(subject).to receive(:pis_do_item).and_return(pis_do_item)
452
+ expect(pis_do_item).to receive(:atributo).with('CST').and_return(nil)
453
+ expect(subject.cst_pis_do_item(pis_do_item)).to be_nil
454
+ end
455
+ end
456
+
457
+ describe "#cst_cofins_do_item" do
458
+ let(:cofins_do_item){Hash.new}
459
+ it "retorna o CST do COFINS" do
460
+ expect(subject).to receive(:cofins_do_item).and_return(cofins_do_item)
461
+ expect(cofins_do_item).to receive(:atributo).with('CST').and_return("A")
462
+ expect(subject.cst_cofins_do_item(cofins_do_item)).to eq('A')
463
+ end
464
+ it "retorna nil caso não haja CST no COFINS" do
465
+ expect(subject).to receive(:cofins_do_item).and_return(cofins_do_item)
466
+ expect(cofins_do_item).to receive(:atributo).with('CST').and_return(nil)
467
+ expect(subject.cst_cofins_do_item(cofins_do_item)).to be_nil
468
+ end
469
+ end
470
+
471
+ describe "#situacao_do_icms_cst" do
472
+ it "retorna I para cst igual a 40" do
473
+ expect(subject.situacao_do_icms_cst(40)).to eq('I')
474
+ end
475
+ it "retorna N para cst igual a 41" do
476
+ expect(subject.situacao_do_icms_cst(41)).to eq('N')
477
+ end
478
+ it "retorna S para cst igual a 50" do
479
+ expect(subject.situacao_do_icms_cst(50)).to eq('S')
480
+ end
481
+ it "retorna D para cst igual a 51" do
482
+ expect(subject.situacao_do_icms_cst(51)).to eq('D')
483
+ end
484
+ it "retorna T para qualquer outro cst não mencionado acima." do
485
+ expect(subject.situacao_do_icms_cst(99)).to eq('T')
486
+ end
487
+ it "retorna nil para cst enviado em branco." do
488
+ expect(subject.situacao_do_icms_cst('')).to be_nil
489
+ expect(subject.situacao_do_icms_cst(nil)).to be_nil
490
+ end
491
+ end
492
+
493
+ describe "#quantidade_tributaria_do_item" do
494
+ let(:item){Hash.new}
495
+ it "retorna o valor de imposto.COFINSST.qBCProd" do
496
+ expect(item).to receive(:atributo).with('imposto.COFINSST.qBCProd').and_return(1)
497
+ expect(subject.quantidade_tributaria_do_item(item)).to eq(1)
498
+ end
499
+ it "retorna o valor de imposto.COFINS.COFINSOutr.qBCProd caso não exista qBCProd em COFINSST" do
500
+ expect(item).to receive(:atributo).with('imposto.COFINSST.qBCProd').and_return(nil)
501
+ expect(item).to receive(:atributo).with('imposto.COFINS.COFINSOutr.qBCProd').and_return(2)
502
+ expect(subject.quantidade_tributaria_do_item(item)).to eq(2)
503
+ end
504
+ it "retorna o valor de imposto.PISST.qBCProd caso não exista qBCProd em COFINSST e COFINSOutr" do
505
+ expect(item).to receive(:atributo).with('imposto.COFINSST.qBCProd').and_return(nil)
506
+ expect(item).to receive(:atributo).with('imposto.COFINS.COFINSOutr.qBCProd').and_return(nil)
507
+ expect(item).to receive(:atributo).with('imposto.PISST.qBCProd').and_return(3)
508
+ expect(subject.quantidade_tributaria_do_item(item)).to eq(3)
509
+ end
510
+ it "retorna o valor de imposto.PIS.PISOutr.qBCProd caso não exista qBCProd em COFINSST, COFINSOutr e PISST" do
511
+ expect(item).to receive(:atributo).with('imposto.COFINSST.qBCProd').and_return(nil)
512
+ expect(item).to receive(:atributo).with('imposto.COFINS.COFINSOutr.qBCProd').and_return(nil)
513
+ expect(item).to receive(:atributo).with('imposto.PISST.qBCProd').and_return(nil)
514
+ expect(item).to receive(:atributo).with('imposto.PIS.PISOutr.qBCProd').and_return(4)
515
+ expect(subject.quantidade_tributaria_do_item(item)).to eq(4)
516
+ end
517
+ it "retorna o valor de prod.qTrib caso não exista qBCProd em COFINSST, COFINSOutr, PISST e PIS.PISOutr" do
518
+ expect(item).to receive(:atributo).with('imposto.COFINSST.qBCProd').and_return(nil)
519
+ expect(item).to receive(:atributo).with('imposto.COFINS.COFINSOutr.qBCProd').and_return(nil)
520
+ expect(item).to receive(:atributo).with('imposto.PISST.qBCProd').and_return(nil)
521
+ expect(item).to receive(:atributo).with('imposto.PIS.PISOutr.qBCProd').and_return(nil)
522
+ expect(item).to receive(:atributo).with('prod.qTrib').and_return(5)
523
+ expect(subject.quantidade_tributaria_do_item(item)).to eq(5)
524
+ end
525
+ it "retorna nil caso não exista qBCProd e qTrib informados" do
526
+ expect(item).to receive(:atributo).exactly(5).and_return(nil)
527
+ expect(subject.quantidade_tributaria_do_item(item)).to be_nil
528
+ end
529
+ end
530
+
531
+ describe "#inf_nfe" do
532
+ let(:nfe){Hash.new}
533
+ it "retorna o hash com os dados da nfeProc.NFe.infNFe" do
534
+ expect(subject).to receive(:nfe).exactly(1).and_return(nfe)
535
+ expect(nfe).to receive(:atributo).with('nfeProc.NFe.infNFe').and_return(1)
536
+ expect(subject.send :inf_nfe).to eq(1)
537
+ end
538
+ it "retorna o hash com os dados da NFe.infNFe caso nfeProc.NFe.infNFe não exista" do
539
+ expect(subject).to receive(:nfe).exactly(2).and_return(nfe)
540
+ expect(nfe).to receive(:atributo).with('nfeProc.NFe.infNFe').and_return(nil)
541
+ expect(nfe).to receive(:atributo).with('NFe.infNFe').and_return(2)
542
+ expect(subject.send :inf_nfe).to eq(2)
543
+ end
544
+ it "retorna o hash com os dados de infNFe caso NFe.infNFe e nfeProc.NFe.infNFe não existam" do
545
+ expect(subject).to receive(:nfe).exactly(3).and_return(nfe)
546
+ expect(nfe).to receive(:atributo).with('nfeProc.NFe.infNFe').and_return(nil)
547
+ expect(nfe).to receive(:atributo).with('NFe.infNFe').and_return(nil)
548
+ expect(nfe).to receive(:atributo).with('infNFe').and_return(3)
549
+ expect(subject.send :inf_nfe).to eq(3)
550
+ end
551
+ it "retorna a instancia do conjunto vazio caso infNFe não exista" do
552
+ expect(subject).to receive(:nfe).exactly(3).and_return(nfe)
553
+ expect(nfe).to receive(:atributo).exactly(3).and_return(nil)
554
+ inf_nfe = subject.send(:inf_nfe)
555
+ expect(inf_nfe).to be_a(DfeTaxweb::Conjunto)
556
+ expect(inf_nfe.to_h).to eq({})
557
+ end
558
+ end
559
+
560
+ end