sefaz 0.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +115 -0
- data/Gemfile.lock +31 -17
- data/README.md +449 -17
- data/Rakefile +1 -0
- data/docs/CFe-SAT/Especificacao_SAT_v_ER_2_30_03.pdf +0 -0
- data/docs/CFe-SAT/Manual_Orientacao_SAT_v_MO_2_19_04.pdf +0 -0
- data/docs/CFe-SAT/Manual_do_Emulador_SAT-CF-e_Offline_2015_09_10.pdf +0 -0
- data/docs/CFe-SAT/_CANCEL_dataset.md +14 -0
- data/docs/CFe-SAT/_SALE_dataset.md +171 -0
- data/docs/CFe-SAT/emulador_off_line_v2_9_4.zip +0 -0
- data/docs/NFe-NFCe/ANEXO I - Leiaute e Regra de Valida/303/247/303/243o - NF-e e NFC-e.pdf +0 -0
- data/docs/NFe-NFCe/ANEXO II -Manual Especifica/303/247/303/265esT/303/251cnicas - Danfe-C/303/263digo-Barras.pdf +0 -0
- data/docs/NFe-NFCe/Anexo III - Manual de Conting/303/252ncia - NF-e.pdf +0 -0
- data/docs/NFe-NFCe/Anexo IV - Manual de Conting/303/252ncia - NFC-e.pdf +0 -0
- 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
- data/docs/NFe-NFCe/_dataset.md +819 -0
- data/lib/sefaz/base.rb +11 -0
- data/lib/sefaz/configuration.rb +58 -0
- data/lib/sefaz/exception.rb +14 -0
- data/lib/sefaz/refinement.rb +91 -0
- data/lib/sefaz/utils/connection.rb +35 -0
- data/lib/sefaz/utils/prawn_helper.rb +47 -0
- data/lib/sefaz/utils/signer.rb +122 -0
- data/lib/sefaz/version.rb +1 -1
- data/lib/sefaz/webservice/base.rb +13 -0
- data/lib/sefaz/webservice/nfe/auditor.rb +35 -0
- data/lib/sefaz/webservice/nfe/client.rb +426 -0
- data/lib/sefaz/webservice/nfe/connection.rb +17 -0
- data/lib/sefaz/webservice/nfe/dataset.rb +451 -0
- data/lib/sefaz/webservice/nfe/validator.rb +63 -0
- data/lib/sefaz/webservice/nfe/wsdl.rb +117 -0
- data/lib/sefaz/webservice/sat/client.rb +44 -0
- data/lib/sefaz/webservice/sat/dataset/cancel.rb +34 -0
- data/lib/sefaz/webservice/sat/dataset/sale.rb +176 -0
- data/lib/sefaz/webservice/sat/templates/base.rb +54 -0
- data/lib/sefaz/webservice/sat/templates/cupom_fiscal_55mm.rb +307 -0
- data/lib/sefaz/webservice/sat/templates/cupom_fiscal_80mm.rb +307 -0
- data/lib/sefaz.rb +45 -3
- data/sefaz.gemspec +5 -3
- metadata +80 -6
data/README.md
CHANGED
@@ -1,33 +1,465 @@
|
|
1
|
-
#
|
1
|
+
# Biblioteca SEFAZ
|
2
2
|
|
3
|
-
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/sefaz.svg)](https://badge.fury.io/rb/sefaz)
|
4
4
|
|
5
|
-
|
5
|
+
## Instalação
|
6
6
|
|
7
|
-
|
7
|
+
Biblioteca SEFAZ está disponível no RubyGems e pode ser instalada via:
|
8
8
|
|
9
|
-
|
9
|
+
```bash
|
10
|
+
gem install sefaz
|
11
|
+
```
|
10
12
|
|
11
|
-
|
13
|
+
ou adiciona no arquivo Gemfile e execute o `bundle install`:
|
12
14
|
|
13
|
-
|
15
|
+
```ruby
|
16
|
+
gem 'sefaz'
|
17
|
+
```
|
14
18
|
|
15
|
-
|
19
|
+
## Configuração
|
16
20
|
|
17
|
-
|
21
|
+
Crie uma instância da classe `SEFAZ::Webservice::NFE::Client` para acessar os serviços disponíveis na biblioteca:
|
18
22
|
|
19
|
-
|
23
|
+
```ruby
|
24
|
+
@webservice = SEFAZ::Webservice::NFE::Client.new
|
25
|
+
```
|
20
26
|
|
21
|
-
|
27
|
+
Após instanciar, é necessário parametrizar a biblioteca:
|
22
28
|
|
23
|
-
|
29
|
+
- Configuração do Ambiente
|
24
30
|
|
25
|
-
|
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
|
-
|
39
|
+
- Configuração do Responsável Técnico
|
28
40
|
|
29
|
-
|
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
|
-
|
52
|
+
- Configuração do PFX de transmissão
|
32
53
|
|
33
|
-
|
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
Binary file
|
Binary file
|
Binary file
|
@@ -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
|
+
```
|
Binary file
|
Binary file
|