Skip to content

Código E185 na geração de NFS-e #437

@chrismaille

Description

@chrismaille
  • Python 3.12.11
  • cryptography 43.0.3
  • lxml 5.4.0
  • pyopenssl 25.1.0
  • requests 2.32.4
  • signxml 4.1.0
  • PyNFe 0.60
  • suds-community 1.2.0
  • PyXB-X 1.2.6.3

Script utilizado, baseado na Wiki: https://github.com/TadaSoftware/PyNFe/wiki/Emiss%C3%A3o-de-NFSe-(lote-Ginfes)

import click
import os
from pynfe.processamento.serializacao import SerializacaoNfse
from pynfe.processamento.assinatura import AssinaturaA1
from pynfe.processamento.comunicacao import ComunicacaoNfse
from pynfe.entidades.cliente import Cliente
from pynfe.entidades.emitente import Emitente
from pynfe.entidades.servico import Servico
from pynfe.entidades.notafiscal import NotaFiscalServico
from pynfe.utils.flags import CODIGO_BRASIL
from pynfe.utils import obter_codigo_por_municipio
from pynfe.utils import etree

import os
import datetime
from decimal import Decimal


@click.command
def create_using_pynfe():
    # prestador
    emitente = Emitente(cnpj="99999999999999", inscricao_municipal="000000")

    # tomador
    cliente = Cliente(
        razao_social="NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
        tipo_documento="CNPJ",  # CPF ou CNPJ
        numero_documento="99999999999999",  # apenas os numero do CPF ou CNPJ
        inscricao_municipal="1234",  # opcional
        endereco_logradouro="Rua tal",
        endereco_numero="0",
        endereco_complemento="Ao lado de lugar nenhum",  # opcional
        endereco_bairro="Centro",
        endereco_cod_municipio="123",
        endereco_uf="PR",
        endereco_cep="87704000",
        endereco_pais=CODIGO_BRASIL,
        endereco_telefone="12365478945",  # opcional
        email="[email protected]",  # opcional
    )

    # serviço
    servico = Servico(
        valor_servico=Decimal("100.00"),
        iss_retido=1,  # 1 - Sim; 2 - Não
        item_lista="0101",
        discriminacao="Mensalidade",
        codigo_municipio=obter_codigo_por_municipio("Paranavaí", "PR"),
        # Dados opcionais
        codigo_cnae=6201501,
        codigo_tributacao_municipio="1234",
        valor_deducoes=Decimal("10.00"),
        valor_pis=Decimal("10.00"),
        valor_confins=Decimal("10.00"),
        valor_inss=Decimal("10.00"),
        valor_ir=Decimal("10.00"),
        valor_csll=Decimal("10.00"),
        valor_iss=Decimal("10.00"),
        valor_iss_retido=Decimal("10.00"),
        valor_liquido=Decimal("10.00"),
        outras_retencoes=Decimal("10.00"),
        base_calculo=Decimal("10.00"),
        aliquota=Decimal("10.00"),
        desconto_incondicionado=Decimal("10.00"),
        desconto_condicionado=Decimal("10.00"),
    )

    # nota
    nota = NotaFiscalServico(
        identificador="50",
        data_emissao=datetime.datetime.now(),
        servico=servico,
        emitente=emitente,
        cliente=cliente,
        # Optante Simples Nacional
        simples=1,  # 1-Sim; 2-Não
        natureza_operacao=1,  # 1 – Tributação no município 2 - Tributação fora do município 3 - Isenção 4 - Imune
        # 5 –Exigibilidade suspensa por decisão judicial 6 – Exigibilidade suspensa por procedimento administrativo
        # regime_especial=1, # Regime Especial de Tributação: 1 – Microempresa municipal 2 - Estimativa
        # 3 – Sociedade de profissionais 4 – Cooperativa 5 - Microempresário Individual (MEI)
        # 6 - Microempresário e Empresa de Pequeno Porte (ME EPP)
        incentivo=2,  # Incentivador Cultural # 1-Sim; 2-Não
        serie="A1",
        tipo="1",
    )

    certificado = "CERTIFICADO.pfx"
    senha = os.getenv("CERTIFICATE_PASSWORD")
    homologacao = True

    # serialização
    serializador = SerializacaoNfse("ginfes")
    xml = serializador.gerar_lote(
        nota
    )  # <---- Retornou um string ao inves do etree.Element

    # assinatura
    a1 = AssinaturaA1(certificado, senha)  # <---- Aqui não passa mais o 'ginfes'
    xml = a1.assinar(etree.fromstring(xml), retorna_string=True)  # <---- retorna etree.Element por padrao, adicionado `retorna_string=True`

    # envio
    con = ComunicacaoNfse(certificado, senha, "ginfes", homologacao)
    envio = con.enviar_lote(xml)

    print(envio)
    # Resposta recebida do servidor
    """
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns3:EnviarLoteRpsResposta xmlns:ns2="http://www.ginfes.com.br/tipos_v03.xsd" 
                               xmlns:ns3="http://www.ginfes.com.br/servico_enviar_lote_rps_resposta_v03.xsd">
        <ListaMensagemRetorno>
            <ns2:MensagemRetorno>
                <ns2:Codigo>E185</ns2:Codigo>
                <ns2:Mensagem>Arquivo de cabeçalho enviado fora da estrutura do arquivo XML de entrada.</ns2:Mensagem>
                <ns2:Correcao>Envie um arquivo de cabeçalho dentro do schema do arquivo XML de entrada.</ns2:Correcao>
            </ns2:MensagemRetorno>
        </ListaMensagemRetorno>
    </ns3:EnviarLoteRpsResposta>
    """


if __name__ == "__main__":
    create_using_pynfe()

Observações:

  • a1 = AssinaturaA1(certificado, senha, "ginfes") como está na Wiki, retornou erro
  • xml = serializador.gerar_lote(nota) retorna um string - a Wiki sugere que ele retona um etree,Element.

No momento nossa hipótese é que as versões das dependências estão gerando algum tipo de conflito (estamos tratando em paralelo os erros de key_file no HTTPSConnection e o redirect 301 que o GINFES faz quando é chamado na URL de envio de lote).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions