sefaz 0.2.0 → 1.3.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.
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
+ ```