rnfse 0.3.0 → 0.5.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +7 -6
  4. data/lib/provedores.yml +8 -0
  5. data/lib/rnfse.rb +5 -1
  6. data/lib/rnfse/api.rb +44 -22
  7. data/lib/rnfse/api/abrasf_1_0.rb +100 -17
  8. data/lib/rnfse/api/abrasf_1_0/#definitions.json# +413 -0
  9. data/lib/rnfse/api/abrasf_1_0/cancelar_nfse.json +13 -0
  10. data/lib/rnfse/api/abrasf_1_0/consultar_nfse.json +17 -0
  11. data/lib/rnfse/api/abrasf_1_0/consultar_nfse_por_rps.json +13 -0
  12. data/lib/rnfse/api/abrasf_1_0/definitions.json +27 -3
  13. data/lib/rnfse/api/abrasf_1_0/recepcionar_lote_rps.json +1 -1
  14. data/lib/rnfse/api/iss_net_1_0.rb +46 -2
  15. data/lib/rnfse/api/speed_gov_1_0.rb +115 -0
  16. data/lib/rnfse/call_chain.rb +4 -4
  17. data/lib/rnfse/error.rb +15 -0
  18. data/lib/rnfse/hash.rb +24 -11
  19. data/lib/rnfse/string.rb +16 -2
  20. data/lib/rnfse/version.rb +1 -1
  21. data/lib/rnfse/xml_builder/abrasf_1_0.rb +103 -13
  22. data/lib/rnfse/xml_builder/iss_net_1_0.rb +34 -4
  23. data/lib/rnfse/xml_builder/speed_gov_1_0.rb +158 -0
  24. data/spec/api/abrasf_1_0/cancelar_nfse_json_spec.rb +25 -0
  25. data/spec/api/abrasf_1_0/consultar_lote_rps_json_spec.rb +23 -0
  26. data/spec/api/abrasf_1_0/consultar_nfse_json_spec.rb +45 -0
  27. data/spec/api/abrasf_1_0/consultar_nfse_por_rps_json_spec.rb +23 -0
  28. data/spec/api/abrasf_1_0/consultar_situacao_lote_rps_json_spec.rb +23 -0
  29. data/spec/api/abrasf_1_0_spec.rb +185 -6
  30. data/spec/api/iss_net_1_0_spec.rb +89 -9
  31. data/spec/api/speed_gov_1_0_spec.rb +243 -0
  32. data/spec/api_spec.rb +43 -28
  33. data/spec/error_spec.rb +10 -0
  34. data/spec/fixtures/abrasf_1_0/cancelar_nfse_envio.xml +16 -0
  35. data/spec/fixtures/abrasf_1_0/consultar_nfse.xml +23 -0
  36. data/spec/fixtures/abrasf_1_0/consultar_nfse_por_rps.xml +14 -0
  37. data/spec/fixtures/iss_net_1_0/cancelar_nfse_envio.xml +17 -0
  38. data/spec/fixtures/iss_net_1_0/consultar_nfse.xml +29 -0
  39. data/spec/fixtures/iss_net_1_0/consultar_nfse_por_rps.xml +17 -0
  40. data/spec/fixtures/speed_gov_1_0/consultar_nfse_envio.xml +29 -0
  41. data/spec/fixtures/speed_gov_1_0/consultar_nfse_rps_envio.xml +16 -0
  42. data/spec/fixtures/speed_gov_1_0/consultar_situacao_lote_rps_envio.xml +12 -0
  43. data/spec/fixtures/speed_gov_1_0/enviar_lote_rps_envio.xml +82 -0
  44. data/spec/fixtures/speed_gov_1_0/header.xml +9 -0
  45. data/spec/fixtures/vcr_cassettes/iss_net_1_0_cancelar_nfse.yml +107 -0
  46. data/spec/fixtures/vcr_cassettes/iss_net_1_0_consultar_nfse.yml +7937 -0
  47. data/spec/fixtures/vcr_cassettes/iss_net_1_0_consultar_nfse_por_rps.yml +242 -0
  48. data/spec/fixtures/vcr_cassettes/speed_gov_1_0_consultar_nfse.yml +60 -0
  49. data/spec/fixtures/vcr_cassettes/speed_gov_1_0_consultar_nfse_por_rps.yml +80 -0
  50. data/spec/fixtures/vcr_cassettes/speed_gov_1_0_consultar_situacao_lote_rps.yml +77 -0
  51. data/spec/fixtures/vcr_cassettes/speed_gov_1_0_recepcionar_lote_rps.yml +171 -0
  52. data/spec/fixtures/vcr_cassettes/speed_gov_1_0_recepcionar_lote_rps_ascii.yml +171 -0
  53. data/spec/hash_spec.rb +21 -0
  54. data/spec/spec_helper.rb +2 -0
  55. data/spec/string_spec.rb +31 -5
  56. data/spec/xml_builder/abrasf_1_0_spec.rb +110 -43
  57. data/spec/xml_builder/iss_net_1_0_spec.rb +111 -44
  58. data/spec/xml_builder/speed_gov_1_0_spec.rb +173 -0
  59. metadata +86 -37
  60. data/.gitignore +0 -25
  61. data/.rspec +0 -1
  62. data/.travis.yml +0 -14
  63. data/Gemfile +0 -3
  64. data/Guardfile +0 -15
  65. data/Procfile +0 -1
  66. data/Rakefile +0 -12
  67. data/rnfse.gemspec +0 -61
  68. data/spec/fixtures/abrasf_1_0/teste.xml +0 -8
  69. data/spec/support/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7d0978da0b4e417d2b68c42d43a7020357c75fd
4
- data.tar.gz: eb5d2a24ee286fac30c8e295bd2f445f1a790a34
3
+ metadata.gz: e4a798eb55d0f7e2c930c5140085200a1653e3d2
4
+ data.tar.gz: 3f7057a92a3a5675c1df0b9c6b10f25ac97cf29e
5
5
  SHA512:
6
- metadata.gz: 48a7f94a739fbb5f44fc700e6ccea7a4f41a3f23417921ae55b460ab8215e2c7827b5d9229e551f84fdee9429635ea8a936266fbd642a078af02f970c658e00d
7
- data.tar.gz: d3b908f3a22e937ebcd65e3bc631ca22c81ec52ad07b7bfb95b5e77f49c6e140b8a201788ad0a70fb71af7551c5302f5036a3f1fef5bc1d82633cb832bfc6481
6
+ metadata.gz: e101457c59da02568f66d3a8b697f2ce2fc4b4550dbde9fd4ab004c6a90ea6b0965c39fa22ef2ddf37bf6a1c96a40c98a5bdefb37f5139bf4043a61150088a98
7
+ data.tar.gz: dce4fd87fc0458f7a937e24af4959d07d37f8d6550a8286a5c2366e0941f661ba021f5c7f26d44533074e26ef203567eca2893ab28f7670166d4f0a73086e64d
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 @ 2014-07-18
4
+ * Adequando melhor ao versionamento semântico
5
+ * Implementando consultar_situacao_lote_rps e consultar_lote_rps
6
+
3
7
  ## 0.0.2 @ 2014-07-11
4
8
  * BUGFIX ao usar o provedor ISS.net utilizar a api iss_net_1_0
5
9
 
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # rnfse
2
- [![Gem Version](http://img.shields.io/gem/v/rnfse.svg?style=flat)](http://rubygems.org/gems/rnfse)
3
- [![Dependency Status](https://img.shields.io/gemnasium/aitherios/rnfse.svg?style=flat)](https://gemnasium.com/aitherios/rnfse)
4
- [![Build Status](https://img.shields.io/travis/aitherios/rnfse.svg?style=flat)](https://travis-ci.org/aitherios/rnfse)
5
- [![Coverage](https://img.shields.io/codeclimate/coverage/github/aitherios/rnfse.svg?style=flat)](https://codeclimate.com/github/aitherios/rnfse)
2
+ [![Gem Version](http://img.shields.io/gem/v/rnfse.svg?style=flat-square)](http://rubygems.org/gems/rnfse)
3
+ [![Dependency Status](http://img.shields.io/gemnasium/aitherios/rnfse.svg?style=flat-square)](https://gemnasium.com/aitherios/rnfse)
4
+ [![Build Status](http://img.shields.io/travis/aitherios/rnfse.svg?style=flat-square)](https://travis-ci.org/aitherios/rnfse)
5
+ [![Coverage](http://img.shields.io/codeclimate/coverage/github/aitherios/rnfse.svg?style=flat-square)](https://codeclimate.com/github/aitherios/rnfse)
6
6
 
7
7
  Biblioteca para integração com as várias implementações
8
8
  municipais de Nota Fiscal de Serviços eletrônica (NFS-e) que utilizam uma
@@ -15,11 +15,11 @@ das versões ou variações dos padrões
15
15
  ## Instalação
16
16
 
17
17
  Usando o rubygems.org rode:
18
- ```
18
+ ```shell
19
19
  $ gem install rnfse
20
20
  ```
21
21
  **Ou** usando o repositório git rode:
22
- ```
22
+ ```shell
23
23
  $ gem build rnfse.gemspec
24
24
  $ gem install rnfse-X.X.X.gem
25
25
  ```
@@ -39,6 +39,7 @@ Esta é uma lista de limitações e problemas conhecidos. São questões que nã
39
39
  plano imediato de resolução. Talvez porque a funcionalidade nunca foi
40
40
  necessária ou nenhum pull request tenha sido enviado. (dica!)
41
41
 
42
+ - Sem documentação =/
42
43
  - Suporte para o JRuby e Rubinius (problema com a dependência nokogiri-xmlsec1).
43
44
  - Só foi testada com municípios inscritos no [ISS.net](http://www.issnetonline.com.br/portaliss/) que utilizam o padrão [ABRASF v1](http://www.abrasf.org.br/paginas_multiplas_detalhes.php?cod_pagina=1).
44
45
 
@@ -3,9 +3,17 @@ producao:
3
3
  namespace: http://www.issnetonline.com.br/webservice/nfd
4
4
  endpoint: http://www.issnetonline.com.br/webserviceabrasf/%{municipio}/servicos.asmx
5
5
  api: iss_net_1_0
6
+ speed_gov:
7
+ namespace: http://ws.speedgov.com.br/
8
+ endpoint: http://www.speedgov.com.br/ws%{municipio}/Nfes
9
+ api: speed_gov_1_0
6
10
 
7
11
  homologacao:
8
12
  iss_net:
9
13
  namespace: http://www.issnetonline.com.br/webservice/nfd
10
14
  endpoint: http://www.issnetonline.com.br/webserviceabrasf/homologacao/servicos.asmx
11
15
  api: iss_net_1_0
16
+ speed_gov:
17
+ namespace: http://ws.speedgov.com.br/
18
+ endpoint: http://speedgov.com.br/wsmod/Nfes
19
+ api: speed_gov_1_0
@@ -6,9 +6,11 @@ require 'json-schema'
6
6
  require 'gyoku'
7
7
  require 'nokogiri-xmlsec1'
8
8
  require 'savon'
9
+ require 'cgi'
9
10
 
10
- require 'rnfse/core'
11
11
  require 'rnfse/version'
12
+ require 'rnfse/error'
13
+ require 'rnfse/core'
12
14
  require 'rnfse/configuration'
13
15
  require 'rnfse/hash'
14
16
  require 'rnfse/string'
@@ -17,7 +19,9 @@ require 'rnfse/call_chain'
17
19
  require 'rnfse/api'
18
20
  require 'rnfse/api/abrasf_1_0'
19
21
  require 'rnfse/api/iss_net_1_0'
22
+ require 'rnfse/api/speed_gov_1_0'
20
23
 
21
24
  require 'rnfse/xml_builder'
22
25
  require 'rnfse/xml_builder/abrasf_1_0'
23
26
  require 'rnfse/xml_builder/iss_net_1_0'
27
+ require 'rnfse/xml_builder/speed_gov_1_0'
@@ -14,52 +14,70 @@ module Rnfse
14
14
 
15
15
  def initialize(options = {})
16
16
  options = load_options(options)
17
-
18
- file = Pathname.new(File.expand_path('../..', __FILE__))
19
- provedores = YAML.load_file(file.join('provedores.yml'))
20
-
17
+
21
18
  case
22
19
  when has_options(options, 'provedor', 'homologacao')
23
20
  provedor = provedores['homologacao'][options['provedor'].to_s]
24
21
  raise ArgumentError, 'provedor de homologação inexistente', caller if provedor.nil?
25
- self.namespace = provedor['namespace']
26
- self.endpoint = provedor['endpoint']
27
22
  self.api = provedor['api']
23
+ load_options_method = :load_options_for_staging
28
24
 
29
25
  when has_options(options, 'provedor', 'municipio')
30
26
  provedor = provedores['producao'][options['provedor'].to_s]
31
27
  raise ArgumentError, 'provedor inexistente', caller if provedor.nil?
32
- self.namespace = provedor['namespace']
33
- self.endpoint = provedor['endpoint'] % { municipio: options['municipio'] }
34
28
  self.api = provedor['api']
29
+ load_options_method = :load_options_for_production
35
30
 
36
31
  when has_options(options, 'padrao', 'namespace', 'endpoint')
37
- self.namespace = options['namespace'].to_s
38
- self.endpoint = options['endpoint'].to_s
39
32
  self.api = options['padrao'].to_s
33
+ load_options_method = :load_options_for_custom
40
34
 
41
35
  else
42
36
  raise ArgumentError, 'opções inválidas', caller
43
37
  end
44
38
 
45
- if has_options(options, 'certificate', 'key')
46
- self.certificate = options['certificate']
47
- self.key = options['key']
48
- else
49
- raise ArgumentError, 'opções de assinatura digital faltando', caller
50
- end
39
+ extend self.class.const_get(String.camelize(self.api))
40
+
41
+ self.send(load_options_method, options)
42
+ end
43
+
44
+ private
45
+
46
+ def load_options_for_custom(options)
47
+ self.namespace = options['namespace'].to_s
48
+ self.endpoint = options['endpoint'].to_s
49
+ load_default_options(options)
50
+ end
51
+
52
+ def load_options_for_production(options)
53
+ provedor = provedores['producao'][options['provedor'].to_s]
54
+ self.namespace = provedor['namespace']
55
+ self.endpoint = provedor['endpoint'] % { municipio: options['municipio'] }
56
+ load_default_options(options)
57
+ end
51
58
 
59
+ def load_options_for_staging(options)
60
+ provedor = provedores['homologacao'][options['provedor'].to_s]
61
+ self.namespace = provedor['namespace']
62
+ self.endpoint = provedor['endpoint']
63
+ load_default_options(options)
64
+ end
65
+
66
+ def load_default_options(options)
67
+ self.certificate = options['certificate']
68
+ self.key = options['key']
52
69
  self.verbose = options['verbose'] || false
53
70
  self.xml_builder = options['xml_builder'] || XMLBuilder.new(padrao: self.api)
54
71
  self.soap_client = options['soap_client'] || savon_client
55
-
56
- extend self.class.const_get(String.camelize(self.api))
57
72
  end
58
73
 
59
- private
74
+ def provedores
75
+ file = Pathname.new(File.expand_path('../..', __FILE__))
76
+ YAML.load_file(file.join('provedores.yml'))
77
+ end
60
78
 
61
- def savon_client
62
- savon_hash = {
79
+ def savon_client_options
80
+ {
63
81
  soap_version: 2,
64
82
  env_namespace: :soap,
65
83
  namespace_identifier: nil,
@@ -69,11 +87,15 @@ module Rnfse
69
87
  endpoint: self.endpoint,
70
88
  namespace: self.namespace
71
89
  }
90
+ end
91
+
92
+ def savon_client
93
+ savon_hash = savon_client_options
72
94
 
73
95
  savon_hash = savon_hash.merge(
74
96
  log: true,
75
97
  log_level: :debug,
76
- pretty_print_xml: true
98
+ pretty_print_xml: false
77
99
  ) if self.verbose
78
100
 
79
101
  Savon.client(savon_hash)
@@ -5,10 +5,29 @@ module Rnfse::API::Abrasf10
5
5
 
6
6
  module ClassMethods
7
7
 
8
+ def operations()
9
+ [ :recepcionar_lote_rps, :consultar_situacao_lote_rps,
10
+ :consultar_nfse_por_rps, :consultar_nfse, :consultar_lote_rps,
11
+ :cancelar_nfse ]
12
+ end
13
+
8
14
  def recepcionar_lote_rps(hash = {})
9
- validate(hash)
10
- xml = xml_builder.build_recepcionar_lote_rps_xml(hash)
11
- xml.sign!(certificate: File.read(self.certificate), key: File.read(self.key))
15
+ validate_sign_options
16
+ validate_options(hash)
17
+ xml = xml_builder.build_recepcionar_lote_rps_xml(hash) do |inner_xml|
18
+ regex = /<tc:Rps>.*<\/tc:Rps>/
19
+ plain_xml = inner_xml.to_xml(
20
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
21
+ signed_rps = Nokogiri::XML(
22
+ plain_xml.match(regex)[0]).
23
+ sign!(
24
+ certificate: File.read(self.certificate),
25
+ key: File.read(self.key)).
26
+ to_xml(
27
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).
28
+ strip
29
+ plain_xml.gsub(regex, signed_rps)
30
+ end
12
31
  response = self.soap_client.call(
13
32
  :recepcionar_lote_rps,
14
33
  soap_action: 'RecepcionarLoteRps',
@@ -17,8 +36,41 @@ module Rnfse::API::Abrasf10
17
36
  parse_response(response)
18
37
  end
19
38
 
39
+ def consultar_situacao_lote_rps(hash = {})
40
+ validate_options(hash)
41
+ xml = xml_builder.build_consultar_situacao_lote_rps_xml(hash)
42
+ response = self.soap_client.call(
43
+ :consultar_situacao_lote_rps,
44
+ soap_action: 'ConsultarSituacaoLoteRps',
45
+ message_tag: 'ConsultarSituacaoLoteRps',
46
+ message: { :'xml!' => "<![CDATA[#{xml}]]>" })
47
+ parse_response(response)
48
+ end
49
+
50
+ def consultar_nfse_por_rps(hash = {})
51
+ validate_options(hash)
52
+ xml = xml_builder.build_consultar_nfse_por_rps_xml(hash)
53
+ response = self.soap_client.call(
54
+ :consultar_nfse_por_rps,
55
+ soap_action: 'ConsultarNfsePorRps',
56
+ message_tag: 'ConsultarNfsePorRps',
57
+ message: { :'xml!' => "<![CDATA[#{xml}]]>" })
58
+ parse_response(response)
59
+ end
60
+
61
+ def consultar_nfse(hash = {})
62
+ validate_options(hash)
63
+ xml = xml_builder.build_consultar_nfse_xml(hash)
64
+ response = self.soap_client.call(
65
+ :consultar_nfse,
66
+ soap_action: 'ConsultarNfse',
67
+ message_tag: 'ConsultarNfse',
68
+ message: { :'xml!' => "<![CDATA[#{xml}]]>" })
69
+ parse_response(response)
70
+ end
71
+
20
72
  def consultar_lote_rps(hash = {})
21
- validate(hash)
73
+ validate_options(hash)
22
74
  xml = xml_builder.build_consultar_lote_rps_xml(hash)
23
75
  response = self.soap_client.call(
24
76
  :consultar_lote_rps,
@@ -28,21 +80,32 @@ module Rnfse::API::Abrasf10
28
80
  parse_response(response)
29
81
  end
30
82
 
31
- def consultar_situacao_lote_rps(hash = {})
32
- validate(hash)
33
- xml = xml_builder.build_consultar_situacao_lote_rps_xml(hash)
83
+ def cancelar_nfse(hash = {})
84
+ validate_options(hash)
85
+ xml = xml_builder.build_cancelar_nfse_xml(hash) do |inner_xml|
86
+ inner_xml.sign!(certificate: File.read(self.certificate), key: File.read(self.key))
87
+ inner_xml.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
88
+ end
34
89
  response = self.soap_client.call(
35
- :consultar_situacao_lote_rps,
36
- soap_action: 'ConsultarSituacaoLoteRps',
37
- message_tag: 'ConsultarSituacaoLoteRps',
90
+ :cancelar_nfse,
91
+ soap_action: 'CancelarNfse',
92
+ message_tag: 'CancelarNfse',
38
93
  message: { :'xml!' => "<![CDATA[#{xml}]]>" })
39
94
  parse_response(response)
40
95
  end
41
96
 
42
97
  private
43
98
 
44
- def validate(hash)
45
- file = get_filepath("#{Rnfse::CallChain.caller_method}.json")
99
+ def validate_sign_options
100
+ if self.certificate.nil? or self.key.nil?
101
+ raise ArgumentError, 'opções de assinatura digital ' <<
102
+ '(certificate e key) ao criar ' <<
103
+ 'o Rnfse::API faltando', caller
104
+ end
105
+ end
106
+
107
+ def validate_options(hash)
108
+ file = json_filepath("#{Rnfse::CallChain.caller_method}.json")
46
109
  json = Rnfse::Hash.camelize_and_symbolize_keys(hash, false).to_json
47
110
  errors = JSON::Validator.fully_validate(file, json)
48
111
  raise ArgumentError, errors, caller unless errors.empty?
@@ -50,17 +113,37 @@ module Rnfse::API::Abrasf10
50
113
 
51
114
  def parse_response(response)
52
115
  hash = Rnfse::Hash.new(response.body)
53
- response_key = hash.keys.select { |k| k =~ /response$/ }.first
54
- result_key = hash[response_key].keys.select { |k| k =~ /result$/ }.first
55
- if !hash[response_key].nil? and hash[response_key]
116
+
117
+ response_key = hash.keys.select { |k| k =~ /response$/ }
118
+ response_key = response_key.first unless response_key.nil?
119
+
120
+ if hash[response_key]
121
+ result_key = hash[response_key].keys.select { |k| k =~ /result$/ }
122
+ result_key = result_key.first unless result_key.nil?
123
+ else
124
+ result_key = nil
125
+ end
126
+
127
+ if response_key and result_key
56
128
  xml = hash[response_key][result_key]
57
129
  hash[response_key][result_key] = Nori.new.parse(xml)
58
130
  end
59
131
  hash.underscore_and_symbolize_keys
60
132
  end
61
133
 
62
- def get_filepath(filename)
63
- File.join(File.expand_path(File.dirname(__FILE__)), 'abrasf_1_0', filename)
134
+ def json_folder
135
+ 'abrasf_1_0'
136
+ end
137
+
138
+ def json_filepath(filename)
139
+ result = nil
140
+ folders = ['abrasf_1_0']
141
+ folders = folders.unshift(json_folder) unless folders.include?(json_folder)
142
+ folders.each do |folder|
143
+ path = File.join(File.expand_path(File.dirname(__FILE__)), folder, filename)
144
+ result = path if File.exists?(path)
145
+ end
146
+ result
64
147
  end
65
148
 
66
149
  end
@@ -0,0 +1,413 @@
1
+ {
2
+ "numeroNfse": {
3
+ "description": "Número da Nota Fiscal de Serviço Eletrônica, formado pelo ano com 04 (quatro) dígitos e um número seqüencial com 11 posições – Formato AAAANNNNNNNNNNN.",
4
+ "type": "integer",
5
+ "minimum": 190000000000000,
6
+ "maximum": 220099999999999
7
+ },
8
+ "codigoVerificacao": {
9
+ "description": "Código de verificação do número da nota",
10
+ "type": "string",
11
+ "maxLength": 9
12
+ },
13
+ "statusRps": {
14
+ "description": "Código de status do RPS 1 – Normal ; 2 – Cancelado",
15
+ "type": "integer",
16
+ "minimum": 1,
17
+ "maximum": 2
18
+ },
19
+ "statusNfse": {
20
+ "description": "Código de status da NFS-e 1 – Normal ; 2 – Cancelado",
21
+ "type": "integer",
22
+ "minimum": 1,
23
+ "maximum": 2
24
+ },
25
+ "naturezaOperacao": {
26
+ "description": "Código de natureza da operação 1 – Tributação no município ; 2 - Tributação fora do município ; 3 - Isenção ; 4 - Imune ; 5 – Exigibilidade suspensa por decisão judicial ; 6 – Exigibilidade suspensa por procedimento administrativo ",
27
+ "type": "integer",
28
+ "minimum": 1,
29
+ "maximum": 6
30
+ },
31
+ "regimeEspecialTributacao": {
32
+ "description": "Código de natureza da operação 1 – Tributação no município ; 2 - Tributação fora do município ; 3 - Isenção ; 4 - Imune ; 5 – Exigibilidade suspensa por decisão judicial ; 6 – Exigibilidade suspensa por procedimento administrativo ",
33
+ "type": "integer",
34
+ "minimum": 1,
35
+ "maximum": 6
36
+ },
37
+ "simNao": {
38
+ "type": "boolean"
39
+ },
40
+ "quantidadeRps": {
41
+ "description": "Quantidade de RPS do Lote",
42
+ "type": "integer",
43
+ "minimum": 1,
44
+ "maximum": 9999
45
+ },
46
+ "numeroRps": {
47
+ "description": "Número do RPS",
48
+ "type": "integer",
49
+ "minimum": 0,
50
+ "maximum": 999999999999999
51
+ },
52
+ "serieRps": {
53
+ "description": "Número de série do RPS",
54
+ "type": "string",
55
+ "maxLength": 5
56
+ },
57
+ "tipoRps": {
58
+ "description": "Código de tipo de RPS 1 - RPS ; 2 – Nota Fiscal Conjugada (Mista) ; 3 – Cupom",
59
+ "type": "integer",
60
+ "minimum": 1,
61
+ "maximum": 3
62
+ },
63
+ "outrasInformacoes": {
64
+ "description": "Informações adicionais ao documento",
65
+ "type": "string",
66
+ "maxLength": 255
67
+ },
68
+ "valor": {
69
+ "description": "Valor monetário. Formato: 0.00 (ponto separando casa decimal) Ex: 1.234,56 = 1234.56 ; 1.000,00 = 1000.00 ; 1.000,00 = 1000",
70
+ "type": "number",
71
+ "minimum": 0,
72
+ "maximum": 9999999999999.99
73
+ },
74
+ "itemListaServico": {
75
+ "description": "Código de item da lista de serviço",
76
+ "type": "string",
77
+ "maxLength": 5
78
+ },
79
+ "codigoCnae": {
80
+ "description": "Código CNAE. Formato: 0000-0/00",
81
+ "type": "string",
82
+ "pattern": "^[0-9]{4}-[0-9]{1}/[0-9]{2}$"
83
+ },
84
+ "codigoTributacao": {
85
+ "description": "Código de Tributação",
86
+ "type": "string",
87
+ "maxLength": 20
88
+ },
89
+ "aliquota": {
90
+ "description": "Alíquota. Valor percentual. Formato: 0.0000 Ex: 1% = 0.01 ; 25,5% = 0.255 ; 100% = 1.0000 ou 1",
91
+ "type": "numeric",
92
+ "minimum": 0,
93
+ "maximum": 1
94
+ },
95
+ "discriminacao": {
96
+ "description": "Discriminação do conteúdo da NFS-e",
97
+ "type": "string",
98
+ "maxLength": 2000
99
+ },
100
+ "codigoMunicipioIbge": {
101
+ "description": "Código de identificação do município conforme tabela do IBGE",
102
+ "type": "integer",
103
+ "minimum": 1,
104
+ "maximum": 9999999
105
+ },
106
+ "inscricaoMunicipal": {
107
+ "description": "Número de inscrição municipal",
108
+ "type": "string",
109
+ "maxLength": 15
110
+ },
111
+ "razaoSocial": {
112
+ "description": "Razão Social do contribuinte",
113
+ "type": "string",
114
+ "maxLength": 115
115
+ },
116
+ "nomeFantasia": {
117
+ "description": "Nome fantasia",
118
+ "type": "string",
119
+ "maxLength": 60
120
+ },
121
+ "cnpj": {
122
+ "description": "Número CNPJ. Formato: 00.000.000/0000-00",
123
+ "type": "string",
124
+ "pattern": "^[0-9]{2}\.[0-9]{3}\.[0-9]{3}/[0-9]{4}-[0-9]{2}$"
125
+ },
126
+ "endereco": {
127
+ "description": "Endereço",
128
+ "type": "string",
129
+ "maxLength": 125
130
+ },
131
+ "numeroEndereco": {
132
+ "description": "Número do endereço",
133
+ "type": "string",
134
+ "maxLength": 10
135
+ },
136
+ "complementoEndereco": {
137
+ "description": "Número do endereço",
138
+ "type": "string",
139
+ "maxLength": 60
140
+ },
141
+ "bairro": {
142
+ "description": "Bairro",
143
+ "type": "string",
144
+ "maxLength": 60
145
+ },
146
+ "uf": {
147
+ "description": "Sigla da unidade federativa",
148
+ "type": "string",
149
+ "enum": ["AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", "TO"]
150
+ },
151
+ "cep": {
152
+ "description": "Número do CEP. Formato: 00000-000",
153
+ "type": "string",
154
+ "pattern": "^[0-9]{5}-[0-9]{3}$"
155
+ },
156
+ "email": {
157
+ "description": "E-mail",
158
+ "type": "string",
159
+ "format": "email"
160
+ },
161
+ "telefone": {
162
+ "description": "Telefone",
163
+ "type": "string",
164
+ "maxLength": 11
165
+ },
166
+ "cpf": {
167
+ "description": "Número de CPF. Formato: 000.000.000-00",
168
+ "type": "string",
169
+ "pattern": "^[0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}$"
170
+ },
171
+ "indicacaoCpfCnpj": {
172
+ "description": "Indicador de uso de CPF ou CNPJ 1 – CPF ; 2 – CNPJ ; 3 – Não Informado",
173
+ "type": "integer",
174
+ "minimum": 1,
175
+ "maximum": 3
176
+ },
177
+ "codigoObra": {
178
+ "description": "Código de Obra",
179
+ "type": "string",
180
+ "maxLength": 15
181
+ },
182
+ "art": {
183
+ "description": "Código ART",
184
+ "type": "string",
185
+ "maxLength": 15
186
+ },
187
+ "numeroLote": {
188
+ "description": "Número do Lote de RPS",
189
+ "type": "integer",
190
+ "minimum": 1,
191
+ "maximum": 999999999999999
192
+ },
193
+ "numeroProtocolo": {
194
+ "description": "Número do protocolo de recebimento do RPS",
195
+ "type": "string",
196
+ "maxLength": 50
197
+ },
198
+ "situacaoLoteRps": {
199
+ "description": "Código de situação de lote de RPS 1 – Não Recebido ; 2 – Não Processado ; 3 – Processado com Erro ; 4 – Processado com Sucesso",
200
+ "type": "integer",
201
+ "minimum": 1,
202
+ "maximum": 4
203
+ },
204
+ "codigoMensagemAlerta": {
205
+ "description": "Código de mensagem de retorno de serviço",
206
+ "type": "string",
207
+ "maxLength": 4
208
+ },
209
+ "descricaoMensagemAlerta": {
210
+ "description": "Descrição da mensagem de retorno de serviço",
211
+ "type": "string",
212
+ "maxLength": 200
213
+ },
214
+ "codigoCancelamentoNfse": {
215
+ "description": "Código de cancelamento com base na tabela de Erros e alertas",
216
+ "type": "string",
217
+ "maxLength": 4
218
+ },
219
+ "idTag": {
220
+ "description": "Atributo de identificação da tag a ser assinada no documento XML",
221
+ "type": "string",
222
+ "maxLength": 255
223
+ },
224
+ "identificacaoRps": {
225
+ "description": "Dados de identificação do RPS",
226
+ "type": "object",
227
+ "properties": {
228
+ "numero": { "$ref": "#/numeroRps" },
229
+ "serie": { "$ref": "#/serieRps" },
230
+ "tipo": { "$ref": "#/tipoRps" }
231
+ },
232
+ "required": ["numero", "serie", "tipo"],
233
+ "additionalProperties": false
234
+ },
235
+ "dadosServico": {
236
+ "description": "Representa dados que compõe o serviço prestado",
237
+ "type": "object",
238
+ "properties": {
239
+ "valores": {
240
+ "type": "object",
241
+ "properties": {
242
+ "valorServicos": { "$ref": "#/valor" },
243
+ "valorDeducoes": { "$ref": "#/valor" },
244
+ "valorPis": { "$ref": "#/valor" },
245
+ "valorCofins": { "$ref": "#/valor" },
246
+ "valorInss": { "$ref": "#/valor" },
247
+ "valorIr": { "$ref": "#/valor" },
248
+ "valorCsll": { "$ref": "#/valor" },
249
+ "issRetido": { "type": "boolean" },
250
+ "valorIss": { "$ref": "#/valor" },
251
+ "outrasRetencoes": { "$ref": "#/valor" },
252
+ "baseCalculo": {
253
+ "description": "(Valor dos serviços - Valor das deduções - descontos incondicionados)",
254
+ "$ref": "#/valor"
255
+ },
256
+ "aliquota": { "$ref": "#/aliquota" },
257
+ "valorLiquidoNfse": {
258
+ "description": "(ValorServicos - ValorPIS - ValorCOFINS - ValorINSS - ValorIR - ValorCSLL - OutrasRetençoes - ValorISSRetido - DescontoIncondicionado - DescontoCondicionado)",
259
+ "$ref": "#/valor"
260
+ },
261
+ "valorIssRetido": { "$ref": "#/valor" },
262
+ "descontoCondicionado": { "$ref": "#/valor" },
263
+ "descontoIncondicionado": { "$ref": "#/valor" }
264
+ },
265
+ "required": ["valorServicos", "issRetido", "baseCalculo"],
266
+ "additionalProperties": false
267
+ },
268
+ "itemListaServico": { "$ref": "#/itemListaServico" },
269
+ "codigoCnae": { "$ref": "#/codigoCnae" },
270
+ "codigoTributacaoMunicipio": { "$ref": "#/codigoTributacao" },
271
+ "discriminacao": { "$ref": "#/discriminacao" },
272
+ "codigoMunicipio": { "$ref": "#/codigoMunicipioIbge" }
273
+ },
274
+ "required": ["valores", "itemListaServico", "discriminacao", "codigoMunicipio"],
275
+ "additionalProperties": false
276
+ },
277
+ "identificacaoPrestador": {
278
+ "description": "Representa dados para identificação do prestador de serviço",
279
+ "oneOf": [
280
+ {
281
+ "type": "object",
282
+ "properties": {
283
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" },
284
+ "cnpj": { "$ref": "#/cnpj" }
285
+ },
286
+ "required": ["cnpj"],
287
+ "additionalProperties": false
288
+ },
289
+ {
290
+ "type": "object",
291
+ "properties": {
292
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" },
293
+ "cpf": { "$ref": "#/cpf" }
294
+ },
295
+ "required": ["cpf"],
296
+ "additionalProperties": false
297
+ }
298
+ ]
299
+ },
300
+ "dadosTomador": {
301
+ "description": "Representa dados do tomador de serviço",
302
+ "type": "object",
303
+ "properties": {
304
+ "identificacaoTomador": { "$ref": "#/identificacaoTomador" },
305
+ "razaoSocial": { "$ref": "#/razaoSocial" },
306
+ "endereco": { "$ref": "#/enderecoCompleto" },
307
+ "contato": { "$ref": "#/contato" }
308
+ },
309
+ "additionalProperties": false
310
+ },
311
+ "identificacaoTomador": {
312
+ "description": "Representa dados para identificação do tomador de serviço",
313
+ "oneOf": [
314
+ {
315
+ "type": "object",
316
+ "properties": {
317
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" },
318
+ "cnpj": { "$ref": "#/cnpj" }
319
+ },
320
+ "additionalProperties": false
321
+ },
322
+ {
323
+ "type": "object",
324
+ "properties": {
325
+ "cpf": { "$ref": "#/cpf" }
326
+ },
327
+ "additionalProperties": false
328
+ }
329
+ ]
330
+ },
331
+ "enderecoCompleto": {
332
+ "description": "Representação completa do endereço.",
333
+ "type": "object",
334
+ "properties": {
335
+ "endereco": { "$ref": "#/endereco" },
336
+ "numero": { "$ref": "#/numeroEndereco" },
337
+ "complemento": { "$ref": "#/complementoEndereco" },
338
+ "bairro": { "$ref": "#/bairro" },
339
+ "codigoMunicipio": { "$ref": "#/codigoMunicipioIbge" },
340
+ "uf": { "$ref": "#/uf" },
341
+ "cep": { "$ref": "#/cep" }
342
+ },
343
+ "required": [],
344
+ "additionalProperties": false
345
+ },
346
+ "contato": {
347
+ "description": "Representa forma de contato com a pessoa (física/jurídica)",
348
+ "type": "object",
349
+ "properties": {
350
+ "telefone": { "$ref": "#/telefone" },
351
+ "email": { "$ref": "#/email" }
352
+ },
353
+ "required": [],
354
+ "additionalProperties": false
355
+ },
356
+ "identificacaoIntermediarioServico": {
357
+ "description": "Representa dados para identificação de intermediário do serviço",
358
+ "oneOf": [
359
+ {
360
+ "type": "object",
361
+ "properties": {
362
+ "razaoSocial": { "$ref": "#/razaoSocial" },
363
+ "cnpj": { "$ref": "#/cnpj" },
364
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" }
365
+ },
366
+ "required": ["razaoSocial", "cnpj"],
367
+ "additionalProperties": false
368
+ },
369
+ {
370
+ "type": "object",
371
+ "properties": {
372
+ "razaoSocial": { "$ref": "#/razaoSocial" },
373
+ "cpf": { "$ref": "#/cpf" },
374
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" }
375
+ },
376
+ "required": ["cpf"],
377
+ "additionalProperties": false
378
+ }
379
+ ]
380
+ },
381
+ "dadosConstrucaoCivil": {
382
+ "description": "Representa dados para identificação de intermediário do serviço",
383
+ "type": "object",
384
+ "properties": {
385
+ "codigoObra": { "$ref": "#/codigoObra" },
386
+ "art": { "$ref": "#/art" }
387
+ },
388
+ "required": [],
389
+ "additionalProperties": false
390
+ },
391
+ "data": {
392
+ "description": "Data como representada no padrão RFC 3339 section 5.6",
393
+ "type": "string",
394
+ "format": "date-time"
395
+ },
396
+ "codigoCancelamentoNfse": {
397
+ "description": "Código de cancelamento com base na tabela de erros e alertas",
398
+ "type": "string",
399
+ "maxLength": 4
400
+ },
401
+ "identificacaoNfse": {
402
+ "description": "Representa dados que identificam uma Nota Fiscal de Serviços Eletrônica",
403
+ "type": "object",
404
+ "properties": {
405
+ "numero": { "$ref": "#/numeroNfse" },
406
+ "cnpj": { "$ref": "#/cnpj" },
407
+ "inscricaoMunicipal": { "$ref": "#/inscricaoMunicipal" },
408
+ "codigoMunicipio": { "$ref": "#/codigoMunicipioIbge" },
409
+ },
410
+ "required": ["numero", "cnpj"],
411
+ "additionalProperties": false
412
+ }
413
+ }