use Suot\Fiscal\Core\Exception\InfrastructureException;
use Suot\Fiscal\Core\ValueObject\Uf;
use Suot\Fiscal\Cte\Data\Simplified\SimplifiedCteCargoQuantity;
use Suot\Fiscal\Cte\Data\Simplified\SimplifiedCteDetail;
use Suot\Fiscal\Cte\Data\Simplified\SimplifiedCteDetailComponent;
use Suot\Fiscal\Cte\Data\Simplified\SimplifiedCteDetailNfe;
use Suot\Fiscal\Cte\Data\Simplified\SimplifiedCteTaker;
try {
$result = $cte->issueSimplified()
->forOperation('ot-consolidada-42-simp')
->inHomologation()
->issuedIn(new Uf('TO'))
->withIdentification(
cfop: '6353',
natOp: 'PRESTACAO DE SERVICO DE TRANSPORTE',
serie: '1',
number: '42',
municipalityCode: '1721000',
municipalityName: 'Palmas',
originUf: 'TO',
destinationUf: 'SP',
)
->issuedBy(
cnpj: '48014145000178',
ie: '295269103',
name: 'CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
tradeName: 'EMITENTE HOMOLOG',
street: 'Rua Teste',
number: '100',
district: 'Centro',
zip: '77000000',
)
->takenBy(new SimplifiedCteTaker(
role: '4',
ieIndicator: '2',
cnpj: '48014145000178',
ie: 'ISENTO',
name: 'CTE EMITIDO EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
street: 'Rua Tomador',
number: '400',
district: 'Centro',
municipalityCode: '3550308',
municipalityName: 'Sao Paulo',
zip: '01000000',
uf: 'SP',
))
->withCargo(
'1000.00',
'MERCADORIAS DIVERSAS',
new SimplifiedCteCargoQuantity('01', '03', '100.0000'),
)
->withDetail(new SimplifiedCteDetail(
itemNumber: '1',
originMunicipalityCode: '1721000',
originMunicipalityName: 'Palmas',
destinationMunicipalityCode: '3550308',
destinationMunicipalityName: 'Sao Paulo',
serviceValue: '100.00',
receivableValue: '100.00',
components: [new SimplifiedCteDetailComponent('FRETE VALOR', '100.00')],
linkedNfes: [new SimplifiedCteDetailNfe($chaveNfe44)],
))
->withRoadModal('12345678')
->withTotals('100.00', '100.00', '12.00')
->handle();
} catch (InfrastructureException $e) {
$failure = $e->toFailure('issue');
// Host: alertar; filar retry conforme $failure->retryPolicy
throw $e;
}
if ($result->isAuthorized()) {
// Host: persistir XML, protocolo, chave; não reemitir o mesmo operationId
} elseif ($result->isRejected()) {
$error = $result->failure();
// Host: corrigir dados ou cadastro; não reenviar cego
} elseif ($result->isProcessing()) {
$policy = $result->retryPolicy();
// Host: consultar por chave antes de retry se a política exigir
}