diff --git a/.gitignore b/.gitignore index a1d970b..2ed889e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,4 @@ docs/_build .cache .idea/ venv/ -*.pytest_cache \ No newline at end of file +*.pytest_cache diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index a64b0b7..5bf4e4e 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -79,6 +79,8 @@ def localizar_url(servico, estado, mod='55', ambiente=2): if sigla in ('AC', 'RN', 'PB', 'SC', 'RJ') and \ servico == WS_NFE_CADASTRO: dominio = 'cad.svrs.rs.gov.br' + if sigla == 'AN' and servico == WS_NFE_RECEPCAO_EVENTO: + dominio = 'www.nfe.fazenda.gov.br' return "https://%s/%s" % (dominio, complemento) @@ -152,7 +154,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfce-homologacao.svrs.rs.gov.br', @@ -162,89 +164,67 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx', + WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?', } } } -# TODO Daqui pra frente tem que revisar SVAN = { AMBIENTE_PRODUCAO: { 'servidor': 'www.sefazvirtual.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.sefazvirtual.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx', - } -} - -SCAN = { - AMBIENTE_PRODUCAO: { - 'servidor': 'www.scan.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' - }, - AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa } } SVC_AN = { AMBIENTE_PRODUCAO: { 'servidor': 'www.svc.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'hom.nfe.fazenda.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx', - WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx' + 'servidor': 'hom.svc.fazenda.gov.br', + WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa } } SVC_RS = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefazvirtual.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + 'servidor': 'nfe.svrs.rs.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_CONSULTA: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.sefazvirtual.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + 'servidor': 'nfe-homologacao.svrs.rs.gov.br', + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa } } @@ -253,13 +233,13 @@ AN = { 'servidor': 'www1.nfe.fazenda.gov.br', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hom.nfe.fazenda.gov.br', WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', + WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', # noqa }, } @@ -267,23 +247,23 @@ UFAM = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'services2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', + WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa + WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homnfe.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'services2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', + WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa + WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl', } }, NFCE_MODELO: { @@ -313,46 +293,46 @@ UFAM = { UFBA = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ba.gov.br', - WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', - WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', - WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', - WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', - WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', - WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'hnfe.sefaz.ba.gov.br', - WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', - WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', - WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', - WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', - WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', - WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', - WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', + WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa + WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa + WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa + WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa } } UFCE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', - WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfeh.sefaz.ce.gov.br', - WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?WSDL', - WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?WSDL', - WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?WSDL', - WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?WSDL', - WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?WSDL', - WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?WSDL', - WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?WSDL', + WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl', } } @@ -384,46 +364,46 @@ UFGO = { UFMT = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.mt.gov.br', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homologacao.sefaz.mt.gov.br', - WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento', + WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl', } } UFMS = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.fazenda.ms.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'producao/services2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'producao/services2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'producao/services2/NfeRetAutorizacao', - WS_NFE_CADASTRO: 'producao/services2/CadConsultaCadastro2', - WS_NFE_INUTILIZACAO: 'producao/services2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'producao/services2/NfeConsulta2', - WS_NFE_SITUACAO: 'producao/services2/NfeStatusServico2', + 'servidor': 'nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.ms.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'homologacao/services2/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'homologacao/services2/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'homologacao/services2/NfeRetAutorizacao', - WS_NFE_CADASTRO: 'homologacao/services2/CadConsultaCadastro2', - WS_NFE_INUTILIZACAO: 'homologacao/services2/NfeInutilizacao2', - WS_NFE_CONSULTA: 'homologacao/services2/NfeConsulta2', - WS_NFE_SITUACAO: 'homologacao/services2/NfeStatusServico2', + 'servidor': 'hom.nfe.sefaz.ms.gov.br', + WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl', } } @@ -453,47 +433,47 @@ UFMG = { UFPR = { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.fazenda.pr.gov.br', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3', - WS_NFE_CONSULTA: 'nfe/NFeConsulta3', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + 'servidor': 'nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', }, AMBIENTE_HOMOLOGACAO: { - 'servidor': 'homologacao.nfe.fazenda.pr.gov.br', - WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3', - WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3', - WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3', - WS_NFE_CONSULTA: 'nfe/NFeConsulta3', - WS_NFE_SITUACAO: 'nfe/NFeStatusServico3', - WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2', - WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento', + 'servidor': 'homologacao.nfe.sefa.pr.gov.br', + WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl', } } UFPE = { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefaz.pe.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?Wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfehomolog.sefaz.pe.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2', + WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl', + WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl', + WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl', } } @@ -502,23 +482,23 @@ UFRS = { NFE_MODELO: { AMBIENTE_PRODUCAO: { 'servidor': 'nfe.sefazrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.sefazrs.rs.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', - WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', - WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', - WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', - WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', + WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa + WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl', + WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl', + WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', #noqa + WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa } }, NFCE_MODELO: { @@ -526,8 +506,8 @@ UFRS = { 'servidor': 'nfce.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', @@ -537,8 +517,8 @@ UFRS = { 'servidor': 'nfce-homologacao.sefazrs.rs.gov.br', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', - WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', + WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 8a21d80..5252cda 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -4,13 +4,11 @@ import os -import hashlib -import binascii from lxml import etree from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe -from pytrustnfe.Servidores import localizar_url, localizar_qrcode +from pytrustnfe.Servidores import localizar_url from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key # Zeep @@ -38,54 +36,6 @@ def _generate_nfe_id(**kwargs): item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:] -def _add_qrCode(xml, **kwargs): - xml = etree.fromstring(xml) - inf_nfe = kwargs['NFes'][0]['infNFe'] - nfe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") - infnfesupl = etree.Element('infNFeSupl') - qrcode = etree.Element('qrCode') - chave_nfe = inf_nfe['Id'][3:] - dh_emissao = binascii.hexlify(inf_nfe['ide']['dhEmi'].encode()).decode() - versao = '100' - ambiente = kwargs['ambiente'] - valor_total = inf_nfe['total']['vNF'] - dest_cpf = 'Inexistente' - dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") - - if inf_nfe.get('dest', False): - if inf_nfe['dest'].get('CPF', False): - dest_cpf = inf_nfe['dest']['CPF'] - dest = etree.Element('dest') - cpf = etree.Element('CPF') - cpf.text = dest_cpf - dest.append(cpf) - - icms_total = inf_nfe['total']['vICMS'] - dig_val = binascii.hexlify(xml.find( - ".//{http://www.w3.org/2000/09/xmldsig#}DigestValue").text.encode()).decode() - cid_token = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['cid_token'] - csc = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['csc'] - - c_hash_QR_code = "chNFe={0}&nVersao={1}&tpAmb={2}&cDest={3}&dhEmi={4}&vNF\ -={5}&vICMS={6}&digVal={7}&cIdToken={8}{9}".\ - format(chave_nfe, versao, ambiente, dest_cpf, dh_emissao, - valor_total, icms_total, dig_val, cid_token, csc) - c_hash_QR_code = hashlib.sha1(c_hash_QR_code.encode()).hexdigest() - - QR_code_url = "?chNFe={0}&nVersao={1}&tpAmb={2}&{3}dhEmi={4}&vNF={5}&vICMS\ -={6}&digVal={7}&cIdToken={8}&cHashQRCode={9}".\ - format(chave_nfe, versao, ambiente, - 'cDest={}&'.format(dest_cpf) if dest_cpf != 'Inexistente' - else '', dh_emissao, valor_total, icms_total, dig_val, - cid_token, c_hash_QR_code) - qr_code_server = localizar_qrcode(kwargs['estado'], ambiente) - qrcode_text = qr_code_server + QR_code_url - qrcode.text = etree.CDATA(qrcode_text) - infnfesupl.append(qrcode) - nfe.insert(1, infnfesupl) - return etree.tostring(xml, encoding=str) - - def _render(certificado, method, sign, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs) @@ -107,9 +57,6 @@ def _render(certificado, method, sign, **kwargs): xml_send = signer.assina_xml( xmlElem_send, kwargs['manifesto']['identificador']) - if modelo == '65': - xml_send = _add_qrCode(xml_send, **kwargs) - else: xml_send = etree.tostring(xmlElem_send, encoding=str) return xml_send @@ -131,12 +78,19 @@ def _send(certificado, method, **kwargs): session.verify = False transport = Transport(session=session) - xml = etree.fromstring(xml_send) + parser = etree.XMLParser(strip_cdata=False) + xml = etree.fromstring(xml_send, parser=parser) + client = Client(base_url, transport=transport) port = next(iter(client.wsdl.port_types)) first_operation = [x for x in iter( - client.wsdl.port_types[port].operations) if "Zip" not in x][0] + client.wsdl.port_types[port].operations) if "zip" not in x.lower()][0] + + namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") + if namespaceNFe is not None: + namespaceNFe.set('xmlns', 'http://www.portalfiscal.inf.br/nfe') + with client.settings(raw_response=True): response = client.service[first_operation](xml) response, obj = sanitize_response(response.text) @@ -244,9 +198,7 @@ def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) -def consulta_distribuicao_nfe(certificado, **kwargs): - if "xml" not in kwargs: - kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) +def _send_v310(certificado, **kwargs): xml_send = kwargs["xml"] base_url = localizar_url( 'NFeDistribuicaoDFe', kwargs['estado'], kwargs['modelo'], @@ -277,6 +229,12 @@ def consulta_distribuicao_nfe(certificado, **kwargs): } +def consulta_distribuicao_nfe(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) + return _send_v310(certificado, **kwargs) + + def xml_download_nfe(certificado, **kwargs): # Assinar return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) @@ -284,4 +242,4 @@ def xml_download_nfe(certificado, **kwargs): # Assinar def download_nfe(certificado, **kwargs): if "xml" not in kwargs: kwargs['xml'] = xml_download_nfe(certificado, **kwargs) - return _send(certificado, 'NFeDistribuicaoDFe', **kwargs) + return _send_v310(certificado, **kwargs) diff --git a/pytrustnfe/nfe/danfce.py b/pytrustnfe/nfe/danfce.py index e245ada..7773798 100644 --- a/pytrustnfe/nfe/danfce.py +++ b/pytrustnfe/nfe/danfce.py @@ -72,7 +72,7 @@ def format_telefone(telefone): class danfce(object): - def __init__(self, list_xml, logo=None): + def __init__(self, list_xml, logo=None, timezone=None): self.current_font_size = 7 self.current_font_name = 'NimbusSanL-Regu' @@ -188,16 +188,16 @@ class danfce(object): # Impostos el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") - total_tributo = format_number(tagtext(oNode=el_total, cTag='vTotTrib'), - precision=2) - valor_total = format_number(tagtext(oNode=el_total, cTag='vProd'), - precision=2) - desconto = format_number(tagtext(oNode=el_total, cTag='vDesc'), - precision=2) - valor_a_pagar = format_number(tagtext(oNode=el_total, cTag='vNF'), - precision=2) + total_tributo = format_number( + tagtext(oNode=el_total, cTag='vTotTrib'), precision=2) + valor_total = format_number( + tagtext(oNode=el_total, cTag='vProd'), precision=2) + desconto = format_number( + tagtext(oNode=el_total, cTag='vDesc'), precision=2) + valor_a_pagar = format_number( + tagtext(oNode=el_total, cTag='vNF'), precision=2) el_pag = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}pag") - troco = format_number(tagtext(oNode=el_pag, cTag="vTroco")) + troco = tagtext(oNode=el_pag, cTag="vTroco") payment_method_list = {'01': 'Dinheiro', '02': 'Cheque', @@ -216,39 +216,40 @@ class danfce(object): ".//{http://www.portalfiscal.inf.br/nfe}det")) payment_methods = [] - for pagId, item in enumerate(el_pag): - if 'tPag' not in item.tag: - continue - payment = [] - method = payment_method_list[item.text] + tipo_pagamento = tagtext(oNode=item, cTag="tPag") + val = format_number(tagtext(oNode=item, cTag="vPag"), precision=2) + + method = payment_method_list.get(tipo_pagamento) payment.append(method) - payment.append(format_number(item.getnext().text, precision=2)) + payment.append(val) payment_methods.append(payment) - values = {'quantidade_itens': quant_produtos, - 'total_tributo': total_tributo, - 'valor_total': valor_total, - 'desconto': desconto, - 'valor_a_pagar': valor_a_pagar, - 'formas_de_pagamento': payment_methods, - 'troco': troco, - } + values = { + 'quantidade_itens': quant_produtos, + 'total_tributo': total_tributo, + 'valor_total': valor_total, + 'desconto': desconto, + 'valor_a_pagar': valor_a_pagar, + 'formas_de_pagamento': payment_methods, + 'troco': troco, + } self.draw_totals_table(values) self.drawLine() def draw_totals_table(self, values): - rowHeights = [7, 7, 7, 7, 10] - data = [['QTD.TOTAL DE ITENS', values['quantidade_itens']], + rowHeights = [7, 7, 7, 7, 7] + data = [ + ['QTD.TOTAL DE ITENS', values['quantidade_itens']], ['VALOR TOTAL R$', values['valor_total']], ['DESCONTO R$', values['desconto']], ['VALOR A PAGAR R$', values['valor_a_pagar']], ['FORMA DE PAGAMENTO', 'VALOR PAGO R$'], - ] + ] for item in values['formas_de_pagamento']: data.append([item[0], item[1]]) diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 3354b89..8038560 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -6,6 +6,7 @@ import os from io import BytesIO from textwrap import wrap +import math from reportlab.lib import utils from reportlab.pdfgen import canvas @@ -40,7 +41,6 @@ def format_cnpj_cpf(value): def getdateByTimezone(cDateUTC, timezone=None): - ''' Esse método trata a data recebida de acordo com o timezone do usuário. O seu retorno é dividido em duas partes: @@ -80,6 +80,8 @@ def getdateByTimezone(cDateUTC, timezone=None): def format_number(cNumber): if cNumber: + # Vírgula para a separação de milhar e 2f para 2 casas decimais + cNumber = "{:,.2f}".format(float(cNumber)) return cNumber.replace(",", "X").replace(".", ",").replace("X", ".") return "" @@ -128,10 +130,13 @@ class danfe(object): self.nBottom = 8 self.nlin = self.nTop self.logo = logo - self.oFrete = {'0': '0 - Emitente', - '1': '1 - Destinatário', - '2': '2 - Terceiros', - '9': '9 - Sem Frete'} + self.oFrete = { + '0': '0 - Contratação por conta do Remetente (CIF)', + '1': '1 - Contratação por conta do Destinatário (FOB)', + '2': '2 - Contratação por conta de Terceiros', + '3': '3 - Transporte Próprio por conta do Remetente', + '4': '4 - Transporte Próprio por conta do Destinatário', + '9': '9 - Sem Ocorrência de Transporte'} self.oPDF_IO = BytesIO() if orientation == 'landscape': @@ -150,16 +155,15 @@ class danfe(object): self.NrPages = 1 self.Page = 1 - # Calculando total linhas usadas para descrições dos itens - # Com bloco fatura, apenas 25 linhas para itens na primeira folha - nNr_Lin_Pg_1 = 30 if oXML_cobr is None else 26 - # [ rec_ini , rec_fim , lines , limit_lines ] - oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") + + # Declaring variable to prevent future errors + nId = 0 + if el_det is not None: list_desc = [] list_cod_prod = [] - nPg = 0 + for nId, item in enumerate(el_det): el_prod = item.find( ".//{http://www.portalfiscal.inf.br/nfe}prod") @@ -174,21 +178,9 @@ class danfe(object): list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14) list_cod_prod.append(list_cProd) - # Nr linhas necessárias p/ descrição item - nLin_Itens = len(list_) - - if (oPaginator[nPg][2] + nLin_Itens) >= oPaginator[nPg][3]: - oPaginator.append([0, 0, 0, 77]) - nPg += 1 - oPaginator[nPg][0] = nId - oPaginator[nPg][1] = nId + 1 - oPaginator[nPg][2] = nLin_Itens - else: - # adiciona-se 1 pelo funcionamento de xrange - oPaginator[nPg][1] = nId + 1 - oPaginator[nPg][2] += nLin_Itens - - self.NrPages = len(oPaginator) # Calculando nr. páginas + # Calculando nr. aprox. de páginas + if nId > 25: + self.NrPages += math.ceil((nId - 25) / 70) if recibo: self.recibo_entrega(oXML=oXML, timezone=timezone) @@ -201,18 +193,23 @@ class danfe(object): self.impostos(oXML=oXML) self.transportes(oXML=oXML) - self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0], - list_desc=list_desc, list_cod_prod=list_cod_prod) - self.adicionais(oXML=oXML) + index = self.produtos( + oXML=oXML, el_det=el_det, max_index=nId, + list_desc=list_desc, list_cod_prod=list_cod_prod) + + tamanho_ocupado = self.calculo_issqn(oXML=oXML) + self.adicionais(oXML=oXML, tamanho_diminuir=tamanho_ocupado) # Gera o restante das páginas do XML - for oPag in oPaginator[1:]: + while index < nId: self.newpage() self.ide_emit(oXML=oXML, timezone=timezone) - self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, - list_desc=list_desc, nHeight=77, - list_cod_prod=list_cod_prod) + index = self.produtos( + oXML=oXML, el_det=el_det, index=index, + max_index=nId, + list_desc=list_desc, nHeight=77, + list_cod_prod=list_cod_prod) self.newpage() if cce_xml: @@ -323,7 +320,7 @@ class danfe(object): P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) w, h = P.wrap(55 * mm, 40 * mm) P.drawOn(self.canvas, (self.nLeft + 30) * mm, - (self.height - self.nlin - ((4.3*h + 12)/12)) * mm) + (self.height - self.nlin - ((4.3 * h + 12) / 12)) * mm) if self.logo: img = get_image(self.logo, width=2 * cm) @@ -596,25 +593,26 @@ obsCont[@xCampo='NomeVendedor']") self.width - self.nLeft - self.nRight, 20) self.hline(self.nLeft, self.nlin + 8.6, self.width - self.nLeft) self.hline(self.nLeft, self.nlin + 15.2, self.width - self.nLeft) - self.vline(nMr - 40, self.nlin + 2, 13.2) - self.vline(nMr - 49, self.nlin + 2, 20) - self.vline(nMr - 92, self.nlin + 2, 6.6) - self.vline(nMr - 120, self.nlin + 2, 6.6) - self.vline(nMr - 75, self.nlin + 2, 6.6) + self.vline(nMr - 26, self.nlin + 2, 13.2) + self.vline(nMr - 33, self.nlin + 2, 13.2) + self.vline(nMr - 67, self.nlin + 2, 6.6) + self.vline(nMr - 123, self.nlin + 2, 6.6) + self.vline(nMr - 53, self.nlin + 2, 6.6) self.vline(nMr - 26, self.nlin + 15.2, 6.6) + self.vline(nMr - 49, self.nlin + 15.2, 6.6) self.vline(nMr - 102, self.nlin + 8.6, 6.6) self.vline(nMr - 85, self.nlin + 15.2, 6.6) self.vline(nMr - 121, self.nlin + 15.2, 6.6) self.vline(nMr - 160, self.nlin + 15.2, 6.6) # Labels/Fields - self.string(nMr - 39, self.nlin + 3.8, 'CNPJ/CPF') - self.string(nMr - 74, self.nlin + 3.8, 'PLACA DO VEÍCULO') - self.string(nMr - 91, self.nlin + 3.8, 'CÓDIGO ANTT') - self.string(nMr - 119, self.nlin + 3.8, 'FRETE POR CONTA') + self.string(nMr - 25, self.nlin + 3.8, 'CNPJ/CPF') + self.string(nMr - 52, self.nlin + 3.8, 'PLACA DO VEÍCULO') + self.string(nMr - 66, self.nlin + 3.8, 'CÓDIGO ANTT') + self.string(nMr - 122, self.nlin + 3.8, 'FRETE POR CONTA') self.string(self.nLeft + 1, self.nlin + 3.8, 'RAZÃO SOCIAL') - self.string(nMr - 48, self.nlin + 3.8, 'UF') - self.string(nMr - 39, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL') - self.string(nMr - 48, self.nlin + 10.3, 'UF') + self.string(nMr - 32, self.nlin + 3.8, 'UF') + self.string(nMr - 25, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL') + self.string(nMr - 32, self.nlin + 10.3, 'UF') self.string(nMr - 101, self.nlin + 10.3, 'MUNICÍPIO') self.string(self.nLeft + 1, self.nlin + 10.3, 'ENDEREÇO') self.string(nMr - 48, self.nlin + 17, 'PESO BRUTO') @@ -624,26 +622,27 @@ obsCont[@xCampo='NomeVendedor']") self.string(nMr - 159, self.nlin + 17, 'ESPÉCIE') self.string(self.nLeft + 1, self.nlin + 17, 'QUANTIDADE') # Conteúdo campos - self.canvas.setFont('NimbusSanL-Regu', 8) + self.canvas.setFont('NimbusSanL-Regu', 7) self.string(self.nLeft + 1, self.nlin + 7.7, - tagtext(oNode=el_transp, cTag='xNome')[:40]) - self.string(self.nLeft + 71, self.nlin + 7.7, + tagtext(oNode=el_transp, cTag='xNome')[:42]) + self.string(self.nLeft + 68, self.nlin + 7.7, self.oFrete[tagtext(oNode=el_transp, cTag='modFrete')]) - self.string(self.nLeft + 99, self.nlin + 7.7, + self.string(self.nLeft + 122, self.nlin + 7.7, tagtext(oNode=el_transp, cTag='RNTC')) - self.string(self.nLeft + 116, self.nlin + 7.7, + self.string(self.nLeft + 136, self.nlin + 7.7, tagtext(oNode=el_transp, cTag='placa')) - self.string(self.nLeft + 142, self.nlin + 7.7, + self.string(self.nLeft + 157, self.nlin + 7.7, tagtext(oNode=veic_transp, cTag='UF')) - self.string(nMr - 39, self.nlin + 7.7, + self.string(nMr - 25, self.nlin + 7.7, format_cnpj_cpf(tagtext(oNode=el_transp, cTag='CNPJ'))) + self.canvas.setFont('NimbusSanL-Regu', 8) self.string(self.nLeft + 1, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='xEnder')[:45]) self.string(self.nLeft + 89, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='xMun')) - self.string(nMr - 48, self.nlin + 14.2, + self.string(nMr - 32, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='UF')) - self.string(nMr - 39, self.nlin + 14.2, + self.string(nMr - 25, self.nlin + 14.2, tagtext(oNode=el_transp, cTag='IE')) self.string(self.nLeft + 1, self.nlin + 21.2, tagtext(oNode=el_transp, cTag='qVol')) @@ -662,13 +661,16 @@ obsCont[@xCampo='NomeVendedor']") self.nlin += 23 - def produtos(self, oXML=None, el_det=None, oPaginator=None, + def produtos(self, oXML=None, el_det=None, index=0, max_index=0, list_desc=None, list_cod_prod=None, nHeight=29): nMr = self.width - self.nRight nStep = 2.5 # Passo entre linhas nH = 7.5 + (nHeight * nStep) # cabeçalho 7.5 self.nlin += 1 + # nH é o altura da linha vertical, utilizar como referência + # somar a ele a altura atual que é nlin + maxHeight = self.nlin + nH self.canvas.setFont('NimbusSanL-Bold', 7) self.string(self.nLeft + 1, self.nlin + 1, 'DADOS DO PRODUTO/SERVIÇO') @@ -714,9 +716,15 @@ obsCont[@xCampo='NomeVendedor']") # Conteúdo campos self.canvas.setFont('NimbusSanL-Regu', 5) - nLin = self.nlin + 10.5 + nLin = self.nlin + 10.0 + + for id in range(index, max_index + 1): + + line_height = max(len(list_cod_prod[id]), len(list_desc[id])) + line_height *= nStep + if nLin + line_height > maxHeight: + break - for id in range(oPaginator[0], oPaginator[1]): item = el_det[id] el_prod = item.find(".//{http://www.portalfiscal.inf.br/nfe}prod") el_imp = item.find( @@ -747,8 +755,8 @@ obsCont[@xCampo='NomeVendedor']") tagtext(oNode=el_prod, cTag='qCom'))) self.stringRight(nMr - 64.5, nLin, format_number( tagtext(oNode=el_prod, cTag='vUnCom'))) - self.stringRight(nMr - 50.5, nLin, - tagtext(oNode=el_prod, cTag='vProd')) + self.stringRight(nMr - 50.5, nLin, format_number( + tagtext(oNode=el_prod, cTag='vProd'))) self.stringRight(nMr - 38.5, nLin, format_number(vBC)) self.stringRight(nMr - 26.5, nLin, format_number(vICMS)) self.stringRight(nMr - 7.5, nLin, format_number(pICMS)) @@ -776,8 +784,51 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setStrokeColor(black) self.nlin += nH + 3 + return id + + def calculo_issqn(self, oXML=None): + elem_emit = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}emit") + el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") + issqn_total = el_total.find( + ".//{http://www.portalfiscal.inf.br/nfe}ISSQNtot") + if not issqn_total: + return 0 + + self.nlin += 1 + nMr = self.width - self.nRight + self.canvas.setFont('NimbusSanL-Bold', 7) + self.string(self.nLeft + 1, self.nlin + 1, 'CÁLCULO DO ISSQN') + self.rect(self.nLeft, self.nlin + 2, + self.width - self.nLeft - self.nRight, 5.5) + self.vline(nMr - 47.5, self.nlin + 2, 5.5) + self.vline(nMr - 95, self.nlin + 2, 5.5) + self.vline(nMr - 142.5, self.nlin + 2, 5.5) + self.vline(nMr - 190, self.nlin + 2, 5.5) + # Labels + self.canvas.setFont('NimbusSanL-Regu', 5) + self.string(self.nLeft + 1, self.nlin + 3.8, 'INSCRIÇÃO MUNICIPAL') + self.string(nMr - 141.5, self.nlin + 3.8, 'VALOR TOTAL DOS SERVIÇOS') + self.string(nMr - 94, self.nlin + 3.8, 'BASE DE CÁLCULO DO ISSQN') + self.string(nMr - 46.5, self.nlin + 3.8, 'VALOR DO ISSQN') + # Conteúdo campos + self.canvas.setFont('NimbusSanL-Regu', 8) + self.string( + self.nLeft + 1, self.nlin + 6.7, + tagtext(oNode=elem_emit, cTag='IM')) + self.stringRight( + self.nLeft + 94, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vServ'))) + self.stringRight( + self.nLeft + 141.5, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vBC'))) + self.stringRight( + self.nLeft + 189, self.nlin + 6.7, + format_number(tagtext(oNode=issqn_total, cTag='vISS'))) + + self.nlin += 8 # Nr linhas ocupadas pelo bloco + return 8 - def adicionais(self, oXML=None): + def adicionais(self, oXML=None, tamanho_diminuir=0): el_infAdic = oXML.find( ".//{http://www.portalfiscal.inf.br/nfe}infAdic") @@ -787,10 +838,10 @@ obsCont[@xCampo='NomeVendedor']") self.canvas.setFont('NimbusSanL-Regu', 5) self.string(self.nLeft + 1, self.nlin + 4, 'INFORMAÇÕES COMPLEMENTARES') - self.string((self.width / 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO') + self.string(((self.width / 3) * 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO') self.rect(self.nLeft, self.nlin + 2, - self.width - self.nLeft - self.nRight, 42) - self.vline(self.width / 2, self.nlin + 2, 42) + self.width - self.nLeft - self.nRight, 42 - tamanho_diminuir) + self.vline((self.width / 3) * 2, self.nlin + 2, 42 - tamanho_diminuir) # Conteúdo campos styles = getSampleStyleSheet() styleN = styles['Normal'] @@ -802,7 +853,7 @@ obsCont[@xCampo='NomeVendedor']") if fisco: observacoes = fisco + ' ' + observacoes P = Paragraph(observacoes, styles['Normal']) - w, h = P.wrap(92 * mm, 32 * mm) + w, h = P.wrap(128 * mm, 32 * mm) altura = (self.height - self.nlin - 5) * mm P.drawOn(self.canvas, (self.nLeft + 1) * mm, altura - h) self.nlin += 36 diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index bf1cc8b..b91c5e8 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -266,6 +266,7 @@ {% with imposto = det.imposto %} {{ imposto.vTotTrib }} + {% if imposto.ICMS is defined %} {% if imposto.ICMS.CST == '00' -%} @@ -529,37 +530,58 @@ {% endif %} - {% if NFe.infNFe.ide.mod != '65' %} - - {{ imposto.IPI.clEnq }} - {{ imposto.IPI.CNPJProd }} - {{ imposto.IPI.cSelo }} - {{ imposto.IPI.qSelo }} - {{ imposto.IPI.cEnq }} - {% if imposto.IPI.CST in ('00', '49', '50', '99') %} - - {{ imposto.IPI.CST }} - {{ imposto.IPI.vBC }} - {{ imposto.IPI.pIPI }} - {{ imposto.IPI.qUnid }} - {{ imposto.IPI.vUnid }} - {{ imposto.IPI.vIPI }} - - {% endif %} - {% if imposto.IPI.CST in ('01', '02', '03', '04', '51', '52', '53', '54', '55') %} - - {{ imposto.IPI.CST }} - - {% endif %} - - {% if imposto.II is defined %} - - {{ imposto.II.vBC }} - {{ imposto.II.vDespAdu }} - {{ imposto.II.vII }} - {{ imposto.II.vIOF }} - {% endif %} + {% if NFe.infNFe.ide.mod != '65' and imposto.IPI is defined %} + + {{ imposto.IPI.clEnq }} + {{ imposto.IPI.CNPJProd }} + {{ imposto.IPI.cSelo }} + {{ imposto.IPI.qSelo }} + {{ imposto.IPI.cEnq }} + {% if imposto.IPI.CST in ('00', '49', '50', '99') %} + + {{ imposto.IPI.CST }} + {{ imposto.IPI.vBC }} + {{ imposto.IPI.pIPI }} + {{ imposto.IPI.qUnid }} + {{ imposto.IPI.vUnid }} + {{ imposto.IPI.vIPI }} + + {% endif %} + {% if imposto.IPI.CST in ('01', '02', '03', '04', '51', '52', '53', '54', '55') %} + + {{ imposto.IPI.CST }} + + {% endif %} + + {% if imposto.II is defined %} + + {{ imposto.II.vBC }} + {{ imposto.II.vDespAdu }} + {{ imposto.II.vII }} + {{ imposto.II.vIOF }} + + {% endif %} + {% endif %} + {% if imposto.ISSQN is defined %} + + {{ imposto.ISSQN.vBC }} + {{ imposto.ISSQN.vAliq }} + {{ imposto.ISSQN.vISSQN }} + {{ imposto.ISSQN.cMunFG }} + {{ imposto.ISSQN.cListServ }} + {{ imposto.ISSQN.vDeducao }} + {{ imposto.ISSQN.vOutro }} + {{ imposto.ISSQN.vDescIncond }} + {{ imposto.ISSQN.vDescCond }} + {{ imposto.ISSQN.vDeducao }} + {{ imposto.ISSQN.indISS }} + {{ imposto.ISSQN.cServico }} + {{ imposto.ISSQN.cMun }} + {{ imposto.ISSQN.cPais }} + {{ imposto.ISSQN.nProcesso }} + {{ imposto.ISSQN.indIncentivo }} + {% endif %} {% if imposto.PIS.CST in ('01', '02') %} @@ -637,33 +659,13 @@ {% endif %} {% if imposto.COFINSST is defined %} - + {{ imposto.COFINSST.vBC }} {{ imposto.COFINSST.pCOFINS }} {{ imposto.COFINSST.qBCProd }} {{ imposto.COFINSST.vAliqProd }} {{ imposto.COFINSST.vCOFINS }} - - {% endif %} - {% if imposto.ISSQN is defined %} - - {{ imposto.ISSQN.vBC }} - {{ imposto.ISSQN.vAliq }} - {{ imposto.ISSQN.vISSQN }} - {{ imposto.ISSQN.cMunFG }} - {{ imposto.ISSQN.cListServ }} - {{ imposto.ISSQN.vDeducao }} - {{ imposto.ISSQN.vOutro }} - {{ imposto.ISSQN.vDescIncond }} - {{ imposto.ISSQN.vDescCond }} - {{ imposto.ISSQN.vDeducao }} - {{ imposto.ISSQN.indISS }} - {{ imposto.ISSQN.cServico }} - {{ imposto.ISSQN.cMun }} - {{ imposto.ISSQN.cPais }} - {{ imposto.ISSQN.nProcesso }} - {{ imposto.ISSQN.vDeducao }} - + {% endif %} {% if imposto.ICMSUFDest is defined %} @@ -830,8 +832,8 @@ {{ pag.card.cAut }} {% endif %} - {{ pag.vTroco }} + {{ pag.vTroco }} {% endfor %} {% endif %} @@ -870,6 +872,10 @@ {% endif %} + + {{ NFe.infNFe.qrCode }} + {{ NFe.infNFe.urlChave }} + {% endfor %} diff --git a/pytrustnfe/nfse/dsf/__init__.py b/pytrustnfe/nfse/dsf/__init__.py index df4ce4a..ecca317 100644 --- a/pytrustnfe/nfse/dsf/__init__.py +++ b/pytrustnfe/nfse/dsf/__init__.py @@ -20,8 +20,7 @@ def _render(certificado, method, **kwargs): if type(xml_send) != str: xml_send = etree.tostring(xml_send) - - return xml_send + return xml_send.decode() def _get_url(**kwargs): @@ -33,17 +32,18 @@ def _get_url(**kwargs): urls = { # Belém - PA - '2715': 'http://www.issdigitalbel.com.br/WsNFe2/LoteRps.jws', + '2715': 'http://www.issdigitalbel.com.br/WsNFe2/LoteRps.jws?wsdl', # Sorocaba - SP - '7145': 'http://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws', + '7145': 'http://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws?wsdl', # Teresina - PI - '1219': 'http://www.issdigitalthe.com.br/WsNFe2/LoteRps.jws', + '1219': 'http://www.issdigitalthe.com.br/WsNFe2/LoteRps.jws?wsdl', # Campinas - SP '6291': 'http://issdigital.campinas.sp.gov.br/WsNFe2/LoteRps.jws?wsdl', # Uberlandia - MG - '5403': 'http://udigital.uberlandia.mg.gov.br/WsNFe2/LoteRps.jws', + '5403': 'http://udigital.uberlandia.mg.gov.br/WsNFe2/LoteRps.jws?wsdl', # São Luis - MA - '0921': 'https://stm.semfaz.saoluis.ma.gov.br/WsNFe2/LoteRps?wsdl', + '0921': + 'http://sistemas.semfaz.saoluis.ma.gov.br/WsNFe2/LoteRps.jws?wsdl', # Campo Grande - MS '2729': 'http://issdigital.pmcg.ms.gov.br/WsNFe2/LoteRps.jws?wsdl', } diff --git a/pytrustnfe/nfse/dsf/templates/enviar.xml b/pytrustnfe/nfse/dsf/templates/enviar.xml index 7e4b178..8ced990 100644 --- a/pytrustnfe/nfse/dsf/templates/enviar.xml +++ b/pytrustnfe/nfse/dsf/templates/enviar.xml @@ -18,14 +18,12 @@ {% for rps in nfse.lista_rps -%} {{ rps.assinatura }} - {{ rps.prestador.inscricao_municipal }} - + {{ rps.prestador.inscricao_municipal }} {{ rps.prestador.razao_social }} RPS {{ rps.serie }} {{ rps.numero }} - {{ rps.data_emissao|format_datetime }} - + {{ rps.data_emissao|format_datetime }} {{ rps.situacao }} 0 @@ -34,27 +32,21 @@ {{ rps.serie_prestacao }} {{ rps.tomador.inscricao_municipal }} {{ rps.tomador.cpf_cnpj }} - {{ rps.tomador.razao_social }} - - {{ rps.tomador.tipo_logradouro }} - + {{ rps.tomador.razao_social }} + {{ rps.tomador.tipo_logradouro }} {{ rps.tomador.logradouro }} - {{ rps.tomador.numero }} - + {{ rps.tomador.numero }} {{ rps.tomador.tipo_bairro }} {{ rps.tomador.bairro }} {{ rps.tomador.cidade }} - {{ rps.tomador.cidade_descricao }} - + {{ rps.tomador.cidade_descricao }} {{ rps.tomador.cep }} {{ rps.tomador.email }} {{ rps.codigo_atividade }} {{ rps.aliquota_atividade }} {{ rps.tipo_recolhimento }} - {{ rps.municipio_prestacao }} - - {{ rps.municipio_descricao_prestacao }} - + {{ rps.municipio_prestacao }} + {{ rps.municipio_prestacao_descricao }} {{ rps.operacao }} {{ rps.tributacao }} {{ rps.valor_pis }} diff --git a/pytrustnfe/nfse/floripa/__init__.py b/pytrustnfe/nfse/floripa/__init__.py index a8282d3..817c430 100644 --- a/pytrustnfe/nfse/floripa/__init__.py +++ b/pytrustnfe/nfse/floripa/__init__.py @@ -74,10 +74,10 @@ def _send(certificado, method, **kwargs): "Authorization": "Bearer %s" % kwargs['access_token']} r = requests.post(url, headers=headers, data=xml_send) - response, obj = sanitize_response(r.text.strip().encode('utf-8')) + response, obj = sanitize_response(r.text.strip()) return { 'sent_xml': xml_send, - 'received_xml': response, + 'received_xml': response.encode('utf-8'), 'object': obj, 'status_code': r.status_code, } diff --git a/pytrustnfe/nfse/mga/__init__.py b/pytrustnfe/nfse/mga/__init__.py index ee0cbbc..486b009 100644 --- a/pytrustnfe/nfse/mga/__init__.py +++ b/pytrustnfe/nfse/mga/__init__.py @@ -47,7 +47,7 @@ def _send(certificado, method, **kwargs): client = Client(base_url, transport=transport) response = client.service[method](xml_send) - response, obj = sanitize_response(response.encode('utf-8')) + response, obj = sanitize_response(response) return { 'sent_xml': str(xml_send), 'received_xml': str(response), diff --git a/pytrustnfe/nfse/mga/assinatura.py b/pytrustnfe/nfse/mga/assinatura.py index 3b302fe..aaa48fd 100644 --- a/pytrustnfe/nfse/mga/assinatura.py +++ b/pytrustnfe/nfse/mga/assinatura.py @@ -34,7 +34,7 @@ class Assinatura(object): signed_root = signer.sign( element_to_be_signed, key=key.encode(), cert=cert.encode()) if reference: - element_signed = signed_root.find(".//*[@Id='%s']" % reference) + element_signed = xml_element.find(".//*[@Id='%s']" % reference) signature = signed_root.find( ".//{http://www.w3.org/2000/09/xmldsig#}Signature") diff --git a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml index 6c95398..46cdd74 100644 --- a/pytrustnfe/nfse/mga/templates/CancelarNfse.xml +++ b/pytrustnfe/nfse/mga/templates/CancelarNfse.xml @@ -1,6 +1,6 @@ - + - + {{ cancelamento.numero_nfse }} diff --git a/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml b/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml index d828534..ae35893 100644 --- a/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml +++ b/pytrustnfe/nfse/paulistana/templates/EnvioRPS.xml @@ -46,6 +46,8 @@ {{ rps.tomador.cep }} {{ rps.descricao }} + {{ rps.valor_carga_tributaria }} + {{ rps.fonte_carga_tributaria }} {% endfor %} diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index edf230b..115912b 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -19,7 +19,6 @@ def render_xml(path, template_name, remove_empty, **nfe): nfe = recursively_normalize(nfe) env = Environment( loader=FileSystemLoader(path), extensions=['jinja2.ext.with_']) - env.filters["normalize"] = filters.strip_line_feed env.filters["normalize_str"] = filters.normalize_str env.filters["format_percent"] = filters.format_percent @@ -28,10 +27,13 @@ def render_xml(path, template_name, remove_empty, **nfe): env.filters["comma"] = filters.format_with_comma template = env.get_template(template_name) - xml = template.render(**nfe) + xml = template.render(**nfe).replace('\n', '') parser = etree.XMLParser(remove_blank_text=True, remove_comments=True, strip_cdata=False) root = etree.fromstring(xml, parser=parser) + for element in root.iter("*"): # remove espaços em branco + if element.text is not None and not element.text.strip(): + element.text = None if remove_empty: context = etree.iterwalk(root) for dummy, elem in context: @@ -39,9 +41,6 @@ def render_xml(path, template_name, remove_empty, **nfe): if recursively_empty(elem): parent.remove(elem) return root - for element in root.iter("*"): # remove espaços em branco - if element.text is not None and not element.text.strip(): - element.text = None return etree.tostring(root, encoding=str) diff --git a/setup.py b/setup.py index 42eeebc..2943dee 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "0.10.7" +VERSION = "1.0.18" setup( diff --git a/tests/XMLs/paulistana_signature.xml b/tests/XMLs/paulistana_signature.xml index c4f8cbc..70d26dc 100644 --- a/tests/XMLs/paulistana_signature.xml +++ b/tests/XMLs/paulistana_signature.xml @@ -1,4 +1,4 @@ -12345678901234false2016-08-292016-08-291E4fpHYkQa7Naxn6IKGb7NwwZu5tPk/KXJ9hCwtZgq0xvKS450aQqqBL+7Iv46lTgqrSMu7+gLrl+LC1qs/8aT2mbHE8uaVFSbzwZ+sF/BkcT6nsFHLMswEiTAEs95Jb7hN1cC91xqQGRH4buw0TzxHKmhuLJ22WwtG/scxyKtjM=12345611RPS2016-08-29NT0.000.000.000.000.00074985.00false123456Trustcode1Vinicius de Moraes, 4242CorregoFloripaSC88037240Venda de servico +12345678901234false2016-08-292016-08-291E4fpHYkQa7Naxn6IKGb7NwwZu5tPk/KXJ9hCwtZgq0xvKS450aQqqBL+7Iv46lTgqrSMu7+gLrl+LC1qs/8aT2mbHE8uaVFSbzwZ+sF/BkcT6nsFHLMswEiTAEs95Jb7hN1cC91xqQGRH4buw0TzxHKmhuLJ22WwtG/scxyKtjM=12345611RPS2016-08-29NT0.000.000.000.000.00074985.00false123456Trustcode1Vinicius de Moraes, 4242CorregoFloripaSC88037240Venda de servico @@ -8,12 +8,12 @@ -ePJnD6hyDvlJo08PFX8h2TXk0ZM= +IAh8GGlbp/Tnqma+2RZ7UrGZhTc= -GbaQaTEtxuKdRRaadginWPFH5K65ywqEikkwChWO3xX5Kglq8RPm4+LjnpJmuTcE -9I2BVon3GJFh+c/6RKzJPose6FXog2xnCpTOgwA/rks/gKsUAaRlXCPsLcKMKaOj -3eH21RHEyrxBAbdpEUdlEgQWaWzmGq009EiQ544sD6c= +gjkMTCq0uuaX8tkRBlLjgybn8a2O4Axl6HHq1MN8nnEMliERcziU3pa3r1jbghlE +EUyIO8bTZ0V7c05pQvHQgVUHcSo6vHld4ZQNk7JfMfmpez4uxrUeuSrSqSLCwT9W +NmTY9EJ16GyrQNELw+SkYuEFOvqZTU3qjDZkLddQ8bc= MIICMTCCAZqgAwIBAgIQfYOsIEVuAJ1FwwcTrY0t1DANBgkqhkiG9w0BAQUFADBX diff --git a/tests/test_add_qr_code.py b/tests/test_add_qr_code.py deleted file mode 100644 index 77a24f4..0000000 --- a/tests/test_add_qr_code.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8-*- -# © 2016 Alessandro Fernandes Martini -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import unittest -# from lxml import etree -from pytrustnfe.nfe import _add_qrCode - - -class TestAddQRCode(unittest.TestCase): - def setUp(self): - self.xml_sem_qrcode = open('tests/xml_sem_qrcode.xml', 'r') - self.xml_com_qrcode = open('tests/xml_com_qrcode.xml', 'r') - dhEmi = '2016-11-09T16:03:25-00:00' - chave_nfe = 'NFe35161121332917000163650010000000011448875034' - ambiente = 2 - valor_total = '324.00' - icms_total = '61.56' - cid_token = '000001' - csc = '123456789' - estado = '35' - total = {'vNF': valor_total, 'vICMS': icms_total} - infnfe = {'ide': {'dhEmi': dhEmi}, 'Id': chave_nfe, 'total': total, - 'codigo_seguranca': {'cid_token': cid_token, 'csc': csc}} - infnfe = {'infNFe': infnfe} - self.kwargs = {} - self.kwargs['ambiente'] = ambiente - self.kwargs['estado'] = estado - self.kwargs['NFes'] = [infnfe] - - def test_add_qrCode(self): - xml_init = self.xml_sem_qrcode.read() - xml_end = _add_qrCode(xml_init, **self.kwargs) - self.assertEqual(xml_end, self.xml_com_qrcode.read()) diff --git a/tests/test_servidores.py b/tests/test_servidores.py index 3a492df..a072f97 100644 --- a/tests/test_servidores.py +++ b/tests/test_servidores.py @@ -16,10 +16,9 @@ url_qrcode_homologacao_sp = 'https://homologacao.nfce.fazenda.sp.gov.br/NFCECons url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl' -url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx' +url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl' -url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadcon\ -sultacadastro2.asmx' +url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl' url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsulta\ cadastro2.asmx?wsdl' diff --git a/tests/xml_com_qrcode.xml b/tests/xml_com_qrcode.xml deleted file mode 100644 index 22cf1ef..0000000 --- a/tests/xml_com_qrcode.xml +++ /dev/null @@ -1,189 +0,0 @@ - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - - \ No newline at end of file diff --git a/tests/xml_sem_qrcode.xml b/tests/xml_sem_qrcode.xml deleted file mode 100644 index 3352a22..0000000 --- a/tests/xml_sem_qrcode.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - -