Erro `NfseXmlNotFound` ao tentar baixar o XML da NFS-e

Ontem ocorreu possivelmente o erro que estava ocorrendo nas outras notas:

{
    "error": {
        "code": "NfseXmlNotFound",
        "message": "Xml não encontrado."
    }
}

Me parece ser um erro na api.
Aí hoje de manhã fui consultar a situação da nota, e já constava como autorizada.
Esse comportamento relatando esse erro é normal?

Id: nfs_3a0fe95611ab43f8a38a95c4b213e8d9

Boa tarde, @rafael1.

Esse comportamento é esperado quando tenta-se obter o XML de uma NFS-e que não está ou ainda não foi autorizada.

Você tem certeza que a requisição ao endpoint GET /nfse/{id}/xml foi feita após a autorização da nota?

Acredito que esteja ok, porque já uso para passo fundo e novo hamburgo.
O código está assim:

$apiInstance = new \NuvemFiscal\Api\NfseApi(new \GuzzleHttp\Client(), $config);
$id = $nfse->CDAPIID;

$statusResult = $apiInstance->sincronizarNfse($id);
if ($statusResult->getStatus() != 'sincronizado')
    return ['message' => "Status da nota não está como sincronizado: " . $statusResult->getStatus()];

$statusResult = $apiInstance->consultarNfse($id);
$status = $statusResult->getStatus();

$messages = NFSeService::getResponseMessages($statusResult->getMensagens());
if ($messages)
    throw new \Exception($messages);

if ($status == 'autorizada') {
    ...

Estou com a impressão que esta prefeitura está demorando em alguma das etapas, o que faz com que gere aquele erro.

Estou analisando melhor, e o registro no banco de dados é atualizado depois da nota estar autorizada, usando as seguintes funções:

$updatedData['NRSERIE'] = $statusResult->getDps()->getSerie();
$updatedData['NRRPS'] = $statusResult->getDps()->getNDps();
$updatedData['NRNFSE'] = $statusResult->getNumero();
$updatedData['CDNFSEVERIFICACAO'] = $statusResult->getCodigoVerificacao();

E desses 4 campos somente o terceiro fica em branco, usando a função $statusResult->getNumero().

Por acaso existe algum processamento assíncrono na api que atualiza esse campo da nota posteriormente?

Depois de executar esse código acima ainda chamo a função $apiInstance->baixarXmlNfse($id), e me parece que é aqui que ocorre o erro.
Se executar esses mesmos testes no ambiente de homologação não ocorre problema nenhum…

A nota enviada ontem tem o id nfs_3a0fee6d1e554f9384269b426d8522da e deu o mesmo erro:
{ "error": { "code": "NfseXmlNotFound", "message": "Xml não encontrado." }}.

Sim, o endpoint de emissão de NFS-e da Nuvem Fiscal é assíncrono.

Por enquanto alterei o sistema para só chamar a função baixarXmlNfse se a função getNumero retornar com algum valor. Até então está funcionando, vou seguir monitorando.

Boa tarde, @rafael1.

O ideal é verificar se a nota está autorizada.

Então, o erro inicial que postei só ocorria nas linhas de código abaixo do teste de estar autorizada, então sim, sempre estava como autorizada quando entrava lá.

Não faz sentido.

Você tem certeza que a requisição ao endpoint GET /nfse/{id}/xml estava sendo feita após a nota estar com o status autorizada?

Pois é, não faz sentido mesmo, por isso que questionei no chamado.

Tenho certeza, porque as chamadas de função estão assim:

emitirNfseDps;
baixarXmlDps;
consultarNfse;
if ($status == 'autorizada') {
  baixarXmlNfse;
}

Por uns 2 ou 3 dias tinha parado de ocorrer o problema, aí na terça ocorreu de novo. Vou verificar os logs para ver se aparece mais alguma informação relevante.

Boa tarde, o problema voltou a ocorrer, e como estava habilitado para salvar os logs, acredito que encontrei onde está o problema.
Segue os logs:

[2024-01-15 22:00:44] production.INFO: consultarNfse call 3 {"id":"nfs_3a10271beed64276bfcbfde0bcc37521"} 
[2024-01-15 22:00:44] production.INFO: consultarNfse result 3 {"statusResult":{"NuvemFiscal\\Model\\Nfse":{"id":"nfs_3a10271beed64276bfcbfde0bcc37521","created_at":"2024-01-16T01:00:29+00:00","status":"processando","ambiente":"producao","referencia":"28_240115_220028","DPS":{"serie":"S","nDPS":"47"},"mensagens":[]}},"status":"processando"} 
[2024-01-15 22:00:46] production.INFO: consultarNfse call 4 {"id":"nfs_3a10271beed64276bfcbfde0bcc37521"} 
[2024-01-15 22:00:46] production.INFO: consultarNfse result 4 {"statusResult":{"NuvemFiscal\\Model\\Nfse":{"id":"nfs_3a10271beed64276bfcbfde0bcc37521","created_at":"2024-01-16T01:00:29+00:00","status":"autorizada","numero":"47","codigo_verificacao":"5002766","link_url":"link_removido_xxxx","data_emissao":"2024-01-16T01:00:45+00:00","ambiente":"producao","referencia":"28_240115_220028","DPS":{"serie":"S","nDPS":"47"},"mensagens":[]}},"status":"autorizada"} 
[2024-01-16 22:00:09] production.INFO: emitirNfseDps call {"updatedData":{"CDAPIREFERENCIA":"29_240116_220009"}} 
[2024-01-16 22:00:10] production.INFO: emitirNfseDps result {"updatedData":{"CDAPIREFERENCIA":"29_240116_220009","CDAPIID":"nfs_3a102c41ff8c4c66ac2c17beb5280926"},"result":{"NuvemFiscal\\Model\\Nfse":{"id":"nfs_3a102c41ff8c4c66ac2c17beb5280926","created_at":"2024-01-17T01:00:10+00:00","status":"processando","ambiente":"producao","referencia":"29_240116_220009","DPS":{},"mensagens":[]}}} 
[2024-01-16 22:00:22] production.INFO: consultarNfse result 3 {"statusResult":{"NuvemFiscal\\Model\\Nfse":{"id":"nfs_3a102c41ff8c4c66ac2c17beb5280926","created_at":"2024-01-17T01:00:10+00:00","status":"autorizada","codigo_verificacao":"43524355930001129000S000000048066401239","link_url":"link_removido_xxxx","data_emissao":"2024-01-17T01:00:22+00:00","ambiente":"producao","referencia":"29_240116_220009","DPS":{"serie":"S","nDPS":"48"},"mensagens":[]}},"status":"autorizada"} 
[2024-01-17 11:50:33] production.INFO: consultarNfse result 0 {"statusResult":{"NuvemFiscal\\Model\\Nfse":{"id":"nfs_3a102c41ff8c4c66ac2c17beb5280926","created_at":"2024-01-17T01:00:10+00:00","status":"autorizada","numero":"48","codigo_verificacao":"66401239","link_url":"link_removido_xxxx","data_emissao":"2024-01-17T01:00:22+00:00","ambiente":"producao","referencia":"29_240116_220009","DPS":{"serie":"S","nDPS":"48"},"mensagens":[]}},"status":"autorizada"}

Análise do log:

  1. faço a chamada da função consultarNfse a cada 2 segundos, e enquanto o status estiver como processando, faço novamente, até chegar em 10 execuções;
  2. no caso da nota do dia 15 foi necessário fazer 4 consultas até o status ficar como autorizada;
  3. no dia 16 ocorreu o problema, na linha consultarNfse result 3 e pelo que vi a diferença está no campo faltante numero, que deveria aparecer depois de status, como ocorre no dia 15;
  4. no dia 17 o pessoal fez a consulta da mesma nota, e já na primeira tentativa retornou como autorizada, e trouxe preenchido o campo numero.

Esse comportamento de não trazer preenchido é algo que pode ser corrigido na api? Ou era para ser assim mesmo?
Porque para mim não faz muito sentido a api devolver que a nota está autorizada, mas não informar o número dela.

E mais um detalhe, quando ocorre o caso de estar o status como autorizado, e estar sem o número da nota, eu chamo a função sincronizarNfse, e a api retorna o erro conforme a imagem abaixo:

Mais uma coisa que notei agora: quando o número da nota não vem preenchido, o código de verificação é bem maior do que nos outros casos, onde retornou o número da nota.

Está em análise esta situação?

Boa tarde, @rafael1.

O comportamento inconsistente foi identificado e corrigido.

Caso detecte o problema novamente, favor nos avisar.

Certo, muito obrigado. Até ajustei meu sistema para detectar esse comportamento, e por enquanto não apareceu mais.

1 curtida