Resultados e confirmação fiscal
Uma operação pode retornar um FiscalResult com sucesso() === false em vez de lançar exceção. Avalie tanto o resultado quanto os erros. sucesso() isolado e a palavra AUTORIZADO isolada não bastam para liberar um documento na aplicação.
Classificação conservadora
$resultado = $emissor->gerarXml($documento);
$estado = $resultado->estado();
$status = $resultado->statusEnvio();
$incerto = $resultado->resultadoDesconhecido();
echo json_encode($resultado, JSON_THROW_ON_ERROR), PHP_EOL;statusEnvio() | Significado operacional |
|---|---|
nao_enviado | Operação local coerente concluída ou erro explicitamente anterior ao envio |
autorizado | Provas coerentes para a operação: autorização da nota ou confirmação do evento/inutilização |
rejeitado | Resposta final de rejeição/denegação reconhecida de forma conservadora |
resultado_incerto | Informação incompleta, contraditória, intermediária ou insuficiente para concluir |
O rótulo autorizado abrange também evento cancelado, CC-e registrada e faixa inutilizada; ele precisa ser interpretado junto com comando() e estado(). Não significa que toda operação seja uma nova NF-e autorizada.
Provas exigidas pela revisão
| Operação | Condições principais para confirmação |
|---|---|
gerarXml | Sucesso, XML_GERADO, sem indicação de envio; classificação nao_enviado |
validar | Sucesso, VALIDADO, sem indicação de envio; nao_enviado |
assinar | Sucesso, ASSINADO, sem indicação de envio; nao_enviado |
recuperarXml | Sucesso, XML_RECUPERADO, cStat=100, chave e protocolo coerentes, XML válido no frame e envioIniciado=false; não retransmite |
transmitir / consultar | Sucesso, AUTORIZADO, cStat 100 ou 150, chave com 44 dígitos e protocolo com 15 dígitos; transmissão não pode afirmar envioIniciado=false |
cancelar | Sucesso, CANCELADO, cStat 135 ou 136, chave e protocolo coerentes, sem envioIniciado=false |
cartaCorrecao | Sucesso, EVENTO_REGISTRADO, cStat 135, chave e protocolo coerentes, sem envioIniciado=false |
inutilizar | Sucesso, INUTILIZADO, cStat 102, protocolo coerente, sem envioIniciado=false |
Em denegação, o classificador reconhece DENEGADO com 110, 301 ou 302 e sucesso=false. Na rejeição final, exige REJEITADO, código inteiro válido e exclui estados/códigos não finais ou contraditórios definidos no código. Esses números descrevem a implementação fixada; não substituem uma tabela fiscal vigente da SEFAZ.
PENDENTE, INDETERMINADO, lote/recibo intermediário, duplicidade, serviço indisponível, retorno incompleto e consulta “não localizado” permanecem incertos quando não há prova final coerente. O projeto testa explicitamente que cStat=217 em CONSULTADO não autoriza retransmissão.
Acesso a dados e logs
json_encode($resultado) e debug mostram apenas sucesso, estado, codigo, cStat, envioIniciado e statusEnvio, quando presentes. O payload completo pode incluir xmlBase64, chave, protocolo, recibo e xMotivo; seu acesso é explícito por data(), xml() e retornoOriginal(). Este último preserva os campos ACBr disponíveis no frame; não exporta SOAP/RetWS bruto nem faz nova consulta. Veja recuperação.
$dados = $resultado->data(); // acesso sensível; persistência privada e controlada
$protocolo = $dados['protocolo'] ?? null;
$chave = $dados['chave'] ?? null;
$xml = $resultado->xml();Não despeje data(), XML ou configurações em logs de aplicação, telas públicas ou relatórios de erro. Protocolo, chave e XML têm utilidade de recuperação, mas devem ficar em armazenamento da aplicação com controle de acesso e retenção definidos.
Persistência e próxima decisão
Associe a resposta à intenção original: ambiente, modelo, chave, evento/faixa, versão do pacote e horário da aplicação. Confira a coerência entre o retorno e os identificadores esperados antes de mudar o estado do seu processo de negócio. Uma flag positiva não substitui essa correlação.
Se houver dúvida ou falha, conserve resultado_incerto e siga o protocolo de recuperação. Evite uma camada de retry genérico de HTTP/jobs em torno de operações fiscais com efeito.