O quê / quando
CT-e autorizado com entrega concluída. Datas no fusoAmerica/Sao_Paulo — dhEntrega futura ou em UTC costuma gerar rejeição (ex.: cStat 872).
Exemplo
use Suot\Fiscal\Core\Exception\InfrastructureException;
use Suot\Fiscal\Core\Result\RetryMode;
use Suot\Fiscal\Cte\ValueObject\CteProofOfDeliveryPayload;
$now = (new DateTimeImmutable('now', new DateTimeZone('America/Sao_Paulo')))
->format('Y-m-d\TH:i:sP');
$payload = new CteProofOfDeliveryPayload(
authorizationProtocol: $nProt,
deliveredAt: $now,
receiverDocument: '12345678901',
receiverName: 'Recebedor Exemplo',
deliveryHash: base64_encode(hash('sha1', $chave44 . $now, true)),
hashGeneratedAt: $now,
deliveredNfeKeys: [], // chaves NF-e entregues, se houver
);
try {
$result = $cte->proofOfDelivery()
->forOperation('pod-1')
->inHomologation()
->accessKey($chave44)
->emitterCnpj($cnpj)
->proofOfDelivery($payload)
->handle();
} catch (InfrastructureException $e) {
$failure = $e->toFailure('proof_of_delivery');
// Host: alertar; QueryBeforeRetry se timeout após envio
throw $e;
}
if (! $result->isRejected()) {
// Host: persistir protocolNumber do evento, responseXml, accessKey, operationId
}
if ($result->isRejected()) {
$failure = $result->failure();
$policy = $result->retryPolicy();
match ($policy?->mode) {
RetryMode::AfterCorrection => /* corrigir payload (datas America/Sao_Paulo) e tentar de novo */,
RetryMode::QueryBeforeRetry => /* reconciliar eventos antes de reenviar */,
RetryMode::AfterDelay, RetryMode::Immediate => /* filar conforme política */,
RetryMode::Never, null => /* definitivo; não reenviar */,
};
}
ProofOfDeliveryCteResult — isRejected(), failure(), protocolNumber do evento.
