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.
- 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
|
+
[](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
|