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
@@ -0,0 +1,307 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SEFAZ
|
4
|
+
module Webservice
|
5
|
+
module SAT
|
6
|
+
module Templates
|
7
|
+
# Template para CFe-SAT 80mm em PDF
|
8
|
+
class CupomFiscal80mm < SEFAZ::Webservice::SAT::Templates::Base
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
@page_width = Configuration.default.cfe_page_width_80mm
|
13
|
+
@margin = Configuration.default.cfe_margin_55mm
|
14
|
+
end
|
15
|
+
|
16
|
+
def build(doc, aut, canc, summary, infAdic)
|
17
|
+
doc.font "Courier", style: :normal
|
18
|
+
doc.font_size 7
|
19
|
+
|
20
|
+
infCFe = (canc ? canc.dig(:CFeCanc, :infCFe) : aut.dig(:CFe, :infCFe))
|
21
|
+
header(doc, aut)
|
22
|
+
body(doc, aut, summary, infCFe.dig(:@chCanc))
|
23
|
+
footer(doc, infCFe, infAdic)
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# CABEÇALHO (Aut)
|
28
|
+
#
|
29
|
+
def header(doc, aut)
|
30
|
+
emit = aut.dig(:CFe, :infCFe, :emit)
|
31
|
+
enderEmit = aut.dig(:CFe, :infCFe, :emit, :enderEmit)
|
32
|
+
|
33
|
+
# Dados do emitente
|
34
|
+
doc.text emit.dig(:xFant).to_s.strip.upcase, align: :center
|
35
|
+
doc.text emit.dig(:xNome).to_s.strip.upcase, align: :center
|
36
|
+
doc.text "#{enderEmit.dig(:xLgr)} #{enderEmit.dig(:nro)} #{enderEmit.dig(:xCpl)} #{enderEmit.dig(:xBairro)} #{enderEmit.dig(:xMun)} #{enderEmit.dig(:CEP)}".to_s.strip.upcase, align: :center
|
37
|
+
doc.move_down doc.font_size
|
38
|
+
doc.text "CNPJ #{emit.dig(:CNPJ).to_s.mask!("##.###.###/####-##")} IE #{emit.dig(:IE).to_s.mask!("###.###.###.###")}".to_s.strip.upcase, align: :center
|
39
|
+
doc.text "IM #{emit.dig(:IM).to_s.mask!("####.###.###.###")}".to_s.strip.upcase, align: :center if emit.dig(:IM)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# CORPO DO EXTRATO (Aut)
|
44
|
+
#
|
45
|
+
# Exibe os dados de forma dinâmica:
|
46
|
+
# Quando CFe Movimento: exibe lista dos itens a partir do XML AUTORIZADO (Resumido ou Não Resumido).
|
47
|
+
# Quando CFe Cancelamento: exibe os dados do XML AUTORIZADO em modo cancelado.
|
48
|
+
#
|
49
|
+
def body(doc, aut, summary, chCanc)
|
50
|
+
tpAmb = aut.dig(:CFe, :infCFe, :ide, :tpAmb)
|
51
|
+
nCFe = (tpAmb == 1) ? aut.dig(:CFe, :infCFe, :ide, :nCFe) : "000000"
|
52
|
+
|
53
|
+
# (I) - Título
|
54
|
+
doc.move_down 1.mm
|
55
|
+
doc.text "Extrato #{nCFe} do CUPOM FISCAL ELETRÔNICO - SAT", style: :bold, align: :center
|
56
|
+
|
57
|
+
# (A) - Título - Cancelamento
|
58
|
+
if chCanc
|
59
|
+
doc.move_down 1.mm
|
60
|
+
doc.text "CANCELAMENTO", style: :bold, align: :center
|
61
|
+
end
|
62
|
+
|
63
|
+
# (TESTE) Marca de Teste
|
64
|
+
if tpAmb == "2"
|
65
|
+
doc.move_down doc.font_size
|
66
|
+
|
67
|
+
doc.text "= TESTE =", style: :italic, align: :center
|
68
|
+
doc.move_down doc.font_size
|
69
|
+
3.times do
|
70
|
+
doc.text_box (">" * 100), at: [0, doc.cursor], height: doc.font_size, width: doc.bounds.width
|
71
|
+
doc.move_down doc.font_size
|
72
|
+
doc.move_down doc.font_size
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Exibe o extrato no modo cancelado caso exista Chave de Cancelamento, caso contrário exibe no modo movimento
|
77
|
+
if chCanc
|
78
|
+
body_canceled_mode(doc, aut)
|
79
|
+
else
|
80
|
+
body_movement_mode(doc, aut, summary)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# CORPO DO EXTRATO > MODO MOVIMENTO (Aut)
|
86
|
+
#
|
87
|
+
# Exibe lista dos itens.
|
88
|
+
#
|
89
|
+
def body_movement_mode(doc, aut, summary)
|
90
|
+
# (II) - Legenda
|
91
|
+
doc.text "#|COD|DESC|QTD|UN|VL UN R$|(VL TR R$)*|VL ITEM R$", size: 6.7
|
92
|
+
dash(doc, gap: 2, space: 0.5, line_width: 0.1, x1: 0, x2: doc.bounds.width, y: doc.cursor)
|
93
|
+
|
94
|
+
# (III) - Registros de item
|
95
|
+
unless summary
|
96
|
+
det = aut.dig(:CFe, :infCFe, :det)
|
97
|
+
det = det.is_a?(Array) ? det : [det]
|
98
|
+
det.each do |i|
|
99
|
+
# DADOS: #|COD|DESC|QTD|UN|VL UN R$|(VL TR R$)*
|
100
|
+
doc.bounding_box([0, doc.cursor], width: (doc.bounds.width - 13.mm)) do
|
101
|
+
doc.text "#{i.dig(:@nItem)} #{i.dig(:prod, :cProd)} #{i.dig(:prod, :xProd)} #{i.dig(:prod, :qCom)} #{i.dig(:prod, :uCom)} X #{i.dig(:prod, :vUnCom).to_f.to_currency} (#{i.dig(:imposto, :vItem12741).to_f.to_currency})"
|
102
|
+
end
|
103
|
+
|
104
|
+
# DADOS: VL ITEM R$
|
105
|
+
doc.move_down -doc.font_size
|
106
|
+
doc.text i.dig(:prod, :vProd).to_f.to_currency, align: :right
|
107
|
+
|
108
|
+
# DADOS: DESCONTO
|
109
|
+
if i.dig(:prod, :vDesc).to_f > 0
|
110
|
+
doc.float { doc.text "-#{i.dig(:prod, :vDesc).to_f.to_currency}", align: :right }
|
111
|
+
doc.text "desconto sobre item"
|
112
|
+
end
|
113
|
+
|
114
|
+
# DADOS: ACRÉSCIMO
|
115
|
+
if i.dig(:prod, :vOutro).to_f > 0
|
116
|
+
doc.float { doc.text "+#{i.dig(:prod, :vOutro).to_f.to_currency}", align: :right }
|
117
|
+
doc.text "acréscimo sobre item"
|
118
|
+
end
|
119
|
+
|
120
|
+
# DADOS: RATEIO DESCONTO
|
121
|
+
if i.dig(:prod, :vRatDesc).to_f > 0
|
122
|
+
doc.float { doc.text "-#{i.dig(:prod, :vRatDesc).to_f.to_currency}", align: :right }
|
123
|
+
doc.text "rateio de desconto sobre subtotal"
|
124
|
+
end
|
125
|
+
|
126
|
+
# DADOS: RATEIO ACRÉSCIMO
|
127
|
+
if i.dig(:prod, :vRatAcr).to_f > 0
|
128
|
+
doc.float { doc.text "+#{i.dig(:prod, :vRatAcr).to_f.to_currency}", align: :right }
|
129
|
+
doc.text "rateio de acréscimo sobre subtotal"
|
130
|
+
end
|
131
|
+
|
132
|
+
# DADOS: ISSQN
|
133
|
+
if i.dig(:imposto, :ISSQN, :vDeducISSQN).to_f > 0
|
134
|
+
doc.float { doc.text "-#{i.dig(:imposto, :ISSQN, :vDeducISSQN).to_f.to_currency}", align: :right }
|
135
|
+
doc.text "dedução para ISSQN"
|
136
|
+
doc.float { doc.text i.dig(:imposto, :ISSQN, :vBC).to_f.to_currency, align: :right }
|
137
|
+
doc.text "base de cálculo ISSQN"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# (IV) - Total do Cupom
|
143
|
+
total = aut.dig(:CFe, :infCFe, :total)
|
144
|
+
|
145
|
+
# DADOS: VALOR BRUTO
|
146
|
+
if (total.dig(:DescAcrEntr, :vDescSubtot).to_f > 0) || (total.dig(:DescAcrEntr, :vAcresSubtot).to_f > 0) || (total.dig(:ICMSTot, :vDesc).to_f > 0) || (total.dig(:ICMSTot, :vOutro).to_f > 0)
|
147
|
+
doc.float { doc.text total.dig(:ICMSTot, :vProd).to_f.to_currency, align: :right }
|
148
|
+
doc.text "Total bruto de itens"
|
149
|
+
end
|
150
|
+
|
151
|
+
# DADOS: TOTAL DESC/ACRES SOBRE ITENS
|
152
|
+
if (total.dig(:ICMSTot, :vDesc).to_f > 0) || (total.dig(:ICMSTot, :vOutro).to_f > 0)
|
153
|
+
valor11 = total.dig(:ICMSTot, :vOutro).to_f - total.dig(:ICMSTot, :vDesc).to_f
|
154
|
+
doc.text "Total de descontos/acréscimos sobre item"
|
155
|
+
doc.text "#{ valor11 > 0 ? '+' : '-' }#{valor11.abs.to_currency}", align: :right
|
156
|
+
end
|
157
|
+
|
158
|
+
# DADOS: DESCONTO SOBRE TOTAL
|
159
|
+
if total.dig(:DescAcrEntr, :vDescSubtot).to_f > 0
|
160
|
+
doc.float { doc.text "-#{total.dig(:DescAcrEntr, :vDescSubtot).to_f.to_currency}", align: :right }
|
161
|
+
doc.text "Desconto sobre subtotal"
|
162
|
+
end
|
163
|
+
|
164
|
+
# DADOS: ACRÉSCIMO SOBRE TOTAL
|
165
|
+
if total.dig(:DescAcrEntr, :vAcresSubtot).to_f > 0
|
166
|
+
doc.float { doc.text "+#{total.dig(:DescAcrEntr, :vAcresSubtot).to_f.to_currency}", align: :right }
|
167
|
+
doc.text "Acréscimo sobre subtotal"
|
168
|
+
end
|
169
|
+
|
170
|
+
# DADOS: TOTAL FINAL
|
171
|
+
doc.float { doc.text total.dig(:vCFe).to_f.to_currency, style: :bold, align: :right }
|
172
|
+
doc.text "Total R$", style: :bold
|
173
|
+
|
174
|
+
# (V) - Meio de Pagamento
|
175
|
+
pgto = aut.dig(:CFe, :infCFe, :pgto)
|
176
|
+
mp = aut.dig(:CFe, :infCFe, :pgto, :MP)
|
177
|
+
mp = mp.is_a?(Array) ? mp : [mp]
|
178
|
+
mp.each do |i|
|
179
|
+
# DADOS: DESCRIÇÃO MEIO DE PAGAMENTO
|
180
|
+
doc.bounding_box([0, doc.cursor], width: (doc.bounds.width - 13.mm)) do
|
181
|
+
doc.text Configuration.default.cfe_cMP_cod_desc[i.dig(:cMP)]
|
182
|
+
end
|
183
|
+
|
184
|
+
# DADOS: VALOR PAGAMENTO
|
185
|
+
doc.move_down -doc.font_size
|
186
|
+
doc.text i.dig(:vMP).to_f.to_currency, align: :right
|
187
|
+
end
|
188
|
+
|
189
|
+
# DADOS: TROCO
|
190
|
+
doc.float { doc.text pgto.dig(:vTroco).to_f.to_currency, align: :right }
|
191
|
+
doc.text "Troco R$"
|
192
|
+
|
193
|
+
# (VI) - Observações do Fisco
|
194
|
+
obsFisco = aut.dig(:CFe, :infCFe, :obsFisco)
|
195
|
+
if obsFisco
|
196
|
+
obsFisco = obsFisco.is_a?(Array) ? obsFisco : [obsFisco]
|
197
|
+
obsFisco.each do |i|
|
198
|
+
doc.text "#{i.dig(:xCampo)}: #{i.dig(:xTexto)}"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# (VII) - Dados para Entrega
|
203
|
+
entrega = aut.dig(:CFe, :infCFe, :entrega)
|
204
|
+
doc.text "ENDEREÇO DE ENTREGA: #{entrega.dig(:xLgr)} #{entrega.dig(:nro)} #{entrega.dig(:xCpl)} #{entrega.dig(:xBairro)} #{entrega.dig(:xMun)} #{entrega.dig(:UF)}".to_s.strip.upcase if entrega
|
205
|
+
|
206
|
+
# (VIII) - Observações do Contribuinte
|
207
|
+
infCFe = aut.dig(:CFe, :infCFe)
|
208
|
+
doc.text "OBSERVAÇÕES DO CONTRIBUINTE"
|
209
|
+
doc.text infCFe.dig(:infCpl)
|
210
|
+
doc.text "Valor aproximado dos tributos deste cupom R$"
|
211
|
+
doc.text total.dig(:vCFeLei12741).to_f.to_currency, align: :right
|
212
|
+
doc.text "(conforme Lei Fed. 12.741/2012)"
|
213
|
+
doc.move_down doc.font_size
|
214
|
+
end
|
215
|
+
|
216
|
+
#
|
217
|
+
# CORPO DO EXTRATO > MODO CANCELADO (Aut)
|
218
|
+
#
|
219
|
+
# Exibe os dados do XML AUTORIZADO em modo cancelado.
|
220
|
+
# É renderizado o rodapé do XML AUTORIZADO no final do corpo do extrato.
|
221
|
+
#
|
222
|
+
def body_canceled_mode(doc, aut)
|
223
|
+
total = aut.dig(:CFe, :infCFe, :total)
|
224
|
+
infCFe = aut.dig(:CFe, :infCFe)
|
225
|
+
|
226
|
+
# (B) - Dados do Cupom Fiscal Cancelado
|
227
|
+
doc.move_down 1.mm
|
228
|
+
doc.text "DADOS DO CUPOM ELETRÔNICO CANCELADO", style: :bold
|
229
|
+
doc.text "TOTAL R$ #{total.dig(:vCFe).to_f.to_currency}"
|
230
|
+
|
231
|
+
# (RODAPÉ DE MOVIMENTO) Exibe o rodapé do Extrato de Movimento no corpo do Extrato de Cancelamento
|
232
|
+
footer(doc, infCFe, vl_aprox_trib: false)
|
233
|
+
end
|
234
|
+
|
235
|
+
#
|
236
|
+
# RODAPÉ (Aut/Canc)
|
237
|
+
#
|
238
|
+
# Exibe os elementos de rodapé (QR Code, código de barras, número da chave, mensagens fixas, etc).
|
239
|
+
# O método permite exibir o rodapé no modo movimento ou cancelado.
|
240
|
+
#
|
241
|
+
def footer(doc, infCFe, infAdic = nil, vl_aprox_trib: true)
|
242
|
+
id = infCFe.dig(:@Id)
|
243
|
+
chCanc = infCFe.dig(:@chCanc)
|
244
|
+
ide = infCFe.dig(:ide)
|
245
|
+
total = infCFe.dig(:total)
|
246
|
+
|
247
|
+
# Título do cancelamento
|
248
|
+
if chCanc
|
249
|
+
doc.move_down 2
|
250
|
+
dash(doc, gap: 2, space: 0.5, line_width: 0.1, x1: 0, x2: doc.bounds.width, y: doc.cursor)
|
251
|
+
doc.text "DADOS DO CUPOM FISCAL ELETRÔNICO DE CANCELAMENTO", align: :center, style: :bold, size: 6.8
|
252
|
+
end
|
253
|
+
|
254
|
+
# Número da chave do Cupom Fiscal (dividos em 11 blocos com 4 números cada)
|
255
|
+
doc.move_down 2
|
256
|
+
doc.text id.to_s.delete("^0-9").scan(/.{4}/).join(" "), align: :center, style: :bold
|
257
|
+
doc.move_down doc.font_size
|
258
|
+
|
259
|
+
# Código de barra CODE 128-C (divido em duas partes)
|
260
|
+
barcode_128c(doc, value: id.to_s.delete("^0-9"), x: 0, y: doc.cursor, xdim: 0.72)
|
261
|
+
doc.move_down 1.mm
|
262
|
+
|
263
|
+
# Informação do consumidor, SAT e mensagens fixas
|
264
|
+
doc.float do
|
265
|
+
doc.move_down 5.mm
|
266
|
+
doc.bounding_box([80, doc.cursor], width: 115) do
|
267
|
+
# Informação do consumidor (CNPJ/CPF e NOME)
|
268
|
+
if !chCanc && (infCFe.dig(:dest, :CNPJ) || infCFe.dig(:dest, :CPF))
|
269
|
+
info = "<b>Consumidor:</b> "
|
270
|
+
info = info + infCFe.dig(:dest, :CNPJ).to_s.mask!("##.###.###/####-##") if infCFe.dig(:dest, :CNPJ)
|
271
|
+
info = info + infCFe.dig(:dest, :CPF).to_s.mask!("###.###.###-##") if infCFe.dig(:dest, :CPF)
|
272
|
+
doc.text info, inline_format: true, size: 6
|
273
|
+
doc.text infCFe.dig(:dest, :xNome), size: 6 if infCFe.dig(:dest, :xNome)
|
274
|
+
end
|
275
|
+
|
276
|
+
# Informação do SAT (Nº Série SAT)
|
277
|
+
doc.text "<b>No. Serie do SAT:</b> #{ide.dig(:nserieSAT)}", inline_format: true, size: 6
|
278
|
+
doc.text DateTime.parse("#{ide.dig(:dEmi)}T#{ide.dig(:hEmi)}").strftime("%d/%m/%Y - %H:%M:%S"), size: 6
|
279
|
+
doc.move_down doc.font_size
|
280
|
+
|
281
|
+
# Mensagens fixas do Cupom Fiscal
|
282
|
+
if !chCanc
|
283
|
+
doc.text "Consulte o QR Code pelo aplicativo \"#{Configuration.default.cfe_qr_code_aplicativo}\", disponível na AppStore (Apple) e PlayStore (Android)", size: 6
|
284
|
+
doc.move_down doc.font_size
|
285
|
+
doc.text "*valor aproximado dos tributos do item", size: 5 if vl_aprox_trib
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
# QR Code do Cupom Fiscal = Id|(dEmi)(hEmi)|vCFe|(CNPJ/CPF)|assinaturaQRCODE
|
291
|
+
doc.move_down 2.mm
|
292
|
+
codigo_qr_code = "#{id}|#{ide.dig(:dEmi)}#{ide.dig(:hEmi)}|#{total.dig(:vCFe)}|#{(infCFe.dig(:dest, :CNPJ) || infCFe.dig(:dest, :CPF))}|#{ide.dig(:assinaturaQRCODE)}"
|
293
|
+
qrcode(doc, value: codigo_qr_code, x: 0, y: doc.cursor)
|
294
|
+
doc.move_down 3.mm
|
295
|
+
|
296
|
+
# Informações adicionais do Cupom Fiscal (customizado pelo contribuinte)
|
297
|
+
if infAdic
|
298
|
+
dash(doc, gap: 2, space: 0.5, line_width: 0.1, x1: 0, x2: doc.bounds.width, y: doc.cursor)
|
299
|
+
doc.text infAdic, align: :justify, size: 6
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
data/lib/sefaz.rb
CHANGED
@@ -1,10 +1,52 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'json'
|
4
|
+
require 'net/http'
|
3
5
|
require 'savon'
|
6
|
+
require 'prawn'
|
7
|
+
require 'prawn/measurement_extensions'
|
8
|
+
require 'barby'
|
9
|
+
require 'barby/barcode/code_128'
|
10
|
+
require 'barby/barcode/qr_code'
|
11
|
+
require 'barby/outputter/prawn_outputter'
|
4
12
|
|
5
|
-
|
13
|
+
require 'sefaz/base'
|
14
|
+
require 'sefaz/configuration'
|
15
|
+
require 'sefaz/exception'
|
16
|
+
require 'sefaz/refinement'
|
17
|
+
require 'sefaz/version'
|
18
|
+
|
19
|
+
require 'sefaz/utils/connection'
|
20
|
+
require 'sefaz/utils/prawn_helper'
|
21
|
+
require 'sefaz/utils/signer'
|
22
|
+
require 'sefaz/webservice/base'
|
23
|
+
|
24
|
+
require 'sefaz/webservice/nfe/client'
|
25
|
+
require 'sefaz/webservice/nfe/auditor'
|
26
|
+
require 'sefaz/webservice/nfe/connection'
|
27
|
+
require 'sefaz/webservice/nfe/dataset'
|
28
|
+
require 'sefaz/webservice/nfe/validator'
|
29
|
+
require 'sefaz/webservice/nfe/wsdl'
|
30
|
+
|
31
|
+
require 'sefaz/webservice/sat/client'
|
32
|
+
require 'sefaz/webservice/sat/templates/base'
|
33
|
+
require 'sefaz/webservice/sat/templates/cupom_fiscal_55mm'
|
34
|
+
require 'sefaz/webservice/sat/templates/cupom_fiscal_80mm'
|
35
|
+
require 'sefaz/webservice/sat/dataset/cancel'
|
36
|
+
require 'sefaz/webservice/sat/dataset/sale'
|
6
37
|
|
7
38
|
module SEFAZ
|
8
|
-
|
9
|
-
#
|
39
|
+
# Personalize as configurações padrão da biblioteca usando bloco
|
40
|
+
# config/initializers/sefaz_config.rb
|
41
|
+
# SEFAZ.configure do |config|
|
42
|
+
# config.xxxxxxx = "xxxxxxx"
|
43
|
+
# end
|
44
|
+
# Se nenhum bloco for fornecido, retorna o objeto de configuração padrão
|
45
|
+
def self.configure
|
46
|
+
if block_given?
|
47
|
+
yield(Configuration.default)
|
48
|
+
else
|
49
|
+
Configuration.default
|
50
|
+
end
|
51
|
+
end
|
10
52
|
end
|
data/sefaz.gemspec
CHANGED
@@ -8,11 +8,10 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Henrique Shiraishi"]
|
9
9
|
spec.email = ["henriqueashiraishi@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "
|
12
|
-
spec.description = "Biblioteca de cálculos, serviços e transmissão da SEFAZ"
|
11
|
+
spec.summary = "Integração com a Secretaria da Fazenda (SEFAZ)."
|
13
12
|
spec.homepage = "https://github.com/henriqueshiraishi/ruby-sefaz"
|
14
13
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">= 2.
|
14
|
+
spec.required_ruby_version = ">= 2.5.1"
|
16
15
|
|
17
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
18
17
|
spec.metadata["source_code_uri"] = "https://github.com/henriqueshiraishi/ruby-sefaz"
|
@@ -31,6 +30,9 @@ Gem::Specification.new do |spec|
|
|
31
30
|
|
32
31
|
# Uncomment to register a new dependency of your gem
|
33
32
|
spec.add_dependency "savon", "~> 2.13.0"
|
33
|
+
spec.add_dependency "prawn", "~> 2.4.0"
|
34
|
+
spec.add_dependency "barby", "~> 0.6.9"
|
35
|
+
spec.add_dependency "rqrcode", "~> 0.10.1"
|
34
36
|
|
35
37
|
# For more information and examples about making a new gem, check out our
|
36
38
|
# guide at: https://bundler.io/guides/creating_gem.html
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sefaz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henrique Shiraishi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: savon
|
@@ -24,7 +24,49 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.13.0
|
27
|
-
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: prawn
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.4.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.4.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: barby
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.6.9
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.6.9
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rqrcode
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.1
|
69
|
+
description:
|
28
70
|
email:
|
29
71
|
- henriqueashiraishi@gmail.com
|
30
72
|
executables: []
|
@@ -37,8 +79,40 @@ files:
|
|
37
79
|
- LICENSE.txt
|
38
80
|
- README.md
|
39
81
|
- Rakefile
|
82
|
+
- docs/CFe-SAT/Especificacao_SAT_v_ER_2_30_03.pdf
|
83
|
+
- docs/CFe-SAT/Manual_Orientacao_SAT_v_MO_2_19_04.pdf
|
84
|
+
- docs/CFe-SAT/Manual_do_Emulador_SAT-CF-e_Offline_2015_09_10.pdf
|
85
|
+
- docs/CFe-SAT/_CANCEL_dataset.md
|
86
|
+
- docs/CFe-SAT/_SALE_dataset.md
|
87
|
+
- docs/CFe-SAT/emulador_off_line_v2_9_4.zip
|
88
|
+
- docs/NFe-NFCe/ANEXO I - Leiaute e Regra de Validação - NF-e e NFC-e.pdf
|
89
|
+
- docs/NFe-NFCe/ANEXO II -Manual EspecificaçõesTécnicas - Danfe-Código-Barras.pdf
|
90
|
+
- docs/NFe-NFCe/Anexo III - Manual de Contingência - NF-e.pdf
|
91
|
+
- docs/NFe-NFCe/Anexo IV - Manual de Contingência - NFC-e.pdf
|
92
|
+
- docs/NFe-NFCe/Manual de Orientação ao Contribuinte - MOC - versão 7.0 - NF-e e NFC-e.pdf
|
93
|
+
- docs/NFe-NFCe/_dataset.md
|
40
94
|
- lib/sefaz.rb
|
95
|
+
- lib/sefaz/base.rb
|
96
|
+
- lib/sefaz/configuration.rb
|
97
|
+
- lib/sefaz/exception.rb
|
98
|
+
- lib/sefaz/refinement.rb
|
99
|
+
- lib/sefaz/utils/connection.rb
|
100
|
+
- lib/sefaz/utils/prawn_helper.rb
|
101
|
+
- lib/sefaz/utils/signer.rb
|
41
102
|
- lib/sefaz/version.rb
|
103
|
+
- lib/sefaz/webservice/base.rb
|
104
|
+
- lib/sefaz/webservice/nfe/auditor.rb
|
105
|
+
- lib/sefaz/webservice/nfe/client.rb
|
106
|
+
- lib/sefaz/webservice/nfe/connection.rb
|
107
|
+
- lib/sefaz/webservice/nfe/dataset.rb
|
108
|
+
- lib/sefaz/webservice/nfe/validator.rb
|
109
|
+
- lib/sefaz/webservice/nfe/wsdl.rb
|
110
|
+
- lib/sefaz/webservice/sat/client.rb
|
111
|
+
- lib/sefaz/webservice/sat/dataset/cancel.rb
|
112
|
+
- lib/sefaz/webservice/sat/dataset/sale.rb
|
113
|
+
- lib/sefaz/webservice/sat/templates/base.rb
|
114
|
+
- lib/sefaz/webservice/sat/templates/cupom_fiscal_55mm.rb
|
115
|
+
- lib/sefaz/webservice/sat/templates/cupom_fiscal_80mm.rb
|
42
116
|
- sefaz.gemspec
|
43
117
|
- sig/sefaz.rbs
|
44
118
|
homepage: https://github.com/henriqueshiraishi/ruby-sefaz
|
@@ -56,15 +130,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
130
|
requirements:
|
57
131
|
- - ">="
|
58
132
|
- !ruby/object:Gem::Version
|
59
|
-
version: 2.
|
133
|
+
version: 2.5.1
|
60
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
135
|
requirements:
|
62
136
|
- - ">="
|
63
137
|
- !ruby/object:Gem::Version
|
64
138
|
version: '0'
|
65
139
|
requirements: []
|
66
|
-
rubygems_version: 3.
|
140
|
+
rubygems_version: 3.1.6
|
67
141
|
signing_key:
|
68
142
|
specification_version: 4
|
69
|
-
summary:
|
143
|
+
summary: Integração com a Secretaria da Fazenda (SEFAZ).
|
70
144
|
test_files: []
|