inovadora_xml 0.0.2 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inovadora_xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-06-11 00:00:00.000000000 Z
12
+ date: 2021-06-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -44,13 +44,13 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '10.0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: nokogiri
47
+ name: signer
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 1.6.0
53
+ version: 1.4.2
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,64 +58,62 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.6.0
61
+ version: 1.4.2
62
62
  - !ruby/object:Gem::Dependency
63
- name: signer
63
+ name: nokogiri
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
- - - '='
67
+ - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
- version: 1.4.2
70
- type: :development
69
+ version: 1.4.0
70
+ type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
- - - '='
75
+ - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
- version: 1.4.2
77
+ version: 1.4.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: savon
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '2.12'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.12'
94
+ - !ruby/object:Gem::Dependency
95
+ name: wasabi
80
96
  requirement: !ruby/object:Gem::Requirement
81
97
  none: false
82
98
  requirements:
83
99
  - - '='
84
100
  - !ruby/object:Gem::Version
85
- version: 1.2.0
86
- type: :development
101
+ version: 2.5.0
102
+ type: :runtime
87
103
  prerelease: false
88
104
  version_requirements: !ruby/object:Gem::Requirement
89
105
  none: false
90
106
  requirements:
91
107
  - - '='
92
108
  - !ruby/object:Gem::Version
93
- version: 1.2.0
109
+ version: 2.5.0
94
110
  description:
95
111
  email:
96
112
  - evanor.libardoni@gmail.com
97
113
  executables: []
98
114
  extensions: []
99
115
  extra_rdoc_files: []
100
- files:
101
- - .gitignore
102
- - CODE_OF_CONDUCT.md
103
- - Gemfile
104
- - LICENSE.txt
105
- - README.md
106
- - Rakefile
107
- - bin/console
108
- - bin/setup
109
- - inovadora_xml.gemspec
110
- - lib/inovadora_xml.rb
111
- - lib/inovadora_xml/assinador.rb
112
- - lib/inovadora_xml/custom_exceptions/server_error.rb
113
- - lib/inovadora_xml/modules.rb
114
- - lib/inovadora_xml/modules/dados_nfse_service.rb
115
- - lib/inovadora_xml/modules/formatador_nfse.rb
116
- - lib/inovadora_xml/modules/gerador_xml.rb
117
- - lib/inovadora_xml/servidor_wsdl.rb
118
- - lib/inovadora_xml/version.rb
116
+ files: []
119
117
  homepage:
120
118
  licenses:
121
119
  - MIT
data/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
data/CODE_OF_CONDUCT.md DELETED
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at junior@inovadora.com.br. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
-
5
- # Specify your gem's dependencies in inovadora_xml.gemspec
6
- gemspec
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2019 Junior Libardoni
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/README.md DELETED
@@ -1,43 +0,0 @@
1
- # InovadoraXml
2
-
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/inovadora_xml`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
6
-
7
- ## Installation
8
-
9
- Add this line to your application's Gemfile:
10
-
11
- ```ruby
12
- gem 'inovadora_xml'
13
- ```
14
-
15
- And then execute:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
20
-
21
- $ gem install inovadora_xml
22
-
23
- ## Usage
24
-
25
- TODO: Write usage instructions here
26
-
27
- ## Development
28
-
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
-
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
-
33
- ## Contributing
34
-
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/inovadora_xml. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
-
37
- ## License
38
-
39
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
40
-
41
- ## Code of Conduct
42
-
43
- Everyone interacting in the InovadoraXml project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/inovadora_xml/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile DELETED
@@ -1,2 +0,0 @@
1
- require "bundler/gem_tasks"
2
- task :default => :spec
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "inovadora_xml"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,29 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "inovadora_xml/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "inovadora_xml"
8
- spec.version = InovadoraXml::VERSION
9
- spec.authors = ["Junior Libardoni"]
10
- spec.email = ["evanor.libardoni@gmail.com"]
11
-
12
- spec.summary = %q{Gem utilizada para geração de XML e envio.}
13
- spec.license = "MIT"
14
-
15
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
16
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
-
18
- end
19
- spec.bindir = "exe"
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
-
23
-
24
- spec.add_development_dependency "bundler", "~> 1.17"
25
- spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "nokogiri", "1.6.0"
27
- spec.add_development_dependency "signer", "1.4.2"
28
- spec.add_development_dependency "savon", "1.2.0"
29
- end
data/lib/inovadora_xml.rb DELETED
@@ -1,88 +0,0 @@
1
- #encoding: utf-8
2
- require 'action_pack'
3
-
4
- require "inovadora_xml/version"
5
-
6
- require "inovadora_xml/assinador"
7
- require "inovadora_xml/servidor_wsdl"
8
-
9
-
10
- module InovadoraXml
11
- extend ActiveSupport::Autoload
12
- attr_accessor :xml_nfse, :schema, :metodo_soap, :xml_gerado, :retorno, :wsdl, :cert, :key, :errors
13
- autoload :Modules
14
-
15
- class Xml
16
- attr_accessor :xml_nfse, :schema, :metodo_soap, :xml_gerado, :retorno, :wsdl, :cert, :key, :errors
17
-
18
- include InovadoraXml::Modules::FormatadorNfse
19
- include InovadoraXml::Modules::GeradorXml
20
-
21
- def initialize(args = {})
22
- self.errors = ActiveModel::Errors.new(self)
23
- self.xml_gerado = self.gerar_xml()
24
-
25
- self.validar_args
26
- # self.valid?
27
- end
28
-
29
- def comunicar(request_args = {})
30
- self.valid?
31
-
32
- if self.errors.blank?
33
- servidor = Utils::Xml::ServidorWsdl.new(
34
- envelopar(),
35
- self.metodo_soap,
36
- self.wsdl,
37
- request_args
38
- )
39
-
40
- unless servidor.enviar
41
- raise Utils::Xml::CustomExceptions::ServerError.new(servidor), "Server Error"
42
- end
43
- #usage: self.retorno.to_xml ou self.retorno.body
44
- self.retorno = servidor.retorno
45
- end
46
-
47
- rescue Utils::Xml::CustomExceptions::ServerError => e
48
- e.object.errors.full_messages.each {|e| self.errors.add(:base, e)}
49
- rescue Exception => e
50
- self.errors.add(:base, e.message)
51
- ensure
52
- return self.errors.blank?
53
- end
54
-
55
- def validar_args
56
- self.errors.add(:base, "Metodo SOAP não especificado") if self.metodo_soap.blank?
57
- self.errors.add(:base, "Schema não especificado") if self.schema.blank?
58
- self.errors.add(:base, "WSDL não especificado") if self.wsdl.blank?
59
-
60
- return self.errors.blank?
61
- end
62
-
63
- def valid?
64
- erros = []
65
- schema = open(self.schema)
66
- xsd = Nokogiri::XML::Schema(schema)
67
- xsd.validate(self.xml_gerado).each do |error|
68
- unless error.message.to_s.include?("{http://www.w3.org/2000/09/xmldsig#}Signature") ||
69
- error.message.to_s.include?("{http://www.w3.org/2000/09/xmldsig#}SignedInfo")
70
- erros << "(Linha: " + error.line.to_s + ") => " + error.message.to_s
71
- end
72
- end
73
-
74
- erros.each {|erro| self.errors.add(:base, erro)}
75
- rescue Errno::ENOENT => e
76
- self.errors.add(:base, "Arquivo schema não existe")
77
- rescue Exception => e
78
- self.errors.add(:base, e)
79
- ensure
80
- self.errors.blank?
81
- end
82
-
83
- def assinar(xml_assinar, tag_assinar)
84
- Assinador.new(xml_assinar, tag_assinar).xml_assinado
85
- end
86
-
87
- end
88
- end
@@ -1,102 +0,0 @@
1
- #encoding=utf-8
2
- module InovadoraXml
3
- class Assinador
4
- attr_accessor :xml_assinar, :xml_assinado, :tag_assinar, :parametro
5
-
6
- def initialize(xml, tag_assinar)
7
- self.xml_assinar = xml.to_s
8
- self.tag_assinar = tag_assinar
9
- self.assinar_xml
10
- end
11
-
12
- def assinar_xml()
13
- chave_privada = OpenSSL::PKey::RSA.new(File.read("#{Rails.root}/app/services/sefaz/assinatura/chave.cer"))
14
- certificado = OpenSSL::X509::Certificate.new(File.read("#{Rails.root}/app/services/sefaz/assinatura/certificado.cer"))
15
-
16
- self.xml_assinado = Nokogiri::XML(self.xml_assinar.to_s, &:noblanks)
17
- self.xml_assinado.xpath("//xmlns:#{self.tag_assinar}").each do |node|
18
-
19
- # 1. Digest Hash for all XML
20
- xml_canon = node.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
21
- xml_digest = Base64.encode64(OpenSSL::Digest::SHA1.digest(xml_canon)).strip
22
-
23
- # 2. Add Signature Node
24
- signature = Nokogiri::XML::Node.new('Signature', self.xml_assinado)
25
- signature.default_namespace = 'http://www.w3.org/2000/09/xmldsig#'
26
- node.after(signature)
27
-
28
- # 3.1 Create Signature Info
29
- signature_info = Nokogiri::XML::Node.new('SignedInfo', self.xml_assinado)
30
-
31
- # 3.2 Add CanonicalizationMethod
32
- child_node = Nokogiri::XML::Node.new('CanonicalizationMethod', self.xml_assinado)
33
- child_node['Algorithm'] = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
34
- signature_info.add_child child_node
35
-
36
- # 3.3 Add SignatureMethod
37
- child_node = Nokogiri::XML::Node.new('SignatureMethod', self.xml_assinado)
38
- child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'
39
- signature_info.add_child child_node
40
-
41
- # 3.4 Create Reference
42
- reference = Nokogiri::XML::Node.new('Reference', self.xml_assinado)
43
- reference['URI'] = "##{node.first.last}"
44
-
45
- # 3.5 Add Transforms
46
- transforms = Nokogiri::XML::Node.new('Transforms', self.xml_assinado)
47
-
48
- child_node = Nokogiri::XML::Node.new('Transform', self.xml_assinado)
49
- child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#enveloped-signature'
50
- transforms.add_child child_node
51
-
52
- child_node = Nokogiri::XML::Node.new('Transform', self.xml_assinado)
53
- child_node['Algorithm'] = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
54
- transforms.add_child child_node
55
-
56
- reference.add_child transforms
57
-
58
- # 3.6 Add Digest
59
- child_node = Nokogiri::XML::Node.new('DigestMethod', self.xml_assinado)
60
- child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#sha1'
61
- reference.add_child child_node
62
-
63
- # 3.6 Add DigestValue
64
- child_node = Nokogiri::XML::Node.new('DigestValue', self.xml_assinado)
65
- child_node.content = xml_digest
66
- reference.add_child child_node
67
-
68
- # 3.7 Add Reference and Signature Info
69
- signature_info.add_child reference
70
- signature.add_child signature_info
71
-
72
- # 4 Sign Signature
73
- sign_canon = signature_info.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
74
- signature_hash = chave_privada.sign(OpenSSL::Digest::SHA1.new, sign_canon)
75
- signature_value = Base64.encode64( signature_hash ).gsub("\n", '')
76
-
77
- # 4.1 Add SignatureValue
78
- child_node = Nokogiri::XML::Node.new('SignatureValue', self.xml_assinado)
79
- child_node.content = signature_value
80
- signature.add_child child_node
81
-
82
- # 5 Create KeyInfo
83
- key_info = Nokogiri::XML::Node.new('KeyInfo', self.xml_assinado)
84
-
85
- # 5.1 Add X509 Data and Certificate
86
- x509_data = Nokogiri::XML::Node.new('X509Data', self.xml_assinado)
87
- x509_certificate = Nokogiri::XML::Node.new('X509Certificate', self.xml_assinado)
88
- x509_certificate.content = certificado.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").gsub(/\n/,"")
89
-
90
- x509_data.add_child x509_certificate
91
- key_info.add_child x509_data
92
-
93
- # 5.2 Add KeyInfo
94
- signature.add_child key_info
95
- end
96
-
97
- # Return XML
98
- self.xml_assinado.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
99
- end
100
-
101
- end
102
- end
@@ -1,7 +0,0 @@
1
- class Utils::Xml::CustomExceptions::ServerError < StandardError
2
- attr_reader :object
3
-
4
- def initialize(object)
5
- @object = object
6
- end
7
- end
@@ -1,8 +0,0 @@
1
- module InovadoraXml
2
- module Modules
3
- # extend ActiveSupport::Autoload
4
- autoload :FormatadorNfse, "inovadora_xml/modules/formatador_nfse"
5
- autoload :GeradorXml, "inovadora_xml/modules/gerador_xml"
6
- autoload :DadosNfseService, "inovadora_xml/modules/dados_nfse_service"
7
- end
8
- end
@@ -1,130 +0,0 @@
1
- # encoding=utf-8
2
- module InovadoraXml
3
- module Modules
4
- module DadosNfseService
5
- def numero_lote_rps
6
- self.fnnfse.build_fnnfses_sancionada if self.fnnfse.fnnfses_sancionada.blank?
7
- if self.fnnfse.fnnfses_sancionada.numero_rps.to_s == ""
8
- self.fnnfse.fnnfses_sancionada.numero_rps = self.fnnfse.class.connection.select_value("SELECT nextval('gestho.prox_nro_rps_nfse')")
9
- self.fnnfse.fnnfses_sancionada.save
10
- end
11
- return self.fnnfse.fnnfses_sancionada.numero_rps
12
- end
13
-
14
- def get_itens_servicos
15
- case self.parametro.fornecedor
16
- when 7..8 # Publica e #NF-em
17
- get_itens_servicos_publica
18
- else
19
- "Não implementado para esse fornecedor"
20
- end
21
- end
22
-
23
- def get_itens_servicos_publica
24
- itens_da_nota= "{"
25
- if self.fnnfse.descritivo_servico.to_s == ""
26
- unless self.fnnfse.fnpacote.nil?
27
- itens_da_nota += "[" +
28
- "[Descricao=#{self.fnnfse.try(:fnpacote).try(:descricao)} #{fnnfse.obs_pacote}]" +
29
- "[Quantidade=1.0]" +
30
- "[ValorUnitario=#{self.fnnfse.valor_pacote}]" +
31
- "[Deducoes=0]" +
32
- "[DescontoCondicionado=0]" +
33
- "[DescontoIncondicionado=#{self.fnnfse.valor_pacote_desconto.to_f.round(2)}]" +
34
- "[Aliquota=#{get_aliquota}]" +
35
- "[itemServico=#{get_item_lista_servico}]" +
36
- "]"
37
- end
38
- self.fnnfse.fnnfseis.each do |fnnfsei|
39
- qtde = fnnfsei.qtde.to_f.round(2) == 0 ? 1.0 : fnnfsei.qtde.to_f.round(2)
40
- itens_da_nota += "[" +
41
- "[Descricao=#{fnnfsei.ftforma.nome}]" +
42
- "[Quantidade=#{qtde}]" +
43
- "[ValorUnitario=#{(fnnfsei.valor.to_f / qtde).round(8)}]" +
44
- "[Deducoes=0]" +
45
- "[DescontoCondicionado=0]" +
46
- "[DescontoIncondicionado=#{fnnfsei.desconto.to_s.to_d}]" +
47
- "[Aliquota=#{get_aliquota}]" +
48
- "[itemServico=#{get_item_lista_servico}]" +
49
- "]"
50
- end
51
- else
52
- itens_da_nota += "[" +
53
- "[Descricao=#{self.fnnfse.descritivo_servico}]" +
54
- "[Quantidade=1.0]" +
55
- "[ValorUnitario=#{self.fnnfse.valor_servicos}]" +
56
- "[Deducoes=0]" +
57
- "[DescontoCondicionado=0]" +
58
- "[DescontoIncondicionado=#{self.fnnfse.valor_descontos}]" +
59
- "[Aliquota=#{get_aliquota}]" +
60
- "[itemServico=#{get_item_lista_servico}]" +
61
- "]"
62
- end
63
- itens_da_nota += "}"
64
- end
65
-
66
- def get_itens_servicos_texto
67
- itens_da_nota = ""
68
- if self.fnnfse.descritivo_servico.to_s == ""
69
- if self.fnnfse.try(:fnpacote).present?
70
- itens_da_nota += "#{self.fnnfse.try(:fnpacote).try(:descricao)} #{fnnfse.obs_pacote} " +
71
- "Valor: #{self.fnnfse.valor_pacote} " +
72
- "Desconto: #{self.fnnfse.valor_pacote_desconto.to_f.round(2)}"
73
- end
74
- if self.fnnfse.fnnfseis.size > 1
75
- self.fnnfse.fnnfseis.each do |fnnfsei|
76
- qtde = fnnfsei.qtde.to_f.round(2) == 0 ? 1.0 : fnnfsei.qtde.to_f.round(2)
77
- itens_da_nota += "- #{fnnfsei.ftforma.nome} Qtde: #{qtde} " +
78
- "Valor: #{((fnnfsei.valor.to_f / qtde).round(8)).round(2)} " +
79
- (fnnfsei.desconto.to_s.to_d>0 ? "Desconto: #{fnnfsei.desconto.to_s.to_d.round(2)}" : "") +
80
- " \n"
81
- end
82
- else
83
- fnnfsei = self.fnnfse.fnnfseis.first
84
- itens_da_nota += "#{fnnfsei.ftforma.nome}" rescue ""
85
- end
86
- else
87
- itens_da_nota += "#{self.fnnfse.descritivo_servico} " +
88
- "Valor: #{self.fnnfse.valor_servicos.to_d.round(2)} " +
89
- (self.fnnfse.valor_descontos.to_d>0 ? "Desconto: #{self.fnnfse.valor_descontos.to_d.round(2)}" : "")
90
- end
91
- itens_da_nota
92
- end
93
-
94
- def get_informacoes_complementares
95
- mensagem = self.fnnfse.observacao.to_s.strip
96
- if self.fnnfse.cliente_type == "Paciente"
97
- intern = self.fnnfse.fnnfses_interns.try(:first).try(:intern)
98
- unless intern.blank?
99
- mensagem += " Intern:#{intern.id}-#{intern.paciente.try(:nome).try(:strip)}"
100
- mensagem += " Conv.:#{intern.convenio.try(:nome).try(:strip)}"
101
- mensagem += " CPF:#{intern.paciente.cpf}" if intern.paciente.cpf.to_s.strip != "" && intern.paciente.cpf.to_s.strip != "0"
102
- mensagem += " Nasc:#{intern.paciente.data_nascimento.to_s_br}"
103
- end
104
- end
105
- mensagem = nil if mensagem.to_s.strip.blank?
106
- mensagem
107
- end
108
-
109
- def get_item_lista_servico
110
- self.hospital.iss_cd_lei_116 || '4.03'
111
- end
112
-
113
- def get_aliquota
114
- self.fnnfse.percentual_iss || 0.0
115
- end
116
-
117
- def get_cnpj_prestador
118
- self.hospital.cgc.to_s.gsub(/[^0-9]/, "")
119
- end
120
-
121
- def get_inscricao_municipal_prestador
122
- self.hospital.inscricao_municipal.to_s.gsub(/[^0-9]-/, "")
123
- end
124
-
125
- def get_codigo_municipio_prest_servico
126
- self.hospital.cidade_ibge.try(:ibge_com_digito)
127
- end
128
- end
129
- end
130
- end
@@ -1,36 +0,0 @@
1
- #encoding: utf-8
2
- module InovadoraXml
3
- module Modules
4
- module FormatadorNfse
5
- def data_formato_br(data)
6
- # Padrão: 11/11/2011
7
- data = data.to_time if data.class == String
8
- data.strftime('%d/%m/%Y') unless data.nil? || data.to_s == ""
9
- end
10
-
11
- def data_nfse(data)
12
- # Padrão: 2010-11-11
13
- data = data.to_time if data.class == String
14
- data.strftime('%Y-%m-%d') unless data.nil? || data.to_s == ""
15
- end
16
-
17
- def data_hora_nfse(data)
18
- # Padrão: 2010-09-16T14:50:00
19
- data = data.to_time if data.class == String
20
- data.strftime('%Y-%m-%dT%H:%M:%S') unless data.nil?
21
- end
22
-
23
- def data_hora_gmt(data)
24
- # Padrão: 2010-09-16T14:50:00
25
- data = data.to_time if data.class == String
26
- data.strftime('%Y-%m-%dT%H:%M:%S%:z') unless data.nil?
27
- end
28
-
29
- def hora_nfse(data)
30
- # Padrão: 11:26:00
31
- data = data.to_time if data.class == String
32
- data.strftime('%H:%M:%S') unless data.nil?
33
- end
34
- end
35
- end
36
- end
@@ -1,44 +0,0 @@
1
- #encoding: utf-8
2
- module InovadoraXml
3
- module Modules
4
- module GeradorXml
5
-
6
- def elemento(elemento, valor = nil)
7
- if valor.class == String
8
- valor.strip!
9
- valor = I18n.transliterate(valor)
10
- regex = /[^a-zA-Z0-9,.\-_\/:\[\]\=\$\@\{\}\/\n ]/
11
- #regex = /[^a-zA-Z0-9,.\-_\/:\[\]\=\$\@\{\}\/ ]/
12
- valor = valor.gsub(regex, "")
13
- end
14
- self.xml_nfse.send(elemento, valor) {
15
- yield if block_given?
16
- } unless valor.nil?
17
- end
18
-
19
- def grupo(elemento, id = nil)
20
- if id.present?
21
- self.xml_nfse.send(elemento, id) {
22
- yield if block_given?
23
- }
24
- else
25
- self.xml_nfse.send(elemento) {
26
- yield if block_given?
27
- }
28
- end
29
- end
30
-
31
- def construir(elemento_raiz)
32
- builder = Nokogiri::XML::Builder.new() do |xml|
33
- self.xml_nfse = xml
34
- elemento(elemento_raiz, get_namespace) {
35
- yield
36
- }
37
- end
38
- xml_builder = builder.to_xml(indent: 2, encoding: "UTF-8")
39
- doc = Nokogiri::XML(xml_builder, &:noblanks)
40
- return doc
41
- end
42
- end
43
- end
44
- end
@@ -1,54 +0,0 @@
1
- #encoding: utf-8
2
- module InovadoraXml
3
- class ServidorWsdl
4
- attr_accessor :xml_enviar, :metodo_soap, :wsdl, :args_request, :certificado, :chave, :retorno, :errors
5
-
6
-
7
- # servidor = Utils::Xml::ServidorWsdl.new(
8
- # gerar_xml_enviar,
9
- # self.metodo_soap,
10
- # "https://hom.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?WSDL",
11
- # {soap_action: "http://www.portalfiscal.inf.br/nfe/wsdl/NFeDistribuicaoDFe/nfeDistDFeInteresse"}
12
- # )
13
- def initialize(xml_enviar, metodo_soap, wsdl, args_request = {})
14
- self.xml_enviar = xml_enviar
15
- self.metodo_soap = metodo_soap
16
- self.wsdl = wsdl
17
-
18
- self.certificado = "#{Rails.root}/app/services/sefaz/assinatura/certificado.cer"
19
- self.chave = "#{Rails.root}/app/services/sefaz/assinatura/chave.cer"
20
-
21
- self.args_request = args_request
22
-
23
- self.errors = ActiveModel::Errors.new(self)
24
- end
25
-
26
- def enviar
27
- begin
28
- cliente = estabelecer_cliente()
29
-
30
- response = cliente.request(self.metodo_soap, args_request) do
31
- soap.xml = self.xml_enviar
32
- end
33
- self.retorno = response
34
- rescue Savon::SOAP::Fault => fault
35
- self.errors.add(:base, fault.to_s)
36
- rescue Savon::HTTP::Error => fault2
37
- self.errors.add(:base, fault2.to_s)
38
- rescue Exception => e
39
- self.errors.add(:base, e.message)
40
- ensure
41
- return self.errors.blank?
42
- end
43
- end
44
-
45
- def estabelecer_cliente
46
- Savon::Client.new do |wsdl, http|
47
- wsdl.document = self.wsdl
48
- http.auth.ssl.cert_file = self.certificado unless self.certificado.blank?
49
- http.auth.ssl.cert_key_file = self.chave unless self.certificado.blank?
50
- http.auth.ssl.verify_mode = :none
51
- end
52
- end
53
- end
54
- end
@@ -1,3 +0,0 @@
1
- module InovadoraXml
2
- VERSION = "0.0.2"
3
- end