rnfse 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }