br_nfe 1.1.0 → 2.0.0

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