Consulta

Use este fluxo quando a NFSe já foi emitida, mas você precisa puxar o registro para sua aplicação cliente.

Quando usar cada método

Método

Quando usar

query_nfse()

Você já tem a chave de acesso

query_nfse_by_dps()

Você só tem o id_dps

has_nfse_by_dps()

Você quer só saber se a DPS já gerou NFSe

recover_nfse_by_dps()

Você perdeu a chave e quer tentar recuperar tudo de uma vez

Exemplo por DPS

Aqui, nota é o registro que já guarda o id_dps depois da emissão.

from pynfse_nacional import NFSeClient

client = NFSeClient(
    cert_path="/caminho/para/certificado.pfx",
    cert_password="senha",
    ambiente="homologacao",
)

def consultar_nfse_pendente(client: NFSeClient, nota) -> None:
    dps_id = nota.id_dps

    if client.has_nfse_by_dps(dps_id):
        result = client.query_nfse_by_dps(dps_id)
        print(result.chave_acesso)
        print(result.nfse_number)

Exemplo por chave

result = client.query_nfse("13026032242713924000185000000000010626030410654816")

print(result.status)
print(result.valor_servicos)
print(result.prestador_cnpj)

Exemplo em uma aplicação real

Num sistema de faturamento, a consulta costuma servir para fechar uma emissão que ficou sem resposta. O fluxo abaixo pega o resultado e grava no banco.

Neste exemplo, nota é o objeto persistido pela sua aplicação.

from pynfse_nacional import NFSeClient


def sincronizar_nfse_por_dps(client: NFSeClient, nota) -> str:
    outcome = client.recover_nfse_by_dps(nota.id_dps)

    if outcome.status == "processing":
        return "A DPS ainda está em processamento."

    if outcome.status == "error":
        raise outcome.error

    nfse = outcome.result
    registro = {
        "dps_id": nota.id_dps,
        "chave_acesso": nfse.chave_acesso,
        "numero_nfse": nfse.nfse_number,
        "status": nfse.status,
        "xml_nfse": nfse.xml_nfse,
        "ibscbs": nfse.ibscbs,
    }
    salvar_registro_no_banco(registro)
    return f"NFSe {nfse.nfse_number} salva com sucesso."

recover_nfse_by_dps junta a checagem por HEAD com a consulta completa. Ele é útil quando submit_dps falhou, mas a SEFIN talvez tenha processado a DPS.

outcome = client.recover_nfse_by_dps(nota.id_dps)

if outcome.status == "success":
    print(outcome.result.chave_acesso)
elif outcome.status == "processing":
    print("A DPS ainda não virou NFSe.")
else:
    print(outcome.error)

O que a resposta traz

NFSeQueryResult inclui:

  • chave de acesso

  • número da NFSe

  • situação

  • data de emissão

  • valor dos serviços

  • CNPJ do prestador

  • documento do tomador

  • XML da NFSe quando a API devolver o corpo

  • IBSCBS extraído do XML, quando existir