Skip to main content
A superfície pública do CT-e é o client Suot\Fiscal\Cte\Application\Cte: monte a intenção e encerre em handle().

Client $cte

use Suot\Fiscal\Cte\Application\Cte;
use Suot\Fiscal\Core\Exception\InfrastructureException;
use Suot\Fiscal\Core\Result\RetryMode;
use Suot\Fiscal\Core\ValueObject\Uf;

try {
    $result = $cte->serviceStatus()
        ->forOperation('status-1')
        ->inHomologation()
        ->issuerUf(new Uf('RS'))
        ->handle();
} catch (InfrastructureException $e) {
    $failure = $e->toFailure('service_status');
    // Host: alertar; filar retry conforme $failure->retryPolicy
    throw $e;
}

if ($result->isOperational()) {
    // Host: seguir para emissão ou outras operações
} else {
    $failure = $result->failure();
    $policy = $result->retryPolicy();
    match ($policy?->mode) {
        RetryMode::AfterDelay, RetryMode::Immediate => /* filar e tentar de novo */,
        RetryMode::Never, null => /* não emitir; tratar indisponibilidade */,
        default => /* seguir orientação do recoveryGuide */,
    };
}
Portas no mesmo client: issue(), validate(), cancel(), correct(), serviceStatus(), byAccessKey(), authorizationProtocol(), downloadProc(), distributeDfe(), registerEpec(), issueInContingency(), eventos de entrega, etc. Namespace: Suot\Fiscal\Cte\Application\Cte. No Laravel, Handlers explícitos são opcionais — ver Laravel Bridge.

O que é @internal

Não use na aplicação hospedeira:
EvitarMotivo
Operation/*Service, *Input, *::execute()Pipeline fiscal interno
*InputMapper, IssueCteCommandBuilder, IssueCteCommandPartsWiring atrás do Handler
CTeBuilder, EmitirCTe*, AutorizarNFe*, AutorizarCte*Não existem na API pública
CteClient como porta principalA porta pública é Cte
Rejeição fiscal válida volta como Result (isRejected(), failure()), não como exception. Exceptions são para infraestrutura, argumentos inválidos e estados impossíveis.

Próximos passos