use Suot\Fiscal\Core\Exception\InfrastructureException;
use Suot\Fiscal\Core\Result\RetryMode;
use Suot\Fiscal\Core\ValueObject\Uf;
use Suot\Fiscal\Cte\ValueObject\CteEpecPayload;
use Suot\Fiscal\Cte\ValueObject\CteEpecTaker;
$payload = new CteEpecPayload(
justification: 'Indisponibilidade operacional do autorizador em homologacao',
icmsValue: '12.00',
totalValue: '100.00',
cargoValue: '1000.00',
taker: new CteEpecTaker(
role: '0',
uf: 'RS',
document: $cnpjTomador,
ie: $ieTomador,
),
originUf: 'RS',
destinationUf: 'SP',
);
try {
$epecResult = $cte->registerEpec()
->forOperation('epec-1')
->inHomologation()
->issuerUf(new Uf('RS'))
->accessKey($chave44)
->emitterCnpj($cnpj)
->epec($payload)
->handle();
} catch (InfrastructureException $e) {
$failure = $e->toFailure('register_epec');
// Host: alertar; filar retry conforme $failure->retryPolicy
throw $e;
}
if (! $epecResult->isRejected()) {
// Host: persistir protocolo do EPEC, responseXml, accessKey, operationId
}
if ($epecResult->isRejected()) {
$failure = $epecResult->failure();
$policy = $epecResult->retryPolicy();
match ($policy?->mode) {
RetryMode::AfterCorrection => /* corrigir payload/chave e registrar de novo */,
RetryMode::AfterDelay, RetryMode::Immediate => /* filar conforme política */,
RetryMode::QueryBeforeRetry => /* reconciliar antes de reenviar */,
RetryMode::Never, null => /* definitivo; não reenviar */,
};
}