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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +0 -1
- data/Gemfile.lock +1 -1
- data/README.markdown +264 -106
- data/lib/br_nfe/{helper → association}/have_address.rb +1 -1
- data/lib/br_nfe/{helper → association}/have_condicao_pagamento.rb +1 -1
- data/lib/br_nfe/association/have_destinatario.rb +22 -0
- data/lib/br_nfe/association/have_emitente.rb +24 -0
- data/lib/br_nfe/base.rb +37 -27
- data/lib/br_nfe/condicao_pagamento.rb +2 -0
- data/lib/br_nfe/constants.rb +33 -0
- data/lib/br_nfe/endereco.rb +10 -0
- data/lib/br_nfe/helper/string_methods.rb +4 -0
- data/lib/br_nfe/{emitente.rb → person.rb} +11 -7
- data/lib/br_nfe/product/base.rb +82 -0
- data/lib/br_nfe/product/consulta_status_servico.rb +35 -0
- data/lib/br_nfe/product/emitente.rb +8 -0
- data/lib/br_nfe/product/gateway/base.rb +62 -0
- data/lib/br_nfe/product/gateway/web_service_svrs.rb +39 -0
- data/lib/br_nfe/product/value_nf.rb +9 -0
- data/lib/br_nfe/product/xml/soap_env.xml.slim +8 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/consReciNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/consSitNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/consStatServ_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/enviNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/inutNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/leiauteConsSitNFe_v3.10.xsd +502 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/leiauteConsStatServ_v3.10.xsd +98 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/leiauteInutNFe_v3.10.xsd +193 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/leiauteNFe_v3.10.xsd +6060 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/nfe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/procInutNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/procNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/retConsReciNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/retConsSitNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/retConsStatServ_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/retEnviNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/retInutNFe_v3.10.xsd +9 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/tiposBasico_v3.10.xsd +571 -0
- data/lib/br_nfe/product/xml/v3_10/XSD/xmldsig-core-schema_v1.01.xsd +98 -0
- data/lib/br_nfe/product/xml/v3_10/consulta_status_servico.xml.slim +4 -0
- data/lib/br_nfe/service/association/have_intermediario.rb +26 -0
- data/lib/br_nfe/service/association/have_rps.rb +36 -0
- data/lib/br_nfe/service/base.rb +24 -20
- data/lib/br_nfe/service/betha/v1/cancela_nfse.rb +43 -0
- data/lib/br_nfe/service/betha/v1/consulta_lote_rps.rb +20 -6
- data/lib/br_nfe/service/betha/v1/consulta_nfs_por_rps.rb +17 -6
- data/lib/br_nfe/service/betha/v1/consulta_nfse.rb +16 -5
- data/lib/br_nfe/service/betha/v1/consulta_situacao_lote_rps.rb +15 -6
- data/lib/br_nfe/service/betha/v1/gateway.rb +4 -0
- data/lib/br_nfe/service/betha/v1/recepcao_lote_rps.rb +13 -5
- data/lib/br_nfe/service/betha/v1/xml/_tc_identificacao_prestador.xml.slim +3 -0
- data/lib/br_nfe/service/betha/v1/xml/_tc_pedido_cancelamento.xml.slim +4 -0
- data/lib/br_nfe/service/concerns/rules/cancelamento_nfs.rb +8 -0
- data/lib/br_nfe/service/concerns/rules/consulta_nfs_por_rps.rb +1 -1
- data/lib/br_nfe/service/concerns/rules/consulta_nfse.rb +5 -2
- data/lib/br_nfe/service/concerns/values_ts/service_v1.rb +319 -0
- data/lib/br_nfe/service/destinatario.rb +7 -0
- data/lib/br_nfe/service/emitente.rb +8 -0
- data/lib/br_nfe/service/intermediario.rb +1 -12
- data/lib/br_nfe/service/item.rb +7 -7
- data/lib/br_nfe/service/response/build/base.rb +166 -0
- data/lib/br_nfe/service/response/build/cancelamento.rb +62 -0
- data/lib/br_nfe/service/response/build/consulta_lote_rps.rb +25 -0
- data/lib/br_nfe/service/response/build/consulta_nfs_por_rps.rb +25 -0
- data/lib/br_nfe/service/response/build/consulta_nfse.rb +24 -0
- data/lib/br_nfe/service/response/build/consulta_situacao_lote_rps.rb +56 -0
- data/lib/br_nfe/service/response/build/invoice_build.rb +359 -0
- data/lib/br_nfe/service/response/build/recepcao_lote_rps.rb +69 -0
- data/lib/br_nfe/service/response/cancelamento.rb +22 -0
- data/lib/br_nfe/service/response/consulta_lote_rps.rb +18 -0
- data/lib/br_nfe/service/response/consulta_nfs_por_rps.rb +10 -0
- data/lib/br_nfe/service/response/consulta_nfse.rb +10 -0
- data/lib/br_nfe/service/response/consulta_situacao_lote_rps.rb +74 -0
- data/lib/br_nfe/service/response/default.rb +93 -0
- data/lib/br_nfe/{response/service → service/response}/nota_fiscal.rb +19 -12
- data/lib/br_nfe/service/response/paths/v1/tc_nfse.rb +275 -0
- data/lib/br_nfe/service/response/recepcao_lote_rps.rb +35 -0
- data/lib/br_nfe/service/rps.rb +30 -27
- data/lib/br_nfe/service/sc/florianopolis/xml/_service_item.xml.slim +4 -4
- data/lib/br_nfe/service/sc/florianopolis/xml/inf_requisicao.xml.slim +4 -4
- data/lib/br_nfe/service/simpliss/v1/cancela_nfse.rb +16 -6
- data/lib/br_nfe/service/simpliss/v1/consulta_lote_rps.rb +20 -12
- data/lib/br_nfe/service/simpliss/v1/consulta_nfs_por_rps.rb +21 -6
- data/lib/br_nfe/service/simpliss/v1/consulta_nfse.rb +20 -6
- data/lib/br_nfe/service/simpliss/v1/consulta_situacao_lote_rps.rb +17 -6
- data/lib/br_nfe/service/simpliss/v1/recepcao_lote_rps.rb +16 -4
- data/lib/br_nfe/service/simpliss/v1/xml/_tc_item_servico.xml.slim +2 -2
- data/lib/br_nfe/service/thema/v1/cancela_nfse.rb +21 -19
- data/lib/br_nfe/service/thema/v1/consulta_lote_rps.rb +21 -19
- data/lib/br_nfe/service/thema/v1/consulta_nfs_por_rps.rb +25 -18
- data/lib/br_nfe/service/thema/v1/consulta_nfse.rb +20 -20
- data/lib/br_nfe/service/thema/v1/consulta_situacao_lote_rps.rb +14 -20
- data/lib/br_nfe/service/thema/v1/recepcao_lote_rps.rb +11 -16
- data/lib/br_nfe/service/thema/v1/recepcao_lote_rps_limitado.rb +8 -6
- data/lib/br_nfe/service/xml/v1/_tc_identificacao_nfse.xml.slim +1 -1
- data/lib/br_nfe/service/xml/v1/_tc_pedido_cancelamento.xml.slim +1 -1
- data/lib/br_nfe/service/xml/v1/_tc_valores.xml.slim +11 -11
- data/lib/br_nfe/version.rb +1 -1
- data/lib/br_nfe.rb +62 -62
- data/test/br_nfe/association/have_address_test.rb +64 -0
- data/test/br_nfe/association/have_condicao_pagamento_test.rb +75 -0
- data/test/br_nfe/association/have_destinatario_test.rb +76 -0
- data/test/br_nfe/association/have_emitente_test.rb +80 -0
- data/test/br_nfe/base_test.rb +96 -61
- data/test/br_nfe/endereco_test.rb +21 -0
- data/test/br_nfe/person_test.rb +55 -0
- data/test/br_nfe/product/base_test.rb +150 -0
- data/test/br_nfe/product/consulta_status_servico_test.rb +59 -0
- data/test/br_nfe/product/emitente_test.rb +29 -0
- data/test/br_nfe/product/gateway/base_test.rb +16 -0
- data/test/br_nfe/product/gateway/web_service_svrs_test.rb +36 -0
- data/test/br_nfe/service/association/have_intermediario_test.rb +80 -0
- data/test/br_nfe/service/association/have_rps_test.rb +62 -0
- data/test/br_nfe/service/base_test.rb +42 -42
- data/test/br_nfe/service/betha/v1/cancela_nfse_test.rb +90 -0
- data/test/br_nfe/service/betha/v1/consulta_lote_rps_test.rb +105 -5
- data/test/br_nfe/service/betha/v1/consulta_nfs_por_rps_test.rb +103 -5
- data/test/br_nfe/service/betha/v1/consulta_nfse_test.rb +114 -5
- data/test/br_nfe/service/betha/v1/consulta_situacao_lote_rps_test.rb +118 -5
- data/test/br_nfe/service/betha/v1/gateway_test.rb +1 -1
- data/test/br_nfe/service/betha/v1/recepcao_lote_rps_test.rb +51 -5
- data/test/br_nfe/service/concerns/rules/cancelamento_nfs_test.rb +2 -2
- data/test/br_nfe/service/concerns/rules/consulta_nfs_por_rps_test.rb +2 -7
- data/test/br_nfe/service/concerns/rules/consulta_nfse_test.rb +24 -3
- data/test/br_nfe/service/concerns/rules/recepcao_lote_rps_test.rb +1 -1
- data/test/br_nfe/{helper → service/concerns}/values_ts/service_v1_test.rb +2 -2
- data/test/br_nfe/{destinatario_test.rb → service/destinatario_test.rb} +3 -4
- data/test/br_nfe/service/emitente_test.rb +29 -0
- data/test/br_nfe/service/item_test.rb +14 -14
- data/test/br_nfe/service/response/build/base_test.rb +80 -0
- data/test/br_nfe/{response/service → service/response}/default_test.rb +1 -82
- data/test/br_nfe/service/response/nota_fiscal_test.rb +59 -0
- data/test/br_nfe/{response/service → service/response}/paths/v1/tc_nfse_test.rb +10 -10
- data/test/br_nfe/service/rps_test.rb +107 -138
- data/test/br_nfe/service/sc/florianopolis/emission_rps_test.rb +9 -9
- data/test/br_nfe/service/simpliss/v1/base_test.rb +1 -1
- data/test/br_nfe/service/simpliss/v1/cancela_nfse_test.rb +7 -10
- data/test/br_nfe/service/simpliss/v1/consulta_lote_rps_test.rb +11 -18
- data/test/br_nfe/service/simpliss/v1/consulta_nfs_por_rps_test.rb +11 -18
- data/test/br_nfe/service/simpliss/v1/consulta_nfse_test.rb +11 -18
- data/test/br_nfe/service/simpliss/v1/consulta_situacao_lote_rps_test.rb +7 -11
- data/test/br_nfe/service/simpliss/v1/recepcao_lote_rps_test.rb +3 -9
- data/test/br_nfe/service/thema/v1/base_test.rb +1 -1
- data/test/br_nfe/service/thema/v1/cancela_nfse_test.rb +7 -14
- data/test/br_nfe/service/thema/v1/consulta_lote_rps_test.rb +6 -17
- data/test/br_nfe/service/thema/v1/consulta_nfs_por_rps_test.rb +6 -13
- data/test/br_nfe/service/thema/v1/consulta_nfse_test.rb +11 -18
- data/test/br_nfe/service/thema/v1/consulta_situacao_lote_rps_test.rb +7 -11
- data/test/br_nfe/service/thema/v1/recepcao_lote_rps_limitado_test.rb +1 -5
- data/test/br_nfe/service/thema/v1/recepcao_lote_rps_test.rb +3 -9
- data/test/factories/base.rb +0 -1
- data/test/factories/{emitente.rb → person.rb} +1 -1
- data/test/factories/product/base.rb +12 -0
- data/test/factories/product/consulta_status_servico.rb +12 -0
- data/test/factories/product/emitente.rb +15 -0
- data/test/factories/product/gateway/base.rb +5 -0
- data/test/factories/product/gateway/web_service_svrs.rb +5 -0
- data/test/factories/service/betha/v1/{cancelamento_nfs.rb → cancela_nfse.rb} +2 -1
- data/test/factories/service/betha/v1/consulta_lote_rps.rb +1 -1
- data/test/factories/service/betha/v1/consulta_nfs_por_rps.rb +1 -1
- data/test/factories/service/betha/v1/consulta_nfse.rb +1 -1
- data/test/factories/service/betha/v1/consulta_situacao_lote_rps.rb +1 -1
- data/test/factories/{destinatario.rb → service/destinatario.rb} +1 -1
- data/test/factories/service/emitente.rb +15 -0
- data/test/factories/service/item.rb +4 -4
- data/test/factories/service/response/build_response.rb +5 -0
- data/test/factories/service/response/default.rb +6 -0
- data/test/factories/{response/service → service/response}/nota_fiscal.rb +8 -8
- data/test/factories/service/rps.rb +11 -11
- data/test/factories/service/sc/florianopolis/base.rb +1 -1
- data/test/factories/service/sc/florianopolis/cancellation.rb +1 -1
- data/test/factories/service/sc/florianopolis/emission_rps.rb +1 -1
- data/test/factories/service/simpliss/v1/base.rb +1 -1
- data/test/factories/service/simpliss/v1/cancela_nfse.rb +1 -1
- data/test/factories/service/simpliss/v1/consulta_lote_rps.rb +1 -1
- data/test/factories/service/simpliss/v1/consulta_nfs_por_rps.rb +1 -1
- data/test/factories/service/simpliss/v1/consulta_nfse.rb +1 -1
- data/test/factories/service/simpliss/v1/consulta_situacao_lote_rps.rb +1 -1
- data/test/factories/service/simpliss/v1/recepcao_lote_rps.rb +1 -1
- data/test/factories/service/thema/v1/base.rb +1 -1
- data/test/factories/service/thema/v1/cancela_nfse.rb +1 -1
- data/test/factories/service/thema/v1/consulta_lote_rps.rb +1 -1
- data/test/factories/service/thema/v1/consulta_nfs_por_rps.rb +1 -1
- data/test/factories/service/thema/v1/consulta_nfse.rb +1 -1
- data/test/factories/service/thema/v1/consulta_situacao_lote_rps.rb +1 -1
- data/test/factories/service/thema/v1/recepcao_lote_rps.rb +1 -1
- data/test/fixtures/service/response/betha/v1/cancela_nfse/fault.xml +17 -0
- data/test/fixtures/service/response/betha/v1/cancela_nfse/success.xml +48 -0
- data/test/fixtures/service/response/betha/v1/consulta_lote_rps/fault.xml +18 -0
- data/test/fixtures/service/response/betha/v1/consulta_lote_rps/success.xml +108 -0
- data/test/fixtures/service/response/betha/v1/consulta_nfse/fault.xml +18 -0
- data/test/fixtures/service/response/betha/v1/consulta_nfse/nfs_empty.xml +12 -0
- data/test/fixtures/service/response/betha/v1/consulta_nfse/success.xml +115 -0
- data/test/fixtures/service/response/betha/v1/consulta_nfse_por_rps/fault.xml +18 -0
- data/test/fixtures/service/response/betha/v1/consulta_nfse_por_rps/success.xml +103 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/error.xml +13 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/fault.xml +17 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/success.xml +13 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unprocessed.xml +13 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unprocessed_by_code_error.xml +17 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unreceived.xml +13 -0
- data/test/fixtures/service/response/betha/v1/consulta_situacao_lote_rps/unreceived_by_code_error.xml +17 -0
- data/test/fixtures/service/response/betha/v1/recepcao_lote_rps/error.xml +17 -0
- data/test/fixtures/service/response/betha/v1/recepcao_lote_rps/success.xml +14 -0
- metadata +160 -94
- data/lib/br_nfe/destinatario.rb +0 -26
- data/lib/br_nfe/helper/have_destinatario.rb +0 -18
- data/lib/br_nfe/helper/have_emitente.rb +0 -20
- data/lib/br_nfe/helper/have_intermediario.rb +0 -24
- data/lib/br_nfe/helper/have_rps.rb +0 -34
- data/lib/br_nfe/helper/values_ts/service_v1.rb +0 -317
- data/lib/br_nfe/response/service/build_response.rb +0 -463
- data/lib/br_nfe/response/service/default.rb +0 -185
- data/lib/br_nfe/response/service/paths/base.rb +0 -127
- data/lib/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta.rb +0 -22
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta.rb +0 -25
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta.rb +0 -25
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta.rb +0 -25
- data/lib/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta.rb +0 -31
- data/lib/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta.rb +0 -36
- data/lib/br_nfe/response/service/paths/v1/tc_nfse.rb +0 -271
- data/lib/br_nfe/service/betha/v1/cancelamento_nfs.rb +0 -36
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta.rb +0 -23
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta.rb +0 -21
- data/lib/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -21
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_cancelar_nfse_resposta.rb +0 -22
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_lote_rps_resposta.rb +0 -25
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_nfse_resposta.rb +0 -25
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -25
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_consultar_situacao_lote_rps_resposta.rb +0 -31
- data/lib/br_nfe/service/simpliss/v1/response_paths/servico_enviar_lote_rps_resposta.rb +0 -36
- data/lib/br_nfe/service/thema/v1/response_paths/servico_cancelar_nfse_resposta.rb +0 -17
- data/lib/br_nfe/service/thema/v1/response_paths/servico_consultar_nfse_rps_resposta.rb +0 -19
- data/test/br_nfe/emitente_test.rb +0 -46
- data/test/br_nfe/helper/have_address_test.rb +0 -62
- data/test/br_nfe/helper/have_condicao_pagamento_test.rb +0 -71
- data/test/br_nfe/helper/have_destinatario_test.rb +0 -64
- data/test/br_nfe/helper/have_emitente_test.rb +0 -63
- data/test/br_nfe/helper/have_intermediario_test.rb +0 -77
- data/test/br_nfe/helper/have_rps_test.rb +0 -59
- data/test/br_nfe/response/service/build_response_test.rb +0 -205
- data/test/br_nfe/response/service/nota_fiscal_test.rb +0 -41
- data/test/br_nfe/response/service/paths/base_test.rb +0 -196
- data/test/br_nfe/response/service/paths/v1/servico_cancelar_nfse_resposta_test.rb +0 -25
- data/test/br_nfe/response/service/paths/v1/servico_consultar_lote_rps_resposta_test.rb +0 -30
- data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_resposta_test.rb +0 -30
- data/test/br_nfe/response/service/paths/v1/servico_consultar_nfse_rps_resposta_test.rb +0 -30
- data/test/br_nfe/response/service/paths/v1/servico_consultar_situacao_lote_rps_resposta_test.rb +0 -30
- data/test/br_nfe/response/service/paths/v1/servico_enviar_lote_rps_resposta_test.rb +0 -34
- data/test/br_nfe/service/betha/v1/cancelamento_nfs_test.rb +0 -54
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_lote_rps_resposta_test.rb +0 -16
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_resposta_test.rb +0 -16
- data/test/br_nfe/service/betha/v1/response_paths/servico_consultar_nfse_rps_resposta_test.rb +0 -16
- data/test/factories/response/service/build_response.rb +0 -5
- data/test/factories/response/service/default.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d1320a14fd1cfd5849a39a3a44a214c94aa8e0f
|
4
|
+
data.tar.gz: 25a0a4d8eea87e877f791e728ecc30b8cda3fe67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de121c683a16f145d1f05309e1b24071339033ef0e7e5b5ac0600206ec4d79aead4c884ef3b8e9329c674747489a8ec24e945d88fb3edeebf13ed129f89e7b0a
|
7
|
+
data.tar.gz: 2e48ba4c89749380ba4e63b74028b987581507c712983fad01550d74d610c109a4efbfaa1f99ba3305f6328ba197d4db25fd9111f16966b6789f59f1c0d03295
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.markdown
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
[![Build Status](https://travis-ci.org/Brunomm/br_nfe.svg?branch=master)](https://travis-ci.org/Brunomm/br_nfe)
|
2
|
-
[![Test Coverage](https://codeclimate.com/github/Brunomm/br_nfe/badges/coverage.svg)](https://codeclimate.com/github/Brunomm/br_nfe/coverage)
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/br_nfe.svg)](http://badge.fury.io/rb/br_nfe)
|
4
|
-
[![Code Climate](https://codeclimate.com/github/Brunomm/br_nfe/badges/gpa.svg)](https://codeclimate.com/github/Brunomm/br_nfe)
|
1
|
+
[![Build Status](https://travis-ci.org/Brunomm/br_nfe.svg?branch=master)](https://travis-ci.org/Brunomm/br_nfe) [![Test Coverage](https://codeclimate.com/github/Brunomm/br_nfe/badges/coverage.svg)](https://codeclimate.com/github/Brunomm/br_nfe/coverage) [![Gem Version](https://badge.fury.io/rb/br_nfe.svg)](http://badge.fury.io/rb/br_nfe) [![Code Climate](https://codeclimate.com/github/Brunomm/br_nfe/badges/gpa.svg)](https://codeclimate.com/github/Brunomm/br_nfe)
|
5
2
|
|
6
3
|
# **BrNfe**
|
7
4
|
Gem para emissão de notas fiscais eletrônicas.
|
8
5
|
|
9
|
-
**
|
6
|
+
**Motivação**
|
10
7
|
|
11
|
-
Devido a falta de padronização dos parâmetros e a forma de envio e resposta na transmissão de Notas Fiscais de Serviços (NFS), esta gem vem com o objetivo de obter uma forma padronizada dessa tarefa, e assim, facilitando a vida de muitos desenvolvedores.
|
8
|
+
Devido a falta de padronização dos parâmetros e a forma de envio e resposta na transmissão de Notas Fiscais de Serviços (NFS-e), esta gem vem com o objetivo de obter uma forma padronizada dessa tarefa, e assim, facilitando a vida de muitos desenvolvedores.
|
12
9
|
|
13
10
|
**O que essa gem faz?**
|
14
11
|
|
@@ -26,24 +23,186 @@ Devido a falta de padronização dos parâmetros e a forma de envio e resposta n
|
|
26
23
|
|
27
24
|
gem 'br_nfe'
|
28
25
|
|
29
|
-
|
26
|
+
#**Introdução**
|
27
|
+
Com o objetivo de padronizar os valores, foi criado algumas classes auxiliares para montar e organizar os dados para a emissão das notas fiscais, dentre eles estão:
|
30
28
|
|
31
|
-
|
32
|
-
|
29
|
+
> - `BrNfe::Endereco`
|
30
|
+
> -- Tem o objetivo de padronizar os dados de endereço para o emitente e destinatário.
|
33
31
|
|
34
|
-
####**
|
35
|
-
|
32
|
+
> ####**Específico para NFS-e**:
|
33
|
+
> - `BrNfe::Service::Emitente`
|
34
|
+
> -- Classe para instanciar o emitente da nota fiscal de **serviço (NFS-e)**.
|
35
|
+
> -- Contém as validações e regras para o mesmo.
|
36
|
+
> -- Contém uma "Associação" com `BrNfe::Endereco`
|
36
37
|
|
38
|
+
> - `BrNfe::Service::Destinatario`
|
39
|
+
> -- Classe para instanciar o destinatário da nota fiscal de **serviço (NFS-e)**.
|
40
|
+
> -- Contém as validações e regras para o mesmo.
|
41
|
+
> -- Contém uma "Associação" com `BrNfe::Endereco`
|
42
|
+
>
|
43
|
+
> - `BrNfe::Service::Intermediario`
|
44
|
+
> -- Classe para instanciar o intermediário na nota fiscal de **serviço (NFS-e)**.
|
45
|
+
> -- Contém as validações e regras para o mesmo.
|
46
|
+
>
|
47
|
+
> - `BrNfe::Service::Item`
|
48
|
+
> -- Item da nota fiscal de serviço;
|
49
|
+
> -- Alguns órgãos emissores permitem adicionar vários itens de serviço na NFS.
|
50
|
+
> -- Ainda, para alguns emissores é obrigatório a definição de itens de serviço, porém para outros esse item não é necessário.
|
51
|
+
>
|
52
|
+
> - `BrNfe::Service::Rps`
|
53
|
+
> -- Classe para instanciar o RPS (Recibo Provisório de Serviço).
|
54
|
+
> -- Contém as validações e regras para o mesmo.
|
55
|
+
> -- Contém "Associação" com `BrNfe::Service::Destinatario` e `BrNfe::Service::Intermediario`
|
56
|
+
> -- Contém vários `BrNfe::Service::Item` através do atributo `items`
|
57
|
+
|
58
|
+
Como citado anteriormente, essas são classes para objetos **auxiliares**, e serão utilizados para manter uma melhor organização da gem.
|
59
|
+
|
60
|
+
##**Entendendo a organização da gem**
|
61
|
+
|
62
|
+
Primeiramente é necessário ter conhecimento das **_operações_** disponíveis para cada tipo de Nota Fiscal. Vamos a elas:
|
63
|
+
### Notas Fiscais de Serviço (NFS)
|
64
|
+
Existe uma certa "padronização" das operações desenvolvidas pelos Órgãos Emissores¹. São elas:
|
65
|
+
|
66
|
+
- **Cancelamento de NFS** _(Utilizado para cancelar uma NFS)_
|
67
|
+
- **Consulta do Lote RPS** _(Utilizado para consultar um lote de RPS)_
|
68
|
+
- **Consulta de NFS por RPS** _(Utilizado para consultar uma NFS através dos dados do RPS)_
|
69
|
+
- **Consulta NFS** _(Utilizado para consultar uma ou várias NFS através do número e/ou data)_
|
70
|
+
- **Consulta Situação do lote RPS** _(Utilizado para consultar a situação de um lote de RPS para verificar se foi processado e se foi processado com sucesso ou erro)_
|
71
|
+
- **Recepção do lote RPS** _(Utilizado enviar RPS's para emissão de NFS)_
|
72
|
+
|
73
|
+
Através destas operações, serão instanciados os objetos para realizar as funcionalidades para cada atividade.
|
74
|
+
|
75
|
+
Cada cidade contrata um órgão emissor para o processamento das notas (ou pode ser que a própria prefeitura desenvolva), então para realizar as operações para cada cidade, você deverá saber qual a empresa contratada para esse fim, e então instanciar o objeto de acordo com sua necessidade.
|
76
|
+
A seguir segue o padrão para instanciar os objetos para cada operação:
|
77
|
+
|
78
|
+
- Para Cancelamento de NFS:
|
79
|
+
```ruby
|
80
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::CancelaNfse.new(...)
|
81
|
+
```
|
82
|
+
- Para Consulta do Lote RPS:
|
83
|
+
```ruby
|
84
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::ConsultaLoteRps.new(...)
|
85
|
+
```
|
86
|
+
- Para Consulta de NFS por RPS:
|
87
|
+
```ruby
|
88
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::ConsultaNfsPorRps.new(...)
|
89
|
+
```
|
90
|
+
- Para Consulta NFS:
|
91
|
+
```ruby
|
92
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::ConsultaNfse.new(...)
|
93
|
+
```
|
94
|
+
- Para Consulta Situação do lote RPS:
|
95
|
+
```ruby
|
96
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::ConsultaSituacaoLoteRps.new(...)
|
97
|
+
```
|
98
|
+
- Para Recepção do lote RPS:
|
99
|
+
```ruby
|
100
|
+
BrNfe::Service::ORGAO_EMISSOR::VERSAO_DO_XML::RecepcaoLoteRps.new(...)
|
101
|
+
```
|
102
|
+
|
103
|
+
Para enviar os dados para processamento deve ser chamado o método **`request`**, no qual será enviado os dados via XML para o órgão emissor correspondente.
|
104
|
+
|
105
|
+
Se desejar, antes de enviar os dados, o objeto poderá ser validado, EX:
|
106
|
+
```ruby
|
107
|
+
@ws = BrNfe::Service::ORGAO_EMISSOR::V1::ConsultaLoteRps.new(...)
|
108
|
+
if @ws.valid?
|
109
|
+
@ws.request
|
110
|
+
@response = @ws.response
|
111
|
+
else
|
112
|
+
# Tratamento da validação
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
116
|
+
O resultado obtido na variável `@response` é um objeto com os dados pertinentes e derivados de cada operação, por exemplo, se eu utilizar a operação de `RecepcaoLoteRps`, então a resposta será um objeto da classe `BrNfe::Service::Response::RecepcaoLoteRps`, na qual tem as informações obtidas pela resposta dessa operação. Já para a operação `ConsultaLoteRps` a resposta é um objeto da classe `BrNfe::Service::Response::ConsultaLoteRps`, e assim segue para cada operação. (para ver exemplos das respostas obtidas a cada operação, consulte a wiki).
|
117
|
+
|
118
|
+
Se desejar, é possível obter a resposta original ([do savon](http://savonrb.com/version2/response.html)) de cada órgão emissor através do método `original_response`.
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
###**Instanciando e manipulando objetos**
|
123
|
+
|
124
|
+
Em todas as classes desenvolvidas é possível instanciar objetos em forma de `Hash` ou `Block`. Veja:
|
125
|
+
```ruby
|
126
|
+
# Hash
|
127
|
+
@endereco = BrNfe::Endereco.new({
|
128
|
+
logradouro: "RUA FERNANDO MACHADO",
|
129
|
+
numero: 369,
|
130
|
+
complemento: "E",
|
131
|
+
# ...
|
132
|
+
})
|
133
|
+
|
134
|
+
# Block
|
135
|
+
@endereco = BrNfe::Endereco.new do |endereco|
|
136
|
+
endereco.logradouro = "RUA FERNANDO MACHADO"
|
137
|
+
endereco.numero = 369
|
138
|
+
endereco.complemento = "E"
|
139
|
+
# ...
|
140
|
+
})
|
141
|
+
```
|
142
|
+
|
143
|
+
As associações também podem ser instanciadas em forma de `Hash` ou `Block`, e ainda pode ser setado o objeto diretamente. Exemplo:
|
144
|
+
```ruby
|
145
|
+
# Hash
|
146
|
+
@emitente = BrNfe::Service::Emitente.new({
|
147
|
+
cnpj: '11.111.111/1111-00',
|
148
|
+
...
|
149
|
+
endereco: {
|
150
|
+
logradouro: "RUA FERNANDO MACHADO",
|
151
|
+
numero: 369,
|
152
|
+
complemento: "E",
|
153
|
+
...
|
154
|
+
}
|
155
|
+
})
|
156
|
+
# Block
|
157
|
+
@emitente = BrNfe::Service::Emitente.new do |emitente|
|
158
|
+
emitente.cnpj = '11.111.111/1111-00'
|
159
|
+
...
|
160
|
+
emitente.endereco do |address|
|
161
|
+
address.logradouro = "RUA FERNANDO ...",
|
162
|
+
address.numero = 369,
|
163
|
+
address.complemento = "E",
|
164
|
+
...
|
165
|
+
end
|
166
|
+
# OU
|
167
|
+
# emitente.endereco = {
|
168
|
+
# logradouro: "RUA FERNANDO ...",
|
169
|
+
# numero: 369,
|
170
|
+
# complemento: "E",
|
171
|
+
# ...
|
172
|
+
# }
|
173
|
+
end
|
174
|
+
|
175
|
+
# Setando o objeto
|
176
|
+
@endereco = BrNfe::Endereco.new(rua: "RUA DOS PRAZERES",...)
|
177
|
+
@emitente = BrNfe::Service::Emitente.new(razao_social: 'Emitente LTDA', endereco: @endereco)
|
178
|
+
|
179
|
+
```
|
180
|
+
|
181
|
+
Também é possível fazer o `merge` dos atributos através do método `assign_attributes`, por exemplo:
|
37
182
|
```ruby
|
38
|
-
BrNfe::Endereco
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
183
|
+
@endereco = BrNfe::Endereco.new({
|
184
|
+
logradouro: "RUA 1",
|
185
|
+
numero: 100,
|
186
|
+
uf: 'SC'
|
187
|
+
})
|
188
|
+
@endereco.logradouro
|
189
|
+
# => "RUA 1"
|
190
|
+
@endereco.numero
|
191
|
+
# => 100
|
192
|
+
@endereco.uf
|
193
|
+
# => "SC"
|
194
|
+
|
195
|
+
@endereco.assign_attributes(numero: 200, uf: 'RS')
|
196
|
+
@endereco.logradouro
|
197
|
+
# => "RUA 1"
|
198
|
+
@endereco.numero
|
199
|
+
# => 200
|
200
|
+
@endereco.uf
|
201
|
+
# => "RS"
|
44
202
|
```
|
45
203
|
|
46
|
-
|
204
|
+
### **Exemplo para Recepção de um Lote RPS:**
|
205
|
+
|
47
206
|
|
48
207
|
**Endereço:**
|
49
208
|
```ruby
|
@@ -63,7 +222,7 @@ A seguir um exemplo de cada objeto com valores:
|
|
63
222
|
***
|
64
223
|
**Emitente:**
|
65
224
|
```ruby
|
66
|
-
@emitente = BrNfe::Emitente.new({
|
225
|
+
@emitente = BrNfe::Service::Emitente.new({
|
67
226
|
cnpj: '11.111.111/1111-00',
|
68
227
|
inscricao_municipal: '66165-4',
|
69
228
|
razao_social: 'RAZÃO SOCIAL',
|
@@ -78,42 +237,17 @@ A seguir um exemplo de cada objeto com valores:
|
|
78
237
|
})
|
79
238
|
```
|
80
239
|
|
81
|
-
Perceba que para definir o endereço do emitente, foi setado diretamente o objeto `@endereco`, porém, também é possível setar o objeto endereço em forma de `block` ou `hash` (isso vale para todas as classes), por exemplo:
|
82
|
-
```ruby
|
83
|
-
# Hash
|
84
|
-
@emitente = BrNfe::Emitente.new({
|
85
|
-
cnpj: '11.111.111/1111-00',
|
86
|
-
...
|
87
|
-
endereco: {
|
88
|
-
logradouro: "RUA FERNANDO MACHADO",
|
89
|
-
numero: 369,
|
90
|
-
complemento: "E",
|
91
|
-
...
|
92
|
-
}
|
93
|
-
})
|
94
|
-
# Block
|
95
|
-
@emitente = BrNfe::Emitente.new do |emitente|
|
96
|
-
emitente.cnpj = '11.111.111/1111-00'
|
97
|
-
...
|
98
|
-
emitente.endereco do |endereco|
|
99
|
-
endereco.logradouro = "RUA FERNANDO ...",
|
100
|
-
endereco.numero = 369,
|
101
|
-
endereco.complemento = "E",
|
102
|
-
...
|
103
|
-
end
|
104
|
-
end
|
105
|
-
```
|
106
240
|
|
107
241
|
Lembrando que por padrão, sempre que for chamar `@emitente.endereco` irá retornar um objeto da class `BrNfe::Endereco`, mesmo que não seja setado valor algum, ex:
|
108
242
|
```ruby
|
109
|
-
@emitente = BrNfe::Emitente.new
|
243
|
+
@emitente = BrNfe::Service::Emitente.new
|
110
244
|
@emitente.endereco
|
111
245
|
# => #<BrNfe::Endereco:0x000000022669a0 @codigo_pais="1058", ....>
|
112
246
|
```
|
113
247
|
***
|
114
248
|
**Destinatário**
|
115
249
|
```ruby
|
116
|
-
@destinatario = BrNfe::Destinatario.new({
|
250
|
+
@destinatario = BrNfe::Service::Destinatario.new({
|
117
251
|
cpf_cnpj: "111.111.111-00",
|
118
252
|
inscricao_municipal: "",
|
119
253
|
inscricao_estadual: "",
|
@@ -123,7 +257,14 @@ Lembrando que por padrão, sempre que for chamar `@emitente.endereco` irá retor
|
|
123
257
|
telefone: "3365478",
|
124
258
|
email: "destinatario@mail.com",
|
125
259
|
endereco: {
|
126
|
-
|
260
|
+
logradouro: "RUA AUGUSTO VILA LOBO",
|
261
|
+
numero: 45,
|
262
|
+
complemento: "E",
|
263
|
+
bairro: "CENTRO",
|
264
|
+
nome_municipio: "FLORIANÓPOLIS",
|
265
|
+
codigo_municipio: '4205407',
|
266
|
+
uf: "SC",
|
267
|
+
cep: "89665-000",
|
127
268
|
}
|
128
269
|
})
|
129
270
|
```
|
@@ -151,12 +292,9 @@ end
|
|
151
292
|
**RPS**
|
152
293
|
```ruby
|
153
294
|
@rps = BrNfe::Service::Rps.new do |rps|
|
154
|
-
rps.destinatario =
|
155
|
-
rps.intermediario
|
156
|
-
|
157
|
-
end
|
158
|
-
rps.condicao_pagamento = BrNfe::CondicaoPagamento.new(...)
|
159
|
-
|
295
|
+
rps.destinatario = @destinatario
|
296
|
+
rps.intermediario = @intermediario
|
297
|
+
rps.condicao_pagamento = @condicao_pagamento
|
160
298
|
rps.numero = 5525
|
161
299
|
rps.serie = "SN"
|
162
300
|
rps.tipo = "1"
|
@@ -166,79 +304,89 @@ end
|
|
166
304
|
rps.numero_substituicao = "5524"
|
167
305
|
rps.serie_substituicao = "SN"
|
168
306
|
rps.tipo_substituicao = "1"
|
169
|
-
rps.codigo_obra = ""
|
170
|
-
rps.codigo_art = ""
|
171
307
|
rps.valor_servicos = 100.00
|
172
308
|
rps.valor_deducoes = "0"
|
173
309
|
rps.valor_pis = "0"
|
174
|
-
rps.valor_cofins = ""
|
175
|
-
rps.valor_inss = ""
|
176
|
-
rps.valor_ir = ""
|
177
|
-
rps.valor_csll = ""
|
178
|
-
rps.outras_retencoes = ""
|
179
|
-
rps.iss_retido = ""
|
180
310
|
rps.valor_iss = 2.0
|
181
311
|
rps.aliquota = 0.02 # = 2%
|
182
312
|
rps.base_calculo = "100.00"
|
183
|
-
rps.desconto_incondicionado = ""
|
184
|
-
rps.desconto_condicionado = ""
|
185
|
-
rps.responsavel_retencao = ""
|
186
313
|
rps.item_lista_servico = "1.07"
|
187
314
|
rps.discriminacao = "1 Configuração de servidor: R$ 500.00"
|
188
315
|
rps.exigibilidade_iss = "1"
|
189
316
|
rps.codigo_municipio = "4204202"
|
190
317
|
rps.municipio_incidencia = "4204202"
|
191
|
-
rps.codigo_pais = ""
|
192
|
-
rps.numero_processo = ""
|
193
|
-
rps.codigo_cnae = ""
|
194
|
-
rps.outras_informacoes = ""
|
195
|
-
rps.codigo_tributacao_municipio = ""
|
196
318
|
end
|
197
319
|
```
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
Se desejar, antes de enviar os dados, o objeto poderá ser validado, EX:
|
320
|
+
***
|
321
|
+
**RecepcaoLoteRps** (Com o órgão emissor Betha)
|
202
322
|
```ruby
|
203
|
-
@
|
204
|
-
|
205
|
-
|
206
|
-
|
323
|
+
@recepcao = BrNfe::Service::Betha::V1::RecepcaoLoteRps.new do |ws|
|
324
|
+
ws.emitente = @emitente
|
325
|
+
ws.lote_rps = [@rps]
|
326
|
+
ws.numero_lote_rps = 214
|
327
|
+
ws.env = :production # OU :test
|
328
|
+
ws.certificate_pkcs12_path = '/path/to/certificate.pfx'
|
329
|
+
wx.certificate_pkcs12_password = 'PASSWORD'
|
207
330
|
end
|
331
|
+
|
332
|
+
@recepcao.request
|
333
|
+
resp = @recepcao.response
|
334
|
+
#=> #<BrNfe::Service::Response::RecepcaoLoteRps:0x000016a9e28 ...>
|
335
|
+
|
336
|
+
resp.protocolo
|
337
|
+
#=> 'EX456156E'
|
338
|
+
|
339
|
+
resp.data_recebimento
|
340
|
+
#=> Fri, 23 Sep 2015 17:40:15 -0300
|
341
|
+
|
342
|
+
resp.numero_lote
|
343
|
+
#=> 214
|
344
|
+
|
208
345
|
```
|
209
|
-
O resultado obtido na variável `@response` é um objeto da class `BrNfe::Service::Response::Default`, no qual será retornada em todas as requisições. Essa classe é responsável de manter o padrão das mensagens de resposta para todos os webservices. Se desejar, poderá obter a resposta original (no formato Hash) de cada órgão emissor através do método `original_response`.
|
210
|
-
Para saber quais os valores obtidos pelo `BrNfe::Service::Response::Default`, veja: [Resposta padrão](exemplos/resposta_padrao.markdown)
|
211
346
|
|
212
|
-
|
347
|
+
Para demais operações consulte a WiKi.
|
213
348
|
|
214
|
-
|
215
|
-
|
349
|
+
### Configurações
|
350
|
+
É possível customizar as classes auxiliares, por exemplo, se você quiser fazer alguma validação específica para o endereço, que contenha os mesmo atributos, você deve criar sua própria `class` e setar na configuração da gem qual será a classe que irá representar o endereço. Exemplo:
|
351
|
+
```ruby
|
352
|
+
class MeuEndereco < BrNfe::Endereco
|
353
|
+
validates :cep, length: { is: 8 }
|
354
|
+
end
|
216
355
|
|
217
|
-
|
356
|
+
emitente = BrNfe::Service::Emitente.new
|
357
|
+
emitente.endereco
|
358
|
+
#=> #<BrNfe::Endereco:0x000000016741d8 @codigo_pais="1058", @nome_pais="BRASIL">
|
359
|
+
|
360
|
+
BrNfe.endereco_class = MeuEndereco
|
361
|
+
|
362
|
+
emitente = BrNfe::Service::Emitente.new
|
363
|
+
emitente.endereco
|
364
|
+
#=> #<MeuEndereco:0x000000016741d8 @codigo_pais="1058", @nome_pais="BRASIL">
|
365
|
+
```
|
366
|
+
|
367
|
+
Segue as configurações possíveis
|
218
368
|
```ruby
|
219
369
|
BrNfe.setup do |config|
|
220
|
-
#
|
221
|
-
# se você quiser fazer alguma validação específica para o endereço,
|
222
|
-
# que contenha os mesmo atributos, e setar na configuração da gem
|
223
|
-
# qual será a classe que irá representar o endereco.
|
224
|
-
# config.endereco_class = ClasseCustomizadaEndereco
|
225
|
-
|
370
|
+
# Classe que representa o endereço
|
226
371
|
config.endereco_class = BrNfe::Endereco
|
227
|
-
|
228
|
-
|
229
|
-
config.
|
372
|
+
|
373
|
+
# Classe que representa os emitentes para NFS
|
374
|
+
config.emitente_service_class = BrNfe::Service::Emitente
|
375
|
+
|
376
|
+
# Classe que representa o destinatário para NFS
|
377
|
+
config.destinatario_service_class = BrNfe::Service::Destinatario
|
378
|
+
|
379
|
+
# Classe que representa o intermediário da NFS
|
380
|
+
config.intermediario_service_class = BrNfe::Service::Intermediario
|
381
|
+
|
382
|
+
# Classe que representa a condição de pagamento da NFS
|
230
383
|
config.condicao_pagamento_class = BrNfe::CondicaoPagamento
|
231
|
-
config.rps_class BrNfe::Service::Rps
|
232
384
|
|
233
|
-
#
|
234
|
-
|
235
|
-
|
236
|
-
#
|
237
|
-
|
238
|
-
config.client_wsdl_ssl_verify_mode = :none
|
239
|
-
config.client_wsdl_ssl_cert_file = nil
|
240
|
-
config.client_wsdl_ssl_cert_key_file = nil
|
241
|
-
config.client_wsdl_ssl_cert_key_password = nil
|
385
|
+
# Classe que representa o RPS da NFS
|
386
|
+
config.rps_class = BrNfe::Service::Rps
|
387
|
+
|
388
|
+
# Classe que representa o item de uma NFS
|
389
|
+
config.service_item_class = BrNfe::Service::Item
|
242
390
|
|
243
391
|
# Se você quiser exibir em log a requisição SOAP, mude para true as opções a seguir
|
244
392
|
config.client_wsdl_log = false
|
@@ -248,19 +396,29 @@ end
|
|
248
396
|
|
249
397
|
|
250
398
|
## Objetivos futuros
|
251
|
-
* Emitir notas fiscais de produtos.
|
399
|
+
* Emitir notas fiscais de produtos (em andamento).
|
252
400
|
* Emitir notas fiscais de serviços para todas as cidades do Brasil.
|
401
|
+
* Emitir DANFE.
|
402
|
+
* Leitura de notas fiscais de produto e serviço
|
253
403
|
|
254
404
|
## Contribuições
|
255
405
|
|
256
|
-
Seja um contribuidor. Você pode contribuir de
|
406
|
+
Seja um contribuidor. Você pode contribuir de várias formas:
|
257
407
|
|
258
408
|
* Desenvolver emissão de NFS-e para outras cidades.
|
259
409
|
* Desenvolver emissão de NF-e (produtos).
|
260
410
|
* Refatorando código.
|
261
411
|
* Fornecendo Feedback construtivo (Sempre bem vindo!).
|
262
412
|
|
413
|
+
|
263
414
|
## Licença
|
264
415
|
|
265
|
-
-
|
266
|
-
- Copyleft
|
416
|
+
- MIT
|
417
|
+
- Copyleft 2016 Bruno Mucelini Mergen
|
418
|
+
|
419
|
+
----------
|
420
|
+
|
421
|
+
> ¹ **Órgão Emissor: ** É a empresa contratada pela prefeitura com a finalidade de processar as notas fiscais. Exemplo: (Betha, Simpliss, Thema)
|
422
|
+
|
423
|
+
----------
|
424
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module BrNfe
|
2
|
+
module Association
|
3
|
+
module HaveDestinatario
|
4
|
+
def destinatario
|
5
|
+
yield(destinatario) if block_given?
|
6
|
+
@destinatario.is_a?(destinatario_class) ? @destinatario : @destinatario = destinatario_class.new()
|
7
|
+
end
|
8
|
+
|
9
|
+
def destinatario=(value)
|
10
|
+
if value.is_a?(destinatario_class) || value.nil?
|
11
|
+
@destinatario = value
|
12
|
+
elsif value.is_a?(Hash)
|
13
|
+
destinatario.assign_attributes(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
private
|
17
|
+
def destinatario_class
|
18
|
+
raise "O método #destinatario_class deve ser implementado na class #{self.class}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module BrNfe
|
2
|
+
module Association
|
3
|
+
module HaveEmitente
|
4
|
+
|
5
|
+
def emitente
|
6
|
+
yield emitente if block_given?
|
7
|
+
@emitente.is_a?(emitente_class) ? @emitente : @emitente = emitente_class.new()
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def emitente=(value)
|
12
|
+
if value.is_a?(emitente_class) || value.nil?
|
13
|
+
@emitente = value
|
14
|
+
elsif value.is_a?(Hash)
|
15
|
+
emitente.assign_attributes(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
private
|
19
|
+
def emitente_class
|
20
|
+
raise "O método #emitente_class deve ser implementado na classe #{self.class}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/br_nfe/base.rb
CHANGED
@@ -1,16 +1,23 @@
|
|
1
1
|
module BrNfe
|
2
2
|
class Base < BrNfe::ActiveModelBase
|
3
|
-
include BrNfe::
|
3
|
+
include BrNfe::Association::HaveEmitente
|
4
4
|
|
5
5
|
attr_accessor :certificate_pkcs12_password
|
6
6
|
attr_accessor :certificate_pkcs12_path
|
7
7
|
attr_accessor :certificate_pkcs12_value
|
8
8
|
attr_accessor :env
|
9
9
|
|
10
|
-
|
11
|
-
attr_accessor :
|
12
|
-
|
13
|
-
|
10
|
+
# Código IBGE da cidade emitente
|
11
|
+
attr_accessor :ibge_code_of_issuer_city
|
12
|
+
def ibge_code_of_issuer_city
|
13
|
+
"#{@ibge_code_of_issuer_city ||= emitente.endereco.codigo_municipio}"
|
14
|
+
end
|
15
|
+
|
16
|
+
# Código IBGE do estado emitente
|
17
|
+
attr_accessor :ibge_code_of_issuer_uf
|
18
|
+
def ibge_code_of_issuer_uf
|
19
|
+
"#{@ibge_code_of_issuer_uf ||= emitente.endereco.codigo_ibge_uf}"
|
20
|
+
end
|
14
21
|
|
15
22
|
validate :validar_emitente
|
16
23
|
validates :certificate, :certificate_key, presence: true, if: :certificado_obrigatorio?
|
@@ -20,6 +27,10 @@ module BrNfe
|
|
20
27
|
false
|
21
28
|
end
|
22
29
|
|
30
|
+
def ssl_request?
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
23
34
|
def env
|
24
35
|
@env ||= :production
|
25
36
|
end
|
@@ -147,30 +158,29 @@ module BrNfe
|
|
147
158
|
:v1
|
148
159
|
end
|
149
160
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
ssl_verify_mode: client_wsdl_ssl_verify_mode,
|
157
|
-
ssl_cert_file: client_wsdl_ssl_cert_file,
|
158
|
-
ssl_cert_key_file: client_wsdl_ssl_cert_key_file,
|
159
|
-
ssl_cert_key_password: client_wsdl_ssl_cert_key_password
|
160
|
-
})
|
161
|
+
# Versão da requisição SSL caso o servidor necessite de autenticação SSL
|
162
|
+
# Valores possíveis: [:TLSv1_2, :TLSv1_1, :TLSv1, :SSLv3, :SSLv23]
|
163
|
+
# Default: :SSLv3
|
164
|
+
def ssl_version
|
165
|
+
:SSLv3
|
161
166
|
end
|
162
167
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
def
|
167
|
-
@
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
168
|
+
# Cliente WSDL utilizado para fazer a requisição.
|
169
|
+
# Utilizando a gem savon.
|
170
|
+
# Veja mais detalhes em http://savonrb.com/version2/client.html
|
171
|
+
def client_wsdl
|
172
|
+
@client_wsdl ||= Savon.client do |global|
|
173
|
+
global.wsdl wsdl
|
174
|
+
global.log BrNfe.client_wsdl_log
|
175
|
+
global.pretty_print_xml BrNfe.client_wsdl_pretty_print_xml
|
176
|
+
global.ssl_verify_mode :none
|
177
|
+
if ssl_request?
|
178
|
+
global.ssl_version ssl_version
|
179
|
+
global.ssl_cert certificate
|
180
|
+
global.ssl_cert_key certificate_key
|
181
|
+
global.ssl_cert_key_password certificate_pkcs12_password
|
182
|
+
end
|
183
|
+
end
|
174
184
|
end
|
175
185
|
|
176
186
|
# Caso não tenha o certificate_pkcs12 salvo em arquivo, pode setar a string do certificate_pkcs12 direto pelo atributo certificate_pkcs12_value
|