br_nfe 2.1.0 → 2.1.1

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 +1 -0
  3. data/.travis.yml +0 -1
  4. data/Gemfile.lock +1 -1
  5. data/README.markdown +264 -106
  6. data/lib/br_nfe/{helper → association}/have_address.rb +1 -1
  7. data/lib/br_nfe/{helper → association}/have_condicao_pagamento.rb +1 -1
  8. data/lib/br_nfe/association/have_destinatario.rb +22 -0
  9. data/lib/br_nfe/association/have_emitente.rb +24 -0
  10. data/lib/br_nfe/base.rb +37 -27
  11. data/lib/br_nfe/condicao_pagamento.rb +2 -0
  12. data/lib/br_nfe/constants.rb +33 -0
  13. data/lib/br_nfe/endereco.rb +10 -0
  14. data/lib/br_nfe/helper/string_methods.rb +4 -0
  15. data/lib/br_nfe/{emitente.rb → person.rb} +11 -7
  16. data/lib/br_nfe/product/base.rb +82 -0
  17. data/lib/br_nfe/product/consulta_status_servico.rb +35 -0
  18. data/lib/br_nfe/product/emitente.rb +8 -0
  19. data/lib/br_nfe/product/gateway/base.rb +62 -0
  20. data/lib/br_nfe/product/gateway/web_service_svrs.rb +39 -0
  21. data/lib/br_nfe/product/value_nf.rb +9 -0
  22. data/lib/br_nfe/product/xml/soap_env.xml.slim +8 -0
  23. data/lib/br_nfe/product/xml/v3_10/XSD/consReciNFe_v3.10.xsd +9 -0
  24. data/lib/br_nfe/product/xml/v3_10/XSD/consSitNFe_v3.10.xsd +9 -0
  25. data/lib/br_nfe/product/xml/v3_10/XSD/consStatServ_v3.10.xsd +9 -0
  26. data/lib/br_nfe/product/xml/v3_10/XSD/enviNFe_v3.10.xsd +9 -0
  27. data/lib/br_nfe/product/xml/v3_10/XSD/inutNFe_v3.10.xsd +9 -0
  28. data/lib/br_nfe/product/xml/v3_10/XSD/leiauteConsSitNFe_v3.10.xsd +502 -0
  29. data/lib/br_nfe/product/xml/v3_10/XSD/leiauteConsStatServ_v3.10.xsd +98 -0
  30. data/lib/br_nfe/product/xml/v3_10/XSD/leiauteInutNFe_v3.10.xsd +193 -0
  31. data/lib/br_nfe/product/xml/v3_10/XSD/leiauteNFe_v3.10.xsd +6060 -0
  32. data/lib/br_nfe/product/xml/v3_10/XSD/nfe_v3.10.xsd +9 -0
  33. data/lib/br_nfe/product/xml/v3_10/XSD/procInutNFe_v3.10.xsd +9 -0
  34. data/lib/br_nfe/product/xml/v3_10/XSD/procNFe_v3.10.xsd +9 -0
  35. data/lib/br_nfe/product/xml/v3_10/XSD/retConsReciNFe_v3.10.xsd +9 -0
  36. data/lib/br_nfe/product/xml/v3_10/XSD/retConsSitNFe_v3.10.xsd +9 -0
  37. data/lib/br_nfe/product/xml/v3_10/XSD/retConsStatServ_v3.10.xsd +9 -0
  38. data/lib/br_nfe/product/xml/v3_10/XSD/retEnviNFe_v3.10.xsd +9 -0
  39. data/lib/br_nfe/product/xml/v3_10/XSD/retInutNFe_v3.10.xsd +9 -0
  40. data/lib/br_nfe/product/xml/v3_10/XSD/tiposBasico_v3.10.xsd +571 -0
  41. data/lib/br_nfe/product/xml/v3_10/XSD/xmldsig-core-schema_v1.01.xsd +98 -0
  42. data/lib/br_nfe/product/xml/v3_10/consulta_status_servico.xml.slim +4 -0
  43. data/lib/br_nfe/service/association/have_intermediario.rb +26 -0
  44. data/lib/br_nfe/service/association/have_rps.rb +36 -0
  45. data/lib/br_nfe/service/base.rb +24 -20
  46. data/lib/br_nfe/service/betha/v1/cancela_nfse.rb +43 -0
  47. data/lib/br_nfe/service/betha/v1/consulta_lote_rps.rb +20 -6
  48. data/lib/br_nfe/service/betha/v1/consulta_nfs_por_rps.rb +17 -6
  49. data/lib/br_nfe/service/betha/v1/consulta_nfse.rb +16 -5
  50. data/lib/br_nfe/service/betha/v1/consulta_situacao_lote_rps.rb +15 -6
  51. data/lib/br_nfe/service/betha/v1/gateway.rb +4 -0
  52. data/lib/br_nfe/service/betha/v1/recepcao_lote_rps.rb +13 -5
  53. data/lib/br_nfe/service/betha/v1/xml/_tc_identificacao_prestador.xml.slim +3 -0
  54. data/lib/br_nfe/service/betha/v1/xml/_tc_pedido_cancelamento.xml.slim +4 -0
  55. data/lib/br_nfe/service/concerns/rules/cancelamento_nfs.rb +8 -0
  56. data/lib/br_nfe/service/concerns/rules/consulta_nfs_por_rps.rb +1 -1
  57. data/lib/br_nfe/service/concerns/rules/consulta_nfse.rb +5 -2
  58. data/lib/br_nfe/service/concerns/values_ts/service_v1.rb +319 -0
  59. data/lib/br_nfe/service/destinatario.rb +7 -0
  60. data/lib/br_nfe/service/emitente.rb +8 -0
  61. data/lib/br_nfe/service/intermediario.rb +1 -12
  62. data/lib/br_nfe/service/item.rb +7 -7
  63. data/lib/br_nfe/service/response/build/base.rb +166 -0
  64. data/lib/br_nfe/service/response/build/cancelamento.rb +62 -0
  65. data/lib/br_nfe/service/response/build/consulta_lote_rps.rb +25 -0
  66. data/lib/br_nfe/service/response/build/consulta_nfs_por_rps.rb +25 -0
  67. data/lib/br_nfe/service/response/build/consulta_nfse.rb +24 -0
  68. data/lib/br_nfe/service/response/build/consulta_situacao_lote_rps.rb +56 -0
  69. data/lib/br_nfe/service/response/build/invoice_build.rb +359 -0
  70. data/lib/br_nfe/service/response/build/recepcao_lote_rps.rb +69 -0
  71. data/lib/br_nfe/service/response/cancelamento.rb +22 -0
  72. data/lib/br_nfe/service/response/consulta_lote_rps.rb +18 -0
  73. data/lib/br_nfe/service/response/consulta_nfs_por_rps.rb +10 -0
  74. data/lib/br_nfe/service/response/consulta_nfse.rb +10 -0
  75. data/lib/br_nfe/service/response/consulta_situacao_lote_rps.rb +74 -0
  76. data/lib/br_nfe/service/response/default.rb +93 -0
  77. data/lib/br_nfe/{response/service → service/response}/nota_fiscal.rb +19 -12
  78. data/lib/br_nfe/service/response/paths/v1/tc_nfse.rb +275 -0
  79. data/lib/br_nfe/service/response/recepcao_lote_rps.rb +35 -0
  80. data/lib/br_nfe/service/rps.rb +30 -27
  81. data/lib/br_nfe/service/sc/florianopolis/xml/_service_item.xml.slim +4 -4
  82. data/lib/br_nfe/service/sc/florianopolis/xml/inf_requisicao.xml.slim +4 -4
  83. data/lib/br_nfe/service/simpliss/v1/cancela_nfse.rb +16 -6
  84. data/lib/br_nfe/service/simpliss/v1/consulta_lote_rps.rb +20 -12
  85. data/lib/br_nfe/service/simpliss/v1/consulta_nfs_por_rps.rb +21 -6
  86. data/lib/br_nfe/service/simpliss/v1/consulta_nfse.rb +20 -6
  87. data/lib/br_nfe/service/simpliss/v1/consulta_situacao_lote_rps.rb +17 -6
  88. data/lib/br_nfe/service/simpliss/v1/recepcao_lote_rps.rb +16 -4
  89. data/lib/br_nfe/service/simpliss/v1/xml/_tc_item_servico.xml.slim +2 -2
  90. data/lib/br_nfe/service/thema/v1/cancela_nfse.rb +21 -19
  91. data/lib/br_nfe/service/thema/v1/consulta_lote_rps.rb +21 -19
  92. data/lib/br_nfe/service/thema/v1/consulta_nfs_por_rps.rb +25 -18
  93. data/lib/br_nfe/service/thema/v1/consulta_nfse.rb +20 -20
  94. data/lib/br_nfe/service/thema/v1/consulta_situacao_lote_rps.rb +14 -20
  95. data/lib/br_nfe/service/thema/v1/recepcao_lote_rps.rb +11 -16
  96. data/lib/br_nfe/service/thema/v1/recepcao_lote_rps_limitado.rb +8 -6
  97. data/lib/br_nfe/service/xml/v1/_tc_identificacao_nfse.xml.slim +1 -1
  98. data/lib/br_nfe/service/xml/v1/_tc_pedido_cancelamento.xml.slim +1 -1
  99. data/lib/br_nfe/service/xml/v1/_tc_valores.xml.slim +11 -11
  100. data/lib/br_nfe/version.rb +1 -1
  101. data/lib/br_nfe.rb +62 -62
  102. data/test/br_nfe/association/have_address_test.rb +64 -0
  103. data/test/br_nfe/association/have_condicao_pagamento_test.rb +75 -0
  104. data/test/br_nfe/association/have_destinatario_test.rb +76 -0
  105. data/test/br_nfe/association/have_emitente_test.rb +80 -0
  106. data/test/br_nfe/base_test.rb +96 -61
  107. data/test/br_nfe/endereco_test.rb +21 -0
  108. data/test/br_nfe/person_test.rb +55 -0
  109. data/test/br_nfe/product/base_test.rb +150 -0
  110. data/test/br_nfe/product/consulta_status_servico_test.rb +59 -0
  111. data/test/br_nfe/product/emitente_test.rb +29 -0
  112. data/test/br_nfe/product/gateway/base_test.rb +16 -0
  113. data/test/br_nfe/product/gateway/web_service_svrs_test.rb +36 -0
  114. data/test/br_nfe/service/association/have_intermediario_test.rb +80 -0
  115. data/test/br_nfe/service/association/have_rps_test.rb +62 -0
  116. data/test/br_nfe/service/base_test.rb +42 -42
  117. data/test/br_nfe/service/betha/v1/cancela_nfse_test.rb +90 -0
  118. data/test/br_nfe/service/betha/v1/consulta_lote_rps_test.rb +105 -5
  119. data/test/br_nfe/service/betha/v1/consulta_nfs_por_rps_test.rb +103 -5
  120. data/test/br_nfe/service/betha/v1/consulta_nfse_test.rb +114 -5
  121. data/test/br_nfe/service/betha/v1/consulta_situacao_lote_rps_test.rb +118 -5
  122. data/test/br_nfe/service/betha/v1/gateway_test.rb +1 -1
  123. data/test/br_nfe/service/betha/v1/recepcao_lote_rps_test.rb +51 -5
  124. data/test/br_nfe/service/concerns/rules/cancelamento_nfs_test.rb +2 -2
  125. data/test/br_nfe/service/concerns/rules/consulta_nfs_por_rps_test.rb +2 -7
  126. data/test/br_nfe/service/concerns/rules/consulta_nfse_test.rb +24 -3
  127. data/test/br_nfe/service/concerns/rules/recepcao_lote_rps_test.rb +1 -1
  128. data/test/br_nfe/{helper → service/concerns}/values_ts/service_v1_test.rb +2 -2
  129. data/test/br_nfe/{destinatario_test.rb → service/destinatario_test.rb} +3 -4
  130. data/test/br_nfe/service/emitente_test.rb +29 -0
  131. data/test/br_nfe/service/item_test.rb +14 -14
  132. data/test/br_nfe/service/response/build/base_test.rb +80 -0
  133. data/test/br_nfe/{response/service → service/response}/default_test.rb +1 -82
  134. data/test/br_nfe/service/response/nota_fiscal_test.rb +59 -0
  135. data/test/br_nfe/{response/service → service/response}/paths/v1/tc_nfse_test.rb +10 -10
  136. data/test/br_nfe/service/rps_test.rb +107 -138
  137. data/test/br_nfe/service/sc/florianopolis/emission_rps_test.rb +9 -9
  138. data/test/br_nfe/service/simpliss/v1/base_test.rb +1 -1
  139. data/test/br_nfe/service/simpliss/v1/cancela_nfse_test.rb +7 -10
  140. data/test/br_nfe/service/simpliss/v1/consulta_lote_rps_test.rb +11 -18
  141. data/test/br_nfe/service/simpliss/v1/consulta_nfs_por_rps_test.rb +11 -18
  142. data/test/br_nfe/service/simpliss/v1/consulta_nfse_test.rb +11 -18
  143. data/test/br_nfe/service/simpliss/v1/consulta_situacao_lote_rps_test.rb +7 -11
  144. data/test/br_nfe/service/simpliss/v1/recepcao_lote_rps_test.rb +3 -9
  145. data/test/br_nfe/service/thema/v1/base_test.rb +1 -1
  146. data/test/br_nfe/service/thema/v1/cancela_nfse_test.rb +7 -14
  147. data/test/br_nfe/service/thema/v1/consulta_lote_rps_test.rb +6 -17
  148. data/test/br_nfe/service/thema/v1/consulta_nfs_por_rps_test.rb +6 -13
  149. data/test/br_nfe/service/thema/v1/consulta_nfse_test.rb +11 -18
  150. data/test/br_nfe/service/thema/v1/consulta_situacao_lote_rps_test.rb +7 -11
  151. data/test/br_nfe/service/thema/v1/recepcao_lote_rps_limitado_test.rb +1 -5
  152. data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test.rb +3 -9
  153. data/test/factories/base.rb +0 -1
  154. data/test/factories/{emitente.rb → person.rb} +1 -1
  155. data/test/factories/product/base.rb +12 -0
  156. data/test/factories/product/consulta_status_servico.rb +12 -0
  157. data/test/factories/product/emitente.rb +15 -0
  158. data/test/factories/product/gateway/base.rb +5 -0
  159. data/test/factories/product/gateway/web_service_svrs.rb +5 -0
  160. data/test/factories/service/betha/v1/{cancelamento_nfs.rb → cancela_nfse.rb} +2 -1
  161. data/test/factories/service/betha/v1/consulta_lote_rps.rb +1 -1
  162. data/test/factories/service/betha/v1/consulta_nfs_por_rps.rb +1 -1
  163. data/test/factories/service/betha/v1/consulta_nfse.rb +1 -1
  164. data/test/factories/service/betha/v1/consulta_situacao_lote_rps.rb +1 -1
  165. data/test/factories/{destinatario.rb → service/destinatario.rb} +1 -1
  166. data/test/factories/service/emitente.rb +15 -0
  167. data/test/factories/service/item.rb +4 -4
  168. data/test/factories/service/response/build_response.rb +5 -0
  169. data/test/factories/service/response/default.rb +6 -0
  170. data/test/factories/{response/service → service/response}/nota_fiscal.rb +8 -8
  171. data/test/factories/service/rps.rb +11 -11
  172. data/test/factories/service/sc/florianopolis/base.rb +1 -1
  173. data/test/factories/service/sc/florianopolis/cancellation.rb +1 -1
  174. data/test/factories/service/sc/florianopolis/emission_rps.rb +1 -1
  175. data/test/factories/service/simpliss/v1/base.rb +1 -1
  176. data/test/factories/service/simpliss/v1/cancela_nfse.rb +1 -1
  177. data/test/factories/service/simpliss/v1/consulta_lote_rps.rb +1 -1
  178. data/test/factories/service/simpliss/v1/consulta_nfs_por_rps.rb +1 -1
  179. data/test/factories/service/simpliss/v1/consulta_nfse.rb +1 -1
  180. data/test/factories/service/simpliss/v1/consulta_situacao_lote_rps.rb +1 -1
  181. data/test/factories/service/simpliss/v1/recepcao_lote_rps.rb +1 -1
  182. data/test/factories/service/thema/v1/base.rb +1 -1
  183. data/test/factories/service/thema/v1/cancela_nfse.rb +1 -1
  184. data/test/factories/service/thema/v1/consulta_lote_rps.rb +1 -1
  185. data/test/factories/service/thema/v1/consulta_nfs_por_rps.rb +1 -1
  186. data/test/factories/service/thema/v1/consulta_nfse.rb +1 -1
  187. data/test/factories/service/thema/v1/consulta_situacao_lote_rps.rb +1 -1
  188. data/test/factories/service/thema/v1/recepcao_lote_rps.rb +1 -1
  189. data/test/fixtures/service/response/betha/v1/cancela_nfse/fault.xml +17 -0
  190. data/test/fixtures/service/response/betha/v1/cancela_nfse/success.xml +48 -0
  191. data/test/fixtures/service/response/betha/v1/consulta_lote_rps/fault.xml +18 -0
  192. data/test/fixtures/service/response/betha/v1/consulta_lote_rps/success.xml +108 -0
  193. data/test/fixtures/service/response/betha/v1/consulta_nfse/fault.xml +18 -0
  194. data/test/fixtures/service/response/betha/v1/consulta_nfse/nfs_empty.xml +12 -0
  195. data/test/fixtures/service/response/betha/v1/consulta_nfse/success.xml +115 -0
  196. data/test/fixtures/service/response/betha/v1/consulta_nfse_por_rps/fault.xml +18 -0
  197. data/test/fixtures/service/response/betha/v1/consulta_nfse_por_rps/success.xml +103 -0
  198. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/error.xml +13 -0
  199. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/fault.xml +17 -0
  200. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/success.xml +13 -0
  201. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unprocessed.xml +13 -0
  202. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unprocessed_by_code_error.xml +17 -0
  203. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unreceived.xml +13 -0
  204. data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unreceived_by_code_error.xml +17 -0
  205. data/test/fixtures/service/response/betha/v1/recepcao_lote_rps/error.xml +17 -0
  206. data/test/fixtures/service/response/betha/v1/recepcao_lote_rps/success.xml +14 -0
  207. metadata +160 -94
  208. data/lib/br_nfe/destinatario.rb +0 -26
  209. data/lib/br_nfe/helper/have_destinatario.rb +0 -18
  210. data/lib/br_nfe/helper/have_emitente.rb +0 -20
  211. data/lib/br_nfe/helper/have_intermediario.rb +0 -24
  212. data/lib/br_nfe/helper/have_rps.rb +0 -34
  213. data/lib/br_nfe/helper/values_ts/service_v1.rb +0 -317
  214. data/lib/br_nfe/response/service/build_response.rb +0 -463
  215. data/lib/br_nfe/response/service/default.rb +0 -185
  216. data/lib/br_nfe/response/service/paths/base.rb +0 -127
  217. data/lib/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta.rb +0 -22
  218. data/lib/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta.rb +0 -25
  219. data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta.rb +0 -25
  220. data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta.rb +0 -25
  221. data/lib/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta.rb +0 -31
  222. data/lib/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta.rb +0 -36
  223. data/lib/br_nfe/response/service/paths/v1/tc_nfse.rb +0 -271
  224. data/lib/br_nfe/service/betha/v1/cancelamento_nfs.rb +0 -36
  225. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta.rb +0 -23
  226. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta.rb +0 -21
  227. data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -21
  228. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_cancelar_nfse_resposta.rb +0 -22
  229. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_lote_rps_resposta.rb +0 -25
  230. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_nfse_resposta.rb +0 -25
  231. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -25
  232. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_situacao_lote_rps_resposta.rb +0 -31
  233. data/lib/br_nfe/service/simpliss/v1/response_paths/servico_enviar_lote_rps_resposta.rb +0 -36
  234. data/lib/br_nfe/service/thema/v1/response_paths/servico_cancelar_nfse_resposta.rb +0 -17
  235. data/lib/br_nfe/service/thema/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -19
  236. data/test/br_nfe/emitente_test.rb +0 -46
  237. data/test/br_nfe/helper/have_address_test.rb +0 -62
  238. data/test/br_nfe/helper/have_condicao_pagamento_test.rb +0 -71
  239. data/test/br_nfe/helper/have_destinatario_test.rb +0 -64
  240. data/test/br_nfe/helper/have_emitente_test.rb +0 -63
  241. data/test/br_nfe/helper/have_intermediario_test.rb +0 -77
  242. data/test/br_nfe/helper/have_rps_test.rb +0 -59
  243. data/test/br_nfe/response/service/build_response_test.rb +0 -205
  244. data/test/br_nfe/response/service/nota_fiscal_test.rb +0 -41
  245. data/test/br_nfe/response/service/paths/base_test.rb +0 -196
  246. data/test/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta_test.rb +0 -25
  247. data/test/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta_test.rb +0 -30
  248. data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta_test.rb +0 -30
  249. data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta_test.rb +0 -30
  250. data/test/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta_test.rb +0 -30
  251. data/test/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta_test.rb +0 -34
  252. data/test/br_nfe/service/betha/v1/cancelamento_nfs_test.rb +0 -54
  253. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta_test.rb +0 -16
  254. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta_test.rb +0 -16
  255. data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta_test.rb +0 -16
  256. data/test/factories/response/service/build_response.rb +0 -5
  257. data/test/factories/response/service/default.rb +0 -10
@@ -0,0 +1,319 @@
1
+ module BrNfe
2
+ module Service
3
+ module Concerns
4
+ module ValuesTs
5
+ module ServiceV1
6
+
7
+ # Número da Nota Fiscal de Serviço Eletrônica,
8
+ # formado pelo ano com 04 (quatro) dígitos e um
9
+ # número seqüencial com 11 posições – Formato
10
+ # AAAANNNNNNNNNNN.
11
+ #
12
+ def ts_numero_nfse value
13
+ BrNfe::Helper.only_number(value).max_size(15)
14
+ end
15
+
16
+ # Código de verificação do número da nota
17
+ #
18
+ def ts_codigo_verificacao value
19
+ "#{value}".max_size(9)
20
+ end
21
+
22
+ # Código de status do RPS
23
+ # 1 – Normal
24
+ # 2 – Cancelado
25
+ #
26
+ def ts_status_rps value
27
+ BrNfe::Helper.only_number(value).max_size(1)
28
+ end
29
+
30
+ # Código de status do NFS-e
31
+ # 1 – Normal
32
+ # 2 – Cancelado
33
+ #
34
+ def ts_status_nfse value
35
+ BrNfe::Helper.only_number(value).max_size(1)
36
+ end
37
+
38
+ # Código de natureza da operação
39
+ # 1 – Tributação no município
40
+ # 2 - Tributação fora do município
41
+ # 3 - Isenção
42
+ # 4 - Imune
43
+ # 5 –Exigibilidade suspensa por decisão judicial
44
+ # 6 – Exigibilidade suspensa por procedimento administrativo
45
+ #
46
+ def ts_natureza_operacao value
47
+ BrNfe::Helper.only_number(value).max_size(2)
48
+ end
49
+
50
+ # Código de identificação do regime especial de tributação
51
+ # 1 – Microempresa municipal
52
+ # 2 - Estimativa
53
+ # 3 – Sociedade de profissionais
54
+ # 4 – Cooperativa
55
+ #
56
+ def ts_regime_especial_tributacao value
57
+ BrNfe::Helper.only_number(value).max_size(2)
58
+ end
59
+
60
+ # Identificação de Sim/Não
61
+ # 1 - Sim
62
+ # 2 - Não
63
+ #
64
+ def ts_sim_nao value
65
+ BrNfe.true_values.include?(value) ? '1' : '2'
66
+ end
67
+
68
+ # Quantidade de RPS do Lote
69
+ #
70
+ def ts_quantidade_rps value
71
+ BrNfe::Helper.only_number(value).max_size(4)
72
+ end
73
+
74
+ # Número do RPS
75
+ #
76
+ def ts_numero_rps value
77
+ BrNfe::Helper.only_number(value).max_size(15)
78
+ end
79
+
80
+ # Número de série do RPS
81
+ #
82
+ def ts_serie_rps value
83
+ "#{value}".max_size(5)
84
+ end
85
+
86
+ # Código de tipo de RPS
87
+ # 1 - RPS
88
+ # 2 – Nota Fiscal Conjugada (Mista)
89
+ # 3 – Cupom
90
+ #
91
+ def ts_tipo_rps value
92
+ BrNfe::Helper.only_number(value).max_size(1)
93
+ end
94
+
95
+ # Informações adicionais ao documento.
96
+ #
97
+ def ts_outras_informacoes value
98
+ "#{value}".max_size(255).br_nfe_escape_html
99
+ end
100
+
101
+ # Valor monetário.
102
+ # Formato: 0.00 (ponto separando casa decimal)
103
+ # Ex: 1.234,56 = 1234.56
104
+ # 1.000,00 = 1000.00
105
+ # 1.000,00 = 1000
106
+ #
107
+ def ts_valor value
108
+ value.to_f.round(2) if value.present?
109
+ end
110
+
111
+ # Código de item da lista de serviço
112
+ # Se um serviço for por exemplo: 107 deve ser enviado no formato
113
+ # 1.07
114
+ #
115
+ def ts_item_lista_servico value
116
+ return if value.blank?
117
+ number_only = BrNfe::Helper.only_number(value).max_size(4).to_i.to_s
118
+ number_only.reverse.scan(/.{1,2}/).join('.').reverse
119
+ end
120
+
121
+ # Código CNAE
122
+ #
123
+ def ts_codigo_cnae value
124
+ BrNfe::Helper.only_number(value).max_size(7)
125
+ end
126
+
127
+ # Código de Tributação
128
+ #
129
+ def ts_codigo_tributacao value
130
+ "#{value}".max_size(20)
131
+ end
132
+
133
+ # Alíquota. Valor percentual.
134
+ # Formato: 0.0000
135
+ # Ex: 1% = 1.00
136
+ # 25,5% = 25.5
137
+ # 100% = 100.0000 ou 100
138
+ #
139
+ def ts_aliquota value
140
+ value_monetary(value, 4)
141
+ end
142
+
143
+ # Discriminação do conteúdo da NFS-e
144
+ #
145
+ def ts_discriminacao value
146
+ "#{value}".max_size(2_000).remove_accents.br_nfe_escape_html
147
+ end
148
+
149
+ # Código de identificação do município conforme tabela do IBGE
150
+ #
151
+ def ts_codigo_municipio_ibge value
152
+ BrNfe::Helper.only_number(value).max_size(7)
153
+ end
154
+
155
+ # Número de inscrição municipal
156
+ #
157
+ def ts_inscricao_municipal value
158
+ "#{value}".max_size(15)
159
+ end
160
+
161
+ # Razão Social do contribuinte
162
+ #
163
+ def ts_razao_social value
164
+ "#{value}".max_size(115)
165
+ end
166
+
167
+ # Nome fantasia
168
+ #
169
+ def ts_nome_fantasia value
170
+ "#{value}".max_size(60)
171
+ end
172
+
173
+ # Número CNPJ
174
+ #
175
+ def ts_cnpj value
176
+ "#{BrNfe::Helper::CpfCnpj.new(value).sem_formatacao}".max_size(14)
177
+ end
178
+
179
+ # Endereço / rua
180
+ #
181
+ def ts_endereco value
182
+ "#{value}".max_size(125)
183
+ end
184
+
185
+ # Número do endereço
186
+ #
187
+ def ts_numero_endereco value
188
+ "#{value}".max_size(10)
189
+ end
190
+
191
+ # Complemento de endereço
192
+ #
193
+ def ts_complemento_endereco value
194
+ "#{value}".max_size(60)
195
+ end
196
+
197
+ # Bairro
198
+ #
199
+ def ts_bairro value
200
+ "#{value}".max_size(60)
201
+ end
202
+
203
+ # Sigla da unidade federativa
204
+ #
205
+ def ts_uf value
206
+ "#{value}".max_size(2)
207
+ end
208
+
209
+ # Número do CEP
210
+ #
211
+ def ts_cep value
212
+ BrNfe::Helper.only_number(value).max_size(8).ljust(8, '0') if value.present?
213
+ end
214
+
215
+ # E-mail
216
+ #
217
+ def ts_email value
218
+ "#{value}".max_size(80)
219
+ end
220
+
221
+ # Telefone
222
+ #
223
+ def ts_telefone value
224
+ BrNfe::Helper.only_number(value).max_size(11)
225
+ end
226
+
227
+ # Número CPF
228
+ #
229
+ def ts_cpf value
230
+ "#{BrNfe::Helper::CpfCnpj.new(value).sem_formatacao}".max_size(11)
231
+ end
232
+
233
+ # Indicador de uso de CPF ou CNPJ
234
+ # 1 – CPF
235
+ # 2 – CNPJ
236
+ # 3 – Não Informado
237
+ #
238
+ def ts_indicacao_cpf_cnpj value
239
+ BrNfe::Helper.only_number(value).max_size(1)
240
+ end
241
+
242
+ # Código de Obra
243
+ #
244
+ def ts_codigo_obra value
245
+ "#{value}".max_size(15)
246
+ end
247
+
248
+ # Código ART
249
+ #
250
+ def ts_art value
251
+ "#{value}".max_size(15)
252
+ end
253
+
254
+ # Número do Lote de RPS
255
+ #
256
+ def ts_numero_lote value
257
+ BrNfe::Helper.only_number(value).max_size(15)
258
+ end
259
+
260
+ # Número do protocolo de recebimento do RPS
261
+ #
262
+ def ts_numero_protocolo value
263
+ "#{value}".max_size(50)
264
+ end
265
+
266
+ # Código de situação de lote de RPS
267
+ # 1 – Não Recebido
268
+ # 2 – Não Processado
269
+ # 3 – Processado com Erro
270
+ # 4 – Processado com Sucesso
271
+ #
272
+ def ts_situacao_lote_rps value
273
+ BrNfe::Helper.only_number(value).max_size(1)
274
+ end
275
+
276
+ # Código de mensagem de retorno de serviço.
277
+ #
278
+ def ts_codigo_mensagem_alerta value
279
+ "#{value}".max_size(4)
280
+ end
281
+
282
+ # Descrição da mensagem de retorno de serviço.
283
+ #
284
+ def ts_descricao_mensagem_alerta value
285
+ "#{value}".max_size(200)
286
+ end
287
+
288
+ # Código de cancelamento com base na tabela de Erros e alertas.
289
+ #
290
+ def ts_codigo_cancelamento_nfse value
291
+ "#{value}".max_size(4)
292
+ end
293
+
294
+ # Atributo de identificação da tag a ser assinada no documento XML
295
+ #
296
+ def ts_id_tag value
297
+ "#{value}".max_size(255)
298
+ end
299
+
300
+ # Atributo do formato Datetime
301
+ # Não está identificado na documentação porém é utilizado
302
+ # para identificar valores Datetime
303
+ #
304
+ def ts_datetime value
305
+ value_date_time(value)
306
+ end
307
+
308
+ # Atributo do formato Date
309
+ # Não está identificado na documentação porém é utilizado
310
+ # para identificar valores Date
311
+ #
312
+ def ts_date value
313
+ value_date(value)
314
+ end
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end
@@ -0,0 +1,7 @@
1
+ module BrNfe
2
+ module Service
3
+ class Destinatario < BrNfe::Person
4
+ validate :validar_endereco
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module BrNfe
2
+ module Service
3
+ class Emitente < BrNfe::Person
4
+ validates :inscricao_municipal, :natureza_operacao, presence: true
5
+ validate :validar_endereco
6
+ end
7
+ end
8
+ end
@@ -1,17 +1,6 @@
1
1
  module BrNfe
2
2
  module Service
3
- class Intermediario < BrNfe::ActiveModelBase
4
-
5
- attr_accessor :cpf_cnpj
6
- attr_accessor :inscricao_municipal
7
- attr_accessor :razao_social
8
-
9
- validates :cpf_cnpj, :razao_social, presence: true
10
-
11
- def razao_social
12
- "#{@razao_social}".to_valid_format_nf
13
- end
14
-
3
+ class Intermediario < BrNfe::Person
15
4
  end
16
5
  end
17
6
  end
@@ -36,34 +36,34 @@ module BrNfe
36
36
  # Ex: se a aliquita for 7.5% então o valor setado no campo é 0.075
37
37
  #
38
38
  # <b>Tipo: </b> _Float_
39
- attr_accessor :iss_tax_rate
39
+ attr_accessor :iss_aliquota
40
40
 
41
41
  # Valor unitário do item
42
42
  # Refere-se ao valor separado de cada serviço prestado
43
43
  #
44
44
  # <b>Tipo: </b> _Float_
45
- attr_accessor :unit_value
45
+ attr_accessor :valor_unitario
46
46
 
47
47
  # Quantidade prestada de serviços do item
48
48
  #
49
49
  # <b>Tipo: </b> _Float_
50
- attr_accessor :quantity
50
+ attr_accessor :quantidade
51
51
 
52
52
  # Valor total cobrado do item
53
53
  #
54
54
  # <b>Tipo: </b> _Float_
55
- attr_accessor :total_value
55
+ attr_accessor :valor_total
56
56
 
57
57
 
58
58
  def default_values
59
59
  {
60
- quantity: 1.0,
60
+ quantidade: 1.0,
61
61
  }
62
62
  end
63
63
 
64
64
 
65
- def total_value
66
- @total_value || (quantity.to_f * unit_value.to_f)
65
+ def valor_total
66
+ @valor_total || (quantidade.to_f * valor_unitario.to_f)
67
67
  end
68
68
  end
69
69
  end
@@ -0,0 +1,166 @@
1
+ #encoding UTF-8
2
+ module BrNfe
3
+ module Service
4
+ module Response
5
+ module Build
6
+ class Base < BrNfe::ActiveModelBase
7
+ # 1: A resposta da requisição soap
8
+ attr_accessor :savon_response
9
+
10
+ # 2: Um array com o caminho inicial padrão da requisição de retorno
11
+ attr_accessor :keys_root_path
12
+
13
+ # 3: Alguns Webservices trazem dentro do body da resposta SOAp
14
+ # outro XML com as informações necessárias.
15
+ # Quando isso aocntece é preciso converter esse XML para um HASH
16
+ # para que possamos encontrar os valores necessários.
17
+ attr_accessor :body_xml_path
18
+
19
+ # 4: Codificação original do XML de resposta para que seja convertido
20
+ # para UTF-8
21
+ attr_accessor :xml_encode
22
+
23
+ ##############################################################################################################
24
+ ####################### CAMINHOS PARA ENCONTRAR OS VALORES NA RESPOSTA DA REQUISIÇÃO #####################
25
+ # Caminho para encontrar
26
+ attr_accessor :lot_number_path # o numero do lote
27
+ attr_accessor :message_errors_path # local para encontrar as mensagens de erro
28
+ attr_accessor :message_code_key # chave que representa o codigo do erro
29
+ attr_accessor :message_msg_key # chave que representa a mensagem do erro
30
+ attr_accessor :message_solution_key # chave que representa a solução do erro
31
+
32
+ def default_values
33
+ super.merge({
34
+ message_code_key: :codigo,
35
+ message_msg_key: :mensagem,
36
+ message_solution_key: :correcao,
37
+ })
38
+ end
39
+ ####################### FIM DA DEFINIÇÃO DOS CAMINHOS ############################
40
+ ######################################################################################
41
+
42
+ def response
43
+ raise "O método #response deve ser implementado na classe #{self.class}"
44
+ end
45
+
46
+ # Retorna o valor encontrado no body da resposta Savon
47
+ # em formato de hash
48
+ #
49
+ # <b>Tipo de retorno: </b> _Hash_
50
+ #
51
+ def savon_body
52
+ return @savon_body if @savon_body.present?
53
+ if body_xml_path.present?
54
+ @savon_body = Nori.new.parse(
55
+ body_converted_to_xml
56
+ ).deep_transform_keys!{|k| k.to_s.underscore.to_sym}
57
+ else
58
+ @savon_body = savon_response.try(:body) || {}
59
+ end
60
+ end
61
+
62
+ # Converte o body da requisição em XML (String)
63
+ # Isso é necessário quando dentro do body vem a resposta com outro XML
64
+ #
65
+ # <b>Tipo de retorno: </b> _String_
66
+ #
67
+ def body_converted_to_xml
68
+ @body_converted_to_xml ||= canonicalize("#{find_value_for_keys(savon_response.try(:body), body_xml_path)}".encode(xml_encode).force_encoding('UTF-8'))
69
+ end
70
+
71
+ # Método utilizado para encontrar valores em um Hash
72
+ # passando o caminho do valor em um array onde contém as chaves
73
+ # ordenadas.
74
+ # Recebe 2 parêmntros:
75
+ # 1º um o hash onde contém o valor a ser encontrado
76
+ # 2º um array com as chaves em sequencia formando o caminho para encontrar o valor.
77
+ #
78
+ # A funcionalidade desse método funciona parecido com o `.dig` da classe Hash do
79
+ # Ruby 2.3.0.
80
+ # A diferença é que no caso de exmeplo a seguir não apresenta uma excessão par ao usuário
81
+ # hash = {v1: {v2: 'valor string'}}
82
+ # hash.dig(:v1, :v2, :v3) <- Dá erro
83
+ # find_value_for_keys(hash, [:v1, :v2, :v3] <- Retorna nil e não da erro
84
+ #
85
+ # <b>Tipo de retorno: </b> _Anything_
86
+ #
87
+ def find_value_for_keys(hash, keys)
88
+ return if keys.blank?
89
+ keys = [keys] unless keys.is_a?(Array)
90
+
91
+ result = hash
92
+ keys.each do |key|
93
+ if result.is_a?(Hash)
94
+ result = result[key]
95
+ else
96
+ result = nil
97
+ break
98
+ end
99
+ end
100
+ result
101
+ end
102
+
103
+ # Quando para encontrar o valor de uma determinada chave
104
+ # é necessaŕio percorer o hash de retorno dês do inicio do mesmo.
105
+ # Como a mensagem tem uma chave 'root' padrão e pode ser diferente
106
+ # para cada orgaao emissor, é setado uma valor na variavel keys_root_path
107
+ # para que não seja necessário ficar setando a mesma chave em todos os
108
+ # métodos utilizados para encontrar determinado valor
109
+ #
110
+ # <b>Tipo de retorno: </b> _Array_
111
+ #
112
+ def path_with_root(path)
113
+ return if path.blank?
114
+ keys_root_path + [path].flatten
115
+ end
116
+
117
+ # Método que retorna as mensagens de retorno da requisição
118
+ # Quando procurar a mensagem a mesma pode retornar em 3 formatos:
119
+ # Hash: Onde encontrou apenas 1 mensagem com Codigo, Mensagem e Solução
120
+ # Array: Onde encontrou mais de uma mensagem com Codigo, Mensagem e Solução
121
+ # String: Onde encontrou uma unica mensagem de texto
122
+ #
123
+ # <b>Tipo de retorno: </b> _Array_
124
+ #
125
+ def get_message_for_path(msg_path)
126
+ messages = []
127
+ _messages = find_value_for_keys(savon_body, path_with_root(msg_path) )
128
+ if _messages.is_a?(Hash)
129
+ messages << get_message_for_hash(_messages)
130
+ elsif _messages.is_a?(Array)
131
+ _messages.map{|msg| messages << get_message_for_hash(msg) if msg.present? }
132
+ elsif _messages.present?
133
+ messages << _messages
134
+ end
135
+ messages.uniq
136
+ end
137
+
138
+ # Método utilizado para quando encontrar uam mensagem que seja um HAsh,
139
+ # onde nesse caso a mensagem terá um codigo de erro, uma mensagem, e uma
140
+ # mensagem de solução
141
+ #
142
+ # <b>Tipo de retorno: </b> _hash_
143
+ #
144
+ def get_message_for_hash(msg_hash)
145
+ {
146
+ code: find_value_for_keys(msg_hash, message_code_key),
147
+ message: find_value_for_keys(msg_hash, message_msg_key),
148
+ solution: find_value_for_keys(msg_hash, message_solution_key)
149
+ }
150
+ end
151
+
152
+
153
+ # Método utilizado para pegar o número do lote RPS
154
+ #
155
+ # <b>Tipo de retorno: </b> _String_
156
+ #
157
+ def get_lot_number
158
+ find_value_for_keys(savon_body, path_with_root(lot_number_path))
159
+ end
160
+
161
+
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,62 @@
1
+ #encoding UTF-8
2
+ module BrNfe
3
+ module Service
4
+ module Response
5
+ module Build
6
+ class Cancelamento < Base
7
+ ##############################################################################################################
8
+ ####################### CAMINHOS PARA ENCONTRAR OS VALORES NA RESPOSTA DA REQUISIÇÃO #####################
9
+ attr_accessor :codigo_cancelamento_path
10
+ def codigo_cancelamento_path
11
+ @codigo_cancelamento_path ||= []
12
+ end
13
+ attr_accessor :data_hora_cancelamento_path
14
+ def data_hora_cancelamento_path
15
+ @data_hora_cancelamento_path ||= []
16
+ end
17
+ attr_accessor :numero_nfs_path
18
+ def numero_nfs_path
19
+ @numero_nfs_path ||= []
20
+ end
21
+ ####################### FIM DA DEFINIÇÃO DOS CAMINHOS ############################
22
+ ######################################################################################
23
+
24
+ def response
25
+ @response ||= BrNfe::Service::Response::Cancelamento.new({
26
+ original_xml: savon_response.xml.force_encoding('UTF-8'),
27
+ error_messages: get_message_for_path(message_errors_path),
28
+ codigo_cancelamento: get_codigo_cancelamento,
29
+ data_hora_cancelamento: get_data_hora_cancelamento,
30
+ numero_nfs: get_numero_nfs,
31
+ })
32
+ end
33
+
34
+ # Método utilizado para pegar o valor da data e hora de cancelmaento
35
+ #
36
+ # <b>Tipo de retorno: </b> _DateTime_ OU _Nil_ OU _String_
37
+ #
38
+ def get_codigo_cancelamento
39
+ find_value_for_keys(savon_body, path_with_root(codigo_cancelamento_path)) if codigo_cancelamento_path.present?
40
+ end
41
+
42
+ # Método utilizado para pegar o código do cancelamento
43
+ #
44
+ # <b>Tipo de retorno: </b> _String_ OU _Integer_
45
+ #
46
+ def get_data_hora_cancelamento
47
+ find_value_for_keys(savon_body, path_with_root(data_hora_cancelamento_path)) if data_hora_cancelamento_path.present?
48
+ end
49
+
50
+ # Método utilizado para pegar o valor da data e hora de cancelmaento
51
+ # Só é utilizado para cancelar a NF-e
52
+ #
53
+ # <b>Tipo de retorno: </b> _DateTime_ OU _Nil_ OU _String_
54
+ #
55
+ def get_numero_nfs
56
+ find_value_for_keys(savon_body, path_with_root(numero_nfs_path)) if numero_nfs_path.present?
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,25 @@
1
+ #encoding UTF-8
2
+ module BrNfe
3
+ module Service
4
+ module Response
5
+ module Build
6
+ class ConsultaLoteRps < BrNfe::Service::Response::Build::InvoiceBuild
7
+ def default_values
8
+ super.merge({
9
+ message_errors_path: [:consultar_lote_rps_resposta, :lista_mensagem_retorno, :mensagem_retorno],
10
+ invoices_path: [:consultar_lote_rps_resposta, :lista_nfse, :comp_nfse],
11
+ })
12
+ end
13
+
14
+ def response
15
+ @response ||= BrNfe::Service::Response::ConsultaLoteRps.new({
16
+ original_xml: savon_response.xml.force_encoding('UTF-8'),
17
+ error_messages: get_message_for_path(message_errors_path),
18
+ notas_fiscais: get_invoices,
19
+ })
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ #encoding UTF-8
2
+ module BrNfe
3
+ module Service
4
+ module Response
5
+ module Build
6
+ class ConsultaNfsPorRps < BrNfe::Service::Response::Build::InvoiceBuild
7
+ def default_values
8
+ super.merge({
9
+ message_errors_path: [:consultar_nfse_rps_resposta, :lista_mensagem_retorno, :mensagem_retorno],
10
+ invoices_path: [:consultar_nfse_rps_resposta, :compl_nfse],
11
+ })
12
+ end
13
+
14
+ def response
15
+ @response ||= BrNfe::Service::Response::ConsultaNfsPorRps.new({
16
+ original_xml: savon_response.xml.force_encoding('UTF-8'),
17
+ error_messages: get_message_for_path(message_errors_path),
18
+ notas_fiscais: get_invoices,
19
+ })
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ #encoding UTF-8
2
+ module BrNfe
3
+ module Service
4
+ module Response
5
+ module Build
6
+ class ConsultaNfse < BrNfe::Service::Response::Build::InvoiceBuild
7
+ def default_values
8
+ super.merge({
9
+ message_errors_path: [:consultar_nfse_resposta, :lista_mensagem_retorno, :mensagem_retorno],
10
+ invoices_path: [:consultar_nfse_resposta, :lista_nfse, :compl_nfse]
11
+ })
12
+ end
13
+ def response
14
+ @response ||= BrNfe::Service::Response::ConsultaNfse.new({
15
+ original_xml: savon_response.xml.force_encoding('UTF-8'),
16
+ error_messages: get_message_for_path(message_errors_path),
17
+ notas_fiscais: get_invoices,
18
+ })
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end