br-invoice-download 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '087765e8459a45578d7bf60c20e598e5ed67536dfbf749e8159faab5ef23fb3a'
4
+ data.tar.gz: e6dfc19691a832a69516570607f39c1f8f364589b27a56546ae1cd9ea8b21d05
5
+ SHA512:
6
+ metadata.gz: cbfb13a73e0f3dcb1df0d418f46438557fcd1e448c0b818a99bc29ba16c6cf9a38aebc0afb352ee9aa878480f27bf3dffc34a8755a87e89869091732eff9c754
7
+ data.tar.gz: 779d9a175fbd20c8b24cf26076e523ac07e5d66144e0e6ccaa77f615e490efc70d609a361d5b5efa14e29b42804bcd19b33f46742de4a9ca40c44eee28eb6253
@@ -0,0 +1,6 @@
1
+ coverage/
2
+ .dropbox
3
+ **/*.subl*
4
+ **/*.~lock.*
5
+ dev
6
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,108 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ br-invoice-download (1.0.0)
5
+ activesupport (>= 3)
6
+ savon (>= 2.11)
7
+ slim (>= 3.0)
8
+ slim-rails (>= 3.1)
9
+ stringio (>= 0.0.2)
10
+ zlib (>= 1.0)
11
+
12
+ GEM
13
+ remote: http://rubygems.org/
14
+ specs:
15
+ actionpack (6.0.2.2)
16
+ actionview (= 6.0.2.2)
17
+ activesupport (= 6.0.2.2)
18
+ rack (~> 2.0, >= 2.0.8)
19
+ rack-test (>= 0.6.3)
20
+ rails-dom-testing (~> 2.0)
21
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
22
+ actionview (6.0.2.2)
23
+ activesupport (= 6.0.2.2)
24
+ builder (~> 3.1)
25
+ erubi (~> 1.4)
26
+ rails-dom-testing (~> 2.0)
27
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
28
+ activesupport (6.0.2.2)
29
+ concurrent-ruby (~> 1.0, >= 1.0.2)
30
+ i18n (>= 0.7, < 2)
31
+ minitest (~> 5.1)
32
+ tzinfo (~> 1.1)
33
+ zeitwerk (~> 2.2)
34
+ akami (1.3.1)
35
+ gyoku (>= 0.4.0)
36
+ nokogiri
37
+ builder (3.2.4)
38
+ concurrent-ruby (1.1.6)
39
+ crass (1.0.6)
40
+ erubi (1.9.0)
41
+ gyoku (1.3.1)
42
+ builder (>= 2.1.2)
43
+ httpi (2.4.4)
44
+ rack
45
+ socksify
46
+ i18n (1.8.2)
47
+ concurrent-ruby (~> 1.0)
48
+ loofah (2.4.0)
49
+ crass (~> 1.0.2)
50
+ nokogiri (>= 1.5.9)
51
+ method_source (1.0.0)
52
+ mini_portile2 (2.4.0)
53
+ minitest (5.14.0)
54
+ nokogiri (1.10.9)
55
+ mini_portile2 (~> 2.4.0)
56
+ nori (2.6.0)
57
+ rack (2.2.2)
58
+ rack-test (1.1.0)
59
+ rack (>= 1.0, < 3)
60
+ rails-dom-testing (2.0.3)
61
+ activesupport (>= 4.2.0)
62
+ nokogiri (>= 1.6)
63
+ rails-html-sanitizer (1.3.0)
64
+ loofah (~> 2.3)
65
+ railties (6.0.2.2)
66
+ actionpack (= 6.0.2.2)
67
+ activesupport (= 6.0.2.2)
68
+ method_source
69
+ rake (>= 0.8.7)
70
+ thor (>= 0.20.3, < 2.0)
71
+ rake (13.0.1)
72
+ savon (2.12.0)
73
+ akami (~> 1.2)
74
+ builder (>= 2.1.2)
75
+ gyoku (~> 1.2)
76
+ httpi (~> 2.3)
77
+ nokogiri (>= 1.8.1)
78
+ nori (~> 2.4)
79
+ wasabi (~> 3.4)
80
+ slim (4.0.1)
81
+ temple (>= 0.7.6, < 0.9)
82
+ tilt (>= 2.0.6, < 2.1)
83
+ slim-rails (3.2.0)
84
+ actionpack (>= 3.1)
85
+ railties (>= 3.1)
86
+ slim (>= 3.0, < 5.0)
87
+ socksify (1.7.1)
88
+ stringio (0.1.0)
89
+ temple (0.8.2)
90
+ thor (1.0.1)
91
+ thread_safe (0.3.6)
92
+ tilt (2.0.10)
93
+ tzinfo (1.2.6)
94
+ thread_safe (~> 0.1)
95
+ wasabi (3.5.0)
96
+ httpi (~> 2.0)
97
+ nokogiri (>= 1.4.2)
98
+ zeitwerk (2.3.0)
99
+ zlib (1.1.0)
100
+
101
+ PLATFORMS
102
+ ruby
103
+
104
+ DEPENDENCIES
105
+ br-invoice-download!
106
+
107
+ BUNDLED WITH
108
+ 1.17.2
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2016 Bruno M. Mergen
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,52 @@
1
+
2
+ # **br-invoice-download**
3
+ Gem para fazer o download de notas fiscais através da chave de acesso
4
+
5
+ **Introdução**
6
+
7
+ Através do serviço **NFeDistribuicaoDFe** é possível obter o XML da nota fiscal com suas informações.
8
+ Com base na documentação da [NT 2014.002 v1.02](/Brunomm/doc/NT2014.002_v1.02_WsNFeDistribuicaoDFe.pdf) foi criado apenas o serviço para a disponibilização do xml da nota fiscal, onde somente o destinatário, transportador e terceiros (identificados na tag `autXML`) podem usar este serviço.
9
+
10
+ ## Instalação
11
+ **Manualmente**
12
+
13
+ gem install br-invoice-download
14
+
15
+ **Gemfile**
16
+
17
+ gem 'br-invoice-download'
18
+
19
+ ## Utilização
20
+
21
+ ```ruby
22
+ @engine = BrInvoiceDownload::NfeDistribuicaoDfe.new({
23
+ certificate_pkcs12_password: 'CERTIFITACE_PASSWORD',
24
+ certificate_pkcs12_path: '/path/for/certificate-A1.pfx',
25
+ cnpj: '12345678901234',
26
+ invoice_key: '42200231775690400191560010004277701695237709',
27
+ ibge_uf: 42 # vide https://www.ibge.gov.br/explica/codigos-dos-municipios.php
28
+ })
29
+
30
+ @engine.request
31
+
32
+ @engine.invoice_xml
33
+ # => "<nfeProc versao=\"4.00\" xmlns=\"http://www.portalfiscal.inf.br" ...."
34
+
35
+ @engine.invoice_hash
36
+ # => {"nfeProc"=>{"versao"=>"4.00", "xmlns"=>"http://www.portalfiscal.inf.br/nfe", ...}
37
+
38
+ ```
39
+
40
+ ## Contribuições
41
+
42
+ Seja um contribuidor. Você pode contribuir de várias formas:
43
+
44
+ * Desenvolver as outras funcionalidades disponibilizadas pelo serviço **NFeDistribuicaoDFe**.
45
+ * Refatorando código.
46
+ * Fornecendo Feedback construtivo (*Sempre bem vindo!*).
47
+
48
+
49
+ ## Licença
50
+
51
+ - MIT
52
+ - Copyleft 2020 Bruno Mucelini Mergen
@@ -0,0 +1,32 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |task|
4
+ task.libs << %w(test lib)
5
+ task.pattern = 'test/**/*_test.rb'
6
+ end
7
+
8
+ desc "Open an irb session preloaded with this library"
9
+ task :console do
10
+ sh "irb -rubygems -I lib -r br_nfe.rb"
11
+ end
12
+
13
+ task :default => :test
14
+
15
+ namespace :test do
16
+ desc "Test lib source"
17
+ Rake::TestTask.new(:product) do |t|
18
+ t.libs << "test"
19
+ t.pattern = 'test/br_nfe/product/**/*_test.rb'
20
+ t.verbose = true
21
+ end
22
+
23
+ end
24
+
25
+ namespace :test do
26
+ desc "Test lib source"
27
+ Rake::TestTask.new(:service) do |t|
28
+ t.libs << "test"
29
+ t.pattern = 'test/br_nfe/service/**/*_test.rb'
30
+ t.verbose = true
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/br_invoice_download/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'br-invoice-download'
6
+ gem.version = BrInvoiceDownload::Version::CURRENT
7
+ gem.license = 'MIT'
8
+ gem.description = %q{BrInvoiceDownload é uma gem para projetos Ruby on Rails que tem como objetivo fazer o download do xml das notas fiscais de produto emitidas no Brasil.}
9
+ gem.summary = %q{Download de Notas Fiscais Eletrônicas em Ruby}
10
+ gem.authors = ['Bruno M. Mergen']
11
+ gem.email = ['brunomergen@gmail.com']
12
+ gem.homepage = 'https://github.com/Brunomm/br-invoice-download'
13
+
14
+ gem.files = `git ls-files`.split("\n").reject{|fil|
15
+ fil.include?('dev/') ||
16
+ fil.include?('doc/')
17
+ }
18
+ gem.require_paths = ["lib"]
19
+ gem.required_ruby_version = ['>= 2.1.0', '< 3.0.0']
20
+
21
+ # gem.add_dependency "rake", '>= 10'
22
+ gem.add_dependency 'activesupport', '>= 3'
23
+ gem.add_dependency 'savon', '>= 2.11'
24
+ # gem.add_dependency 'signer', '>= 1.4'
25
+ gem.add_dependency 'slim', '>= 3.0'
26
+ gem.add_dependency 'slim-rails', '>= 3.1'
27
+ gem.add_dependency 'zlib', '>= 1.0'
28
+ gem.add_dependency 'stringio', '>= 0.0.2'
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'active_support/core_ext/string'
5
+ require 'active_support/core_ext/hash'
6
+ require 'savon'
7
+ require 'slim'
8
+
9
+ require 'br_invoice_download/version'
10
+ require 'br_invoice_download/nfe_distribuicao_dfe'
11
+
12
+
13
+ # Copyright (C) 2020 Bruno M. Mergen
14
+ #
15
+ # @author Bruno Mucelini Mergen <brunomergen@gmail.com>
16
+ #
17
+ #
18
+ module BrInvoiceDownload
19
+ def self.root
20
+ File.expand_path '../..', __FILE__
21
+ end
22
+ end
@@ -0,0 +1,192 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "zlib"
5
+ require "stringio"
6
+ require "base64"
7
+
8
+ module BrInvoiceDownload
9
+ class NfeDistribuicaoDfe
10
+
11
+ def initialize(opts={})
12
+ opts.each do |key, value|
13
+ instance_variable_set("@#{key}", value)
14
+ end
15
+ end
16
+
17
+ attr_accessor :certificate_pkcs12_password
18
+ attr_accessor :certificate_pkcs12_path
19
+ attr_accessor :certificate_pkcs12_value
20
+ attr_accessor :ibge_uf
21
+ attr_accessor :cnpj
22
+ attr_accessor :invoice_key
23
+
24
+ def response
25
+ @response
26
+ end
27
+
28
+ def request
29
+ @response = client_wsdl.call(:nfe_dist_d_fe_interesse, xml: soap_xml)
30
+ rescue Savon::SOAPFault => error
31
+ return @response = {request_status: :soap_error, request_message_error: error.message}
32
+ rescue Savon::HTTPError => error
33
+ return @response = {request_status: :http_error, request_message_error: error.message}
34
+ rescue Exception => error
35
+ return @response = {request_status: :unknown_error, request_message_error: error.message}
36
+ end
37
+
38
+ def invoice_hash
39
+ @invoice ||= handle_invoice
40
+ end
41
+
42
+ def invoice_xml
43
+ @invoice_xml ||= handle_invoice_xml
44
+ end
45
+
46
+ private
47
+
48
+ def handle_invoice_xml
49
+ ret = response.try(:body).dig(:nfe_dist_d_fe_interesse_response, :nfe_dist_d_fe_interesse_result, :ret_dist_d_fe_int, :lote_dist_d_fe_int, :doc_zip)
50
+ return unless ret
51
+
52
+ Zlib::GzipReader.new(
53
+ StringIO.new(
54
+ Base64.decode64( ret )
55
+ )
56
+ ).read
57
+ end
58
+
59
+ def handle_invoice
60
+ Hash.from_xml invoice_xml
61
+ end
62
+
63
+ # Esse método serve para ser utilizado no Base de cada orgão emissor
64
+ # onde em alguns casos é necessário colocar o xml em um CDATA
65
+ # É esse método que é passado dentro do Body da equisição SOAP
66
+ #
67
+ def content_xml
68
+ @content_xml ||= render_xml 'root/NfeDistribuicaoDfe'
69
+ end
70
+
71
+ # Tag XML que vai na requisição SOAP
72
+ #
73
+ # <b>Tipo de retorno: </b> _String_
74
+ #
75
+ def tag_xml
76
+ '<?xml version="1.0" encoding="UTF-8"?>'
77
+ end
78
+
79
+ # XML que irá na requisição SOAP
80
+ #
81
+ # <b>Tipo de retorno: </b> _String XML_
82
+ #
83
+ def soap_xml
84
+ @soap_xml ||= "#{tag_xml}#{render_xml('soap_env')}".html_safe
85
+ end
86
+
87
+ def client_wsdl_params
88
+ {
89
+ log: true,
90
+ pretty_print_xml: true,
91
+ ssl_verify_mode: :none,
92
+ ssl_cert: certificate,
93
+ ssl_cert_key: certificate_key,
94
+ ssl_cert_key_password: certificate_pkcs12_password,
95
+ wsdl: 'https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl',
96
+ ssl_version: :TLSv1
97
+ }
98
+ end
99
+
100
+ def url_xmlns
101
+ 'http://www.portalfiscal.inf.br/nfe/wsdl/NFeDistribuicaoDFe'
102
+ end
103
+
104
+ # Cliente WSDL utilizado para fazer a requisição.
105
+ # Utilizando a gem savon.
106
+ # Veja mais detalhes em http://savonrb.com/version2/client.html
107
+ def client_wsdl
108
+ @client_wsdl ||= Savon.client( client_wsdl_params )
109
+ end
110
+
111
+ # Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value
112
+ # Caso tenha o certificate_pkcs12 em arquivo, basta setar o atributo certificate_pkcs12_path e deixar o atributo certificate_pkcs12_value em branco
113
+ def certificate_pkcs12_value
114
+ @certificate_pkcs12_value ||= File.read(certificate_pkcs12_path)
115
+ end
116
+
117
+ def certificate_pkcs12
118
+ return @certificate_pkcs12 if @certificate_pkcs12
119
+ @certificate_pkcs12 = nil
120
+
121
+ # É utilizado uma Thread e limpado os errors do OpenSSL para evitar perda de
122
+ # conexão com o banco de dados PostgreSQL.
123
+ # Veja: http://stackoverflow.com/questions/33112155/pgconnectionbad-pqconsumeinput-ssl-error-key-values-mismatch/36283315#36283315
124
+ # Veja: https://github.com/tedconf/front_end_builds/pull/66
125
+ Thread.new do
126
+ @certificate_pkcs12 = OpenSSL::PKCS12.new(certificate_pkcs12_value, certificate_pkcs12_password)
127
+ OpenSSL.errors.clear
128
+ end.join
129
+ OpenSSL.errors.clear
130
+
131
+ @certificate_pkcs12
132
+ rescue
133
+ end
134
+
135
+ def certificate_pkcs12=(value)
136
+ @certificate_pkcs12 = value
137
+ end
138
+
139
+ def certificate=(value)
140
+ @certificate = value
141
+ end
142
+
143
+ def certificate
144
+ @certificate ||= (certificate_pkcs12 && certificate_pkcs12.certificate)
145
+ end
146
+
147
+ def certificate_key
148
+ @certificate_key ||= (certificate_pkcs12 && certificate_pkcs12.key)
149
+ end
150
+
151
+ def certificate_key=(value)
152
+ @certificate_key = value
153
+ end
154
+
155
+ # Utilização
156
+ # `render_xml('file_name', {dir_path: '/my/custom/dir', context: Object}`
157
+ #
158
+ # <b>Tipo de retorno: <b> _String_ (XML)
159
+ #
160
+ def render_xml file_name, opts={}
161
+ opts = {
162
+ dir_path: nil,
163
+ context: self,
164
+ }.merge(opts)
165
+
166
+ # Inicializa a variavel xml com nil para comparar se oa rquivo foi de fato encontrado.
167
+ xml = nil
168
+ get_xml_dirs(opts[:dir_path]).each do |dir|
169
+ if xml = find_xml(file_name, dir, opts[:context], opts)
170
+ break # Stop loop
171
+ end
172
+ end
173
+
174
+ # Lança uma excessão se não for encontrado o xml
175
+ # Deve verificar se é nil pois o arquivo xml pode estar vazio
176
+ if xml.nil?
177
+ raise "Arquivo #{file_name}.xml.slim não encontrado nos diretórios #{get_xml_dirs(default_options[:dir_path])}"
178
+ end
179
+ xml
180
+ end
181
+
182
+ def find_xml(file_name, dir, context=nil, options={})
183
+ if File.exists?("#{dir}/#{file_name}.xml.slim")
184
+ Slim::Template.new("#{dir}/#{file_name}.xml.slim").render(context, options).html_safe
185
+ end
186
+ end
187
+
188
+ def get_xml_dirs(custom_dir_path=nil)
189
+ [custom_dir_path, "#{BrInvoiceDownload.root}/lib/br_invoice_download/xml"].flatten.select(&:present?)
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module BrInvoiceDownload
5
+ module Version
6
+ MAJOR = 1 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
7
+ MINOR = 0 #inclui novas funcionalidades, sem quebrar APIs existentes
8
+ PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
9
+ CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01"
2
+ tpAmb = 1
3
+ cUFAutor = ibge_uf
4
+ CNPJ = cnpj
5
+ consChNFe
6
+ chNFe = invoice_key
@@ -0,0 +1,9 @@
1
+ soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
2
+ soap:Header
3
+ nfeCabecMsg xmlns="#{url_xmlns}"
4
+ cUF = ibge_uf
5
+ versaoDados = '1.00'
6
+ soap:Body
7
+ nfeDistDFeInteresse xmlns="#{url_xmlns}"
8
+ nfeDadosMsg
9
+ = content_xml.html_safe
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: br-invoice-download
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bruno M. Mergen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-03-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: savon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '2.11'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '2.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: slim
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: slim-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: zlib
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: stringio
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.0.2
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.0.2
97
+ description: BrInvoiceDownload é uma gem para projetos Ruby on Rails que tem como
98
+ objetivo fazer o download do xml das notas fiscais de produto emitidas no Brasil.
99
+ email:
100
+ - brunomergen@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - LICENSE
109
+ - README.md
110
+ - Rakefile
111
+ - br_invoice_download.gemspec
112
+ - lib/br_invoice_download.rb
113
+ - lib/br_invoice_download/nfe_distribuicao_dfe.rb
114
+ - lib/br_invoice_download/version.rb
115
+ - lib/br_invoice_download/xml/root/NfeDistribuicaoDfe.xml.slim
116
+ - lib/br_invoice_download/xml/soap_env.xml.slim
117
+ homepage: https://github.com/Brunomm/br-invoice-download
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 2.1.0
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: 3.0.0
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.0.3
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Download de Notas Fiscais Eletrônicas em Ruby
143
+ test_files: []