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
@@ -0,0 +1,8 @@
1
+ - xml_rps = render_xml '_tc_inf_rps', rps: rps
2
+ / Alguns órgãos emissores não aceitam o atributo ID na tag (Como a betha)
3
+ - attributes_inf_rps = id_attribute? ? {id: "R#{rps.numero}"} : {}
4
+ InfRps *attributes_inf_rps
5
+ = xml_rps.html_safe
6
+
7
+ - if certificate
8
+ = render_xml('signature_sh1', data_xml: xml_rps.html_safe, uri: "#R#{rps.numero}").html_safe
@@ -0,0 +1,48 @@
1
+ - rps ||= false
2
+ - raise "É obrigatório passar um RPS por parâmetro" unless rps
3
+
4
+ ValorServicos = ts_valor(rps.total_services)
5
+
6
+ - if rps.deductions.present? && rps.deductions.to_f > 0.0
7
+ ValorDeducoes = ts_valor(rps.deductions)
8
+
9
+ - if rps.valor_pis.present? && rps.valor_pis.to_f > 0.0
10
+ ValorPis = ts_valor(rps.valor_pis)
11
+
12
+ - if rps.valor_cofins.present? && rps.valor_cofins.to_f > 0.0
13
+ ValorCofins = ts_valor(rps.valor_cofins)
14
+
15
+ - if rps.valor_inss.present? && rps.valor_inss.to_f > 0.0
16
+ ValorInss = ts_valor(rps.valor_inss)
17
+
18
+ - if rps.valor_ir.present? && rps.valor_ir.to_f > 0.0
19
+ ValorIr = ts_valor(rps.valor_ir)
20
+
21
+ - if rps.valor_csll.present? && rps.valor_csll.to_f > 0.0
22
+ ValorCsll = ts_valor(rps.valor_csll)
23
+
24
+ IssRetido = ts_sim_nao(rps.iss_retained?)
25
+
26
+ - if rps.total_iss.present? && rps.total_iss.to_f > 0.0
27
+ ValorIss = ts_valor(rps.total_iss)
28
+
29
+ - if rps.total_iss_retained.present? && rps.total_iss_retained.to_f > 0.0
30
+ ValorIssRetido = ts_valor(rps.total_iss_retained)
31
+
32
+ - if rps.outras_retencoes.present? && rps.outras_retencoes.to_f > 0.0
33
+ OutrasRetencoes = ts_valor(rps.outras_retencoes)
34
+
35
+ - if rps.base_calculation.present? && rps.base_calculation.to_f > 0.0
36
+ BaseCalculo = ts_valor(rps.base_calculation)
37
+
38
+ - if rps.iss_tax_rate.present? && rps.iss_tax_rate.to_f > 0.0
39
+ Aliquota = ts_aliquota(rps.iss_tax_rate)
40
+
41
+ - if rps.net_value.present? && rps.net_value.to_f > 0.0
42
+ ValorLiquidoNfse = ts_valor(rps.net_value)
43
+
44
+ - if rps.desconto_incondicionado.present? && rps.desconto_incondicionado.to_f > 0.0
45
+ DescontoIncondicionado = ts_valor(rps.desconto_incondicionado)
46
+
47
+ - if rps.desconto_condicionado.present? && rps.desconto_condicionado.to_f > 0.0
48
+ DescontoCondicionado = ts_valor(rps.desconto_condicionado)
@@ -0,0 +1,9 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}CancelarNfseEnvio"} *message_namespaces
2
+ Pedido
3
+ - id_cancelamento = Time.now.nsec
4
+ - xml_pedido_cancel = render_xml '_tc_pedido_cancelamento', id_cancelamento: "C#{id_cancelamento}"
5
+
6
+ = xml_pedido_cancel.html_safe
7
+
8
+ - if certificate
9
+ = render_xml('signature_sh1', data_xml: xml_pedido_cancel.html_safe, uri: "#C#{id_cancelamento}").html_safe
@@ -0,0 +1,4 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}ConsultarLoteRpsEnvio"} *message_namespaces
2
+ Prestador
3
+ = render_xml '_tc_identificacao_prestador'
4
+ Protocolo = ts_numero_protocolo(protocolo)
@@ -0,0 +1,19 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}ConsultarNfseEnvio"} *message_namespaces
2
+ Prestador
3
+ = render_xml '_tc_identificacao_prestador'
4
+
5
+ - if nfe_number.present?
6
+ NumeroNfse = ts_numero_nfse(nfe_number)
7
+
8
+ - if start_date.present? && end_date.present?
9
+ PeriodoEmissao
10
+ DataInicial = ts_date(start_date)
11
+ DataFinal = ts_date(end_date)
12
+
13
+ - if destinatario.present? && destinatario.cpf_cnpj.present?
14
+ Tomador
15
+ = render_xml '_tc_identificacao_tomador', destinatario: destinatario
16
+
17
+ - if intermediario.present? && intermediario.cpf_cnpj.present?
18
+ IntermediarioServico
19
+ = render_xml '_tc_identificacao_intermediario_servico', intermediario: intermediario
@@ -0,0 +1,5 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}ConsultarNfseRpsEnvio"} *message_namespaces
2
+ IdentificacaoRps
3
+ = render_xml '_tc_identificacao_rps'
4
+ Prestador
5
+ = render_xml '_tc_identificacao_prestador'
@@ -0,0 +1,4 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}ConsultarSituacaoLoteRpsEnvio"} *message_namespaces
2
+ Prestador
3
+ = render_xml '_tc_identificacao_prestador'
4
+ Protocolo = ts_numero_protocolo(protocolo)
@@ -0,0 +1,9 @@
1
+ *{tag: "#{namespace_identifier.to_s+':' if namespace_identifier}EnviarLoteRpsEnvio"} *message_namespaces
2
+ - xml_lote_rps = render_xml('_tc_lote_rps')
3
+ / Alguns órgãos emissores não aceitam o atributo ID na tag (Como a betha)
4
+ - attributes_lote_rps = id_attribute? ? {id: "L#{numero_lote_rps}"} : {}
5
+ LoteRps *attributes_lote_rps
6
+ = xml_lote_rps.html_safe
7
+
8
+ - if certificate
9
+ = render_xml('signature_sh1', data_xml: xml_lote_rps.html_safe, uri: "#L#{numero_lote_rps}").html_safe
@@ -1,7 +1,7 @@
1
1
  module BrNfe
2
2
  module Version
3
- MAJOR = 1 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
4
- MINOR = 1 #inclui novas funcionalidades, sem quebrar APIs existentes
3
+ MAJOR = 2 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
4
+ MINOR = 0 #inclui novas funcionalidades, sem quebrar APIs existentes
5
5
  PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
6
6
  CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
@@ -0,0 +1,9 @@
1
+ SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"
2
+ CanonicalizationMethod Algorithm="#{canonicalization_method_algorithm}"
3
+ SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"
4
+ Reference URI="#{uri}"
5
+ Transforms
6
+ Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"
7
+ Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
8
+ DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"
9
+ DigestValue = remove_quebras Base64.encode64(OpenSSL::Digest::SHA1.digest(data_xml.html_safe))
@@ -0,0 +1,12 @@
1
+ / Alguns órgãos emissores não aceitam o atributo ID na tag (Como a betha)
2
+ - uri_value = id_attribute? ? uri : nil
3
+ Signature xmlns="http://www.w3.org/2000/09/xmldsig#"
4
+ - info_xml = render_xml('_signed_info_sh1', data_xml: data_xml, uri: uri_value)
5
+ = info_xml.html_safe
6
+
7
+ - signature_hash = certificate_key.sign(OpenSSL::Digest::SHA1.new, info_xml.html_safe)
8
+ SignatureValue = remove_quebras( Base64.encode64( signature_hash ) )
9
+
10
+ KeyInfo
11
+ X509Data
12
+ X509Certificate = certificate.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").gsub(/\n/,"")
@@ -0,0 +1,3 @@
1
+ *{tag: "#{env_namespace}:Envelope"} *soap_namespaces
2
+ *{tag: "#{env_namespace}:Body"}
3
+ = content_xml.html_safe
data/lib/br_nfe.rb CHANGED
@@ -10,6 +10,7 @@ require "br_nfe/helper/string_methods"
10
10
 
11
11
  require "signer"
12
12
  require "savon"
13
+ require "slim"
13
14
 
14
15
  require "br_nfe/helper/have_address"
15
16
  require "br_nfe/helper/have_rps"
@@ -17,8 +18,24 @@ require "br_nfe/helper/have_emitente"
17
18
  require "br_nfe/helper/have_destinatario"
18
19
  require "br_nfe/helper/have_intermediario"
19
20
  require "br_nfe/helper/have_condicao_pagamento"
21
+ require "br_nfe/helper/values_ts/service_v1"
20
22
 
23
+ # Regras e atributos para as classes
24
+ require "br_nfe/service/concerns/rules/recepcao_lote_rps"
25
+ require "br_nfe/service/concerns/rules/consulta_nfse"
26
+ require "br_nfe/service/concerns/rules/consulta_nfs_por_rps"
27
+ require "br_nfe/service/concerns/rules/cancelamento_nfs"
21
28
 
29
+ # Carrega os modules que contém os paths para buildar a resposta das requisições
30
+ require 'br_nfe/response/service/paths/base.rb'
31
+ require 'br_nfe/response/service/paths/v1/tc_nfse.rb'
32
+
33
+ require 'br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta.rb'
34
+ require 'br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta.rb'
35
+ require 'br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta.rb'
36
+ require 'br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta.rb'
37
+ require 'br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta.rb'
38
+ require 'br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta.rb'
22
39
 
23
40
  # Copyright (C) 2015 Bruno M. Mergen
24
41
  #
@@ -26,6 +43,10 @@ require "br_nfe/helper/have_condicao_pagamento"
26
43
  #
27
44
  #
28
45
  module BrNfe
46
+ def self.root
47
+ File.expand_path '../..', __FILE__
48
+ end
49
+
29
50
  Time::DATE_FORMATS[:br_nfe] = "%Y-%m-%dT%H:%M:%S"
30
51
  DateTime::DATE_FORMATS[:br_nfe] = "%Y-%m-%dT%H:%M:%S"
31
52
  Date::DATE_FORMATS[:br_nfe] = "%Y-%m-%d"
@@ -39,29 +60,37 @@ module BrNfe
39
60
  autoload :Endereco
40
61
  autoload :Emitente
41
62
  autoload :Destinatario
42
- autoload :Response
43
63
  autoload :Base
44
64
  autoload :CondicaoPagamento
45
65
 
46
- module Servico
66
+ module Response
67
+ module Service
68
+ extend ActiveSupport::Autoload
69
+ autoload :Default
70
+ autoload :NotaFiscal
71
+ autoload :BuildResponse
72
+ end
73
+ end
74
+
75
+ module Service
47
76
  extend ActiveSupport::Autoload
48
77
  autoload :Intermediario
78
+ autoload :Item
49
79
  autoload :Rps
50
80
  autoload :Base
51
81
 
52
- module Response
53
- extend ActiveSupport::Autoload
54
- autoload :Default
55
- autoload :NotaFiscal
56
- end
57
82
  module Betha
58
83
  extend ActiveSupport::Autoload
59
84
  autoload :Base
60
- autoload :BuildResponse
61
85
  module V1
86
+ module ResponsePaths
87
+ extend ActiveSupport::Autoload
88
+ autoload :ServicoConsultarLoteRpsResposta
89
+ autoload :ServicoConsultarNfseResposta
90
+ autoload :ServicoConsultarNfseRpsResposta
91
+ end
62
92
  extend ActiveSupport::Autoload
63
93
  autoload :Gateway
64
- autoload :BuildResponse
65
94
  autoload :ConsultaLoteRps
66
95
  autoload :ConsultaNfse
67
96
  autoload :ConsultaNfsPorRps
@@ -69,17 +98,37 @@ module BrNfe
69
98
  autoload :ConsultaSituacaoLoteRps
70
99
  autoload :RecepcaoLoteRps
71
100
  end
72
- module V2
101
+ end
102
+ module Thema
103
+ module V1
73
104
  extend ActiveSupport::Autoload
74
- autoload :Gateway
75
- autoload :BuildResponse
76
- autoload :CancelamentoNfs
77
- autoload :ConsultaNfsePorRps
78
- autoload :EnvioLoteRpsSincrono
79
- autoload :GeraNfse
80
- autoload :SubstituicaoNfse
105
+ autoload :Base
106
+ autoload :CancelaNfse
107
+ autoload :ConsultaSituacaoLoteRps
108
+ autoload :ConsultaNfsPorRps
109
+ autoload :RecepcaoLoteRps
110
+ autoload :RecepcaoLoteRpsLimitado
111
+ autoload :ConsultaNfse
81
112
  autoload :ConsultaLoteRps
113
+ end
114
+ end
115
+ module SC
116
+ module Florianopolis
117
+ extend ActiveSupport::Autoload
118
+ autoload :Base
119
+ autoload :EmissionRPS
120
+ autoload :Cancellation
121
+ end
122
+ module Gaspar
123
+ extend ActiveSupport::Autoload
124
+ autoload :Base
125
+ autoload :CancelaNfse
82
126
  autoload :RecepcaoLoteRps
127
+ autoload :ConsultaNfsPorRps
128
+ autoload :ConsultaSituacaoLoteRps
129
+ autoload :RecepcaoLoteRpsLimitado
130
+ autoload :ConsultaNfse
131
+ autoload :ConsultaLoteRps
83
132
  end
84
133
  end
85
134
  end
@@ -113,13 +162,16 @@ module BrNfe
113
162
  @@destinatario_class = BrNfe::Destinatario
114
163
 
115
164
  mattr_accessor :intermediario_class
116
- @@intermediario_class = BrNfe::Servico::Intermediario
165
+ @@intermediario_class = BrNfe::Service::Intermediario
117
166
 
118
167
  mattr_accessor :condicao_pagamento_class
119
168
  @@condicao_pagamento_class = BrNfe::CondicaoPagamento
120
169
 
121
170
  mattr_accessor :rps_class
122
- @@rps_class = BrNfe::Servico::Rps
171
+ @@rps_class = BrNfe::Service::Rps
172
+
173
+ mattr_accessor :service_item_class
174
+ @@service_item_class = BrNfe::Service::Item
123
175
 
124
176
  # Configurações do Cliente WSDL
125
177
  mattr_accessor :client_wsdl_ssl_verify_mode
@@ -142,5 +194,5 @@ module BrNfe
142
194
  ######################### END CONFIGURAÇÕES #########################
143
195
 
144
196
  include Helper
145
- include Servico
197
+ include Service
146
198
  end
@@ -3,19 +3,16 @@ require 'br_nfe/helper/have_emitente_test'
3
3
 
4
4
  describe BrNfe::Base do
5
5
  subject { FactoryGirl.build(:br_nfe_base, emitente: emitente) }
6
- let(:certificado) { Certificado.new }
7
6
  let(:emitente) { FactoryGirl.build(:emitente) }
8
7
 
9
- before do
10
- subject.stubs(:certificate_pkcs12).returns(certificado)
11
- end
12
-
13
8
  describe "validations" do
14
9
  context "obrigatoriedade do certificado" do
15
- before { subject.unstub(:certificate_pkcs12) }
16
10
  it "deve ser obrigatorio se certificado_obrigatorio? for true" do
17
11
  subject.stubs(:certificado_obrigatorio?).returns(true)
18
12
  subject.certificate_pkcs12 = nil
13
+ subject.certificate_pkcs12_value = nil
14
+ subject.certificate_pkcs12_password = nil
15
+
19
16
  must validate_presence_of(:certificate)
20
17
  must validate_presence_of(:certificate_key)
21
18
  end
@@ -57,26 +54,22 @@ describe BrNfe::Base do
57
54
  end
58
55
  end
59
56
 
60
- describe "#wsdl_encoding" do
61
- it { subject.wsdl_encoding.must_equal 'UTF-8' }
62
- end
63
-
64
- it "certificado_obrigatorio?" do
65
- subject.certificado_obrigatorio?.must_equal false
57
+ describe "#certificado_obrigatorio?" do
58
+ it "por padrão o certificado digital não deve ser obrigatório" do
59
+ subject.certificado_obrigatorio?.must_equal false
60
+ end
66
61
  end
67
62
 
68
- describe "#certificate_pkcs12_value" do
69
- it "se tiver algum valor setado deve retornar esse valor" do
70
- subject.certificate_pkcs12_value = "algum valor"
71
- subject.certificate_pkcs12_value.must_equal "algum valor"
63
+ describe "#original_response" do
64
+ it "deve retornar o valor da variavel @original_response" do
65
+ subject.instance_variable_set(:@original_response, 'valor')
66
+ subject.original_response.must_equal 'valor'
72
67
  end
73
- it "se não tiver um valor deve carregar o arquivo setado no atributo certificado_path" do
74
- subject.certificate_pkcs12_path = "algum/lugar.pfx"
75
- File.expects(:read).with("algum/lugar.pfx").returns("valor do arquivo")
76
- subject.certificate_pkcs12_value.must_equal "valor do arquivo"
68
+ it "valor default" do
69
+ subject.original_response.must_be_nil
77
70
  end
78
71
  end
79
-
72
+
80
73
  describe "#response" do
81
74
  it "deve retornar o valor da variavel @response" do
82
75
  subject.instance_variable_set(:@response, 'valor')
@@ -87,16 +80,12 @@ describe BrNfe::Base do
87
80
  end
88
81
  end
89
82
 
90
- describe "#original_response" do
91
- it "deve retornar o valor da variavel @original_response" do
92
- subject.instance_variable_set(:@original_response, 'valor')
93
- subject.original_response.must_equal 'valor'
94
- end
95
- it "valor default" do
96
- subject.original_response.must_be_nil
83
+ describe "#env_namespace" do
84
+ it "deve ser soapenv" do
85
+ subject.env_namespace.must_equal :soapenv
97
86
  end
98
87
  end
99
-
88
+
100
89
  describe "#wsdl" do
101
90
  it "deve dar um erro por default" do
102
91
  assert_raises RuntimeError do
@@ -105,12 +94,6 @@ describe BrNfe::Base do
105
94
  end
106
95
  end
107
96
 
108
- describe "#env_namespace" do
109
- it "deve ser soapenv" do
110
- subject.env_namespace.must_equal :soapenv
111
- end
112
- end
113
-
114
97
  describe "#method_wsdl" do
115
98
  it "deve dar um erro por default" do
116
99
  assert_raises RuntimeError do
@@ -127,17 +110,244 @@ describe BrNfe::Base do
127
110
  end
128
111
  end
129
112
 
113
+ describe "#content_xml" do
114
+ it "por padrão deve retornar o valor de xml_builder" do
115
+ subject.expects(:xml_builder).returns(:val_xml_builder)
116
+ subject.content_xml.must_equal :val_xml_builder
117
+ end
118
+ end
119
+
130
120
  describe "#namespace_identifier" do
131
- it "deve dar um erro por default" do
121
+ it "por padrão deve ser nil" do
122
+ subject.namespace_identifier.must_be_nil
123
+ end
124
+ end
125
+
126
+ describe "#message_namespaces" do
127
+ it "valor padrão deve ser um hash vazio" do
128
+ subject.message_namespaces.must_equal({})
129
+ end
130
+ end
131
+
132
+ describe "#soap_namespaces" do
133
+ it "valor padrão deve ser um hash com valores padrões da requisição SOAP" do
134
+ subject.soap_namespaces.must_equal({
135
+ 'xmlns:soapenv' => 'http://schemas.xmlsoap.org/soap/envelope/',
136
+ 'xmlns:ins0' => 'http://www.w3.org/2000/09/xmldsig#',
137
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
138
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
139
+ })
140
+ end
141
+ end
142
+
143
+ describe "#wsdl_encoding" do
144
+ it { subject.wsdl_encoding.must_equal 'UTF-8' }
145
+ end
146
+
147
+ describe "tag_xml" do
148
+ it "deve retornar a definição XML com o encoding de wsdl_encoding" do
149
+ subject.expects(:wsdl_encoding).returns('ENCODE')
150
+ subject.tag_xml.must_equal '<?xml version="1.0" encoding="ENCODE"?>'
151
+ end
152
+ end
153
+
154
+ describe "#soap_xml" do
155
+ it "deve concatenar a #tag_xml junto com a renderização para o template 'soap_env'" do
156
+ subject.expects(:tag_xml).returns('<?xml?>')
157
+ subject.expects(:render_xml).with('soap_env').returns('<SOAP>env</SOAP>')
158
+ subject.soap_xml.must_equal '<?xml?><SOAP>env</SOAP>'
159
+ subject.instance_variable_get(:@soap_xml).must_equal '<?xml?><SOAP>env</SOAP>'
160
+ end
161
+ it "se já temm valor na variavel @soap_xml não deve gerar o xml novamnete" do
162
+ subject.instance_variable_set(:@soap_xml, 'xml')
163
+ subject.expects(:tag_xml).never
164
+ subject.expects(:render_xml).never
165
+ subject.soap_xml.must_equal 'xml'
166
+ end
167
+ end
168
+
169
+ describe "xml_version" do
170
+ it "por padrão deve retornar :v1" do
171
+ subject.xml_version.must_equal :v1
172
+ end
173
+ end
174
+
175
+ describe "#client_wsdl" do
176
+ it "deve instanciar um Savon.client com a configuração adequada" do
177
+ # Stub metodos para configuração do client WSDL
178
+ subject.expects(:wsdl).returns('wsdl')
179
+
180
+ subject.client_wsdl_ssl_verify_mode = 'client_wsdl_ssl_verify_mode'
181
+ subject.client_wsdl_ssl_cert_file = 'client_wsdl_ssl_cert_file'
182
+ subject.client_wsdl_ssl_cert_key_file = 'client_wsdl_ssl_cert_key_file'
183
+ subject.client_wsdl_ssl_cert_key_password = 'client_wsdl_ssl_cert_key_password'
184
+
185
+ # Ajusto a configuração da gem para testar
186
+ BrNfe.client_wsdl_log = 'client_wsdl_log'
187
+ BrNfe.client_wsdl_pretty_print_xml = 'client_wsdl_pretty_print_xml'
188
+
189
+ subject.instance_variable_get(:@client_wsdl).must_be_nil
190
+
191
+ Savon.expects(:client).with({
192
+ wsdl: 'wsdl',
193
+ log: 'client_wsdl_log',
194
+ pretty_print_xml: 'client_wsdl_pretty_print_xml',
195
+ ssl_verify_mode: 'client_wsdl_ssl_verify_mode',
196
+ ssl_cert_file: 'client_wsdl_ssl_cert_file',
197
+ ssl_cert_key_file: 'client_wsdl_ssl_cert_key_file',
198
+ ssl_cert_key_password: 'client_wsdl_ssl_cert_key_password'
199
+ }).returns('client wsdl')
200
+
201
+ subject.client_wsdl.must_equal 'client wsdl'
202
+ subject.instance_variable_get(:@client_wsdl).must_equal 'client wsdl'
203
+ end
204
+ it "se ja tiver valor na variavel @client_wsdl deve manter esse valor" do
205
+ Savon.expects(:client).never
206
+ subject.instance_variable_set(:@client_wsdl, :valor_client_wsdl)
207
+ subject.client_wsdl.must_equal :valor_client_wsdl
208
+ subject.instance_variable_get(:@client_wsdl).must_equal :valor_client_wsdl
209
+ end
210
+ end
211
+
212
+ describe '#client_wsdl_ssl_verify_mode' do
213
+ it "se eu setar um valor deve retornar esse valor" do
214
+ subject.client_wsdl_ssl_verify_mode = :value_client_wsdl_ssl_verify_mode
215
+ subject.client_wsdl_ssl_verify_mode.must_equal :value_client_wsdl_ssl_verify_mode
216
+ end
217
+ it "se não setar nenhum valor deve retornar o valor da configuração" do
218
+ subject.class.new.client_wsdl_ssl_verify_mode.must_equal BrNfe.client_wsdl_ssl_verify_mode
219
+ end
220
+ end
221
+
222
+ describe '#client_wsdl_ssl_cert_file' do
223
+ it "se eu setar um valor deve retornar esse valor" do
224
+ subject.client_wsdl_ssl_cert_file = :value_client_wsdl_ssl_cert_file
225
+ subject.client_wsdl_ssl_cert_file.must_equal :value_client_wsdl_ssl_cert_file
226
+ end
227
+ it "se não setar nenhum valor deve retornar o valor da configuração" do
228
+ subject.class.new.client_wsdl_ssl_cert_file.must_equal BrNfe.client_wsdl_ssl_cert_file
229
+ end
230
+ end
231
+
232
+ describe '#client_wsdl_ssl_cert_key_file' do
233
+ it "se eu setar um valor deve retornar esse valor" do
234
+ subject.client_wsdl_ssl_cert_key_file = :value_client_wsdl_ssl_cert_key_file
235
+ subject.client_wsdl_ssl_cert_key_file.must_equal :value_client_wsdl_ssl_cert_key_file
236
+ end
237
+ it "se não setar nenhum valor deve retornar o valor da configuração" do
238
+ subject.class.new.client_wsdl_ssl_cert_key_file.must_equal BrNfe.client_wsdl_ssl_cert_key_file
239
+ end
240
+ end
241
+
242
+ describe '#client_wsdl_ssl_cert_key_password' do
243
+ it "se eu setar um valor deve retornar esse valor" do
244
+ subject.client_wsdl_ssl_cert_key_password = :value_client_wsdl_ssl_cert_key_password
245
+ subject.client_wsdl_ssl_cert_key_password.must_equal :value_client_wsdl_ssl_cert_key_password
246
+ end
247
+ it "se não setar nenhum valor deve retornar o valor da configuração" do
248
+ subject.class.new.client_wsdl_ssl_cert_key_password.must_equal BrNfe.client_wsdl_ssl_cert_key_password
249
+ end
250
+ end
251
+
252
+ describe "#certificate_pkcs12_value" do
253
+ it "se tiver algum valor setado deve retornar esse valor" do
254
+ subject.certificate_pkcs12_value = "algum valor"
255
+ subject.certificate_pkcs12_value.must_equal "algum valor"
256
+ end
257
+ it "se não tiver um valor deve carregar o arquivo setado no atributo certificado_path" do
258
+ subject.certificate_pkcs12_path = "algum/lugar.pfx"
259
+ File.expects(:read).with("algum/lugar.pfx").returns("valor do arquivo")
260
+ subject.certificate_pkcs12_value.must_equal "valor do arquivo"
261
+ end
262
+ end
263
+
264
+ describe "#certificate_pkcs12" do
265
+ it "deve ler o certificate_pkcs12 PKCS12 do atributo certificate_pkcs12_value e com a senha do certificate_pkcs12_password" do
266
+ subject.assign_attributes(certificate_pkcs12: nil, certificate_pkcs12_value: "CERTIFICADO", certificate_pkcs12_password: 'pWd123')
267
+ OpenSSL::PKCS12.expects(:new).with("CERTIFICADO", 'pWd123').returns('certificate_pkcs12')
268
+ subject.certificate_pkcs12.must_equal 'certificate_pkcs12'
269
+ end
270
+ it "se já tem um certificate_pkcs12 na variavel @certificate_pkcs12 não deve ler novamente do PKCS12" do
271
+ base_nfe = FactoryGirl.build(:br_nfe_base, emitente: emitente, certificate_pkcs12_password: nil, certificate_pkcs12_path: nil)
272
+ base_nfe.instance_variable_set(:@certificate_pkcs12, subject.certificate_pkcs12)
273
+
274
+ subject.certificate_pkcs12.wont_be_nil
275
+
276
+ OpenSSL::PKCS12.expects(:new).never
277
+ base_nfe.certificate_pkcs12.must_equal subject.certificate_pkcs12
278
+ end
279
+ it "posso setar o certificate_pkcs12" do
280
+ subject.certificate_pkcs12 = 'certificate_pkcs12 123'
281
+ subject.certificate_pkcs12.must_equal 'certificate_pkcs12 123'
282
+ end
283
+ end
284
+
285
+ describe '#render_xml' do
286
+ it "quando não encontrar um arquivo para renderizar deve dar erro" do
132
287
  assert_raises RuntimeError do
133
- subject.namespace_identifier
288
+ subject.render_xml 'nao_existe_esse_xml'
134
289
  end
135
290
  end
291
+ it "deve percorer todos os diretorios em sequencia até encontrar o XML" do
292
+ subject.expects(:get_xml_dirs).returns(['dir/1','dir/2','dir/3'])
293
+ subject.expects(:find_xml).with('file_name', 'dir/1', subject, {param: 1}).returns(nil).in_sequence(sequence_1)
294
+ subject.expects(:find_xml).with('file_name', 'dir/2', subject, {param: 1}).returns('result').in_sequence(sequence_1)
295
+ subject.expects(:find_xml).with('file_name', 'dir/3', subject, {param: 1}).never
296
+
297
+ subject.render_xml('file_name', {param: 1 }).must_equal 'result'
298
+ end
299
+
300
+ it "se não passar um context deve passar o context como parametro para o find_xml" do
301
+ subject.expects(:get_xml_dirs).returns(['dir/1'])
302
+ subject.expects(:find_xml).with('file_name', 'dir/1', :context, {}).returns('xml')
303
+ subject.render_xml('file_name', {context: :context}).must_equal 'xml'
304
+ end
305
+
306
+ it "posso passar um diretório customizado por parâmetro" do
307
+ subject.expects(:get_xml_dirs).with('custom/dir').returns(['custom/dir','dir/1'])
308
+ subject.expects(:find_xml).with('file_name', 'custom/dir', subject, {}).returns('xmlok')
309
+ subject.render_xml('file_name', {dir_path: 'custom/dir'}).must_equal 'xmlok'
310
+ end
311
+ it "posso passar variaveis por parâmetro na renderização do XML" do
312
+ subject.expects(:get_xml_dirs).with('custom/dir').returns(['custom/dir','dir/1'])
313
+ subject.expects(:find_xml).with('file_name', 'custom/dir', subject, {var1: 1, var2: 2}).returns(nil).in_sequence(sequence_1)
314
+ subject.expects(:find_xml).with('file_name', 'dir/1', subject, {var1: 1, var2: 2}).returns('xmlok').in_sequence(sequence_1)
315
+ subject.render_xml('file_name', {dir_path: 'custom/dir', var1: 1, var2: 2}).must_equal 'xmlok'
316
+ end
317
+ end
318
+
319
+ describe "#find_xml" do
320
+ it "se encontrar o arquivo no diretório passado por parâmetro deve renderizar o XML utilizando o Slim::Template" do
321
+ a_object = Object.new
322
+ File.expects(:exists?).with("file/dir/custom_file_name.xml.slim").returns(true).in_sequence(sequence_1)
323
+ Slim::Template.expects(:new).with("file/dir/custom_file_name.xml.slim").returns(a_object).in_sequence(sequence_1)
324
+ a_object.expects(:render).with(:context, :options).returns("<xml>val</xml>").in_sequence(sequence_1)
325
+ subject.find_xml('custom_file_name', 'file/dir', :context, :options).must_equal '<xml>val</xml>'
326
+ end
327
+ it "se não encontrar o arquivo no diretório passado por parâmetro deve retornar nil" do
328
+ File.expects(:exists?).with("file/dir/custom_file_name.xml.slim").returns(false)
329
+ Slim::Template.expects(:new).never
330
+ subject.find_xml('custom_file_name', 'file/dir', :context).must_be_nil
331
+ end
332
+ end
333
+
334
+ describe "#get_xml_dirs" do
335
+ it "deve retornar um array com o diretrio vindo por parametro junto com xml_current_dir_path e xml_default_dir_path" do
336
+ subject.expects(:xml_current_dir_path).returns(['dir1/current','dir2/current',''])
337
+ subject.expects(:xml_default_dir_path).returns('dir/default')
338
+ subject.get_xml_dirs('custom').must_equal(['custom','dir1/current','dir2/current','dir/default'])
339
+ end
136
340
  end
137
341
 
138
- describe "#namespaces" do
139
- it "valor padrão" do
140
- subject.namespaces.must_equal({})
342
+ describe '#xml_current_dir_path' do
343
+ it "valor padrão deve ser um array vazio" do
344
+ subject.xml_current_dir_path.must_equal([])
345
+ end
346
+ end
347
+
348
+ describe '#xml_default_dir_path' do
349
+ it "valor padrão deve ser o caminho do XMl padrão da gem" do
350
+ subject.xml_default_dir_path.must_equal("#{BrNfe.root}/lib/br_nfe/xml")
141
351
  end
142
352
  end
143
353
 
@@ -177,9 +387,9 @@ describe BrNfe::Base do
177
387
  subject.send(:canonicalize, xml).must_equal "<TagRaiz><TagFilho>Texo Tag \n\t\n\t Filho</TagFilho></TagRaiz>"
178
388
  end
179
389
  it "deve cannonicalizar um Document xml Nokogiri" do
180
- xml = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
181
- xml.TagRaiz{
182
- xml.TagFilho "Texo Tag \n\t\n\t Filho"
390
+ xml = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |x|
391
+ x.TagRaiz{
392
+ x.TagFilho "Texo Tag \n\t\n\t Filho"
183
393
  }
184
394
  end.doc
185
395
  subject.send(:canonicalize, xml).must_equal "<TagRaiz><TagFilho>Texo Tag \n\t\n\t Filho</TagFilho></TagRaiz>"
@@ -249,8 +459,6 @@ describe BrNfe::Base do
249
459
  end
250
460
 
251
461
  it "deve gerar o xml" do
252
- certificado.stubs(:certificate).returns("-----BEGIN CERTIFICATE-----\nMCYwHAIBADAASDIHASDIASHDIAMAMGAQADAQAwAwYBAAMBAA==\n-----END CERTIFICATE-----\n")
253
-
254
462
  subject.stubs(:signed_info).with(xml, 'URI123').returns(xml_signed_info)
255
463
  subject.expects(:xml_signature_value).with('<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><Value>STUBADO</Value></Signature>').returns("KEYFORINFOSIGNED")
256
464
 
@@ -260,73 +468,14 @@ describe BrNfe::Base do
260
468
  assinatura.remove_namespaces!
261
469
  assinatura.xpath('Signature/Signature/Value').first.text.must_equal 'STUBADO'
262
470
  assinatura.xpath('Signature/SignatureValue').first.text.must_equal 'KEYFORINFOSIGNED'
263
- assinatura.xpath('Signature/KeyInfo/X509Data/X509Certificate').first.text.must_equal 'MCYwHAIBADAASDIHASDIASHDIAMAMGAQADAQAwAwYBAAMBAA=='
471
+ assinatura.xpath('Signature/KeyInfo/X509Data/X509Certificate').first.text.must_equal 'MIIEqzCCA5OgAwIBAgIDMTg4MA0GCSqGSIb3DQEBBQUAMIGSMQswCQYDVQQGEwJCUjELMAkGA1UECBMCUlMxFTATBgNVBAcTDFBvcnRvIEFsZWdyZTEdMBsGA1UEChMUVGVzdGUgUHJvamV0byBORmUgUlMxHTAbBgNVBAsTFFRlc3RlIFByb2pldG8gTkZlIFJTMSEwHwYDVQQDExhORmUgLSBBQyBJbnRlcm1lZGlhcmlhIDEwHhcNMDkwNTIyMTcwNzAzWhcNMTAxMDAyMTcwNzAzWjCBnjELMAkGA1UECBMCUlMxHTAbBgNVBAsTFFRlc3RlIFByb2pldG8gTkZlIFJTMR0wGwYDVQQKExRUZXN0ZSBQcm9qZXRvIE5GZSBSUzEVMBMGA1UEBxMMUE9SVE8gQUxFR1JFMQswCQYDVQQGEwJCUjEtMCsGA1UEAxMkTkZlIC0gQXNzb2NpYWNhbyBORi1lOjk5OTk5MDkwOTEwMjcwMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCx1O/e1Q+xh+wCoxa4pr/5aEFt2dEX9iBJyYu/2a78emtorZKbWeyK435SRTbHxHSjqe1sWtIhXBaFa2dHiukT1WJyoAcXwB1GtxjT2VVESQGtRiujMa+opus6dufJJl7RslAjqN/ZPxcBXaezt0nHvnUB/uB1K8WT9G7ES0V17wIDAQABo4IBfjCCAXowIgYDVR0jAQEABBgwFoAUPT5TqhNWAm+ZpcVsvB7malDBjEQwDwYDVR0TAQH/BAUwAwEBADAPBgNVHQ8BAf8EBQMDAOAAMAwGA1UdIAEBAAQCMAAwgawGA1UdEQEBAASBoTCBnqA4BgVgTAEDBKAvBC0yMjA4MTk3Nzk5OTk5OTk5OTk5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCgEgYFYEwBAwKgCQQHREZULU5GZaAZBgVgTAEDA6AQBA45OTk5OTA5MDkxMDI3MKAXBgVgTAEDB6AOBAwwMDAwMDAwMDAwMDCBGmRmdC1uZmVAcHJvY2VyZ3MucnMuZ292LmJyMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDBTBgNVHR8BAQAESTBHMEWgQ6BBhj9odHRwOi8vbmZlY2VydGlmaWNhZG8uc2VmYXoucnMuZ292LmJyL0xDUi9BQ0ludGVybWVkaWFyaWEzOC5jcmwwDQYJKoZIhvcNAQEFBQADggEBAJFytXuiS02eJO0iMQr/Hi+Ox7/vYiPewiDL7s5EwO8A9jKx9G2Baz0KEjcdaeZk9a2NzDEgX9zboPxhw0RkWahVCP2xvRFWswDIa2WRUT/LHTEuTeKCJ0iF/um/kYM8PmWxPsDWzvsCCRp146lc0lz9LGm5ruPVYPZ/7DAoimUk3bdCMW/rzkVYg7iitxHrhklxH7YWQHUwbcqPt7Jv0RJxclc1MhQlV2eM2MO1iIlk8Eti86dRrJVoicR1bwc6/YDqDp4PFONTi1ddewRu6elGS74AzCcNYRSVTINYiZLpBZO0uivrnTEnsFguVnNtWb9MAHGt3tkR0gAVs6S0fm8='
264
472
  end
265
473
  end
474
+ end
266
475
 
267
- describe "#certificate_pkcs12" do
268
- before do
269
- subject.unstub(:certificate_pkcs12)
270
- end
271
- it "deve ler o certificate_pkcs12 PKCS12 do atributo certificate_pkcs12_value e com a senha do certificate_pkcs12_password" do
272
- subject.assign_attributes(certificate_pkcs12: nil, certificate_pkcs12_value: "CERTIFICADO", certificate_pkcs12_password: 'pWd123')
273
- OpenSSL::PKCS12.expects(:new).with("CERTIFICADO", 'pWd123').returns('certificate_pkcs12')
274
- subject.certificate_pkcs12.must_equal 'certificate_pkcs12'
275
- end
276
- it "se já tem um certificate_pkcs12 na variavel @certificate_pkcs12 não deve ler novamente do PKCS12" do
277
- subject.instance_variable_set(:@certificate_pkcs12, certificado)
278
- OpenSSL::PKCS12.expects(:new).never
279
- subject.certificate_pkcs12.must_equal certificado
280
- end
281
- it "posso setar o certificate_pkcs12" do
282
- subject.certificate_pkcs12 = 'certificate_pkcs12 123'
283
- subject.certificate_pkcs12.must_equal 'certificate_pkcs12 123'
284
- end
285
- end
476
+
286
477
 
287
478
 
288
- describe "#client_wsdl" do
289
- before do
290
- # Stub metodos para configuração do client WSDL
291
- subject.stubs(:namespaces).returns('namespaces')
292
- subject.stubs(:env_namespace).returns('env_namespace')
293
- subject.stubs(:wsdl).returns('wsdl')
294
- subject.stubs(:wsdl_encoding).returns('client_encoding')
295
- subject.stubs(:namespace_identifier).returns('namespace_identifier')
296
- # Ajusto a configuração da gem para testar
297
- BrNfe.client_wsdl_log = 'client_wsdl_log'
298
- BrNfe.client_wsdl_pretty_print_xml = 'client_wsdl_pretty_print_xml'
299
- BrNfe.client_wsdl_ssl_verify_mode = 'client_wsdl_ssl_verify_mode'
300
- BrNfe.client_wsdl_ssl_cert_file = 'client_wsdl_ssl_cert_file'
301
- BrNfe.client_wsdl_ssl_cert_key_file = 'client_wsdl_ssl_cert_key_file'
302
- BrNfe.client_wsdl_ssl_cert_key_password = 'client_wsdl_ssl_cert_key_password'
303
- end
304
- it "deve instanciar um Savon.client com a configuração adequada" do
305
- subject.instance_variable_get(:@client_wsdl).must_be_nil
306
- Savon.expects(:client).with({
307
- namespaces: 'namespaces',
308
- env_namespace: 'env_namespace',
309
- wsdl: 'wsdl',
310
- namespace_identifier: 'namespace_identifier',
311
- log: 'client_wsdl_log',
312
- encoding: 'client_encoding',
313
- pretty_print_xml: 'client_wsdl_pretty_print_xml',
314
- ssl_verify_mode: 'client_wsdl_ssl_verify_mode',
315
- ssl_cert_file: 'client_wsdl_ssl_cert_file',
316
- ssl_cert_key_file: 'client_wsdl_ssl_cert_key_file',
317
- ssl_cert_key_password: 'client_wsdl_ssl_cert_key_password'
318
- }).returns('client wsdl')
319
-
320
- subject.client_wsdl.must_equal 'client wsdl'
321
- subject.instance_variable_get(:@client_wsdl).must_equal 'client wsdl'
322
- end
323
- it "se ja tiver valor na variavel @client_wsdl deve manter esse valor" do
324
- Savon.expects(:client).never
325
- subject.instance_variable_set(:@client_wsdl, :valor_client_wsdl)
326
- subject.client_wsdl.must_equal :valor_client_wsdl
327
- subject.instance_variable_get(:@client_wsdl).must_equal :valor_client_wsdl
328
- end
329
- end
330
- end
479
+
331
480
 
332
481
  end