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
@@ -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