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.
- checksums.yaml +7 -0
- data/lib/dfe-taxweb.rb +1 -0
- data/lib/dfe_taxweb.rb +14 -0
- data/lib/dfe_taxweb/conjunto.rb +72 -0
- data/lib/dfe_taxweb/nfe.rb +460 -0
- data/lib/dfe_taxweb/version.rb +3 -0
- data/spec/dfe_taxweb/conjunto_spec.rb +71 -0
- data/spec/dfe_taxweb/nfe_spec.rb +560 -0
- data/spec/dfe_taxweb_spec.rb +18 -0
- data/spec/fixtures/files/nfe.xml +1 -0
- data/spec/spec_helper.rb +25 -0
- metadata +122 -0
@@ -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
|