sefaz 0.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +115 -0
  3. data/Gemfile.lock +31 -17
  4. data/README.md +449 -17
  5. data/Rakefile +1 -0
  6. data/docs/CFe-SAT/Especificacao_SAT_v_ER_2_30_03.pdf +0 -0
  7. data/docs/CFe-SAT/Manual_Orientacao_SAT_v_MO_2_19_04.pdf +0 -0
  8. data/docs/CFe-SAT/Manual_do_Emulador_SAT-CF-e_Offline_2015_09_10.pdf +0 -0
  9. data/docs/CFe-SAT/_CANCEL_dataset.md +14 -0
  10. data/docs/CFe-SAT/_SALE_dataset.md +171 -0
  11. data/docs/CFe-SAT/emulador_off_line_v2_9_4.zip +0 -0
  12. data/docs/NFe-NFCe/ANEXO I - Leiaute e Regra de Valida/303/247/303/243o - NF-e e NFC-e.pdf +0 -0
  13. data/docs/NFe-NFCe/ANEXO II -Manual Especifica/303/247/303/265esT/303/251cnicas - Danfe-C/303/263digo-Barras.pdf +0 -0
  14. data/docs/NFe-NFCe/Anexo III - Manual de Conting/303/252ncia - NF-e.pdf +0 -0
  15. data/docs/NFe-NFCe/Anexo IV - Manual de Conting/303/252ncia - NFC-e.pdf +0 -0
  16. data/docs/NFe-NFCe/Manual de Orienta/303/247/303/243o ao Contribuinte - MOC - vers/303/243o 7.0 - NF-e e NFC-e.pdf +0 -0
  17. data/docs/NFe-NFCe/_dataset.md +819 -0
  18. data/lib/sefaz/base.rb +11 -0
  19. data/lib/sefaz/configuration.rb +58 -0
  20. data/lib/sefaz/exception.rb +14 -0
  21. data/lib/sefaz/refinement.rb +91 -0
  22. data/lib/sefaz/utils/connection.rb +35 -0
  23. data/lib/sefaz/utils/prawn_helper.rb +47 -0
  24. data/lib/sefaz/utils/signer.rb +122 -0
  25. data/lib/sefaz/version.rb +1 -1
  26. data/lib/sefaz/webservice/base.rb +13 -0
  27. data/lib/sefaz/webservice/nfe/auditor.rb +35 -0
  28. data/lib/sefaz/webservice/nfe/client.rb +426 -0
  29. data/lib/sefaz/webservice/nfe/connection.rb +17 -0
  30. data/lib/sefaz/webservice/nfe/dataset.rb +451 -0
  31. data/lib/sefaz/webservice/nfe/validator.rb +63 -0
  32. data/lib/sefaz/webservice/nfe/wsdl.rb +117 -0
  33. data/lib/sefaz/webservice/sat/client.rb +44 -0
  34. data/lib/sefaz/webservice/sat/dataset/cancel.rb +34 -0
  35. data/lib/sefaz/webservice/sat/dataset/sale.rb +176 -0
  36. data/lib/sefaz/webservice/sat/templates/base.rb +54 -0
  37. data/lib/sefaz/webservice/sat/templates/cupom_fiscal_55mm.rb +307 -0
  38. data/lib/sefaz/webservice/sat/templates/cupom_fiscal_80mm.rb +307 -0
  39. data/lib/sefaz.rb +45 -3
  40. data/sefaz.gemspec +5 -3
  41. metadata +80 -6
data/README.md CHANGED
@@ -1,33 +1,465 @@
1
- # Sefaz
1
+ # Biblioteca SEFAZ
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sefaz`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Gem Version](https://badge.fury.io/rb/sefaz.svg)](https://badge.fury.io/rb/sefaz)
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ## Instalação
6
6
 
7
- ## Installation
7
+ Biblioteca SEFAZ está disponível no RubyGems e pode ser instalada via:
8
8
 
9
- Install the gem and add to the application's Gemfile by executing:
9
+ ```bash
10
+ gem install sefaz
11
+ ```
10
12
 
11
- $ bundle add sefaz
13
+ ou adiciona no arquivo Gemfile e execute o `bundle install`:
12
14
 
13
- If bundler is not being used to manage dependencies, install the gem by executing:
15
+ ```ruby
16
+ gem 'sefaz'
17
+ ```
14
18
 
15
- $ gem install sefaz
19
+ ## Configuração
16
20
 
17
- ## Usage
21
+ Crie uma instância da classe `SEFAZ::Webservice::NFE::Client` para acessar os serviços disponíveis na biblioteca:
18
22
 
19
- TODO: Write usage instructions here
23
+ ```ruby
24
+ @webservice = SEFAZ::Webservice::NFE::Client.new
25
+ ```
20
26
 
21
- ## Development
27
+ Após instanciar, é necessário parametrizar a biblioteca:
22
28
 
23
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
29
+ - Configuração do Ambiente
24
30
 
25
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
31
+ ```ruby
32
+ @webservice.setaAmbiente({
33
+ ambiente: "2", # 1=Produção; 2=Homologação
34
+ uf: "35" # Código IBGE do Estado
35
+ cnpj: "00.000.000/0000-00" # CNPJ da empresa emissora
36
+ })
37
+ ```
26
38
 
27
- ## Contributing
39
+ - Configuração do Responsável Técnico
28
40
 
29
- Bug reports and pull requests are welcome on GitHub at https://github.com/henriqueshiraishi/ruby-sefaz.
41
+ ```ruby
42
+ @webservice.setaRespTecnico({
43
+ cnpj: "00.000.000/0000-00",
44
+ contato: "EMPRESA",
45
+ email: "contato@empresa.com.br",
46
+ fone: "+551100000000",
47
+ idCSRT: "01",
48
+ CSRT: "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
49
+ })
50
+ ```
30
51
 
31
- ## License
52
+ - Configuração do PFX de transmissão
32
53
 
33
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
54
+ ```ruby
55
+ @webservice = setaPFXTss({
56
+ pfx: File.read("certificado_tss.pfx"),
57
+ senha: "senha_super_secreta"
58
+ })
59
+ ```
60
+
61
+ *Observação: A biblioteca não permite o certificado A3 para transmissão SOAP. Lembrando que, o certificado de transmissão pode ser diferente do certificado de assinatura de XML.*
62
+
63
+ - Configuração do PFX de assinatura
64
+
65
+ ```ruby
66
+ @webservice.setaPFXAss({
67
+ pfx: File.read("certificado_ass.pfx"),
68
+ senha: "senha_super_secreta"
69
+ })
70
+ ```
71
+
72
+ *Observação: Caso é utilizado certificado A3 para assinatura de XML, não é necessário executar essa configuração. A biblioteca disponibiliza métodos que permite exportar o XML e HASH para realizar tratamento externo, como por exemplo, assinatura local de XML com certificado A3.*
73
+
74
+ ## Utilização
75
+
76
+ Após a configuração, é possível acessar os seguintes serviços:
77
+
78
+ ```ruby
79
+ # Consulta Status SEFAZ
80
+ xml, hash = @webservice.statusDoServico
81
+
82
+ # Consulta Situação NF
83
+ # @chaveNF(String) = Chave de acesso de uma NF
84
+ xml, hash = @webservice.consultarNF(@chaveNF)
85
+
86
+ # Consulta Cadastro
87
+ # @nroDocumento(String) = Número do documento
88
+ # @tpDocumento(String) = CNPJ/CPF/IE
89
+ # @uf(String) = Sigla do estado que será consultado (SP; MG; RJ; ...)
90
+ xml, hash = @webservice.consultarCadastro(@nroDocumento, @tpDocumento, @uf)
91
+
92
+ # Consulta Recebido de Lote
93
+ # @numRecibo(String) = Número do recibo do lote de NF-e
94
+ xml, hash = @webservice.consultarRecibo(@numRecibo)
95
+
96
+ # Assinar NF - PFX de assinatura - Certificado A1
97
+ # @documento(Hash ou String) = XML ou HASH que será assinado
98
+ xml, hash = @webservice.assinarNF(@documento)
99
+
100
+ # Enviar NF - Necessário uma NF assinada
101
+ # @documento(Hash ou String) = XML ou HASH assinado que será enviado
102
+ # @indSinc(String) = "0"=Assíncrono / "1"=Síncrono
103
+ # @idLote(String) = Identificador de controle do Lote de envio do Lote
104
+ xml, hash = @webservice.enviarNF(@documento, @indSinc, @idLote)
105
+
106
+ # Envia Lote de NF - Necessário que cada NF esteja assinada
107
+ # OBS: Recomendado para envio em lote de NF, cada elemento do Array pode ser Hash ou XML assinados
108
+ # @lote(Array) = Array de NF assinadas
109
+ # @indSinc(String) = "0"=Assíncrono / "1"=Síncrono
110
+ # @idLote(String) = Identificador de controle do Lote de envio do Lote
111
+ # Exemplo de @lote:
112
+ # @nf1_xml, @nf1_hash = @webservice.assinarNF(...)
113
+ # @nf2_xml, @nf2_hash = @webservice.assinarNF(...)
114
+ # @lote = [ @nf1_xml, @nf2_hash ]
115
+ xml, hash = @webservice.enviarLoteNF(@lote, @indSinc, @idLote)
116
+
117
+ # Calcular Chave NF
118
+ # @uf = Código da UF do emitente do Documento Fiscal
119
+ # @aamm = Ano e Mês de emissão da NF-e
120
+ # @cnpj = CNPJ do emitente
121
+ # @modelo = Modelo do Documento Fiscal (55 ou 65)
122
+ # @serie = Série do Documento Fiscal
123
+ # @nNF = Número do Documento Fiscal
124
+ # @tpEmis = Forma de emissão da NF-e
125
+ # @cNF = Código Numérico que compõe a Chave de Acesso (ID do sistema)
126
+ chaveNF, cDV = @webservice.calculaChaveNF(@uf, @aamm, @cnpj, @modelo, @serie, @nNF, @tpEmis, @cNF)
127
+
128
+ # Valida NF no SEFAZ RS NF-e (https://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx)
129
+ # @documento(Hash ou String) = XML ou HASH que será validado
130
+ # @openTimeout(Integer) = Tempo de espera em segundos para abrir conexão (opcional: padrão 60)
131
+ # @readTimeout(Integer) = Tempo de espera em segundos para ler resposta (opcional: padrão 60)
132
+ # => @stat = True/False se a validação foi executada com sucesso
133
+ # => @msg = Hash com todas as mensagens geradas pelo validador
134
+ # => @err = Hash com todas as mensagens de erros geradas pelo validador
135
+ stat, msg, err = @webservice.validarNF(@documento)
136
+
137
+ # Auditar NF no validador TecnoSpeed (https://validador.nfe.tecnospeed.com.br/)
138
+ # @documento(Hash ou String) = XML ou HASH que será auditado
139
+ # @openTimeout(Integer) = Tempo de espera em segundos para abrir conexão (opcional: padrão 60)
140
+ # @readTimeout(Integer) = Tempo de espera em segundos para ler resposta (opcional: padrão 60)
141
+ # => @stat = True/False se o auditor foi executado com sucesso
142
+ # => @msg = Hash com todas as mensagens geradas pelo auditor
143
+ stat, msg = @webservice.auditarNF(@documento)
144
+
145
+ # Inutilizar NF - Gera, assina e envia o documento com certificado A1 (exportarInutilizarNF, assinarNF, enviarInutilizarNF)
146
+ # OBS: Caso parâmetro @chaveInut estiver em branco, a chave será calculada automaticamente (calculaChaveInutilizacao)
147
+ # @chaveInut = Identificador da TAG a ser assinada
148
+ # @ano = Ano de inutilização da numeração
149
+ # @modelo = Modelo do documento (55 ou 65)
150
+ # @serie = Série da NF-e
151
+ # @nroNFIni = Número da NF-e inicial a ser inutilizada
152
+ # @nroNFFin = Número da NF-e final a ser inutilizada
153
+ # @justificativa = Informar a justificativa do pedido de inutilização
154
+ xml, hash = @webservice.inutilizarNF(@chaveInut, @ano, @modelo, @serie, @nroNFIni, @nroNFFin, @justificativa)
155
+
156
+ # Exportar Inutilização NF - Exporta um documento bruto (sem assinatura)
157
+ # OBS: Recomendado quando utilizado o certificado A3
158
+ # Caso parâmetro @chaveInut estiver em branco, a chave será calculada automaticamente (calculaChaveInutilizacao)
159
+ # @chaveInut = Identificador da TAG a ser assinada
160
+ # @ano = Ano de inutilização da numeração
161
+ # @modelo = Modelo do documento (55 ou 65)
162
+ # @serie = Série da NF-e
163
+ # @nroNFIni = Número da NF-e inicial a ser inutilizada
164
+ # @nroNFFin = Número da NF-e final a ser inutilizada
165
+ # @justificativa = Informar a justificativa do pedido de inutilização
166
+ xml, hash = @webservice.exportarInutilizarNF(@chaveInut, @ano, @modelo, @serie, @nroNFIni, @nroNFFin, @justificativa)
167
+
168
+ # Enviar Inutilização NF - Necessário um documento assinado
169
+ # OBS: Recomendado quando utilizado o certificado A3
170
+ # @documento(Hash ou String) = XML ou HASH assinado que será enviado
171
+ xml, hash = @webservice.enviarInutilizarNF(@documento)
172
+
173
+ # Calcular Chave de Inutilização
174
+ # @ano = Ano de inutilização da numeração
175
+ # @cnpj = CNPJ do emitente
176
+ # @modelo = Modelo do documento (55 ou 65)
177
+ # @serie = Série da NF-e
178
+ # @nroNFIni = Número da NF-e inicial a ser inutilizada
179
+ # @nroNFFin = Número da NF-e final a ser inutilizada
180
+ chaveInut = @webservice.calculaChaveInutilizacao(@ano, @cnpj, @modelo, @serie, @nroNFIni, @nroNFFin)
181
+
182
+ # Cancelar NF - Gera, assina e envia o documento com certificado A1 (exportarCancelarNF, assinarNF, enviarEvento)
183
+ # @chaveNF = Chave de acesso de uma NF
184
+ # @sequenciaEvento = O número do evento
185
+ # @dataHoraEvento = Data e Hora da Emissão do Evento (ex: 2023-01-15T17:23:00+03:00)
186
+ # @numProtocolo = Número do Protocolo de registro da NF
187
+ # @justificativa = Motivo do cancelamento da NF
188
+ # @idLote = Número de controle interno
189
+ xml, hash = @webservice.cancelarNF(@chaveNF, @sequenciaEvento, @dataHoraEvento, @numProtocolo, @justificativa, @idLote)
190
+
191
+ # Exportar Cancelar NF - Exporta um documento bruto (sem assinatura)
192
+ # OBS: Recomendado quando utilizado o certificado A3
193
+ # @chaveNF = Chave de acesso de uma NF
194
+ # @sequenciaEvento = O número do evento
195
+ # @dataHoraEvento = Data e Hora da Emissão do Evento (ex: 2023-01-15T17:23:00+03:00)
196
+ # @numProtocolo = Número do Protocolo de registro da NF
197
+ # @justificativa = Motivo do cancelamento da NF
198
+ # @idLote = Número de controle interno
199
+ xml, hash = @webservice.exportarCancelarNF(@chaveNF, @sequenciaEvento, @dataHoraEvento, @numProtocolo, @justificativa)
200
+
201
+ # Enviar Evento - Necessário um documento assinado
202
+ # OBS: Recomendado quando utilizado o certificado A3
203
+ # @evento(Hash ou String) = XML ou HASH assinado que será enviado
204
+ # @idLote(String) = Identificador de controle do Lote de envio do Evento
205
+ xml, hash = @webservice.enviarEvento(@evento, @idLote)
206
+
207
+ # Envia Lote de Eventos - Necessário que cada evento esteja assinado
208
+ # OBS: Recomendado quando utilizado o certificado A3 e/ou para envio em lote de eventos
209
+ # Cada elemento do Array pode ser Hash ou XML assinados
210
+ # @lote(Array) = Array de eventos assinados
211
+ # @idLote(String) = Identificador de controle do Lote de envio do Evento
212
+ # Exemplo de @lote:
213
+ # @eve1_xml, @eve1_hash = @webservice.exportarCancelarNF(...)
214
+ # @eve2_xml, @eve2_hash = @webservice.exportarCancelarNF(...)
215
+ # @lote = [ @eve1_xml, @eve2_hash ]
216
+ xml, hash = @webservice.enviarLoteDeEvento(@lote, @idLote)
217
+
218
+ # Enviar CCe - Gera, assina e envia o documento com certificado A1 (exportarCCe, assinarNF, enviarEvento)
219
+ # @chaveNF = Chave de acesso de uma NF
220
+ # @sequenciaEvento = O número do evento
221
+ # @dataHoraEvento = Data e Hora da Emissão do Evento (ex: 2023-01-15T17:23:00+03:00)
222
+ # @textoCorrecao = Motivo do cancelamento da NF
223
+ # @idLote = Número de controle interno
224
+ xml, hash = @webservice.enviarCCe(@chaveNF, @sequenciaEvento, @dataHoraEvento, @textoCorrecao, @idLote)
225
+
226
+ # Exportar CCe - Exporta um documento bruto (sem assinatura)
227
+ # OBS: Recomendado quando utilizado o certificado A3
228
+ # @chaveNF = Chave de acesso de uma NF
229
+ # @sequenciaEvento = O número do evento
230
+ # @dataHoraEvento = Data e Hora da Emissão do Evento (ex: 2023-01-15T17:23:00+03:00)
231
+ # @textoCorrecao = Motivo do cancelamento da NF
232
+ xml, hash = @webservice.exportarCCe(@chaveNF, @sequenciaEvento, @dataHoraEvento, @textoCorrecao)
233
+
234
+ # Gera Informações do Responsável Técnico - Calcula o hashCSRT e cria o grupo do responsável técnico
235
+ # Necessário quando estiver emitindo uma NF-e/NFC-e
236
+ # @documento(Hash ou String) = XML ou HASH que será tratado
237
+ xml, hash = @webservice.gerarInfRespTec(@documento)
238
+ ```
239
+
240
+ ## Enviando NF com Dataset
241
+
242
+ Acessa o arquivo [docs/NFe-NFCe/_dataset.md](https://github.com/henriqueshiraishi/ruby-sefaz/blob/main/docs/NFe-NFCe/_dataset.md) para visualizar todos os campos que pode ser informado no Dataset.
243
+
244
+ ```ruby
245
+ # Declarando os campos necessários para calcular a chave da NF
246
+ @uf = "35"
247
+ @aamm = "2303"
248
+ @cnpj = "21684155000164"
249
+ @modelo = "55"
250
+ @serie = "1"
251
+ @nNF = "244"
252
+ @tpEmis = "1"
253
+ @cNF = "07522998"
254
+
255
+ # Calculando a chave e o dígito verificador da NF
256
+ @chaveNF, @cDV = @webservice.calculaChaveNF(@uf, @aamm, @cnpj, @modelo, @serie, @nNF, @tpEmis, @cNF)
257
+
258
+ # Instanciando objeto Dataset
259
+ @dataset = SEFAZ::Webservice::NFE::Dataset.new(@chaveNF)
260
+
261
+ # Inserindo os dados da NF
262
+ @dataset.ide.cUF = @uf
263
+ @dataset.ide.cNF = @cNF
264
+ @dataset.ide.natOp = "Venda de Mercadoria"
265
+ @dataset.ide.mod = @modelo
266
+ @dataset.ide.serie = @serie
267
+ @dataset.ide.nNF = @nNF
268
+ @dataset.ide.dhEmi = "2023-03-21T17:10:03+00:00"
269
+ @dataset.ide.dhSaiEnt = "2023-03-21T17:10:03+00:00"
270
+ @dataset.ide.tpNF = "1"
271
+ @dataset.ide.idDest = "1"
272
+ @dataset.ide.cMunFG = "3550308"
273
+ @dataset.ide.tpImp = "1"
274
+ @dataset.ide.tpEmis = @tpEmis
275
+ @dataset.ide.cDV = @cDV
276
+ @dataset.ide.tpAmb = "2"
277
+ @dataset.ide.finNFe = "1"
278
+ @dataset.ide.indFinal = "0"
279
+ @dataset.ide.indPres = "0"
280
+ @dataset.ide.procEmi = "0"
281
+ @dataset.ide.verProc = "4.0.1"
282
+
283
+ @dataset.emit.CNPJ = @cnpj
284
+ @dataset.emit.xNome = "PHS INDUSTRIA METALURGICA EIRELI"
285
+ @dataset.emit.xFant = "PHS"
286
+ @dataset.emit.enderEmit.xLgr = "RUA SANTO HENRIQUE"
287
+ @dataset.emit.enderEmit.nro = "926"
288
+ @dataset.emit.enderEmit.xBairro = "VILA RE"
289
+ @dataset.emit.enderEmit.cMun = "3550308"
290
+ @dataset.emit.enderEmit.xMun = "SAO PAULO"
291
+ @dataset.emit.enderEmit.UF = "SP"
292
+ @dataset.emit.enderEmit.CEP = "03664010"
293
+ @dataset.emit.enderEmit.cPais = "1058"
294
+ @dataset.emit.enderEmit.xPais = "Brasil"
295
+ @dataset.emit.enderEmit.fone = "1134676938"
296
+ @dataset.emit.IE = "144190701117"
297
+ @dataset.emit.IM = "51610965"
298
+ @dataset.emit.CNAE = "2599399"
299
+ @dataset.emit.CRT = "1"
300
+
301
+ @dataset.dest.CNPJ = "01947271000111"
302
+ @dataset.dest.xNome = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
303
+ @dataset.dest.enderDest.xLgr = "RUA SALGADO DE CASTRO"
304
+ @dataset.dest.enderDest.nro = "265"
305
+ @dataset.dest.enderDest.xBairro = "VILA MARINA"
306
+ @dataset.dest.enderDest.cMun = "3513801"
307
+ @dataset.dest.enderDest.xMun = "DIADEMA"
308
+ @dataset.dest.enderDest.UF = "SP"
309
+ @dataset.dest.enderDest.CEP = "09920690"
310
+ @dataset.dest.enderDest.cPais = "1058"
311
+ @dataset.dest.enderDest.xPais = "BRASIL"
312
+ @dataset.dest.enderDest.fone = "1140555455"
313
+ @dataset.dest.indIEDest = "1"
314
+ @dataset.dest.IE = "286145468117"
315
+
316
+ @dataset.add("DET") do |det|
317
+ det.prod.cProd = "5.35.0160"
318
+ det.prod.cEAN = "SEM GTIN"
319
+ det.prod.xProd = "T-176, LATAO D5X4,,5MM, FURO 1.2MM"
320
+ det.prod.NCM = "74153300"
321
+ det.prod.CEST = "1006600"
322
+ det.prod.CFOP = "5101"
323
+ det.prod.uCom = "PC"
324
+ det.prod.qCom = "1000.0"
325
+ det.prod.vUnCom = "0.3800"
326
+ det.prod.vProd = "380.00"
327
+ det.prod.cEANTrib = "SEM GTIN"
328
+ det.prod.uTrib = "PC"
329
+ det.prod.qTrib = "1000.0"
330
+ det.prod.vUnTrib = "0.3800"
331
+ det.prod.indTot = "1"
332
+ det.prod.xPed = "OC 0123-000033"
333
+
334
+ det.imposto.vTotTrib = "0.00"
335
+
336
+ det.imposto.ICMS.ICMSSN101.orig = "0"
337
+ det.imposto.ICMS.ICMSSN101.CSOSN = "101"
338
+ det.imposto.ICMS.ICMSSN101.pCredSN = "1.86"
339
+ det.imposto.ICMS.ICMSSN101.vCredICMSSN = "7.07"
340
+
341
+ det.imposto.PIS.PISNT.CST = "07"
342
+ det.imposto.COFINS.COFINSNT.CST = "07"
343
+ end
344
+
345
+ @dataset.total.ICMSTot.vBC = "0.00"
346
+ @dataset.total.ICMSTot.vICMS = "0.00"
347
+ @dataset.total.ICMSTot.vICMSDeson = "0.00"
348
+ @dataset.total.ICMSTot.vFCPUFDest = "0.00"
349
+ @dataset.total.ICMSTot.vICMSUFDest = "0.00"
350
+ @dataset.total.ICMSTot.vICMSUFRemet = "0.00"
351
+ @dataset.total.ICMSTot.vFCP = "0.00"
352
+ @dataset.total.ICMSTot.vBCST = "0.00"
353
+ @dataset.total.ICMSTot.vST = "0.00"
354
+ @dataset.total.ICMSTot.vFCPST = "0.00"
355
+ @dataset.total.ICMSTot.vFCPSTRet = "0.00"
356
+ @dataset.total.ICMSTot.vProd = "380.00"
357
+ @dataset.total.ICMSTot.vFrete = "0.00"
358
+ @dataset.total.ICMSTot.vSeg = "0.00"
359
+ @dataset.total.ICMSTot.vDesc = "0.00"
360
+ @dataset.total.ICMSTot.vII = "0.00"
361
+ @dataset.total.ICMSTot.vIPI = "0.00"
362
+ @dataset.total.ICMSTot.vIPIDevol = "0.00"
363
+ @dataset.total.ICMSTot.vPIS = "0.00"
364
+ @dataset.total.ICMSTot.vCOFINS = "0.00"
365
+ @dataset.total.ICMSTot.vOutro = "0.00"
366
+ @dataset.total.ICMSTot.vNF = "380.00"
367
+ @dataset.total.ICMSTot.vTotTrib = "0.00"
368
+
369
+ @dataset.transp.modFrete = "0"
370
+
371
+ @dataset.add("VOL") do |vol|
372
+ vol.qVol = "1"
373
+ vol.esp = "VOLUME"
374
+ vol.pesoL = "1.000"
375
+ vol.pesoB = "1.000"
376
+ end
377
+
378
+ @dataset.cobr.fat.nFat = "86"
379
+ @dataset.cobr.fat.vOrig = "380.00"
380
+ @dataset.cobr.fat.vDesc = "0.00"
381
+ @dataset.cobr.fat.vLiq = "380.00"
382
+
383
+ @dataset.add("DUP") do |dup|
384
+ dup.nDup = "001"
385
+ dup.dVenc = "2023-03-31"
386
+ dup.vDup = "380.00"
387
+ end
388
+
389
+ @dataset.add("DETPAG") do |detpag|
390
+ detpag.tPag = "15"
391
+ detpag.vPag = "380.00"
392
+ end
393
+
394
+ @dataset.infAdic.infCpl = "PEDIDO DO CLIENTE N OC 0123-000033. DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES NACIONAL: PERMITE O APROVEITAMENTO DO CREDITO DE ICMS NO VALOR DE R 7,07; CORRESPONDENTE A ALIQUOTA DE 1.86, NOS TERMOS DO ART. 23 DA LEI COMPLEMENTAR N 123, DE 2006"
395
+
396
+ # Gerando e assinando XML
397
+ @xml, _ = @dataset.gerarNF
398
+ @xml, _ = @webservice.assinarNF(@xml)
399
+
400
+ # Enviando NF
401
+ @retEnviNFe = @webservice.enviarNF(@xml, "0", "1")
402
+ ```
403
+
404
+ ## Consulta de recibo da NF
405
+
406
+ ```ruby
407
+ # A partir do @retEnviNFe do exemplo anterior
408
+ @nRec = @retEnviNFe[1][:nfeResultMsg][:retEnviNFe][:infRec][:nRec]
409
+ @retConsReciNFe = @webservice.consultarRecibo(@nRec)
410
+
411
+ @cStat = @retConsReciNFe[1][:nfeResultMsg][:retConsReciNFe][:protNFe][:infProt][:cStat]
412
+ @nProt = @retConsReciNFe[1][:nfeResultMsg][:retConsReciNFe][:protNFe][:infProt][:nProt]
413
+ ```
414
+
415
+ ## Cancelamento da NF
416
+
417
+ ```ruby
418
+ # A partir da @chaveNF e @nProt dos exemplos anteriores
419
+ @sequenciaEvento = "1"
420
+ @dataHoraEvento = "2023-03-22T17:00:00+03:00"
421
+ @justificativa = "NF-e emitida em duplicidade."
422
+ @idLote = "1"
423
+ @retEnvEvento = @webservice.cancelarNF(@chaveNF, @sequenciaEvento, @dataHoraEvento, @nProt, @justificativa, @idLote)
424
+
425
+ @cStat = @retEnvEvento[1][:nfeResultMsg][:retEnvEvento][:retEvento][:infEvento][:cStat]
426
+ @xMotivo = @retEnvEvento[1][:nfeResultMsg][:retEnvEvento][:retEvento][:infEvento][:xMotivo]
427
+ ```
428
+
429
+ ## CFe-SAT
430
+
431
+ ### Arquivo de Venda
432
+
433
+ Acessa o arquivo [docs/CFe-SAT/_SALE_dataset.md](https://github.com/henriqueshiraishi/ruby-sefaz/blob/main/docs/CFe-SAT/_SALE_dataset.md) para visualizar todos os campos que pode ser informado no Dataset.
434
+
435
+ ```ruby
436
+ # Dataset para gerar arquivo de venda do CFe-SAT
437
+ @dataset = SEFAZ::Webservice::SAT::Dataset::Sale.new
438
+ ...
439
+ @xml, @hash = @dataset.gerarCF
440
+ ```
441
+
442
+ ### Arquivo de Cancelamento
443
+
444
+ Acessa o arquivo [docs/CFe-SAT/_CANCEL_dataset.md](https://github.com/henriqueshiraishi/ruby-sefaz/blob/main/docs/CFe-SAT/_CANCEL_dataset.md) para visualizar todos os campos que pode ser informado no Dataset.
445
+
446
+ ```ruby
447
+ # Dataset para gerar arquivo de cancelamento do CFe-SAT
448
+ @dataset = SEFAZ::Webservice::SAT::Dataset::Cancel.new
449
+ ...
450
+ @xml, @hash = @dataset.gerarCF
451
+ ```
452
+
453
+ ## Desenvolvimento
454
+
455
+ Depois de verificar o repositório, execute `bin/setup` para instalar as dependências. Em seguida, execute `rake test` para executar os testes. Você também pode executar `bin/console` para um prompt interativo que permitirá que você experimente.
456
+
457
+ Para instalar esta gem em sua máquina local, execute `bundle exec rake install`. Para lançar uma nova versão, atualize o número da versão em `version.rb`, e então execute `bundle exec rake release`, que criará uma tag git para a versão, push git commits e a tag criada, e envia o pacote `.gem` para o [rubygems.org](https://rubygems.org).
458
+
459
+ ## Contribuição
460
+
461
+ Relatórios de bugs e solicitações pull são bem-vindos no GitHub em <https://github.com/henriqueshiraishi/ruby-sefaz>.
462
+
463
+ ## Licença
464
+
465
+ A gema está disponível como código aberto sob os termos da [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.libs << "test"
8
8
  t.libs << "lib"
9
9
  t.test_files = FileList["test/**/test_*.rb"]
10
+ t.warning = false
10
11
  end
11
12
 
12
13
  task default: :test
@@ -0,0 +1,14 @@
1
+ # Lista dos campos do Cancel Dataset
2
+
3
+ ```ruby
4
+ # Instanciando objeto Dataset
5
+ @dataset = SEFAZ::Webservice::SAT::Dataset::Cancel.new(@chCanc)
6
+
7
+ # Identificação do Cupom Fiscal Eletrônico
8
+ @dataset.ide.CNPJ = ""
9
+ @dataset.ide.signAC = ""
10
+ @dataset.ide.numeroCaixa = ""
11
+
12
+ # Gerando o XML e Hash do Dataset
13
+ @xml, @hash = @dataset.gerarCF
14
+ ```
@@ -0,0 +1,171 @@
1
+ # Lista dos campos do Sale Dataset
2
+
3
+ ```ruby
4
+ # Instanciando objeto Dataset
5
+ @dataset = SEFAZ::Webservice::SAT::Dataset::Sale.new
6
+
7
+ # Identificação do Cupom Fiscal Eletrônico
8
+ @dataset.ide.CNPJ = ""
9
+ @dataset.ide.signAC = ""
10
+ @dataset.ide.numeroCaixa = ""
11
+
12
+ # Identificação do Emitente do Cupom Fiscal eletrônico
13
+ @dataset.emit.CNPJ = ""
14
+ @dataset.emit.IE = ""
15
+ @dataset.emit.IM = ""
16
+ @dataset.emit.cRegTribISSQN = ""
17
+ @dataset.emit.indRatISSQN = ""
18
+
19
+ # Identificação do Destinatário do Cupom Fiscal Eletrônico
20
+ @dataset.dest.CNPJ = ""
21
+ @dataset.dest.CPF = ""
22
+ @dataset.dest.xNome = ""
23
+
24
+ # Identificação do Local de Entrega
25
+ @dataset.entrega.xLgr = ""
26
+ @dataset.entrega.nro = ""
27
+ @dataset.entrega.xCpl = ""
28
+ @dataset.entrega.xBairro = ""
29
+ @dataset.entrega.xMun = ""
30
+ @dataset.entrega.UF = ""
31
+
32
+ # Detalhamento de Produtos e Serviços do CF-e
33
+ @dataset.add("DET") do |det|
34
+ # Produtos e Serviços do CF-e
35
+ det.prod.cProd = ""
36
+ det.prod.cEAN = ""
37
+ det.prod.xProd = ""
38
+ det.prod.NCM = ""
39
+ det.prod.CEST = ""
40
+ det.prod.CFOP = ""
41
+ det.prod.uCom = ""
42
+ det.prod.qCom = ""
43
+ det.prod.vUnCom = ""
44
+ det.prod.indRegra = ""
45
+ det.prod.vDesc = ""
46
+ det.prod.vOutro = ""
47
+ det.prod.cANP = ""
48
+
49
+ # Grupo do campo de uso livre do Fisco
50
+ @dataset.add("OBSFISCODET") do |obsfiscodet|
51
+ obsfiscodet.xCampoDet = ""
52
+ obsfiscodet.xTextoDet = ""
53
+ end
54
+
55
+ # Tributos incidentes no Produto ou Serviço
56
+ det.imposto.vItem12741 = ""
57
+
58
+ # ICMS Normal e ST
59
+ # Grupo de Tributação do ICMS = 00,01,12,13,14,20,21,72,73,74,90
60
+ det.imposto.ICMS.ICMS00.Orig = ""
61
+ det.imposto.ICMS.ICMS00.CST = ""
62
+ det.imposto.ICMS.ICMS00.pICMS = ""
63
+
64
+ # Grupo de Tributação do ICMS = 30,40,41,60,61
65
+ det.imposto.ICMS.ICMS40.Orig = ""
66
+ det.imposto.ICMS.ICMS40.CST = ""
67
+
68
+ # Simples Nacional e CSOSN = 102,300,400,500
69
+ det.imposto.ICMS.ICMSSN102.Orig = ""
70
+ det.imposto.ICMS.ICMSSN102.CSOSN = ""
71
+
72
+ # Simples Nacional e CSOSN = 900
73
+ det.imposto.ICMS.ICMSSN900.Orig = ""
74
+ det.imposto.ICMS.ICMSSN900.CSOSN = ""
75
+ det.imposto.ICMS.ICMSSN900.pICMS = ""
76
+
77
+ # Grupo do PIS
78
+ # Grupo de PIS tributado pela alíquota
79
+ det.imposto.PIS.PISAliq.CST = ""
80
+ det.imposto.PIS.PISAliq.vBC = ""
81
+ det.imposto.PIS.PISAliq.pPIS = ""
82
+
83
+ # Grupo de PIS tributado por Qtde
84
+ det.imposto.PIS.PISQtde.CST = ""
85
+ det.imposto.PIS.PISQtde.qBCProd = ""
86
+ det.imposto.PIS.PISQtde.vAliqProd = ""
87
+
88
+ # Grupo de PIS não tributado
89
+ det.imposto.PIS.PISNT.CST = ""
90
+
91
+ # Grupo de PIS para contribuinte do SIMPLES NACIONAL
92
+ det.imposto.PIS.PISSN.CST = ""
93
+
94
+ # Grupo de PIS Outras Operações
95
+ det.imposto.PIS.PISOutr.CST = ""
96
+ det.imposto.PIS.PISOutr.vBC = ""
97
+ det.imposto.PIS.PISOutr.pPIS = ""
98
+ det.imposto.PIS.PISOutr.qBCProd = ""
99
+ det.imposto.PIS.PISOutr.vAliqProd = ""
100
+
101
+ # Grupo de PIS Substituição Tributária
102
+ det.imposto.PISST.vBC = ""
103
+ det.imposto.PISST.pPIS = ""
104
+ det.imposto.PISST.qBCProd = ""
105
+ det.imposto.PISST.vAliqProd = ""
106
+
107
+ # Grupo do COFINS
108
+ # Grupo de COFINS tributado pela alíquota
109
+ det.imposto.COFINS.COFINSAliq.CST = ""
110
+ det.imposto.COFINS.COFINSAliq.vBC = ""
111
+ det.imposto.COFINS.COFINSAliq.pCOFINS = ""
112
+
113
+ # Grupo de COFINS tributado por Qtde
114
+ det.imposto.COFINS.COFINSQtde.CST = ""
115
+ det.imposto.COFINS.COFINSQtde.qBCProd = ""
116
+ det.imposto.COFINS.COFINSQtde.vAliqProd = ""
117
+
118
+ # Grupo de COFINS não tributado
119
+ det.imposto.COFINS.COFINSNT.CST = ""
120
+
121
+ # Grupo de COFINS para contribuinte do SIMPLES NACIONAL
122
+ det.imposto.COFINS.COFINSSN.CST = ""
123
+
124
+ # Grupo de COFINS Outras Operações
125
+ det.imposto.COFINS.COFINSOutr.CST = ""
126
+ det.imposto.COFINS.COFINSOutr.vBC = ""
127
+ det.imposto.COFINS.COFINSOutr.pCOFINS = ""
128
+ det.imposto.COFINS.COFINSOutr.qBCProd = ""
129
+ det.imposto.COFINS.COFINSOutr.vAliqProd = ""
130
+
131
+ # Grupo de COFINS Substituição Tributária
132
+ det.imposto.COFINSST.vBC = ""
133
+ det.imposto.COFINSST.pCOFINS = ""
134
+ det.imposto.COFINSST.qBCProd = ""
135
+ det.imposto.COFINSST.vAliqProd = ""
136
+
137
+ # Grupo do ISSQN
138
+ det.imposto.ISSQN.vDeducISSQN = ""
139
+ det.imposto.ISSQN.vAliq = ""
140
+ det.imposto.ISSQN.cMunFG = ""
141
+ det.imposto.ISSQN.cListServ = ""
142
+ det.imposto.ISSQN.cServTribMun = ""
143
+ det.imposto.ISSQN.cNatOp = ""
144
+ det.imposto.ISSQN.indIncFisc = ""
145
+
146
+ # Informações adicionais
147
+ det.infAdProd = ""
148
+ end
149
+
150
+ # Valores Totais do CF-e
151
+ @dataset.total.vCFeLei12741 = ""
152
+
153
+ # Grupo de valores de entrada de Desconto/Acréscimo sobre Subtotal
154
+ @dataset.total.DescAcrEntr.vDescSubtot = ""
155
+ @dataset.total.DescAcrEntr.vAcresSubtot = ""
156
+
157
+ # Informações sobre Pagamento
158
+ # Grupo de informações dos Meios de Pagamento empregados na quitação do CF-e
159
+ @dataset.add("MP") do |mp|
160
+ mp.cMP = ""
161
+ mp.vMP = ""
162
+ mp.cAdmC = ""
163
+ mp.cAut = ""
164
+ end
165
+
166
+ # Grupo de Informações Adicionais
167
+ @dataset.infAdic.infCpl = ""
168
+
169
+ # Gerando o XML e Hash do Dataset
170
+ @xml, @hash = @dataset.gerarCF
171
+ ```