tiss-ruby 0.1.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 (297) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +1 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +5 -0
  8. data/CODE_OF_CONDUCT.md +74 -0
  9. data/Gemfile +8 -0
  10. data/Gemfile.lock +111 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +43 -0
  13. data/Rakefile +8 -0
  14. data/bin/console +15 -0
  15. data/bin/setup +8 -0
  16. data/lib/tiss/constants.rb +73 -0
  17. data/lib/tiss/creator.rb +52 -0
  18. data/lib/tiss/generator/generator.rb +20 -0
  19. data/lib/tiss/generator/generators/base_generator.rb +54 -0
  20. data/lib/tiss/generator/generators/model_generator.rb +36 -0
  21. data/lib/tiss/generator/generators/templates/model_template.erb +22 -0
  22. data/lib/tiss/generator/generators/templates/validator_template.erb +60 -0
  23. data/lib/tiss/generator/generators/validator_generator.rb +44 -0
  24. data/lib/tiss/model.rb +66 -0
  25. data/lib/tiss/models/anexo_clinico.rb +18 -0
  26. data/lib/tiss/models/anexo_clinico_prorrogacao.rb +18 -0
  27. data/lib/tiss/models/anexos_clinicos.rb +22 -0
  28. data/lib/tiss/models/anexos_guias_tiss.rb +22 -0
  29. data/lib/tiss/models/beneficiario.rb +18 -0
  30. data/lib/tiss/models/cabecalho_demonstrativo_odonto.rb +26 -0
  31. data/lib/tiss/models/cabecalho_guia.rb +11 -0
  32. data/lib/tiss/models/cabecalho_transacao.rb +36 -0
  33. data/lib/tiss/models/cod_profissional.rb +14 -0
  34. data/lib/tiss/models/codigo_contratado.rb +14 -0
  35. data/lib/tiss/models/contratado_executante.rb +11 -0
  36. data/lib/tiss/models/cpf_cnpj_contratado.rb +14 -0
  37. data/lib/tiss/models/ct_anexo_cabecalho.rb +34 -0
  38. data/lib/tiss/models/ct_anexo_lote.rb +14 -0
  39. data/lib/tiss/models/ct_anexo_recebimento.rb +38 -0
  40. data/lib/tiss/models/ct_autorizacao_dados.rb +36 -0
  41. data/lib/tiss/models/ct_autorizacao_internacao.rb +32 -0
  42. data/lib/tiss/models/ct_autorizacao_sadt.rb +32 -0
  43. data/lib/tiss/models/ct_autorizacao_solicita_status.rb +18 -0
  44. data/lib/tiss/models/ct_beneficiario_dados.rb +36 -0
  45. data/lib/tiss/models/ct_conta_medica_resumo.rb +52 -0
  46. data/lib/tiss/models/ct_contratado_dados.rb +22 -0
  47. data/lib/tiss/models/ct_contratado_profissional_dados.rb +26 -0
  48. data/lib/tiss/models/ct_credito_odonto.rb +14 -0
  49. data/lib/tiss/models/ct_dados_complementares_beneficiario.rb +26 -0
  50. data/lib/tiss/models/ct_dados_complementares_beneficiario_radio.rb +14 -0
  51. data/lib/tiss/models/ct_dados_resumo_demonstrativo.rb +34 -0
  52. data/lib/tiss/models/ct_demonstrativo_cabecalho.rb +26 -0
  53. data/lib/tiss/models/ct_demonstrativo_retorno.rb +26 -0
  54. data/lib/tiss/models/ct_demonstrativo_solicitacao.rb +14 -0
  55. data/lib/tiss/models/ct_descontos.rb +22 -0
  56. data/lib/tiss/models/ct_diagnostico.rb +18 -0
  57. data/lib/tiss/models/ct_diagnostico_oncologico.rb +34 -0
  58. data/lib/tiss/models/ct_drogas_solicitadas.rb +31 -0
  59. data/lib/tiss/models/ct_elegibilidade_recibo.rb +58 -0
  60. data/lib/tiss/models/ct_elegibilidade_verifica.rb +50 -0
  61. data/lib/tiss/models/ct_fonte_pagadora.rb +14 -0
  62. data/lib/tiss/models/ct_glosa_recibo.rb +54 -0
  63. data/lib/tiss/models/ct_glosa_recibo_odonto.rb +54 -0
  64. data/lib/tiss/models/ct_guia_cabecalho.rb +14 -0
  65. data/lib/tiss/models/ct_guia_cancelamento.rb +22 -0
  66. data/lib/tiss/models/ct_guia_cancelamento_recibo.rb +18 -0
  67. data/lib/tiss/models/ct_guia_dados.rb +44 -0
  68. data/lib/tiss/models/ct_guia_dados_anexo.rb +34 -0
  69. data/lib/tiss/models/ct_guia_dados_odonto.rb +66 -0
  70. data/lib/tiss/models/ct_guia_recurso.rb +26 -0
  71. data/lib/tiss/models/ct_guia_recurso_lote.rb +14 -0
  72. data/lib/tiss/models/ct_guia_valor_total.rb +38 -0
  73. data/lib/tiss/models/ct_guia_valor_total_sadt.rb +34 -0
  74. data/lib/tiss/models/ct_hipotese_diagnostica.rb +14 -0
  75. data/lib/tiss/models/ct_ident_equipe.rb +34 -0
  76. data/lib/tiss/models/ct_ident_equipe_sadt.rb +34 -0
  77. data/lib/tiss/models/ct_intervalo_ciclos.rb +14 -0
  78. data/lib/tiss/models/ct_login_senha.rb +14 -0
  79. data/lib/tiss/models/ct_lote_anexo_status.rb +26 -0
  80. data/lib/tiss/models/ct_lote_status.rb +30 -0
  81. data/lib/tiss/models/ct_motivo_glosa.rb +14 -0
  82. data/lib/tiss/models/ct_opm_utilizada.rb +14 -0
  83. data/lib/tiss/models/ct_opme_dados.rb +14 -0
  84. data/lib/tiss/models/ct_outras_despesas.rb +10 -0
  85. data/lib/tiss/models/ct_pagamento_dados.rb +26 -0
  86. data/lib/tiss/models/ct_pagamento_resumo.rb +22 -0
  87. data/lib/tiss/models/ct_prestador_identificacao.rb +18 -0
  88. data/lib/tiss/models/ct_procedimento_autorizado.rb +51 -0
  89. data/lib/tiss/models/ct_procedimento_dados.rb +18 -0
  90. data/lib/tiss/models/ct_procedimento_executado.rb +59 -0
  91. data/lib/tiss/models/ct_procedimento_executado_honor_indiv.rb +55 -0
  92. data/lib/tiss/models/ct_procedimento_executado_int.rb +55 -0
  93. data/lib/tiss/models/ct_procedimento_executado_odonto.rb +47 -0
  94. data/lib/tiss/models/ct_procedimento_executado_outras.rb +62 -0
  95. data/lib/tiss/models/ct_procedimento_executado_sadt.rb +55 -0
  96. data/lib/tiss/models/ct_procedimento_solicitado.rb +18 -0
  97. data/lib/tiss/models/ct_procedimentos_complementares.rb +18 -0
  98. data/lib/tiss/models/ct_protocolo_anexo_status.rb +18 -0
  99. data/lib/tiss/models/ct_protocolo_detalhe.rb +22 -0
  100. data/lib/tiss/models/ct_protocolo_detalhe_anexo.rb +26 -0
  101. data/lib/tiss/models/ct_protocolo_recebimento.rb +26 -0
  102. data/lib/tiss/models/ct_protocolo_recebimento_anexo.rb +30 -0
  103. data/lib/tiss/models/ct_protocolo_recebimento_recurso.rb +30 -0
  104. data/lib/tiss/models/ct_protocolo_recurso.rb +18 -0
  105. data/lib/tiss/models/ct_protocolo_solicitacao_status.rb +14 -0
  106. data/lib/tiss/models/ct_protocolo_status.rb +18 -0
  107. data/lib/tiss/models/ct_recebimento_lote.rb +14 -0
  108. data/lib/tiss/models/ct_recebimento_recurso.rb +14 -0
  109. data/lib/tiss/models/ct_recibo_cancela_guia.rb +14 -0
  110. data/lib/tiss/models/ct_recibo_comunicacao.rb +14 -0
  111. data/lib/tiss/models/ct_recurso_glosa_recebimento.rb +54 -0
  112. data/lib/tiss/models/ct_resposta_elegibilidade.rb +14 -0
  113. data/lib/tiss/models/ct_resposta_glosa.rb +22 -0
  114. data/lib/tiss/models/ct_resposta_glosa_guia_medica.rb +35 -0
  115. data/lib/tiss/models/ct_resposta_glosa_item_medico.rb +55 -0
  116. data/lib/tiss/models/ct_resposta_recurso_guia_odonto.rb +34 -0
  117. data/lib/tiss/models/ct_resposta_recurso_item_odonto.rb +26 -0
  118. data/lib/tiss/models/ct_situacao_autorizacao.rb +26 -0
  119. data/lib/tiss/models/ct_situacao_clinica.rb +10 -0
  120. data/lib/tiss/models/ct_situacao_inicial.rb +22 -0
  121. data/lib/tiss/models/ct_situacao_protocolo.rb +18 -0
  122. data/lib/tiss/models/ct_valor_credito_desconto.rb +18 -0
  123. data/lib/tiss/models/ct_valor_total.rb +18 -0
  124. data/lib/tiss/models/ctm_anexo_solicitacao_opme.rb +34 -0
  125. data/lib/tiss/models/ctm_anexo_solicitacao_quimio.rb +55 -0
  126. data/lib/tiss/models/ctm_anexo_solicitacao_radio.rb +59 -0
  127. data/lib/tiss/models/ctm_anexo_solicitante.rb +18 -0
  128. data/lib/tiss/models/ctm_autorizacao_internacao.rb +22 -0
  129. data/lib/tiss/models/ctm_autorizacao_opme.rb +30 -0
  130. data/lib/tiss/models/ctm_autorizacao_prorrogacao.rb +22 -0
  131. data/lib/tiss/models/ctm_autorizacao_quimio.rb +67 -0
  132. data/lib/tiss/models/ctm_autorizacao_radio.rb +71 -0
  133. data/lib/tiss/models/ctm_autorizacao_servico.rb +47 -0
  134. data/lib/tiss/models/ctm_beneficiario_comunicacao.rb +22 -0
  135. data/lib/tiss/models/ctm_beneficiario_comunicacao_recibo.rb +18 -0
  136. data/lib/tiss/models/ctm_consulta_atendimento.rb +18 -0
  137. data/lib/tiss/models/ctm_consulta_guia.rb +52 -0
  138. data/lib/tiss/models/ctm_demonstrativo_analise_conta.rb +34 -0
  139. data/lib/tiss/models/ctm_demonstrativo_pagamento.rb +26 -0
  140. data/lib/tiss/models/ctm_guia_lote.rb +14 -0
  141. data/lib/tiss/models/ctm_honorario_individual_guia.rb +58 -0
  142. data/lib/tiss/models/ctm_internacao_dados.rb +42 -0
  143. data/lib/tiss/models/ctm_internacao_dados_saida.rb +18 -0
  144. data/lib/tiss/models/ctm_internacao_resumo_guia.rb +54 -0
  145. data/lib/tiss/models/ctm_internacao_solicitacao_guia.rb +65 -0
  146. data/lib/tiss/models/ctm_prorrogacao_solicitacao_guia.rb +50 -0
  147. data/lib/tiss/models/ctm_recurso_glosa.rb +50 -0
  148. data/lib/tiss/models/ctm_solicitacao_lote.rb +22 -0
  149. data/lib/tiss/models/ctm_sp_sadt_atendimento.rb +22 -0
  150. data/lib/tiss/models/ctm_sp_sadt_guia.rb +54 -0
  151. data/lib/tiss/models/ctm_sp_sadt_solicitacao_guia.rb +65 -0
  152. data/lib/tiss/models/cto_anexo_situacao_inicial.rb +34 -0
  153. data/lib/tiss/models/cto_anexo_situacao_inicialna_gto.rb +22 -0
  154. data/lib/tiss/models/cto_autorizacao_servico.rb +52 -0
  155. data/lib/tiss/models/cto_demonstrativo_odontologia.rb +42 -0
  156. data/lib/tiss/models/cto_guia_odontologia.rb +108 -0
  157. data/lib/tiss/models/cto_odonto_solicitacao_guia.rb +110 -0
  158. data/lib/tiss/models/cto_recurso_glosa_odonto.rb +50 -0
  159. data/lib/tiss/models/dados_beneficiario.rb +28 -0
  160. data/lib/tiss/models/dados_conta.rb +10 -0
  161. data/lib/tiss/models/dados_contratado.rb +22 -0
  162. data/lib/tiss/models/dados_contratado_executante.rb +18 -0
  163. data/lib/tiss/models/dados_executante.rb +22 -0
  164. data/lib/tiss/models/dados_guia.rb +18 -0
  165. data/lib/tiss/models/dados_guias_protocolo.rb +14 -0
  166. data/lib/tiss/models/dados_hospital_solicitado.rb +18 -0
  167. data/lib/tiss/models/dados_internacao.rb +54 -0
  168. data/lib/tiss/models/dados_pagamento.rb +71 -0
  169. data/lib/tiss/models/dados_pagamento_guia.rb +58 -0
  170. data/lib/tiss/models/dados_pagamento_por_data.rb +26 -0
  171. data/lib/tiss/models/dados_prestador.rb +26 -0
  172. data/lib/tiss/models/dados_profissionais_responsaveis.rb +58 -0
  173. data/lib/tiss/models/dados_resumo.rb +10 -0
  174. data/lib/tiss/models/dados_solicitacao.rb +18 -0
  175. data/lib/tiss/models/dados_solicitante.rb +14 -0
  176. data/lib/tiss/models/deb_cred_demonstrativo.rb +10 -0
  177. data/lib/tiss/models/deb_cred_por_data_pagamento.rb +10 -0
  178. data/lib/tiss/models/debitos_creditos_por_data.rb +10 -0
  179. data/lib/tiss/models/declaracoes.rb +22 -0
  180. data/lib/tiss/models/demonstrativo_analise.rb +18 -0
  181. data/lib/tiss/models/demonstrativo_pagamento.rb +22 -0
  182. data/lib/tiss/models/dente_regiao.rb +14 -0
  183. data/lib/tiss/models/dentes.rb +14 -0
  184. data/lib/tiss/models/despesa.rb +24 -0
  185. data/lib/tiss/models/destino.rb +14 -0
  186. data/lib/tiss/models/detalhes_guia.rb +43 -0
  187. data/lib/tiss/models/diagnostico_oncologico_quimioterapia.rb +33 -0
  188. data/lib/tiss/models/diagnostico_oncologico_radio.rb +14 -0
  189. data/lib/tiss/models/drogas_solicitadas.rb +10 -0
  190. data/lib/tiss/models/epilogo.rb +10 -0
  191. data/lib/tiss/models/glosa_anexo.rb +14 -0
  192. data/lib/tiss/models/glosa_guia.rb +10 -0
  193. data/lib/tiss/models/glosa_protocolo.rb +14 -0
  194. data/lib/tiss/models/glosas_procedimento.rb +14 -0
  195. data/lib/tiss/models/guias_canceladas.rb +10 -0
  196. data/lib/tiss/models/guias_cancelamento.rb +14 -0
  197. data/lib/tiss/models/guias_medicas.rb +10 -0
  198. data/lib/tiss/models/guias_odonto.rb +10 -0
  199. data/lib/tiss/models/guias_recurso.rb +22 -0
  200. data/lib/tiss/models/guias_tiss.rb +34 -0
  201. data/lib/tiss/models/hipoteses_diagnosticas.rb +14 -0
  202. data/lib/tiss/models/ident_equipe.rb +10 -0
  203. data/lib/tiss/models/identificacao_opm.rb +26 -0
  204. data/lib/tiss/models/identificacao_solicitante.rb +14 -0
  205. data/lib/tiss/models/identificacao_transacao.rb +22 -0
  206. data/lib/tiss/models/itens_guia.rb +47 -0
  207. data/lib/tiss/models/local_contratado.rb +18 -0
  208. data/lib/tiss/models/lote.rb +14 -0
  209. data/lib/tiss/models/lote_anexo.rb +14 -0
  210. data/lib/tiss/models/mensagem_tiss.rb +27 -0
  211. data/lib/tiss/models/motivos_glosa.rb +10 -0
  212. data/lib/tiss/models/motivos_negativa.rb +10 -0
  213. data/lib/tiss/models/opcao_recurso.rb +14 -0
  214. data/lib/tiss/models/opcao_recurso_guia.rb +18 -0
  215. data/lib/tiss/models/operadora_prestador.rb +50 -0
  216. data/lib/tiss/models/opm.rb +10 -0
  217. data/lib/tiss/models/opme_solicitada.rb +34 -0
  218. data/lib/tiss/models/opme_solicitadas.rb +10 -0
  219. data/lib/tiss/models/origem.rb +14 -0
  220. data/lib/tiss/models/pagamentos.rb +10 -0
  221. data/lib/tiss/models/pagamentos_por_data.rb +26 -0
  222. data/lib/tiss/models/periodo.rb +14 -0
  223. data/lib/tiss/models/periodo_proc.rb +14 -0
  224. data/lib/tiss/models/prestador_autorizado.rb +14 -0
  225. data/lib/tiss/models/prestador_operadora.rb +50 -0
  226. data/lib/tiss/models/procedimento.rb +18 -0
  227. data/lib/tiss/models/procedimento_realizado.rb +11 -0
  228. data/lib/tiss/models/procedimento_solicitado.rb +34 -0
  229. data/lib/tiss/models/procedimentos_adicionais.rb +14 -0
  230. data/lib/tiss/models/procedimentos_autorizados.rb +48 -0
  231. data/lib/tiss/models/procedimentos_complementares.rb +11 -0
  232. data/lib/tiss/models/procedimentos_executados.rb +51 -0
  233. data/lib/tiss/models/procedimentos_realizados.rb +10 -0
  234. data/lib/tiss/models/procedimentos_solicitados.rb +54 -0
  235. data/lib/tiss/models/profissionais.rb +34 -0
  236. data/lib/tiss/models/protocolos.rb +22 -0
  237. data/lib/tiss/models/recebimento_anexo.rb +14 -0
  238. data/lib/tiss/models/recibo_glosa_status.rb +42 -0
  239. data/lib/tiss/models/recurso_guia.rb +58 -0
  240. data/lib/tiss/models/recurso_guia_completa.rb +14 -0
  241. data/lib/tiss/models/recurso_procedimento.rb +55 -0
  242. data/lib/tiss/models/recurso_protocolo.rb +23 -0
  243. data/lib/tiss/models/relacao_glosa.rb +14 -0
  244. data/lib/tiss/models/relacao_guias.rb +70 -0
  245. data/lib/tiss/models/resposta_elegibilidade.rb +14 -0
  246. data/lib/tiss/models/servicos_autorizados.rb +10 -0
  247. data/lib/tiss/models/situacao_demonstrativo_retorno.rb +34 -0
  248. data/lib/tiss/models/totais_bruto_demonstrativo.rb +26 -0
  249. data/lib/tiss/models/totais_brutos_demonstrativo.rb +22 -0
  250. data/lib/tiss/models/totais_brutos_por_data.rb +22 -0
  251. data/lib/tiss/models/totais_demonstrativo.rb +18 -0
  252. data/lib/tiss/models/totais_liquidos_demonstrativo.rb +18 -0
  253. data/lib/tiss/models/totais_liquidos_por_data.rb +18 -0
  254. data/lib/tiss/models/totais_por_data.rb +26 -0
  255. data/lib/tiss/models/totais_por_protocolo.rb +26 -0
  256. data/lib/tiss/models/total_liquido_por_data.rb +18 -0
  257. data/lib/tiss/models/tratamentos_anteriores.rb +30 -0
  258. data/lib/tiss/tiss.rb +39 -0
  259. data/lib/tiss/version.rb +5 -0
  260. data/lib/tiss/xsd/class_maker.rb +242 -0
  261. data/lib/tiss/xsd/convert.rb +26 -0
  262. data/lib/tiss-ruby.rb +3 -0
  263. data/lib/xsd/class_maker.rb +219 -0
  264. data/lib/xsd/convert.rb +26 -0
  265. data/resources/TabelasDominio.doc +0 -0
  266. data/resources/tissAssinaturaDigital_v1.01.xsd +16 -0
  267. data/resources/tissComplexTypesV3_02_00.xsd +1370 -0
  268. data/resources/tissComplexTypesV3_02_01.xsd +1370 -0
  269. data/resources/tissComplexTypesV3_02_02.xsd +1370 -0
  270. data/resources/tissComplexTypesV3_03_01.xsd +1372 -0
  271. data/resources/tissComplexTypesV3_03_02.xsd +1372 -0
  272. data/resources/tissComplexTypesV3_03_03.xsd +1372 -0
  273. data/resources/tissComplexTypesV3_04_00.xsd +1406 -0
  274. data/resources/tissGuiasV3_02_00.xsd +1387 -0
  275. data/resources/tissGuiasV3_02_01.xsd +1388 -0
  276. data/resources/tissGuiasV3_02_02.xsd +1389 -0
  277. data/resources/tissGuiasV3_03_01.xsd +1402 -0
  278. data/resources/tissGuiasV3_03_02.xsd +1401 -0
  279. data/resources/tissGuiasV3_03_03.xsd +1401 -0
  280. data/resources/tissGuiasV3_04_00.xsd +1387 -0
  281. data/resources/tissSimpleTypesV3_02_00.xsd +3158 -0
  282. data/resources/tissSimpleTypesV3_02_01.xsd +3597 -0
  283. data/resources/tissSimpleTypesV3_02_02.xsd +3830 -0
  284. data/resources/tissSimpleTypesV3_03_01.xsd +4120 -0
  285. data/resources/tissSimpleTypesV3_03_02.xsd +4144 -0
  286. data/resources/tissSimpleTypesV3_03_03.xsd +4163 -0
  287. data/resources/tissSimpleTypesV3_04_00.xsd +4233 -0
  288. data/resources/tissV3_02_00.xsd +118 -0
  289. data/resources/tissV3_02_01.xsd +118 -0
  290. data/resources/tissV3_02_02.xsd +121 -0
  291. data/resources/tissV3_03_01.xsd +118 -0
  292. data/resources/tissV3_03_02.xsd +118 -0
  293. data/resources/tissV3_03_03.xsd +118 -0
  294. data/resources/tissV3_04_00.xsd +118 -0
  295. data/resources/xmldsig-core-schema.xsd +309 -0
  296. data/tiss-ruby.gemspec +55 -0
  297. metadata +569 -0
data/lib/tiss/tiss.rb ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'dry-configurable'
5
+ require 'nokogiri'
6
+
7
+ require_relative 'constants'
8
+ require_relative 'xsd/convert'
9
+ require_relative 'generator/generator'
10
+ require_relative 'model'
11
+ require_relative 'creator'
12
+
13
+
14
+ Dir[File.join(__dir__, 'models', '*.rb')].sort.each { |file| require file }
15
+
16
+ module Tiss
17
+ extend Dry::Configurable
18
+
19
+ setting :default_version, '3_02_00'
20
+ setting :available_versions, %w[3_02_00 3_02_01 3_02_02 3_03_01 3_03_02 3_03_03 3_04_00]
21
+
22
+ # TODO: Refactor this
23
+ class ConvertFromXsd
24
+ def initialize
25
+ Tiss.config.available_versions.each do |version|
26
+ %w[tissComplexTypes tissGuias tiss].each do |xml_name|
27
+ puts "./resources/V#{[xml_name, version].join}.xsd"
28
+ Tiss::Convert.models_from(version, File.open("./resources/#{[xml_name, 'V', version].join}.xsd"))
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def require_all(_dir)
36
+ Dir[File.expand_path(File.join(File.dirname(File.absolute_path(__FILE__)), _dir)) + '/**/*.rb'].sort.each do |file|
37
+ require file
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tiss
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,242 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+ require 'active_support'
5
+
6
+ module ClassMaker
7
+ include ActiveSupport::Inflector
8
+
9
+ XMLSchemaNS = 'http://www.w3.org/2001/XMLSchema'
10
+
11
+ def make_definition(node, target = Object)
12
+ return if is_text node
13
+ return if node.comment?
14
+ return if node.name === 'include'
15
+
16
+ attrs = node.attributes.to_hash
17
+ return unless attrs['name'].present?
18
+
19
+ name = attrs['name'].value
20
+
21
+ if is_element(node) || is_choice(node)
22
+ type = attrs['type'].value if attrs.key? 'type'
23
+ if type.nil?
24
+ complex_node = select_children(node, 'complexType').first
25
+ defined_class_name = define_class name, complex_node, target
26
+ { name: name, type: defined_class_name }
27
+ else
28
+ { name: name, type: sanitize_class_name(type.split(':').last) }
29
+ end
30
+ elsif is_simple node
31
+ unless name.nil?
32
+ restrictions = select_children(node, 'restriction').first
33
+ Tiss::Generator::ValidatorGenerator.call(@version, name, restrictions, target)
34
+ end
35
+ elsif is_complex_root node
36
+ define_class name, node, target
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def namespace_of(node)
43
+ node.namespace&.href
44
+ end
45
+
46
+ def is_text(node)
47
+ node.name == 'text'
48
+ end
49
+
50
+ def is_xml_schema_node(node)
51
+ namespace_of(node) == XMLSchemaNS
52
+ end
53
+
54
+ def is_element(node)
55
+ is_xml_schema_node(node) && (node.name == 'element')
56
+ end
57
+
58
+ def is_choice(node)
59
+ is_xml_schema_node(node) && (node.name == 'choice')
60
+ end
61
+
62
+ def is_simple(node)
63
+ is_xml_schema_node(node) && (node.name == 'simpleType')
64
+ end
65
+
66
+ def is_complex_root(node)
67
+ is_xml_schema_node(node) && (node.name == 'complexType')
68
+ end
69
+
70
+ def is_father(node)
71
+ is_xml_schema_node(node) && (node.name == 'complexType')
72
+ end
73
+
74
+ def sanitize_class_name(name)
75
+ name = underscore(name)
76
+ camelize(name.to_s.sub(/.*\./, ''))
77
+ end
78
+
79
+ def define_class(name, node, _target)
80
+ name = sanitize_class_name(name)
81
+
82
+ extension_class = ''
83
+ complex_content = select_children(node, 'complexContent')
84
+ extension = select_children(complex_content.first, 'extension').first
85
+ extension_type = extension.attributes['base'].value if extension
86
+ if extension
87
+ extension_class = sanitize_class_name(extension_type.split(':').last)
88
+ end
89
+
90
+ elems = []
91
+ unless node.nil?
92
+
93
+ # Take 4
94
+ elems = elements_by_node(node)
95
+
96
+ # Take 3
97
+ # parent_node = node
98
+ # until parent_node.children.empty?
99
+ # elems << select_children(parent_node.children, 'element')
100
+ # parent_node = parent_node.children.select(&:present?).first
101
+ # end
102
+
103
+
104
+ # Take 2
105
+ # parent_node = select_children(node, 'sequence')
106
+ # parent_node = select_children(node, 'choice') if !parent_node || parent_node.empty?
107
+ #
108
+ # choices = []
109
+ # choices = select_children parent_node.first, 'choice' unless parent_node.empty?
110
+ #
111
+ # elems = select_children parent_node.first, 'element' unless parent_node.empty?
112
+ # unless parent_node.empty? || choices.empty?
113
+ # elems += select_children choices.first, 'element'
114
+ # end
115
+
116
+ # Take 1
117
+ # sequence = select_children node, 'sequence'
118
+ # choices = select_children sequence.first, 'choice' unless sequence.empty?
119
+ # elems = select_children sequence.first, 'element' unless sequence.empty?
120
+ # unless sequence.empty? || choices.empty?
121
+ # elems += select_children choices.first, 'element'
122
+ # end
123
+ end
124
+
125
+ attributes = elems.flatten.map do |e|
126
+ make_definition(e, self)
127
+ end
128
+
129
+ return if attributes.blank?
130
+
131
+ Tiss::Generator::ModelGenerator.append(@version, name, attributes, extension_class)
132
+ name
133
+ end
134
+
135
+ def elements_by_node(node)
136
+ elems = []
137
+ node.children.each do |element|
138
+ next if element.nil?
139
+
140
+ if is_element(element)
141
+ elems << element
142
+ next
143
+ end
144
+ elems << elements_by_node(element)
145
+ end
146
+ elems.flatten.compact
147
+ end
148
+
149
+ def define_validator(name, restrictions, target)
150
+ name = "#{underscore(name)}_validator"
151
+ name = camelize(name.to_s.sub(/.*\./, ''))
152
+
153
+ base = restrictions
154
+ .attributes['base'].value.split(':').last
155
+
156
+ base = case base
157
+ when 'decimal'
158
+ 'float'
159
+ when 'boolean'
160
+ 'true_class'
161
+ else
162
+ base
163
+ end
164
+
165
+ type = constantize classify base
166
+
167
+ ws_action = select_children(restrictions, 'whiteSpace').first
168
+ ws_action = ws_action.attributes['value'].value unless ws_action.nil?
169
+
170
+ enum_values = select_children(restrictions, 'enumeration').collect do |enum|
171
+ enum.attributes['value'].value
172
+ end
173
+
174
+ pattern = select_children(restrictions, 'pattern').first
175
+ pattern = pattern.attributes['value'].value unless pattern.nil?
176
+
177
+ cls = Class.new ActiveModel::EachValidator do
178
+ const_set 'TYPE', type
179
+ const_set('WS_ACTION', ws_action) unless ws_action.nil?
180
+ const_set 'ENUM_VALUES', enum_values
181
+ unless pattern.nil?
182
+ const_set 'PATTERN', pattern
183
+ const_set 'REGEXP', Regexp.new("^#{pattern}$")
184
+ end
185
+
186
+ def validate_each(record, attribute, value)
187
+ validate_type record, attribute, value
188
+ handle_whitespaces record, attribute, value
189
+ unless self.class::ENUM_VALUES.empty?
190
+ validate_enumeration record, attribute, value
191
+ end
192
+ if self.class.const_defined? 'REGEXP'
193
+ validate_regexp record, attribute, value
194
+ end
195
+ end
196
+
197
+ private
198
+
199
+ def validate_type(record, attribute, value)
200
+ unless value.is_a? self.class::TYPE
201
+ add_error record, attribute, "#{value}: not a #{self.class::TYPE}"
202
+ end
203
+ end
204
+
205
+ def handle_whitespaces(record, attribute, value)
206
+ if self.class.const_defined? 'WS_ACTION'
207
+ case self.class::WS_ACTION
208
+ when 'replace' then value.gsub! /[\n\t\r ]/, ' '
209
+ when 'collapse' then
210
+ value.gsub! /[\n\t\r]/, ' '
211
+ value = value.split.join ' '
212
+ end
213
+ record.send "#{attribute}=", value
214
+ end
215
+ end
216
+
217
+ def validate_enumeration(record, attribute, value)
218
+ unless self.class::ENUM_VALUES.include? value.to_s
219
+ add_error record, attribute, "#{value}: not in #{self.class::ENUM_VALUES}"
220
+ end
221
+ end
222
+
223
+ def validate_regexp(record, attribute, value)
224
+ unless value =~ self.class::REGEXP
225
+ add_error record, attribute, "#{value}: not matching #{self.class::PATTERN}"
226
+ end
227
+ end
228
+
229
+ def add_error(record, attribute, message = '')
230
+ record.errors[attribute] << (options[:message] || message)
231
+ end
232
+ end
233
+ ap name
234
+ target.const_set name, cls
235
+ end
236
+
237
+ def select_children(node, name)
238
+ return [] unless node
239
+
240
+ node.children.select { |n| n.name == name }
241
+ end
242
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require_relative 'class_maker'
5
+
6
+ module Tiss
7
+ class Convert
8
+ class << self
9
+ include ClassMaker
10
+
11
+ def models_from(version, xsd_definitions)
12
+ doc = Nokogiri::XML xsd_definitions
13
+ @version = version
14
+
15
+ children = doc.children.reject { |node| node.name == 'comment' }
16
+ schema = children.first
17
+
18
+ raise 'Invalid XMLSchema root' if schema.name != 'schema'
19
+ raise 'Missing XMLSchema namespace' if schema.namespace.nil?
20
+ raise 'Wrong XMLSchema namespace' unless is_xml_schema_node schema
21
+
22
+ schema.children.each { |node| make_definition node }
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/tiss-ruby.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tiss/tiss'
@@ -0,0 +1,219 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+ require 'active_support'
5
+
6
+ module ClassMaker
7
+ include ActiveSupport::Inflector
8
+
9
+ XMLSchemaNS = 'http://www.w3.org/2001/XMLSchema'
10
+
11
+ def make_definition(node, target = Object)
12
+ return if is_text node
13
+ return if node.comment?
14
+ return if node.name === 'include'
15
+
16
+ attrs = node.attributes.to_hash
17
+ return unless attrs['name'].present?
18
+
19
+ name = attrs['name'].value
20
+
21
+ if is_element(node) || is_choice(node)
22
+ type = attrs['type'].value if attrs.key? 'type'
23
+ if type.nil?
24
+ complex_node = select_children(node, 'complexType').first
25
+ defined_class_name = define_class name, complex_node, target
26
+ { name: name, type: defined_class_name }
27
+ else
28
+ { name: name, type: sanitize_class_name(type.split(':').last) }
29
+ end
30
+ elsif is_simple node
31
+ unless name.nil?
32
+ restrictions = select_children(node, 'restriction').first
33
+ Tiss::Generator::ValidatorGenerator.call(@version, name, restrictions, target)
34
+ end
35
+ elsif is_complex_root node
36
+ define_class name, node, target
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def namespace_of(node)
43
+ node.namespace.href
44
+ end
45
+
46
+ def is_text(node)
47
+ node.name == 'text'
48
+ end
49
+
50
+ def is_xml_schema_node(node)
51
+ namespace_of(node) == XMLSchemaNS
52
+ end
53
+
54
+ def is_element(node)
55
+ is_xml_schema_node(node) && (node.name == 'element')
56
+ end
57
+
58
+ def is_choice(node)
59
+ is_xml_schema_node(node) && (node.name == 'choice')
60
+ end
61
+
62
+ def is_simple(node)
63
+ is_xml_schema_node(node) && (node.name == 'simpleType')
64
+ end
65
+
66
+ def is_complex_root(node)
67
+ is_xml_schema_node(node) && (node.name == 'complexType')
68
+ end
69
+
70
+ def sanitize_class_name(name)
71
+ name = underscore(name)
72
+ camelize(name.to_s.sub(/.*\./, ''))
73
+ end
74
+
75
+ def define_class(name, node, _target)
76
+ name = sanitize_class_name(name)
77
+
78
+ extension_class = ''
79
+ complex_content = select_children(node, 'complexContent')
80
+ extension = select_children(complex_content.first, 'extension').first
81
+ extension_type = extension.attributes['base'].value if extension
82
+ if extension
83
+ extension_class = sanitize_class_name(extension_type.split(':').last)
84
+ end
85
+
86
+ elems = []
87
+ unless node.nil?
88
+
89
+ parent_node = node
90
+ until parent_node.children.empty?
91
+ elems << select_children(parent_node.children, 'element')
92
+ parent_node = parent_node.children.select(&:present?).first
93
+ end
94
+
95
+ # Take 2
96
+ # parent_node = select_children(node, 'sequence')
97
+ # parent_node = select_children(node, 'choice') if !parent_node || parent_node.empty?
98
+ #
99
+ # choices = []
100
+ # choices = select_children parent_node.first, 'choice' unless parent_node.empty?
101
+ #
102
+ # elems = select_children parent_node.first, 'element' unless parent_node.empty?
103
+ # unless parent_node.empty? || choices.empty?
104
+ # elems += select_children choices.first, 'element'
105
+ # end
106
+
107
+ # Take 1
108
+ # sequence = select_children node, 'sequence'
109
+ # choices = select_children sequence.first, 'choice' unless sequence.empty?
110
+ # elems = select_children sequence.first, 'element' unless sequence.empty?
111
+ # unless sequence.empty? || choices.empty?
112
+ # elems += select_children choices.first, 'element'
113
+ # end
114
+ end
115
+
116
+ attributes = elems.flatten.map do |e|
117
+ make_definition(e, self)
118
+ end
119
+
120
+ return if attributes.blank?
121
+
122
+ Tiss::Generator::ModelGenerator.append(@version, name, attributes, extension_class)
123
+ name
124
+ end
125
+
126
+ def define_validator(name, restrictions, target)
127
+ name = "#{underscore(name)}_validator"
128
+ name = camelize(name.to_s.sub(/.*\./, ''))
129
+
130
+ base = restrictions
131
+ .attributes['base'].value.split(':').last
132
+
133
+ base = case base
134
+ when 'decimal'
135
+ 'float'
136
+ when 'boolean'
137
+ 'true_class'
138
+ else
139
+ base
140
+ end
141
+
142
+ type = constantize classify base
143
+
144
+ ws_action = select_children(restrictions, 'whiteSpace').first
145
+ ws_action = ws_action.attributes['value'].value unless ws_action.nil?
146
+
147
+ enum_values = select_children(restrictions, 'enumeration').collect do |enum|
148
+ enum.attributes['value'].value
149
+ end
150
+
151
+ pattern = select_children(restrictions, 'pattern').first
152
+ pattern = pattern.attributes['value'].value unless pattern.nil?
153
+
154
+ cls = Class.new ActiveModel::EachValidator do
155
+ const_set 'TYPE', type
156
+ const_set('WS_ACTION', ws_action) unless ws_action.nil?
157
+ const_set 'ENUM_VALUES', enum_values
158
+ unless pattern.nil?
159
+ const_set 'PATTERN', pattern
160
+ const_set 'REGEXP', Regexp.new("^#{pattern}$")
161
+ end
162
+
163
+ def validate_each(record, attribute, value)
164
+ validate_type record, attribute, value
165
+ handle_whitespaces record, attribute, value
166
+ unless self.class::ENUM_VALUES.empty?
167
+ validate_enumeration record, attribute, value
168
+ end
169
+ if self.class.const_defined? 'REGEXP'
170
+ validate_regexp record, attribute, value
171
+ end
172
+ end
173
+
174
+ private
175
+
176
+ def validate_type(record, attribute, value)
177
+ unless value.is_a? self.class::TYPE
178
+ add_error record, attribute, "#{value}: not a #{self.class::TYPE}"
179
+ end
180
+ end
181
+
182
+ def handle_whitespaces(record, attribute, value)
183
+ if self.class.const_defined? 'WS_ACTION'
184
+ case self.class::WS_ACTION
185
+ when 'replace' then value.gsub! /[\n\t\r ]/, ' '
186
+ when 'collapse' then
187
+ value.gsub! /[\n\t\r]/, ' '
188
+ value = value.split.join ' '
189
+ end
190
+ record.send "#{attribute}=", value
191
+ end
192
+ end
193
+
194
+ def validate_enumeration(record, attribute, value)
195
+ unless self.class::ENUM_VALUES.include? value.to_s
196
+ add_error record, attribute, "#{value}: not in #{self.class::ENUM_VALUES}"
197
+ end
198
+ end
199
+
200
+ def validate_regexp(record, attribute, value)
201
+ unless value =~ self.class::REGEXP
202
+ add_error record, attribute, "#{value}: not matching #{self.class::PATTERN}"
203
+ end
204
+ end
205
+
206
+ def add_error(record, attribute, message = '')
207
+ record.errors[attribute] << (options[:message] || message)
208
+ end
209
+ end
210
+ ap name
211
+ target.const_set name, cls
212
+ end
213
+
214
+ def select_children(node, name)
215
+ return [] unless node
216
+
217
+ node.children.select { |n| n.name == name }
218
+ end
219
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require_relative 'class_maker'
5
+
6
+ module Tiss
7
+ class Convert
8
+ class << self
9
+ include ClassMaker
10
+
11
+ def models_from(version, xsd_definitions)
12
+ doc = Nokogiri::XML xsd_definitions
13
+ @version = version
14
+
15
+ children = doc.children.reject { |node| node.name == 'comment' }
16
+ schema = children.first
17
+
18
+ raise 'Invalid XMLSchema root' if schema.name != 'schema'
19
+ raise 'Missing XMLSchema namespace' if schema.namespace.nil?
20
+ raise 'Wrong XMLSchema namespace' unless is_xml_schema_node schema
21
+
22
+ schema.children.each { |node| make_definition node }
23
+ end
24
+ end
25
+ end
26
+ end
Binary file
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- ***************************************************-->
3
+ <!-- *** Schema para assinaturas XML ***-->
4
+ <!-- *** a partir de certificados do padrão (X509) ***-->
5
+ <!-- *** ICP-Brasil - Projeto TISS***-->
6
+ <!-- ***************************************************-->
7
+ <!-- Schema for XML Signatures-->
8
+ <!--<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.1">-->
9
+ <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ns1="http://www.ans.gov.br/padroes/tiss/schemas" targetNamespace="http://www.ans.gov.br/padroes/tiss/schemas" elementFormDefault="qualified" version="0.1">
10
+ <import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
11
+ <complexType name="assinaturaDigital">
12
+ <complexContent>
13
+ <extension base="ds:SignatureType" />
14
+ </complexContent>
15
+ </complexType>
16
+ </schema>