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.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.travis.yml +8 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +27 -3
- data/LICENSE +1 -1
- data/README.markdown +10 -12
- data/Rakefile +13 -0
- data/br_nfe.gemspec +18 -21
- data/lib/br_nfe/active_model_base.rb +7 -1
- data/lib/br_nfe/base.rb +175 -37
- data/lib/br_nfe/endereco.rb +7 -1
- data/lib/br_nfe/helper/have_rps.rb +1 -1
- data/lib/br_nfe/helper/values_ts/service_v1.rb +313 -0
- data/lib/br_nfe/response/service/build_response.rb +286 -0
- data/lib/br_nfe/response/service/default.rb +185 -0
- data/lib/br_nfe/{servico/response → response/service}/nota_fiscal.rb +11 -10
- data/lib/br_nfe/response/service/paths/base.rb +93 -0
- data/lib/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta.rb +22 -0
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta.rb +25 -0
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta.rb +25 -0
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta.rb +25 -0
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta.rb +31 -0
- data/lib/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta.rb +36 -0
- data/lib/br_nfe/response/service/paths/v1/tc_nfse.rb +127 -0
- data/lib/br_nfe/service/base.rb +59 -0
- data/lib/br_nfe/service/betha/base.rb +8 -0
- data/lib/br_nfe/service/betha/v1/cancelamento_nfs.rb +39 -0
- data/lib/br_nfe/service/betha/v1/consulta_lote_rps.rb +34 -0
- data/lib/br_nfe/service/betha/v1/consulta_nfs_por_rps.rb +32 -0
- data/lib/br_nfe/service/betha/v1/consulta_nfse.rb +32 -0
- data/lib/br_nfe/service/betha/v1/consulta_situacao_lote_rps.rb +30 -0
- data/lib/br_nfe/service/betha/v1/gateway.rb +21 -0
- data/lib/br_nfe/service/betha/v1/recepcao_lote_rps.rb +37 -0
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta.rb +19 -0
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta.rb +17 -0
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +17 -0
- data/lib/br_nfe/service/concerns/rules/cancelamento_nfs.rb +20 -0
- data/lib/br_nfe/service/concerns/rules/consulta_nfs_por_rps.rb +18 -0
- data/lib/br_nfe/service/concerns/rules/consulta_nfse.rb +29 -0
- data/lib/br_nfe/service/concerns/rules/recepcao_lote_rps.rb +50 -0
- data/lib/br_nfe/{servico → service}/intermediario.rb +1 -1
- data/lib/br_nfe/service/item.rb +70 -0
- data/lib/br_nfe/service/rps.rb +231 -0
- data/lib/br_nfe/service/sc/florianopolis/base.rb +25 -0
- data/lib/br_nfe/service/sc/florianopolis/cancellation.rb +30 -0
- data/lib/br_nfe/service/sc/florianopolis/emission_rps.rb +19 -0
- data/lib/br_nfe/service/sc/florianopolis/xml/_address.xml.slim +21 -0
- data/lib/br_nfe/service/sc/florianopolis/xml/_contact.xml.slim +3 -0
- data/lib/br_nfe/service/sc/florianopolis/xml/_service_item.xml.slim +9 -0
- data/lib/br_nfe/service/sc/florianopolis/xml/cancellation.xml.slim +6 -0
- data/lib/br_nfe/service/sc/florianopolis/xml/inf_requisicao.xml.slim +55 -0
- data/lib/br_nfe/service/sc/gaspar/cancela_nfse.rb +13 -0
- data/lib/br_nfe/service/sc/gaspar/consulta_lote_rps.rb +13 -0
- data/lib/br_nfe/service/sc/gaspar/consulta_nfs_por_rps.rb +13 -0
- data/lib/br_nfe/service/sc/gaspar/consulta_nfse.rb +17 -0
- data/lib/br_nfe/service/sc/gaspar/consulta_situacao_lote_rps.rb +13 -0
- data/lib/br_nfe/service/sc/gaspar/recepcao_lote_rps.rb +13 -0
- data/lib/br_nfe/service/sc/gaspar/recepcao_lote_rps_limitado.rb +13 -0
- data/lib/br_nfe/service/thema/v1/base.rb +55 -0
- data/lib/br_nfe/service/thema/v1/cancela_nfse.rb +48 -0
- data/lib/br_nfe/service/thema/v1/consulta_lote_rps.rb +49 -0
- data/lib/br_nfe/service/thema/v1/consulta_nfs_por_rps.rb +48 -0
- data/lib/br_nfe/service/thema/v1/consulta_nfse.rb +47 -0
- data/lib/br_nfe/service/thema/v1/consulta_situacao_lote_rps.rb +46 -0
- data/lib/br_nfe/service/thema/v1/recepcao_lote_rps.rb +51 -0
- data/lib/br_nfe/service/thema/v1/recepcao_lote_rps_limitado.rb +30 -0
- data/lib/br_nfe/service/xml/v1/_tc_contato.xml.slim +7 -0
- data/lib/br_nfe/service/xml/v1/_tc_cpf_cnpj.xml.slim +5 -0
- data/lib/br_nfe/service/xml/v1/_tc_dados_construcao_civil.xml.slim +2 -0
- data/lib/br_nfe/service/xml/v1/_tc_dados_prestador.xml.slim +15 -0
- data/lib/br_nfe/service/xml/v1/_tc_dados_servico.xml.slim +14 -0
- data/lib/br_nfe/service/xml/v1/_tc_dados_tomador.xml.slim +15 -0
- data/lib/br_nfe/service/xml/v1/_tc_endereco.xml.slim +13 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_intermediario_servico.xml.slim +7 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_nfse.xml.slim +7 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_orgao_gerador.xml.slim +8 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_prestador.xml.slim +3 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_rps.xml.slim +16 -0
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_tomador.xml.slim +4 -0
- data/lib/br_nfe/service/xml/v1/_tc_inf_pedido_cancelamento.xml.slim +4 -0
- data/lib/br_nfe/service/xml/v1/_tc_inf_rps.xml.slim +47 -0
- data/lib/br_nfe/service/xml/v1/_tc_lote_rps.xml.slim +9 -0
- data/lib/br_nfe/service/xml/v1/_tc_pedido_cancelamento.xml.slim +4 -0
- data/lib/br_nfe/service/xml/v1/_tc_rps.xml.slim +8 -0
- data/lib/br_nfe/service/xml/v1/_tc_valores.xml.slim +48 -0
- data/lib/br_nfe/service/xml/v1/servico_cancelar_nfse_envio.xml.slim +9 -0
- data/lib/br_nfe/service/xml/v1/servico_consultar_lote_rps_envio.xml.slim +4 -0
- data/lib/br_nfe/service/xml/v1/servico_consultar_nfse_envio.xml.slim +19 -0
- data/lib/br_nfe/service/xml/v1/servico_consultar_nfse_rps_envio.xml.slim +5 -0
- data/lib/br_nfe/service/xml/v1/servico_consultar_situacao_lote_rps_envio.xml.slim +4 -0
- data/lib/br_nfe/service/xml/v1/servico_enviar_lote_rps_envio.xml.slim +9 -0
- data/lib/br_nfe/version.rb +2 -2
- data/lib/br_nfe/xml/_signed_info_sh1.xml.slim +9 -0
- data/lib/br_nfe/xml/signature_sh1.xml.slim +12 -0
- data/lib/br_nfe/xml/soap_env.xml.slim +3 -0
- data/lib/br_nfe.rb +72 -20
- data/test/br_nfe/base_test.rb +257 -108
- data/test/br_nfe/helper/have_intermediario_test.rb +2 -2
- data/test/br_nfe/helper/have_rps_test.rb +4 -4
- data/test/br_nfe/response/service/build_response_test.rb +377 -0
- data/test/br_nfe/response/service/default_test.rb +218 -0
- data/test/br_nfe/{servico/response → response/service}/nota_fiscal_test.rb +2 -2
- data/test/br_nfe/response/service/paths/base_test.rb +199 -0
- data/test/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta_test.rb +25 -0
- data/test/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta_test.rb +30 -0
- data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta_test.rb +30 -0
- data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta_test.rb +30 -0
- data/test/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta_test.rb +30 -0
- data/test/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta_test.rb +34 -0
- data/test/br_nfe/response/service/paths/v1/tc_nfse_test.rb +122 -0
- data/test/br_nfe/service/base_test.rb +138 -0
- data/test/br_nfe/service/betha/base_test.rb +9 -0
- data/test/br_nfe/service/betha/v1/cancelamento_nfs_test.rb +60 -0
- data/test/br_nfe/service/betha/v1/consulta_lote_rps_test.rb +55 -0
- data/test/br_nfe/service/betha/v1/consulta_nfs_por_rps_test.rb +55 -0
- data/test/br_nfe/service/betha/v1/consulta_nfse_test.rb +53 -0
- data/test/br_nfe/service/betha/v1/consulta_situacao_lote_rps_test.rb +49 -0
- data/test/br_nfe/service/betha/v1/gateway_test.rb +35 -0
- data/test/br_nfe/service/betha/v1/recepcao_lote_rps_test.rb +84 -0
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta_test.rb +16 -0
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta_test.rb +16 -0
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta_test.rb +16 -0
- data/test/br_nfe/service/betha/v1/xsd/TiposNFe_v01.xsd +583 -0
- data/test/br_nfe/service/betha/v1/xsd/nfse_v01.xsd +652 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_cancelar_nfse_envio_v01.xsd +17 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_consultar_lote_rps_envio_v01.xsd +16 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_consultar_nfse_envio_v01.xsd +28 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_consultar_nfse_rps_envio_v01.xsd +16 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_consultar_situacao_lote_rps_envio_v01.xsd +16 -0
- data/test/br_nfe/service/betha/v1/xsd/servico_enviar_lote_rps_envio_v01.xsd +17 -0
- data/test/br_nfe/service/betha/v1/xsd/xmldsig-core-schema.xsd +308 -0
- data/test/br_nfe/service/betha/v1/xsd/xmldsig-core-schema_v01.xsd +95 -0
- data/test/br_nfe/service/concerns/rules/cancelamento_nfs_test.rb +15 -0
- data/test/br_nfe/service/concerns/rules/consulta_nfs_por_rps_test.rb +36 -0
- data/test/br_nfe/service/concerns/rules/consulta_nfse_test.rb +42 -0
- data/test/br_nfe/{servico/base_test.rb → service/concerns/rules/recepcao_lote_rps_test.rb} +12 -4
- data/test/br_nfe/{servico → service}/intermediario_test.rb +1 -1
- data/test/br_nfe/service/item_test.rb +34 -0
- data/test/br_nfe/{servico → service}/rps_test.rb +191 -43
- data/test/br_nfe/service/sc/florianopolis/XSD/TiposNFSe_v2.0.xsd +863 -0
- data/test/br_nfe/service/sc/florianopolis/XSD/xmldsig-core-schema.xsd +309 -0
- data/test/br_nfe/service/sc/florianopolis/base_test.rb +20 -0
- data/test/br_nfe/service/sc/florianopolis/cancellation_test.rb +36 -0
- data/test/br_nfe/service/sc/florianopolis/emission_rps_test.rb +145 -0
- data/test/br_nfe/service/sc/gaspar/cancela_nfse_test.rb +21 -0
- data/test/br_nfe/service/sc/gaspar/consulta_nfs_por_rps_test.rb +21 -0
- data/test/br_nfe/service/sc/gaspar/consulta_nfse_test.rb +21 -0
- data/test/br_nfe/service/sc/gaspar/consulta_situacao_lote_rps_test.rb +21 -0
- data/test/br_nfe/service/sc/gaspar/recepcao_lote_rps_limitado_test.rb +22 -0
- data/test/br_nfe/service/sc/gaspar/recepcao_lote_rps_test.rb +22 -0
- data/test/br_nfe/service/thema/v1/base_test.rb +65 -0
- data/test/br_nfe/service/thema/v1/cancela_nfse_test.rb +56 -0
- data/test/br_nfe/service/thema/v1/consulta_lote_rps_test.rb +47 -0
- data/test/br_nfe/service/thema/v1/consulta_nfs_por_rps_test.rb +50 -0
- data/test/br_nfe/service/thema/v1/consulta_nfse_test.rb +50 -0
- data/test/br_nfe/service/thema/v1/consulta_situacao_lote_rps_test.rb +47 -0
- data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test.rb +62 -0
- data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test_limitado.rb +50 -0
- data/test/br_nfe/service/thema/v1/xsd/nfse.xsd +656 -0
- data/test/br_nfe/service/thema/v1/xsd/xmldsig-core-schema20020212.xsd +318 -0
- data/test/br_nfe/service/xsd/v1/nfse.xsd +779 -0
- data/test/br_nfe/service/xsd/v1/xmldsig-core-schema20020212.xsd +316 -0
- data/test/cert.pfx +0 -0
- data/test/factories/base.rb +2 -0
- data/test/factories/destinatario.rb +3 -3
- data/test/factories/response/service/build_response.rb +5 -0
- data/test/factories/response/service/default.rb +10 -0
- data/test/factories/{servico/response → response/service}/nota_fiscal.rb +9 -9
- data/test/factories/service/base.rb +6 -0
- data/test/factories/service/betha/base.rb +4 -0
- data/test/factories/service/betha/v1/cancelamento_nfs.rb +9 -0
- data/test/factories/{servico → service}/betha/v1/consulta_lote_rps.rb +2 -2
- data/test/factories/{servico → service}/betha/v1/consulta_nfs_por_rps.rb +1 -1
- data/test/factories/service/betha/v1/consulta_nfse.rb +8 -0
- data/test/factories/{servico → service}/betha/v1/consulta_situacao_lote_rps.rb +2 -2
- data/test/factories/{servico → service}/betha/v1/gateway.rb +1 -1
- data/test/factories/service/betha/v1/recepcao_lote_rps.rb +8 -0
- data/test/factories/{servico → service}/intermediario.rb +2 -2
- data/test/factories/service/item.rb +12 -0
- data/test/factories/service/rps.rb +50 -0
- data/test/factories/service/sc/florianopolis/base.rb +5 -0
- data/test/factories/service/sc/florianopolis/cancellation.rb +7 -0
- data/test/factories/service/sc/florianopolis/emission_rps.rb +7 -0
- data/test/factories/service/sc/gaspar/cancela_nfse.rb +9 -0
- data/test/factories/service/sc/gaspar/consulta_lote_rps.rb +7 -0
- data/test/factories/service/sc/gaspar/consulta_nfs_por_rps.rb +6 -0
- data/test/factories/service/sc/gaspar/consulta_nfse.rb +8 -0
- data/test/factories/service/sc/gaspar/consulta_situacao_lote_rps.rb +6 -0
- data/test/factories/service/sc/gaspar/recepcao_lote_rps.rb +9 -0
- data/test/factories/service/sc/gaspar/recepcao_lote_rps_limitado.rb +9 -0
- data/test/factories/service/thema/v1/base.rb +7 -0
- data/test/factories/service/thema/v1/cancela_nfse.rb +9 -0
- data/test/factories/service/thema/v1/consulta_lote_rps.rb +7 -0
- data/test/factories/service/thema/v1/consulta_nfs_por_rps.rb +6 -0
- data/test/factories/service/thema/v1/consulta_nfse.rb +8 -0
- data/test/factories/service/thema/v1/consulta_situacao_lote_rps.rb +6 -0
- data/test/factories/service/thema/v1/recepcao_lote_rps.rb +9 -0
- data/test/factories/service/thema/v1/recepcao_lote_rps_limitado.rb +8 -0
- data/test/test_helper.rb +42 -0
- metadata +338 -121
- data/lib/br_nfe/servico/base.rb +0 -35
- data/lib/br_nfe/servico/betha/base.rb +0 -85
- data/lib/br_nfe/servico/betha/build_response.rb +0 -141
- data/lib/br_nfe/servico/betha/v1/build_response.rb +0 -121
- data/lib/br_nfe/servico/betha/v1/cancelamento_nfs.rb +0 -52
- data/lib/br_nfe/servico/betha/v1/consulta_lote_rps.rb +0 -33
- data/lib/br_nfe/servico/betha/v1/consulta_nfs_por_rps.rb +0 -37
- data/lib/br_nfe/servico/betha/v1/consulta_nfse.rb +0 -51
- data/lib/br_nfe/servico/betha/v1/consulta_situacao_lote_rps.rb +0 -18
- data/lib/br_nfe/servico/betha/v1/gateway.rb +0 -125
- data/lib/br_nfe/servico/betha/v1/recepcao_lote_rps.rb +0 -97
- data/lib/br_nfe/servico/betha/v2/build_response.rb +0 -159
- data/lib/br_nfe/servico/betha/v2/cancelamento_nfs.rb +0 -30
- data/lib/br_nfe/servico/betha/v2/consulta_lote_rps.rb +0 -30
- data/lib/br_nfe/servico/betha/v2/consulta_nfse_por_rps.rb +0 -27
- data/lib/br_nfe/servico/betha/v2/envio_lote_rps_sincrono.rb +0 -30
- data/lib/br_nfe/servico/betha/v2/gateway.rb +0 -230
- data/lib/br_nfe/servico/betha/v2/gera_nfse.rb +0 -30
- data/lib/br_nfe/servico/betha/v2/recepcao_lote_rps.rb +0 -52
- data/lib/br_nfe/servico/betha/v2/substituicao_nfse.rb +0 -43
- data/lib/br_nfe/servico/response/default.rb +0 -34
- data/lib/br_nfe/servico/rps.rb +0 -108
- data/test/br_nfe/servico/betha/base_test.rb +0 -135
- data/test/br_nfe/servico/betha/v1/build_response_test.rb +0 -557
- data/test/br_nfe/servico/betha/v1/cancelamento_nfs_test.rb +0 -72
- data/test/br_nfe/servico/betha/v1/consulta_lote_rps_test.rb +0 -46
- data/test/br_nfe/servico/betha/v1/consulta_nfs_por_rps_test.rb +0 -68
- data/test/br_nfe/servico/betha/v1/consulta_nfse_test.rb +0 -74
- data/test/br_nfe/servico/betha/v1/consulta_situacao_lote_rps_test.rb +0 -27
- data/test/br_nfe/servico/betha/v1/gateway_test.rb +0 -151
- data/test/br_nfe/servico/betha/v1/recepcao_lote_rps_test.rb +0 -249
- data/test/br_nfe/servico/betha/v2/cancelamento_nfs_test.rb +0 -44
- data/test/br_nfe/servico/betha/v2/consulta_lote_rps_test.rb +0 -38
- data/test/br_nfe/servico/betha/v2/consulta_nfse_por_rps_test.rb +0 -36
- data/test/br_nfe/servico/betha/v2/envio_lote_rps_sincrono_test.rb +0 -51
- data/test/br_nfe/servico/betha/v2/gateway_test.rb +0 -372
- data/test/br_nfe/servico/betha/v2/gera_nfse_test.rb +0 -62
- data/test/br_nfe/servico/betha/v2/recepcao_lote_rps_test.rb +0 -108
- data/test/br_nfe/servico/betha/v2/substituicao_nfse_test.rb +0 -84
- data/test/br_nfe/servico/response/default_test.rb +0 -54
- data/test/factories/servico/base.rb +0 -5
- data/test/factories/servico/betha/base.rb +0 -5
- data/test/factories/servico/betha/v1/build_response.rb +0 -6
- data/test/factories/servico/betha/v1/cancelamento_nfs.rb +0 -7
- data/test/factories/servico/betha/v1/consulta_nfse.rb +0 -8
- data/test/factories/servico/betha/v1/recepcao_lote_rps.rb +0 -6
- data/test/factories/servico/betha/v2/cancelamento_nfs.rb +0 -7
- data/test/factories/servico/betha/v2/consulta_lote_rps.rb +0 -6
- data/test/factories/servico/betha/v2/consulta_nfse_por_rps.rb +0 -6
- data/test/factories/servico/betha/v2/envio_lote_rps_sincrono.rb +0 -5
- data/test/factories/servico/betha/v2/gateway.rb +0 -5
- data/test/factories/servico/betha/v2/gera_nfse.rb +0 -6
- data/test/factories/servico/betha/v2/recepcao_lote_rps.rb +0 -5
- data/test/factories/servico/betha/v2/substituicao_nfse.rb +0 -8
- data/test/factories/servico/response/default.rb +0 -10
- 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,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,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
|
data/lib/br_nfe/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module BrNfe
|
2
2
|
module Version
|
3
|
-
MAJOR =
|
4
|
-
MINOR =
|
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/,"")
|
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
|
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
|
-
|
101
|
+
end
|
102
|
+
module Thema
|
103
|
+
module V1
|
73
104
|
extend ActiveSupport::Autoload
|
74
|
-
autoload :
|
75
|
-
autoload :
|
76
|
-
autoload :
|
77
|
-
autoload :
|
78
|
-
autoload :
|
79
|
-
autoload :
|
80
|
-
autoload :
|
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::
|
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::
|
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
|
197
|
+
include Service
|
146
198
|
end
|
data/test/br_nfe/base_test.rb
CHANGED
@@ -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 "#
|
61
|
-
it
|
62
|
-
|
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 "#
|
69
|
-
it "
|
70
|
-
subject.
|
71
|
-
subject.
|
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 "
|
74
|
-
subject.
|
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 "#
|
91
|
-
it "deve
|
92
|
-
subject.
|
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 "
|
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.
|
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
|
139
|
-
it "valor padrão" do
|
140
|
-
subject.
|
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 |
|
181
|
-
|
182
|
-
|
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 '
|
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
|
-
|
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
|
-
|
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
|