br_nfe 1.1.0 → 2.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 (257) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +16 -0
  5. data/Gemfile.lock +27 -3
  6. data/LICENSE +1 -1
  7. data/README.markdown +10 -12
  8. data/Rakefile +13 -0
  9. data/br_nfe.gemspec +18 -21
  10. data/lib/br_nfe/active_model_base.rb +7 -1
  11. data/lib/br_nfe/base.rb +175 -37
  12. data/lib/br_nfe/endereco.rb +7 -1
  13. data/lib/br_nfe/helper/have_rps.rb +1 -1
  14. data/lib/br_nfe/helper/values_ts/service_v1.rb +313 -0
  15. data/lib/br_nfe/response/service/build_response.rb +286 -0
  16. data/lib/br_nfe/response/service/default.rb +185 -0
  17. data/lib/br_nfe/{servico/response → response/service}/nota_fiscal.rb +11 -10
  18. data/lib/br_nfe/response/service/paths/base.rb +93 -0
  19. data/lib/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta.rb +22 -0
  20. data/lib/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta.rb +25 -0
  21. data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta.rb +25 -0
  22. data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta.rb +25 -0
  23. data/lib/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta.rb +31 -0
  24. data/lib/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta.rb +36 -0
  25. data/lib/br_nfe/response/service/paths/v1/tc_nfse.rb +127 -0
  26. data/lib/br_nfe/service/base.rb +59 -0
  27. data/lib/br_nfe/service/betha/base.rb +8 -0
  28. data/lib/br_nfe/service/betha/v1/cancelamento_nfs.rb +39 -0
  29. data/lib/br_nfe/service/betha/v1/consulta_lote_rps.rb +34 -0
  30. data/lib/br_nfe/service/betha/v1/consulta_nfs_por_rps.rb +32 -0
  31. data/lib/br_nfe/service/betha/v1/consulta_nfse.rb +32 -0
  32. data/lib/br_nfe/service/betha/v1/consulta_situacao_lote_rps.rb +30 -0
  33. data/lib/br_nfe/service/betha/v1/gateway.rb +21 -0
  34. data/lib/br_nfe/service/betha/v1/recepcao_lote_rps.rb +37 -0
  35. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta.rb +19 -0
  36. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta.rb +17 -0
  37. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +17 -0
  38. data/lib/br_nfe/service/concerns/rules/cancelamento_nfs.rb +20 -0
  39. data/lib/br_nfe/service/concerns/rules/consulta_nfs_por_rps.rb +18 -0
  40. data/lib/br_nfe/service/concerns/rules/consulta_nfse.rb +29 -0
  41. data/lib/br_nfe/service/concerns/rules/recepcao_lote_rps.rb +50 -0
  42. data/lib/br_nfe/{servico → service}/intermediario.rb +1 -1
  43. data/lib/br_nfe/service/item.rb +70 -0
  44. data/lib/br_nfe/service/rps.rb +231 -0
  45. data/lib/br_nfe/service/sc/florianopolis/base.rb +25 -0
  46. data/lib/br_nfe/service/sc/florianopolis/cancellation.rb +30 -0
  47. data/lib/br_nfe/service/sc/florianopolis/emission_rps.rb +19 -0
  48. data/lib/br_nfe/service/sc/florianopolis/xml/_address.xml.slim +21 -0
  49. data/lib/br_nfe/service/sc/florianopolis/xml/_contact.xml.slim +3 -0
  50. data/lib/br_nfe/service/sc/florianopolis/xml/_service_item.xml.slim +9 -0
  51. data/lib/br_nfe/service/sc/florianopolis/xml/cancellation.xml.slim +6 -0
  52. data/lib/br_nfe/service/sc/florianopolis/xml/inf_requisicao.xml.slim +55 -0
  53. data/lib/br_nfe/service/sc/gaspar/cancela_nfse.rb +13 -0
  54. data/lib/br_nfe/service/sc/gaspar/consulta_lote_rps.rb +13 -0
  55. data/lib/br_nfe/service/sc/gaspar/consulta_nfs_por_rps.rb +13 -0
  56. data/lib/br_nfe/service/sc/gaspar/consulta_nfse.rb +17 -0
  57. data/lib/br_nfe/service/sc/gaspar/consulta_situacao_lote_rps.rb +13 -0
  58. data/lib/br_nfe/service/sc/gaspar/recepcao_lote_rps.rb +13 -0
  59. data/lib/br_nfe/service/sc/gaspar/recepcao_lote_rps_limitado.rb +13 -0
  60. data/lib/br_nfe/service/thema/v1/base.rb +55 -0
  61. data/lib/br_nfe/service/thema/v1/cancela_nfse.rb +48 -0
  62. data/lib/br_nfe/service/thema/v1/consulta_lote_rps.rb +49 -0
  63. data/lib/br_nfe/service/thema/v1/consulta_nfs_por_rps.rb +48 -0
  64. data/lib/br_nfe/service/thema/v1/consulta_nfse.rb +47 -0
  65. data/lib/br_nfe/service/thema/v1/consulta_situacao_lote_rps.rb +46 -0
  66. data/lib/br_nfe/service/thema/v1/recepcao_lote_rps.rb +51 -0
  67. data/lib/br_nfe/service/thema/v1/recepcao_lote_rps_limitado.rb +30 -0
  68. data/lib/br_nfe/service/xml/v1/_tc_contato.xml.slim +7 -0
  69. data/lib/br_nfe/service/xml/v1/_tc_cpf_cnpj.xml.slim +5 -0
  70. data/lib/br_nfe/service/xml/v1/_tc_dados_construcao_civil.xml.slim +2 -0
  71. data/lib/br_nfe/service/xml/v1/_tc_dados_prestador.xml.slim +15 -0
  72. data/lib/br_nfe/service/xml/v1/_tc_dados_servico.xml.slim +14 -0
  73. data/lib/br_nfe/service/xml/v1/_tc_dados_tomador.xml.slim +15 -0
  74. data/lib/br_nfe/service/xml/v1/_tc_endereco.xml.slim +13 -0
  75. data/lib/br_nfe/service/xml/v1/_tc_identificacao_intermediario_servico.xml.slim +7 -0
  76. data/lib/br_nfe/service/xml/v1/_tc_identificacao_nfse.xml.slim +7 -0
  77. data/lib/br_nfe/service/xml/v1/_tc_identificacao_orgao_gerador.xml.slim +8 -0
  78. data/lib/br_nfe/service/xml/v1/_tc_identificacao_prestador.xml.slim +3 -0
  79. data/lib/br_nfe/service/xml/v1/_tc_identificacao_rps.xml.slim +16 -0
  80. data/lib/br_nfe/service/xml/v1/_tc_identificacao_tomador.xml.slim +4 -0
  81. data/lib/br_nfe/service/xml/v1/_tc_inf_pedido_cancelamento.xml.slim +4 -0
  82. data/lib/br_nfe/service/xml/v1/_tc_inf_rps.xml.slim +47 -0
  83. data/lib/br_nfe/service/xml/v1/_tc_lote_rps.xml.slim +9 -0
  84. data/lib/br_nfe/service/xml/v1/_tc_pedido_cancelamento.xml.slim +4 -0
  85. data/lib/br_nfe/service/xml/v1/_tc_rps.xml.slim +8 -0
  86. data/lib/br_nfe/service/xml/v1/_tc_valores.xml.slim +48 -0
  87. data/lib/br_nfe/service/xml/v1/servico_cancelar_nfse_envio.xml.slim +9 -0
  88. data/lib/br_nfe/service/xml/v1/servico_consultar_lote_rps_envio.xml.slim +4 -0
  89. data/lib/br_nfe/service/xml/v1/servico_consultar_nfse_envio.xml.slim +19 -0
  90. data/lib/br_nfe/service/xml/v1/servico_consultar_nfse_rps_envio.xml.slim +5 -0
  91. data/lib/br_nfe/service/xml/v1/servico_consultar_situacao_lote_rps_envio.xml.slim +4 -0
  92. data/lib/br_nfe/service/xml/v1/servico_enviar_lote_rps_envio.xml.slim +9 -0
  93. data/lib/br_nfe/version.rb +2 -2
  94. data/lib/br_nfe/xml/_signed_info_sh1.xml.slim +9 -0
  95. data/lib/br_nfe/xml/signature_sh1.xml.slim +12 -0
  96. data/lib/br_nfe/xml/soap_env.xml.slim +3 -0
  97. data/lib/br_nfe.rb +72 -20
  98. data/test/br_nfe/base_test.rb +257 -108
  99. data/test/br_nfe/helper/have_intermediario_test.rb +2 -2
  100. data/test/br_nfe/helper/have_rps_test.rb +4 -4
  101. data/test/br_nfe/response/service/build_response_test.rb +377 -0
  102. data/test/br_nfe/response/service/default_test.rb +218 -0
  103. data/test/br_nfe/{servico/response → response/service}/nota_fiscal_test.rb +2 -2
  104. data/test/br_nfe/response/service/paths/base_test.rb +199 -0
  105. data/test/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta_test.rb +25 -0
  106. data/test/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta_test.rb +30 -0
  107. data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta_test.rb +30 -0
  108. data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta_test.rb +30 -0
  109. data/test/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta_test.rb +30 -0
  110. data/test/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta_test.rb +34 -0
  111. data/test/br_nfe/response/service/paths/v1/tc_nfse_test.rb +122 -0
  112. data/test/br_nfe/service/base_test.rb +138 -0
  113. data/test/br_nfe/service/betha/base_test.rb +9 -0
  114. data/test/br_nfe/service/betha/v1/cancelamento_nfs_test.rb +60 -0
  115. data/test/br_nfe/service/betha/v1/consulta_lote_rps_test.rb +55 -0
  116. data/test/br_nfe/service/betha/v1/consulta_nfs_por_rps_test.rb +55 -0
  117. data/test/br_nfe/service/betha/v1/consulta_nfse_test.rb +53 -0
  118. data/test/br_nfe/service/betha/v1/consulta_situacao_lote_rps_test.rb +49 -0
  119. data/test/br_nfe/service/betha/v1/gateway_test.rb +35 -0
  120. data/test/br_nfe/service/betha/v1/recepcao_lote_rps_test.rb +84 -0
  121. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta_test.rb +16 -0
  122. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta_test.rb +16 -0
  123. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta_test.rb +16 -0
  124. data/test/br_nfe/service/betha/v1/xsd/TiposNFe_v01.xsd +583 -0
  125. data/test/br_nfe/service/betha/v1/xsd/nfse_v01.xsd +652 -0
  126. data/test/br_nfe/service/betha/v1/xsd/servico_cancelar_nfse_envio_v01.xsd +17 -0
  127. data/test/br_nfe/service/betha/v1/xsd/servico_consultar_lote_rps_envio_v01.xsd +16 -0
  128. data/test/br_nfe/service/betha/v1/xsd/servico_consultar_nfse_envio_v01.xsd +28 -0
  129. data/test/br_nfe/service/betha/v1/xsd/servico_consultar_nfse_rps_envio_v01.xsd +16 -0
  130. data/test/br_nfe/service/betha/v1/xsd/servico_consultar_situacao_lote_rps_envio_v01.xsd +16 -0
  131. data/test/br_nfe/service/betha/v1/xsd/servico_enviar_lote_rps_envio_v01.xsd +17 -0
  132. data/test/br_nfe/service/betha/v1/xsd/xmldsig-core-schema.xsd +308 -0
  133. data/test/br_nfe/service/betha/v1/xsd/xmldsig-core-schema_v01.xsd +95 -0
  134. data/test/br_nfe/service/concerns/rules/cancelamento_nfs_test.rb +15 -0
  135. data/test/br_nfe/service/concerns/rules/consulta_nfs_por_rps_test.rb +36 -0
  136. data/test/br_nfe/service/concerns/rules/consulta_nfse_test.rb +42 -0
  137. data/test/br_nfe/{servico/base_test.rb → service/concerns/rules/recepcao_lote_rps_test.rb} +12 -4
  138. data/test/br_nfe/{servico → service}/intermediario_test.rb +1 -1
  139. data/test/br_nfe/service/item_test.rb +34 -0
  140. data/test/br_nfe/{servico → service}/rps_test.rb +191 -43
  141. data/test/br_nfe/service/sc/florianopolis/XSD/TiposNFSe_v2.0.xsd +863 -0
  142. data/test/br_nfe/service/sc/florianopolis/XSD/xmldsig-core-schema.xsd +309 -0
  143. data/test/br_nfe/service/sc/florianopolis/base_test.rb +20 -0
  144. data/test/br_nfe/service/sc/florianopolis/cancellation_test.rb +36 -0
  145. data/test/br_nfe/service/sc/florianopolis/emission_rps_test.rb +145 -0
  146. data/test/br_nfe/service/sc/gaspar/cancela_nfse_test.rb +21 -0
  147. data/test/br_nfe/service/sc/gaspar/consulta_nfs_por_rps_test.rb +21 -0
  148. data/test/br_nfe/service/sc/gaspar/consulta_nfse_test.rb +21 -0
  149. data/test/br_nfe/service/sc/gaspar/consulta_situacao_lote_rps_test.rb +21 -0
  150. data/test/br_nfe/service/sc/gaspar/recepcao_lote_rps_limitado_test.rb +22 -0
  151. data/test/br_nfe/service/sc/gaspar/recepcao_lote_rps_test.rb +22 -0
  152. data/test/br_nfe/service/thema/v1/base_test.rb +65 -0
  153. data/test/br_nfe/service/thema/v1/cancela_nfse_test.rb +56 -0
  154. data/test/br_nfe/service/thema/v1/consulta_lote_rps_test.rb +47 -0
  155. data/test/br_nfe/service/thema/v1/consulta_nfs_por_rps_test.rb +50 -0
  156. data/test/br_nfe/service/thema/v1/consulta_nfse_test.rb +50 -0
  157. data/test/br_nfe/service/thema/v1/consulta_situacao_lote_rps_test.rb +47 -0
  158. data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test.rb +62 -0
  159. data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test_limitado.rb +50 -0
  160. data/test/br_nfe/service/thema/v1/xsd/nfse.xsd +656 -0
  161. data/test/br_nfe/service/thema/v1/xsd/xmldsig-core-schema20020212.xsd +318 -0
  162. data/test/br_nfe/service/xsd/v1/nfse.xsd +779 -0
  163. data/test/br_nfe/service/xsd/v1/xmldsig-core-schema20020212.xsd +316 -0
  164. data/test/cert.pfx +0 -0
  165. data/test/factories/base.rb +2 -0
  166. data/test/factories/destinatario.rb +3 -3
  167. data/test/factories/response/service/build_response.rb +5 -0
  168. data/test/factories/response/service/default.rb +10 -0
  169. data/test/factories/{servico/response → response/service}/nota_fiscal.rb +9 -9
  170. data/test/factories/service/base.rb +6 -0
  171. data/test/factories/service/betha/base.rb +4 -0
  172. data/test/factories/service/betha/v1/cancelamento_nfs.rb +9 -0
  173. data/test/factories/{servico → service}/betha/v1/consulta_lote_rps.rb +2 -2
  174. data/test/factories/{servico → service}/betha/v1/consulta_nfs_por_rps.rb +1 -1
  175. data/test/factories/service/betha/v1/consulta_nfse.rb +8 -0
  176. data/test/factories/{servico → service}/betha/v1/consulta_situacao_lote_rps.rb +2 -2
  177. data/test/factories/{servico → service}/betha/v1/gateway.rb +1 -1
  178. data/test/factories/service/betha/v1/recepcao_lote_rps.rb +8 -0
  179. data/test/factories/{servico → service}/intermediario.rb +2 -2
  180. data/test/factories/service/item.rb +12 -0
  181. data/test/factories/service/rps.rb +50 -0
  182. data/test/factories/service/sc/florianopolis/base.rb +5 -0
  183. data/test/factories/service/sc/florianopolis/cancellation.rb +7 -0
  184. data/test/factories/service/sc/florianopolis/emission_rps.rb +7 -0
  185. data/test/factories/service/sc/gaspar/cancela_nfse.rb +9 -0
  186. data/test/factories/service/sc/gaspar/consulta_lote_rps.rb +7 -0
  187. data/test/factories/service/sc/gaspar/consulta_nfs_por_rps.rb +6 -0
  188. data/test/factories/service/sc/gaspar/consulta_nfse.rb +8 -0
  189. data/test/factories/service/sc/gaspar/consulta_situacao_lote_rps.rb +6 -0
  190. data/test/factories/service/sc/gaspar/recepcao_lote_rps.rb +9 -0
  191. data/test/factories/service/sc/gaspar/recepcao_lote_rps_limitado.rb +9 -0
  192. data/test/factories/service/thema/v1/base.rb +7 -0
  193. data/test/factories/service/thema/v1/cancela_nfse.rb +9 -0
  194. data/test/factories/service/thema/v1/consulta_lote_rps.rb +7 -0
  195. data/test/factories/service/thema/v1/consulta_nfs_por_rps.rb +6 -0
  196. data/test/factories/service/thema/v1/consulta_nfse.rb +8 -0
  197. data/test/factories/service/thema/v1/consulta_situacao_lote_rps.rb +6 -0
  198. data/test/factories/service/thema/v1/recepcao_lote_rps.rb +9 -0
  199. data/test/factories/service/thema/v1/recepcao_lote_rps_limitado.rb +8 -0
  200. data/test/test_helper.rb +42 -0
  201. metadata +338 -121
  202. data/lib/br_nfe/servico/base.rb +0 -35
  203. data/lib/br_nfe/servico/betha/base.rb +0 -85
  204. data/lib/br_nfe/servico/betha/build_response.rb +0 -141
  205. data/lib/br_nfe/servico/betha/v1/build_response.rb +0 -121
  206. data/lib/br_nfe/servico/betha/v1/cancelamento_nfs.rb +0 -52
  207. data/lib/br_nfe/servico/betha/v1/consulta_lote_rps.rb +0 -33
  208. data/lib/br_nfe/servico/betha/v1/consulta_nfs_por_rps.rb +0 -37
  209. data/lib/br_nfe/servico/betha/v1/consulta_nfse.rb +0 -51
  210. data/lib/br_nfe/servico/betha/v1/consulta_situacao_lote_rps.rb +0 -18
  211. data/lib/br_nfe/servico/betha/v1/gateway.rb +0 -125
  212. data/lib/br_nfe/servico/betha/v1/recepcao_lote_rps.rb +0 -97
  213. data/lib/br_nfe/servico/betha/v2/build_response.rb +0 -159
  214. data/lib/br_nfe/servico/betha/v2/cancelamento_nfs.rb +0 -30
  215. data/lib/br_nfe/servico/betha/v2/consulta_lote_rps.rb +0 -30
  216. data/lib/br_nfe/servico/betha/v2/consulta_nfse_por_rps.rb +0 -27
  217. data/lib/br_nfe/servico/betha/v2/envio_lote_rps_sincrono.rb +0 -30
  218. data/lib/br_nfe/servico/betha/v2/gateway.rb +0 -230
  219. data/lib/br_nfe/servico/betha/v2/gera_nfse.rb +0 -30
  220. data/lib/br_nfe/servico/betha/v2/recepcao_lote_rps.rb +0 -52
  221. data/lib/br_nfe/servico/betha/v2/substituicao_nfse.rb +0 -43
  222. data/lib/br_nfe/servico/response/default.rb +0 -34
  223. data/lib/br_nfe/servico/rps.rb +0 -108
  224. data/test/br_nfe/servico/betha/base_test.rb +0 -135
  225. data/test/br_nfe/servico/betha/v1/build_response_test.rb +0 -557
  226. data/test/br_nfe/servico/betha/v1/cancelamento_nfs_test.rb +0 -72
  227. data/test/br_nfe/servico/betha/v1/consulta_lote_rps_test.rb +0 -46
  228. data/test/br_nfe/servico/betha/v1/consulta_nfs_por_rps_test.rb +0 -68
  229. data/test/br_nfe/servico/betha/v1/consulta_nfse_test.rb +0 -74
  230. data/test/br_nfe/servico/betha/v1/consulta_situacao_lote_rps_test.rb +0 -27
  231. data/test/br_nfe/servico/betha/v1/gateway_test.rb +0 -151
  232. data/test/br_nfe/servico/betha/v1/recepcao_lote_rps_test.rb +0 -249
  233. data/test/br_nfe/servico/betha/v2/cancelamento_nfs_test.rb +0 -44
  234. data/test/br_nfe/servico/betha/v2/consulta_lote_rps_test.rb +0 -38
  235. data/test/br_nfe/servico/betha/v2/consulta_nfse_por_rps_test.rb +0 -36
  236. data/test/br_nfe/servico/betha/v2/envio_lote_rps_sincrono_test.rb +0 -51
  237. data/test/br_nfe/servico/betha/v2/gateway_test.rb +0 -372
  238. data/test/br_nfe/servico/betha/v2/gera_nfse_test.rb +0 -62
  239. data/test/br_nfe/servico/betha/v2/recepcao_lote_rps_test.rb +0 -108
  240. data/test/br_nfe/servico/betha/v2/substituicao_nfse_test.rb +0 -84
  241. data/test/br_nfe/servico/response/default_test.rb +0 -54
  242. data/test/factories/servico/base.rb +0 -5
  243. data/test/factories/servico/betha/base.rb +0 -5
  244. data/test/factories/servico/betha/v1/build_response.rb +0 -6
  245. data/test/factories/servico/betha/v1/cancelamento_nfs.rb +0 -7
  246. data/test/factories/servico/betha/v1/consulta_nfse.rb +0 -8
  247. data/test/factories/servico/betha/v1/recepcao_lote_rps.rb +0 -6
  248. data/test/factories/servico/betha/v2/cancelamento_nfs.rb +0 -7
  249. data/test/factories/servico/betha/v2/consulta_lote_rps.rb +0 -6
  250. data/test/factories/servico/betha/v2/consulta_nfse_por_rps.rb +0 -6
  251. data/test/factories/servico/betha/v2/envio_lote_rps_sincrono.rb +0 -5
  252. data/test/factories/servico/betha/v2/gateway.rb +0 -5
  253. data/test/factories/servico/betha/v2/gera_nfse.rb +0 -6
  254. data/test/factories/servico/betha/v2/recepcao_lote_rps.rb +0 -5
  255. data/test/factories/servico/betha/v2/substituicao_nfse.rb +0 -8
  256. data/test/factories/servico/response/default.rb +0 -10
  257. data/test/factories/servico/rps.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11fb152b3151c62d8608888d5ba95174e4d2a435
4
- data.tar.gz: 23472fba54d77618bd59b9793295971597513638
3
+ metadata.gz: dcf8317971e11086557fdb6a9041f0e870acaeaa
4
+ data.tar.gz: c5ef4f3c19e466e9fb4d1ffa62478075355c9d97
5
5
  SHA512:
6
- metadata.gz: 732f08b5b62348717188127aca18718c09063a5a56014512825e12fa4528f0a0a37578a0ebb07febeac1d491e212e8ff3bcc689eb0ba73d5ced80d40efe0fe6b
7
- data.tar.gz: 9cdb3eda197abddafaf1625dff5b4d275cae4cbf6ca7cab83e4dd66e34f286483e8943b415c213cf69c698ae53c38684a18e45cc6c024b2b7157aff4cbc49f2f
6
+ metadata.gz: d553904a62f2c4aa1c52d8d6a6c963477462da19f2938baa27c51ec282f97a8ab04ed04c11678efee48a40134016b84353792d035f66024b746c941154c50441
7
+ data.tar.gz: ced46055c7c90db5905f233794d096317ee3a8d74be72cc4346c4f1a308f47544ee0ddb077c5313fa78a416b53b7bfbbab4a1bbf2da36583b2fa3f47d071fd6c
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ coverage/
2
+ .dropbox
3
+ **/*.subl*
4
+ **/*.~lock.*
5
+ dev_load_data.rb
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.2.2
5
+ - 2.3.0
6
+ addons:
7
+ code_climate:
8
+ repo_token: 571a6f6afe1b31ac874320a14edfa22148e459a339f07dc23e82ec27e04a2fa9
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ # gem "mocha", :require => false
7
+ gem "codeclimate-test-reporter", require: nil
8
+ gem "mocha", :require => false
9
+ gem "factory_girl_rails"
10
+ gem 'minitest-reporters'
11
+ gem 'minitest-rails'
12
+ gem 'minitest-spec-rails'
13
+ gem 'shoulda-matchers', require: false
14
+ gem "minitest-matchers_vaccine"
15
+ gem 'simplecov'
16
+ end
data/Gemfile.lock CHANGED
@@ -1,13 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- br_nfe (1.0.2)
4
+ br_nfe (2.0.0)
5
5
  activemodel (~> 4)
6
6
  activesupport (~> 4)
7
7
  nokogiri (~> 1.6)
8
8
  rake (~> 10)
9
9
  savon (~> 2.11)
10
10
  signer (~> 1.4)
11
+ slim (~> 3.0)
12
+ slim-rails (~> 3.1)
11
13
 
12
14
  GEM
13
15
  remote: http://rubygems.org/
@@ -55,6 +57,7 @@ GEM
55
57
  builder (3.2.2)
56
58
  codeclimate-test-reporter (0.4.8)
57
59
  simplecov (>= 0.7.1, < 1.0.0)
60
+ coderay (1.1.1)
58
61
  docile (1.1.5)
59
62
  erubis (2.7.0)
60
63
  factory_girl (4.5.0)
@@ -66,8 +69,9 @@ GEM
66
69
  activesupport (>= 4.1.0)
67
70
  gyoku (1.3.1)
68
71
  builder (>= 2.1.2)
69
- httpi (2.4.1)
72
+ httpi (2.4.2)
70
73
  rack
74
+ socksify
71
75
  i18n (0.7.0)
72
76
  json (1.8.3)
73
77
  loofah (2.0.2)
@@ -75,6 +79,7 @@ GEM
75
79
  mail (2.6.3)
76
80
  mime-types (>= 1.16, < 3)
77
81
  metaclass (0.0.4)
82
+ method_source (0.8.2)
78
83
  mime-types (2.6.1)
79
84
  mini_portile (0.6.2)
80
85
  minitest (5.7.0)
@@ -96,6 +101,10 @@ GEM
96
101
  nokogiri (1.6.6.2)
97
102
  mini_portile (~> 0.6.0)
98
103
  nori (2.6.0)
104
+ pry (0.10.2)
105
+ coderay (~> 1.1.0)
106
+ method_source (~> 0.8.1)
107
+ slop (~> 3.4)
99
108
  rack (1.6.4)
100
109
  rack-test (0.6.3)
101
110
  rack (>= 1.0)
@@ -135,21 +144,32 @@ GEM
135
144
  wasabi (~> 3.4)
136
145
  shoulda-matchers (2.8.0)
137
146
  activesupport (>= 3.0.0)
138
- signer (1.4.2)
147
+ signer (1.4.3)
139
148
  nokogiri (>= 1.5.1)
140
149
  simplecov (0.10.0)
141
150
  docile (~> 1.1.0)
142
151
  json (~> 1.8)
143
152
  simplecov-html (~> 0.10.0)
144
153
  simplecov-html (0.10.0)
154
+ slim (3.0.7)
155
+ temple (~> 0.7.6)
156
+ tilt (>= 1.3.3, < 2.1)
157
+ slim-rails (3.1.0)
158
+ actionpack (>= 3.1)
159
+ railties (>= 3.1)
160
+ slim (~> 3.0)
161
+ slop (3.6.0)
162
+ socksify (1.7.0)
145
163
  sprockets (3.2.0)
146
164
  rack (~> 1.0)
147
165
  sprockets-rails (2.3.2)
148
166
  actionpack (>= 3.0)
149
167
  activesupport (>= 3.0)
150
168
  sprockets (>= 2.8, < 4.0)
169
+ temple (0.7.7)
151
170
  thor (0.19.1)
152
171
  thread_safe (0.3.5)
172
+ tilt (2.0.5)
153
173
  tzinfo (1.2.2)
154
174
  thread_safe (~> 0.1)
155
175
  wasabi (3.5.0)
@@ -168,5 +188,9 @@ DEPENDENCIES
168
188
  minitest-reporters
169
189
  minitest-spec-rails
170
190
  mocha
191
+ pry (~> 0.10)
171
192
  shoulda-matchers
172
193
  simplecov
194
+
195
+ BUNDLED WITH
196
+ 1.11.2
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015 Bruno M. Mergen
1
+ Copyright (c) 2016 Bruno M. Mergen
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.markdown CHANGED
@@ -1,8 +1,6 @@
1
1
  [![Build Status](https://travis-ci.org/Brunomm/br_nfe.svg?branch=master)](https://travis-ci.org/Brunomm/br_nfe)
2
2
  [![Test Coverage](https://codeclimate.com/github/Brunomm/br_nfe/badges/coverage.svg)](https://codeclimate.com/github/Brunomm/br_nfe/coverage)
3
3
  [![Gem Version](https://badge.fury.io/rb/br_nfe.svg)](http://badge.fury.io/rb/br_nfe)
4
- [![Dependency Status](https://gemnasium.com/Brunomm/br_nfe.svg)](https://gemnasium.com/Brunomm/br_nfe)
5
- [![security](https://hakiri.io/github/Brunomm/br_nfe/master.svg)](https://hakiri.io/github/Brunomm/br_nfe/master)
6
4
  [![Code Climate](https://codeclimate.com/github/Brunomm/br_nfe/badges/gpa.svg)](https://codeclimate.com/github/Brunomm/br_nfe)
7
5
 
8
6
  # **BrNfe**
@@ -41,8 +39,8 @@ BrNfe::Endereco
41
39
  BrNfe::Emitente
42
40
  BrNfe::Destinatario
43
41
  BrNfe::CondicaoPagamento
44
- BrNfe::Servico::Intermediario
45
- BrNfe::Servico::Rps
42
+ BrNfe::Service::Intermediario
43
+ BrNfe::Service::Rps
46
44
  ```
47
45
 
48
46
  A seguir um exemplo de cada objeto com valores:
@@ -143,7 +141,7 @@ end
143
141
  ***
144
142
  **Intermediário do serviço**
145
143
  ```ruby
146
- @intermediario = BrNfe::Servico::Intermediario.new({
144
+ @intermediario = BrNfe::Service::Intermediario.new({
147
145
  cpf_cnpj: '11.111.111/0001-36',
148
146
  inscricao_municipal: '3355-6',
149
147
  razao_social: "INTERMEDIÁRIO DO SERVIÇO"
@@ -152,10 +150,10 @@ end
152
150
  ***
153
151
  **RPS**
154
152
  ```ruby
155
- @rps = BrNfe::Servico::Rps.new do |rps|
153
+ @rps = BrNfe::Service::Rps.new do |rps|
156
154
  rps.destinatario = { ... } # Attributos da class BrNfe::Destinatario
157
155
  rps.intermediario do |intermediario|
158
- .... # Dados da class BrNfe::Servico::Intermediario
156
+ .... # Dados da class BrNfe::Service::Intermediario
159
157
  end
160
158
  rps.condicao_pagamento = BrNfe::CondicaoPagamento.new(...)
161
159
 
@@ -202,14 +200,14 @@ Para todos os Web Services, após instanciados, poderá ser chamado o método `r
202
200
 
203
201
  Se desejar, antes de enviar os dados, o objeto poderá ser validado, EX:
204
202
  ```ruby
205
- @ws = BrNfe::Servico::Betha::V1::ConsultaLoteRps.new(...)
203
+ @ws = BrNfe::Service::Betha::V1::ConsultaLoteRps.new(...)
206
204
  if @ws.valid?
207
205
  @ws.request
208
206
  @response = @ws.response
209
207
  end
210
208
  ```
211
- O resultado obtido na variável `@response` é um objeto da class `BrNfe::Servico::Response::Default`, no qual será retornada em todas as requisições. Essa classe é responsável de manter o padrão das mensagens de resposta para todos os webservices. Se desejar, poderá obter a resposta original (no formato Hash) de cada órgão emissor através do método `original_response`.
212
- Para saber quais os valores obtidos pelo `BrNfe::Servico::Response::Default`, veja: [Resposta padrão](exemplos/resposta_padrao.markdown)
209
+ O resultado obtido na variável `@response` é um objeto da class `BrNfe::Service::Response::Default`, no qual será retornada em todas as requisições. Essa classe é responsável de manter o padrão das mensagens de resposta para todos os webservices. Se desejar, poderá obter a resposta original (no formato Hash) de cada órgão emissor através do método `original_response`.
210
+ Para saber quais os valores obtidos pelo `BrNfe::Service::Response::Default`, veja: [Resposta padrão](exemplos/resposta_padrao.markdown)
213
211
 
214
212
  Lista de exemplos:
215
213
 
@@ -228,9 +226,9 @@ BrNfe.setup do |config|
228
226
  config.endereco_class = BrNfe::Endereco
229
227
  config.emitente_class = BrNfe::Emitente
230
228
  config.destinatario_class = BrNfe::Destinatario
231
- config.intermediario_class = BrNfe::Servico::Intermediario
229
+ config.intermediario_class = BrNfe::Service::Intermediario
232
230
  config.condicao_pagamento_class = BrNfe::CondicaoPagamento
233
- config.rps_class BrNfe::Servico::Rps
231
+ config.rps_class BrNfe::Service::Rps
234
232
 
235
233
  # Se você utiliza certificado SSL, faça as seguintes modificações na configuração:
236
234
  # config.client_wsdl_ssl_verify_mode = :peer
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |task|
4
+ task.libs << %w(test lib)
5
+ task.pattern = 'test/**/*_test.rb'
6
+ end
7
+
8
+ desc "Open an irb session preloaded with this library"
9
+ task :console do
10
+ sh "irb -rubygems -I lib -r br_nfe.rb"
11
+ end
12
+
13
+ task :default => :test
data/br_nfe.gemspec CHANGED
@@ -1,31 +1,25 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require File.expand_path('../lib/br_nfe/version', __FILE__)
3
3
 
4
- e = Gem::Specification.new do |gem|
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "br_nfe"
6
+ gem.version = BrNfe::Version::CURRENT
7
+ gem.license = "MIT"
8
+ gem.description = %q{BrNfe é uma gem para projetos Ruby on Rails que tem como objetifo facilitar e padronizar a emissão de Notas Fiscais eletrônicas}
9
+ gem.summary = %q{Emissão de Notas Fiscais Eletrônicas em Ruby}
5
10
  gem.authors = ["Bruno M. Mergen"]
6
11
  gem.email = ["brunomergen@gmail.com"]
7
- gem.description = %q{Emissão de Notas Fiscais Eletrônicas em Ruby}
8
- gem.summary = %q{BrNfe é uma gem para projetos Ruby on Rails que tem como objetifo facilitar e padronizar a emissão de Notas Fiscais eletrônicas}
9
12
  gem.homepage = "https://github.com/Brunomm/br_nfe"
10
- gem.license = "BSD"
11
-
12
- gem.files = `git ls-files`.split($\).reject do |file|
13
- file =~ %r{^(?:
14
- test/.*
15
- |Gemfile
16
- |Rakefile
17
- |coverage/.*
18
- |exemplos/.*
19
- |\.travis.yml
20
- )$}x
21
- end
22
- gem.test_files = `git ls-files -- test/**/*`.split("\n")
23
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
24
- gem.name = "br_nfe"
13
+
14
+ gem.files = `git ls-files`.split("\n").reject{|fil|
15
+ fil.include?('coverage/') ||
16
+ fil.include?('exemplos/')
17
+ }
18
+ gem.test_files = `git ls-files -- test`.split("\n")
19
+ # gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
25
20
  gem.require_paths = ["lib"]
26
- gem.version = BrNfe::Version::CURRENT
27
21
 
28
- gem.required_ruby_version = '>= 2.1'
22
+ gem.required_ruby_version = ['~> 2.1', '~> 2.2', '~> 2.3']
29
23
 
30
24
  gem.add_dependency "rake", '~> 10'
31
25
  gem.add_dependency "activesupport", '~> 4'
@@ -33,5 +27,8 @@ e = Gem::Specification.new do |gem|
33
27
  gem.add_dependency "nokogiri", "~> 1.6"
34
28
  gem.add_dependency "savon", "~> 2.11"
35
29
  gem.add_dependency "signer", "~> 1.4"
36
-
30
+ gem.add_dependency "slim", "~> 3.0"
31
+ gem.add_dependency "slim-rails", "~> 3.1"
32
+
33
+ gem.add_development_dependency "pry", '~> 0.10'
37
34
  end
@@ -51,12 +51,18 @@ module BrNfe
51
51
  #
52
52
  def value_monetary(value, precision=2)
53
53
  return unless value
54
- value.to_f.round(2)
54
+ precision ||= 2
55
+ value.to_f.round(precision)
55
56
  end
56
57
 
57
58
  def value_amount(value, precision=2)
58
59
  value_monetary(value, precision)
59
60
  end
60
61
 
62
+ def canonicalize(xml)
63
+ xml = Nokogiri::XML(xml.to_s, &:noblanks)
64
+ xml.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
65
+ end
66
+
61
67
  end
62
68
  end
data/lib/br_nfe/base.rb CHANGED
@@ -6,6 +6,12 @@ module BrNfe
6
6
  attr_accessor :certificate_pkcs12_password
7
7
  attr_accessor :certificate_pkcs12_path
8
8
  attr_accessor :certificate_pkcs12_value
9
+ attr_accessor :env
10
+
11
+ attr_accessor :client_wsdl_ssl_verify_mode
12
+ attr_accessor :client_wsdl_ssl_cert_file
13
+ attr_accessor :client_wsdl_ssl_cert_key_file
14
+ attr_accessor :client_wsdl_ssl_cert_key_password
9
15
 
10
16
  validate :validar_emitente
11
17
  validates :certificate, :certificate_key, presence: true, if: :certificado_obrigatorio?
@@ -15,14 +21,6 @@ module BrNfe
15
21
  false
16
22
  end
17
23
 
18
- # Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value
19
- # Caso tenha o certificate_pkcs12 em arquivo, basta setar o atributo certificate_pkcs12_path e deixar o atributo certificate_pkcs12_value em branco
20
- def certificate_pkcs12_value
21
- @certificate_pkcs12_value ||= File.read(certificate_pkcs12_path)
22
- end
23
-
24
- attr_accessor :env
25
-
26
24
  def env
27
25
  @env ||= :production
28
26
  end
@@ -31,64 +29,148 @@ module BrNfe
31
29
  @original_response
32
30
  end
33
31
 
34
-
35
32
  def response
36
33
  @response
37
34
  end
38
35
 
39
- def wsdl
40
- raise "Não implementado."
41
- end
42
-
36
+ # Namespace da requisição SOAP
37
+ #
43
38
  def env_namespace
44
39
  :soapenv
45
40
  end
46
41
 
42
+ # Deve conter o LINK do webservice a ser chamado
43
+ #
44
+ def wsdl
45
+ raise "Não implementado."
46
+ end
47
+
48
+ # Método que contem qual a operação que deverá ser chamada
49
+ # do WS SOAP.
50
+ #
47
51
  def method_wsdl
48
52
  raise "Não implementado."
49
53
  end
50
54
 
55
+ # O xml_builder é o que contém o conteúdo de cada tipo de requisição
56
+ # e deve ser sobrescrito em cada classe implementada. Por exemplo:
57
+ # recepcao_lote_rps, consulta_lote_rps, cancelamento_nfs, etc..
58
+ #
51
59
  def xml_builder
52
60
  raise "Não implementado."
53
61
  end
54
62
 
55
- def namespace_identifier
56
- raise 'Não implementado.'
63
+ # Esse método serve para ser utilizado no Base de cada orgão emissor
64
+ # onde em alguns casos é necessário colocar o xml em um CDATA
65
+ # É esse método que é passado dentro do Body da equisição SOAP
66
+ #
67
+ def content_xml
68
+ xml_builder
57
69
  end
58
70
 
59
- def namespaces
60
- {}
71
+ # O Namespace Indentifier é utilizado para adicionar o
72
+ # namespace na tag principal da requisição. Normalmente deve seguir
73
+ # o namespace utilizado para identificar o namespace da mensagem.
74
+ #
75
+ # Exemplo: se o método message_namespaces for {xmlns:ns1="http...."} então
76
+ # o namespace_identifier deveria ser :ns1.
77
+ # E com isso irá adicionar o namespace na tag principal da requsição.
78
+ # Exemplo com a requisição EnviarLoteRps:
79
+ # COM namespace_identifier => ns1:EnviarLoteRpsEnvio
80
+ # SEM namespace_identifier => EnviarLoteRpsEnvio
81
+ #
82
+ # <b>Tipo de retorno: </b> _Hash_ OR _Nil_
83
+ #
84
+ def namespace_identifier
61
85
  end
62
86
 
63
- def certificate_pkcs12
64
- @certificate_pkcs12 ||= OpenSSL::PKCS12.new(certificate_pkcs12_value, certificate_pkcs12_password)
65
- rescue
87
+ def message_namespaces
88
+ {}
66
89
  end
67
90
 
68
- def certificate_pkcs12=(value)
69
- @certificate_pkcs12 = value
91
+ def soap_namespaces
92
+ {
93
+ 'xmlns:soapenv' => 'http://schemas.xmlsoap.org/soap/envelope/',
94
+ 'xmlns:ins0' => 'http://www.w3.org/2000/09/xmldsig#',
95
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
96
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
97
+ }
70
98
  end
71
99
 
72
100
  def wsdl_encoding
73
101
  "UTF-8"
74
102
  end
75
103
 
104
+ # Tag XML que vai na requisição SOAP
105
+ #
106
+ # <b>Tipo de retorno: </b> _String_
107
+ #
108
+ def tag_xml
109
+ "<?xml version=\"1.0\" encoding=\"#{wsdl_encoding}\"?>"
110
+ end
111
+
112
+ # XML que irá na requisição SOAP
113
+ #
114
+ # <b>Tipo de retorno: </b> _String XML_
115
+ #
116
+ def soap_xml
117
+ @soap_xml ||= "#{tag_xml}#{render_xml('soap_env')}".html_safe
118
+ end
119
+
120
+ # Versão do XML utilizado
121
+ # Cada Cidade pode utilizar uma versão diferente do XML
122
+ #
123
+ # <b>Tipo de retorno: </b> _Symbol_
124
+ #
125
+ def xml_version
126
+ :v1
127
+ end
128
+
76
129
  def client_wsdl
77
130
  @client_wsdl ||= Savon.client({
78
- namespaces: namespaces,
79
- env_namespace: env_namespace,
80
131
  wsdl: wsdl,
81
- namespace_identifier: namespace_identifier,
82
- encoding: wsdl_encoding,
83
132
  log: BrNfe.client_wsdl_log,
84
133
  pretty_print_xml: BrNfe.client_wsdl_pretty_print_xml,
85
- ssl_verify_mode: BrNfe.client_wsdl_ssl_verify_mode,
86
- ssl_cert_file: BrNfe.client_wsdl_ssl_cert_file,
87
- ssl_cert_key_file: BrNfe.client_wsdl_ssl_cert_key_file,
88
- ssl_cert_key_password: BrNfe.client_wsdl_ssl_cert_key_password
134
+
135
+ ssl_verify_mode: client_wsdl_ssl_verify_mode,
136
+ ssl_cert_file: client_wsdl_ssl_cert_file,
137
+ ssl_cert_key_file: client_wsdl_ssl_cert_key_file,
138
+ ssl_cert_key_password: client_wsdl_ssl_cert_key_password
89
139
  })
90
140
  end
91
141
 
142
+ def client_wsdl_ssl_verify_mode
143
+ @client_wsdl_ssl_verify_mode ||= BrNfe.client_wsdl_ssl_verify_mode
144
+ end
145
+ def client_wsdl_ssl_cert_file
146
+ @client_wsdl_ssl_cert_file ||= BrNfe.client_wsdl_ssl_cert_file
147
+ end
148
+ def client_wsdl_ssl_cert_key_file
149
+ @client_wsdl_ssl_cert_key_file ||= BrNfe.client_wsdl_ssl_cert_key_file
150
+ end
151
+ def client_wsdl_ssl_cert_key_password
152
+ @client_wsdl_ssl_cert_key_password ||= BrNfe.client_wsdl_ssl_cert_key_password
153
+ end
154
+
155
+ # Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value
156
+ # Caso tenha o certificate_pkcs12 em arquivo, basta setar o atributo certificate_pkcs12_path e deixar o atributo certificate_pkcs12_value em branco
157
+ def certificate_pkcs12_value
158
+ @certificate_pkcs12_value ||= File.read(certificate_pkcs12_path)
159
+ end
160
+
161
+ def certificate_pkcs12
162
+ return @certificate_pkcs12 if @certificate_pkcs12
163
+ @certificate_pkcs12 = nil
164
+ # Correção bug http://stackoverflow.com/questions/33112155/pgconnectionbad-pqconsumeinput-ssl-error-key-values-mismatch/36283315#36283315
165
+ Thread.new { @certificate_pkcs12 = OpenSSL::PKCS12.new(certificate_pkcs12_value, certificate_pkcs12_password) }.join
166
+ @certificate_pkcs12
167
+ rescue
168
+ end
169
+
170
+ def certificate_pkcs12=(value)
171
+ @certificate_pkcs12 = value
172
+ end
173
+
92
174
  def certificate=(value)
93
175
  @certificate = value
94
176
  end
@@ -103,6 +185,64 @@ module BrNfe
103
185
 
104
186
  def certificate_key=(value)
105
187
  @certificate_key = value
188
+ end
189
+
190
+ # Renderiza o xml a partir do nome de um arquivo
191
+ # Irá procurar o arquivo a partir dos seguintes diretórios>
192
+ # 1° - A partir do parâmetro :dir_path
193
+ # 2° - A partir do método xml_current_dir_path
194
+ # 3° - A partir do método xml_default_dir_path
195
+ #
196
+ # Se não encontrar o arquivo em nenhum dos diretórios irá execurar
197
+ # uma excessão de RuntimeError
198
+ #
199
+ # Utilização
200
+ # `render_xml('file_name', {dir_path: '/my/custom/dir', context: Object}`
201
+ #
202
+ # <b>Tipo de retorno: <b> _String_ (XML)
203
+ #
204
+ def render_xml file_name, opts={}
205
+ opts ||= {}
206
+ default_options = opts.extract!(:dir_path, :context)
207
+ default_options[:context] ||= self
208
+
209
+ # Inicializa a variavel xml com nil para comparar se oa rquivo foi de fato encontrado.
210
+ xml = nil
211
+ get_xml_dirs(default_options[:dir_path]).each do |dir|
212
+ if xml = find_xml(file_name, dir, default_options[:context], opts)
213
+ break # Stop loop
214
+ end
215
+ end
216
+
217
+ # Lança uma excessão se não for encontrado o xml
218
+ # Deve verificar se é nil pois o arquivo xml pode estar vazio
219
+ if xml.nil?
220
+ raise "Arquivo #{file_name}.xml.slim não encontrado nos diretórios #{get_xml_dirs(default_options[:dir_path])}"
221
+ end
222
+ xml
223
+ end
224
+
225
+ def find_xml(file_name, dir, context=nil, options={})
226
+ if File.exists?("#{dir}/#{file_name}.xml.slim")
227
+ Slim::Template.new("#{dir}/#{file_name}.xml.slim").render(context, options).html_safe
228
+ end
229
+ end
230
+
231
+ def get_xml_dirs(custom_dir_path=nil)
232
+ [custom_dir_path, xml_current_dir_path, xml_default_dir_path].flatten.select(&:present?)
233
+ end
234
+
235
+ # Diretório personalizado para cada classe
236
+ # Podendo ser sobrescrito em cada herança
237
+ #
238
+ def xml_current_dir_path
239
+ []
240
+ end
241
+
242
+ # Diretório padrão dos arquivos XML
243
+ #
244
+ def xml_default_dir_path
245
+ "#{BrNfe.root}/lib/br_nfe/xml"
106
246
  end
107
247
 
108
248
  private
@@ -137,10 +277,14 @@ module BrNfe
137
277
  canonicalize ass
138
278
  end
139
279
 
280
+ def canonicalization_method_algorithm
281
+ 'http://www.w3.org/2001/10/xml-exc-c14n#'
282
+ end
283
+
140
284
  def signed_info(data_xml, uri='')
141
285
  Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
142
286
  xml.SignedInfo(xmlns: "http://www.w3.org/2000/09/xmldsig#") do |info|
143
- info.CanonicalizationMethod(Algorithm: 'http://www.w3.org/2001/10/xml-exc-c14n#')
287
+ info.CanonicalizationMethod(Algorithm: canonicalization_method_algorithm)
144
288
  info.SignatureMethod(Algorithm: 'http://www.w3.org/2000/09/xmldsig#rsa-sha1')
145
289
  info.Reference('URI' => uri){
146
290
  info.Transforms{
@@ -165,12 +309,6 @@ module BrNfe
165
309
  remove_quebras Base64.encode64(OpenSSL::Digest::SHA1.digest(xml_canon))
166
310
  end
167
311
 
168
-
169
- def canonicalize(xml)
170
- xml = Nokogiri::XML(xml.to_s, &:noblanks)
171
- xml.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
172
- end
173
-
174
312
  def remove_quebras(str)
175
313
  str.gsub(/\n/,'').gsub(/\t/,'').strip
176
314
  end