focus_nfe 1.0.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 (206) hide show
  1. checksums.yaml +7 -0
  2. data/.git-hooks/pre_push/steep.rb +18 -0
  3. data/.git-hooks/pre_push/yard_doc.rb +18 -0
  4. data/.gitattributes +1 -0
  5. data/.overcommit.yml +69 -0
  6. data/.rspec +3 -0
  7. data/.yardopts +11 -0
  8. data/CHANGELOG.md +77 -0
  9. data/CLAUDE.md +118 -0
  10. data/CODE_OF_CONDUCT.md +10 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +348 -0
  13. data/Rakefile +105 -0
  14. data/data/schemas/schema_cte.json +2793 -0
  15. data/data/schemas/schema_cte_os.json +1335 -0
  16. data/data/schemas/schema_cte_os_transporte_rodoviario.json +109 -0
  17. data/data/schemas/schema_cte_transporte_aereo.json +115 -0
  18. data/data/schemas/schema_cte_transporte_aquaviario.json +174 -0
  19. data/data/schemas/schema_cte_transporte_dutoviario.json +65 -0
  20. data/data/schemas/schema_cte_transporte_ferroviario.json +144 -0
  21. data/data/schemas/schema_cte_transporte_multimodal.json +45 -0
  22. data/data/schemas/schema_cte_transporte_rodoviario.json +78 -0
  23. data/data/schemas/schema_dce.json +549 -0
  24. data/data/schemas/schema_mdfe.json +1102 -0
  25. data/data/schemas/schema_mdfe_transporte_aereo.json +44 -0
  26. data/data/schemas/schema_mdfe_transporte_aquaviario.json +209 -0
  27. data/data/schemas/schema_mdfe_transporte_ferroviario.json +99 -0
  28. data/data/schemas/schema_mdfe_transporte_rodoviario.json +628 -0
  29. data/data/schemas/schema_nfcom.json +1859 -0
  30. data/data/schemas/schema_nfe.json +4750 -0
  31. data/data/schemas/schema_nfe_forma_pagamento.json +97 -0
  32. data/data/schemas/schema_nfe_item.json +2574 -0
  33. data/data/schemas/schema_nfgas.json +2316 -0
  34. data/data/schemas/schema_nfse_nacional.json +1847 -0
  35. data/data/schemas/schema_nfse_recebida.json +548 -0
  36. data/lib/focus_nfe/client.rb +162 -0
  37. data/lib/focus_nfe/configuration.rb +104 -0
  38. data/lib/focus_nfe/errors.rb +123 -0
  39. data/lib/focus_nfe/esquemas/campo.rb +171 -0
  40. data/lib/focus_nfe/esquemas/catalogo.rb +34 -0
  41. data/lib/focus_nfe/esquemas/decimal.rb +66 -0
  42. data/lib/focus_nfe/esquemas/esquema.rb +72 -0
  43. data/lib/focus_nfe/esquemas/validador.rb +87 -0
  44. data/lib/focus_nfe/http/adapter.rb +25 -0
  45. data/lib/focus_nfe/http/adapters/net_http.rb +99 -0
  46. data/lib/focus_nfe/http/authentication.rb +23 -0
  47. data/lib/focus_nfe/http/connection.rb +118 -0
  48. data/lib/focus_nfe/http/logging.rb +100 -0
  49. data/lib/focus_nfe/http/response.rb +75 -0
  50. data/lib/focus_nfe/modelos/documento.rb +113 -0
  51. data/lib/focus_nfe/modelos/inutilizacao.rb +75 -0
  52. data/lib/focus_nfe/modelos/pagina.rb +54 -0
  53. data/lib/focus_nfe/recursos/backups.rb +17 -0
  54. data/lib/focus_nfe/recursos/base.rb +91 -0
  55. data/lib/focus_nfe/recursos/ceps.rb +16 -0
  56. data/lib/focus_nfe/recursos/cfops.rb +16 -0
  57. data/lib/focus_nfe/recursos/cnaes.rb +16 -0
  58. data/lib/focus_nfe/recursos/cnpjs.rb +13 -0
  59. data/lib/focus_nfe/recursos/concerns/baixavel.rb +41 -0
  60. data/lib/focus_nfe/recursos/concerns/baixavel_eventos.rb +34 -0
  61. data/lib/focus_nfe/recursos/concerns/cancelavel.rb +25 -0
  62. data/lib/focus_nfe/recursos/concerns/conciliavel.rb +66 -0
  63. data/lib/focus_nfe/recursos/concerns/consultavel.rb +26 -0
  64. data/lib/focus_nfe/recursos/concerns/corrigivel.rb +45 -0
  65. data/lib/focus_nfe/recursos/concerns/corrigivel_cte.rb +60 -0
  66. data/lib/focus_nfe/recursos/concerns/emitivel.rb +51 -0
  67. data/lib/focus_nfe/recursos/concerns/enviavel.rb +40 -0
  68. data/lib/focus_nfe/recursos/concerns/eventavel.rb +46 -0
  69. data/lib/focus_nfe/recursos/concerns/inutilizavel.rb +96 -0
  70. data/lib/focus_nfe/recursos/concerns/listavel.rb +22 -0
  71. data/lib/focus_nfe/recursos/concerns/localizavel.rb +22 -0
  72. data/lib/focus_nfe/recursos/concerns/notificavel.rb +23 -0
  73. data/lib/focus_nfe/recursos/concerns/removivel.rb +20 -0
  74. data/lib/focus_nfe/recursos/concerns/visualizavel.rb +28 -0
  75. data/lib/focus_nfe/recursos/cte.rb +35 -0
  76. data/lib/focus_nfe/recursos/cte_os.rb +29 -0
  77. data/lib/focus_nfe/recursos/ctes_recebidas.rb +38 -0
  78. data/lib/focus_nfe/recursos/dce.rb +16 -0
  79. data/lib/focus_nfe/recursos/emails_bloqueados.rb +31 -0
  80. data/lib/focus_nfe/recursos/empresas.rb +35 -0
  81. data/lib/focus_nfe/recursos/mdfe.rb +78 -0
  82. data/lib/focus_nfe/recursos/municipios.rb +60 -0
  83. data/lib/focus_nfe/recursos/ncms.rb +16 -0
  84. data/lib/focus_nfe/recursos/nfce.rb +19 -0
  85. data/lib/focus_nfe/recursos/nfcom.rb +16 -0
  86. data/lib/focus_nfe/recursos/nfe.rb +106 -0
  87. data/lib/focus_nfe/recursos/nfes_recebidas.rb +56 -0
  88. data/lib/focus_nfe/recursos/nfgas.rb +16 -0
  89. data/lib/focus_nfe/recursos/nfse.rb +18 -0
  90. data/lib/focus_nfe/recursos/nfse_nacional.rb +16 -0
  91. data/lib/focus_nfe/recursos/nfses_nacionais_recebidas.rb +21 -0
  92. data/lib/focus_nfe/recursos/webhooks.rb +22 -0
  93. data/lib/focus_nfe/version.rb +6 -0
  94. data/lib/focus_nfe/webhook.rb +68 -0
  95. data/lib/focus_nfe.rb +124 -0
  96. data/sig/focus_nfe/client.rbs +38 -0
  97. data/sig/focus_nfe/configuration.rbs +29 -0
  98. data/sig/focus_nfe/errors.rbs +59 -0
  99. data/sig/focus_nfe/esquemas/campo.rbs +47 -0
  100. data/sig/focus_nfe/esquemas/catalogo.rbs +8 -0
  101. data/sig/focus_nfe/esquemas/decimal.rbs +25 -0
  102. data/sig/focus_nfe/esquemas/esquema.rbs +30 -0
  103. data/sig/focus_nfe/esquemas/validador.rbs +20 -0
  104. data/sig/focus_nfe/http/adapter.rbs +7 -0
  105. data/sig/focus_nfe/http/adapters/net_http.rbs +25 -0
  106. data/sig/focus_nfe/http/authentication.rbs +9 -0
  107. data/sig/focus_nfe/http/connection.rbs +32 -0
  108. data/sig/focus_nfe/http/logging.rbs +30 -0
  109. data/sig/focus_nfe/http/response.rbs +28 -0
  110. data/sig/focus_nfe/modelos/documento.rbs +34 -0
  111. data/sig/focus_nfe/modelos/inutilizacao.rbs +24 -0
  112. data/sig/focus_nfe/modelos/pagina.rbs +21 -0
  113. data/sig/focus_nfe/recursos/backups.rbs +7 -0
  114. data/sig/focus_nfe/recursos/base.rbs +25 -0
  115. data/sig/focus_nfe/recursos/ceps.rbs +10 -0
  116. data/sig/focus_nfe/recursos/cfops.rbs +10 -0
  117. data/sig/focus_nfe/recursos/cnaes.rbs +10 -0
  118. data/sig/focus_nfe/recursos/cnpjs.rbs +7 -0
  119. data/sig/focus_nfe/recursos/concerns/baixavel.rbs +12 -0
  120. data/sig/focus_nfe/recursos/concerns/baixavel_eventos.rbs +14 -0
  121. data/sig/focus_nfe/recursos/concerns/cancelavel.rbs +9 -0
  122. data/sig/focus_nfe/recursos/concerns/conciliavel.rbs +15 -0
  123. data/sig/focus_nfe/recursos/concerns/consultavel.rbs +9 -0
  124. data/sig/focus_nfe/recursos/concerns/corrigivel.rbs +15 -0
  125. data/sig/focus_nfe/recursos/concerns/corrigivel_cte.rbs +17 -0
  126. data/sig/focus_nfe/recursos/concerns/emitivel.rbs +14 -0
  127. data/sig/focus_nfe/recursos/concerns/enviavel.rbs +15 -0
  128. data/sig/focus_nfe/recursos/concerns/eventavel.rbs +12 -0
  129. data/sig/focus_nfe/recursos/concerns/inutilizavel.rbs +20 -0
  130. data/sig/focus_nfe/recursos/concerns/listavel.rbs +9 -0
  131. data/sig/focus_nfe/recursos/concerns/localizavel.rbs +9 -0
  132. data/sig/focus_nfe/recursos/concerns/notificavel.rbs +9 -0
  133. data/sig/focus_nfe/recursos/concerns/removivel.rbs +9 -0
  134. data/sig/focus_nfe/recursos/concerns/visualizavel.rbs +9 -0
  135. data/sig/focus_nfe/recursos/cte.rbs +17 -0
  136. data/sig/focus_nfe/recursos/cte_os.rbs +17 -0
  137. data/sig/focus_nfe/recursos/ctes_recebidas.rbs +14 -0
  138. data/sig/focus_nfe/recursos/dce.rbs +10 -0
  139. data/sig/focus_nfe/recursos/emails_bloqueados.rbs +12 -0
  140. data/sig/focus_nfe/recursos/empresas.rbs +12 -0
  141. data/sig/focus_nfe/recursos/mdfe.rbs +21 -0
  142. data/sig/focus_nfe/recursos/municipios.rbs +19 -0
  143. data/sig/focus_nfe/recursos/ncms.rbs +10 -0
  144. data/sig/focus_nfe/recursos/nfce.rbs +12 -0
  145. data/sig/focus_nfe/recursos/nfcom.rbs +10 -0
  146. data/sig/focus_nfe/recursos/nfe.rbs +23 -0
  147. data/sig/focus_nfe/recursos/nfes_recebidas.rbs +16 -0
  148. data/sig/focus_nfe/recursos/nfgas.rbs +10 -0
  149. data/sig/focus_nfe/recursos/nfse.rbs +11 -0
  150. data/sig/focus_nfe/recursos/nfse_nacional.rbs +10 -0
  151. data/sig/focus_nfe/recursos/nfses_nacionais_recebidas.rbs +11 -0
  152. data/sig/focus_nfe/recursos/webhooks.rbs +11 -0
  153. data/sig/focus_nfe/webhook.rbs +11 -0
  154. data/sig/focus_nfe.rbs +10 -0
  155. data/spec/focus_nfe/client_spec.rb +208 -0
  156. data/spec/focus_nfe/configuration_spec.rb +121 -0
  157. data/spec/focus_nfe/errors_mapping_spec.rb +68 -0
  158. data/spec/focus_nfe/errors_spec.rb +107 -0
  159. data/spec/focus_nfe/esquemas/campo_spec.rb +291 -0
  160. data/spec/focus_nfe/esquemas/decimal_spec.rb +54 -0
  161. data/spec/focus_nfe/esquemas/esquema_spec.rb +73 -0
  162. data/spec/focus_nfe/esquemas/validador_spec.rb +167 -0
  163. data/spec/focus_nfe/esquemas_spec.rb +42 -0
  164. data/spec/focus_nfe/http/adapter_spec.rb +8 -0
  165. data/spec/focus_nfe/http/adapters/net_http_spec.rb +181 -0
  166. data/spec/focus_nfe/http/authentication_spec.rb +24 -0
  167. data/spec/focus_nfe/http/connection_spec.rb +255 -0
  168. data/spec/focus_nfe/http/logging_spec.rb +83 -0
  169. data/spec/focus_nfe/http/response_spec.rb +161 -0
  170. data/spec/focus_nfe/modelos/documento_spec.rb +150 -0
  171. data/spec/focus_nfe/modelos/inutilizacao_spec.rb +91 -0
  172. data/spec/focus_nfe/modelos/pagina_spec.rb +77 -0
  173. data/spec/focus_nfe/recursos/backups_spec.rb +29 -0
  174. data/spec/focus_nfe/recursos/base_spec.rb +56 -0
  175. data/spec/focus_nfe/recursos/ceps_spec.rb +16 -0
  176. data/spec/focus_nfe/recursos/cfops_spec.rb +16 -0
  177. data/spec/focus_nfe/recursos/cnaes_spec.rb +20 -0
  178. data/spec/focus_nfe/recursos/cnpjs_spec.rb +11 -0
  179. data/spec/focus_nfe/recursos/concerns/emitivel_validacao_spec.rb +158 -0
  180. data/spec/focus_nfe/recursos/cte_os_spec.rb +9 -0
  181. data/spec/focus_nfe/recursos/cte_spec.rb +9 -0
  182. data/spec/focus_nfe/recursos/ctes_recebidas_spec.rb +56 -0
  183. data/spec/focus_nfe/recursos/dce_spec.rb +8 -0
  184. data/spec/focus_nfe/recursos/emails_bloqueados_spec.rb +29 -0
  185. data/spec/focus_nfe/recursos/empresas_spec.rb +45 -0
  186. data/spec/focus_nfe/recursos/mdfe_spec.rb +100 -0
  187. data/spec/focus_nfe/recursos/municipios_spec.rb +58 -0
  188. data/spec/focus_nfe/recursos/ncms_spec.rb +16 -0
  189. data/spec/focus_nfe/recursos/nfce_spec.rb +10 -0
  190. data/spec/focus_nfe/recursos/nfcom_spec.rb +8 -0
  191. data/spec/focus_nfe/recursos/nfe_spec.rb +262 -0
  192. data/spec/focus_nfe/recursos/nfes_recebidas_spec.rb +87 -0
  193. data/spec/focus_nfe/recursos/nfgas_spec.rb +8 -0
  194. data/spec/focus_nfe/recursos/nfse_nacional_spec.rb +8 -0
  195. data/spec/focus_nfe/recursos/nfse_spec.rb +9 -0
  196. data/spec/focus_nfe/recursos/nfses_nacionais_recebidas_spec.rb +17 -0
  197. data/spec/focus_nfe/recursos/webhooks_spec.rb +22 -0
  198. data/spec/focus_nfe/webhook_spec.rb +66 -0
  199. data/spec/focus_nfe_global_configuration_spec.rb +70 -0
  200. data/spec/focus_nfe_require_spec.rb +87 -0
  201. data/spec/focus_nfe_spec.rb +11 -0
  202. data/spec/spec_helper.rb +58 -0
  203. data/spec/support/shared_examples/recurso_fiscal.rb +445 -0
  204. data/spec/support/shared_examples/recurso_leitura.rb +217 -0
  205. data/tools/pull_fields.rb +62 -0
  206. metadata +420 -0
@@ -0,0 +1,14 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Emitivel : FocusNfe::Recursos::Base
5
+ def emitir: (ref: String, dados: Hash[untyped, untyped], ?validar: bool, **untyped opcoes) -> FocusNfe::Modelos::Documento
6
+
7
+ private
8
+
9
+ def validar_dados!: (Hash[untyped, untyped] dados) -> void
10
+ def carregar_aninhados: (Hash[untyped, untyped] dados) -> Hash[String, FocusNfe::Esquemas::Esquema]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Enviavel : FocusNfe::Recursos::Base
5
+ MAX_EMAILS: Integer
6
+
7
+ def enviar_email: (String ref, emails: Array[String]) -> untyped
8
+
9
+ private
10
+
11
+ def validar_emails!: (untyped emails) -> void
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Eventavel : FocusNfe::Recursos::Base
5
+ private
6
+
7
+ def emitir_evento_em: (String ref, caminho: String, **untyped dados) -> FocusNfe::Modelos::Documento
8
+ def cancelar_evento_em: (String ref, caminho: String, **untyped dados) -> FocusNfe::Modelos::Documento
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Inutilizavel : FocusNfe::Recursos::Base
5
+ CAMINHO_INUTILIZACAO: String
6
+ CAMINHO_INUTILIZACOES: String
7
+ JUSTIFICATIVA_MINIMA: Integer
8
+
9
+ def inutilizar: (cnpj: String, serie: untyped, numero_inicial: untyped, numero_final: untyped, justificativa: String) -> FocusNfe::Modelos::Inutilizacao
10
+ def consultar_inutilizacoes: (**untyped filtros) -> Array[FocusNfe::Modelos::Inutilizacao]
11
+
12
+ private
13
+
14
+ def validar_justificativa!: (untyped justificativa) -> void
15
+ def validar_faixa!: (untyped numero_inicial, untyped numero_final) -> void
16
+ def numero_para_inteiro: (untyped valor) -> Integer?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Listavel : FocusNfe::Recursos::Base
5
+ def listar: (**untyped filtros) -> FocusNfe::Modelos::Pagina
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Localizavel : FocusNfe::Recursos::Base
5
+ def consultar: (String identificador) -> untyped
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Notificavel : FocusNfe::Recursos::Base
5
+ def reenviar_hook: (String identificador) -> untyped
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Removivel : FocusNfe::Recursos::Base
5
+ def excluir: (String identificador) -> untyped
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ module Concerns
4
+ module Visualizavel : FocusNfe::Recursos::Base, FocusNfe::Recursos::Concerns::Emitivel
5
+ def previa: (dados: Hash[untyped, untyped], ?validar: bool) -> String?
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Cte < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::CorrigivelCte
8
+ include FocusNfe::Recursos::Concerns::Notificavel
9
+
10
+ MODAIS: Hash[String, Hash[String, String]]
11
+
12
+ private
13
+
14
+ def esquemas_extras: (Hash[untyped, untyped] dados) -> Hash[String, String]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class CteOs < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::CorrigivelCte
8
+ include FocusNfe::Recursos::Concerns::Notificavel
9
+
10
+ MODAIS: Hash[String, Hash[String, String]]
11
+
12
+ private
13
+
14
+ def esquemas_extras: (Hash[untyped, untyped] dados) -> Hash[String, String]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class CtesRecebidas < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Listavel
5
+ include FocusNfe::Recursos::Concerns::Baixavel
6
+ include FocusNfe::Recursos::Concerns::BaixavelEventos
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+
9
+ def consultar: (String chave) -> untyped
10
+ def desacordo: (String chave, observacoes: String) -> untyped
11
+ def consultar_desacordo: (String chave) -> untyped
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Dce < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class EmailsBloqueados < FocusNfe::Recursos::Base
4
+ def consultar: (String email) -> untyped
5
+ def desbloquear: (String email) -> untyped
6
+
7
+ private
8
+
9
+ def caminho_email: (String email) -> String
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Empresas < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Listavel
5
+ include FocusNfe::Recursos::Concerns::Localizavel
6
+ include FocusNfe::Recursos::Concerns::Removivel
7
+
8
+ def criar: (dados: Hash[untyped, untyped], ?dry_run: bool) -> untyped
9
+ def atualizar: ((String | Integer) id, dados: Hash[untyped, untyped]) -> untyped
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Mdfe < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ include FocusNfe::Recursos::Concerns::Eventavel
9
+
10
+ MODAIS: Hash[String, String]
11
+
12
+ def encerrar: (String ref, data: untyped, sigla_uf: untyped, nome_municipio: untyped) -> FocusNfe::Modelos::Documento
13
+ def incluir_condutor: (String ref, nome: untyped, cpf: untyped) -> FocusNfe::Modelos::Documento
14
+ def incluir_dfe: (String ref, protocolo: untyped, codigo_municipio_carregamento: untyped, documentos: untyped, ?nome_municipio_carregamento: untyped) -> FocusNfe::Modelos::Documento
15
+
16
+ private
17
+
18
+ def esquemas_extras: (Hash[untyped, untyped] dados) -> Hash[String, String]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Municipios < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Localizavel
5
+ include FocusNfe::Recursos::Concerns::Listavel
6
+
7
+ def listar_codigos_tributarios: (String codigo_municipio, **untyped filtros) -> FocusNfe::Modelos::Pagina
8
+ def listar_itens_lista_servico: (String codigo_municipio, **untyped filtros) -> FocusNfe::Modelos::Pagina
9
+ def consultar_codigo_tributario: (String codigo_municipio, String codigo) -> untyped
10
+ def consultar_item_lista_servico: (String codigo_municipio, String codigo) -> untyped
11
+ def consultar_json: (String codigo_municipio) -> untyped
12
+
13
+ private
14
+
15
+ def sub_listagem: (String codigo_municipio, String sufixo, Hash[untyped, untyped] filtros) -> FocusNfe::Modelos::Pagina
16
+ def sub_consulta: (String codigo_municipio, String sufixo, String codigo) -> untyped
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Ncms < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Localizavel
5
+ include FocusNfe::Recursos::Concerns::Listavel
6
+
7
+ def buscar: (**untyped filtros) -> FocusNfe::Modelos::Pagina
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Nfce < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Inutilizavel
8
+ include FocusNfe::Recursos::Concerns::Enviavel
9
+ include FocusNfe::Recursos::Concerns::Conciliavel
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Nfcom < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Nfe < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Corrigivel
8
+ include FocusNfe::Recursos::Concerns::Inutilizavel
9
+ include FocusNfe::Recursos::Concerns::Visualizavel
10
+ include FocusNfe::Recursos::Concerns::Notificavel
11
+ include FocusNfe::Recursos::Concerns::Enviavel
12
+ include FocusNfe::Recursos::Concerns::Eventavel
13
+ include FocusNfe::Recursos::Concerns::Conciliavel
14
+
15
+ def importar: (String xml, ?ref: String?) -> FocusNfe::Modelos::Documento
16
+ def emitir_evento: (String ref, tipo_evento: untyped, **untyped dados) -> FocusNfe::Modelos::Documento
17
+ def cancelar_evento: (String ref, tipo_evento: untyped) -> FocusNfe::Modelos::Documento
18
+ def registrar_ator_interessado: (String ref, permite_autorizacao_terceiros: untyped, ?cpf: untyped, ?cnpj: untyped) -> FocusNfe::Modelos::Documento
19
+ def registrar_insucesso_entrega: (String ref, data_tentativa_entrega: untyped, motivo_insucesso: untyped, hash_tentativa_entrega: untyped, **untyped dados) -> FocusNfe::Modelos::Documento
20
+ def cancelar_insucesso_entrega: (String ref) -> FocusNfe::Modelos::Documento
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class NfesRecebidas < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Listavel
5
+ include FocusNfe::Recursos::Concerns::Baixavel
6
+ include FocusNfe::Recursos::Concerns::BaixavelEventos
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ include FocusNfe::Recursos::Concerns::Eventavel
9
+
10
+ def consultar: (String chave, ?completa: bool) -> untyped
11
+ def manifestar: (String chave, tipo: String, ?justificativa: String?) -> untyped
12
+ def emitir_evento: (String chave, tipo_evento: String, **untyped dados) -> FocusNfe::Modelos::Documento
13
+ def cancelar_evento: (String chave) -> FocusNfe::Modelos::Documento
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Nfgas < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Nfse < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ include FocusNfe::Recursos::Concerns::Enviavel
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class NfseNacional < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Emitivel
5
+ include FocusNfe::Recursos::Concerns::Consultavel
6
+ include FocusNfe::Recursos::Concerns::Cancelavel
7
+ include FocusNfe::Recursos::Concerns::Notificavel
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class NfsesNacionaisRecebidas < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Listavel
5
+ include FocusNfe::Recursos::Concerns::Baixavel
6
+ include FocusNfe::Recursos::Concerns::Notificavel
7
+
8
+ def download_html: (String chave) -> String?
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module FocusNfe
2
+ module Recursos
3
+ class Webhooks < FocusNfe::Recursos::Base
4
+ include FocusNfe::Recursos::Concerns::Listavel
5
+ include FocusNfe::Recursos::Concerns::Localizavel
6
+ include FocusNfe::Recursos::Concerns::Removivel
7
+
8
+ def criar: (dados: Hash[untyped, untyped]) -> untyped
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module FocusNfe
2
+ module Webhook
3
+ def self?.parse: (untyped raw_body, ?ref: String?) -> FocusNfe::Modelos::Documento
4
+
5
+ def self?.autenticado?: (headers: untyped, authorization: String, authorization_header: String) -> bool
6
+
7
+ def self?.valor_do_header: (untyped headers, String nome) -> untyped
8
+
9
+ def self?.comparacao_segura?: (String esquerda, String direita) -> bool
10
+ end
11
+ end
data/sig/focus_nfe.rbs ADDED
@@ -0,0 +1,10 @@
1
+ module FocusNfe
2
+ VERSION: String
3
+
4
+ self.@configuration: FocusNfe::Configuration?
5
+
6
+ def self.configure: () ?{ (FocusNfe::Configuration) -> void } -> FocusNfe::Configuration
7
+ def self.configuration: () -> FocusNfe::Configuration
8
+ def self.client: () -> FocusNfe::Client
9
+ def self.reset_configuration!: () -> void
10
+ end
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe FocusNfe::Client do
4
+ describe ".new com tokens e ambiente" do
5
+ it "constrói uma Configuration interna a partir dos argumentos", :aggregate_failures do
6
+ client = described_class.new(token_empresa: "te", token_conta: "tc", environment: :producao)
7
+
8
+ expect(client.configuration).to be_a(FocusNfe::Configuration)
9
+ expect(client.configuration).to have_attributes(token_empresa: "te", token_conta: "tc", environment: :producao)
10
+ end
11
+
12
+ it "repassa opções extras à Configuration" do
13
+ client = described_class.new(token_empresa: "te", timeout: 5, headers: { "X" => "1" })
14
+
15
+ expect(client.configuration).to have_attributes(timeout: 5, headers: { "X" => "1" })
16
+ end
17
+
18
+ it "usa homologação como ambiente padrão" do
19
+ client = described_class.new(token_empresa: "te")
20
+
21
+ expect(client.configuration.environment).to eq(:homologacao)
22
+ end
23
+
24
+ it "valida a configuração, levantando sem nenhum token" do
25
+ expect { described_class.new(token_empresa: nil, token_conta: nil) }
26
+ .to raise_error(FocusNfe::Errors::ConfigurationError)
27
+ end
28
+
29
+ it "aceita um cliente só com token de empresa" do
30
+ expect { described_class.new(token_empresa: "te") }.not_to raise_error
31
+ end
32
+
33
+ it "aceita um cliente só com token de conta" do
34
+ expect { described_class.new(token_conta: "tc") }.not_to raise_error
35
+ end
36
+
37
+ it "valida o ambiente, levantando para um desconhecido" do
38
+ expect { described_class.new(token_empresa: "te", environment: :sandbox) }
39
+ .to raise_error(FocusNfe::Errors::ConfigurationError)
40
+ end
41
+ end
42
+
43
+ describe ".new com uma Configuration pronta" do
44
+ it "aceita e expõe a própria Configuration" do
45
+ config = FocusNfe::Configuration.new(token_empresa: "te")
46
+
47
+ expect(described_class.new(config).configuration).to be(config)
48
+ end
49
+
50
+ it "também roda validate!, levantando para config sem token" do
51
+ config = FocusNfe::Configuration.new(token_empresa: nil, token_conta: nil)
52
+
53
+ expect { described_class.new(config) }.to raise_error(FocusNfe::Errors::ConfigurationError)
54
+ end
55
+ end
56
+
57
+ describe "#connection" do
58
+ subject(:client) { described_class.new(token_empresa: "te") }
59
+
60
+ it "devolve uma HTTP::Connection" do
61
+ expect(client.connection).to be_a(FocusNfe::HTTP::Connection)
62
+ end
63
+
64
+ it "memoiza a conexão entre chamadas" do
65
+ primeira = client.connection
66
+
67
+ expect(client.connection).to be(primeira)
68
+ end
69
+
70
+ it "levanta ConfigurationError sem token_empresa" do
71
+ client = described_class.new(token_conta: "tc")
72
+
73
+ expect { client.connection }.to raise_error(FocusNfe::Errors::ConfigurationError, /token_empresa/)
74
+ end
75
+ end
76
+
77
+ describe "#connection_conta" do
78
+ subject(:client) { described_class.new(token_conta: "tc") }
79
+
80
+ it "devolve uma HTTP::Connection distinta da de empresa", :aggregate_failures do
81
+ client = described_class.new(token_empresa: "te", token_conta: "tc")
82
+
83
+ expect(client.connection_conta).to be_a(FocusNfe::HTTP::Connection)
84
+ expect(client.connection_conta).not_to be(client.connection)
85
+ end
86
+
87
+ it "memoiza a conexão entre chamadas" do
88
+ primeira = client.connection_conta
89
+
90
+ expect(client.connection_conta).to be(primeira)
91
+ end
92
+
93
+ it "levanta ConfigurationError sem token_conta" do
94
+ client = described_class.new(token_empresa: "te")
95
+
96
+ expect { client.connection_conta }.to raise_error(FocusNfe::Errors::ConfigurationError, /token_conta/)
97
+ end
98
+ end
99
+
100
+ describe "roteamento de token por escopo" do
101
+ subject(:client) { described_class.new(token_empresa: "te", token_conta: "tc") }
102
+
103
+ let(:json) { { "Content-Type" => "application/json" } }
104
+
105
+ def homologacao = "https://homologacao.focusnfe.com.br"
106
+
107
+ def authorization(token)
108
+ FocusNfe::HTTP::Authentication.header(token).fetch("Authorization")
109
+ end
110
+
111
+ it "usa o token da empresa nos recursos fiscais" do
112
+ stub = stub_request(:get, "#{homologacao}/v2/nfe/ref-1")
113
+ .with(headers: { "Authorization" => authorization("te") })
114
+ .to_return(status: 200, body: "{}", headers: json)
115
+
116
+ client.nfe.consultar("ref-1")
117
+
118
+ expect(stub).to have_been_requested
119
+ end
120
+
121
+ it "usa o token da conta nas consultas auxiliares" do
122
+ stub = stub_request(:get, "#{homologacao}/v2/ceps/69909032")
123
+ .with(headers: { "Authorization" => authorization("tc") })
124
+ .to_return(status: 200, body: "{}", headers: json)
125
+
126
+ client.ceps.consultar("69909032")
127
+
128
+ expect(stub).to have_been_requested
129
+ end
130
+
131
+ it "usa o token da conta na gestão de empresas" do
132
+ stub = stub_request(:get, "#{homologacao}/v2/empresas/7")
133
+ .with(headers: { "Authorization" => authorization("tc") })
134
+ .to_return(status: 200, body: "{}", headers: json)
135
+
136
+ client.empresas.consultar("7")
137
+
138
+ expect(stub).to have_been_requested
139
+ end
140
+ end
141
+
142
+ describe "token ausente por escopo" do
143
+ it "levanta ao acessar recurso de conta sem token_conta" do
144
+ client = described_class.new(token_empresa: "te")
145
+
146
+ expect { client.ceps }.to raise_error(FocusNfe::Errors::ConfigurationError, /token_conta/)
147
+ end
148
+
149
+ it "levanta ao acessar recurso fiscal sem token_empresa" do
150
+ client = described_class.new(token_conta: "tc")
151
+
152
+ expect { client.nfe }.to raise_error(FocusNfe::Errors::ConfigurationError, /token_empresa/)
153
+ end
154
+ end
155
+
156
+ describe "isolamento entre clientes" do
157
+ it "não compartilha estado entre clientes distintos", :aggregate_failures do
158
+ loja = described_class.new(token_empresa: "loja", environment: :producao)
159
+ filial = described_class.new(token_empresa: "filial", environment: :homologacao)
160
+
161
+ expect(loja.configuration.token_empresa).to eq("loja")
162
+ expect(filial.configuration.token_empresa).to eq("filial")
163
+ expect(loja.connection).not_to be(filial.connection)
164
+ end
165
+ end
166
+
167
+ describe "acessores de recurso" do
168
+ subject(:client) { described_class.new(token_empresa: "te", token_conta: "tc") }
169
+
170
+ {
171
+ nfe: FocusNfe::Recursos::Nfe,
172
+ nfce: FocusNfe::Recursos::Nfce,
173
+ nfse: FocusNfe::Recursos::Nfse,
174
+ nfse_nacional: FocusNfe::Recursos::NfseNacional,
175
+ cte: FocusNfe::Recursos::Cte,
176
+ cte_os: FocusNfe::Recursos::CteOs,
177
+ mdfe: FocusNfe::Recursos::Mdfe,
178
+ nfcom: FocusNfe::Recursos::Nfcom,
179
+ dce: FocusNfe::Recursos::Dce,
180
+ nfgas: FocusNfe::Recursos::Nfgas,
181
+ nfes_recebidas: FocusNfe::Recursos::NfesRecebidas,
182
+ ctes_recebidas: FocusNfe::Recursos::CtesRecebidas,
183
+ nfses_nacionais_recebidas: FocusNfe::Recursos::NfsesNacionaisRecebidas,
184
+ ceps: FocusNfe::Recursos::Ceps,
185
+ municipios: FocusNfe::Recursos::Municipios,
186
+ cfops: FocusNfe::Recursos::Cfops,
187
+ cnaes: FocusNfe::Recursos::Cnaes,
188
+ ncms: FocusNfe::Recursos::Ncms,
189
+ cnpjs: FocusNfe::Recursos::Cnpjs,
190
+ empresas: FocusNfe::Recursos::Empresas,
191
+ webhooks: FocusNfe::Recursos::Webhooks,
192
+ emails_bloqueados: FocusNfe::Recursos::EmailsBloqueados,
193
+ backups: FocusNfe::Recursos::Backups
194
+ }.each do |acessor, classe|
195
+ describe "##{acessor}" do
196
+ it "devolve um #{classe}" do
197
+ expect(client.public_send(acessor)).to be_a(classe)
198
+ end
199
+
200
+ it "memoiza o recurso entre chamadas" do
201
+ primeiro = client.public_send(acessor)
202
+
203
+ expect(client.public_send(acessor)).to be(primeiro)
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end