@sinete/nfe 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -2,33 +2,33 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/build/build.ts", "../src/decimal.ts", "../src/format.ts", "../src/issues.ts", "../src/rtc.ts", "../src/time.ts", "../src/versao-gerada.ts", "../src/build/destinatario.ts", "../src/build/ibscbs.ts", "../src/build/values.ts", "../src/build/icms.ts", "../src/build/nfce.ts", "../src/build/pl.ts", "../src/build/rejeicoes.ts", "../src/build/textos.ts", "../src/build/tributos.ts", "../src/model.ts", "../src/rotulo.ts", "../src/services/client.ts", "../src/services/gzip.ts", "../src/services/outcome.ts", "../src/services/proc.ts", "../src/services/soap.ts", "../src/services/recuperar.ts", "../src/services/resolver.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Montagem da NF-e: entrada do domínio (`DadosNfe`) para o objeto tipado do `@sinete/schemas` no PL vigente, com os\n * derivados e os totais em decimal exato, a chave de acesso e as regras conferidas antes de qualquer serialização. A\n * saída é a string canônica de `<NFe>` ainda sem assinatura, já validada contra o schema; `assinarNfe` insere a\n * `Signature` por splice (ADR 0003) e nada mais toca nela.\n */\n\nimport type { Ambiente, Assinador, ContextoDeTempo, Ocorrencia, Uf } from '@sinete/core';\nimport {\n ErroDeConfiguracao,\n ErroDeValidacao,\n ehUf,\n formatarVerProc,\n relogioFixo,\n tpAmbDoAmbiente,\n ufPorSigla,\n} from '@sinete/core';\nimport { assinarXml, codificarBase64, lerXml, primeiroFilho } from '@sinete/core/xml';\nimport type { ComplexType, EntradaDeVigencia } from '@sinete/schemas';\nimport { ErroSerializacao, serializar, validar } from '@sinete/schemas';\nimport type {\n TNFe_infNFe,\n TNFe_infNFe_det,\n TNFe_infNFe_det_imposto,\n TNFe_infNFe_det_prod,\n TNFe_infNFe_ide_NFref,\n TNFe_infNFe_total_ICMSTot,\n TNFe_infNFe_total_ISSQNtot,\n TTribNFe,\n} from '@sinete/schemas/nfe/PL_010f';\nimport { TIS as TISCt, TNFe_infNFeSupl, TTribNFe as TTribNFeCt } from '@sinete/schemas/nfe/PL_010f';\nimport { lerChaveAcesso, lerCnpj, lerCpf, lerIe, montarChaveAcesso } from '@sinete/validators';\nimport arredondamento from '../data/arredondamento.json' with { type: 'json' };\nimport produtorRural from '../data/produtor-rural.json' with { type: 'json' };\nimport reforma from '../data/reforma.json' with { type: 'json' };\nimport respTecData from '../data/resp-tec.json' with { type: 'json' };\nimport type { RoundingMode } from '../decimal.ts';\nimport { Decimal } from '../decimal.ts';\nimport { D0302, D0302A04, D1104V, D1110V, D1203, D1302, D1302_OPC } from '../format.ts';\nimport { Issues } from '../issues.ts';\nimport type {\n DadosNfe,\n Destinatario,\n DocumentoPessoa,\n Emitente,\n Endereco,\n EnderecoExterior,\n Item,\n Local,\n Referenciada,\n ResponsavelTecnico,\n} from '../model.ts';\nimport type { CalculadoraIbsCbs, PedidoIbsCbsItem } from '../ports.ts';\nimport { calculadoraIbsCbs } from '../rtc.ts';\nimport type { Instante } from '../time.ts';\nimport { deslocamentoDaUf, formatarDh } from '../time.ts';\nimport { VERSAO_PACOTE } from '../versao-gerada.ts';\nimport { conferirDestinatario } from './destinatario.ts';\nimport { decimaisInvalidos, grupoInvalido, ibsCbsDoItem, totalIbsCbs } from './ibscbs.ts';\nimport type { IcmsTotais } from './icms.ts';\nimport { buildIcms, zeroIcmsTotais } from './icms.ts';\nimport type { NfceSupl, PagMontado, QrCodeNfceOpcoes } from './nfce.ts';\nimport {\n assinarParametros,\n conferirNfce,\n NFCE_LIMITE_SEM_DESTINATARIO,\n pagamentoNfce,\n parametrosQrCode,\n urlsNfce,\n} from './nfce.ts';\nimport { camposForaDoPl, escolherPl } from './pl.ts';\nimport { cstComIsento, vencimentos } from './rejeicoes.ts';\nimport { conferirTextosDaEntrada, textoXmlValido } from './textos.ts';\nimport { buildIcmsUfDest, buildIi, buildIpi, buildIssqn, buildPisCofins, buildPisCofinsSt } from './tributos.ts';\nimport type { Familia } from './values.ts';\nimport { Ctx, clean, digits, TOLERANCIA } from './values.ts';\n\nlet padrao: CalculadoraIbsCbs | undefined;\n\n/** A calculadora de IBS/CBS usada quando `opcoes.ibsCbs` não vem: o motor do sinete, criada uma vez por processo. */\nfunction calculadoraPadrao(): CalculadoraIbsCbs {\n padrao ??= calculadoraIbsCbs();\n return padrao;\n}\n\nexport const NFE_NS = 'http://www.portalfiscal.inf.br/nfe';\n\n/** Literal do nome do destinatário em homologação (MOC 7.0 Anexo I, RV E04-20, rejeição 598). */\nexport const XNOME_HOMOLOGACAO = 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL';\n\n/** Literal da descrição do primeiro item da NFC-e em homologação (MOC 7.0 Anexo I, RV I04-10, rejeição 373). */\nexport const XPROD_HOMOLOGACAO_NFCE = 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL';\n\nexport type ExigenciaRespTec = 'obrigatorio' | 'opcional';\n\nexport interface MontarNfeOpcoes {\n readonly ambiente: Ambiente;\n /** Relógio de emissão (dhEmi, PL vigente, CSRT) e de fato gerador (IBS/CBS). */\n readonly tempo: ContextoDeTempo;\n /**\n * Calculadora de IBS/CBS dos itens com `ibsCbs.classificacao`. Padrão: `calculadoraIbsCbs()`, o motor do sinete com o\n * dataset embarcado (importado na primeira nota que precisar dele) e as alíquotas oficiais. Informe outra para trocar\n * dataset, alíquotas, base ou regras, ou para calcular fora do sinete.\n */\n readonly ibsCbs?: CalculadoraIbsCbs;\n /** Fuso do emitente em minutos; padrão pela UF (`data/fusos.json`). */\n readonly deslocamentoMin?: number;\n /** Versão do aplicativo emissor (`verProc`); padrão `sinete <versão do @sinete/nfe>` (`formatarVerProc`). */\n readonly verProc?: string;\n /** Sobrepõe o modo de arredondamento de uma família (`data/arredondamento.json`). */\n readonly arredondamento?: Partial<Record<Familia, RoundingMode>>;\n /** Responsável técnico padrão (a software house), usado quando a nota não traz `respTec`. */\n readonly respTec?: ResponsavelTecnico;\n /** Sobrepõe a exigência de infRespTec e CSRT da tabela por UF (`data/resp-tec.json`). */\n readonly exigencias?: { readonly infRespTec?: ExigenciaRespTec; readonly csrt?: ExigenciaRespTec };\n /** Fonte de aleatoriedade para o cNF; padrão `crypto.getRandomValues`. */\n readonly aleatorio?: (bytes: Uint8Array) => Uint8Array;\n /**\n * O `vPag` do único `detPag` passa a ser o `vNF` calculado na mesma montagem, e o valor informado nele é ignorado.\n * Serve a quem recebe à vista o total da nota e não quer calcular o `vNF` antes de montar. Mais de um `detPag`,\n * nenhum, ou `tPag` 90 (sem pagamento) dão ocorrência `pagamento_igual_total`: não há como saber como repartir o\n * total, e a nota sem pagamento tem `vPag` zero.\n */\n readonly pagamentoIgualTotal?: boolean;\n /**\n * Só NFC-e (modelo 65): versão do QR Code. Padrão `{ versao: '3' }`, que dispensa o CSC (NT 2025.001). Com\n * `{ versao: '2', idCSC, CSC }`, o hash leva o CSC fornecido pela SEFAZ da UF, que nunca vai para o XML.\n */\n readonly qrCode?: QrCodeNfceOpcoes;\n /**\n * Só NFC-e: endereço da consulta via QR Code (sem o `?p=`). Padrão: o da UF do emitente no ambiente e na data de\n * emissão (`data/nfce-urls.json`, do Portal Nacional da NFC-e). AM e MA publicam o endereço sem o protocolo: lá, é\n * obrigatório.\n */\n readonly urlQrCode?: string;\n /** Só NFC-e: URL da consulta por chave de acesso (`urlChave`). Padrão: a da UF (`data/nfce-urls.json`). */\n readonly urlChave?: string;\n}\n\nexport interface NfeMontada {\n /** Chave de acesso (44 posições). */\n readonly chave: string;\n /** `Id` do `infNFe` (`NFe` + chave): é o que a assinatura referencia. */\n readonly id: string;\n readonly cNF: string;\n readonly cDV: string;\n /** 55 (NF-e) ou 65 (NFC-e). */\n readonly mod: '55' | '65';\n readonly tpEmis: string;\n readonly dhEmi: string;\n /**\n * Só NFC-e: o `infNFeSupl` a acrescentar (`comQrCode`, `assinarNfe`). Na versão 3 em contingência off-line, falta a\n * assinatura dos parâmetros, que só o certificado faz (`assinaturaQrCode`).\n */\n readonly nfce?: NfceSupl;\n /** Pacote de liberação usado (escolhido pela vigência). */\n readonly pl: EntradaDeVigencia;\n /** O objeto tipado, na forma do PL_010f (o mais novo que o pacote conhece). */\n readonly infNFe: TNFe_infNFe;\n /** `<NFe xmlns=\"...\">` com o `infNFe` canônico, sem assinatura, já validado contra o schema. */\n readonly xml: string;\n}\n\nexport type ResultadoMontagemNfe =\n | { readonly ok: true; readonly valor: NfeMontada }\n | { readonly ok: false; readonly ocorrencias: readonly Ocorrencia[] };\n\nconst MODES: Record<Familia, RoundingMode> = Object.fromEntries(\n Object.entries(arredondamento.familias).map(([k, v]) => [k, v.modo as RoundingMode]),\n) as Record<Familia, RoundingMode>;\n\nconst SEM_GTIN = 'SEM GTIN';\nconst BRASILIA = -180;\n\nfunction diaBrasilia(d: Instante): string {\n return formatarDh(d, BRASILIA).slice(0, 10);\n}\n\n/** Exigência de infRespTec ou CSRT para a UF no ambiente e na data (tabela `data/resp-tec.json`). */\nexport function exigenciaRespTec(\n uf: Uf,\n ambiente: Ambiente,\n data: Instante,\n): { readonly infRespTec: ExigenciaRespTec; readonly csrt: ExigenciaRespTec } {\n const dia = diaBrasilia(data);\n const ufs = respTecData.ufs as Readonly<\n Record<string, { readonly csrt?: Record<string, string>; readonly infRespTec?: Record<string, string> }>\n >;\n const regra = Object.hasOwn(ufs, uf) ? ufs[uf] : undefined;\n const vale = (r: Record<string, string> | undefined, padrao: string): ExigenciaRespTec => {\n const desde = r?.[ambiente];\n if (desde !== undefined) return dia >= desde ? 'obrigatorio' : (padrao as ExigenciaRespTec);\n return padrao as ExigenciaRespTec;\n };\n return {\n infRespTec: vale(regra?.infRespTec, respTecData.padrao.infRespTec),\n csrt: vale(regra?.csrt, respTecData.padrao.csrt),\n };\n}\n\n/** `hashCSRT`: Base64(SHA-1(CSRT + chave de acesso)) (NT 2018.005, campo ZD09). */\nexport async function hashCsrt(csrt: string, chave: string): Promise<string> {\n const d = await globalThis.crypto.subtle.digest('SHA-1', new TextEncoder().encode(csrt + chave));\n return codificarBase64(new Uint8Array(d));\n}\n\n/** Normaliza CNPJ ou CPF, apontando a ocorrência do validador. */\nfunction documento(doc: DocumentoPessoa, path: string, issues: Issues): { CNPJ: string } | { CPF: string } {\n if (doc.CNPJ !== undefined) {\n const r = lerCnpj(doc.CNPJ, { caminho: `${path}.CNPJ` });\n if (!r.ok) issues.list.push(r.erro);\n return { CNPJ: r.ok ? r.valor : doc.CNPJ };\n }\n const r = lerCpf(doc.CPF ?? '', { caminho: `${path}.CPF` });\n if (!r.ok) issues.list.push(r.erro);\n return { CPF: r.ok ? r.valor : (doc.CPF ?? '') };\n}\n\nfunction ie(value: string | undefined, uf: Uf, path: string, issues: Issues, allowIsento: boolean): string | undefined {\n if (value === undefined) return undefined;\n const r = lerIe(value, uf, { caminho: path, aceitarIsento: allowIsento });\n if (!r.ok) {\n issues.list.push(r.erro);\n return value;\n }\n return r.valor.valor;\n}\n\nfunction endereco(e: Endereco): Record<string, string | undefined> {\n return {\n xLgr: e.xLgr,\n nro: e.nro,\n xCpl: e.xCpl,\n xBairro: e.xBairro,\n cMun: e.cMun,\n xMun: e.xMun,\n UF: e.UF,\n CEP: e.CEP === undefined ? undefined : digits(e.CEP),\n fone: e.fone === undefined ? undefined : digits(e.fone),\n };\n}\n\nfunction isExterior(e: Endereco | EnderecoExterior | undefined): e is EnderecoExterior {\n return e !== undefined && 'exterior' in e && e.exterior === true;\n}\n\n/** Gera um cNF de 8 dígitos que passa nas regras de emissão da chave (RV B03-10: fora das sequências e diferente do nNF). */\nfunction gerarChave(\n parts: { cUF: string; aamm: string; emitente: string; mod: string; serie: string; nNF: string; tpEmis: string },\n cNFInformado: string | undefined,\n random: (b: Uint8Array) => Uint8Array,\n issues: Issues,\n): { chave: string; cNF: string } | undefined {\n const tentar = (cNF: string): { chave: string; ok: boolean; issue?: Ocorrencia } => {\n const chave = montarChaveAcesso({ ...parts, cNF });\n const r = lerChaveAcesso(chave, { emissao: true, caminho: 'chave' });\n return r.ok ? { chave, ok: true } : { chave, ok: false, issue: r.erro };\n };\n if (cNFInformado !== undefined) {\n if (!/^\\d{8}$/.test(cNFInformado)) {\n issues.add('cNF', 'campo_invalido', 'cNF tem 8 algarismos');\n return undefined;\n }\n const r = tentar(cNFInformado);\n if (!r.ok && r.issue) {\n // O cNF informado recusado pela regra da chave é da entrada, no campo dela; outra parte da chave recusada aponta\n // a chave montada (a causa, se for da entrada, já apareceu no campo dela).\n const doCnf = r.issue.code === 'chave_cnf_invalido';\n issues.list.push({\n ...r.issue,\n caminho: doCnf ? 'cNF' : r.issue.caminho,\n code: 'chave_invalida',\n mensagem: `${r.issue.mensagem} (${r.issue.code})`,\n origem: doCnf ? 'entrada' : 'montagem',\n });\n }\n return r.ok ? { chave: r.chave, cNF: cNFInformado } : undefined;\n }\n for (let n = 0; n < 32; n++) {\n const b = random(new Uint8Array(4));\n const v = ((b[0] ?? 0) * 2 ** 24 + (b[1] ?? 0) * 2 ** 16 + (b[2] ?? 0) * 2 ** 8 + (b[3] ?? 0)) % 100_000_000;\n const cNF = String(v).padStart(8, '0');\n const r = tentar(cNF);\n if (r.ok) return { chave: r.chave, cNF };\n if (r.issue && r.issue.code !== 'chave_cnf_invalido') {\n // A chave com o cNF gerado aqui foi recusada por outra parte (UF, emitente, série): a ocorrência aponta a chave\n // montada; a causa, se for da entrada, já apareceu no campo dela.\n issues.list.push({\n ...r.issue,\n code: 'chave_invalida',\n mensagem: `${r.issue.mensagem} (${r.issue.code})`,\n origem: 'montagem',\n });\n return undefined;\n }\n }\n issues.montagem('cNF', 'chave_invalida', 'não foi possível gerar um cNF válido');\n return undefined;\n}\n\nfunction referencia(ref: Referenciada, path: string, issues: Issues): TNFe_infNFe_ide_NFref {\n const chave = (c: string, p: string): string => {\n const r = lerChaveAcesso(c, { caminho: p });\n if (!r.ok) issues.list.push(r.erro);\n return r.ok ? r.valor.chave : c;\n };\n if ('refNFe' in ref) return { refNFe: chave(ref.refNFe, `${path}.refNFe`) };\n if ('refNFeSig' in ref) {\n // Chave com o código numérico zerado para sigilo (NT 2022.003, BA02a): o DV é o da chave original, então a\n // conferência do DV não se aplica; confere-se a forma, o modelo 55 e o cNF zerado.\n const c = ref.refNFeSig.replace(/\\s/g, '').toUpperCase();\n if (!/^[0-9]{6}[0-9A-Z]{12}[0-9]{2}55[0-9]{22}$/.test(c) || c.slice(35, 43) !== '00000000') {\n issues.add(`${path}.refNFeSig`, 'chave_invalida', 'chave de NF-e (modelo 55) com o código numérico (cNF) zerado');\n }\n return { refNFeSig: c };\n }\n if ('refCTe' in ref) return { refCTe: chave(ref.refCTe, `${path}.refCTe`) };\n if ('refNF' in ref) return { refNF: ref.refNF };\n if ('refECF' in ref) return { refECF: ref.refECF };\n const nfp = ref.refNFP;\n // Nota de produtor em papel (modelo 04) extinta: só referência a nota emitida antes do fim na UF dela.\n if (nfp.mod === '04') {\n const porUf = produtorRural.refNFP.ufs as Readonly<Record<string, { readonly vedadaDesde: string }>>;\n const cUfSigla = Object.keys(porUf).find((k) => ufPorSigla(k)?.cUF === nfp.cUF);\n const vedadaDesde = cUfSigla ? (porUf[cUfSigla]?.vedadaDesde ?? '') : produtorRural.refNFP.modelo04.vedadaDesde;\n if (nfp.AAMM >= vedadaDesde) {\n issues.add(\n `${path}.refNFP.AAMM`,\n 'referencia_vedada',\n `nota de produtor modelo 04 emitida em ${nfp.AAMM}, depois do fim do modelo (${vedadaDesde}; ${produtorRural.refNFP.modelo04.fonte})`,\n );\n }\n }\n const doc = documento(nfp as DocumentoPessoa, `${path}.refNFP`, issues);\n return {\n refNFP: {\n cUF: nfp.cUF,\n AAMM: nfp.AAMM,\n ...doc,\n IE: nfp.IE,\n mod: nfp.mod,\n serie: String(Number(nfp.serie)),\n nNF: String(Number(nfp.nNF)),\n },\n } as TNFe_infNFe_ide_NFref;\n}\n\n/**\n * Texto com caractere que o XML não representa vira ocorrência com o caminho do campo, em vez de falhar no parse do\n * documento montado. Os textos da entrada já foram conferidos com o caminho dela (`conferirTextosDaEntrada`): aqui só\n * sobra o que veio das opções da montagem.\n */\nfunction textosForaDoXml(value: unknown, path: string, issues: Issues): void {\n if (typeof value === 'string') {\n if (!textoXmlValido(value)) issues.montagem(path, 'campo_invalido', 'texto com caractere não permitido em XML');\n } else if (Array.isArray(value)) {\n for (const [n, v] of value.entries()) textosForaDoXml(v, `${path}[${n}]`, issues);\n } else if (typeof value === 'object' && value !== null) {\n for (const [k, v] of Object.entries(value)) textosForaDoXml(v, `${path}.${k}`, issues);\n }\n}\n\ninterface ItemMontado {\n readonly det: TNFe_infNFe_det;\n readonly icms: IcmsTotais;\n readonly indTot: boolean;\n readonly issqn: boolean;\n readonly faturamentoDireto: boolean;\n readonly v: Record<\n | 'vProd'\n | 'vFrete'\n | 'vSeg'\n | 'vDesc'\n | 'vOutro'\n | 'vII'\n | 'vIPI'\n | 'vIPIDevol'\n | 'vPIS'\n | 'vCOFINS'\n | 'vPISST'\n | 'vCOFINSST'\n | 'vFCPUFDest'\n | 'vICMSUFDest'\n | 'vICMSUFRemet'\n | 'vTotTrib'\n | 'vISSQN'\n | 'vBCISS',\n Decimal\n >;\n readonly temUfDest: boolean;\n readonly temTotTrib: boolean;\n readonly issqnOpcionais: Record<string, Decimal>;\n}\n\nfunction montarItem(ctx: Ctx, item: Item, n: number, normal: boolean): ItemMontado {\n const path = `itens[${n}]`;\n const p = item.produto;\n const pp = `${path}.produto`;\n const qCom = ctx.req(p.qCom, `${pp}.qCom`, D1104V);\n const vUnCom = ctx.req(p.vUnCom, `${pp}.vUnCom`, D1110V);\n // RV I11 (rejeição 629) só vale para a NF-e normal (finNFe 1); nas demais o vProd informado prevalece.\n const vProd = (normal ? ctx.calc : ctx.base).call(ctx, p.vProd, qCom.times(vUnCom), `${pp}.vProd`, D1302, 'produto');\n const uTrib = p.uTrib ?? p.uCom;\n const qTrib = p.qTrib === undefined ? qCom : ctx.req(p.qTrib, `${pp}.qTrib`, D1104V);\n let vUnTrib: Decimal;\n if (p.vUnTrib !== undefined) vUnTrib = ctx.req(p.vUnTrib, `${pp}.vUnTrib`, D1110V);\n else if (uTrib === p.uCom && qTrib.eq(qCom)) vUnTrib = vUnCom;\n else if (qTrib.isZero()) vUnTrib = Decimal.ZERO;\n else vUnTrib = vProd.dividedBy(qTrib, 10, ctx.modes.produto);\n // RV I11 (rejeição 630), só na NF-e normal: vProd confere também com qTrib × vUnTrib, com a tolerância da nota (*4).\n if (normal) {\n const trib = ctx.round(qTrib.times(vUnTrib), D1302, 'produto');\n if (trib.minus(vProd).abs().gt(TOLERANCIA)) {\n ctx.issues.add(\n `${pp}.vUnTrib`,\n 'valor_divergente',\n `qTrib × vUnTrib (${trib.toFixed(2)}) difere de vProd (${vProd.toFixed(2)}) em mais de ${TOLERANCIA.toString()}`,\n );\n }\n }\n // Campos TDec_1302Opc: zero informado é aceito e omitido do XML (o pattern não aceita zero).\n const opt = (v: typeof p.vFrete, k: string): Decimal => ctx.opt(v, `${pp}.${k}`, D1302) ?? Decimal.ZERO;\n const vFrete = opt(p.vFrete, 'vFrete');\n const vSeg = opt(p.vSeg, 'vSeg');\n const vDesc = opt(p.vDesc, 'vDesc');\n const vOutro = opt(p.vOutro, 'vOutro');\n const vOp = vProd.plus(vFrete).plus(vSeg).plus(vOutro).minus(vDesc);\n const cEAN = p.cEAN ?? SEM_GTIN;\n const especifico = p.especifico ?? {};\n const prod = clean({\n cProd: p.cProd,\n cEAN,\n cBarra: p.cBarra,\n xProd: p.xProd,\n NCM: digits(p.NCM),\n NVE: p.NVE as string[] | undefined,\n CEST: p.CEST === undefined ? undefined : digits(p.CEST),\n indEscala: p.indEscala,\n CNPJFab: p.CNPJFab,\n cBenef: p.cBenef,\n gCred: p.gCred,\n tpCredPresIBSZFM: p.tpCredPresIBSZFM,\n EXTIPI: p.EXTIPI,\n CFOP: digits(p.CFOP),\n uCom: p.uCom,\n qCom: ctx.s(qCom, D1104V),\n vUnCom: ctx.s(vUnCom, D1110V),\n vProd: ctx.s(vProd, D1302),\n cEANTrib: p.cEANTrib ?? cEAN,\n cBarraTrib: p.cBarraTrib,\n uTrib,\n qTrib: ctx.s(qTrib, D1104V),\n vUnTrib: ctx.s(vUnTrib, D1110V),\n vFrete: ctx.so(vFrete, D1302_OPC),\n vSeg: ctx.so(vSeg, D1302_OPC),\n vDesc: ctx.so(vDesc, D1302_OPC),\n vOutro: ctx.so(vOutro, D1302_OPC),\n indTot: p.indTot ?? '1',\n indBemMovelUsado: p.indBemMovelUsado,\n DI: p.DI,\n detExport: p.detExport,\n xPed: p.xPed,\n nItemPed: p.nItemPed,\n nFCI: p.nFCI,\n rastro: p.rastro,\n infProdNFF: p.infProdNFF,\n infProdEmb: p.infProdEmb,\n ...especifico,\n }) as unknown as TNFe_infNFe_det_prod;\n\n const imp = item.impostos;\n const ip = `${path}.impostos`;\n const imposto: Record<string, unknown> = {};\n const z = Decimal.ZERO;\n const v: ItemMontado['v'] = {\n vProd,\n vFrete,\n vSeg,\n vDesc,\n vOutro,\n vII: z,\n vIPI: z,\n vIPIDevol: z,\n vPIS: z,\n vCOFINS: z,\n vPISST: z,\n vCOFINSST: z,\n vFCPUFDest: z,\n vICMSUFDest: z,\n vICMSUFRemet: z,\n vTotTrib: z,\n vISSQN: z,\n vBCISS: z,\n };\n let issqnOpcionais: Record<string, Decimal> = {};\n const vTotTrib = ctx.opt(imp.vTotTrib, `${ip}.vTotTrib`, D1302);\n if (vTotTrib !== undefined) {\n imposto.vTotTrib = ctx.s(vTotTrib, D1302);\n v.vTotTrib = vTotTrib;\n }\n if (imp.icms !== undefined && imp.issqn !== undefined) {\n ctx.issues.add(ip, 'combinacao_invalida', 'o item tem ICMS ou ISSQN, nunca os dois');\n }\n if (imp.ipi !== undefined) {\n const r = buildIpi(ctx, imp.ipi, vOp, `${ip}.ipi`);\n imposto.IPI = r.grupo;\n v.vIPI = r.vIPI;\n }\n let icms = zeroIcmsTotais();\n if (imp.icms !== undefined) {\n const r = buildIcms(ctx, imp.icms, { vOp, vIPI: v.vIPI }, `${ip}.icms`);\n imposto.ICMS = r.grupo;\n icms = r.totais;\n } else if (imp.issqn === undefined && imp.ibsCbs === undefined) {\n ctx.issues.add(`${ip}.icms`, 'campo_obrigatorio', 'o item precisa de ICMS (ou ISSQN, na NF-e conjugada)');\n }\n if (imp.ii !== undefined) {\n const r = buildIi(ctx, imp.ii, `${ip}.ii`);\n imposto.II = r.grupo;\n v.vII = r.vII;\n }\n if (imp.issqn !== undefined) {\n const r = buildIssqn(ctx, imp.issqn, `${ip}.issqn`);\n imposto.ISSQN = r.grupo;\n v.vISSQN = r.vISSQN;\n v.vBCISS = r.vBC;\n issqnOpcionais = r.opcionais;\n }\n if (imp.pis !== undefined) {\n const r = buildPisCofins(ctx, imp.pis, 'PIS', `${ip}.pis`);\n imposto.PIS = r.grupo;\n v.vPIS = r.valor;\n }\n if (imp.pisSt !== undefined) {\n const r = buildPisCofinsSt(ctx, imp.pisSt, 'PIS', `${ip}.pisSt`);\n imposto.PISST = r.grupo;\n if (r.soma) v.vPISST = r.valor;\n }\n if (imp.cofins !== undefined) {\n const r = buildPisCofins(ctx, imp.cofins, 'COFINS', `${ip}.cofins`);\n imposto.COFINS = r.grupo;\n v.vCOFINS = r.valor;\n }\n if (imp.cofinsSt !== undefined) {\n const r = buildPisCofinsSt(ctx, imp.cofinsSt, 'COFINS', `${ip}.cofinsSt`);\n imposto.COFINSST = r.grupo;\n if (r.soma) v.vCOFINSST = r.valor;\n }\n if (imp.icmsUfDest !== undefined) {\n const r = buildIcmsUfDest(ctx, imp.icmsUfDest, `${ip}.icmsUfDest`);\n imposto.ICMSUFDest = r.grupo;\n v.vFCPUFDest = r.vFCPUFDest;\n v.vICMSUFDest = r.vICMSUFDest;\n v.vICMSUFRemet = r.vICMSUFRemet;\n }\n if (imp.is !== undefined) imposto.IS = imp.is;\n if (imp.ibsCbs?.grupo !== undefined) imposto.IBSCBS = imp.ibsCbs.grupo;\n\n const det: Record<string, unknown> = {\n nItem: String(n + 1),\n prod,\n imposto: imposto as unknown as TNFe_infNFe_det_imposto,\n };\n if (item.impostoDevol !== undefined) {\n const pDevol = ctx.req(item.impostoDevol.pDevol, `${path}.impostoDevol.pDevol`, D0302);\n const vIPIDevol = ctx.req(item.impostoDevol.vIPIDevol, `${path}.impostoDevol.vIPIDevol`, D1302);\n det.impostoDevol = { pDevol: ctx.s(pDevol, D0302), IPI: { vIPIDevol: ctx.s(vIPIDevol, D1302) } };\n v.vIPIDevol = vIPIDevol;\n }\n if (item.infAdProd !== undefined) det.infAdProd = item.infAdProd;\n if (item.obsItem !== undefined) det.obsItem = item.obsItem;\n if (item.DFeReferenciado !== undefined) {\n const r = lerChaveAcesso(item.DFeReferenciado.chaveAcesso, { caminho: `${path}.DFeReferenciado.chaveAcesso` });\n if (!r.ok) ctx.issues.list.push(r.erro);\n det.DFeReferenciado = clean({\n chaveAcesso: r.ok ? r.valor.chave : item.DFeReferenciado.chaveAcesso,\n nItem: item.DFeReferenciado.nItem === undefined ? undefined : String(item.DFeReferenciado.nItem),\n });\n }\n return {\n det: det as unknown as TNFe_infNFe_det,\n icms,\n indTot: (p.indTot ?? '1') === '1',\n issqn: imp.issqn !== undefined,\n faturamentoDireto: (especifico as { veicProd?: { tpOp?: string } }).veicProd?.tpOp === '2',\n v,\n temUfDest: imp.icmsUfDest !== undefined,\n temTotTrib: vTotTrib !== undefined,\n issqnOpcionais,\n };\n}\n\n/** Parte do vItem/vNF comum aos dois (MOC W16-10 com NT 2020.005 e NT 2023.004; NT 2025.002 VB01-10 e VB01-20). */\nfunction composicao(m: ItemMontado, incluirProd: boolean): Decimal {\n const v = m.v;\n let total = (incluirProd ? v.vProd : Decimal.ZERO)\n .minus(v.vDesc)\n .minus(m.icms.vICMSDesonDeduz)\n .plus(v.vFrete)\n .plus(v.vSeg)\n .plus(v.vOutro)\n .plus(v.vII)\n .plus(v.vIPI)\n .plus(v.vPISST)\n .plus(v.vCOFINSST);\n if (!m.faturamentoDireto) {\n total = total.plus(m.icms.vST).plus(m.icms.vICMSMonoReten).plus(m.icms.vFCPST).plus(v.vIPIDevol);\n }\n return total;\n}\n\n/** Monta, calcula e valida. Nunca lança por dado do chamador: devolve as ocorrências. */\nexport async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Promise<ResultadoMontagemNfe> {\n const issues = new Issues();\n const finNFeIn = entrada.finNFe ?? '1';\n const mod = entrada.modelo ?? '55';\n if (mod !== '55' && mod !== '65') {\n issues.add('modelo', 'modelo_nao_suportado', `modelo ${String(mod)}: o builder monta NF-e (55) e NFC-e (65)`);\n return { ok: false, ocorrencias: issues.classificadas };\n }\n const nfce = mod === '65';\n // Padrões da identificação resolvidos uma vez: o mesmo valor vai para o ide e para a calculadora de IBS/CBS. A NFC-e\n // é presencial e para consumidor final (MOC 7.0 Anexo I, B25a-10 e B25b-20).\n const indPres = entrada.indPres ?? (nfce ? '1' : finNFeIn === '2' || finNFeIn === '3' ? '0' : '9');\n const indFinal = entrada.indFinal ?? (nfce || entrada.destinatario?.indIEDest === '9' ? '1' : '0');\n const ctx = new Ctx(issues, { ...MODES, ...opcoes.arredondamento }, finNFeIn !== '2' && finNFeIn !== '3');\n const pRedutorGov = entrada.gCompraGov && ctx.req(entrada.gCompraGov.pRedutor, 'gCompraGov.pRedutor', D0302A04);\n const emitUf = entrada.emitente.endereco.UF;\n if (!ehUf(emitUf)) {\n issues.add('emitente.endereco.UF', 'campo_invalido', 'UF do emitente inválida');\n return { ok: false, ocorrencias: issues.classificadas };\n }\n const cUF = ufPorSigla(emitUf)?.cUF ?? '';\n const offset = opcoes.deslocamentoMin ?? deslocamentoDaUf(emitUf);\n const agora = opcoes.tempo.emissao.agora();\n // Um instante de fato gerador por montagem: o mesmo vai para a calculadora e para a regra de composição do vItem.\n const fatoGerador = opcoes.tempo.fatoGerador.agora();\n const dhEmi = formatarDh(agora, offset);\n const aamm = dhEmi.slice(2, 4) + dhEmi.slice(5, 7);\n const tpAmb = tpAmbDoAmbiente(opcoes.ambiente);\n\n // PL vigente (ErroVigencia do schemas propaga: data fora de toda vigência é erro de configuração, não de dado).\n // O PL sai do mesmo instante do dhEmi: reler o relógio numa virada de vigência escolheria outro PL.\n const pl = escolherPl(opcoes.ambiente, relogioFixo(agora));\n\n // Emitente (grupo C)\n const e: Emitente = entrada.emitente;\n const emitDoc = documento(e, 'emitente', issues);\n const serie = Number(entrada.serie);\n const nNF = Number(entrada.nNF);\n if (!Number.isInteger(serie) || serie < 0 || serie > 999) issues.add('serie', 'serie_invalida', 'série de 0 a 999');\n if (!Number.isInteger(nNF) || nNF < 1 || nNF > 999_999_999)\n issues.add('nNF', 'campo_invalido', 'nNF de 1 a 999999999');\n const [cpfIni, cpfFim] = produtorRural.series.cpf as [number, number];\n const [cnpjIni, cnpjFim] = produtorRural.series.cnpj as [number, number];\n if ('CPF' in emitDoc && (serie < cpfIni || serie > cpfFim)) {\n issues.add(\n 'serie',\n 'serie_invalida',\n `emitente pessoa física usa as séries ${cpfIni} a ${cpfFim} (${produtorRural.series.fonte})`,\n );\n } else if ('CNPJ' in emitDoc && Number.isInteger(serie) && serie >= 0 && (serie < cnpjIni || serie > cnpjFim)) {\n issues.add(\n 'serie',\n 'serie_invalida',\n `emitente CNPJ usa as séries ${cnpjIni} a ${cnpjFim} (${produtorRural.series.fonteCnpj})`,\n );\n }\n const emit = clean({\n ...emitDoc,\n xNome: e.xNome,\n xFant: e.xFant,\n enderEmit: clean({ ...endereco(e.endereco), cPais: '1058', xPais: 'BRASIL' }),\n IE: ie(e.IE, emitUf, 'emitente.IE', issues, true),\n IEST: e.IEST,\n IM: e.IM,\n CNAE: e.CNAE,\n CRT: e.CRT,\n ISUFEmit: e.ISUFEmit,\n });\n\n // Destinatário (grupo E): obrigatório na NF-e (RV E01-10); na NFC-e, só na entrega a domicílio (E01-20, conferida\n // com as demais regras da NFC-e).\n const d: Destinatario | undefined = entrada.destinatario;\n let dest: Record<string, unknown> | undefined;\n let destUf: Uf | 'EX' | undefined;\n if (d === undefined) {\n if (!nfce) issues.add('destinatario', 'campo_obrigatorio', 'a NF-e exige o destinatário (E01-10, rejeição 719)');\n } else {\n const docDest =\n 'idEstrangeiro' in d && d.idEstrangeiro !== undefined\n ? { idEstrangeiro: d.idEstrangeiro }\n : documento(d as DocumentoPessoa, 'destinatario', issues);\n let enderDest: Record<string, string | undefined> | undefined;\n if (isExterior(d.endereco)) {\n destUf = 'EX';\n enderDest = clean({\n xLgr: d.endereco.xLgr,\n nro: d.endereco.nro,\n xCpl: d.endereco.xCpl,\n xBairro: d.endereco.xBairro,\n cMun: '9999999',\n xMun: 'EXTERIOR',\n UF: 'EX',\n cPais: d.endereco.cPais,\n xPais: d.endereco.xPais,\n fone: d.endereco.fone === undefined ? undefined : digits(d.endereco.fone),\n });\n } else if (d.endereco !== undefined) {\n destUf = d.endereco.UF;\n enderDest = clean({ ...endereco(d.endereco), cPais: '1058', xPais: 'BRASIL' });\n }\n // IE sem UF (endereço ausente) ou no exterior não é conferida aqui: a E05-10 e a E17-40 recusam a combinação.\n const destIe =\n d.IE !== undefined && destUf !== undefined && destUf !== 'EX'\n ? ie(d.IE, destUf, 'destinatario.IE', issues, false)\n : d.IE;\n dest = clean({\n ...docDest,\n xNome: opcoes.ambiente === 'homologacao' ? XNOME_HOMOLOGACAO : d.xNome,\n enderDest,\n indIEDest: d.indIEDest,\n IE: destIe,\n ISUF: d.ISUF,\n IM: d.IM,\n email: d.email,\n });\n }\n\n // Identificação: contingência e forma de emissão\n const cont = entrada.contingencia;\n const tpEmis = cont?.tpEmis ?? '1';\n if (cont !== undefined) {\n if (cont.xJust.length < 15 || cont.xJust.length > 256) {\n issues.add(\n 'contingencia.xJust',\n 'contingencia_invalida',\n 'justificativa da contingência com 15 a 256 caracteres',\n );\n }\n if (cont.dhCont.getTime() > agora.getTime()) {\n issues.add('contingencia.dhCont', 'contingencia_invalida', 'entrada em contingência posterior à emissão');\n }\n if (!nfce && tpEmis === '9') {\n issues.add(\n 'contingencia.tpEmis',\n 'contingencia_invalida',\n 'contingência off-line (tpEmis 9) é só da NFC-e (B22-10, rejeição 711)',\n );\n }\n if (nfce && (tpEmis === '6' || tpEmis === '7')) {\n issues.add(\n 'contingencia.tpEmis',\n 'contingencia_invalida',\n 'a NFC-e não é autorizada pela SVC; a contingência dela é off-line, tpEmis 9 (B22-70, rejeição 783)',\n );\n }\n }\n\n // Identificação que as regras do modelo conferem antes de montar.\n // Na NFC-e a operação é sempre interna (B11a-10, rejeição 707): o endereço do consumidor não a torna interestadual.\n const idDest =\n entrada.idDest ?? (nfce ? '1' : destUf === 'EX' ? '3' : destUf !== undefined && destUf !== emitUf ? '2' : '1');\n const tpImp = entrada.tpImp ?? (nfce ? '4' : '1');\n conferirDestinatario(\n entrada,\n {\n mod,\n tpNF: entrada.tpNF,\n idDest,\n idDestInformado: entrada.idDest !== undefined,\n indFinal,\n producao: opcoes.ambiente === 'producao',\n },\n issues,\n );\n if (nfce) {\n conferirNfce(\n entrada,\n {\n tpNF: entrada.tpNF,\n idDest,\n tpImp,\n finNFe: finNFeIn,\n indFinal,\n indPres,\n },\n issues,\n );\n } else if (tpImp === '4' || tpImp === '5') {\n issues.add('tpImp', 'campo_invalido', 'tpImp 4 e 5 (DANFC-e) são da NFC-e (B21-20, rejeição 710)');\n }\n const qr: QrCodeNfceOpcoes = opcoes.qrCode ?? { versao: '3' };\n if (nfce && qr.versao === '2') {\n // O CSC e o idCSC são opções do montador, não da nota: as ocorrências são da montagem (ADR 0011).\n if (!/^\\d{1,6}$/.test(qr.idCSC) || Number(qr.idCSC) === 0) {\n issues.montagem(\n 'qrCode.idCSC',\n 'qrcode_invalido',\n 'idCSC tem de 1 a 6 algarismos, diferente de zero (Manual do DANFE NFC-e 6.0, 4.6)',\n );\n }\n if (qr.CSC.length < 16 || qr.CSC.length > 36) {\n issues.montagem(\n 'qrCode.CSC',\n 'qrcode_invalido',\n 'o CSC tem de 16 a 36 caracteres (Manual do DANFE NFC-e 6.0, 4.6)',\n );\n }\n if ('CPF' in emitDoc) {\n issues.montagem(\n 'qrCode.versao',\n 'qrcode_invalido',\n 'emitente pessoa física usa o QR Code versão 3 (NT 2025.001, ZX02-222, rejeição 444)',\n );\n }\n }\n\n // Chave de acesso e cNF\n const random =\n opcoes.aleatorio ??\n ((b: Uint8Array): Uint8Array => globalThis.crypto.getRandomValues(b as Uint8Array<ArrayBuffer>));\n const emitente14 = 'CNPJ' in emitDoc ? emitDoc.CNPJ : emitDoc.CPF;\n const gerada = issues.empty\n ? gerarChave(\n { cUF, aamm, emitente: emitente14, mod, serie: String(serie), nNF: String(nNF), tpEmis },\n entrada.cNF,\n random,\n issues,\n )\n : undefined;\n const chave = gerada?.chave ?? '0'.repeat(44);\n const cNF = gerada?.cNF ?? '00000000';\n const cDV = chave.slice(43);\n\n // Itens\n if (entrada.itens.length === 0 || entrada.itens.length > 990) {\n issues.add('itens', 'itens_limite', 'a NF-e tem de 1 a 990 itens');\n }\n const itens = entrada.itens.map((it, n) => montarItem(ctx, it, n, finNFeIn === '1'));\n // Na NFC-e em homologação, a descrição do primeiro item é a literal da RV I04-10, como o nome do destinatário da\n // E04-20: o builder a põe, e a descrição informada fica fora do XML de teste.\n const primeiro = itens[0];\n if (nfce && opcoes.ambiente === 'homologacao' && primeiro !== undefined) {\n (primeiro.det.prod as unknown as Record<string, unknown>).xProd = XPROD_HOMOLOGACAO_NFCE;\n }\n\n // IBS/CBS pela calculadora das opções, ou pelo motor do sinete\n const classificados = entrada.itens\n .map((it, n) => ({ it, n }))\n .filter(({ it }) => it.impostos.ibsCbs?.classificacao !== undefined);\n if (classificados.length > 0) {\n const calculadora = opcoes.ibsCbs ?? calculadoraPadrao();\n const reqs: PedidoIbsCbsItem[] = classificados.map(({ it, n }) => {\n const c = it.impostos.ibsCbs?.classificacao as NonNullable<\n NonNullable<typeof it.impostos.ibsCbs>['classificacao']\n >;\n const m = itens[n] as ItemMontado;\n const vBC = ctx.opt(c.vBC, `itens[${n}].impostos.ibsCbs.classificacao.vBC`, D1302);\n const qTrib = Decimal.of((m.det.prod as { qTrib: string }).qTrib);\n return {\n nItem: n + 1,\n CST: c.CST,\n cClassTrib: c.cClassTrib,\n ...(c.indDoacao ? { indDoacao: c.indDoacao } : {}),\n ...(c.cCredPres ? { cCredPres: c.cCredPres } : {}),\n ...(c.gTribRegular ? { gTribRegular: c.gTribRegular } : {}),\n ...(vBC ? { vBC } : {}),\n NCM: (m.det.prod as { NCM: string }).NCM,\n CFOP: (m.det.prod as { CFOP: string }).CFOP,\n uTrib: (m.det.prod as { uTrib: string }).uTrib,\n qTrib,\n vProd: m.v.vProd,\n vDesc: m.v.vDesc,\n vFrete: m.v.vFrete,\n vSeg: m.v.vSeg,\n vOutro: m.v.vOutro,\n vICMS: m.icms.vICMS,\n vICMSST: m.icms.vST,\n vFCP: m.icms.vFCP,\n vFCPST: m.icms.vFCPST,\n vIPI: m.v.vIPI,\n vPIS: m.v.vPIS,\n vCOFINS: m.v.vCOFINS,\n vII: m.v.vII,\n vISSQN: m.v.vISSQN,\n vICMSUFDest: m.v.vICMSUFDest,\n vFCPUFDest: m.v.vFCPUFDest,\n };\n });\n const destino =\n entrada.entrega !== undefined\n ? { UF: entrada.entrega.UF, cMun: entrada.entrega.cMun }\n : d?.endereco !== undefined\n ? isExterior(d.endereco)\n ? { UF: 'EX' as const, cMun: '9999999' }\n : { UF: d.endereco.UF, cMun: d.endereco.cMun }\n : undefined;\n const compra = entrada.gCompraGov;\n const resp = await calculadora.calcular({\n nota: {\n fatoGerador,\n emissao: agora,\n ambiente: opcoes.ambiente,\n mod,\n tpNF: entrada.tpNF,\n finNFe: finNFeIn,\n ...(entrada.tpNFDebito ? { tpNFDebito: entrada.tpNFDebito } : {}),\n ...(entrada.tpNFCredito ? { tpNFCredito: entrada.tpNFCredito } : {}),\n indFinal,\n indPres,\n emitente: { UF: emitUf, cMun: e.endereco.cMun, CRT: e.CRT },\n ...(destino ? { destino } : {}),\n ...(entrada.cMunFGIBS ? { cMunFGIBS: entrada.cMunFGIBS } : {}),\n ...(compra && pRedutorGov\n ? {\n compraGov: {\n tpEnteGov: compra.tpEnteGov,\n pRedutor: pRedutorGov,\n tpOperGov: compra.tpOperGov,\n },\n }\n : {}),\n },\n itens: reqs,\n });\n issues.addAll(resp.ocorrencias ?? [], 'montagem');\n for (const { n } of classificados) {\n const g = resp.itens.find((x) => x.nItem === n + 1);\n if (g === undefined) {\n issues.montagem(\n `itens[${n}].impostos.ibsCbs`,\n 'ibscbs_calculo',\n 'a calculadora não devolveu o grupo IBSCBS do item',\n );\n continue;\n }\n ((itens[n] as ItemMontado).det.imposto as Record<string, unknown>).IBSCBS = g.IBSCBS;\n }\n }\n\n // Grupos repassados (IBSCBS pronto ou da calculadora, IS) chegam como texto: número malformado vira ocorrência antes\n // de qualquer soma, nunca exceção.\n itens.forEach((m, n) => {\n const imp = m.det.imposto as { IBSCBS?: unknown; IS?: unknown };\n const ib = `itens[${n}].impostos.ibsCbs`;\n const is = `itens[${n}].impostos.is`;\n // O IBSCBS pronto (ibsCbs.grupo) é da entrada; o que a calculadora devolveu é da montagem (ADR 0011).\n const ibsDaCalculadora = entrada.itens[n]?.impostos.ibsCbs?.grupo === undefined;\n const antes = issues.list.length;\n decimaisInvalidos(imp.IBSCBS, ib, issues);\n if (ibsDaCalculadora) issues.reclassificarDesde(antes, 'montagem');\n decimaisInvalidos(imp.IS, is, issues);\n if (issues.list.length === antes) {\n grupoInvalido(TTribNFeCt as ComplexType, 'IBSCBS', imp.IBSCBS, ib, issues);\n if (ibsDaCalculadora) issues.reclassificarDesde(antes, 'montagem');\n grupoInvalido(TISCt as ComplexType, 'IS', imp.IS, is, issues);\n }\n });\n // Texto e tamanho dos campos de texto pelo tipo do PL, com o caminho da entrada (ADR 0011); o campo que outra\n // conferência já recusou fica só com a ocorrência dela.\n // Em homologação, o nome do destinatário e, na NFC-e, a descrição do primeiro item são as literais da E04-20 e da I04-10:\n // o texto informado não vai ao XML.\n const substituidos =\n opcoes.ambiente === 'homologacao' ? ['destinatario.xNome', ...(nfce ? ['itens[0].produto.xProd'] : [])] : [];\n conferirTextosDaEntrada(entrada, pl.infNFe as ComplexType, issues, new Set(substituidos));\n if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };\n\n // Totais (grupo W)\n const gruposIbsCbs = itens\n .map((m) => (m.det.imposto as { IBSCBS?: TTribNFe }).IBSCBS)\n .filter((g): g is TTribNFe => g !== undefined);\n const somaTributosNoItem = diaBrasilia(fatoGerador) >= reforma.vItemSomaTributosDesde;\n let vNFTot = Decimal.ZERO;\n // vItem e vNFTot existem quando a nota tem tributo da reforma: IBS/CBS ou IS (NT 2025.002, VB01 e W60).\n const temReforma = gruposIbsCbs.length > 0 || itens.some((m) => (m.det.imposto as { IS?: unknown }).IS !== undefined);\n if (temReforma) {\n for (const m of itens) {\n let vItem = composicao(m, m.indTot);\n const g = (m.det.imposto as { IBSCBS?: TTribNFe }).IBSCBS;\n if (somaTributosNoItem) {\n // VB01-10: o vIS soma no item por si, com ou sem grupo IBSCBS no mesmo item.\n const is = (m.det.imposto as { IS?: { vIS?: string } }).IS?.vIS;\n if (is !== undefined) vItem = vItem.plus(Decimal.of(is));\n }\n if (g !== undefined && somaTributosNoItem) {\n const t = ibsCbsDoItem(g);\n vItem = vItem.plus(t.vIBS).plus(t.vCBS);\n if (!m.faturamentoDireto) vItem = vItem.plus(t.vTotIBSMonoItem).plus(t.vTotCBSMonoItem);\n }\n (m.det as Record<string, unknown>).vItem = ctx.s(vItem, D1302);\n vNFTot = vNFTot.plus(vItem);\n }\n }\n const soma = (f: (m: ItemMontado) => Decimal, filtro: (m: ItemMontado) => boolean = () => true): Decimal =>\n itens.filter(filtro).reduce((acc, m) => acc.plus(f(m)), Decimal.ZERO);\n const icmsItens = (m: ItemMontado): boolean => !m.issqn;\n const icmsSoma = (k: keyof IcmsTotais): Decimal => soma((m) => m.icms[k] as Decimal);\n const vProdTot = soma(\n (m) => m.v.vProd,\n (m) => m.indTot && !m.issqn,\n );\n const vServ = soma(\n (m) => m.v.vProd,\n (m) => m.indTot && m.issqn,\n );\n const vNF = itens.reduce((acc, m) => acc.plus(composicao(m, m.indTot && !m.issqn)), Decimal.ZERO).plus(vServ);\n const S = (x: Decimal): string => ctx.s(x, D1302);\n const mono = itens.some((m) => m.icms.mono);\n const ufDest = itens.some((m) => m.temUfDest);\n const ICMSTot = clean({\n vBC: S(icmsSoma('vBC')),\n vICMS: S(icmsSoma('vICMS')),\n vICMSDeson: S(icmsSoma('vICMSDeson')),\n vFCPUFDest: ufDest ? S(soma((m) => m.v.vFCPUFDest)) : undefined,\n vICMSUFDest: ufDest ? S(soma((m) => m.v.vICMSUFDest)) : undefined,\n vICMSUFRemet: ufDest ? S(soma((m) => m.v.vICMSUFRemet)) : undefined,\n vFCP: S(icmsSoma('vFCP')),\n vBCST: S(icmsSoma('vBCST')),\n vST: S(icmsSoma('vST')),\n vFCPST: S(icmsSoma('vFCPST')),\n vFCPSTRet: S(icmsSoma('vFCPSTRet')),\n qBCMono: mono ? S(ctx.round(icmsSoma('qBCMono'), D1302, 'icms')) : undefined,\n vICMSMono: mono ? S(icmsSoma('vICMSMono')) : undefined,\n qBCMonoReten: mono ? S(ctx.round(icmsSoma('qBCMonoReten'), D1302, 'icms')) : undefined,\n vICMSMonoReten: mono ? S(icmsSoma('vICMSMonoReten')) : undefined,\n qBCMonoRet: mono ? S(ctx.round(icmsSoma('qBCMonoRet'), D1302, 'icms')) : undefined,\n vICMSMonoRet: mono ? S(icmsSoma('vICMSMonoRet')) : undefined,\n vProd: S(vProdTot),\n vFrete: S(soma((m) => m.v.vFrete)),\n vSeg: S(soma((m) => m.v.vSeg)),\n vDesc: S(soma((m) => m.v.vDesc)),\n vII: S(soma((m) => m.v.vII)),\n vIPI: S(soma((m) => m.v.vIPI)),\n vIPIDevol: S(soma((m) => m.v.vIPIDevol)),\n vPIS: S(soma((m) => m.v.vPIS, icmsItens)),\n vCOFINS: S(soma((m) => m.v.vCOFINS, icmsItens)),\n vOutro: S(soma((m) => m.v.vOutro)),\n vNF: S(vNF),\n vTotTrib: itens.some((m) => m.temTotTrib) ? S(soma((m) => m.v.vTotTrib)) : undefined,\n }) as TNFe_infNFe_total_ICMSTot;\n const total: Record<string, unknown> = { ICMSTot };\n if (itens.some((m) => m.issqn)) {\n const iss = itens.filter((m) => m.issqn);\n const so = (x: Decimal): string | undefined => ctx.so(x, D1302_OPC);\n const opc = (k: string): string | undefined =>\n so(iss.reduce((a, m) => a.plus(m.issqnOpcionais[k] ?? Decimal.ZERO), Decimal.ZERO));\n total.ISSQNtot = clean({\n vServ: so(vServ),\n vBC: so(\n soma(\n (m) => m.v.vBCISS,\n (m) => m.issqn,\n ),\n ),\n vISS: so(\n soma(\n (m) => m.v.vISSQN,\n (m) => m.issqn,\n ),\n ),\n vPIS: so(\n soma(\n (m) => m.v.vPIS,\n (m) => m.issqn,\n ),\n ),\n vCOFINS: so(\n soma(\n (m) => m.v.vCOFINS,\n (m) => m.issqn,\n ),\n ),\n dCompet: dhEmi.slice(0, 10),\n vDeducao: opc('vDeducao'),\n vOutro: opc('vOutro'),\n vDescIncond: opc('vDescIncond'),\n vDescCond: opc('vDescCond'),\n vISSRet: opc('vISSRet'),\n }) as TNFe_infNFe_total_ISSQNtot;\n }\n const comIs = itens.filter((m) => (m.det.imposto as { IS?: unknown }).IS !== undefined);\n if (comIs.length > 0) {\n total.ISTot = {\n vIS: S(\n comIs.reduce(\n (a, m) => a.plus(Decimal.of((m.det.imposto as { IS: { vIS?: string } }).IS.vIS ?? '0')),\n Decimal.ZERO,\n ),\n ),\n };\n }\n if (gruposIbsCbs.length > 0) total.IBSCBSTot = totalIbsCbs(gruposIbsCbs);\n if (temReforma) total.vNFTot = S(vNFTot);\n\n // Identificação (grupo B)\n const finNFe = finNFeIn;\n const ide = clean({\n cUF,\n cNF,\n natOp: entrada.natOp,\n mod,\n serie: String(serie),\n nNF: String(nNF),\n dhEmi,\n dhSaiEnt: entrada.dhSaiEnt === undefined ? undefined : formatarDh(entrada.dhSaiEnt, offset),\n dPrevEntrega: entrada.dPrevEntrega,\n tpNF: entrada.tpNF,\n idDest,\n cMunFG: entrada.cMunFG ?? e.endereco.cMun,\n cMunFGIBS: entrada.cMunFGIBS,\n tpImp,\n tpEmis,\n cDV,\n tpAmb,\n finNFe,\n tpNFDebito: entrada.tpNFDebito,\n tpNFCredito: entrada.tpNFCredito,\n indFinal,\n indPres,\n // NT 2020.006: indIntermed obrigatório com indPres 2, 3, 4 e 9.\n indIntermed: entrada.indIntermed ?? (['2', '3', '4', '9'].includes(indPres) ? '0' : undefined),\n procEmi: '0',\n verProc: opcoes.verProc ?? formatarVerProc('sinete', VERSAO_PACOTE),\n dhCont: cont === undefined ? undefined : formatarDh(cont.dhCont, offset),\n xJust: cont?.xJust,\n NFref: entrada.referenciadas?.map((r, n) => referencia(r, `referenciadas[${n}]`, issues)),\n gCompraGov:\n entrada.gCompraGov === undefined\n ? undefined\n : clean({\n tpEnteGov: entrada.gCompraGov.tpEnteGov,\n pRedutor: ctx.s(pRedutorGov ?? Decimal.ZERO, D0302A04),\n tpOperGov: entrada.gCompraGov.tpOperGov,\n refDFeAnt: entrada.gCompraGov.refDFeAnt as string[] | undefined,\n }),\n gPagAntecipado: entrada.gPagAntecipado === undefined ? undefined : { refNFe: [...entrada.gPagAntecipado] },\n });\n\n // Locais, autorizados, transporte, cobrança, pagamento, informações adicionais\n const local = (l: Local | undefined, path: string): Record<string, unknown> | undefined =>\n l === undefined\n ? undefined\n : clean({\n ...documento(l, path, issues),\n xNome: l.xNome,\n ...endereco(l),\n cPais: '1058',\n xPais: 'BRASIL',\n email: l.email,\n IE: l.IE,\n });\n if ((entrada.autXML?.length ?? 0) > 10) issues.add('autXML', 'campo_invalido', 'no máximo 10 autorizados');\n const autXML = entrada.autXML?.map((a, n) => documento(a, `autXML[${n}]`, issues));\n\n const tr = entrada.transporte;\n const transp: Record<string, unknown> = { modFrete: tr?.modFrete ?? '9' };\n if (tr?.transportador !== undefined) {\n const t = tr.transportador;\n const docT =\n t.CNPJ !== undefined || t.CPF !== undefined\n ? documento(t as DocumentoPessoa, 'transporte.transportador', issues)\n : {};\n transp.transporta = clean({ ...docT, xNome: t.xNome, IE: t.IE, xEnder: t.xEnder, xMun: t.xMun, UF: t.UF });\n }\n if (tr?.retTransp !== undefined) {\n const r = tr.retTransp;\n const vBCRet = ctx.req(r.vBCRet, 'transporte.retTransp.vBCRet', D1302);\n const pICMSRet = ctx.req(r.pICMSRet, 'transporte.retTransp.pICMSRet', D0302A04);\n const vICMSRet = ctx.calc(r.vICMSRet, vBCRet.percent(pICMSRet), 'transporte.retTransp.vICMSRet', D1302, 'icms');\n transp.retTransp = {\n vServ: S(ctx.req(r.vServ, 'transporte.retTransp.vServ', D1302)),\n vBCRet: S(vBCRet),\n pICMSRet: ctx.s(pICMSRet, D0302A04),\n vICMSRet: S(vICMSRet),\n CFOP: r.CFOP,\n cMunFG: r.cMunFG,\n };\n }\n if (tr?.veicTransp !== undefined) transp.veicTransp = tr.veicTransp;\n if (tr?.reboque !== undefined) transp.reboque = tr.reboque;\n if (tr?.vagao !== undefined) transp.vagao = tr.vagao;\n if (tr?.balsa !== undefined) transp.balsa = tr.balsa;\n if (tr?.volumes !== undefined) {\n transp.vol = tr.volumes.map((vol, n) =>\n clean({\n qVol: vol.qVol === undefined ? undefined : String(vol.qVol),\n esp: vol.esp,\n marca: vol.marca,\n nVol: vol.nVol,\n pesoL: ctx.so(ctx.opt(vol.pesoL, `transporte.volumes[${n}].pesoL`, D1203), D1203),\n pesoB: ctx.so(ctx.opt(vol.pesoB, `transporte.volumes[${n}].pesoB`, D1203), D1203),\n lacres: vol.lacres?.map((nLacre) => ({ nLacre })),\n }),\n );\n }\n\n let cobr: Record<string, unknown> | undefined;\n if (entrada.cobranca !== undefined) {\n const c = entrada.cobranca;\n cobr = {};\n if (c.fatura !== undefined) {\n const f = c.fatura;\n const vOrig = ctx.opt(f.vOrig, 'cobranca.fatura.vOrig', D1302);\n const vDescF = ctx.opt(f.vDesc, 'cobranca.fatura.vDesc', D1302);\n const vLiq =\n vOrig === undefined\n ? ctx.opt(f.vLiq, 'cobranca.fatura.vLiq', D1302)\n : ctx.calc(f.vLiq, vOrig.minus(vDescF ?? Decimal.ZERO), 'cobranca.fatura.vLiq', D1302, 'produto');\n cobr.fat = clean({\n nFat: f.nFat,\n vOrig: ctx.so(vOrig, D1302),\n vDesc: ctx.so(vDescF, D1302),\n vLiq: ctx.so(vLiq, D1302),\n });\n }\n if (c.duplicatas !== undefined) {\n if (c.duplicatas.length > 120) issues.add('cobranca.duplicatas', 'campo_invalido', 'no máximo 120 duplicatas');\n cobr.dup = c.duplicatas.map((dup, n) =>\n clean({\n // NT 2016.002: nDup sequencial com 3 dígitos.\n nDup: dup.nDup ?? String(n + 1).padStart(3, '0'),\n dVenc: dup.dVenc,\n vDup: ctx.s(ctx.req(dup.vDup, `cobranca.duplicatas[${n}].vDup`, D1302_OPC), D1302_OPC),\n }),\n );\n }\n }\n\n const pagIn = entrada.pagamento ?? { detPag: [{ tPag: '90' as const, vPag: '0' }] };\n const igualTotal = opcoes.pagamentoIgualTotal === true;\n if (igualTotal) {\n const unico = entrada.pagamento?.detPag.length === 1 ? entrada.pagamento.detPag[0] : undefined;\n if (unico === undefined) {\n issues.add('pagamento.detPag', 'pagamento_igual_total', 'pagamentoIgualTotal pede exatamente um detPag');\n } else if (unico.tPag === '90') {\n issues.add('pagamento.detPag[0].tPag', 'pagamento_igual_total', 'tPag 90 (sem pagamento) não recebe o total');\n }\n }\n const pag = clean({\n detPag: pagIn.detPag.map((p, n) =>\n clean({\n indPag: p.indPag,\n tPag: p.tPag,\n xPag: p.xPag,\n // Com pagamentoIgualTotal, o único pagamento é o total da nota, já calculado acima.\n vPag: igualTotal ? S(vNF) : S(ctx.req(p.vPag, `pagamento.detPag[${n}].vPag`, D1302)),\n dPag: p.dPag,\n CNPJPag: p.CNPJPag,\n UFPag: p.UFPag,\n card: p.card,\n }),\n ),\n vTroco: ctx.so(ctx.opt(pagIn.vTroco, 'pagamento.vTroco', D1302), D1302),\n }) as unknown as PagMontado;\n // Pagamentos e troco contra o vNF (W16), não o vNFTot: é o total que a YA03-10 (NT 2025.001 v1.03) e a YA09-10 (MOC 7.0\n // Anexo I) citam, e a NT 2025.002 (até a v1.51) não mudou essas regras nem o W16.\n if (nfce && entrada.pagamento !== undefined && entrada.pagamento.detPag.length > 0 && issues.empty) {\n pagamentoNfce(pag, vNF, issues);\n }\n // W16-40 (rejeição 750): acima do limite, a NFC-e identifica o destinatário por CNPJ, CPF ou idEstrangeiro.\n if (nfce && vNF.gt(Decimal.of(NFCE_LIMITE_SEM_DESTINATARIO)) && dest === undefined) {\n issues.add(\n 'destinatario',\n 'campo_obrigatorio',\n `NFC-e acima de R$ ${NFCE_LIMITE_SEM_DESTINATARIO} identifica o destinatário (W16-40, rejeição 750)`,\n );\n }\n const ia = entrada.informacoesAdicionais;\n const infAdic =\n ia === undefined || Object.values(ia).every((x) => x === undefined)\n ? undefined\n : clean({\n infAdFisco: ia.infAdFisco,\n infCpl: ia.infCpl,\n obsCont: ia.obsCont,\n obsFisco: ia.obsFisco,\n procRef: ia.procRef,\n });\n\n // Responsável técnico e CSRT (NT 2018.005), com a exigência por UF como dado\n const exig = { ...exigenciaRespTec(emitUf, opcoes.ambiente, agora), ...opcoes.exigencias };\n const rt = entrada.respTec ?? opcoes.respTec;\n let infRespTec: Record<string, unknown> | undefined;\n if (rt === undefined) {\n if (exig.infRespTec === 'obrigatorio') {\n issues.add('respTec', 'resp_tec_obrigatorio', `a UF ${emitUf} exige o responsável técnico (rejeição 972)`);\n }\n } else {\n const cnpjRt = lerCnpj(rt.CNPJ, { caminho: 'respTec.CNPJ' });\n if (!cnpjRt.ok) issues.list.push(cnpjRt.erro);\n infRespTec = {\n CNPJ: cnpjRt.ok ? cnpjRt.valor : rt.CNPJ,\n xContato: rt.xContato,\n email: rt.email,\n fone: digits(rt.fone),\n };\n if (rt.csrt !== undefined) {\n infRespTec.idCSRT = rt.csrt.idCSRT;\n infRespTec.hashCSRT = await hashCsrt(rt.csrt.CSRT, chave);\n } else if (exig.csrt === 'obrigatorio') {\n issues.add('respTec.csrt', 'csrt_obrigatorio', `a UF ${emitUf} exige idCSRT e hashCSRT (rejeição 975)`);\n }\n }\n\n const inf = clean({\n versao: '4.00',\n Id: `NFe${chave}`,\n ide,\n emit,\n dest,\n retirada: local(entrada.retirada, 'retirada'),\n entrega: local(entrada.entrega, 'entrega'),\n autXML,\n det: itens.map((m) => m.det),\n total,\n transp,\n cobr,\n pag,\n infIntermed: entrada.infIntermed,\n infAdic,\n exporta: entrada.exporta,\n compra: entrada.compra,\n cana: entrada.cana,\n infRespTec,\n agropecuario: entrada.agropecuario,\n }) as unknown as TNFe_infNFe;\n\n // Regras da SEFAZ que só dependem do documento (ADR 0012).\n cstComIsento(entrada, idDest, issues);\n vencimentos(entrada, { dhEmi, instante: agora }, issues);\n\n camposForaDoPl(pl.infNFe, inf, 'infNFe', pl.vigencia.pl, issues);\n textosForaDoXml(inf, 'infNFe', issues);\n if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };\n\n // Serialização canônica e validação estrita contra o schema do PL vigente, antes de qualquer assinatura.\n // O serializer recusa com ErroSerializacao o que não cabe no modelo (escolhas exclusivas informadas juntas, por\n // exemplo vagao e balsa): vira ocorrência com o caminho do XML, nunca exceção.\n let xml: string;\n try {\n xml = `<NFe xmlns=\"${NFE_NS}\">${serializar(pl.infNFe, 'infNFe', inf, NFE_NS)}</NFe>`;\n } catch (e) {\n if (!(e instanceof ErroSerializacao)) throw e;\n return {\n ok: false,\n ocorrencias: [{ caminho: e.caminho, code: 'schema', mensagem: e.message, origem: 'montagem' }],\n };\n }\n const doc = lerXml(xml);\n const infEl = primeiroFilho(doc.raiz, 'infNFe', NFE_NS);\n const schemaIssues = infEl === undefined ? [] : validar(pl.infNFe, infEl);\n if (schemaIssues.length > 0) {\n return {\n ok: false,\n ocorrencias: schemaIssues.map((i) => ({\n caminho: i.caminho,\n code: 'schema',\n mensagem: `${i.code}: ${i.mensagem}`,\n origem: 'montagem',\n })),\n };\n }\n let supl: NfceSupl | undefined;\n if (nfce) {\n // infNFeSupl (grupo ZX, NT 2025.001 item 04): endereços da UF no dia da emissão, pelo horário de Brasília.\n const tabela = urlsNfce(emitUf, opcoes.ambiente, diaBrasilia(agora));\n const urlQr = opcoes.urlQrCode ?? tabela.qrCode;\n const urlChave = opcoes.urlChave ?? tabela.urlChave;\n if (urlQr === undefined || !/^https?:\\/\\//i.test(urlQr)) {\n issues.montagem(\n 'urlQrCode',\n 'qrcode_invalido',\n `sem endereço completo do QR Code da NFC-e para ${emitUf} em ${opcoes.ambiente}: informe urlQrCode (data/nfce-urls.json)`,\n );\n }\n if (urlChave === undefined) {\n issues.montagem(\n 'urlChave',\n 'qrcode_invalido',\n `sem URL de consulta por chave da NFC-e para ${emitUf}: informe urlChave`,\n );\n }\n if (urlQr === undefined || urlChave === undefined || !issues.empty)\n return { ok: false, ocorrencias: issues.classificadas };\n const p = await parametrosQrCode(\n {\n chave,\n ambiente: opcoes.ambiente,\n tpEmis,\n dhEmi,\n vNF: (inf.total as { ICMSTot: { vNF: string } }).ICMSTot.vNF,\n ...(dest === undefined ? {} : { dest: dest as { CNPJ?: string; CPF?: string; idEstrangeiro?: string } }),\n xml,\n },\n qr,\n );\n supl = { versao: qr.versao, urlChave, base: `${urlQr.replace(/\\?+$/, '')}?p=`, ...p };\n // O infNFeSupl contra o schema antes de assinar (padrões do qrCode por versão, tamanho do urlChave). Na versão 3\n // off-line, com uma assinatura do tamanho da de uma chave RSA de 2048 bits no lugar da que o certificado ainda vai\n // fazer; o `comQrCode` confere de novo com a assinatura verdadeira.\n const suplIssues = conferirSupl(\n inserirSupl({ xml, nfce: supl } as NfeMontada, supl.assinar ? ASSINATURA_2048 : undefined),\n );\n if (suplIssues.length > 0) return { ok: false, ocorrencias: suplIssues };\n }\n return {\n ok: true,\n valor: {\n chave,\n id: `NFe${chave}`,\n cNF,\n cDV,\n mod,\n tpEmis,\n dhEmi,\n ...(supl === undefined ? {} : { nfce: supl }),\n pl: pl.vigencia,\n infNFe: inf,\n xml,\n },\n };\n}\n\n/** Base64 de uma assinatura RSA de 2048 bits (256 bytes): a forma da assinatura do QR Code off-line na montagem. */\nconst ASSINATURA_2048 = codificarBase64(new Uint8Array(256));\n\n/** Ocorrências do `infNFeSupl` do XML contra o schema (`TNFe_infNFeSupl`), como de montagem. */\nfunction conferirSupl(xml: string): Ocorrencia[] {\n const el = primeiroFilho(lerXml(xml).raiz, 'infNFeSupl', NFE_NS);\n const erros = el === undefined ? [] : validar(TNFe_infNFeSupl as ComplexType, el);\n return erros.map((i) => ({\n caminho: i.caminho,\n code: 'schema',\n mensagem: `${i.code}: ${i.mensagem}`,\n origem: 'montagem',\n }));\n}\n\nconst escapeXml = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/**\n * Assinatura dos parâmetros do QR Code da NFC-e em contingência off-line com a versão 3 (RSA-SHA1 em Base64, com o\n * certificado que assina a nota; Manual do DANFE NFC-e 6.0, 4.4.2). `undefined` quando o QR Code não leva assinatura\n * (NF-e, emissão normal, versão 2).\n */\nexport async function assinaturaQrCode(nota: NfeMontada, assinador: Assinador): Promise<string | undefined> {\n return nota.nfce?.assinar === true ? assinarParametros(nota.nfce.parametros, assinador) : undefined;\n}\n\n/**\n * A NFC-e montada com o `infNFeSupl` (QR Code e `urlChave`) inserido por splice antes do fechamento de `NFe`, pronta\n * para a assinatura. Na versão 3 em contingência off-line, informe a `assinatura` (`assinaturaQrCode`); nos demais\n * casos ela não existe (ZX02-330, rejeição 445; ZX02-334, rejeição 474). Para assinar em três fases (A3, HSM), passe\n * este texto ao `prepararAssinatura` do `@sinete/core/xml` com o `id` da nota. Na NF-e (modelo 55), devolve o XML como\n * veio: ela não tem `infNFeSupl` (ZX01-10, rejeição 393).\n */\nexport function comQrCode(nota: NfeMontada, assinatura?: string): string {\n const xml = inserirSupl(nota, assinatura);\n // Com a assinatura verdadeira, o qrCode pode passar do tamanho que a montagem conferiu (chave maior que 2048 bits).\n if (assinatura !== undefined) {\n const issues = conferirSupl(xml);\n if (issues.length > 0) throw new ErroDeValidacao('o QR Code da NFC-e não passou no schema', issues);\n }\n return xml;\n}\n\nfunction inserirSupl(built: NfeMontada, assinatura: string | undefined): string {\n const s = built.nfce;\n if (s === undefined) {\n if (assinatura !== undefined) throw new ErroDeConfiguracao('a NF-e (modelo 55) não tem QR Code');\n return built.xml;\n }\n if (s.assinar && assinatura === undefined) {\n throw new ErroDeConfiguracao(\n 'NFC-e em contingência off-line com QR Code versão 3 precisa da assinatura (ZX02-334, rejeição 474)',\n );\n }\n if (!s.assinar && assinatura !== undefined) {\n throw new ErroDeConfiguracao('este QR Code não leva assinatura (ZX02-330, rejeição 445)');\n }\n const fim = '</NFe>';\n if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('NFC-e montada fora da forma esperada');\n const qrCode = `${s.base}${s.parametros}${assinatura === undefined ? '' : `|${assinatura}`}`;\n const supl = `<infNFeSupl><qrCode>${escapeXml(qrCode)}</qrCode><urlChave>${escapeXml(s.urlChave)}</urlChave></infNFeSupl>`;\n return built.xml.slice(0, -fim.length) + supl + fim;\n}\n\n/**\n * Assina a NF-e montada: na NFC-e, insere antes o `infNFeSupl` (`comQrCode`, com a assinatura do QR Code quando a\n * contingência off-line pede); depois, a `Signature` como último filho de `NFe`, tudo por splice, e devolve a string\n * final. É essa string que vai para a SEFAZ e para o banco; nada depois deve reparseá-la para reescrever.\n */\nexport async function assinarNfe(nota: NfeMontada, assinador: Assinador): Promise<string> {\n return assinarXml(comQrCode(nota, await assinaturaQrCode(nota, assinador)), { id: nota.id }, assinador);\n}\n",
5
+ "/**\n * Montagem da NF-e: entrada do domínio (`DadosNfe`) para o objeto tipado do `@sinete/schemas` no PL vigente, com os\n * derivados e os totais em decimal exato, a chave de acesso e as regras conferidas antes de qualquer serialização. A\n * saída é a string canônica de `<NFe>` ainda sem assinatura, já validada contra o schema; `assinarNfe` insere a\n * `Signature` por splice (ADR 0003) e nada mais toca nela.\n */\n\nimport type { Ambiente, Assinador, ContextoDeTempo, Ocorrencia, Uf } from '@sinete/core';\nimport {\n ErroDeConfiguracao,\n ErroDeValidacao,\n ehUf,\n formatarVerProc,\n relogioFixo,\n tpAmbDoAmbiente,\n ufPorSigla,\n} from '@sinete/core';\nimport { assinarXml, codificarBase64, lerXml, primeiroFilho } from '@sinete/core/xml';\nimport type { ComplexType, EntradaDeVigencia } from '@sinete/schemas';\nimport { ErroSerializacao, serializar, validar } from '@sinete/schemas';\nimport type {\n TNFe_infNFe,\n TNFe_infNFe_det,\n TNFe_infNFe_det_imposto,\n TNFe_infNFe_det_prod,\n TNFe_infNFe_ide_NFref,\n TNFe_infNFe_total_ICMSTot,\n TNFe_infNFe_total_ISSQNtot,\n TTribNFe,\n} from '@sinete/schemas/nfe/PL_010f';\nimport { TIS as TISCt, TNFe_infNFeSupl, TTribNFe as TTribNFeCt } from '@sinete/schemas/nfe/PL_010f';\nimport { lerChaveAcesso, lerCnpj, lerCpf, lerIe, montarChaveAcesso } from '@sinete/validators';\nimport arredondamento from '../data/arredondamento.json' with { type: 'json' };\nimport produtorRural from '../data/produtor-rural.json' with { type: 'json' };\nimport reforma from '../data/reforma.json' with { type: 'json' };\nimport respTecData from '../data/resp-tec.json' with { type: 'json' };\nimport type { RoundingMode } from '../decimal.ts';\nimport { Decimal } from '../decimal.ts';\nimport { D0302, D0302A04, D1104V, D1110V, D1203, D1302, D1302_OPC } from '../format.ts';\nimport { Issues } from '../issues.ts';\nimport type {\n DadosNfe,\n Destinatario,\n DocumentoPessoa,\n Emitente,\n Endereco,\n EnderecoExterior,\n Item,\n Local,\n Referenciada,\n ResponsavelTecnico,\n} from '../model.ts';\nimport type { AliquotaIbsCbsInformada, CalculadoraIbsCbs, PedidoIbsCbsItem } from '../ports.ts';\nimport { calculadoraIbsCbs } from '../rtc.ts';\nimport type { Instante } from '../time.ts';\nimport { deslocamentoDaUf, formatarDh } from '../time.ts';\nimport { VERSAO_PACOTE } from '../versao-gerada.ts';\nimport { conferirDestinatario } from './destinatario.ts';\nimport { decimaisInvalidos, grupoInvalido, ibsCbsDoItem, totalIbsCbs } from './ibscbs.ts';\nimport type { IcmsTotais } from './icms.ts';\nimport { buildIcms, zeroIcmsTotais } from './icms.ts';\nimport type { NfceSupl, PagMontado, QrCodeNfceOpcoes } from './nfce.ts';\nimport {\n assinarParametros,\n conferirNfce,\n NFCE_LIMITE_SEM_DESTINATARIO,\n pagamentoNfce,\n parametrosQrCode,\n urlsNfce,\n} from './nfce.ts';\nimport { camposForaDoPl, escolherPl } from './pl.ts';\nimport { cfopDeDevolucao, cstComIsento, cstComNaoContribuinte, exclusivoIbsCbs, vencimentos } from './rejeicoes.ts';\nimport { conferirTextosDaEntrada, textoXmlValido } from './textos.ts';\nimport { buildIcmsUfDest, buildIi, buildIpi, buildIssqn, buildPisCofins, buildPisCofinsSt } from './tributos.ts';\nimport type { Familia } from './values.ts';\nimport { Ctx, clean, digits, TOLERANCIA } from './values.ts';\n\nlet padrao: CalculadoraIbsCbs | undefined;\n\n/** A calculadora de IBS/CBS usada quando `opcoes.ibsCbs` não vem: o motor do sinete, criada uma vez por processo. */\nfunction calculadoraPadrao(): CalculadoraIbsCbs {\n padrao ??= calculadoraIbsCbs();\n return padrao;\n}\n\nexport const NFE_NS = 'http://www.portalfiscal.inf.br/nfe';\n\n/** Literal do nome do destinatário em homologação (MOC 7.0 Anexo I, RV E04-20, rejeição 598). */\nexport const XNOME_HOMOLOGACAO = 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL';\n\n/** Literal da descrição do primeiro item da NFC-e em homologação (MOC 7.0 Anexo I, RV I04-10, rejeição 373). */\nexport const XPROD_HOMOLOGACAO_NFCE = 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL';\n\nexport type ExigenciaRespTec = 'obrigatorio' | 'opcional';\n\nexport interface MontarNfeOpcoes {\n readonly ambiente: Ambiente;\n /** Relógio de emissão (dhEmi, PL vigente, CSRT) e de fato gerador (IBS/CBS). */\n readonly tempo: ContextoDeTempo;\n /**\n * Calculadora de IBS/CBS dos itens com `ibsCbs.classificacao`. Padrão: `calculadoraIbsCbs()`, o motor do sinete com o\n * dataset embarcado (importado na primeira nota que precisar dele) e as alíquotas oficiais. Informe outra para trocar\n * dataset, alíquotas, base ou regras, ou para calcular fora do sinete.\n */\n readonly ibsCbs?: CalculadoraIbsCbs;\n /** Fuso do emitente em minutos; padrão pela UF (`data/fusos.json`). */\n readonly deslocamentoMin?: number;\n /** Versão do aplicativo emissor (`verProc`); padrão `sinete <versão do @sinete/nfe>` (`formatarVerProc`). */\n readonly verProc?: string;\n /** Sobrepõe o modo de arredondamento de uma família (`data/arredondamento.json`). */\n readonly arredondamento?: Partial<Record<Familia, RoundingMode>>;\n /** Responsável técnico padrão (a software house), usado quando a nota não traz `respTec`. */\n readonly respTec?: ResponsavelTecnico;\n /** Sobrepõe a exigência de infRespTec e CSRT da tabela por UF (`data/resp-tec.json`). */\n readonly exigencias?: { readonly infRespTec?: ExigenciaRespTec; readonly csrt?: ExigenciaRespTec };\n /** Fonte de aleatoriedade para o cNF; padrão `crypto.getRandomValues`. */\n readonly aleatorio?: (bytes: Uint8Array) => Uint8Array;\n /**\n * O `vPag` do único `detPag` passa a ser o `vNF` calculado na mesma montagem, e o valor informado nele é ignorado.\n * Serve a quem recebe à vista o total da nota e não quer calcular o `vNF` antes de montar. Mais de um `detPag`,\n * nenhum, ou `tPag` 90 (sem pagamento) dão ocorrência `pagamento_igual_total`: não há como saber como repartir o\n * total, e a nota sem pagamento tem `vPag` zero.\n */\n readonly pagamentoIgualTotal?: boolean;\n /**\n * Só NFC-e (modelo 65): versão do QR Code. Padrão `{ versao: '3' }`, que dispensa o CSC (NT 2025.001). Com\n * `{ versao: '2', idCSC, CSC }`, o hash leva o CSC fornecido pela SEFAZ da UF, que nunca vai para o XML.\n */\n readonly qrCode?: QrCodeNfceOpcoes;\n /**\n * Só NFC-e: endereço da consulta via QR Code (sem o `?p=`). Padrão: o da UF do emitente no ambiente e na data de\n * emissão (`data/nfce-urls.json`, do Portal Nacional da NFC-e). AM e MA publicam o endereço sem o protocolo: lá, é\n * obrigatório.\n */\n readonly urlQrCode?: string;\n /** Só NFC-e: URL da consulta por chave de acesso (`urlChave`). Padrão: a da UF (`data/nfce-urls.json`). */\n readonly urlChave?: string;\n}\n\nexport interface NfeMontada {\n /** Chave de acesso (44 posições). */\n readonly chave: string;\n /** `Id` do `infNFe` (`NFe` + chave): é o que a assinatura referencia. */\n readonly id: string;\n readonly cNF: string;\n readonly cDV: string;\n /** 55 (NF-e) ou 65 (NFC-e). */\n readonly mod: '55' | '65';\n readonly tpEmis: string;\n readonly dhEmi: string;\n /**\n * NFC-e e NF-e com DANFE Simplificado Tipo 2 (tpImp 6, NT 2026.002): o `infNFeSupl` a acrescentar (`comQrCode`,\n * `assinarNfe`). Na versão 3 em contingência off-line, falta a assinatura dos parâmetros, que só o certificado faz\n * (`assinaturaQrCode`).\n */\n readonly nfce?: NfceSupl;\n /** Pacote de liberação usado (escolhido pela vigência). */\n readonly pl: EntradaDeVigencia;\n /** O objeto tipado, na forma do PL_010f (o mais novo que o pacote conhece). */\n readonly infNFe: TNFe_infNFe;\n /** `<NFe xmlns=\"...\">` com o `infNFe` canônico, sem assinatura, já validado contra o schema. */\n readonly xml: string;\n /**\n * Alíquotas do IBS/CBS que a calculadora usou vindas de quem integra (`comAliquotasInformadas`), e não da tabela\n * oficial do pacote, por item. Ausente quando todas foram oficiais. A montagem não recusa por isso: é o caminho para\n * emitir com uma alíquota já publicada antes de o pacote trazê-la. Guarde junto com a nota e alerte quem opera; em\n * produção, a alíquota informada é responsabilidade de quem a informou.\n */\n readonly aliquotasInformadas?: readonly AliquotaIbsCbsInformada[];\n}\n\nexport type ResultadoMontagemNfe =\n | { readonly ok: true; readonly valor: NfeMontada }\n | { readonly ok: false; readonly ocorrencias: readonly Ocorrencia[] };\n\nconst MODES: Record<Familia, RoundingMode> = Object.fromEntries(\n Object.entries(arredondamento.familias).map(([k, v]) => [k, v.modo as RoundingMode]),\n) as Record<Familia, RoundingMode>;\n\nconst SEM_GTIN = 'SEM GTIN';\nconst BRASILIA = -180;\n\nfunction diaBrasilia(d: Instante): string {\n return formatarDh(d, BRASILIA).slice(0, 10);\n}\n\n/** Exigência de infRespTec ou CSRT para a UF no ambiente e na data (tabela `data/resp-tec.json`). */\nexport function exigenciaRespTec(\n uf: Uf,\n ambiente: Ambiente,\n data: Instante,\n): { readonly infRespTec: ExigenciaRespTec; readonly csrt: ExigenciaRespTec } {\n const dia = diaBrasilia(data);\n const ufs = respTecData.ufs as Readonly<\n Record<string, { readonly csrt?: Record<string, string>; readonly infRespTec?: Record<string, string> }>\n >;\n const regra = Object.hasOwn(ufs, uf) ? ufs[uf] : undefined;\n const vale = (r: Record<string, string> | undefined, padrao: string): ExigenciaRespTec => {\n const desde = r?.[ambiente];\n if (desde !== undefined) return dia >= desde ? 'obrigatorio' : (padrao as ExigenciaRespTec);\n return padrao as ExigenciaRespTec;\n };\n return {\n infRespTec: vale(regra?.infRespTec, respTecData.padrao.infRespTec),\n csrt: vale(regra?.csrt, respTecData.padrao.csrt),\n };\n}\n\n/** `hashCSRT`: Base64(SHA-1(CSRT + chave de acesso)) (NT 2018.005, campo ZD09). */\nexport async function hashCsrt(csrt: string, chave: string): Promise<string> {\n const d = await globalThis.crypto.subtle.digest('SHA-1', new TextEncoder().encode(csrt + chave));\n return codificarBase64(new Uint8Array(d));\n}\n\n/** Normaliza CNPJ ou CPF, apontando a ocorrência do validador. */\nfunction documento(doc: DocumentoPessoa, path: string, issues: Issues): { CNPJ: string } | { CPF: string } {\n if (doc.CNPJ !== undefined) {\n const r = lerCnpj(doc.CNPJ, { caminho: `${path}.CNPJ` });\n if (!r.ok) issues.list.push(r.erro);\n return { CNPJ: r.ok ? r.valor : doc.CNPJ };\n }\n const r = lerCpf(doc.CPF ?? '', { caminho: `${path}.CPF` });\n if (!r.ok) issues.list.push(r.erro);\n return { CPF: r.ok ? r.valor : (doc.CPF ?? '') };\n}\n\nfunction ie(value: string | undefined, uf: Uf, path: string, issues: Issues, allowIsento: boolean): string | undefined {\n if (value === undefined) return undefined;\n const r = lerIe(value, uf, { caminho: path, aceitarIsento: allowIsento });\n if (!r.ok) {\n issues.list.push(r.erro);\n return value;\n }\n return r.valor.valor;\n}\n\nfunction endereco(e: Endereco): Record<string, string | undefined> {\n return {\n xLgr: e.xLgr,\n nro: e.nro,\n xCpl: e.xCpl,\n xBairro: e.xBairro,\n cMun: e.cMun,\n xMun: e.xMun,\n UF: e.UF,\n CEP: e.CEP === undefined ? undefined : digits(e.CEP),\n fone: e.fone === undefined ? undefined : digits(e.fone),\n };\n}\n\nfunction isExterior(e: Endereco | EnderecoExterior | undefined): e is EnderecoExterior {\n return e !== undefined && 'exterior' in e && e.exterior === true;\n}\n\n/** Gera um cNF de 8 dígitos que passa nas regras de emissão da chave (RV B03-10: fora das sequências e diferente do nNF). */\nfunction gerarChave(\n parts: { cUF: string; aamm: string; emitente: string; mod: string; serie: string; nNF: string; tpEmis: string },\n cNFInformado: string | undefined,\n random: (b: Uint8Array) => Uint8Array,\n issues: Issues,\n): { chave: string; cNF: string } | undefined {\n const tentar = (cNF: string): { chave: string; ok: boolean; issue?: Ocorrencia } => {\n const chave = montarChaveAcesso({ ...parts, cNF });\n const r = lerChaveAcesso(chave, { emissao: true, caminho: 'chave' });\n return r.ok ? { chave, ok: true } : { chave, ok: false, issue: r.erro };\n };\n if (cNFInformado !== undefined) {\n if (!/^\\d{8}$/.test(cNFInformado)) {\n issues.add('cNF', 'campo_invalido', 'cNF tem 8 algarismos');\n return undefined;\n }\n const r = tentar(cNFInformado);\n if (!r.ok && r.issue) {\n // O cNF informado recusado pela regra da chave é da entrada, no campo dela; outra parte da chave recusada aponta\n // a chave montada (a causa, se for da entrada, já apareceu no campo dela).\n const doCnf = r.issue.code === 'chave_cnf_invalido';\n issues.list.push({\n ...r.issue,\n caminho: doCnf ? 'cNF' : r.issue.caminho,\n code: 'chave_invalida',\n mensagem: `${r.issue.mensagem} (${r.issue.code})`,\n origem: doCnf ? 'entrada' : 'montagem',\n });\n }\n return r.ok ? { chave: r.chave, cNF: cNFInformado } : undefined;\n }\n for (let n = 0; n < 32; n++) {\n const b = random(new Uint8Array(4));\n const v = ((b[0] ?? 0) * 2 ** 24 + (b[1] ?? 0) * 2 ** 16 + (b[2] ?? 0) * 2 ** 8 + (b[3] ?? 0)) % 100_000_000;\n const cNF = String(v).padStart(8, '0');\n const r = tentar(cNF);\n if (r.ok) return { chave: r.chave, cNF };\n if (r.issue && r.issue.code !== 'chave_cnf_invalido') {\n // A chave com o cNF gerado aqui foi recusada por outra parte (UF, emitente, série): a ocorrência aponta a chave\n // montada; a causa, se for da entrada, já apareceu no campo dela.\n issues.list.push({\n ...r.issue,\n code: 'chave_invalida',\n mensagem: `${r.issue.mensagem} (${r.issue.code})`,\n origem: 'montagem',\n });\n return undefined;\n }\n }\n issues.montagem('cNF', 'chave_invalida', 'não foi possível gerar um cNF válido');\n return undefined;\n}\n\nfunction referencia(ref: Referenciada, path: string, issues: Issues): TNFe_infNFe_ide_NFref {\n const chave = (c: string, p: string): string => {\n const r = lerChaveAcesso(c, { caminho: p });\n if (!r.ok) issues.list.push(r.erro);\n return r.ok ? r.valor.chave : c;\n };\n if ('refNFe' in ref) return { refNFe: chave(ref.refNFe, `${path}.refNFe`) };\n if ('refNFeSig' in ref) {\n // Chave com o código numérico zerado para sigilo (NT 2022.003, BA02a): o DV é o da chave original, então a\n // conferência do DV não se aplica; confere-se a forma, o modelo 55 e o cNF zerado.\n const c = ref.refNFeSig.replace(/\\s/g, '').toUpperCase();\n if (!/^[0-9]{6}[0-9A-Z]{12}[0-9]{2}55[0-9]{22}$/.test(c) || c.slice(35, 43) !== '00000000') {\n issues.add(`${path}.refNFeSig`, 'chave_invalida', 'chave de NF-e (modelo 55) com o código numérico (cNF) zerado');\n }\n return { refNFeSig: c };\n }\n if ('refCTe' in ref) return { refCTe: chave(ref.refCTe, `${path}.refCTe`) };\n if ('refNF' in ref) return { refNF: ref.refNF };\n if ('refECF' in ref) return { refECF: ref.refECF };\n const nfp = ref.refNFP;\n // Nota de produtor em papel (modelo 04) extinta: só referência a nota emitida antes do fim na UF dela.\n if (nfp.mod === '04') {\n const porUf = produtorRural.refNFP.ufs as Readonly<Record<string, { readonly vedadaDesde: string }>>;\n const cUfSigla = Object.keys(porUf).find((k) => ufPorSigla(k)?.cUF === nfp.cUF);\n const vedadaDesde = cUfSigla ? (porUf[cUfSigla]?.vedadaDesde ?? '') : produtorRural.refNFP.modelo04.vedadaDesde;\n if (nfp.AAMM >= vedadaDesde) {\n issues.add(\n `${path}.refNFP.AAMM`,\n 'referencia_vedada',\n `nota de produtor modelo 04 emitida em ${nfp.AAMM}, depois do fim do modelo (${vedadaDesde}; ${produtorRural.refNFP.modelo04.fonte})`,\n );\n }\n }\n const doc = documento(nfp as DocumentoPessoa, `${path}.refNFP`, issues);\n return {\n refNFP: {\n cUF: nfp.cUF,\n AAMM: nfp.AAMM,\n ...doc,\n IE: nfp.IE,\n mod: nfp.mod,\n serie: String(Number(nfp.serie)),\n nNF: String(Number(nfp.nNF)),\n },\n } as TNFe_infNFe_ide_NFref;\n}\n\n/**\n * Texto com caractere que o XML não representa vira ocorrência com o caminho do campo, em vez de falhar no parse do\n * documento montado. Os textos da entrada já foram conferidos com o caminho dela (`conferirTextosDaEntrada`): aqui só\n * sobra o que veio das opções da montagem.\n */\nfunction textosForaDoXml(value: unknown, path: string, issues: Issues): void {\n if (typeof value === 'string') {\n if (!textoXmlValido(value)) issues.montagem(path, 'campo_invalido', 'texto com caractere não permitido em XML');\n } else if (Array.isArray(value)) {\n for (const [n, v] of value.entries()) textosForaDoXml(v, `${path}[${n}]`, issues);\n } else if (typeof value === 'object' && value !== null) {\n for (const [k, v] of Object.entries(value)) textosForaDoXml(v, `${path}.${k}`, issues);\n }\n}\n\ninterface ItemMontado {\n readonly det: TNFe_infNFe_det;\n readonly icms: IcmsTotais;\n readonly indTot: boolean;\n readonly issqn: boolean;\n readonly faturamentoDireto: boolean;\n readonly v: Record<\n | 'vProd'\n | 'vFrete'\n | 'vSeg'\n | 'vDesc'\n | 'vOutro'\n | 'vII'\n | 'vIPI'\n | 'vIPIDevol'\n | 'vPIS'\n | 'vCOFINS'\n | 'vPISST'\n | 'vCOFINSST'\n | 'vFCPUFDest'\n | 'vICMSUFDest'\n | 'vICMSUFRemet'\n | 'vTotTrib'\n | 'vISSQN'\n | 'vBCISS',\n Decimal\n >;\n readonly temUfDest: boolean;\n readonly temTotTrib: boolean;\n readonly issqnOpcionais: Record<string, Decimal>;\n}\n\nfunction montarItem(ctx: Ctx, item: Item, n: number, normal: boolean, semIe: boolean): ItemMontado {\n const path = `itens[${n}]`;\n const p = item.produto;\n const pp = `${path}.produto`;\n const qCom = ctx.req(p.qCom, `${pp}.qCom`, D1104V);\n const vUnCom = ctx.req(p.vUnCom, `${pp}.vUnCom`, D1110V);\n // RV I11 (rejeição 629) só vale para a NF-e normal (finNFe 1); nas demais o vProd informado prevalece.\n const vProd = (normal ? ctx.calc : ctx.base).call(ctx, p.vProd, qCom.times(vUnCom), `${pp}.vProd`, D1302, 'produto');\n const uTrib = p.uTrib ?? p.uCom;\n const qTrib = p.qTrib === undefined ? qCom : ctx.req(p.qTrib, `${pp}.qTrib`, D1104V);\n let vUnTrib: Decimal;\n if (p.vUnTrib !== undefined) vUnTrib = ctx.req(p.vUnTrib, `${pp}.vUnTrib`, D1110V);\n else if (uTrib === p.uCom && qTrib.eq(qCom)) vUnTrib = vUnCom;\n else if (qTrib.isZero()) vUnTrib = Decimal.ZERO;\n else vUnTrib = vProd.dividedBy(qTrib, 10, ctx.modes.produto);\n // RV I11 (rejeição 630), só na NF-e normal: vProd confere também com qTrib × vUnTrib, com a tolerância da nota (*4).\n if (normal) {\n const trib = ctx.round(qTrib.times(vUnTrib), D1302, 'produto');\n if (trib.minus(vProd).abs().gt(TOLERANCIA)) {\n ctx.issues.add(\n `${pp}.vUnTrib`,\n 'valor_divergente',\n `qTrib × vUnTrib (${trib.toFixed(2)}) difere de vProd (${vProd.toFixed(2)}) em mais de ${TOLERANCIA.toString()}`,\n );\n }\n }\n // Campos TDec_1302Opc: zero informado é aceito e omitido do XML (o pattern não aceita zero).\n const opt = (v: typeof p.vFrete, k: string): Decimal => ctx.opt(v, `${pp}.${k}`, D1302) ?? Decimal.ZERO;\n const vFrete = opt(p.vFrete, 'vFrete');\n const vSeg = opt(p.vSeg, 'vSeg');\n const vDesc = opt(p.vDesc, 'vDesc');\n const vOutro = opt(p.vOutro, 'vOutro');\n const vOp = vProd.plus(vFrete).plus(vSeg).plus(vOutro).minus(vDesc);\n const cEAN = p.cEAN ?? SEM_GTIN;\n const especifico = p.especifico ?? {};\n const prod = clean({\n cProd: p.cProd,\n cEAN,\n cBarra: p.cBarra,\n xProd: p.xProd,\n NCM: digits(p.NCM),\n NVE: p.NVE as string[] | undefined,\n CEST: p.CEST === undefined ? undefined : digits(p.CEST),\n indEscala: p.indEscala,\n CNPJFab: p.CNPJFab,\n cBenef: p.cBenef,\n gCred: p.gCred,\n tpCredPresIBSZFM: p.tpCredPresIBSZFM,\n EXTIPI: p.EXTIPI,\n CFOP: digits(p.CFOP),\n uCom: p.uCom,\n qCom: ctx.s(qCom, D1104V),\n vUnCom: ctx.s(vUnCom, D1110V),\n vProd: ctx.s(vProd, D1302),\n cEANTrib: p.cEANTrib ?? cEAN,\n cBarraTrib: p.cBarraTrib,\n uTrib,\n qTrib: ctx.s(qTrib, D1104V),\n vUnTrib: ctx.s(vUnTrib, D1110V),\n vFrete: ctx.so(vFrete, D1302_OPC),\n vSeg: ctx.so(vSeg, D1302_OPC),\n vDesc: ctx.so(vDesc, D1302_OPC),\n vOutro: ctx.so(vOutro, D1302_OPC),\n indTot: p.indTot ?? '1',\n indBemMovelUsado: p.indBemMovelUsado,\n DI: p.DI,\n detExport: p.detExport,\n xPed: p.xPed,\n nItemPed: p.nItemPed,\n nFCI: p.nFCI,\n rastro: p.rastro,\n infProdNFF: p.infProdNFF,\n infProdEmb: p.infProdEmb,\n ...especifico,\n }) as unknown as TNFe_infNFe_det_prod;\n\n const imp = item.impostos;\n const ip = `${path}.impostos`;\n const imposto: Record<string, unknown> = {};\n const z = Decimal.ZERO;\n const v: ItemMontado['v'] = {\n vProd,\n vFrete,\n vSeg,\n vDesc,\n vOutro,\n vII: z,\n vIPI: z,\n vIPIDevol: z,\n vPIS: z,\n vCOFINS: z,\n vPISST: z,\n vCOFINSST: z,\n vFCPUFDest: z,\n vICMSUFDest: z,\n vICMSUFRemet: z,\n vTotTrib: z,\n vISSQN: z,\n vBCISS: z,\n };\n let issqnOpcionais: Record<string, Decimal> = {};\n const vTotTrib = ctx.opt(imp.vTotTrib, `${ip}.vTotTrib`, D1302);\n if (vTotTrib !== undefined) {\n imposto.vTotTrib = ctx.s(vTotTrib, D1302);\n v.vTotTrib = vTotTrib;\n }\n if (imp.icms !== undefined && imp.issqn !== undefined) {\n ctx.issues.add(ip, 'combinacao_invalida', 'o item tem ICMS ou ISSQN, nunca os dois');\n }\n if (imp.ipi !== undefined) {\n const r = buildIpi(ctx, imp.ipi, vOp, `${ip}.ipi`);\n imposto.IPI = r.grupo;\n v.vIPI = r.vIPI;\n }\n let icms = zeroIcmsTotais();\n if (imp.icms !== undefined) {\n const r = buildIcms(ctx, imp.icms, { vOp, vIPI: v.vIPI }, `${ip}.icms`);\n imposto.ICMS = r.grupo;\n icms = r.totais;\n } else if (imp.issqn === undefined && imp.ibsCbs === undefined && !semIe) {\n // Na NF-e sem IE do emitente a falta de ICMS e ISSQN é a exceção 2 da RV B25-90 (NT 2026.007); a falta do grupo\n // IBS/CBS sai como a 162, no caminho dele.\n ctx.issues.add(`${ip}.icms`, 'campo_obrigatorio', 'o item precisa de ICMS (ou ISSQN, na NF-e conjugada)');\n }\n if (imp.ii !== undefined) {\n const r = buildIi(ctx, imp.ii, `${ip}.ii`);\n imposto.II = r.grupo;\n v.vII = r.vII;\n }\n if (imp.issqn !== undefined) {\n const r = buildIssqn(ctx, imp.issqn, `${ip}.issqn`);\n imposto.ISSQN = r.grupo;\n v.vISSQN = r.vISSQN;\n v.vBCISS = r.vBC;\n issqnOpcionais = r.opcionais;\n }\n if (imp.pis !== undefined) {\n const r = buildPisCofins(ctx, imp.pis, 'PIS', `${ip}.pis`);\n imposto.PIS = r.grupo;\n v.vPIS = r.valor;\n }\n if (imp.pisSt !== undefined) {\n const r = buildPisCofinsSt(ctx, imp.pisSt, 'PIS', `${ip}.pisSt`);\n imposto.PISST = r.grupo;\n if (r.soma) v.vPISST = r.valor;\n }\n if (imp.cofins !== undefined) {\n const r = buildPisCofins(ctx, imp.cofins, 'COFINS', `${ip}.cofins`);\n imposto.COFINS = r.grupo;\n v.vCOFINS = r.valor;\n }\n if (imp.cofinsSt !== undefined) {\n const r = buildPisCofinsSt(ctx, imp.cofinsSt, 'COFINS', `${ip}.cofinsSt`);\n imposto.COFINSST = r.grupo;\n if (r.soma) v.vCOFINSST = r.valor;\n }\n if (imp.icmsUfDest !== undefined) {\n const r = buildIcmsUfDest(ctx, imp.icmsUfDest, `${ip}.icmsUfDest`);\n imposto.ICMSUFDest = r.grupo;\n v.vFCPUFDest = r.vFCPUFDest;\n v.vICMSUFDest = r.vICMSUFDest;\n v.vICMSUFRemet = r.vICMSUFRemet;\n }\n if (imp.is !== undefined) imposto.IS = imp.is;\n if (imp.ibsCbs?.grupo !== undefined) imposto.IBSCBS = imp.ibsCbs.grupo;\n\n const det: Record<string, unknown> = {\n nItem: String(n + 1),\n prod,\n imposto: imposto as unknown as TNFe_infNFe_det_imposto,\n };\n if (item.impostoDevol !== undefined) {\n const pDevol = ctx.req(item.impostoDevol.pDevol, `${path}.impostoDevol.pDevol`, D0302);\n const vIPIDevol = ctx.req(item.impostoDevol.vIPIDevol, `${path}.impostoDevol.vIPIDevol`, D1302);\n det.impostoDevol = { pDevol: ctx.s(pDevol, D0302), IPI: { vIPIDevol: ctx.s(vIPIDevol, D1302) } };\n v.vIPIDevol = vIPIDevol;\n }\n if (item.infAdProd !== undefined) det.infAdProd = item.infAdProd;\n if (item.obsItem !== undefined) det.obsItem = item.obsItem;\n if (item.DFeReferenciado !== undefined) {\n const r = lerChaveAcesso(item.DFeReferenciado.chaveAcesso, { caminho: `${path}.DFeReferenciado.chaveAcesso` });\n if (!r.ok) ctx.issues.list.push(r.erro);\n det.DFeReferenciado = clean({\n chaveAcesso: r.ok ? r.valor.chave : item.DFeReferenciado.chaveAcesso,\n nItem: item.DFeReferenciado.nItem === undefined ? undefined : String(item.DFeReferenciado.nItem),\n });\n }\n return {\n det: det as unknown as TNFe_infNFe_det,\n icms,\n indTot: (p.indTot ?? '1') === '1',\n issqn: imp.issqn !== undefined,\n faturamentoDireto: (especifico as { veicProd?: { tpOp?: string } }).veicProd?.tpOp === '2',\n v,\n temUfDest: imp.icmsUfDest !== undefined,\n temTotTrib: vTotTrib !== undefined,\n issqnOpcionais,\n };\n}\n\n/** Parte do vItem/vNF comum aos dois (MOC W16-10 com NT 2020.005 e NT 2023.004; NT 2025.002 VB01-10 e VB01-20). */\nfunction composicao(m: ItemMontado, incluirProd: boolean): Decimal {\n const v = m.v;\n let total = (incluirProd ? v.vProd : Decimal.ZERO)\n .minus(v.vDesc)\n .minus(m.icms.vICMSDesonDeduz)\n .plus(v.vFrete)\n .plus(v.vSeg)\n .plus(v.vOutro)\n .plus(v.vII)\n .plus(v.vIPI)\n .plus(v.vPISST)\n .plus(v.vCOFINSST);\n if (!m.faturamentoDireto) {\n total = total.plus(m.icms.vST).plus(m.icms.vICMSMonoReten).plus(m.icms.vFCPST).plus(v.vIPIDevol);\n }\n return total;\n}\n\n/** Monta, calcula e valida. Nunca lança por dado do chamador: devolve as ocorrências. */\nexport async function montarNfe(entrada: DadosNfe, opcoes: MontarNfeOpcoes): Promise<ResultadoMontagemNfe> {\n const issues = new Issues();\n const finNFeIn = entrada.finNFe ?? '1';\n const mod = entrada.modelo ?? '55';\n if (mod !== '55' && mod !== '65') {\n issues.add('modelo', 'modelo_nao_suportado', `modelo ${String(mod)}: o builder monta NF-e (55) e NFC-e (65)`);\n return { ok: false, ocorrencias: issues.classificadas };\n }\n const nfce = mod === '65';\n // Padrões da identificação resolvidos uma vez: o mesmo valor vai para o ide e para a calculadora de IBS/CBS. A NFC-e\n // é presencial e para consumidor final (MOC 7.0 Anexo I, B25a-10 e B25b-20).\n const indPres = entrada.indPres ?? (nfce ? '1' : finNFeIn === '2' || finNFeIn === '3' ? '0' : '9');\n const indFinal = entrada.indFinal ?? (nfce || entrada.destinatario?.indIEDest === '9' ? '1' : '0');\n const ctx = new Ctx(issues, { ...MODES, ...opcoes.arredondamento }, finNFeIn !== '2' && finNFeIn !== '3');\n const pRedutorGov = entrada.gCompraGov && ctx.req(entrada.gCompraGov.pRedutor, 'gCompraGov.pRedutor', D0302A04);\n const emitUf = entrada.emitente.endereco.UF;\n if (!ehUf(emitUf)) {\n issues.add('emitente.endereco.UF', 'campo_invalido', 'UF do emitente inválida');\n return { ok: false, ocorrencias: issues.classificadas };\n }\n const cUF = ufPorSigla(emitUf)?.cUF ?? '';\n const offset = opcoes.deslocamentoMin ?? deslocamentoDaUf(emitUf);\n const agora = opcoes.tempo.emissao.agora();\n // Um instante de fato gerador por montagem: o mesmo vai para a calculadora e para a regra de composição do vItem.\n const fatoGerador = opcoes.tempo.fatoGerador.agora();\n const dhEmi = formatarDh(agora, offset);\n const aamm = dhEmi.slice(2, 4) + dhEmi.slice(5, 7);\n const tpAmb = tpAmbDoAmbiente(opcoes.ambiente);\n\n // PL vigente (ErroVigencia do schemas propaga: data fora de toda vigência é erro de configuração, não de dado).\n // O PL sai do mesmo instante do dhEmi: reler o relógio numa virada de vigência escolheria outro PL.\n const pl = escolherPl(opcoes.ambiente, relogioFixo(agora));\n\n // Emitente (grupo C)\n const e: Emitente = entrada.emitente;\n const emitDoc = documento(e, 'emitente', issues);\n const serie = Number(entrada.serie);\n const nNF = Number(entrada.nNF);\n if (!Number.isInteger(serie) || serie < 0 || serie > 999) issues.add('serie', 'serie_invalida', 'série de 0 a 999');\n if (!Number.isInteger(nNF) || nNF < 1 || nNF > 999_999_999)\n issues.add('nNF', 'campo_invalido', 'nNF de 1 a 999999999');\n const [cpfIni, cpfFim] = produtorRural.series.cpf as [number, number];\n const [cnpjIni, cnpjFim] = produtorRural.series.cnpj as [number, number];\n if ('CPF' in emitDoc && (serie < cpfIni || serie > cpfFim)) {\n issues.add(\n 'serie',\n 'serie_invalida',\n `emitente pessoa física usa as séries ${cpfIni} a ${cpfFim} (${produtorRural.series.fonte})`,\n );\n } else if ('CNPJ' in emitDoc && Number.isInteger(serie) && serie >= 0 && (serie < cnpjIni || serie > cnpjFim)) {\n issues.add(\n 'serie',\n 'serie_invalida',\n `emitente CNPJ usa as séries ${cnpjIni} a ${cnpjFim} (${produtorRural.series.fonteCnpj})`,\n );\n }\n const emit = clean({\n ...emitDoc,\n xNome: e.xNome,\n xFant: e.xFant,\n enderEmit: clean({ ...endereco(e.endereco), cPais: '1058', xPais: 'BRASIL' }),\n IE: ie(e.IE, emitUf, 'emitente.IE', issues, true),\n IEST: e.IEST,\n IM: e.IM,\n CNAE: e.CNAE,\n CRT: e.CRT,\n ISUFEmit: e.ISUFEmit,\n });\n\n // Destinatário (grupo E): obrigatório na NF-e (RV E01-10); na NFC-e, só na entrega a domicílio (E01-20, conferida\n // com as demais regras da NFC-e).\n const d: Destinatario | undefined = entrada.destinatario;\n let dest: Record<string, unknown> | undefined;\n let destUf: Uf | 'EX' | undefined;\n if (d === undefined) {\n if (!nfce) issues.add('destinatario', 'campo_obrigatorio', 'a NF-e exige o destinatário (E01-10, rejeição 719)');\n } else {\n const docDest =\n 'idEstrangeiro' in d && d.idEstrangeiro !== undefined\n ? { idEstrangeiro: d.idEstrangeiro }\n : documento(d as DocumentoPessoa, 'destinatario', issues);\n let enderDest: Record<string, string | undefined> | undefined;\n if (isExterior(d.endereco)) {\n destUf = 'EX';\n enderDest = clean({\n xLgr: d.endereco.xLgr,\n nro: d.endereco.nro,\n xCpl: d.endereco.xCpl,\n xBairro: d.endereco.xBairro,\n cMun: '9999999',\n xMun: 'EXTERIOR',\n UF: 'EX',\n cPais: d.endereco.cPais,\n xPais: d.endereco.xPais,\n fone: d.endereco.fone === undefined ? undefined : digits(d.endereco.fone),\n });\n } else if (d.endereco !== undefined) {\n destUf = d.endereco.UF;\n enderDest = clean({ ...endereco(d.endereco), cPais: '1058', xPais: 'BRASIL' });\n }\n // IE sem UF (endereço ausente) ou no exterior não é conferida aqui: a E05-10 e a E17-40 recusam a combinação.\n const destIe =\n d.IE !== undefined && destUf !== undefined && destUf !== 'EX'\n ? ie(d.IE, destUf, 'destinatario.IE', issues, false)\n : d.IE;\n dest = clean({\n ...docDest,\n xNome: opcoes.ambiente === 'homologacao' ? XNOME_HOMOLOGACAO : d.xNome,\n enderDest,\n indIEDest: d.indIEDest,\n IE: destIe,\n ISUF: d.ISUF,\n IM: d.IM,\n email: d.email,\n });\n }\n\n // Identificação: contingência e forma de emissão\n const cont = entrada.contingencia;\n const tpEmis = cont?.tpEmis ?? '1';\n if (cont !== undefined) {\n if (cont.xJust.length < 15 || cont.xJust.length > 256) {\n issues.add(\n 'contingencia.xJust',\n 'contingencia_invalida',\n 'justificativa da contingência com 15 a 256 caracteres',\n );\n }\n if (cont.dhCont.getTime() > agora.getTime()) {\n issues.add('contingencia.dhCont', 'contingencia_invalida', 'entrada em contingência posterior à emissão');\n }\n if (!nfce && tpEmis === '9' && (entrada.tpImp ?? '1') !== '6') {\n issues.add(\n 'contingencia.tpEmis',\n 'contingencia_invalida',\n 'contingência off-line (tpEmis 9) é da NFC-e e da NF-e com DANFE Simplificado Tipo 2, tpImp 6 (B22-10, rejeição 711)',\n );\n }\n if (nfce && (tpEmis === '6' || tpEmis === '7')) {\n issues.add(\n 'contingencia.tpEmis',\n 'contingencia_invalida',\n 'a NFC-e não é autorizada pela SVC; a contingência dela é off-line, tpEmis 9 (B22-70, rejeição 783)',\n );\n }\n }\n\n // Identificação que as regras do modelo conferem antes de montar.\n // Na NFC-e a operação é sempre interna (B11a-10, rejeição 707): o endereço do consumidor não a torna interestadual.\n const idDest =\n entrada.idDest ?? (nfce ? '1' : destUf === 'EX' ? '3' : destUf !== undefined && destUf !== emitUf ? '2' : '1');\n const tpImp = entrada.tpImp ?? (nfce ? '4' : '1');\n conferirDestinatario(\n entrada,\n {\n mod,\n tpNF: entrada.tpNF,\n idDest,\n idDestInformado: entrada.idDest !== undefined,\n indFinal,\n producao: opcoes.ambiente === 'producao',\n },\n issues,\n );\n if (nfce) {\n conferirNfce(\n entrada,\n {\n tpNF: entrada.tpNF,\n idDest,\n tpImp,\n finNFe: finNFeIn,\n indFinal,\n indPres,\n },\n issues,\n );\n } else if (tpImp === '4' || tpImp === '5') {\n issues.add('tpImp', 'campo_invalido', 'tpImp 4 e 5 (DANFC-e) são da NFC-e (B21-20, rejeição 710)');\n }\n // QR Code no infNFeSupl: NFC-e e NF-e com DANFE Simplificado Tipo 2 (NT 2026.002 v1.11, ZX02-10), esta só na versão 3\n // (ZX02-220, rejeição 672) e com a URL da NFC-e da UF (ZX02-20, observação 3).\n const comQr = nfce || tpImp === '6';\n const qr: QrCodeNfceOpcoes = opcoes.qrCode ?? { versao: '3' };\n if (!nfce && comQr && qr.versao === '2') {\n issues.montagem(\n 'qrCode.versao',\n 'qrcode_invalido',\n 'a NF-e com DANFE Simplificado Tipo 2 usa só o QR Code versão 3 (ZX02-220, rejeição 672)',\n );\n }\n if (nfce && qr.versao === '2') {\n // O CSC e o idCSC são opções do montador, não da nota: as ocorrências são da montagem (ADR 0011).\n if (!/^\\d{1,6}$/.test(qr.idCSC) || Number(qr.idCSC) === 0) {\n issues.montagem(\n 'qrCode.idCSC',\n 'qrcode_invalido',\n 'idCSC tem de 1 a 6 algarismos, diferente de zero (Manual do DANFE NFC-e 6.0, 4.6)',\n );\n }\n if (qr.CSC.length < 16 || qr.CSC.length > 36) {\n issues.montagem(\n 'qrCode.CSC',\n 'qrcode_invalido',\n 'o CSC tem de 16 a 36 caracteres (Manual do DANFE NFC-e 6.0, 4.6)',\n );\n }\n if ('CPF' in emitDoc) {\n issues.montagem(\n 'qrCode.versao',\n 'qrcode_invalido',\n 'emitente pessoa física usa o QR Code versão 3 (NT 2025.001, ZX02-222, rejeição 444)',\n );\n }\n }\n\n // Chave de acesso e cNF\n const random =\n opcoes.aleatorio ??\n ((b: Uint8Array): Uint8Array => globalThis.crypto.getRandomValues(b as Uint8Array<ArrayBuffer>));\n const emitente14 = 'CNPJ' in emitDoc ? emitDoc.CNPJ : emitDoc.CPF;\n const gerada = issues.empty\n ? gerarChave(\n { cUF, aamm, emitente: emitente14, mod, serie: String(serie), nNF: String(nNF), tpEmis },\n entrada.cNF,\n random,\n issues,\n )\n : undefined;\n const chave = gerada?.chave ?? '0'.repeat(44);\n const cNF = gerada?.cNF ?? '00000000';\n const cDV = chave.slice(43);\n\n // Itens\n if (entrada.itens.length === 0 || entrada.itens.length > 990) {\n issues.add('itens', 'itens_limite', 'a NF-e tem de 1 a 990 itens');\n }\n const semIe = !nfce && entrada.emitente.IE === undefined;\n const itens = entrada.itens.map((it, n) => montarItem(ctx, it, n, finNFeIn === '1', semIe));\n // Na NFC-e em homologação, a descrição do primeiro item é a literal da RV I04-10, como o nome do destinatário da\n // E04-20: o builder a põe, e a descrição informada fica fora do XML de teste.\n const primeiro = itens[0];\n if (nfce && opcoes.ambiente === 'homologacao' && primeiro !== undefined) {\n (primeiro.det.prod as unknown as Record<string, unknown>).xProd = XPROD_HOMOLOGACAO_NFCE;\n }\n\n // IBS/CBS pela calculadora das opções, ou pelo motor do sinete\n const classificados = entrada.itens\n .map((it, n) => ({ it, n }))\n .filter(({ it }) => it.impostos.ibsCbs?.classificacao !== undefined);\n let aliquotasInformadas: readonly AliquotaIbsCbsInformada[] = [];\n if (classificados.length > 0) {\n const calculadora = opcoes.ibsCbs ?? calculadoraPadrao();\n const reqs: PedidoIbsCbsItem[] = classificados.map(({ it, n }) => {\n const c = it.impostos.ibsCbs?.classificacao as NonNullable<\n NonNullable<typeof it.impostos.ibsCbs>['classificacao']\n >;\n const m = itens[n] as ItemMontado;\n const vBC = ctx.opt(c.vBC, `itens[${n}].impostos.ibsCbs.classificacao.vBC`, D1302);\n const qTrib = Decimal.of((m.det.prod as { qTrib: string }).qTrib);\n return {\n nItem: n + 1,\n CST: c.CST,\n cClassTrib: c.cClassTrib,\n ...(c.indDoacao ? { indDoacao: c.indDoacao } : {}),\n ...(c.cCredPres ? { cCredPres: c.cCredPres } : {}),\n ...(c.gTribRegular ? { gTribRegular: c.gTribRegular } : {}),\n ...(vBC ? { vBC } : {}),\n NCM: (m.det.prod as { NCM: string }).NCM,\n CFOP: (m.det.prod as { CFOP: string }).CFOP,\n uTrib: (m.det.prod as { uTrib: string }).uTrib,\n qTrib,\n vProd: m.v.vProd,\n vDesc: m.v.vDesc,\n vFrete: m.v.vFrete,\n vSeg: m.v.vSeg,\n vOutro: m.v.vOutro,\n vICMS: m.icms.vICMS,\n vICMSST: m.icms.vST,\n vFCP: m.icms.vFCP,\n vFCPST: m.icms.vFCPST,\n vIPI: m.v.vIPI,\n vPIS: m.v.vPIS,\n vCOFINS: m.v.vCOFINS,\n vII: m.v.vII,\n vISSQN: m.v.vISSQN,\n vICMSUFDest: m.v.vICMSUFDest,\n vFCPUFDest: m.v.vFCPUFDest,\n };\n });\n const destino =\n entrada.entrega !== undefined\n ? { UF: entrada.entrega.UF, cMun: entrada.entrega.cMun }\n : d?.endereco !== undefined\n ? isExterior(d.endereco)\n ? { UF: 'EX' as const, cMun: '9999999' }\n : { UF: d.endereco.UF, cMun: d.endereco.cMun }\n : undefined;\n const compra = entrada.gCompraGov;\n const resp = await calculadora.calcular({\n nota: {\n fatoGerador,\n emissao: agora,\n ambiente: opcoes.ambiente,\n mod,\n tpNF: entrada.tpNF,\n finNFe: finNFeIn,\n ...(entrada.tpNFDebito ? { tpNFDebito: entrada.tpNFDebito } : {}),\n ...(entrada.tpNFCredito ? { tpNFCredito: entrada.tpNFCredito } : {}),\n indFinal,\n indPres,\n emitente: { UF: emitUf, cMun: e.endereco.cMun, CRT: e.CRT },\n ...(destino ? { destino } : {}),\n ...(entrada.cMunFGIBS ? { cMunFGIBS: entrada.cMunFGIBS } : {}),\n ...(compra && pRedutorGov\n ? {\n compraGov: {\n tpEnteGov: compra.tpEnteGov,\n pRedutor: pRedutorGov,\n tpOperGov: compra.tpOperGov,\n },\n }\n : {}),\n },\n itens: reqs,\n });\n issues.addAll(resp.ocorrencias ?? [], 'montagem');\n aliquotasInformadas = resp.aliquotasInformadas ?? [];\n // A calculadora que recusou já disse por quê: o grupo que faltar é consequência da ocorrência dela, e uma segunda\n // ocorrência por item repetiria a causa. `ibscbs_calculo` fica para a calculadora que omite um item sem explicar.\n const explicou = (resp.ocorrencias?.length ?? 0) > 0;\n for (const { n } of classificados) {\n const g = resp.itens.find((x) => x.nItem === n + 1);\n if (g === undefined) {\n if (!explicou)\n issues.montagem(\n `itens[${n}].impostos.ibsCbs`,\n 'ibscbs_calculo',\n 'a calculadora não devolveu o grupo IBSCBS do item',\n );\n continue;\n }\n ((itens[n] as ItemMontado).det.imposto as Record<string, unknown>).IBSCBS = g.IBSCBS;\n }\n }\n\n // Grupos repassados (IBSCBS pronto ou da calculadora, IS) chegam como texto: número malformado vira ocorrência antes\n // de qualquer soma, nunca exceção.\n itens.forEach((m, n) => {\n const imp = m.det.imposto as { IBSCBS?: unknown; IS?: unknown };\n const ib = `itens[${n}].impostos.ibsCbs`;\n const is = `itens[${n}].impostos.is`;\n // O IBSCBS pronto (ibsCbs.grupo) é da entrada; o que a calculadora devolveu é da montagem (ADR 0011).\n const ibsDaCalculadora = entrada.itens[n]?.impostos.ibsCbs?.grupo === undefined;\n const antes = issues.list.length;\n decimaisInvalidos(imp.IBSCBS, ib, issues);\n if (ibsDaCalculadora) issues.reclassificarDesde(antes, 'montagem');\n decimaisInvalidos(imp.IS, is, issues);\n if (issues.list.length === antes) {\n grupoInvalido(TTribNFeCt as ComplexType, 'IBSCBS', imp.IBSCBS, ib, issues);\n if (ibsDaCalculadora) issues.reclassificarDesde(antes, 'montagem');\n grupoInvalido(TISCt as ComplexType, 'IS', imp.IS, is, issues);\n }\n });\n // Texto e tamanho dos campos de texto pelo tipo do PL, com o caminho da entrada (ADR 0011); o campo que outra\n // conferência já recusou fica só com a ocorrência dela.\n // Em homologação, o nome do destinatário e, na NFC-e, a descrição do primeiro item são as literais da E04-20 e da I04-10:\n // o texto informado não vai ao XML.\n const substituidos =\n opcoes.ambiente === 'homologacao' ? ['destinatario.xNome', ...(nfce ? ['itens[0].produto.xProd'] : [])] : [];\n conferirTextosDaEntrada(entrada, pl.infNFe as ComplexType, issues, new Set(substituidos));\n // Nota sem IE do emitente (NT 2026.007, ADR 0012): conferida antes de parar nas ocorrências dos itens, para todas as\n // violações voltarem juntas.\n exclusivoIbsCbs(entrada, { nfce, dhEmi, instantes: [agora, fatoGerador] }, issues);\n if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };\n\n // Totais (grupo W)\n const gruposIbsCbs = itens\n .map((m) => (m.det.imposto as { IBSCBS?: TTribNFe }).IBSCBS)\n .filter((g): g is TTribNFe => g !== undefined);\n const somaTributosNoItem = diaBrasilia(fatoGerador) >= reforma.vItemSomaTributosDesde;\n let vNFTot = Decimal.ZERO;\n // vItem e vNFTot existem quando a nota tem tributo da reforma: IBS/CBS ou IS (NT 2025.002, VB01 e W60).\n const temReforma = gruposIbsCbs.length > 0 || itens.some((m) => (m.det.imposto as { IS?: unknown }).IS !== undefined);\n if (temReforma) {\n for (const m of itens) {\n let vItem = composicao(m, m.indTot);\n const g = (m.det.imposto as { IBSCBS?: TTribNFe }).IBSCBS;\n if (somaTributosNoItem) {\n // VB01-10: o vIS soma no item por si, com ou sem grupo IBSCBS no mesmo item.\n const is = (m.det.imposto as { IS?: { vIS?: string } }).IS?.vIS;\n if (is !== undefined) vItem = vItem.plus(Decimal.of(is));\n }\n if (g !== undefined && somaTributosNoItem) {\n const t = ibsCbsDoItem(g);\n vItem = vItem.plus(t.vIBS).plus(t.vCBS);\n if (!m.faturamentoDireto) vItem = vItem.plus(t.vTotIBSMonoItem).plus(t.vTotCBSMonoItem);\n }\n (m.det as Record<string, unknown>).vItem = ctx.s(vItem, D1302);\n vNFTot = vNFTot.plus(vItem);\n }\n }\n const soma = (f: (m: ItemMontado) => Decimal, filtro: (m: ItemMontado) => boolean = () => true): Decimal =>\n itens.filter(filtro).reduce((acc, m) => acc.plus(f(m)), Decimal.ZERO);\n const icmsItens = (m: ItemMontado): boolean => !m.issqn;\n const icmsSoma = (k: keyof IcmsTotais): Decimal => soma((m) => m.icms[k] as Decimal);\n const vProdTot = soma(\n (m) => m.v.vProd,\n (m) => m.indTot && !m.issqn,\n );\n const vServ = soma(\n (m) => m.v.vProd,\n (m) => m.indTot && m.issqn,\n );\n const vNF = itens.reduce((acc, m) => acc.plus(composicao(m, m.indTot && !m.issqn)), Decimal.ZERO).plus(vServ);\n const S = (x: Decimal): string => ctx.s(x, D1302);\n const mono = itens.some((m) => m.icms.mono);\n const ufDest = itens.some((m) => m.temUfDest);\n const ICMSTot = clean({\n vBC: S(icmsSoma('vBC')),\n vICMS: S(icmsSoma('vICMS')),\n vICMSDeson: S(icmsSoma('vICMSDeson')),\n vFCPUFDest: ufDest ? S(soma((m) => m.v.vFCPUFDest)) : undefined,\n vICMSUFDest: ufDest ? S(soma((m) => m.v.vICMSUFDest)) : undefined,\n vICMSUFRemet: ufDest ? S(soma((m) => m.v.vICMSUFRemet)) : undefined,\n vFCP: S(icmsSoma('vFCP')),\n vBCST: S(icmsSoma('vBCST')),\n vST: S(icmsSoma('vST')),\n vFCPST: S(icmsSoma('vFCPST')),\n vFCPSTRet: S(icmsSoma('vFCPSTRet')),\n qBCMono: mono ? S(ctx.round(icmsSoma('qBCMono'), D1302, 'icms')) : undefined,\n vICMSMono: mono ? S(icmsSoma('vICMSMono')) : undefined,\n qBCMonoReten: mono ? S(ctx.round(icmsSoma('qBCMonoReten'), D1302, 'icms')) : undefined,\n vICMSMonoReten: mono ? S(icmsSoma('vICMSMonoReten')) : undefined,\n qBCMonoRet: mono ? S(ctx.round(icmsSoma('qBCMonoRet'), D1302, 'icms')) : undefined,\n vICMSMonoRet: mono ? S(icmsSoma('vICMSMonoRet')) : undefined,\n vProd: S(vProdTot),\n vFrete: S(soma((m) => m.v.vFrete)),\n vSeg: S(soma((m) => m.v.vSeg)),\n vDesc: S(soma((m) => m.v.vDesc)),\n vII: S(soma((m) => m.v.vII)),\n vIPI: S(soma((m) => m.v.vIPI)),\n vIPIDevol: S(soma((m) => m.v.vIPIDevol)),\n vPIS: S(soma((m) => m.v.vPIS, icmsItens)),\n vCOFINS: S(soma((m) => m.v.vCOFINS, icmsItens)),\n vOutro: S(soma((m) => m.v.vOutro)),\n vNF: S(vNF),\n vTotTrib: itens.some((m) => m.temTotTrib) ? S(soma((m) => m.v.vTotTrib)) : undefined,\n }) as TNFe_infNFe_total_ICMSTot;\n const total: Record<string, unknown> = { ICMSTot };\n if (itens.some((m) => m.issqn)) {\n const iss = itens.filter((m) => m.issqn);\n const so = (x: Decimal): string | undefined => ctx.so(x, D1302_OPC);\n const opc = (k: string): string | undefined =>\n so(iss.reduce((a, m) => a.plus(m.issqnOpcionais[k] ?? Decimal.ZERO), Decimal.ZERO));\n total.ISSQNtot = clean({\n vServ: so(vServ),\n vBC: so(\n soma(\n (m) => m.v.vBCISS,\n (m) => m.issqn,\n ),\n ),\n vISS: so(\n soma(\n (m) => m.v.vISSQN,\n (m) => m.issqn,\n ),\n ),\n vPIS: so(\n soma(\n (m) => m.v.vPIS,\n (m) => m.issqn,\n ),\n ),\n vCOFINS: so(\n soma(\n (m) => m.v.vCOFINS,\n (m) => m.issqn,\n ),\n ),\n dCompet: dhEmi.slice(0, 10),\n vDeducao: opc('vDeducao'),\n vOutro: opc('vOutro'),\n vDescIncond: opc('vDescIncond'),\n vDescCond: opc('vDescCond'),\n vISSRet: opc('vISSRet'),\n }) as TNFe_infNFe_total_ISSQNtot;\n }\n const comIs = itens.filter((m) => (m.det.imposto as { IS?: unknown }).IS !== undefined);\n if (comIs.length > 0) {\n total.ISTot = {\n vIS: S(\n comIs.reduce(\n (a, m) => a.plus(Decimal.of((m.det.imposto as { IS: { vIS?: string } }).IS.vIS ?? '0')),\n Decimal.ZERO,\n ),\n ),\n };\n }\n if (gruposIbsCbs.length > 0) total.IBSCBSTot = totalIbsCbs(gruposIbsCbs);\n if (temReforma) total.vNFTot = S(vNFTot);\n\n // Identificação (grupo B)\n const finNFe = finNFeIn;\n const ide = clean({\n cUF,\n cNF,\n natOp: entrada.natOp,\n mod,\n serie: String(serie),\n nNF: String(nNF),\n dhEmi,\n dhSaiEnt: entrada.dhSaiEnt === undefined ? undefined : formatarDh(entrada.dhSaiEnt, offset),\n dPrevEntrega: entrada.dPrevEntrega,\n tpNF: entrada.tpNF,\n idDest,\n cMunFG: entrada.cMunFG ?? e.endereco.cMun,\n cMunFGIBS: entrada.cMunFGIBS,\n tpImp,\n tpEmis,\n cDV,\n tpAmb,\n finNFe,\n tpNFDebito: entrada.tpNFDebito,\n tpNFCredito: entrada.tpNFCredito,\n indFinal,\n indPres,\n // NT 2020.006: indIntermed obrigatório com indPres 2, 3, 4 e 9.\n indIntermed: entrada.indIntermed ?? (['2', '3', '4', '9'].includes(indPres) ? '0' : undefined),\n procEmi: '0',\n verProc: opcoes.verProc ?? formatarVerProc('sinete', VERSAO_PACOTE),\n dhCont: cont === undefined ? undefined : formatarDh(cont.dhCont, offset),\n xJust: cont?.xJust,\n NFref: entrada.referenciadas?.map((r, n) => referencia(r, `referenciadas[${n}]`, issues)),\n gCompraGov:\n entrada.gCompraGov === undefined\n ? undefined\n : clean({\n tpEnteGov: entrada.gCompraGov.tpEnteGov,\n pRedutor: ctx.s(pRedutorGov ?? Decimal.ZERO, D0302A04),\n tpOperGov: entrada.gCompraGov.tpOperGov,\n refDFeAnt: entrada.gCompraGov.refDFeAnt as string[] | undefined,\n }),\n gPagAntecipado: entrada.gPagAntecipado === undefined ? undefined : { refNFe: [...entrada.gPagAntecipado] },\n });\n\n // Locais, autorizados, transporte, cobrança, pagamento, informações adicionais\n const local = (l: Local | undefined, path: string): Record<string, unknown> | undefined =>\n l === undefined\n ? undefined\n : clean({\n ...documento(l, path, issues),\n xNome: l.xNome,\n ...endereco(l),\n cPais: '1058',\n xPais: 'BRASIL',\n email: l.email,\n IE: l.IE,\n });\n if ((entrada.autXML?.length ?? 0) > 10) issues.add('autXML', 'campo_invalido', 'no máximo 10 autorizados');\n const autXML = entrada.autXML?.map((a, n) => documento(a, `autXML[${n}]`, issues));\n\n const tr = entrada.transporte;\n const transp: Record<string, unknown> = { modFrete: tr?.modFrete ?? '9' };\n if (tr?.transportador !== undefined) {\n const t = tr.transportador;\n const docT =\n t.CNPJ !== undefined || t.CPF !== undefined\n ? documento(t as DocumentoPessoa, 'transporte.transportador', issues)\n : {};\n transp.transporta = clean({ ...docT, xNome: t.xNome, IE: t.IE, xEnder: t.xEnder, xMun: t.xMun, UF: t.UF });\n }\n if (tr?.retTransp !== undefined) {\n const r = tr.retTransp;\n const vBCRet = ctx.req(r.vBCRet, 'transporte.retTransp.vBCRet', D1302);\n const pICMSRet = ctx.req(r.pICMSRet, 'transporte.retTransp.pICMSRet', D0302A04);\n const vICMSRet = ctx.calc(r.vICMSRet, vBCRet.percent(pICMSRet), 'transporte.retTransp.vICMSRet', D1302, 'icms');\n transp.retTransp = {\n vServ: S(ctx.req(r.vServ, 'transporte.retTransp.vServ', D1302)),\n vBCRet: S(vBCRet),\n pICMSRet: ctx.s(pICMSRet, D0302A04),\n vICMSRet: S(vICMSRet),\n CFOP: r.CFOP,\n cMunFG: r.cMunFG,\n };\n }\n if (tr?.veicTransp !== undefined) transp.veicTransp = tr.veicTransp;\n if (tr?.reboque !== undefined) transp.reboque = tr.reboque;\n if (tr?.vagao !== undefined) transp.vagao = tr.vagao;\n if (tr?.balsa !== undefined) transp.balsa = tr.balsa;\n if (tr?.volumes !== undefined) {\n transp.vol = tr.volumes.map((vol, n) =>\n clean({\n qVol: vol.qVol === undefined ? undefined : String(vol.qVol),\n esp: vol.esp,\n marca: vol.marca,\n nVol: vol.nVol,\n pesoL: ctx.so(ctx.opt(vol.pesoL, `transporte.volumes[${n}].pesoL`, D1203), D1203),\n pesoB: ctx.so(ctx.opt(vol.pesoB, `transporte.volumes[${n}].pesoB`, D1203), D1203),\n lacres: vol.lacres?.map((nLacre) => ({ nLacre })),\n }),\n );\n }\n\n let cobr: Record<string, unknown> | undefined;\n if (entrada.cobranca !== undefined) {\n const c = entrada.cobranca;\n cobr = {};\n if (c.fatura !== undefined) {\n const f = c.fatura;\n const vOrig = ctx.opt(f.vOrig, 'cobranca.fatura.vOrig', D1302);\n const vDescF = ctx.opt(f.vDesc, 'cobranca.fatura.vDesc', D1302);\n const vLiq =\n vOrig === undefined\n ? ctx.opt(f.vLiq, 'cobranca.fatura.vLiq', D1302)\n : ctx.calc(f.vLiq, vOrig.minus(vDescF ?? Decimal.ZERO), 'cobranca.fatura.vLiq', D1302, 'produto');\n cobr.fat = clean({\n nFat: f.nFat,\n vOrig: ctx.so(vOrig, D1302),\n vDesc: ctx.so(vDescF, D1302),\n vLiq: ctx.so(vLiq, D1302),\n });\n }\n if (c.duplicatas !== undefined) {\n if (c.duplicatas.length > 120) issues.add('cobranca.duplicatas', 'campo_invalido', 'no máximo 120 duplicatas');\n cobr.dup = c.duplicatas.map((dup, n) =>\n clean({\n // NT 2016.002: nDup sequencial com 3 dígitos.\n nDup: dup.nDup ?? String(n + 1).padStart(3, '0'),\n dVenc: dup.dVenc,\n vDup: ctx.s(ctx.req(dup.vDup, `cobranca.duplicatas[${n}].vDup`, D1302_OPC), D1302_OPC),\n }),\n );\n }\n }\n\n const pagIn = entrada.pagamento ?? { detPag: [{ tPag: '90' as const, vPag: '0' }] };\n const igualTotal = opcoes.pagamentoIgualTotal === true;\n if (igualTotal) {\n const unico = entrada.pagamento?.detPag.length === 1 ? entrada.pagamento.detPag[0] : undefined;\n if (unico === undefined) {\n issues.add('pagamento.detPag', 'pagamento_igual_total', 'pagamentoIgualTotal pede exatamente um detPag');\n } else if (unico.tPag === '90') {\n issues.add('pagamento.detPag[0].tPag', 'pagamento_igual_total', 'tPag 90 (sem pagamento) não recebe o total');\n }\n }\n const pag = clean({\n detPag: pagIn.detPag.map((p, n) =>\n clean({\n indPag: p.indPag,\n tPag: p.tPag,\n xPag: p.xPag,\n // Com pagamentoIgualTotal, o único pagamento é o total da nota, já calculado acima.\n vPag: igualTotal ? S(vNF) : S(ctx.req(p.vPag, `pagamento.detPag[${n}].vPag`, D1302)),\n dPag: p.dPag,\n CNPJPag: p.CNPJPag,\n UFPag: p.UFPag,\n card: p.card,\n }),\n ),\n vTroco: ctx.so(ctx.opt(pagIn.vTroco, 'pagamento.vTroco', D1302), D1302),\n }) as unknown as PagMontado;\n // Pagamentos e troco contra o vNF (W16), não o vNFTot: é o total que a YA03-10 (NT 2025.001 v1.03) e a YA09-10 (MOC 7.0\n // Anexo I) citam, e a NT 2025.002 (até a v1.51) não mudou essas regras nem o W16.\n if (nfce && entrada.pagamento !== undefined && entrada.pagamento.detPag.length > 0 && issues.empty) {\n pagamentoNfce(pag, vNF, issues);\n }\n // W16-40 (rejeição 750): acima do limite, a NFC-e identifica o destinatário por CNPJ, CPF ou idEstrangeiro.\n if (nfce && vNF.gt(Decimal.of(NFCE_LIMITE_SEM_DESTINATARIO)) && dest === undefined) {\n issues.add(\n 'destinatario',\n 'campo_obrigatorio',\n `NFC-e acima de R$ ${NFCE_LIMITE_SEM_DESTINATARIO} identifica o destinatário (W16-40, rejeição 750)`,\n );\n }\n const ia = entrada.informacoesAdicionais;\n const infAdic =\n ia === undefined || Object.values(ia).every((x) => x === undefined)\n ? undefined\n : clean({\n infAdFisco: ia.infAdFisco,\n infCpl: ia.infCpl,\n obsCont: ia.obsCont,\n obsFisco: ia.obsFisco,\n procRef: ia.procRef,\n });\n\n // Responsável técnico e CSRT (NT 2018.005), com a exigência por UF como dado\n const exig = { ...exigenciaRespTec(emitUf, opcoes.ambiente, agora), ...opcoes.exigencias };\n const rt = entrada.respTec ?? opcoes.respTec;\n let infRespTec: Record<string, unknown> | undefined;\n if (rt === undefined) {\n if (exig.infRespTec === 'obrigatorio') {\n issues.add('respTec', 'resp_tec_obrigatorio', `a UF ${emitUf} exige o responsável técnico (rejeição 972)`);\n }\n } else {\n const cnpjRt = lerCnpj(rt.CNPJ, { caminho: 'respTec.CNPJ' });\n if (!cnpjRt.ok) issues.list.push(cnpjRt.erro);\n infRespTec = {\n CNPJ: cnpjRt.ok ? cnpjRt.valor : rt.CNPJ,\n xContato: rt.xContato,\n email: rt.email,\n fone: digits(rt.fone),\n };\n if (rt.csrt !== undefined) {\n infRespTec.idCSRT = rt.csrt.idCSRT;\n infRespTec.hashCSRT = await hashCsrt(rt.csrt.CSRT, chave);\n } else if (exig.csrt === 'obrigatorio') {\n issues.add('respTec.csrt', 'csrt_obrigatorio', `a UF ${emitUf} exige idCSRT e hashCSRT (rejeição 975)`);\n }\n }\n\n const inf = clean({\n versao: '4.00',\n Id: `NFe${chave}`,\n ide,\n emit,\n dest,\n retirada: local(entrada.retirada, 'retirada'),\n entrega: local(entrada.entrega, 'entrega'),\n autXML,\n det: itens.map((m) => m.det),\n total,\n transp,\n cobr,\n pag,\n infIntermed: entrada.infIntermed,\n infAdic,\n exporta: entrada.exporta,\n compra: entrada.compra,\n cana: entrada.cana,\n infRespTec,\n agropecuario: entrada.agropecuario,\n }) as unknown as TNFe_infNFe;\n\n // Regras da SEFAZ que só dependem do documento (ADR 0012).\n cstComIsento(entrada, idDest, issues);\n if (!nfce) {\n cfopDeDevolucao(entrada, issues);\n cstComNaoContribuinte(entrada, { idDest, uf: emitUf }, issues);\n }\n vencimentos(entrada, { dhEmi, instante: agora }, issues);\n\n camposForaDoPl(pl.infNFe, inf, 'infNFe', pl.vigencia.pl, issues);\n textosForaDoXml(inf, 'infNFe', issues);\n if (!issues.empty) return { ok: false, ocorrencias: issues.classificadas };\n\n // Serialização canônica e validação estrita contra o schema do PL vigente, antes de qualquer assinatura.\n // O serializer recusa com ErroSerializacao o que não cabe no modelo (escolhas exclusivas informadas juntas, por\n // exemplo vagao e balsa): vira ocorrência com o caminho do XML, nunca exceção.\n let xml: string;\n try {\n xml = `<NFe xmlns=\"${NFE_NS}\">${serializar(pl.infNFe, 'infNFe', inf, NFE_NS)}</NFe>`;\n } catch (e) {\n if (!(e instanceof ErroSerializacao)) throw e;\n return {\n ok: false,\n ocorrencias: [{ caminho: e.caminho, code: 'schema', mensagem: e.message, origem: 'montagem' }],\n };\n }\n const doc = lerXml(xml);\n const infEl = primeiroFilho(doc.raiz, 'infNFe', NFE_NS);\n const schemaIssues = infEl === undefined ? [] : validar(pl.infNFe, infEl);\n if (schemaIssues.length > 0) {\n return {\n ok: false,\n ocorrencias: schemaIssues.map((i) => ({\n caminho: i.caminho,\n code: 'schema',\n mensagem: `${i.code}: ${i.mensagem}`,\n origem: 'montagem',\n })),\n };\n }\n let supl: NfceSupl | undefined;\n if (comQr) {\n // infNFeSupl (grupo ZX, NT 2025.001 item 04 e NT 2026.002): endereços da NFC-e da UF no dia da emissão, pelo horário\n // de Brasília, também na NF-e Tipo 2.\n const tabela = urlsNfce(emitUf, opcoes.ambiente, diaBrasilia(agora));\n const urlQr = opcoes.urlQrCode ?? tabela.qrCode;\n const urlChave = opcoes.urlChave ?? tabela.urlChave;\n if (urlQr === undefined || !/^https?:\\/\\//i.test(urlQr)) {\n issues.montagem(\n 'urlQrCode',\n 'qrcode_invalido',\n `sem endereço completo do QR Code da NFC-e para ${emitUf} em ${opcoes.ambiente}: informe urlQrCode (data/nfce-urls.json)`,\n );\n }\n if (urlChave === undefined) {\n issues.montagem(\n 'urlChave',\n 'qrcode_invalido',\n `sem URL de consulta por chave da NFC-e para ${emitUf}: informe urlChave`,\n );\n }\n if (urlQr === undefined || urlChave === undefined || !issues.empty)\n return { ok: false, ocorrencias: issues.classificadas };\n const p = await parametrosQrCode(\n {\n chave,\n ambiente: opcoes.ambiente,\n tpEmis,\n dhEmi,\n vNF: (inf.total as { ICMSTot: { vNF: string } }).ICMSTot.vNF,\n ...(dest === undefined ? {} : { dest: dest as { CNPJ?: string; CPF?: string; idEstrangeiro?: string } }),\n xml,\n },\n qr,\n );\n supl = { versao: qr.versao, urlChave, base: `${urlQr.replace(/\\?+$/, '')}?p=`, ...p };\n // O infNFeSupl contra o schema antes de assinar (padrões do qrCode por versão, tamanho do urlChave). Na versão 3\n // off-line, com uma assinatura do tamanho da de uma chave RSA de 2048 bits no lugar da que o certificado ainda vai\n // fazer; o `comQrCode` confere de novo com a assinatura verdadeira.\n const suplIssues = conferirSupl(\n inserirSupl({ xml, nfce: supl } as NfeMontada, supl.assinar ? ASSINATURA_2048 : undefined),\n );\n if (suplIssues.length > 0) return { ok: false, ocorrencias: suplIssues };\n }\n return {\n ok: true,\n valor: {\n chave,\n id: `NFe${chave}`,\n cNF,\n cDV,\n mod,\n tpEmis,\n dhEmi,\n ...(supl === undefined ? {} : { nfce: supl }),\n pl: pl.vigencia,\n infNFe: inf,\n xml,\n ...(aliquotasInformadas.length === 0 ? {} : { aliquotasInformadas }),\n },\n };\n}\n\n/** Base64 de uma assinatura RSA de 2048 bits (256 bytes): a forma da assinatura do QR Code off-line na montagem. */\nconst ASSINATURA_2048 = codificarBase64(new Uint8Array(256));\n\n/** Ocorrências do `infNFeSupl` do XML contra o schema (`TNFe_infNFeSupl`), como de montagem. */\nfunction conferirSupl(xml: string): Ocorrencia[] {\n const el = primeiroFilho(lerXml(xml).raiz, 'infNFeSupl', NFE_NS);\n const erros = el === undefined ? [] : validar(TNFe_infNFeSupl as ComplexType, el);\n return erros.map((i) => ({\n caminho: i.caminho,\n code: 'schema',\n mensagem: `${i.code}: ${i.mensagem}`,\n origem: 'montagem',\n }));\n}\n\nconst escapeXml = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/**\n * Assinatura dos parâmetros do QR Code da NFC-e em contingência off-line com a versão 3 (RSA-SHA1 em Base64, com o\n * certificado que assina a nota; Manual do DANFE NFC-e 6.0, 4.4.2). `undefined` quando o QR Code não leva assinatura\n * (NF-e sem QR Code, emissão normal, versão 2). Vale também para a NF-e com DANFE Simplificado Tipo 2 em contingência\n * off-line (NT 2026.002).\n */\nexport async function assinaturaQrCode(nota: NfeMontada, assinador: Assinador): Promise<string | undefined> {\n return nota.nfce?.assinar === true ? assinarParametros(nota.nfce.parametros, assinador) : undefined;\n}\n\n/**\n * A NFC-e, ou a NF-e com DANFE Simplificado Tipo 2 (tpImp 6, NT 2026.002), montada com o `infNFeSupl` (QR Code e `urlChave`) inserido por splice antes do fechamento de `NFe`, pronta\n * para a assinatura. Na versão 3 em contingência off-line, informe a `assinatura` (`assinaturaQrCode`); nos demais\n * casos ela não existe (ZX02-330, rejeição 445; ZX02-334, rejeição 474). Para assinar em três fases (A3, HSM), passe\n * este texto ao `prepararAssinatura` do `@sinete/core/xml` com o `id` da nota. Na NF-e com outro tpImp, devolve o XML como\n * veio: ela não tem `infNFeSupl`.\n */\nexport function comQrCode(nota: NfeMontada, assinatura?: string): string {\n const xml = inserirSupl(nota, assinatura);\n // Com a assinatura verdadeira, o qrCode pode passar do tamanho que a montagem conferiu (chave maior que 2048 bits).\n if (assinatura !== undefined) {\n const issues = conferirSupl(xml);\n if (issues.length > 0) throw new ErroDeValidacao('o QR Code não passou no schema', issues);\n }\n return xml;\n}\n\nfunction inserirSupl(built: NfeMontada, assinatura: string | undefined): string {\n const s = built.nfce;\n if (s === undefined) {\n if (assinatura !== undefined)\n throw new ErroDeConfiguracao('esta NF-e não tem QR Code: só a NF-e com DANFE Simplificado Tipo 2 (tpImp 6) leva');\n return built.xml;\n }\n if (s.assinar && assinatura === undefined) {\n throw new ErroDeConfiguracao(\n 'contingência off-line com QR Code versão 3 precisa da assinatura (ZX02-334, rejeição 474)',\n );\n }\n if (!s.assinar && assinatura !== undefined) {\n throw new ErroDeConfiguracao('este QR Code não leva assinatura (ZX02-330, rejeição 445)');\n }\n const fim = '</NFe>';\n if (!built.xml.endsWith(fim)) throw new ErroDeConfiguracao('nota montada fora da forma esperada');\n const qrCode = `${s.base}${s.parametros}${assinatura === undefined ? '' : `|${assinatura}`}`;\n const supl = `<infNFeSupl><qrCode>${escapeXml(qrCode)}</qrCode><urlChave>${escapeXml(s.urlChave)}</urlChave></infNFeSupl>`;\n return built.xml.slice(0, -fim.length) + supl + fim;\n}\n\n/**\n * Assina a NF-e montada: na NFC-e, insere antes o `infNFeSupl` (`comQrCode`, com a assinatura do QR Code quando a\n * contingência off-line pede); depois, a `Signature` como último filho de `NFe`, tudo por splice, e devolve a string\n * final. É essa string que vai para a SEFAZ e para o banco; nada depois deve reparseá-la para reescrever.\n */\nexport async function assinarNfe(nota: NfeMontada, assinador: Assinador): Promise<string> {\n return assinarXml(comQrCode(nota, await assinaturaQrCode(nota, assinador)), { id: nota.id }, assinador);\n}\n",
6
6
  "/**\n * Decimal exato para os valores da NF-e. Nada de `number` nas contas: um valor é `coef × 10^-scale` com `coef` em\n * `bigint`, então soma, subtração e multiplicação são exatas e só o arredondamento, feito de propósito e com o modo\n * escolhido, descarta dígitos.\n *\n * Os modos são os que os leiautes usam:\n * - `HALF_EVEN` (arredondamento bancário, NBR 5891): o que a Calculadora da RFB aplica ao IBS e à CBS (ADR 0007).\n * - `HALF_UP` (metade para longe do zero): o arredondamento comercial usual nos demais tributos. O MOC 7.0 Anexo I,\n * nota (*4) das regras de valor, só exige duas casas e aceita tolerância de R$ 0,01, sem fixar o modo.\n * - `DOWN` (trunca em direção ao zero), para quem precisa reproduzir um sistema legado.\n *\n * Qual modo vale para qual campo é dado (`data/arredondamento.json`), não regra espalhada no código.\n */\n\nimport { ErroDeConfiguracao } from '@sinete/core';\n\nexport type RoundingMode = 'HALF_EVEN' | 'HALF_UP' | 'DOWN';\n\n/** O que as APIs de entrada aceitam como número. Prefira `string` (`'12.34'`): `number` perde dígitos acima de 15 algarismos. */\nexport type DecimalInput = string | number | bigint | Decimal;\n\nconst DECIMAL_TEXT = /^([+-])?(\\d+)(?:\\.(\\d*))?(?:[eE]([+-]?\\d+))?$|^([+-])?\\.(\\d+)(?:[eE]([+-]?\\d+))?$/;\nconst MAX_SCALE = 64;\n\nfunction pow10(n: number): bigint {\n return 10n ** BigInt(n);\n}\n\n/** Valor decimal imutável: `coef × 10^-scale`. */\nexport class Decimal {\n /** Coeficiente inteiro (com sinal). */\n readonly coef: bigint;\n /** Casas decimais do coeficiente (0 ou mais). */\n readonly scale: number;\n\n private constructor(coef: bigint, scale: number) {\n this.coef = coef;\n this.scale = scale;\n }\n\n static readonly ZERO: Decimal = new Decimal(0n, 0);\n static readonly ONE: Decimal = new Decimal(1n, 0);\n static readonly HUNDRED: Decimal = new Decimal(100n, 0);\n\n /** Constrói a partir do coeficiente e da escala (`fromParts(1234n, 2)` = 12.34). */\n static fromParts(coef: bigint, scale: number): Decimal {\n if (!Number.isInteger(scale) || scale < 0 || scale > MAX_SCALE)\n throw new ErroDeConfiguracao(`escala inválida: ${scale}`);\n return new Decimal(coef, scale);\n }\n\n /**\n * Converte a entrada. Aceita texto com ponto decimal e expoente opcional (`'12.34'`, `'1e-3'`), `number` finito e\n * `bigint`. Vírgula, separador de milhar e espaço são recusados: o texto é a forma do XML, não a da tela.\n */\n static of(input: DecimalInput): Decimal {\n const d = Decimal.tryOf(input);\n if (d === undefined) throw new ErroDeConfiguracao(`número decimal inválido: ${JSON.stringify(String(input))}`);\n return d;\n }\n\n /** Como `of`, mas devolve `undefined` em vez de lançar. */\n static tryOf(input: DecimalInput): Decimal | undefined {\n if (input instanceof Decimal) return input;\n if (typeof input === 'bigint') return new Decimal(input, 0);\n if (typeof input === 'number') {\n if (!Number.isFinite(input)) return undefined;\n // String(n) é a representação mais curta que volta ao mesmo double (ECMA-262 Number::toString).\n return Decimal.tryOf(String(input));\n }\n if (typeof input !== 'string') return undefined;\n const m = DECIMAL_TEXT.exec(input);\n if (!m) return undefined;\n const sign = (m[1] ?? m[5]) === '-' ? -1n : 1n;\n const intPart = m[2] ?? '';\n const frac = m[3] ?? m[6] ?? '';\n const exp = Number(m[4] ?? m[7] ?? '0');\n if (!Number.isSafeInteger(exp) || Math.abs(exp) > MAX_SCALE) return undefined;\n let coef = BigInt(`${intPart}${frac}` || '0') * sign;\n let scale = frac.length - exp;\n if (scale < 0) {\n coef *= pow10(-scale);\n scale = 0;\n }\n if (scale > MAX_SCALE) return undefined;\n return new Decimal(coef, scale);\n }\n\n private aligned(other: Decimal): [bigint, bigint, number] {\n if (this.scale === other.scale) return [this.coef, other.coef, this.scale];\n if (this.scale > other.scale) return [this.coef, other.coef * pow10(this.scale - other.scale), this.scale];\n return [this.coef * pow10(other.scale - this.scale), other.coef, other.scale];\n }\n\n plus(other: DecimalInput): Decimal {\n const [a, b, s] = this.aligned(Decimal.of(other));\n return new Decimal(a + b, s);\n }\n\n minus(other: DecimalInput): Decimal {\n const [a, b, s] = this.aligned(Decimal.of(other));\n return new Decimal(a - b, s);\n }\n\n times(other: DecimalInput): Decimal {\n const o = Decimal.of(other);\n const scale = this.scale + o.scale;\n if (scale > MAX_SCALE) {\n // Produto de muitas casas: arredonda (HALF_EVEN) para caber, com folga muito acima de qualquer campo do leiaute.\n return new Decimal(this.coef * o.coef, scale).round(MAX_SCALE, 'HALF_EVEN');\n }\n return new Decimal(this.coef * o.coef, scale);\n }\n\n /** Divisão com o resultado arredondado em `scale` casas pelo modo dado. */\n dividedBy(other: DecimalInput, scale: number, mode: RoundingMode): Decimal {\n const o = Decimal.of(other);\n if (o.coef === 0n) throw new ErroDeConfiguracao('divisão por zero');\n // (a / 10^sa) / (b / 10^sb) = a * 10^(sb + scale + 1 - sa) / b, com uma casa de guarda para o arredondamento.\n const shift = o.scale + scale + 1 - this.scale;\n const num = shift >= 0 ? this.coef * pow10(shift) : this.coef;\n const den = shift >= 0 ? o.coef : o.coef * pow10(-shift);\n const q = num / den;\n const exact = q * den === num;\n return roundCoef(q, scale + 1, scale, mode, !exact);\n }\n\n /** Percentual: `this × rate / 100`, sem arredondar. */\n percent(rate: DecimalInput): Decimal {\n const product = this.times(rate);\n return new Decimal(product.coef, product.scale + 2);\n }\n\n negate(): Decimal {\n return new Decimal(-this.coef, this.scale);\n }\n\n abs(): Decimal {\n return this.coef < 0n ? this.negate() : this;\n }\n\n /** Arredonda para `scale` casas. Com `scale` maior que a atual, só completa com zeros. */\n round(scale: number, mode: RoundingMode): Decimal {\n if (!Number.isInteger(scale) || scale < 0) throw new ErroDeConfiguracao(`casas decimais inválidas: ${scale}`);\n if (scale >= this.scale) return new Decimal(this.coef * pow10(scale - this.scale), scale);\n return roundCoef(this.coef, this.scale, scale, mode, false);\n }\n\n compare(other: DecimalInput): -1 | 0 | 1 {\n const [a, b] = this.aligned(Decimal.of(other));\n return a < b ? -1 : a > b ? 1 : 0;\n }\n\n eq(other: DecimalInput): boolean {\n return this.compare(other) === 0;\n }\n\n lt(other: DecimalInput): boolean {\n return this.compare(other) < 0;\n }\n\n gt(other: DecimalInput): boolean {\n return this.compare(other) > 0;\n }\n\n isZero(): boolean {\n return this.coef === 0n;\n }\n\n isNegative(): boolean {\n return this.coef < 0n;\n }\n\n /** Quantas casas decimais o valor precisa (sem os zeros à direita). */\n significantScale(): number {\n if (this.coef === 0n) return 0;\n let c = this.coef;\n let s = this.scale;\n while (s > 0 && c % 10n === 0n) {\n c /= 10n;\n s--;\n }\n return s;\n }\n\n /** Texto com exatamente `scale` casas (arredonda pelo modo dado quando precisa). */\n toFixed(scale: number, mode: RoundingMode = 'HALF_UP'): string {\n const r = this.round(scale, mode);\n const neg = r.coef < 0n;\n const digits = (neg ? -r.coef : r.coef).toString().padStart(scale + 1, '0');\n const int = digits.slice(0, digits.length - scale);\n const frac = digits.slice(digits.length - scale);\n return `${neg ? '-' : ''}${int}${scale > 0 ? `.${frac}` : ''}`;\n }\n\n /** Forma mínima, sem zeros à direita (`'12.3'`, `'0'`). */\n toString(): string {\n return this.toFixed(this.significantScale());\n }\n\n toJSON(): string {\n return this.toString();\n }\n}\n\n/** Reduz `coef × 10^-from` para `to` casas (`to < from`). `sticky` diz se há resto não nulo além dos dígitos dados. */\nfunction roundCoef(coef: bigint, from: number, to: number, mode: RoundingMode, sticky: boolean): Decimal {\n const div = pow10(from - to);\n const neg = coef < 0n;\n const abs = neg ? -coef : coef;\n let q = abs / div;\n const r = abs % div;\n if (mode !== 'DOWN' && (r !== 0n || sticky)) {\n const twice = r * 2n;\n const above = twice > div || (twice === div && sticky);\n const tie = twice === div && !sticky;\n if (above || (tie && (mode === 'HALF_UP' || (mode === 'HALF_EVEN' && q % 2n === 1n)))) q += 1n;\n }\n return Decimal.fromParts(neg ? -q : q, to);\n}\n\n/** Atalho para `Decimal.of`. */\nexport function dec(valor: DecimalInput): Decimal {\n return Decimal.of(valor);\n}\n\n/** Soma uma lista (vazia = zero). */\nexport function sum(valores: Iterable<Decimal>): Decimal {\n let acc = Decimal.ZERO;\n for (const v of valores) acc = acc.plus(v);\n return acc;\n}\n",
7
7
  "/**\n * Formatação dos decimais na forma lexical que cada tipo do leiaute aceita (ADR 0002: o número de casas vem do\n * pattern do XSD, nunca do serializer). Cada formato abaixo cita os tipos `TDec_*` que ele cobre.\n */\n\nimport type { Decimal, RoundingMode } from './decimal.ts';\n\nexport interface FormatoDecimal {\n /** Nome curto, para mensagens. */\n readonly nome: string;\n /** Casas mínimas (completa com zeros até aqui). */\n readonly min: number;\n /** Casas máximas aceitas pelo pattern. */\n readonly max: number;\n /** Casas exigidas quando a parte inteira é zero e o valor não é zero (`TDec_0803v`: `0\\.[0-9]{3}`). */\n readonly minimoAbaixoDeUm?: number;\n /** O pattern recusa zero (`TDec_1302Opc`, `TDec_0302a04Opc`): o campo zerado deve ser omitido. */\n readonly naoNulo?: boolean;\n /** Maior quantidade de dígitos inteiros aceita. */\n readonly digitosInteiros: number;\n}\n\n/** `TDec_1302`, `TDec1302RTC`: 13 inteiros e exatamente 2 casas. */\nexport const D1302: FormatoDecimal = { nome: 'TDec_1302', min: 2, max: 2, digitosInteiros: 13 };\n/** `TDec_1302Opc`: como `TDec_1302`, sem zero. */\nexport const D1302_OPC: FormatoDecimal = { nome: 'TDec_1302Opc', min: 2, max: 2, digitosInteiros: 13, naoNulo: true };\n/** `TDec_0302a04`, `TDec_0302_04RTC`, `TDec_0302a04Max100`: 3 inteiros e 2 a 4 casas. */\nexport const D0302A04: FormatoDecimal = { nome: 'TDec_0302a04', min: 2, max: 4, digitosInteiros: 3 };\n/** `TDec_0302a04Opc`: o pattern (`0\\.[0-9]{2,4}|...`) aceita zero, ao contrário de `TDec_1302Opc`. */\nexport const D0302A04_OPC: FormatoDecimal = { nome: 'TDec_0302a04Opc', min: 2, max: 4, digitosInteiros: 3 };\n/** `TDec_0302Max100`: 2 casas exatas. */\nexport const D0302: FormatoDecimal = { nome: 'TDec_0302Max100', min: 2, max: 2, digitosInteiros: 3 };\n/** `TDec_1104v`: 11 inteiros e 0 a 4 casas. */\nexport const D1104V: FormatoDecimal = { nome: 'TDec_1104v', min: 0, max: 4, digitosInteiros: 11 };\n/** `TDec_1104`, `TDec1104RTC`: 11 inteiros e 4 casas. */\nexport const D1104: FormatoDecimal = { nome: 'TDec_1104', min: 4, max: 4, digitosInteiros: 11 };\n/** `TDec_1110v`: 11 inteiros e 0 a 10 casas. */\nexport const D1110V: FormatoDecimal = { nome: 'TDec_1110v', min: 0, max: 10, digitosInteiros: 11 };\n/** `TDec_1204v`: 12 inteiros e 0 a 4 casas. */\nexport const D1204V: FormatoDecimal = { nome: 'TDec_1204v', min: 0, max: 4, digitosInteiros: 12 };\n/** `TDec_1204`: 12 inteiros e 4 casas quando há fração (4 fixas aqui, que o pattern aceita sempre). */\nexport const D1204: FormatoDecimal = { nome: 'TDec_1204', min: 4, max: 4, digitosInteiros: 12 };\n/** `TDec_1203`: 12 inteiros e 3 casas. */\nexport const D1203: FormatoDecimal = { nome: 'TDec_1203', min: 3, max: 3, digitosInteiros: 12 };\n/** `TDec_0803v`: 8 inteiros e até 3 casas; abaixo de 1, exatamente 3. */\nexport const D0803V: FormatoDecimal = { nome: 'TDec_0803v', min: 0, max: 3, digitosInteiros: 8, minimoAbaixoDeUm: 3 };\n\n/** Texto do valor já arredondado no formato (arredonda em `max` casas pelo modo dado). */\nexport function formatarDecimal(valor: Decimal, formato: FormatoDecimal, modo: RoundingMode = 'HALF_UP'): string {\n const r = valor.round(formato.max, modo);\n let places = Math.max(formato.min, Math.min(formato.max, r.significantScale()));\n if (formato.minimoAbaixoDeUm !== undefined && !r.isZero() && r.abs().lt(1))\n places = Math.max(places, formato.minimoAbaixoDeUm);\n return r.toFixed(places, modo);\n}\n\n/** Por que o valor não cabe no formato, ou `undefined` se cabe sem perder dígitos. */\nexport function problemaDeFormato(valor: Decimal, formato: FormatoDecimal): string | undefined {\n if (valor.isNegative()) return 'valor negativo';\n if (formato.naoNulo && valor.isZero()) return 'valor zero não é aceito neste campo';\n if (valor.significantScale() > formato.max) return `mais de ${formato.max} casas decimais`;\n const intDigits = valor.round(0, 'DOWN').abs().toString().replace(/^0$/, '').length;\n if (intDigits > formato.digitosInteiros) return `mais de ${formato.digitosInteiros} dígitos inteiros`;\n return undefined;\n}\n",
8
8
  "/**\n * Coletor de ocorrências de validação (`Ocorrencia` do core). O builder junta todas as ocorrências antes de\n * decidir, em vez de parar na primeira. Os códigos são API pública (snake_case, português, sem acento) e estão listados\n * em `CODIGOS_OCORRENCIA_NFE`.\n */\n\nimport type { Ocorrencia, OrigemOcorrencia } from '@sinete/core';\n\nexport const CODIGOS_OCORRENCIA_NFE = [\n 'campo_obrigatorio',\n 'campo_invalido',\n 'campo_fora_do_pl',\n 'decimal_invalido',\n 'valor_divergente',\n 'combinacao_invalida',\n 'modelo_nao_suportado',\n 'serie_invalida',\n 'documento_invalido',\n 'ie_invalida',\n 'chave_invalida',\n 'referencia_vedada',\n 'resp_tec_obrigatorio',\n 'csrt_obrigatorio',\n 'ibscbs_calculo',\n 'ibscbs_base_ausente',\n 'ibscbs_nao_suportado',\n 'ibscbs_redutor_divergente',\n 'ibscbs_regra_nt',\n 'totais_divergentes',\n 'itens_limite',\n 'contingencia_invalida',\n 'pagamento_igual_total',\n 'emitente_difere_do_certificado',\n 'grupo_vedado',\n 'pagamento_invalido',\n 'qrcode_invalido',\n 'schema',\n] as const;\n\nexport type CodigoOcorrenciaNfe = (typeof CODIGOS_OCORRENCIA_NFE)[number];\n\nexport class Issues {\n readonly list: Ocorrencia[];\n\n constructor() {\n this.list = [];\n }\n\n /** Ocorrência sobre a entrada, a não ser que `origem` diga outra coisa (ADR 0011). */\n add(path: string, code: CodigoOcorrenciaNfe | string, message: string, origem: OrigemOcorrencia = 'entrada'): void {\n this.list.push({ caminho: path, code, mensagem: message, origem });\n }\n\n /** Ocorrência sobre o que o sinete montou a partir da entrada (XML, schema, PL, chave gerada, calculadora). */\n montagem(path: string, code: CodigoOcorrenciaNfe | string, message: string): void {\n this.add(path, code, message, 'montagem');\n }\n\n /** As ocorrências com a `origem` preenchida: a que veio sem (a de um validador avulso) é da entrada. */\n get classificadas(): readonly Ocorrencia[] {\n return this.list.map((i) => (i.origem === undefined ? { ...i, origem: 'entrada' } : i));\n }\n\n /** Junta ocorrências de outra fonte; a que vier sem `origem` recebe a informada. */\n addAll(issues: readonly Ocorrencia[], origem: OrigemOcorrencia = 'entrada'): void {\n this.list.push(...issues.map((i) => (i.origem === undefined ? { ...i, origem } : i)));\n }\n\n /** Troca a `origem` das ocorrências a partir da posição `inicio` (as que uma conferência acabou de acrescentar). */\n reclassificarDesde(inicio: number, origem: OrigemOcorrencia): void {\n for (let k = inicio; k < this.list.length; k++) {\n const i = this.list[k];\n if (i !== undefined) this.list[k] = { ...i, origem };\n }\n }\n\n get empty(): boolean {\n return this.list.length === 0;\n }\n}\n",
9
- "/**\n * A calculadora padrão de IBS/CBS do `montarNfe`: a porta `CalculadoraIbsCbs` implementada sobre o motor do sinete.\n *\n * Para cada item classificado, monta a operação do `@sinete/ibs-cbs/calcular` (CST, cClassTrib, base, local da operação,\n * compra governamental), calcula com o dataset do `@sinete/ibs-cbs-dados` e as alíquotas do `@sinete/ibs-cbs/aliquotas`, confere o\n * resultado pelas regras da NT 2025.002 do `@sinete/ibs-cbs/validar` e devolve o grupo `IBSCBS` de cada item na forma\n * lexical do leiaute. Erro de classificação, regime não suportado, alíquota desconhecida e violação de regra voltam\n * como ocorrências (`Ocorrencia`) no caminho do item: a nota não é montada, e nunca sai valor zerado no lugar.\n *\n * O dataset embarcado (~2 MB de JSON) só é importado na primeira nota com item classificado, por `import()` dinâmico:\n * quem usa o pacote para ler XML, eventos ou Distribuição DF-e não o carrega, e um bundler com code splitting o põe num\n * chunk à parte.\n */\n\nimport type { Ocorrencia } from '@sinete/core';\nimport { contextoDeTempo, ehUf, relogioFixo, ufPorCUf } from '@sinete/core';\nimport type { ProvedorDeAliquotas } from '@sinete/ibs-cbs/aliquotas';\nimport { aliquotasOficiais, ErroAliquotaDesconhecida } from '@sinete/ibs-cbs/aliquotas';\nimport type {\n IBSCBS,\n ItemClassificado,\n LocalDaOperacao,\n OperacaoClassificada,\n Roc,\n TpEnteGov,\n} from '@sinete/ibs-cbs/calcular';\nimport { calcular, ErroClassificacao, ErroRegimeNaoSuportado } from '@sinete/ibs-cbs/calcular';\nimport type { Regra } from '@sinete/ibs-cbs/validar';\nimport { documentoDoRoc, validar } from '@sinete/ibs-cbs/validar';\nimport type { DatasetIbsCbs } from '@sinete/ibs-cbs-dados';\nimport type { CalculadoraIbsCbs, PedidoIbsCbsItem, PedidoIbsCbsNota, RespostaIbsCbs } from './ports.ts';\n\n/** Grupo `IBSCBS` do item, como o `@sinete/nfe` o recebe. */\nexport type GrupoIbsCbs = RespostaIbsCbs['itens'][number]['IBSCBS'];\n\nexport interface CalculadoraIbsCbsOpcoes {\n /**\n * Dataset do IBS/CBS. Padrão: o embarcado no `@sinete/ibs-cbs-dados`, importado sob demanda na primeira nota\n * (`carregarDatasetEmbarcado`). Informe um bundle verificado em runtime (`conferirDataset`) para usar dados de outra\n * origem, ou o `datasetEmbarcado()` já carregado para o cálculo ser síncrono.\n */\n readonly dataset?: DatasetIbsCbs;\n /** Alíquotas. Padrão: `aliquotasOficiais()` do `@sinete/ibs-cbs/aliquotas`; troque por um provedor com alíquotas informadas. */\n readonly aliquotas?: ProvedorDeAliquotas;\n /**\n * Base do IBS/CBS do item que não trouxe `vBC`, em texto com até 2 casas. A composição da base (NT 2025.002, UB16-10)\n * ainda é \"implementação futura, aguardando orientação normativa\": sem esta função, item sem `vBC` vira ocorrência\n * `ibscbs_base_ausente` em vez de uma base presumida.\n */\n readonly base?: (item: PedidoIbsCbsItem, nota: PedidoIbsCbsNota) => string;\n /**\n * Regras da NT 2025.002 conferidas sobre os grupos produzidos (`@sinete/ibs-cbs/validar`). Padrão: as implantadas na data\n * de emissão e no ambiente. `false` desliga; `{ rules }` troca a lista.\n */\n readonly regras?: false | { readonly regras?: readonly Regra[]; readonly ignorarAtivacao?: boolean };\n /** Fuso do local da operação para a data civil do fato gerador, em minutos. Padrão: Brasília (-180). */\n readonly deslocamentoMin?: number;\n}\n\nconst BASE = /^\\d{1,13}(\\.\\d{1,2})?$/;\n\n/** Texto decimal sem zeros à direita, para comparar valores com escalas diferentes (`'0.00'` e `'0'`). */\nfunction normalizado(v: string): string {\n const [int = '0', frac = ''] = v.split('.');\n const f = frac.replace(/0+$/, '');\n const i = int.replace(/^0+(?=\\d)/, '');\n return f === '' ? i : `${i}.${f}`;\n}\n\nconst caminho = (nItem: number): string => `itens[${nItem - 1}].impostos.ibsCbs`;\n\n/** UF do município pelo código IBGE (os dois primeiros dígitos são o cUF). */\nfunction ufDoMunicipio(cMun: string): string | undefined {\n return ufPorCUf(cMun.slice(0, 2))?.sigla;\n}\n\n/**\n * Local da operação para as alíquotas próprias de UF e município: o `cMunFGIBS` informado (campo B12a da NT\n * 2025.002, município de ocorrência do fato gerador do IBS/CBS), senão o destino da mercadoria (entrega ou\n * destinatário, pela LC 214/2025, art. 11, o local da entrega), senão o emitente. Destino no exterior cai no emitente.\n */\nexport function localDaOperacao(nota: PedidoIbsCbsNota): LocalDaOperacao {\n if (nota.cMunFGIBS !== undefined) {\n const uf = ufDoMunicipio(nota.cMunFGIBS);\n if (uf !== undefined) return { uf, cMun: nota.cMunFGIBS };\n }\n const d = nota.destino;\n if (d !== undefined && d.UF !== 'EX' && ehUf(d.UF)) return { uf: d.UF, cMun: d.cMun };\n return { uf: nota.emitente.UF, cMun: nota.emitente.cMun };\n}\n\n/** Converte o grupo do motor para o do leiaute: os códigos numéricos do motor viram texto. */\nfunction grupoDoLeiaute(g: IBSCBS, indDoacao: '1' | undefined): GrupoIbsCbs {\n const { gCredPresOper, gCredPresIBSZFM, ...resto } = g;\n return {\n ...resto,\n ...(indDoacao === undefined ? {} : { indDoacao }),\n ...(gCredPresOper === undefined\n ? {}\n : { gCredPresOper: { ...gCredPresOper, cCredPres: String(gCredPresOper.cCredPres).padStart(2, '0') } }),\n ...(gCredPresIBSZFM === undefined\n ? {}\n : {\n gCredPresIBSZFM: {\n ...gCredPresIBSZFM,\n tpCredPresIBSZFM: String(gCredPresIBSZFM.tpCredPresIBSZFM),\n },\n }),\n } as GrupoIbsCbs;\n}\n\n/** Erro do motor ou das alíquotas como ocorrência no item (ou na nota, quando o erro não diz o item). */\nfunction ocorrenciaDoMotor(e: unknown, itens: readonly PedidoIbsCbsItem[]): Ocorrencia | undefined {\n if (e instanceof ErroClassificacao || e instanceof ErroRegimeNaoSuportado) {\n const path = e.item !== undefined ? caminho(e.item) : caminho(itens[0]?.nItem ?? 1);\n return { caminho: path, code: e.code, mensagem: e.message, origem: 'entrada' };\n }\n // Alíquota que o sinete não conhece para a data: falta de dado do pacote, não da nota.\n if (e instanceof ErroAliquotaDesconhecida)\n return { caminho: 'impostos.ibsCbs', code: e.code, mensagem: e.message, origem: 'montagem' };\n return undefined;\n}\n\nlet embarcado: Promise<DatasetIbsCbs> | undefined;\n\n/**\n * O dataset embarcado no `@sinete/ibs-cbs-dados`, importado sob demanda (`import()` dinâmico) e carregado uma vez por\n * processo. É o que a calculadora padrão usa quando `dataset` não é informado; chamar antes só adianta a carga. Se o\n * import falhar, a próxima chamada tenta de novo.\n */\nexport function carregarDatasetEmbarcado(): Promise<DatasetIbsCbs> {\n embarcado ??= import('@sinete/ibs-cbs-dados/embarcado').then(\n (m) => m.datasetEmbarcado(),\n (e: unknown) => {\n embarcado = undefined;\n throw e;\n },\n );\n return embarcado;\n}\n\n/**\n * Cria a calculadora de IBS/CBS sobre o motor do sinete. O `montarNfe` usa uma com as opções padrão quando\n * `opcoes.ibsCbs` não é informado; crie a sua para trocar dataset, alíquotas, base ou regras. Com `dataset` informado\n * o cálculo é síncrono; sem ele, a primeira chamada espera o import do dataset embarcado.\n */\nexport function calculadoraIbsCbs(opcoes: CalculadoraIbsCbsOpcoes = {}): CalculadoraIbsCbs {\n const rates = opcoes.aliquotas ?? aliquotasOficiais();\n const dataset = opcoes.dataset;\n return {\n calcular(request: {\n readonly nota: PedidoIbsCbsNota;\n readonly itens: readonly PedidoIbsCbsItem[];\n }): RespostaIbsCbs | Promise<RespostaIbsCbs> {\n if (dataset !== undefined) return calcularCom(dataset, rates, opcoes, request);\n return carregarDatasetEmbarcado().then((ds) => calcularCom(ds, rates, opcoes, request));\n },\n };\n}\n\nfunction calcularCom(\n dataset: DatasetIbsCbs,\n rates: ProvedorDeAliquotas,\n options: CalculadoraIbsCbsOpcoes,\n {\n nota,\n itens,\n }: {\n readonly nota: PedidoIbsCbsNota;\n readonly itens: readonly PedidoIbsCbsItem[];\n },\n): RespostaIbsCbs {\n const issues: Ocorrencia[] = [];\n const classificados: ItemClassificado[] = [];\n for (const it of itens) {\n if (it.cCredPres !== undefined) {\n // O crédito presumido pede os percentuais por tributo (pCredPres), que a porta não traz.\n issues.push({\n caminho: caminho(it.nItem),\n code: 'ibscbs_nao_suportado',\n mensagem: 'crédito presumido (cCredPres) precisa do grupo gCredPresOper pronto (ibsCbs.grupo)',\n origem: 'entrada',\n });\n continue;\n }\n const base = it.vBC !== undefined ? it.vBC.toFixed(2) : options.base?.(it, nota);\n if (base === undefined) {\n issues.push({\n caminho: `${caminho(it.nItem)}.classificacao.vBC`,\n code: 'ibscbs_base_ausente',\n mensagem:\n 'informe vBC do IBS/CBS ou CalculadoraIbsCbsOpcoes.base: a composição da base (UB16-10) ainda não tem regra publicada',\n origem: 'entrada',\n });\n continue;\n }\n if (!BASE.test(base)) {\n // Da entrada quando é o vBC do item; da montagem quando veio da função `base` das opções.\n issues.push({\n caminho: `${caminho(it.nItem)}.classificacao.vBC`,\n code: 'decimal_invalido',\n mensagem: base,\n origem: it.vBC !== undefined ? 'entrada' : 'montagem',\n });\n continue;\n }\n classificados.push({\n n: it.nItem,\n cst: it.CST,\n cClassTrib: it.cClassTrib,\n base,\n quantidade: it.qTrib.toString(),\n unidade: it.uTrib,\n ...(it.gTribRegular === undefined\n ? {}\n : { regular: { cst: it.gTribRegular.CSTReg, cClassTrib: it.gTribRegular.cClassTribReg } }),\n });\n }\n if (issues.length > 0) return { itens: [], ocorrencias: issues };\n\n const op: OperacaoClassificada = {\n modelo: Number(nota.mod),\n local: localDaOperacao(nota),\n ...(nota.compraGov === undefined\n ? {}\n : {\n compraGovernamental: {\n tpEnteGov: Number(nota.compraGov.tpEnteGov) as TpEnteGov,\n ...(nota.compraGov.tpOperGov === '1' || nota.compraGov.tpOperGov === '2'\n ? { tpOperGov: Number(nota.compraGov.tpOperGov) as 1 | 2 }\n : {}),\n },\n }),\n itens: classificados,\n };\n const time = contextoDeTempo({ emissao: relogioFixo(nota.emissao), fatoGerador: relogioFixo(nota.fatoGerador) });\n let roc: Roc;\n try {\n roc = calcular(op, {\n dataset,\n aliquotas: rates,\n tempo: time,\n ...(options.deslocamentoMin === undefined ? {} : { deslocamentoMin: options.deslocamentoMin }),\n });\n } catch (e) {\n const issue = ocorrenciaDoMotor(e, itens);\n if (issue === undefined) throw e;\n return { itens: [], ocorrencias: [issue] };\n }\n\n // O redutor da compra governamental vai no ide.gCompraGov como a nota informou, mas o motor calcula com o do\n // dataset: se diferirem, os valores do item não fechariam com o cabeçalho emitido.\n const redutor = roc.oper?.gCompraGov.pRedutor;\n if (\n nota.compraGov !== undefined &&\n redutor !== undefined &&\n normalizado(nota.compraGov.pRedutor.toString()) !== normalizado(redutor)\n ) {\n issues.push({\n caminho: 'gCompraGov.pRedutor',\n code: 'ibscbs_redutor_divergente',\n mensagem: `pRedutor informado (${nota.compraGov.pRedutor.toString()}) difere do vigente no fato gerador (${redutor})`,\n origem: 'entrada',\n });\n }\n\n if (options.regras !== false) {\n const doc = documentoDoRoc(roc, {\n modelo: op.modelo as 55 | 65,\n crt: Number(nota.emitente.CRT) as 1 | 2 | 3 | 4,\n finNFe: Number(nota.finNFe) as 1 | 2 | 3 | 4 | 5 | 6,\n ...(nota.tpNFDebito === undefined ? {} : { tpNFDebito: nota.tpNFDebito }),\n ...(nota.tpNFCredito === undefined ? {} : { tpNFCredito: nota.tpNFCredito }),\n munEmitente: nota.emitente.cMun,\n ...(nota.destino === undefined ? {} : { munDestinatario: nota.destino.cMun }),\n itens: itens.map((it) => ({ nItem: it.nItem, ncm: it.NCM, vProd: it.vProd.toFixed(2) })),\n });\n const report = validar(doc, {\n dataset,\n tempo: time,\n ambiente: nota.ambiente,\n aliquotas: rates,\n ...(options.deslocamentoMin === undefined ? {} : { deslocamentoMin: options.deslocamentoMin }),\n ...(options.regras?.regras === undefined ? {} : { regras: options.regras.regras }),\n ...(options.regras?.ignorarAtivacao === undefined ? {} : { ignorarAtivacao: options.regras.ignorarAtivacao }),\n });\n for (const v of report.violacoes) {\n issues.push({\n caminho: v.item === undefined ? 'total.IBSCBSTot' : caminho(v.item),\n code: 'ibscbs_regra_nt',\n mensagem: `${v.regra} (rejeição ${v.cStat}): ${v.message} [${v.fonte}]`,\n origem: 'montagem',\n });\n }\n }\n\n const porItem = new Map(itens.map((it) => [it.nItem, it]));\n return {\n itens: roc.itens.map((r) => ({\n nItem: r.nItem,\n IBSCBS: grupoDoLeiaute(r.IBSCBS, porItem.get(r.nItem)?.indDoacao),\n })),\n ...(issues.length === 0 ? {} : { ocorrencias: issues }),\n };\n}\n",
9
+ "/**\n * A calculadora padrão de IBS/CBS do `montarNfe`: a porta `CalculadoraIbsCbs` implementada sobre o motor do sinete.\n *\n * Para cada item classificado, monta a operação do `@sinete/ibs-cbs/calcular` (CST, cClassTrib, base, local da operação,\n * compra governamental), calcula com o dataset do `@sinete/ibs-cbs-dados` e as alíquotas do `@sinete/ibs-cbs/aliquotas`, confere o\n * resultado pelas regras da NT 2025.002 do `@sinete/ibs-cbs/validar` e devolve o grupo `IBSCBS` de cada item na forma\n * lexical do leiaute. Erro de classificação, regime não suportado, alíquota desconhecida e violação de regra voltam\n * como ocorrências (`Ocorrencia`) no caminho do item: a nota não é montada, e nunca sai valor zerado no lugar.\n *\n * O dataset embarcado (~2 MB de JSON) só é importado na primeira nota com item classificado, por `import()` dinâmico:\n * quem usa o pacote para ler XML, eventos ou Distribuição DF-e não o carrega, e um bundler com code splitting o põe num\n * chunk à parte.\n */\n\nimport type { Ocorrencia } from '@sinete/core';\nimport { contextoDeTempo, ehUf, relogioFixo, ufPorCUf } from '@sinete/core';\nimport type { ProvedorDeAliquotas } from '@sinete/ibs-cbs/aliquotas';\nimport { aliquotasOficiais, ErroAliquotaDesconhecida } from '@sinete/ibs-cbs/aliquotas';\nimport type {\n IBSCBS,\n ItemClassificado,\n LocalDaOperacao,\n OperacaoClassificada,\n Roc,\n TpEnteGov,\n} from '@sinete/ibs-cbs/calcular';\nimport { calcular, ErroClassificacao, ErroRegimeNaoSuportado } from '@sinete/ibs-cbs/calcular';\nimport type { Regra } from '@sinete/ibs-cbs/validar';\nimport { documentoDoRoc, validar } from '@sinete/ibs-cbs/validar';\nimport type { DatasetIbsCbs } from '@sinete/ibs-cbs-dados';\nimport type {\n AliquotaIbsCbsInformada,\n CalculadoraIbsCbs,\n PedidoIbsCbsItem,\n PedidoIbsCbsNota,\n RespostaIbsCbs,\n} from './ports.ts';\n\n/** Grupo `IBSCBS` do item, como o `@sinete/nfe` o recebe. */\nexport type GrupoIbsCbs = RespostaIbsCbs['itens'][number]['IBSCBS'];\n\nexport interface CalculadoraIbsCbsOpcoes {\n /**\n * Dataset do IBS/CBS. Padrão: o embarcado no `@sinete/ibs-cbs-dados`, importado sob demanda na primeira nota\n * (`carregarDatasetEmbarcado`). Informe um bundle verificado em runtime (`conferirDataset`) para usar dados de outra\n * origem, ou o `datasetEmbarcado()` já carregado para o cálculo ser síncrono.\n */\n readonly dataset?: DatasetIbsCbs;\n /** Alíquotas. Padrão: `aliquotasOficiais()` do `@sinete/ibs-cbs/aliquotas`; troque por um provedor com alíquotas informadas. */\n readonly aliquotas?: ProvedorDeAliquotas;\n /**\n * Base do IBS/CBS do item que não trouxe `vBC`, em texto com até 2 casas. A composição da base (NT 2025.002, UB16-10)\n * ainda é \"implementação futura, aguardando orientação normativa\": sem esta função, item sem `vBC` vira ocorrência\n * `ibscbs_base_ausente` em vez de uma base presumida.\n */\n readonly base?: (item: PedidoIbsCbsItem, nota: PedidoIbsCbsNota) => string;\n /**\n * Regras da NT 2025.002 conferidas sobre os grupos produzidos (`@sinete/ibs-cbs/validar`). Padrão: as implantadas na data\n * de emissão e no ambiente. `false` desliga; `{ rules }` troca a lista.\n */\n readonly regras?: false | { readonly regras?: readonly Regra[]; readonly ignorarAtivacao?: boolean };\n /** Fuso do local da operação para a data civil do fato gerador, em minutos. Padrão: Brasília (-180). */\n readonly deslocamentoMin?: number;\n}\n\nconst BASE = /^\\d{1,13}(\\.\\d{1,2})?$/;\n\n/** Texto decimal sem zeros à direita, para comparar valores com escalas diferentes (`'0.00'` e `'0'`). */\nfunction normalizado(v: string): string {\n const [int = '0', frac = ''] = v.split('.');\n const f = frac.replace(/0+$/, '');\n const i = int.replace(/^0+(?=\\d)/, '');\n return f === '' ? i : `${i}.${f}`;\n}\n\nconst caminho = (nItem: number): string => `itens[${nItem - 1}].impostos.ibsCbs`;\n\n/** UF do município pelo código IBGE (os dois primeiros dígitos são o cUF). */\nfunction ufDoMunicipio(cMun: string): string | undefined {\n return ufPorCUf(cMun.slice(0, 2))?.sigla;\n}\n\n/**\n * Local da operação para as alíquotas próprias de UF e município: o `cMunFGIBS` informado (campo B12a da NT\n * 2025.002, município de ocorrência do fato gerador do IBS/CBS), senão o destino da mercadoria (entrega ou\n * destinatário, pela LC 214/2025, art. 11, o local da entrega), senão o emitente. Destino no exterior cai no emitente.\n */\nexport function localDaOperacao(nota: PedidoIbsCbsNota): LocalDaOperacao {\n if (nota.cMunFGIBS !== undefined) {\n const uf = ufDoMunicipio(nota.cMunFGIBS);\n if (uf !== undefined) return { uf, cMun: nota.cMunFGIBS };\n }\n const d = nota.destino;\n if (d !== undefined && d.UF !== 'EX' && ehUf(d.UF)) return { uf: d.UF, cMun: d.cMun };\n return { uf: nota.emitente.UF, cMun: nota.emitente.cMun };\n}\n\n/** Converte o grupo do motor para o do leiaute: os códigos numéricos do motor viram texto. */\nfunction grupoDoLeiaute(g: IBSCBS, indDoacao: '1' | undefined): GrupoIbsCbs {\n const { gCredPresOper, gCredPresIBSZFM, ...resto } = g;\n return {\n ...resto,\n ...(indDoacao === undefined ? {} : { indDoacao }),\n ...(gCredPresOper === undefined\n ? {}\n : { gCredPresOper: { ...gCredPresOper, cCredPres: String(gCredPresOper.cCredPres).padStart(2, '0') } }),\n ...(gCredPresIBSZFM === undefined\n ? {}\n : {\n gCredPresIBSZFM: {\n ...gCredPresIBSZFM,\n tpCredPresIBSZFM: String(gCredPresIBSZFM.tpCredPresIBSZFM),\n },\n }),\n } as GrupoIbsCbs;\n}\n\n/**\n * Erro do motor ou das alíquotas como uma ocorrência no caminho do item (o primeiro, quando o erro não diz o item).\n * `semAliquota` acha o item que pediu a alíquota desconhecida: o erro do provedor diz o tributo e a data, não o item.\n */\nfunction ocorrenciaDoMotor(\n e: unknown,\n itens: readonly PedidoIbsCbsItem[],\n semAliquota: () => number | undefined,\n): Ocorrencia | undefined {\n if (e instanceof ErroClassificacao || e instanceof ErroRegimeNaoSuportado) {\n const path = e.item !== undefined ? caminho(e.item) : caminho(itens[0]?.nItem ?? 1);\n return { caminho: path, code: e.code, mensagem: e.message, origem: 'entrada' };\n }\n // Alíquota que o sinete não conhece para a data: falta de dado do pacote, não da nota.\n if (e instanceof ErroAliquotaDesconhecida) {\n const n = semAliquota() ?? itens[0]?.nItem ?? 1;\n return { caminho: caminho(n), code: e.code, mensagem: e.message, origem: 'montagem' };\n }\n return undefined;\n}\n\n/**\n * O primeiro item (pela ordem de `nItem`, a do motor) cujo cálculo sozinho pede uma alíquota desconhecida. Só roda na\n * recusa, para pôr a ocorrência no item em vez de na nota.\n */\nfunction primeiroItemSemAliquota(\n op: OperacaoClassificada,\n calc: (op: OperacaoClassificada) => unknown,\n): number | undefined {\n for (const it of [...op.itens].sort((a, b) => a.n - b.n)) {\n try {\n calc({ ...op, itens: [it] });\n } catch (e) {\n if (e instanceof ErroAliquotaDesconhecida) return it.n;\n }\n }\n return undefined;\n}\n\nlet embarcado: Promise<DatasetIbsCbs> | undefined;\n\n/**\n * O dataset embarcado no `@sinete/ibs-cbs-dados`, importado sob demanda (`import()` dinâmico) e carregado uma vez por\n * processo. É o que a calculadora padrão usa quando `dataset` não é informado; chamar antes só adianta a carga. Se o\n * import falhar, a próxima chamada tenta de novo.\n */\nexport function carregarDatasetEmbarcado(): Promise<DatasetIbsCbs> {\n embarcado ??= import('@sinete/ibs-cbs-dados/embarcado').then(\n (m) => m.datasetEmbarcado(),\n (e: unknown) => {\n embarcado = undefined;\n throw e;\n },\n );\n return embarcado;\n}\n\n/**\n * Cria a calculadora de IBS/CBS sobre o motor do sinete. O `montarNfe` usa uma com as opções padrão quando\n * `opcoes.ibsCbs` não é informado; crie a sua para trocar dataset, alíquotas, base ou regras. Com `dataset` informado\n * o cálculo é síncrono; sem ele, a primeira chamada espera o import do dataset embarcado.\n */\nexport function calculadoraIbsCbs(opcoes: CalculadoraIbsCbsOpcoes = {}): CalculadoraIbsCbs {\n const rates = opcoes.aliquotas ?? aliquotasOficiais();\n const dataset = opcoes.dataset;\n return {\n calcular(request: {\n readonly nota: PedidoIbsCbsNota;\n readonly itens: readonly PedidoIbsCbsItem[];\n }): RespostaIbsCbs | Promise<RespostaIbsCbs> {\n if (dataset !== undefined) return calcularCom(dataset, rates, opcoes, request);\n return carregarDatasetEmbarcado().then((ds) => calcularCom(ds, rates, opcoes, request));\n },\n };\n}\n\nfunction calcularCom(\n dataset: DatasetIbsCbs,\n rates: ProvedorDeAliquotas,\n options: CalculadoraIbsCbsOpcoes,\n {\n nota,\n itens,\n }: {\n readonly nota: PedidoIbsCbsNota;\n readonly itens: readonly PedidoIbsCbsItem[];\n },\n): RespostaIbsCbs {\n const issues: Ocorrencia[] = [];\n const classificados: ItemClassificado[] = [];\n for (const it of itens) {\n if (it.cCredPres !== undefined) {\n // O crédito presumido pede os percentuais por tributo (pCredPres), que a porta não traz.\n issues.push({\n caminho: caminho(it.nItem),\n code: 'ibscbs_nao_suportado',\n mensagem: 'crédito presumido (cCredPres) precisa do grupo gCredPresOper pronto (ibsCbs.grupo)',\n origem: 'entrada',\n });\n continue;\n }\n const base = it.vBC !== undefined ? it.vBC.toFixed(2) : options.base?.(it, nota);\n if (base === undefined) {\n issues.push({\n caminho: `${caminho(it.nItem)}.classificacao.vBC`,\n code: 'ibscbs_base_ausente',\n mensagem:\n 'informe vBC do IBS/CBS ou CalculadoraIbsCbsOpcoes.base: a composição da base (UB16-10) ainda não tem regra publicada',\n origem: 'entrada',\n });\n continue;\n }\n if (!BASE.test(base)) {\n // Da entrada quando é o vBC do item; da montagem quando veio da função `base` das opções.\n issues.push({\n caminho: `${caminho(it.nItem)}.classificacao.vBC`,\n code: 'decimal_invalido',\n mensagem: base,\n origem: it.vBC !== undefined ? 'entrada' : 'montagem',\n });\n continue;\n }\n classificados.push({\n n: it.nItem,\n cst: it.CST,\n cClassTrib: it.cClassTrib,\n base,\n quantidade: it.qTrib.toString(),\n unidade: it.uTrib,\n ...(it.gTribRegular === undefined\n ? {}\n : { regular: { cst: it.gTribRegular.CSTReg, cClassTrib: it.gTribRegular.cClassTribReg } }),\n });\n }\n if (issues.length > 0) return { itens: [], ocorrencias: issues };\n\n const op: OperacaoClassificada = {\n modelo: Number(nota.mod),\n local: localDaOperacao(nota),\n ...(nota.compraGov === undefined\n ? {}\n : {\n compraGovernamental: {\n tpEnteGov: Number(nota.compraGov.tpEnteGov) as TpEnteGov,\n ...(nota.compraGov.tpOperGov === '1' || nota.compraGov.tpOperGov === '2'\n ? { tpOperGov: Number(nota.compraGov.tpOperGov) as 1 | 2 }\n : {}),\n },\n }),\n itens: classificados,\n };\n const time = contextoDeTempo({ emissao: relogioFixo(nota.emissao), fatoGerador: relogioFixo(nota.fatoGerador) });\n const calc = (o: OperacaoClassificada): Roc =>\n calcular(o, {\n dataset,\n aliquotas: rates,\n tempo: time,\n ...(options.deslocamentoMin === undefined ? {} : { deslocamentoMin: options.deslocamentoMin }),\n });\n let roc: Roc;\n try {\n roc = calc(op);\n } catch (e) {\n const issue = ocorrenciaDoMotor(e, itens, () => primeiroItemSemAliquota(op, calc));\n if (issue === undefined) throw e;\n return { itens: [], ocorrencias: [issue] };\n }\n\n // O redutor da compra governamental vai no ide.gCompraGov como a nota informou, mas o motor calcula com o do\n // dataset: se diferirem, os valores do item não fechariam com o cabeçalho emitido.\n const redutor = roc.oper?.gCompraGov.pRedutor;\n if (\n nota.compraGov !== undefined &&\n redutor !== undefined &&\n normalizado(nota.compraGov.pRedutor.toString()) !== normalizado(redutor)\n ) {\n issues.push({\n caminho: 'gCompraGov.pRedutor',\n code: 'ibscbs_redutor_divergente',\n mensagem: `pRedutor informado (${nota.compraGov.pRedutor.toString()}) difere do vigente no fato gerador (${redutor})`,\n origem: 'entrada',\n });\n }\n\n if (options.regras !== false) {\n const doc = documentoDoRoc(roc, {\n modelo: op.modelo as 55 | 65,\n crt: Number(nota.emitente.CRT) as 1 | 2 | 3 | 4,\n finNFe: Number(nota.finNFe) as 1 | 2 | 3 | 4 | 5 | 6,\n ...(nota.tpNFDebito === undefined ? {} : { tpNFDebito: nota.tpNFDebito }),\n ...(nota.tpNFCredito === undefined ? {} : { tpNFCredito: nota.tpNFCredito }),\n munEmitente: nota.emitente.cMun,\n ...(nota.destino === undefined ? {} : { munDestinatario: nota.destino.cMun }),\n itens: itens.map((it) => ({ nItem: it.nItem, ncm: it.NCM, vProd: it.vProd.toFixed(2) })),\n });\n const report = validar(doc, {\n dataset,\n tempo: time,\n ambiente: nota.ambiente,\n aliquotas: rates,\n ...(options.deslocamentoMin === undefined ? {} : { deslocamentoMin: options.deslocamentoMin }),\n ...(options.regras?.regras === undefined ? {} : { regras: options.regras.regras }),\n ...(options.regras?.ignorarAtivacao === undefined ? {} : { ignorarAtivacao: options.regras.ignorarAtivacao }),\n });\n for (const v of report.violacoes) {\n issues.push({\n caminho: v.item === undefined ? 'total.IBSCBSTot' : caminho(v.item),\n code: 'ibscbs_regra_nt',\n mensagem: `${v.regra} (rejeição ${v.cStat}): ${v.message} [${v.fonte}]`,\n origem: 'montagem',\n });\n }\n }\n\n const porItem = new Map(itens.map((it) => [it.nItem, it]));\n const informadas: AliquotaIbsCbsInformada[] = roc.itens.flatMap((r) =>\n r.aliquotas\n .filter((a) => a.situacao === 'informada')\n .map((a) => ({ nItem: r.nItem, tributo: a.tributo, valor: a.valor, motivo: a.motivo ?? '' })),\n );\n return {\n itens: roc.itens.map((r) => ({\n nItem: r.nItem,\n IBSCBS: grupoDoLeiaute(r.IBSCBS, porItem.get(r.nItem)?.indDoacao),\n })),\n ...(informadas.length === 0 ? {} : { aliquotasInformadas: informadas }),\n ...(issues.length === 0 ? {} : { ocorrencias: issues }),\n };\n}\n",
10
10
  "/**\n * Fuso do emitente e formatação dos instantes do leiaute (`TDateTimeUTC`, `AAAA-MM-DDThh:mm:ss±hh:mm`). O fuso vem da\n * tabela `data/fusos.json` pela UF, ou do chamador; nunca do fuso da máquina.\n */\n\nimport type { Relogio, Uf } from '@sinete/core';\nimport { formatarDataHoraComFuso } from '@sinete/core';\nimport fusos from './data/fusos.json' with { type: 'json' };\n\n/** Instante no tempo, como os relógios do `@sinete/core` o devolvem (o tipo `Date`, sem tocar no global). */\nexport type Instante = ReturnType<Relogio['agora']>;\n\nconst UF_OFFSETS: Readonly<Record<string, number>> = fusos.ufs;\n\n/** Deslocamento do horário legal da UF em minutos (`-180` para Brasília). */\nexport function deslocamentoDaUf(uf: Uf): number {\n return Object.hasOwn(UF_OFFSETS, uf) ? (UF_OFFSETS[uf] as number) : fusos.padrao;\n}\n\n/** `TDateTimeUTC` do instante no deslocamento dado. */\nexport function formatarDh(data: Instante, deslocamentoMin: number): string {\n return formatarDataHoraComFuso(data, deslocamentoMin);\n}\n",
11
- "// GERADO por scripts/versao-gerada.ts a partir do package.json. Não edite: rode `bun scripts/versao-gerada.ts`.\n/** Versão de `@sinete/nfe`, para o padrão de `verProc`/`verAplic` (`formatarVerProc` do @sinete/core). */\nexport const VERSAO_PACOTE = '0.3.0';\n",
11
+ "// GERADO por scripts/versao-gerada.ts a partir do package.json. Não edite: rode `bun scripts/versao-gerada.ts`.\n/** Versão de `@sinete/nfe`, para o padrão de `verProc`/`verAplic` (`formatarVerProc` do @sinete/core). */\nexport const VERSAO_PACOTE = '0.5.0';\n",
12
12
  "/**\n * Regras do grupo E (destinatário) do MOC 7.0 Anexo I que dependem só do documento e são obrigatórias no modelo 55 ou\n * 65, conferidas antes de assinar com o caminho da entrada (ADR 0012, seção \"Destinatário\"). Ficam de fora as que\n * dependem de tabela externa (municípios do IBGE, E10-10; países do BACEN, E14-04), do cadastro da SEFAZ (5E17) ou do\n * critério da UF (E16a-30 e E16a-35, E14-10 e E14-20, facultativas). As regras só da NFC-e estão em `nfce.ts`.\n */\n\nimport { ufPorSigla } from '@sinete/core';\nimport { lerCnpj } from '@sinete/validators';\nimport suframa from '../data/suframa.json' with { type: 'json' };\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\n\n/** Identificação já resolvida pelo montador (com os padrões aplicados). */\nexport interface IdeDestinatario {\n readonly mod: '55' | '65';\n readonly tpNF: string;\n readonly idDest: string;\n readonly idDestInformado: boolean;\n readonly indFinal: string;\n readonly producao: boolean;\n}\n\n/** Caracteres do idEstrangeiro (E03a-60): algarismos, letras e `:.+-/()`. */\nconst ID_ESTRANGEIRO = /^[0-9A-Za-z:.+\\-/()]*$/;\n\nconst digitos = (s: string): string => s.replace(/\\D/g, '');\n\nexport function conferirDestinatario(input: DadosNfe, ide: IdeDestinatario, issues: Issues): void {\n const d = input.destinatario;\n if (d === undefined) return;\n const nfe = ide.mod === '55';\n const emitUf = input.emitente.endereco.UF;\n const end = d.endereco;\n const exterior = end !== undefined && 'exterior' in end && end.exterior === true;\n const destUf = end === undefined ? undefined : exterior ? 'EX' : (end as { UF: string }).UF;\n const idEstrangeiro = 'idEstrangeiro' in d ? d.idEstrangeiro : undefined;\n\n // E03a: destinatário estrangeiro.\n if (nfe && ide.idDest === '3' && idEstrangeiro === undefined) {\n issues.add(\n 'destinatario',\n 'campo_obrigatorio',\n 'na operação com o exterior (idDest 3) o destinatário é identificado por idEstrangeiro, mesmo vazio (E03a-10, rejeição 720)',\n );\n }\n if (nfe && idEstrangeiro !== undefined && ide.idDest !== '3' && ide.indFinal !== '1') {\n issues.add(\n 'destinatario.idEstrangeiro',\n 'combinacao_invalida',\n 'idEstrangeiro fora da operação com o exterior só com consumidor final, indFinal 1 (E03a-20, rejeição 721)',\n );\n }\n if (idEstrangeiro !== undefined && d.IE !== undefined) {\n issues.add(\n 'destinatario.IE',\n 'combinacao_invalida',\n 'destinatário estrangeiro (idEstrangeiro) não informa IE (E03a-30, rejeição 925)',\n );\n }\n if (idEstrangeiro !== undefined && !ID_ESTRANGEIRO.test(idEstrangeiro)) {\n issues.add(\n 'destinatario.idEstrangeiro',\n 'campo_invalido',\n 'idEstrangeiro só com algarismos, letras e os caracteres : . + - / ( ) (E03a-60, rejeição 372)',\n );\n }\n\n // E04 e E05: nome e endereço na NF-e. Em homologação o nome é o literal da E04-20, posto pelo montador.\n if (nfe && ide.producao && (d.xNome === undefined || d.xNome.trim() === '')) {\n issues.add(\n 'destinatario.xNome',\n 'campo_obrigatorio',\n 'a NF-e informa o nome do destinatário (E04-10, rejeição 724)',\n );\n }\n if (nfe && end === undefined) {\n issues.add(\n 'destinatario.endereco',\n 'campo_obrigatorio',\n 'a NF-e informa o endereço do destinatário (E05-10, rejeição 726)',\n );\n }\n\n // E10-20: o município do destinatário é da UF dele (as duas primeiras posições do código são o código da UF).\n if (end !== undefined && !exterior) {\n const e = end as { UF: string; cMun: string };\n const cUF = ufPorSigla(e.UF)?.cUF;\n if (cUF !== undefined && digitos(e.cMun).slice(0, 2) !== cUF) {\n issues.add(\n 'destinatario.endereco.cMun',\n 'combinacao_invalida',\n `município ${e.cMun} não é da UF ${e.UF} do destinatário (E10-20, rejeição 275)`,\n );\n }\n }\n\n // E12-30 a E12-60: idDest contra as UFs do emitente e do destinatário, com as exceções da própria regra.\n if (nfe && destUf !== undefined && destUf !== 'EX') {\n const caminho = ide.idDestInformado ? 'idDest' : 'destinatario.endereco.UF';\n const ufsCons = input.itens.flatMap((it) => {\n const esp = it.produto.especifico;\n return esp !== undefined && 'comb' in esp ? [String(esp.comb.UFCons)] : [];\n });\n const entrega = input.entrega?.UF;\n const retirada = input.retirada?.UF;\n const saida = ide.tpNF === '1';\n // Na saída a entrega vale contra o emitente e a retirada contra o destinatário; na entrada, ao contrário.\n const [ufEntrega, ufRetirada] = saida ? [emitUf, destUf] : [destUf, emitUf];\n if (ide.idDest === '2' && destUf === emitUf) {\n // CNPJ alfanumérico: as letras contam; só a máscara sai (a mesma normalização do lerCnpj).\n const cnpj = (v: string | undefined): string | undefined => {\n if (v === undefined) return undefined;\n const r = lerCnpj(v);\n return r.ok ? r.valor : undefined;\n };\n const cnpjDest = 'CNPJ' in d ? cnpj(d.CNPJ) : undefined;\n const mesmoCnpj = cnpjDest !== undefined && cnpjDest === cnpj(input.emitente.CNPJ);\n const excecao =\n ufsCons.some((u) => u !== emitUf) ||\n (entrega !== undefined && retirada === undefined && entrega !== ufEntrega) ||\n (retirada !== undefined && entrega === undefined && retirada !== ufRetirada) ||\n (entrega !== undefined && retirada !== undefined && entrega !== retirada);\n if (!mesmoCnpj && !excecao) {\n issues.add(\n caminho,\n 'combinacao_invalida',\n `operação interestadual (idDest 2) com o destinatário na UF do emitente (${emitUf}) (${saida ? 'E12-30' : 'E12-50'}, rejeição 772)`,\n );\n }\n }\n if (ide.idDest === '1' && destUf !== emitUf && ide.indFinal !== '1') {\n const excecao =\n ufsCons.some((u) => u === emitUf) ||\n (entrega !== undefined && retirada === undefined && entrega === ufEntrega) ||\n (retirada !== undefined && entrega === undefined && retirada === ufRetirada) ||\n (entrega !== undefined && retirada !== undefined && entrega === retirada);\n if (!excecao) {\n issues.add(\n caminho,\n 'combinacao_invalida',\n `operação interna (idDest 1) com o destinatário em ${destUf}, fora da UF do emitente (${emitUf}) (${saida ? 'E12-40' : 'E12-60'}, rejeição 773)`,\n );\n }\n }\n }\n\n // E14-30: no exterior, o país não é o Brasil (o código pode vir com zeros à esquerda).\n if (exterior && Number(digitos((end as { cPais: string }).cPais)) === 1058) {\n issues.add(\n 'destinatario.endereco.cPais',\n 'campo_invalido',\n 'destinatário no exterior com o país Brasil, 1058 (E14-30, rejeição 926)',\n );\n }\n\n if (!nfe) return;\n\n // E16a: indicador da IE.\n if (ide.idDest === '3' && d.indIEDest !== '9') {\n issues.add(\n 'destinatario.indIEDest',\n 'combinacao_invalida',\n 'na operação com o exterior o destinatário é não contribuinte, indIEDest 9 (E16a-20, rejeição 790)',\n );\n }\n if (d.indIEDest === '9' && ide.indFinal !== '1' && ide.tpNF === '1' && ide.idDest !== '3') {\n issues.add(\n 'indFinal',\n 'combinacao_invalida',\n 'saída para não contribuinte (indIEDest 9) é operação com consumidor final, indFinal 1 (E16a-40, rejeição 696)',\n );\n }\n\n // E17: a IE do destinatário.\n if (d.indIEDest === '1' && d.IE === undefined) {\n issues.add(\n 'destinatario.IE',\n 'campo_obrigatorio',\n 'destinatário contribuinte (indIEDest 1) informa a IE (E17-20, rejeição 728)',\n );\n }\n if (d.indIEDest === '2' && d.IE !== undefined) {\n issues.add(\n 'destinatario.IE',\n 'combinacao_invalida',\n 'destinatário contribuinte isento (indIEDest 2) não informa a IE (E17-30, rejeição 791)',\n );\n }\n if (exterior && d.IE !== undefined) {\n issues.add(\n 'destinatario.IE',\n 'combinacao_invalida',\n 'destinatário no exterior não informa a IE (E17-40, rejeição 792)',\n );\n }\n\n // E18-30: a inscrição na Suframa só vale nas UFs e municípios da área incentivada; no exterior (UF EX), nunca.\n if (d.ISUF !== undefined && destUf !== undefined) {\n const cMun = exterior ? '' : digitos((end as { cMun: string }).cMun);\n const municipios = (suframa.municipios as Record<string, readonly string[]>)[destUf];\n const aceita = suframa.ufs.includes(destUf) || (municipios?.includes(cMun) ?? false);\n if (!aceita) {\n const onde = exterior ? 'no exterior' : `${destUf}, município ${(end as { cMun: string }).cMun}`;\n issues.add(\n 'destinatario.ISUF',\n 'combinacao_invalida',\n `inscrição na Suframa com o destinatário fora da área incentivada (${onde}) (E18-30, rejeição 251)`,\n );\n }\n }\n}\n",
13
13
  "/**\n * IBS/CBS (grupo UB, NT 2025.002): chama a calculadora injetada para os itens classificados e totaliza o grupo\n * `IBSCBSTot` (W34 a W59g) somando exatamente os valores dos itens.\n */\n\nimport { lerXml, primeiroFilho } from '@sinete/core/xml';\nimport type { ComplexType } from '@sinete/schemas';\nimport { serializar, validar } from '@sinete/schemas';\nimport type { TIBSCBSMonoTot, TTribNFe } from '@sinete/schemas/nfe/PL_010f';\nimport { Decimal } from '../decimal.ts';\nimport type { Issues } from '../issues.ts';\n\nconst NFE_NS = 'http://www.portalfiscal.inf.br/nfe';\n\n/**\n * Valida contra o schema um grupo repassado (IBSCBS pronto ou da calculadora, IS) antes de qualquer soma: grupo\n * incompleto vira ocorrência `schema` com o caminho do item, nunca exceção no meio dos totais.\n */\nexport function grupoInvalido(ct: ComplexType, nome: string, value: unknown, path: string, issues: Issues): boolean {\n if (value === undefined) return false;\n try {\n const doc = lerXml(`<w xmlns=\"${NFE_NS}\">${serializar(ct, nome, value as never, NFE_NS)}</w>`);\n const el = primeiroFilho(doc.raiz, nome, NFE_NS);\n const erros =\n el === undefined ? [{ caminho: '', code: 'modelo_de_conteudo', mensagem: 'grupo vazio' }] : validar(ct, el);\n for (const e of erros)\n issues.add(\n `${path}${e.caminho.replace(/^\\/[^/]+/, '').replace(/\\//g, '.')}`,\n 'schema',\n `${e.code}: ${e.mensagem}`,\n );\n return erros.length > 0;\n } catch (e) {\n issues.add(path, 'schema', `grupo malformado: ${(e as Error).message}`);\n return true;\n }\n}\n\n/** Campos numéricos dos grupos do leiaute: valores, percentuais, quantidades e ad rem (`vBC`, `pIBSUF`, `qBCMono`...). */\nconst NUMERICO = /^(v|p|q|adRem)[A-Z]/;\n\n/** Aponta cada campo numérico que não é um decimal válido, em qualquer profundidade de um grupo repassado. */\nexport function decimaisInvalidos(value: unknown, path: string, issues: Issues): void {\n if (typeof value !== 'object' || value === null) return;\n for (const [k, v] of Object.entries(value)) {\n const p = `${path}.${k}`;\n if (typeof v === 'string' && NUMERICO.test(k) && Decimal.tryOf(v) === undefined) {\n issues.add(p, 'decimal_invalido', 'número decimal inválido');\n } else if (typeof v === 'object') decimaisInvalidos(v, p, issues);\n }\n}\n\n/** Soma todos os campos `name` em qualquer profundidade do objeto (valores lexicais do leiaute). */\nexport function somaCampo(value: unknown, name: string): Decimal {\n if (typeof value !== 'object' || value === null) return Decimal.ZERO;\n let acc = Decimal.ZERO;\n for (const [k, v] of Object.entries(value)) {\n if (k === name && typeof v === 'string') acc = acc.plus(Decimal.of(v));\n else if (typeof v === 'object') acc = acc.plus(somaCampo(v, name));\n }\n return acc;\n}\n\n/** Valores do grupo do item que entram no vItem (VB01-10): vIBS, vCBS e os totais monofásicos. */\nexport function ibsCbsDoItem(g: TTribNFe): {\n vIBS: Decimal;\n vCBS: Decimal;\n vTotIBSMonoItem: Decimal;\n vTotCBSMonoItem: Decimal;\n} {\n const s = (x: string | undefined): Decimal => (x === undefined ? Decimal.ZERO : Decimal.of(x));\n return {\n vIBS: s(g.gIBSCBS?.vIBS),\n vCBS: s(g.gIBSCBS?.gCBS.vCBS),\n vTotIBSMonoItem: s(g.gIBSCBSMono?.vTotIBSMonoItem),\n vTotCBSMonoItem: s(g.gIBSCBSMono?.vTotCBSMonoItem),\n };\n}\n\n/** `IBSCBSTot` a partir dos grupos dos itens (NT 2025.002, W35-10 a W59g-10). */\nexport function totalIbsCbs(grupos: readonly TTribNFe[]): TIBSCBSMonoTot {\n const f = (d: Decimal): string => d.toFixed(2);\n const sum = (pick: (g: TTribNFe) => unknown, name: string): Decimal =>\n grupos.reduce((acc, g) => acc.plus(somaCampo(pick(g), name)), Decimal.ZERO);\n // gIBS e gCBS entram quando há tributação regular ou crédito presumido em algum item: o crédito pode vir sem o\n // gIBSCBS e não pode sumir do total.\n const regulares = grupos.filter((g) => g.gIBSCBS !== undefined || g.gCredPresOper !== undefined);\n const total: Record<string, unknown> = {\n vBCIBSCBS: f(sum((g) => g.gIBSCBS && { vBC: g.gIBSCBS.vBC }, 'vBC')),\n };\n if (regulares.length > 0) {\n const credIbs = (g: TTribNFe): unknown => g.gCredPresOper?.gIBSCredPres;\n const credCbs = (g: TTribNFe): unknown => g.gCredPresOper?.gCBSCredPres;\n total.gIBS = {\n gIBSUF: {\n vDif: f(sum((g) => g.gIBSCBS?.gIBSUF.gDif, 'vDif')),\n vDevTrib: f(sum((g) => g.gIBSCBS?.gIBSUF.gDevTrib, 'vDevTrib')),\n vIBSUF: f(sum((g) => g.gIBSCBS && { v: g.gIBSCBS.gIBSUF.vIBSUF }, 'v')),\n },\n gIBSMun: {\n vDif: f(sum((g) => g.gIBSCBS?.gIBSMun.gDif, 'vDif')),\n vDevTrib: f(sum((g) => g.gIBSCBS?.gIBSMun.gDevTrib, 'vDevTrib')),\n vIBSMun: f(sum((g) => g.gIBSCBS && { v: g.gIBSCBS.gIBSMun.vIBSMun }, 'v')),\n },\n vIBS: f(sum((g) => g.gIBSCBS && { v: g.gIBSCBS.vIBS }, 'v')),\n vCredPres: f(sum(credIbs, 'vCredPres')),\n vCredPresCondSus: f(sum(credIbs, 'vCredPresCondSus')),\n };\n total.gCBS = {\n vDif: f(sum((g) => g.gIBSCBS?.gCBS.gDif, 'vDif')),\n vDevTrib: f(sum((g) => g.gIBSCBS?.gCBS.gDevTrib, 'vDevTrib')),\n vCBS: f(sum((g) => g.gIBSCBS && { v: g.gIBSCBS.gCBS.vCBS }, 'v')),\n vCredPres: f(sum(credCbs, 'vCredPres')),\n vCredPresCondSus: f(sum(credCbs, 'vCredPresCondSus')),\n };\n }\n if (grupos.some((g) => g.gIBSCBSMono !== undefined)) {\n const mono = (n: string): string => f(sum((g) => g.gIBSCBSMono, n));\n total.gMono = {\n vIBSMono: mono('vIBSMono'),\n vCBSMono: mono('vCBSMono'),\n vIBSMonoReten: mono('vIBSMonoReten'),\n vCBSMonoReten: mono('vCBSMonoReten'),\n vIBSMonoRet: mono('vIBSMonoRet'),\n vCBSMonoRet: mono('vCBSMonoRet'),\n };\n }\n if (grupos.some((g) => g.gEstornoCred !== undefined)) {\n total.gEstornoCred = {\n vIBSEstCred: f(sum((g) => g.gEstornoCred, 'vIBSEstCred')),\n vCBSEstCred: f(sum((g) => g.gEstornoCred, 'vCBSEstCred')),\n };\n }\n return total as TIBSCBSMonoTot;\n}\n",
14
14
  "/**\n * Contexto de uma montagem: coleta ocorrências e converte as entradas numéricas conferindo cada uma contra o formato do\n * campo no leiaute. As contas usam o valor já na precisão do XML (uma alíquota com 5 casas é recusada, não\n * arredondada em silêncio), para que o que vai no XML seja exatamente o que entrou na conta.\n */\n\nimport type { DecimalInput, RoundingMode } from '../decimal.ts';\nimport { Decimal } from '../decimal.ts';\nimport type { FormatoDecimal } from '../format.ts';\nimport { formatarDecimal, problemaDeFormato } from '../format.ts';\nimport type { Issues } from '../issues.ts';\n\n/** Famílias de campo com modo de arredondamento próprio (`data/arredondamento.json`). */\nexport type Familia = 'produto' | 'icms' | 'ipi' | 'pisCofins' | 'issqn' | 'ibsCbs';\n\n/** Tolerância das regras de validação de valor (MOC 7.0 Anexo I, nota (*4); NT 2025.002, observações das RV UB). */\nexport const TOLERANCIA: Decimal = Decimal.of('0.01');\n\nexport class Ctx {\n readonly issues: Issues;\n readonly modes: Readonly<Record<Familia, RoundingMode>>;\n /**\n * Confere o valor informado contra o calculado. Desligado na NF-e complementar e na de ajuste (finNFe 2 e 3), cujos\n * valores complementam outra nota e não seguem a conta do item (MOC 7.0 Anexo I, RV I11: \"Se NF-e Normal\").\n */\n readonly conferir: boolean;\n\n constructor(issues: Issues, modes: Readonly<Record<Familia, RoundingMode>>, conferir = true) {\n this.issues = issues;\n this.modes = modes;\n this.conferir = conferir;\n }\n\n /** Entrada opcional; inválida vira ocorrência e `undefined`. */\n opt(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal | undefined {\n if (value === undefined) return undefined;\n const d = Decimal.tryOf(value);\n if (d === undefined) {\n this.issues.add(path, 'decimal_invalido', 'número decimal inválido (use ponto como separador, sem milhar)');\n return undefined;\n }\n const problem = problemaDeFormato(d, format);\n if (problem !== undefined) {\n this.issues.add(path, 'decimal_invalido', `${problem} (${format.nome})`);\n return undefined;\n }\n return d;\n }\n\n /** Entrada obrigatória; ausente ou inválida vira ocorrência e zero, para que a montagem siga e junte tudo. */\n req(value: DecimalInput | undefined, path: string, format: FormatoDecimal): Decimal {\n if (value === undefined) {\n this.issues.add(path, 'campo_obrigatorio', 'campo obrigatório');\n return Decimal.ZERO;\n }\n return this.opt(value, path, format) ?? Decimal.ZERO;\n }\n\n /** Arredonda um valor calculado no formato do campo pelo modo da família. */\n round(value: Decimal, format: FormatoDecimal, familia: Familia): Decimal {\n return value.round(format.max, this.modes[familia]);\n }\n\n /**\n * Valor derivado: sem valor informado, o calculado (arredondado); com valor informado, o informado, conferido\n * contra o calculado com a tolerância das regras de validação.\n */\n /**\n * Base de cálculo: a informada prevalece sem conferência (a base legal varia por operação, UF e regime); o padrão\n * só vale quando nada veio.\n */\n base(\n given: DecimalInput | undefined,\n padrao: Decimal,\n path: string,\n format: FormatoDecimal,\n familia: Familia,\n ): Decimal {\n return this.opt(given, path, format) ?? this.round(padrao, format, familia);\n }\n\n calc(\n given: DecimalInput | undefined,\n computed: Decimal,\n path: string,\n format: FormatoDecimal,\n familia: Familia,\n ): Decimal {\n const r = this.round(computed, format, familia);\n if (given === undefined) return r;\n const g = this.opt(given, path, format);\n if (g === undefined) return r;\n if (this.conferir && g.minus(r).abs().gt(TOLERANCIA)) {\n this.issues.add(\n path,\n 'valor_divergente',\n `valor informado difere do calculado (${r.toFixed(format.max)}) em mais de ${TOLERANCIA.toString()}`,\n );\n }\n return g;\n }\n\n /** Texto no formato do campo. */\n s(value: Decimal, format: FormatoDecimal): string {\n return formatarDecimal(value, format);\n }\n\n /** Texto opcional: ausente fica ausente, e zero some nos formatos que não aceitam zero. */\n so(value: Decimal | undefined, format: FormatoDecimal): string | undefined {\n if (value === undefined) return undefined;\n if (format.naoNulo && value.isZero()) return undefined;\n return formatarDecimal(value, format);\n }\n}\n\n/** Remove as chaves com `undefined` (o serializer ignora, mas o objeto devolvido fica limpo e comparável). */\nexport function clean<T extends object>(o: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Só dígitos (tira máscara de CEP, CNPJ numérico, telefone). */\nexport function digits(s: string): string {\n return s.replace(/\\D/g, '');\n}\n",
15
15
  "/**\n * Grupo ICMS do item (N01 a N10h). Cada CST/CSOSN do modelo vira o grupo do leiaute correspondente; os valores\n * derivados são calculados com as fórmulas das regras de validação do MOC 7.0 Anexo I, citadas em cada conta.\n */\n\nimport type { TNFe_infNFe_det_imposto_ICMS } from '@sinete/schemas/nfe/PL_010f';\nimport type { DecimalInput } from '../decimal.ts';\nimport { Decimal } from '../decimal.ts';\nimport type { FormatoDecimal } from '../format.ts';\nimport { D0302A04, D0302A04_OPC, D1104V, D1302 } from '../format.ts';\nimport type {\n Desoneracao,\n DesoneracaoSt,\n Icms,\n IcmsFcp,\n IcmsSt,\n IcmsStRetido,\n MotivoDesoneracaoIcms,\n} from '../model.ts';\nimport type { Ctx } from './values.ts';\nimport { clean } from './values.ts';\n\n/** O que o grupo ICMS do item soma nos totais (W02 a W06a e os monofásicos). */\nexport interface IcmsTotais {\n vBC: Decimal;\n vICMS: Decimal;\n vICMSDeson: Decimal;\n /** Parte do desonerado que deduz do valor do item e do total (indDeduzDeson=1). */\n vICMSDesonDeduz: Decimal;\n vFCP: Decimal;\n vBCST: Decimal;\n vST: Decimal;\n vFCPST: Decimal;\n vFCPSTRet: Decimal;\n qBCMono: Decimal;\n vICMSMono: Decimal;\n qBCMonoReten: Decimal;\n vICMSMonoReten: Decimal;\n qBCMonoRet: Decimal;\n vICMSMonoRet: Decimal;\n /** O item tem algum grupo monofásico (os totais monofásicos só vão para o XML nesse caso). */\n mono: boolean;\n}\n\nexport function zeroIcmsTotais(): IcmsTotais {\n const z = Decimal.ZERO;\n return {\n vBC: z,\n vICMS: z,\n vICMSDeson: z,\n vICMSDesonDeduz: z,\n vFCP: z,\n vBCST: z,\n vST: z,\n vFCPST: z,\n vFCPSTRet: z,\n qBCMono: z,\n vICMSMono: z,\n qBCMonoReten: z,\n vICMSMonoReten: z,\n qBCMonoRet: z,\n vICMSMonoRet: z,\n mono: false,\n };\n}\n\n/** Dados do item que as contas do ICMS usam. */\nexport interface IcmsItemBase {\n /** Valor da operação: vProd + vFrete + vSeg + vOutro - vDesc. */\n readonly vOp: Decimal;\n /** IPI do item (entra na base do ST por MVA). */\n readonly vIPI: Decimal;\n}\n\ntype Out = Record<string, string | undefined>;\n\nconst M: FormatoDecimal = D1302;\nconst P: FormatoDecimal = D0302A04;\nconst PO: FormatoDecimal = D0302A04_OPC;\n\nfunction nonNeg(d: Decimal): Decimal {\n return d.isNegative() ? Decimal.ZERO : d;\n}\n\nexport function buildIcms(\n ctx: Ctx,\n input: Icms,\n base: IcmsItemBase,\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_ICMS; totais: IcmsTotais } {\n const t = zeroIcmsTotais();\n const S = (d: Decimal): string => ctx.s(d, M);\n\n /** Parte própria: modBC, vBC (reduzida por pRedBC quando houver), pICMS, vICMS. MOC N15, N16, N17 (RV N17, nota *4). */\n const proprio = (\n i: { modBC?: string; vBC?: DecimalInput; pICMS?: DecimalInput; vICMS?: DecimalInput },\n pRedBC: Decimal | undefined,\n required: boolean,\n ): { out: Out; vBC: Decimal; vICMS: Decimal } | undefined => {\n const pICMS = required ? ctx.req(i.pICMS, `${path}.pICMS`, P) : ctx.opt(i.pICMS, `${path}.pICMS`, P);\n if (pICMS === undefined && i.vBC === undefined && i.vICMS === undefined) return undefined;\n const reduzida =\n pRedBC === undefined ? base.vOp : base.vOp.times(Decimal.HUNDRED.minus(pRedBC)).dividedBy(100, 10, 'HALF_EVEN');\n const vBC = ctx.base(i.vBC, reduzida, `${path}.vBC`, M, 'icms');\n const aliq = pICMS ?? Decimal.ZERO;\n const vICMS = ctx.calc(i.vICMS, vBC.percent(aliq), `${path}.vICMS`, M, 'icms');\n t.vBC = t.vBC.plus(vBC);\n t.vICMS = t.vICMS.plus(vICMS);\n return {\n out: { modBC: i.modBC ?? '3', vBC: S(vBC), pICMS: ctx.s(aliq, P), vICMS: S(vICMS) },\n vBC,\n vICMS,\n };\n };\n\n /**\n * Valor informado cujo grupo depende de outro campo ausente: vira ocorrência no campo que falta, nunca some do XML\n * em silêncio.\n */\n const orfao = (\n valor: DecimalInput | undefined,\n presente: boolean,\n campo: string,\n exige: string,\n base = path,\n ): void => {\n if (valor !== undefined && !presente) {\n ctx.issues.add(`${base}.${exige}`, 'campo_obrigatorio', `${campo} informado exige ${exige}`);\n }\n };\n\n /** FCP próprio (N17a a N17c). `vBCFCP` só vai para o XML nos grupos que o têm. */\n const fcp = (i: IcmsFcp & { pFCP?: DecimalInput; vFCP?: DecimalInput }, vBC: Decimal, withBase: boolean): Out => {\n const pFCP = ctx.opt(i.pFCP, `${path}.pFCP`, PO);\n orfao(i.vBCFCP, i.pFCP !== undefined || i.vFCP !== undefined, 'vBCFCP', 'pFCP');\n if (pFCP === undefined && i.vFCP === undefined) return {};\n const vBCFCP = ctx.base(i.vBCFCP, vBC, `${path}.vBCFCP`, M, 'icms');\n const vFCP = ctx.calc(i.vFCP, vBCFCP.percent(pFCP ?? Decimal.ZERO), `${path}.vFCP`, M, 'icms');\n t.vFCP = t.vFCP.plus(vFCP);\n return { ...(withBase ? { vBCFCP: S(vBCFCP) } : {}), pFCP: ctx.so(pFCP, PO), vFCP: S(vFCP) };\n };\n\n /**\n * ICMS-ST (N18 a N23d). Base por MVA (modBCST 4) quando `vBCST` não vem: (vOp + vIPI) × (1 + pMVAST) × (1 - pRedBCST).\n * `vICMSST = vBCST × pICMSST - ICMS próprio` (MOC N23); `vFCPST = vBCFCPST × pFCPST - vFCP` (RV N23d-10).\n */\n const st = (i: IcmsSt, vICMSProprio: Decimal, vFCPProprio: Decimal): Out => {\n const sp = `${path}.st`;\n const pMVAST = ctx.opt(i.pMVAST, `${sp}.pMVAST`, PO);\n const pRedBCST = ctx.opt(i.pRedBCST, `${sp}.pRedBCST`, PO);\n const pICMSST = ctx.req(i.pICMSST, `${sp}.pICMSST`, P);\n if (i.modBCST === '4' && pMVAST === undefined) {\n // RV N19-10 (rejeição 932): MVA como modalidade exige pMVAST.\n ctx.issues.add(`${sp}.pMVAST`, 'campo_obrigatorio', 'modBCST 4 (MVA) exige pMVAST');\n }\n if (i.modBCST !== '4' && pMVAST !== undefined) {\n // RV N19-20 (rejeição 933): pMVAST só com modalidade MVA.\n ctx.issues.add(`${sp}.pMVAST`, 'combinacao_invalida', 'pMVAST só pode ser informado com modBCST 4 (MVA)');\n }\n let vBCST: Decimal;\n if (i.vBCST === undefined && i.modBCST === '4') {\n const bruta = base.vOp\n .plus(base.vIPI)\n .times(Decimal.HUNDRED.plus(pMVAST ?? Decimal.ZERO))\n .dividedBy(100, 12, 'HALF_EVEN');\n const reduzida =\n pRedBCST === undefined ? bruta : bruta.times(Decimal.HUNDRED.minus(pRedBCST)).dividedBy(100, 12, 'HALF_EVEN');\n vBCST = ctx.round(reduzida, M, 'icms');\n } else {\n vBCST = ctx.req(i.vBCST, `${sp}.vBCST`, M);\n }\n const deducao = ctx.opt(i.vICMSDeducaoST, `${sp}.vICMSDeducaoST`, M) ?? vICMSProprio;\n const vICMSST = ctx.calc(\n i.vICMSST,\n nonNeg(ctx.round(vBCST.percent(pICMSST), M, 'icms').minus(deducao)),\n `${sp}.vICMSST`,\n M,\n 'icms',\n );\n t.vBCST = t.vBCST.plus(vBCST);\n t.vST = t.vST.plus(vICMSST);\n const out: Out = {\n modBCST: i.modBCST,\n pMVAST: ctx.so(pMVAST, PO),\n pRedBCST: ctx.so(pRedBCST, PO),\n vBCST: S(vBCST),\n pICMSST: ctx.s(pICMSST, P),\n vICMSST: S(vICMSST),\n };\n const pFCPST = ctx.opt(i.pFCPST, `${sp}.pFCPST`, PO);\n orfao(i.vBCFCPST, i.pFCPST !== undefined || i.vFCPST !== undefined, 'vBCFCPST', 'pFCPST', sp);\n if (pFCPST !== undefined || i.vFCPST !== undefined) {\n const vBCFCPST = ctx.base(i.vBCFCPST, vBCST, `${sp}.vBCFCPST`, M, 'icms');\n const vFCPST = ctx.calc(\n i.vFCPST,\n nonNeg(ctx.round(vBCFCPST.percent(pFCPST ?? Decimal.ZERO), M, 'icms').minus(vFCPProprio)),\n `${sp}.vFCPST`,\n M,\n 'icms',\n );\n t.vFCPST = t.vFCPST.plus(vFCPST);\n Object.assign(out, { vBCFCPST: S(vBCFCPST), pFCPST: ctx.so(pFCPST, PO), vFCPST: S(vFCPST) });\n }\n return out;\n };\n\n /** Desoneração (N27a, N28, N28b): valor e motivo juntos. */\n const deson = <K extends MotivoDesoneracaoIcms>(d: Desoneracao<K> | undefined): Out => {\n if (d === undefined) return {};\n const v = ctx.req(d.vICMSDeson, `${path}.desoneracao.vICMSDeson`, M);\n t.vICMSDeson = t.vICMSDeson.plus(v);\n if (d.indDeduzDeson === '1') t.vICMSDesonDeduz = t.vICMSDesonDeduz.plus(v);\n return { vICMSDeson: S(v), motDesICMS: d.motDesICMS, indDeduzDeson: d.indDeduzDeson };\n };\n\n const desonSt = (d: DesoneracaoSt | undefined): Out => {\n if (d === undefined) return {};\n const v = ctx.req(d.vICMSSTDeson, `${path}.desoneracaoSt.vICMSSTDeson`, M);\n return { vICMSSTDeson: S(v), motDesICMSST: d.motDesICMSST };\n };\n\n /** Retido anteriormente (N26 a N26b, N27a a N27c, N34 a N37): informativo, só o FCP retido entra no total. */\n const retido = (i: IcmsStRetido): Out => {\n const o = (k: keyof IcmsStRetido, f: FormatoDecimal): string | undefined =>\n ctx.so(ctx.opt(i[k], `${path}.${k}`, f), f);\n const vFCPSTRet = ctx.opt(i.vFCPSTRet, `${path}.vFCPSTRet`, M);\n if (vFCPSTRet !== undefined) t.vFCPSTRet = t.vFCPSTRet.plus(vFCPSTRet);\n return {\n vBCSTRet: o('vBCSTRet', M),\n pST: o('pST', PO),\n vICMSSubstituto: o('vICMSSubstituto', M),\n vICMSSTRet: o('vICMSSTRet', M),\n vBCFCPSTRet: o('vBCFCPSTRet', M),\n pFCPSTRet: o('pFCPSTRet', PO),\n vFCPSTRet: ctx.so(vFCPSTRet, M),\n pRedBCEfet: o('pRedBCEfet', PO),\n vBCEfet: o('vBCEfet', M),\n pICMSEfet: o('pICMSEfet', PO),\n vICMSEfet: o('vICMSEfet', M),\n };\n };\n\n /** Diferimento (CST 51 e 90): vICMSOp = vBC × pICMS; vICMSDif = vICMSOp × pDif; vICMS = vICMSOp - vICMSDif (RV N16a, N16c). */\n const diferimento = (\n i: {\n modBC?: string;\n vBC?: DecimalInput;\n pRedBC?: DecimalInput;\n cBenefRBC?: string;\n pICMS?: DecimalInput;\n vICMSOp?: DecimalInput;\n pDif?: DecimalInput;\n vICMSDif?: DecimalInput;\n vICMS?: DecimalInput;\n pFCP?: DecimalInput;\n vBCFCP?: DecimalInput;\n vFCP?: DecimalInput;\n pFCPDif?: DecimalInput;\n vFCPDif?: DecimalInput;\n vFCPEfet?: DecimalInput;\n },\n redFormat: FormatoDecimal,\n triade: boolean,\n ): Out => {\n const pRedBC = ctx.opt(i.pRedBC, `${path}.pRedBC`, redFormat);\n const pICMS = ctx.opt(i.pICMS, `${path}.pICMS`, P);\n const out: Out = {};\n let vBC: Decimal | undefined;\n if (pICMS !== undefined || i.vBC !== undefined) {\n const reduzida =\n pRedBC === undefined ? base.vOp : base.vOp.times(Decimal.HUNDRED.minus(pRedBC)).dividedBy(100, 10, 'HALF_EVEN');\n vBC = ctx.base(i.vBC, reduzida, `${path}.vBC`, M, 'icms');\n out.modBC = i.modBC ?? '3';\n out.vBC = S(vBC);\n }\n out.pRedBC = ctx.so(pRedBC, redFormat);\n out.cBenefRBC = i.cBenefRBC;\n if (pICMS !== undefined && vBC !== undefined) {\n out.pICMS = ctx.s(pICMS, P);\n const vICMSOp = ctx.calc(i.vICMSOp, vBC.percent(pICMS), `${path}.vICMSOp`, M, 'icms');\n const pDif = ctx.opt(i.pDif, `${path}.pDif`, P);\n const vICMSDif = ctx.calc(i.vICMSDif, vICMSOp.percent(pDif ?? Decimal.ZERO), `${path}.vICMSDif`, M, 'icms');\n const vICMS = ctx.calc(i.vICMS, vICMSOp.minus(vICMSDif), `${path}.vICMS`, M, 'icms');\n const temDif = pDif !== undefined || i.vICMSDif !== undefined || i.vICMSOp !== undefined;\n if (triade) {\n // No CST 90, vICMSOp, pDif e vICMSDif são uma sequência opcional do XSD: vão os três ou nenhum.\n if (temDif)\n Object.assign(out, { vICMSOp: S(vICMSOp), pDif: ctx.s(pDif ?? Decimal.ZERO, P), vICMSDif: S(vICMSDif) });\n } else {\n Object.assign(out, {\n vICMSOp: S(vICMSOp),\n pDif: ctx.so(pDif, P),\n vICMSDif: pDif === undefined && i.vICMSDif === undefined ? undefined : S(vICMSDif),\n });\n }\n Object.assign(out, {\n vICMS: S(vICMS),\n });\n t.vBC = t.vBC.plus(vBC);\n t.vICMS = t.vICMS.plus(vICMS);\n } else {\n const informados = [i.vBC, i.vICMS, i.vICMSOp, i.pDif, i.vICMSDif, i.pRedBC].some((x) => x !== undefined);\n if (triade && informados) {\n // No CST 90 o ICMS próprio é uma sequência do XSD (modBC, vBC, pICMS, vICMS e a tríade do diferimento): sem\n // pICMS nada dela pode ir, e o que veio não pode sumir em silêncio.\n ctx.issues.add(\n `${path}.pICMS`,\n 'campo_obrigatorio',\n 'o ICMS próprio do CST 90 (vBC, vICMS, diferimento) exige pICMS',\n );\n }\n if (!triade) {\n // CST 51 sem alíquota: cada campo do XSD é opcional e vai como veio (há diferimento informado só com pDif).\n Object.assign(out, {\n modBC: out.modBC ?? i.modBC,\n vICMSOp: ctx.so(ctx.opt(i.vICMSOp, `${path}.vICMSOp`, M), M),\n pDif: ctx.so(ctx.opt(i.pDif, `${path}.pDif`, P), P),\n vICMSDif: ctx.so(ctx.opt(i.vICMSDif, `${path}.vICMSDif`, M), M),\n });\n }\n const vICMS = ctx.opt(i.vICMS, `${path}.vICMS`, M);\n if (vICMS !== undefined) {\n out.vICMS = S(vICMS);\n t.vICMS = t.vICMS.plus(vICMS);\n }\n if (vBC !== undefined) t.vBC = t.vBC.plus(vBC);\n }\n const pFCP = ctx.opt(i.pFCP, `${path}.pFCP`, PO);\n const temFcp = i.pFCP !== undefined || i.vFCP !== undefined;\n for (const k of ['vBCFCP', 'pFCPDif', 'vFCPDif', 'vFCPEfet'] as const) orfao(i[k], temFcp, k, 'pFCP');\n orfao(i.vFCPEfet, !temFcp || i.pFCPDif !== undefined || i.vFCPDif !== undefined, 'vFCPEfet', 'pFCPDif');\n if (pFCP !== undefined || i.vFCP !== undefined) {\n const vBCFCP = ctx.base(i.vBCFCP, vBC ?? Decimal.ZERO, `${path}.vBCFCP`, M, 'icms');\n const vFCP = ctx.calc(i.vFCP, vBCFCP.percent(pFCP ?? Decimal.ZERO), `${path}.vFCP`, M, 'icms');\n const pFCPDif = ctx.opt(i.pFCPDif, `${path}.pFCPDif`, PO);\n const vFCPDif = ctx.calc(i.vFCPDif, vFCP.percent(pFCPDif ?? Decimal.ZERO), `${path}.vFCPDif`, M, 'icms');\n const vFCPEfet = ctx.calc(i.vFCPEfet, vFCP.minus(vFCPDif), `${path}.vFCPEfet`, M, 'icms');\n // W04b-10 (rejeição 861): o total soma o vFCP declarado no item (N17c), não o efetivo depois do diferimento.\n t.vFCP = t.vFCP.plus(vFCP);\n const temDif = pFCPDif !== undefined || i.vFCPDif !== undefined;\n Object.assign(out, {\n vBCFCP: S(vBCFCP),\n pFCP: ctx.so(pFCP, PO),\n vFCP: S(vFCP),\n pFCPDif: ctx.so(pFCPDif, PO),\n vFCPDif: temDif ? S(vFCPDif) : undefined,\n vFCPEfet: temDif ? S(vFCPEfet) : undefined,\n });\n }\n return out;\n };\n\n const q = (v: DecimalInput | undefined, k: string): Decimal | undefined => ctx.opt(v, `${path}.${k}`, D1104V);\n /**\n * Valor monofásico (NT 2023.001): padrão quantidade × ad rem em 2 casas. O informado prevalece sem conferência: há\n * notas autorizadas cujo valor não é o produto exato (corpus local, `test/golden/golden.ts`).\n */\n const mono = (\n qtd: Decimal | undefined,\n adRem: Decimal | undefined,\n given: DecimalInput | undefined,\n k: string,\n ): Decimal => ctx.base(given, (qtd ?? Decimal.ZERO).times(adRem ?? Decimal.ZERO), `${path}.${k}`, M, 'icms');\n\n let grupo: Record<string, Out>;\n if ('CSOSN' in input) {\n const orig = input.orig;\n switch (input.CSOSN) {\n case '101': {\n const pCredSN = ctx.req(input.pCredSN, `${path}.pCredSN`, P);\n const v = ctx.calc(input.vCredICMSSN, base.vOp.percent(pCredSN), `${path}.vCredICMSSN`, M, 'icms');\n grupo = { ICMSSN101: { orig, CSOSN: '101', pCredSN: ctx.s(pCredSN, P), vCredICMSSN: S(v) } };\n break;\n }\n case '102':\n case '103':\n case '300':\n case '400':\n grupo = { ICMSSN102: { orig, CSOSN: input.CSOSN } };\n break;\n case '201': {\n const stOut = st(input.st, Decimal.ZERO, Decimal.ZERO);\n const pCredSN = ctx.req(input.pCredSN, `${path}.pCredSN`, P);\n const v = ctx.calc(input.vCredICMSSN, base.vOp.percent(pCredSN), `${path}.vCredICMSSN`, M, 'icms');\n grupo = { ICMSSN201: { orig, CSOSN: '201', ...stOut, pCredSN: ctx.s(pCredSN, P), vCredICMSSN: S(v) } };\n break;\n }\n case '202':\n case '203':\n grupo = { ICMSSN202: { orig, CSOSN: input.CSOSN, ...st(input.st, Decimal.ZERO, Decimal.ZERO) } };\n break;\n case '500':\n grupo = { ICMSSN500: { orig, CSOSN: '500', ...retido(input) } };\n break;\n case '900': {\n const pRedBC = ctx.opt(input.pRedBC, `${path}.pRedBC`, PO);\n const p = proprio(input, pRedBC, false);\n const out: Out = { orig, CSOSN: '900' };\n if (p)\n Object.assign(out, {\n modBC: p.out.modBC,\n vBC: p.out.vBC,\n pRedBC: ctx.so(pRedBC, PO),\n pICMS: p.out.pICMS,\n vICMS: p.out.vICMS,\n });\n // Com ICMS próprio destacado, o ST abate o próprio, como nos grupos do regime normal (MOC N23).\n if (input.st) Object.assign(out, st(input.st, p?.vICMS ?? Decimal.ZERO, Decimal.ZERO));\n const pCredSN = ctx.opt(input.pCredSN, `${path}.pCredSN`, P);\n orfao(input.vCredICMSSN, input.pCredSN !== undefined, 'vCredICMSSN', 'pCredSN');\n if (pCredSN !== undefined) {\n const v = ctx.calc(input.vCredICMSSN, base.vOp.percent(pCredSN), `${path}.vCredICMSSN`, M, 'icms');\n Object.assign(out, { pCredSN: ctx.s(pCredSN, P), vCredICMSSN: S(v) });\n }\n grupo = { ICMSSN900: out };\n break;\n }\n }\n } else if (input.grupo === 'Part') {\n const pRedBC = ctx.opt(input.pRedBC, `${path}.pRedBC`, PO);\n const p = proprio(input, pRedBC, true) as { out: Out; vICMS: Decimal };\n const pBCOp = ctx.req(input.pBCOp, `${path}.pBCOp`, PO);\n grupo = {\n ICMSPart: {\n orig: input.orig,\n CST: input.CST,\n modBC: input.modBC,\n vBC: p.out.vBC,\n pRedBC: ctx.so(pRedBC, PO),\n pICMS: p.out.pICMS,\n vICMS: p.out.vICMS,\n ...st(input.st, p.vICMS, Decimal.ZERO),\n pBCOp: ctx.s(pBCOp, PO),\n UFST: input.UFST,\n ...deson(input.desoneracao),\n },\n };\n } else if (input.grupo === 'ST') {\n grupo = {\n ICMSST: {\n orig: input.orig,\n CST: input.CST,\n ...retido(input),\n vBCSTRet: S(ctx.req(input.vBCSTRet, `${path}.vBCSTRet`, M)),\n vICMSSTRet: S(ctx.req(input.vICMSSTRet, `${path}.vICMSSTRet`, M)),\n vBCSTDest: S(ctx.req(input.vBCSTDest, `${path}.vBCSTDest`, M)),\n vICMSSTDest: S(ctx.req(input.vICMSSTDest, `${path}.vICMSSTDest`, M)),\n },\n };\n } else {\n const orig = input.orig;\n switch (input.CST) {\n case '00': {\n const p = proprio(input, undefined, true) as { out: Out; vBC: Decimal };\n grupo = { ICMS00: { orig, CST: '00', ...p.out, ...fcp(input, p.vBC, false) } };\n break;\n }\n case '02': {\n const qBCMono = q(input.qBCMono, 'qBCMono');\n const adRem = ctx.req(input.adRemICMS, `${path}.adRemICMS`, P);\n const v = mono(qBCMono, adRem, input.vICMSMono, 'vICMSMono');\n t.mono = true;\n t.qBCMono = t.qBCMono.plus(qBCMono ?? Decimal.ZERO);\n t.vICMSMono = t.vICMSMono.plus(v);\n grupo = {\n ICMS02: {\n orig,\n CST: '02',\n qBCMono: ctx.so(qBCMono, D1104V),\n adRemICMS: ctx.s(adRem, P),\n vICMSMono: S(v),\n },\n };\n break;\n }\n case '10': {\n const p = proprio(input, undefined, true) as { out: Out; vBC: Decimal; vICMS: Decimal };\n const f = fcp(input, p.vBC, true);\n const vFCP = f.vFCP === undefined ? Decimal.ZERO : Decimal.of(f.vFCP);\n grupo = {\n ICMS10: { orig, CST: '10', ...p.out, ...f, ...st(input.st, p.vICMS, vFCP), ...desonSt(input.desoneracaoSt) },\n };\n break;\n }\n case '15': {\n const qBCMono = q(input.qBCMono, 'qBCMono');\n const adRem = ctx.req(input.adRemICMS, `${path}.adRemICMS`, P);\n const v = mono(qBCMono, adRem, input.vICMSMono, 'vICMSMono');\n const qReten = q(input.qBCMonoReten, 'qBCMonoReten');\n const adRemReten = ctx.req(input.adRemICMSReten, `${path}.adRemICMSReten`, P);\n if (input.pRedAdRem !== undefined) {\n // Com redução da ad rem (pRedAdRem, motRedAdRem) a conta de cada valor não está nas fontes que este pacote\n // cita (NT 2023.001 não versionada aqui): os valores vêm informados em vez de derivados sem a redução.\n if (input.vICMSMono === undefined)\n ctx.issues.add(`${path}.vICMSMono`, 'campo_obrigatorio', 'com pRedAdRem, informe vICMSMono');\n if (input.vICMSMonoReten === undefined) {\n ctx.issues.add(`${path}.vICMSMonoReten`, 'campo_obrigatorio', 'com pRedAdRem, informe vICMSMonoReten');\n }\n }\n const vReten = mono(qReten, adRemReten, input.vICMSMonoReten, 'vICMSMonoReten');\n t.mono = true;\n t.qBCMono = t.qBCMono.plus(qBCMono ?? Decimal.ZERO);\n t.vICMSMono = t.vICMSMono.plus(v);\n t.qBCMonoReten = t.qBCMonoReten.plus(qReten ?? Decimal.ZERO);\n t.vICMSMonoReten = t.vICMSMonoReten.plus(vReten);\n grupo = {\n ICMS15: {\n orig,\n CST: '15',\n qBCMono: ctx.so(qBCMono, D1104V),\n adRemICMS: ctx.s(adRem, P),\n vICMSMono: S(v),\n qBCMonoReten: ctx.so(qReten, D1104V),\n adRemICMSReten: ctx.s(adRemReten, P),\n vICMSMonoReten: S(vReten),\n pRedAdRem: ctx.so(ctx.opt(input.pRedAdRem, `${path}.pRedAdRem`, D0302A04), D0302A04),\n motRedAdRem: input.motRedAdRem,\n },\n };\n break;\n }\n case '20': {\n const pRedBC = ctx.req(input.pRedBC, `${path}.pRedBC`, P);\n const p = proprio(input, pRedBC, true) as { out: Out; vBC: Decimal };\n grupo = {\n ICMS20: {\n orig,\n CST: '20',\n modBC: p.out.modBC,\n pRedBC: ctx.s(pRedBC, P),\n vBC: p.out.vBC,\n pICMS: p.out.pICMS,\n vICMS: p.out.vICMS,\n ...fcp(input, p.vBC, true),\n ...deson(input.desoneracao),\n },\n };\n break;\n }\n case '30':\n grupo = {\n ICMS30: { orig, CST: '30', ...st(input.st, Decimal.ZERO, Decimal.ZERO), ...deson(input.desoneracao) },\n };\n break;\n case '40':\n case '41':\n case '50':\n grupo = { ICMS40: { orig, CST: input.CST, ...deson(input.desoneracao) } };\n break;\n case '51':\n grupo = { ICMS51: { orig, CST: '51', ...diferimento(input, P, false) } };\n break;\n case '53': {\n const qBCMono = q(input.qBCMono, 'qBCMono');\n const adRem = ctx.opt(input.adRemICMS, `${path}.adRemICMS`, P);\n const vOp = mono(qBCMono, adRem, input.vICMSMonoOp, 'vICMSMonoOp');\n const pDif = ctx.opt(input.pDif, `${path}.pDif`, P);\n const vDif = ctx.calc(input.vICMSMonoDif, vOp.percent(pDif ?? Decimal.ZERO), `${path}.vICMSMonoDif`, M, 'icms');\n const v = ctx.calc(input.vICMSMono, vOp.minus(vDif), `${path}.vICMSMono`, M, 'icms');\n const qDif = q(input.qBCMonoDif, 'qBCMonoDif');\n const adRemDif = ctx.opt(input.adRemICMSDif, `${path}.adRemICMSDif`, P);\n t.mono = true;\n t.qBCMono = t.qBCMono.plus(qBCMono ?? Decimal.ZERO);\n t.vICMSMono = t.vICMSMono.plus(v);\n grupo = {\n ICMS53: {\n orig,\n CST: '53',\n qBCMono: ctx.so(qBCMono, D1104V),\n adRemICMS: ctx.so(adRem, P),\n vICMSMonoOp: adRem === undefined && input.vICMSMonoOp === undefined ? undefined : S(vOp),\n pDif: ctx.so(pDif, P),\n vICMSMonoDif: pDif === undefined && input.vICMSMonoDif === undefined ? undefined : S(vDif),\n vICMSMono: adRem === undefined && input.vICMSMono === undefined ? undefined : S(v),\n qBCMonoDif: ctx.so(qDif, D1104V),\n adRemICMSDif: ctx.so(adRemDif, P),\n },\n };\n break;\n }\n case '60':\n grupo = { ICMS60: { orig, CST: '60', ...retido(input) } };\n break;\n case '61': {\n const qRet = q(input.qBCMonoRet, 'qBCMonoRet');\n const adRem = ctx.req(input.adRemICMSRet, `${path}.adRemICMSRet`, P);\n const v = mono(qRet, adRem, input.vICMSMonoRet, 'vICMSMonoRet');\n t.mono = true;\n t.qBCMonoRet = t.qBCMonoRet.plus(qRet ?? Decimal.ZERO);\n t.vICMSMonoRet = t.vICMSMonoRet.plus(v);\n grupo = {\n ICMS61: {\n orig,\n CST: '61',\n qBCMonoRet: ctx.so(qRet, D1104V),\n adRemICMSRet: ctx.s(adRem, P),\n vICMSMonoRet: S(v),\n },\n };\n break;\n }\n case '70': {\n const pRedBC = ctx.req(input.pRedBC, `${path}.pRedBC`, P);\n const p = proprio(input, pRedBC, true) as { out: Out; vBC: Decimal; vICMS: Decimal };\n const f = fcp(input, p.vBC, true);\n const vFCP = f.vFCP === undefined ? Decimal.ZERO : Decimal.of(f.vFCP);\n grupo = {\n ICMS70: {\n orig,\n CST: '70',\n modBC: p.out.modBC,\n pRedBC: ctx.s(pRedBC, P),\n vBC: p.out.vBC,\n pICMS: p.out.pICMS,\n vICMS: p.out.vICMS,\n ...f,\n ...st(input.st, p.vICMS, vFCP),\n ...deson(input.desoneracao),\n ...desonSt(input.desoneracaoSt),\n },\n };\n break;\n }\n case '90': {\n const d = diferimento(input, PO, true);\n const vICMS = d.vICMS === undefined ? Decimal.ZERO : Decimal.of(d.vICMS);\n // RV N23d-10: vFCPST = vBCFCPST × pFCPST - vFCP (o vFCP declarado, N17c).\n const vFCP = d.vFCP;\n grupo = {\n ICMS90: {\n orig,\n CST: '90',\n ...d,\n ...(input.st ? st(input.st, vICMS, vFCP === undefined ? Decimal.ZERO : Decimal.of(vFCP)) : {}),\n ...deson(input.desoneracao),\n ...desonSt(input.desoneracaoSt),\n },\n };\n break;\n }\n }\n }\n const [name, body] = Object.entries(grupo)[0] as [string, Out];\n return { grupo: { [name]: clean(body) } as unknown as TNFe_infNFe_det_imposto_ICMS, totais: t };\n}\n",
16
16
  "/**\n * NFC-e (modelo 65): as regras de montagem que valem só para ela e o `infNFeSupl` (QR Code e URL de consulta por\n * chave). As regras vêm do MOC 7.0 Anexo I (regras de validação com modelo 65 e aplicação obrigatória), da NT 2023.002\n * (emitente pessoa física, v1.01), da NT 2025.001 v1.03 (QR Code versão 3 e pagamentos) e da NT 2025.002 v1.51 (reforma\n * tributária); o leiaute do QR Code, do Manual de Padrões Técnicos do DANFE NFC-e e QR Code, versão 6.0 (março de\n * 2025), itens 4.3 e 4.4. Regra opcional por UF (aplicação \"Facult.\" sem mudança posterior) não entra aqui: a SEFAZ da\n * UF decide, e recusar localmente bloquearia a venda onde a regra não vale.\n */\n\nimport type { Ambiente, Assinador, Uf } from '@sinete/core';\nimport { tpAmbDoAmbiente } from '@sinete/core';\nimport { c14n, codificarBase64, lerXml, PREFIXO_DIGEST_INFO_SHA1, primeiroFilho } from '@sinete/core/xml';\nimport { lerCnpj } from '@sinete/validators';\nimport urls from '../data/nfce-urls.json' with { type: 'json' };\nimport { Decimal } from '../decimal.ts';\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\n\n/**\n * Versão do QR Code da NFC-e. A 3 (padrão) dispensa o CSC: na emissão normal leva só chave, versão e ambiente, e na\n * contingência off-line leva a assinatura dos parâmetros com o certificado da nota (NT 2025.001, item 02.1). A 2 usa\n * o CSC e o identificador dele (`idCSC`), fornecidos pela SEFAZ da UF; o emitente pessoa física não pode usá-la\n * (ZX02-222, rejeição 444).\n */\nexport type QrCodeNfceOpcoes =\n | { readonly versao: '3' }\n | {\n readonly versao: '2';\n /** Identificador do CSC na SEFAZ (até 6 dígitos); os zeros à esquerda saem do QR Code (Manual 6.0, 4.3.1). */\n readonly idCSC: string;\n /** O CSC (16 a 36 caracteres, Manual 6.0, 4.6). Nunca vai para o XML: só entra no hash. */\n readonly CSC: string;\n };\n\n/** O que a montagem deixa pronto para o `infNFeSupl` da NFC-e. */\nexport interface NfceSupl {\n readonly versao: '2' | '3';\n /** URL de consulta por chave de acesso (`urlChave`), impressa no DANFC-e. */\n readonly urlChave: string;\n /** Endereço do QR Code até o `?p=`, inclusive. */\n readonly base: string;\n /** Parâmetros já separados por `|`: completos, ou de 1 a 7 quando falta a assinatura (versão 3 off-line). */\n readonly parametros: string;\n /** Versão 3 em contingência off-line: os parâmetros são assinados com o certificado da nota (Manual 6.0, 4.4.2). */\n readonly assinar: boolean;\n}\n\ntype Entrada = { readonly url: string | null; readonly desde?: string; readonly nota?: string };\ntype TabelaUrls = Readonly<Record<Ambiente, Readonly<Record<string, readonly Entrada[]>>>>;\n\n/** O endereço vigente no dia (`AAAA-MM-DD`, horário de Brasília): o de início mais recente que não passou do dia. */\nfunction vigente(lista: readonly Entrada[] | undefined, dia: string): Entrada | undefined {\n let achado: Entrada | undefined;\n for (const e of lista ?? []) {\n if ((e.desde ?? '') <= dia && (achado === undefined || (e.desde ?? '') >= (achado.desde ?? ''))) achado = e;\n }\n return achado;\n}\n\n/**\n * Endereços da NFC-e da UF no ambiente e no dia (`data/nfce-urls.json`, das tabelas do Portal Nacional da NFC-e). O\n * `qrCode` é `undefined` onde a tabela não traz o endereço completo (AM e MA publicam sem o protocolo): informe\n * `MontarNfeOpcoes.urlQrCode`.\n */\nexport function urlsNfce(\n uf: Uf,\n ambiente: Ambiente,\n dia: string,\n): { readonly qrCode: string | undefined; readonly urlChave: string | undefined } {\n const q = vigente((urls.qrCode as TabelaUrls)[ambiente][uf], dia);\n const c = vigente((urls.urlChave as TabelaUrls)[ambiente][uf], dia);\n return { qrCode: q?.url ?? undefined, urlChave: c?.url ?? undefined };\n}\n\nconst te = new TextEncoder();\nconst NFE_NS = 'http://www.portalfiscal.inf.br/nfe';\n\nasync function sha1(bytes: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(await globalThis.crypto.subtle.digest('SHA-1', bytes as Uint8Array<ArrayBuffer>));\n}\n\nconst hex = (b: Uint8Array): string => Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');\n\n/**\n * `digVal` do QR Code versão 2 off-line: o DigestValue do `infNFe` (SHA-1 do C14N, em Base64, o mesmo da assinatura)\n * convertido para hexadecimal caractere a caractere (Manual 6.0, 4.3.2 e o exemplo de 4.3.6.2: `yzGY...` vira\n * `797a4759...`).\n */\nasync function digValHex(xml: string): Promise<string> {\n const doc = lerXml(xml);\n const inf = primeiroFilho(doc.raiz, 'infNFe', NFE_NS);\n if (inf === undefined) throw new Error('NF-e montada sem infNFe');\n return hexDoDigestValue(codificarBase64(await sha1(te.encode(c14n(inf)))));\n}\n\n/** O DigestValue em Base64 convertido para hexadecimal, caractere a caractere (Manual 6.0, 4.3.5, passo 1). */\nexport function hexDoDigestValue(digestValue: string): string {\n return hex(te.encode(digestValue));\n}\n\n/** Hash do QR Code versão 2: SHA-1 dos parâmetros concatenados ao CSC, em hexadecimal (Manual 6.0, 4.3.4 e 4.3.5). */\nexport async function hashQrCodeV2(parametros: string, csc: string): Promise<string> {\n return hex(await sha1(te.encode(parametros + csc))).toUpperCase();\n}\n\nexport interface DadosQrCode {\n readonly chave: string;\n readonly ambiente: Ambiente;\n readonly tpEmis: string;\n /** `dhEmi` do documento. */\n readonly dhEmi: string;\n /** `vNF` como vai no XML (ponto decimal, sem milhar). */\n readonly vNF: string;\n readonly dest?: { readonly CNPJ?: string; readonly CPF?: string; readonly idEstrangeiro?: string };\n /** O XML montado (`<NFe>` sem assinatura): o `digVal` da versão 2 off-line sai dele. */\n readonly xml: string;\n}\n\n/**\n * Parâmetros do QR Code (Manual 6.0): versão 2 on-line `chave|2|tpAmb|idCSC|hash` e off-line\n * `chave|2|tpAmb|dia|vNF|digVal|idCSC|hash`, com o hash SHA-1 em hexadecimal dos parâmetros concatenados ao CSC\n * (4.3.4 e 4.3.5); versão 3 on-line `chave|3|tpAmb` e off-line `chave|3|tpAmb|dia|vNF|tpIdDest|idDest`, que o\n * certificado assina (4.4.1 e 4.4.2). Destinatário não identificado deixa os campos 6 e 7 vazios; o estrangeiro, só o\n * 7. Na contingência off-line (tpEmis 9) entram o dia da emissão e o valor da nota, que o consumidor confere sem a\n * nota ter chegado à SEFAZ.\n */\nexport async function parametrosQrCode(\n d: DadosQrCode,\n qr: QrCodeNfceOpcoes,\n): Promise<{ readonly parametros: string; readonly assinar: boolean }> {\n const tpAmb = tpAmbDoAmbiente(d.ambiente);\n const offline = d.tpEmis === '9';\n const dia = d.dhEmi.slice(8, 10);\n if (qr.versao === '3') {\n if (!offline) return { parametros: `${d.chave}|3|${tpAmb}`, assinar: false };\n const dest = d.dest;\n const [tp, id] =\n dest?.CNPJ !== undefined\n ? ['1', dest.CNPJ]\n : dest?.CPF !== undefined\n ? ['2', dest.CPF]\n : dest?.idEstrangeiro !== undefined\n ? ['3', '']\n : ['', ''];\n return { parametros: `${d.chave}|3|${tpAmb}|${dia}|${d.vNF}|${tp}|${id}`, assinar: true };\n }\n const idCSC = String(Number(qr.idCSC));\n const antes = offline\n ? `${d.chave}|2|${tpAmb}|${dia}|${d.vNF}|${await digValHex(d.xml)}|${idCSC}`\n : `${d.chave}|2|${tpAmb}|${idCSC}`;\n return { parametros: `${antes}|${await hashQrCodeV2(antes, qr.CSC)}`, assinar: false };\n}\n\n/**\n * Assinatura dos parâmetros 1 a 7 do QR Code versão 3 off-line: RSA com SHA-1 (PKCS#1 v1.5), em Base64, com o mesmo\n * certificado que assina a NFC-e (Manual 6.0, 4.4.2, parâmetro 8).\n */\nexport async function assinarParametros(parametros: string, signer: Assinador): Promise<string> {\n const bytes = te.encode(parametros);\n if (signer.tipo === 'dados') return codificarBase64(await signer.assinar(bytes, 'SHA-1'));\n const h = await sha1(bytes);\n const di = new Uint8Array(PREFIXO_DIGEST_INFO_SHA1.length + h.length);\n di.set(PREFIXO_DIGEST_INFO_SHA1);\n di.set(h, PREFIXO_DIGEST_INFO_SHA1.length);\n return codificarBase64(await signer.assinarDigestInfo(di));\n}\n\n/** CFOP da prestação de serviço tributada pelo ISSQN na NFC-e (MOC 7.0 Anexo I, RV I08-150 a I08-170). */\nconst CFOP_ISSQN = '5933';\n\n/** Valor da NFC-e acima do qual o destinatário tem de ser identificado (MOC 7.0 Anexo I, RV W16-40, rejeição 750). */\nexport const NFCE_LIMITE_SEM_DESTINATARIO = '10000.00';\n\n/** Meios de pagamento que a NFC-e não aceita: 14 duplicata mercantil (YA02-10), 90 sem pagamento (YA02-40), 99 outros (YA02-50). */\nconst TPAG_VEDADOS: Readonly<Record<string, string>> = {\n '14': 'duplicata mercantil não é meio de pagamento da NFC-e (YA02-10, rejeição 857)',\n '90': 'a NFC-e sempre tem pagamento: tPag 90 (sem pagamento) é recusado (YA02-40, rejeição 899)',\n '99': 'tPag 99 (outros) não é aceito na NFC-e (YA02-50, rejeição 436, NT 2020.006)',\n};\n\n/** Identificação já resolvida pelo montador (com os padrões aplicados). */\nexport interface IdeNfce {\n readonly tpNF: string;\n readonly idDest: string;\n readonly tpImp: string;\n readonly finNFe: string;\n readonly indFinal: string;\n readonly indPres: string;\n}\n\n/**\n * Regras da NFC-e sobre a entrada (origem `entrada`, ADR 0011), todas de aplicação obrigatória. Grupos que a NFC-e\n * não tem saem como `grupo_vedado` no caminho da entrada.\n */\nexport function conferirNfce(input: DadosNfe, ide: IdeNfce, issues: Issues): void {\n const vedado = (path: string, msg: string): void => issues.add(path, 'grupo_vedado', `NFC-e ${msg}`);\n const invalido = (path: string, msg: string): void => issues.add(path, 'campo_invalido', `NFC-e ${msg}`);\n\n // B. Identificação\n if (input.dhSaiEnt !== undefined) vedado('dhSaiEnt', 'sem data de entrada ou saída (B10-10, rejeição 705)');\n if (input.dPrevEntrega !== undefined) {\n vedado('dPrevEntrega', 'sem data de previsão de entrega (NT 2025.002, B10a-10, rejeição 1153)');\n }\n if (ide.tpNF !== '1') invalido('tpNF', 'só de saída, tpNF 1 (B11-10, rejeição 706)');\n if (ide.idDest !== '1') {\n invalido('idDest', 'só em operação interna, idDest 1 (B11a-10, rejeição 707)');\n }\n if (ide.tpImp !== '4' && ide.tpImp !== '5') {\n invalido('tpImp', 'com DANFC-e: tpImp 4 (impresso) ou 5 (mensagem eletrônica) (B21-10, rejeição 709)');\n }\n if (ide.finNFe !== '1') invalido('finNFe', 'só com finalidade normal, finNFe 1 (B25-20, rejeição 715)');\n if (ide.indFinal !== '1') invalido('indFinal', 'só com consumidor final, indFinal 1 (B25a-10, rejeição 716)');\n if (!['1', '4', '5'].includes(ide.indPres)) {\n invalido('indPres', 'só presencial: indPres 1, 4 (entrega a domicílio) ou 5 (NT 2025.002, B25b-20, rejeição 717)');\n }\n if (input.cMunFGIBS !== undefined && ide.indPres !== '5') {\n invalido(\n 'cMunFGIBS',\n 'com cMunFGIBS só em operação presencial fora do estabelecimento, indPres 5 (NT 2025.002, B25b-60, rejeição 1000)',\n );\n }\n if (input.cMunFGIBS === undefined && ide.indPres === '5') {\n issues.add(\n 'cMunFGIBS',\n 'campo_obrigatorio',\n 'NFC-e presencial fora do estabelecimento (indPres 5) informa cMunFGIBS (NT 2025.002, B25b-70, rejeição 1005)',\n );\n }\n if (input.referenciadas !== undefined && input.referenciadas.length > 0) {\n vedado('referenciadas', 'não referencia documento fiscal (BA01-10, rejeição 708)');\n }\n if (input.gCompraGov !== undefined)\n vedado('gCompraGov', 'sem compra governamental (NT 2025.002, BB01-10, rejeição 1006)');\n\n // C. Emitente\n if (input.emitente.IEST !== undefined)\n vedado('emitente.IEST', 'sem IE de substituto tributário (C18-10, rejeição 718)');\n\n // E. Destinatário: opcional, obrigatório na entrega a domicílio\n const d = input.destinatario;\n if (ide.indPres === '4' && d === undefined) {\n issues.add(\n 'destinatario',\n 'campo_obrigatorio',\n 'NFC-e com entrega a domicílio identifica o destinatário (E01-20, rejeição 787)',\n );\n }\n if (ide.indPres === '4' && d !== undefined && d.endereco === undefined) {\n issues.add(\n 'destinatario.endereco',\n 'campo_obrigatorio',\n 'NFC-e com entrega a domicílio informa o endereço do destinatário (E05-20, rejeição 788)',\n );\n }\n if (d !== undefined) {\n if (d.CNPJ !== undefined && input.emitente.CNPJ !== undefined && digitos(d.CNPJ) === digitos(input.emitente.CNPJ)) {\n invalido('destinatario.CNPJ', 'com destinatário igual ao emitente (E02-20, rejeição 220)');\n }\n if (d.indIEDest !== '9') {\n invalido('destinatario.indIEDest', 'só para não contribuinte, indIEDest 9 (E16a-10, rejeição 789)');\n }\n if (d.ISUF !== undefined) vedado('destinatario.ISUF', 'sem inscrição na Suframa (E18-10, rejeição 730)');\n }\n\n // I a UA. Itens\n input.itens.forEach((it, n) => {\n const p = `itens[${n}]`;\n const esp = (it.produto.especifico ?? {}) as Record<string, unknown>;\n if (esp.veicProd !== undefined)\n vedado(`${p}.produto.especifico.veicProd`, 'sem veículo novo (J01-10, rejeição 736)');\n if (esp.arma !== undefined) vedado(`${p}.produto.especifico.arma`, 'sem armamento (L01-10, rejeição 738)');\n if (esp.nRECOPI !== undefined)\n vedado(`${p}.produto.especifico.nRECOPI`, 'sem papel imune RECOPI (LB01-10, rejeição 348)');\n if (it.produto.tpCredPresIBSZFM !== undefined) {\n vedado(\n `${p}.produto.tpCredPresIBSZFM`,\n 'sem classificação para subapuração do IBS na ZFM (NT 2025.002, I05k-10, rejeição 1165)',\n );\n }\n const cfop = it.produto.CFOP.replace(/\\D/g, '');\n const imp = it.impostos;\n if (cfop === CFOP_ISSQN && imp.issqn === undefined) {\n issues.add(\n `${p}.impostos.issqn`,\n 'combinacao_invalida',\n 'NFC-e com CFOP 5.933 tem o grupo do ISSQN (I08-160, rejeição 374)',\n );\n }\n if (cfop !== CFOP_ISSQN && imp.issqn !== undefined) {\n issues.add(\n `${p}.produto.CFOP`,\n 'combinacao_invalida',\n 'NFC-e com ISSQN usa o CFOP 5.933 (I08-170, rejeição 374)',\n );\n }\n const icms = imp.icms as { grupo?: string; CST?: string; st?: unknown } | undefined;\n if (icms?.grupo === 'Part') vedado(`${p}.impostos.icms`, 'sem partilha do ICMS entre UF (N12-50, rejeição 741)');\n if (icms?.grupo === 'ST') vedado(`${p}.impostos.icms`, 'sem repasse do ICMS-ST retido (N12-60, rejeição 740)');\n if (icms?.grupo === undefined && icms?.CST === '90' && icms.st !== undefined) {\n vedado(`${p}.impostos.icms.st`, 'com CST 90 sem os dados do ICMS-ST (N12-34, rejeição 381)');\n }\n if (imp.icmsUfDest !== undefined)\n vedado(`${p}.impostos.icmsUfDest`, 'sem ICMS da UF de destino (NA01-10, rejeição 807)');\n if (imp.ipi !== undefined) vedado(`${p}.impostos.ipi`, 'sem IPI (O01-10, rejeição 742)');\n if (imp.ii !== undefined) vedado(`${p}.impostos.ii`, 'sem imposto de importação (P01-10, rejeição 743)');\n if (imp.pisSt !== undefined) vedado(`${p}.impostos.pisSt`, 'sem PIS-ST (R01-10, rejeição 746)');\n if (imp.cofinsSt !== undefined) vedado(`${p}.impostos.cofinsSt`, 'sem COFINS-ST (T01-10, rejeição 749)');\n if (it.impostoDevol !== undefined) vedado(`${p}.impostoDevol`, 'sem devolução de tributos (UA01-20, rejeição 390)');\n });\n\n // X. Transporte: só na entrega a domicílio\n const tr = input.transporte;\n const entrega = ide.indPres === '4';\n if (tr !== undefined && tr.modFrete !== '9' && !entrega) {\n invalido('transporte.modFrete', 'sem frete fora da entrega a domicílio: modFrete 9 (X02-10, rejeição 753)');\n }\n if (tr?.transportador !== undefined && !entrega) {\n vedado('transporte.transportador', 'só tem transportador na entrega a domicílio (X03-10, rejeição 754)');\n }\n if (entrega && tr?.transportador === undefined) {\n issues.add(\n 'transporte.transportador',\n 'campo_obrigatorio',\n 'NFC-e com entrega a domicílio identifica o transportador (X03-20, rejeição 786)',\n );\n }\n if (tr?.retTransp !== undefined)\n vedado('transporte.retTransp', 'sem retenção do ICMS no transporte (X11-10, rejeição 755)');\n if (tr?.veicTransp !== undefined) vedado('transporte.veicTransp', 'sem veículo de transporte (X18-10, rejeição 756)');\n if (tr?.reboque !== undefined) vedado('transporte.reboque', 'sem reboque (X22-10, rejeição 757)');\n\n // Y e YA. Cobrança e pagamento\n if (input.cobranca !== undefined) vedado('cobranca', 'sem fatura nem duplicata (Y01-10, rejeição 760)');\n if (input.pagamento === undefined || input.pagamento.detPag.length === 0) {\n issues.add(\n 'pagamento',\n 'campo_obrigatorio',\n 'a NFC-e informa o pagamento: tPag 90 (sem pagamento) é recusado (YA02-40, rejeição 899)',\n );\n } else {\n input.pagamento.detPag.forEach((p, n) => {\n const motivo = TPAG_VEDADOS[p.tPag];\n if (motivo !== undefined) issues.add(`pagamento.detPag[${n}].tPag`, 'pagamento_invalido', motivo);\n // Cartão e PIX pedem o grupo do cartão (NT 2025.001, YA04-10, rejeição 391; obrigatória no modelo 65).\n if (['03', '04', '17'].includes(p.tPag) && p.card === undefined) {\n issues.add(\n `pagamento.detPag[${n}].card`,\n 'campo_obrigatorio',\n 'pagamento com cartão (tPag 03 ou 04) ou PIX (17) informa o grupo card (NT 2025.001, YA04-10, rejeição 391)',\n );\n }\n });\n }\n\n // Z. Grupos que a NFC-e não tem\n if (input.exporta !== undefined) vedado('exporta', 'sem comércio exterior (ZA01-30, rejeição 814)');\n if (input.compra !== undefined) vedado('compra', 'sem dados de compra (ZB01-10, rejeição 762)');\n if (input.cana !== undefined) vedado('cana', 'sem aquisição de cana (ZC01-10, rejeição 763)');\n}\n\n/** O `pag` montado, na forma que as regras de pagamento leem e completam. */\nexport interface PagMontado {\n readonly detPag: readonly {\n readonly tPag: string;\n readonly vPag: string;\n readonly card?: { readonly tpIntegra?: string; readonly CNPJ?: string; readonly cAut?: string };\n }[];\n vTroco?: string;\n}\n\n/**\n * Regras de pagamento da NFC-e sobre o grupo montado, com o `vNF` já calculado (NT 2025.001, item 02.7: YA03-10 a\n * YA06-10 passam a ser obrigatórias; MOC 7.0 Anexo I, YA09-10). Sem `vTroco` e com pagamento acima do total, o builder\n * calcula o troco (YA03-20, rejeição 866); informado, ele tem de ser a diferença (YA09-10, rejeição 869). O pagamento\n * posterior (tPag 91) tem valor zero e dispensa a soma igual ao total (NT 2025.001 v1.03, YA03-10 e YA03-30).\n */\nexport function pagamentoNfce(pag: PagMontado, vNF: Decimal, issues: Issues): void {\n const total = pag.detPag.reduce((a, p) => a.plus(Decimal.of(p.vPag)), Decimal.ZERO);\n const troco = total.minus(vNF);\n const posterior = pag.detPag.some((p) => p.tPag === '91');\n pag.detPag.forEach((p, n) => {\n if (p.tPag === '91' && !Decimal.of(p.vPag).isZero()) {\n issues.add(\n `pagamento.detPag[${n}].vPag`,\n 'pagamento_invalido',\n 'pagamento posterior (tPag 91) tem vPag zero (NT 2025.001 v1.03, YA03-30, rejeição 904)',\n );\n }\n });\n if (troco.isNegative() && !posterior) {\n issues.add(\n 'pagamento.detPag',\n 'pagamento_invalido',\n `pagamentos (${total.toFixed(2)}) abaixo do total da NFC-e (${vNF.toFixed(2)}) (NT 2025.001 v1.03, YA03-10, rejeição 865)`,\n );\n }\n // O troco informado é sempre pagamentos menos o total, também com o pagamento posterior (YA09-10 não tem exceção).\n if (pag.vTroco === undefined) {\n if (!troco.isNegative() && !troco.isZero()) pag.vTroco = troco.toFixed(2);\n } else if (!Decimal.of(pag.vTroco).eq(troco)) {\n issues.add(\n 'pagamento.vTroco',\n 'valor_divergente',\n `troco ${pag.vTroco} difere de pagamentos menos o total (${troco.toFixed(2)}) (YA09-10, rejeição 869)`,\n );\n }\n pag.detPag.forEach((p, n) => {\n const c = p.card;\n if (c === undefined) return;\n const path = `pagamento.detPag[${n}].card`;\n if (c.tpIntegra === '1' && (c.CNPJ === undefined || c.cAut === undefined)) {\n issues.add(\n path,\n 'campo_obrigatorio',\n 'cartão integrado à automação (tpIntegra 1) informa o CNPJ da credenciadora e o cAut (NT 2025.001, YA05-10, rejeição 392)',\n );\n }\n if (c.CNPJ !== undefined) {\n const r = lerCnpj(c.CNPJ, { caminho: `${path}.CNPJ` });\n if (!r.ok) issues.list.push(r.erro);\n }\n });\n}\n\nconst digitos = (s: string): string => s.replace(/[^0-9A-Za-z]/g, '').toUpperCase();\n",
17
17
  "/**\n * Escolha do pacote de liberação por vigência e conferência do objeto contra o descritor do PL escolhido.\n *\n * O builder monta sempre na forma do PL mais novo (`PL_010f`). Quando a vigência escolhe um PL mais antigo, o objeto é\n * serializado com o descritor dele; o serializer ignora campos que o descritor não conhece, então antes de serializar\n * `camposForaDoPl` aponta cada campo que sumiria em silêncio.\n */\n\nimport type { Ambiente, Relogio } from '@sinete/core';\nimport { ErroNaoSuportado } from '@sinete/core';\nimport type { ComplexType, EntradaDeVigencia, Particle } from '@sinete/schemas';\nimport { ehComplexType, ehElementParticle, ehWildcard, selecionarPl } from '@sinete/schemas';\nimport { TNFe_infNFe as Inf010e } from '@sinete/schemas/nfe/PL_010e';\nimport { TNFe_infNFe as Inf010f } from '@sinete/schemas/nfe/PL_010f';\nimport type { Issues } from '../issues.ts';\n\n/** Descritor de `infNFe` de cada módulo da família `nfe` da tabela de vigências. */\nconst INF_NFE: Readonly<Record<string, ComplexType>> = {\n 'nfe/PL_010e': Inf010e as ComplexType,\n 'nfe/PL_010f': Inf010f as ComplexType,\n};\n\nexport interface PlEscolhido {\n readonly vigencia: EntradaDeVigencia;\n readonly infNFe: ComplexType;\n}\n\n/** PL da NF-e vigente para o ambiente no relógio de emissão (ADR 0002, decisão 6). */\nexport function escolherPl(ambiente: Ambiente, emissao: Relogio): PlEscolhido {\n const vigencia = selecionarPl('nfe', ambiente, emissao);\n const infNFe = INF_NFE[vigencia.modulo];\n if (infNFe === undefined) {\n // A tabela de vigências ganhou um PL que este pacote ainda não conhece: falha explícita, nunca tentativa.\n throw new ErroNaoSuportado(`@sinete/nfe não conhece o módulo ${vigencia.modulo}; atualize o pacote`);\n }\n return { vigencia, infNFe };\n}\n\nfunction memberNames(p: Particle, acc: Set<string>): Set<string> {\n if (ehWildcard(p)) acc.add('$any');\n else if (ehElementParticle(p)) acc.add(p.e);\n else for (const i of p.i) memberNames(i, acc);\n return acc;\n}\n\nfunction elementTypes(p: Particle, acc: Map<string, ComplexType>): Map<string, ComplexType> {\n if (ehWildcard(p)) return acc;\n if (ehElementParticle(p)) {\n if (ehComplexType(p.t)) acc.set(p.e, p.t);\n } else for (const i of p.i) elementTypes(i, acc);\n return acc;\n}\n\n/** Aponta cada chave do objeto que o descritor não declara (o serializer a descartaria sem aviso). */\nexport function camposForaDoPl(ct: ComplexType, value: unknown, path: string, pl: string, issues: Issues): void {\n if (typeof value !== 'object' || value === null) return;\n const allowed = new Set<string>(['$attrs', '$text']);\n for (const a of ct.a ?? []) allowed.add(a.a);\n if (ct.c) memberNames(ct.c, allowed);\n const children = ct.c ? elementTypes(ct.c, new Map()) : new Map<string, ComplexType>();\n for (const [k, v] of Object.entries(value)) {\n if (v === undefined) continue;\n if (!allowed.has(k)) {\n issues.montagem(`${path}.${k}`, 'campo_fora_do_pl', `o campo não existe no ${pl} vigente para esta emissão`);\n continue;\n }\n const child = children.get(k);\n if (!child) continue;\n if (Array.isArray(v)) {\n for (const [n, x] of v.entries()) camposForaDoPl(child, x, `${path}.${k}[${n}]`, pl, issues);\n } else camposForaDoPl(child, v, `${path}.${k}`, pl, issues);\n }\n}\n",
18
- "/**\n * Regras de validação da SEFAZ que dependem só do documento e que rejeições reais de um integrador em produção mostraram\n * chegando à SEFAZ: conferidas antes de assinar, com o caminho da entrada (ADR 0012).\n *\n * Só entra aqui regra obrigatória (`Obrig.` no MOC) cujo resultado sai do próprio documento, sem cadastro nem\n * configuração da UF. Exceção que depende de tabela externa ou do critério da UF faz a conferência não recusar: na\n * dúvida, a nota vai e a SEFAZ decide, porque recusar localmente uma nota que a SEFAZ aceitaria é pior que a rejeição.\n */\n\nimport type { Ocorrencia } from '@sinete/core';\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\nimport type { Instante } from '../time.ts';\nimport { formatarDh } from '../time.ts';\n\n/**\n * CFOP em que o CST 50 (suspensão) é aceito com destinatário contribuinte isento: conserto ou reparo e remessa para\n * demonstração dentro do estado (MOC 7.0 Anexo I, RV N12-80, exceção 1).\n */\nconst CFOP_CST50_ISENTO: ReadonlySet<string> = new Set([\n '1915',\n '1916',\n '2915',\n '2916',\n '5915',\n '5916',\n '6915',\n '6916',\n '1912',\n '1913',\n '5912',\n '5913',\n]);\n\n/**\n * CST 50 ou 51 com destinatário contribuinte isento de IE (indIEDest 2): rejeição 529 (MOC 7.0 Anexo I, RV N12-80,\n * obrigatória no modelo 55). Fica de fora o que as exceções liberam: o CST 50 nos CFOP da exceção 1 e o CST 51 em\n * qualquer operação interna, que a exceção 3 deixa a critério da UF. A exceção 3 fala em destinatário CNPJ, mas uma UF\n * autorizou em produção CST 51 interno com destinatário CPF isento; como o critério é da UF, o CST 51 interno não é\n * recusado aqui, seja qual for o documento do destinatário. A exceção 2 (emissão antes de 01/07/2016) não alcança nota\n * montada agora.\n */\nexport function cstComIsento(input: DadosNfe, idDest: string, issues: Issues): void {\n const d = input.destinatario;\n if (d?.indIEDest !== '2') return;\n input.itens.forEach((it, n) => {\n const icms = it.impostos.icms;\n if (icms === undefined || !('CST' in icms)) return;\n const cst = icms.CST;\n if (cst === '50' && CFOP_CST50_ISENTO.has(it.produto.CFOP.replace(/\\D/g, ''))) return;\n if (cst === '51' && idDest === '1') return;\n if (cst !== '50' && cst !== '51') return;\n issues.add(\n `itens[${n}].impostos.icms.CST`,\n 'combinacao_invalida',\n `CST ${cst} não se usa com destinatário contribuinte isento de IE (indIEDest 2) (N12-80, rejeição 529)`,\n );\n });\n}\n\n/** Data (`AAAA-MM-DD`) do instante no deslocamento dado, em minutos. */\nconst dataNoFuso = (instante: Instante, offsetMinutes: number): string =>\n formatarDh(instante, offsetMinutes).slice(0, 10);\n\n/** Brasília (UTC-3), o fuso das SEFAZ, para a comparação de datas que o MOC faz \"desconsiderando a hora\". */\nconst OFFSET_BRASILIA = -180;\n\n/**\n * Vencimento das duplicatas (grupo Y, modelo 55): uma parcela só, vencendo na data de emissão, cai na rejeição 853,\n * \"dados de cobrança não devem ser informados para pagamento à vista\" (NT 2025.001 v1.03, RV Y09-40, em produção desde\n * 01/09/2025).\n *\n * As RV Y09-20 (sem `dVenc` ou vencendo antes da emissão, rejeição 900) e Y09-30 (antes da parcela anterior, 850) não\n * são conferidas aqui: uma UF autorizou em produção, em 2026, parcela única vencendo dois meses antes da emissão, o que\n * mostra que a aplicação delas depende da UF. Na dúvida, a nota vai e a SEFAZ decide (ADR 0012).\n *\n * A data de emissão é a do `dhEmi`. O MOC não diz em que fuso a SEFAZ a compara; para não recusar nota que ela aceitaria,\n * \"na data da emissão\" só vale quando a data local do `dhEmi`, a de Brasília e a de UTC coincidem.\n */\nexport function vencimentos(\n input: DadosNfe,\n emissao: { readonly dhEmi: string; readonly instante: Instante },\n issues: Issues,\n): void {\n const dups = input.cobranca?.duplicatas;\n if (dups === undefined || dups.length !== 1) return;\n const unica = dups[0]?.dVenc;\n if (unica === undefined) return;\n const local = emissao.dhEmi.slice(0, 10);\n const datas = new Set([local, dataNoFuso(emissao.instante, OFFSET_BRASILIA), dataNoFuso(emissao.instante, 0)]);\n if (datas.size === 1 && datas.has(unica)) {\n issues.add(\n 'cobranca.duplicatas',\n 'combinacao_invalida',\n 'uma parcela só, vencendo na data de emissão, é pagamento à vista: não informe a cobrança (Y09-40, rejeição 853)',\n );\n }\n}\n\n/** Documento sem pontuação e em maiúsculas (o CNPJ alfanumérico mantém as letras). */\nconst soDocumento = (s: string): string => s.replace(/[^0-9A-Za-z]/g, '').toUpperCase();\n\n/**\n * Confere o emitente com o titular do certificado que assina a NF-e (MOC 7.0 Anexo I, grupo F):\n *\n * - e-CNPJ: o CNPJ-base (8 primeiros caracteres) do emitente é o do certificado, senão rejeição 213 (RV F03);\n * - e-CPF: o CPF do emitente é o do certificado, senão rejeição 227 (RV F03A).\n *\n * Só compara documento com documento do mesmo tipo: e-CNPJ assinando nota de emitente CPF (ou o contrário) fica para a\n * SEFAZ. O certificado da SEFAZ que a F03 dispensa só assina a nota avulsa, que o `montarNfe` não monta (procEmi 0).\n * Devolve as ocorrências (vazio quando confere), com o caminho da entrada.\n */\nexport function conferirEmitenteDoCertificado(\n nfe: DadosNfe,\n titular: { readonly cnpj?: string | undefined; readonly cpf?: string | undefined },\n): readonly Ocorrencia[] {\n const e = nfe.emitente;\n if (e.CNPJ !== undefined && titular.cnpj !== undefined) {\n const base = soDocumento(e.CNPJ).slice(0, 8);\n if (base !== soDocumento(titular.cnpj).slice(0, 8)) {\n return [\n {\n caminho: 'emitente.CNPJ',\n code: 'emitente_difere_do_certificado',\n mensagem: `CNPJ-base ${base} do emitente difere do CNPJ-base do certificado (F03, rejeição 213)`,\n origem: 'entrada',\n },\n ];\n }\n }\n if (e.CPF !== undefined && titular.cpf !== undefined && soDocumento(e.CPF) !== soDocumento(titular.cpf)) {\n return [\n {\n caminho: 'emitente.CPF',\n code: 'emitente_difere_do_certificado',\n mensagem: 'CPF do emitente difere do CPF do certificado (F03A, rejeição 227)',\n origem: 'entrada',\n },\n ];\n }\n return [];\n}\n",
19
- "/**\n * Texto e tamanho dos campos de texto da NF-e conferidos na entrada (ADR 0011, revisão de 01/10/2026).\n *\n * Antes, o caractere que o XML não representa e o texto fora do tipo do leiaute (tamanho, espaço nas pontas,\n * caractere fora do `TString`) só apareciam na montagem, com o caminho do XML (`infNFe.det[0].prod.xProd` ou\n * `/infNFe/det[1]/prod/xProd`). Conferidos aqui, saem como `campo_invalido`, com `origem: 'entrada'`, o caminho da\n * entrada (`itens[0].produto.xProd`) e uma mensagem para quem preenche o campo (`no máximo 60 caracteres`), sem nome\n * de validador nem de tipo do XSD.\n *\n * O tipo de cada campo vem do schema do PL da montagem (o `TString` com o `maxLength` do elemento), nunca de um número\n * escrito aqui: a tabela abaixo só diz qual elemento do `infNFe` recebe cada campo da entrada.\n */\n\nimport type { ComplexType, OcorrenciaSchema, Particle, SimpleType } from '@sinete/schemas';\nimport { conferirTipoSimples, ehComplexType, ehElementParticle, ehWildcard } from '@sinete/schemas';\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\n\n/** Produção `Char` do XML 1.0: tab, LF, CR, U+0020 a U+D7FF, U+E000 a U+FFFD e U+10000 a U+10FFFF. */\nexport function textoXmlValido(texto: string): boolean {\n for (const ch of texto) {\n const c = ch.codePointAt(0) ?? 0;\n const ok =\n c === 0x9 ||\n c === 0xa ||\n c === 0xd ||\n (c >= 0x20 && c <= 0xd7ff) ||\n (c >= 0xe000 && c <= 0xfffd) ||\n (c >= 0x10000 && c <= 0x10ffff);\n if (!ok) return false;\n }\n return true;\n}\n\n/**\n * Campo de texto da entrada (com `[]` onde a entrada é uma lista) e o elemento do `infNFe` que o recebe como veio. Só\n * os campos copiados sem transformação: o que a montagem calcula ou formata é conferido por ela.\n */\nconst CAMPOS: readonly (readonly [entrada: string, xml: string])[] = [\n ['natOp', 'ide.natOp'],\n ['emitente.xNome', 'emit.xNome'],\n ['emitente.xFant', 'emit.xFant'],\n ['emitente.endereco.xLgr', 'emit.enderEmit.xLgr'],\n ['emitente.endereco.nro', 'emit.enderEmit.nro'],\n ['emitente.endereco.xCpl', 'emit.enderEmit.xCpl'],\n ['emitente.endereco.xBairro', 'emit.enderEmit.xBairro'],\n ['emitente.endereco.xMun', 'emit.enderEmit.xMun'],\n ['destinatario.xNome', 'dest.xNome'],\n ['destinatario.email', 'dest.email'],\n ['destinatario.endereco.xLgr', 'dest.enderDest.xLgr'],\n ['destinatario.endereco.nro', 'dest.enderDest.nro'],\n ['destinatario.endereco.xCpl', 'dest.enderDest.xCpl'],\n ['destinatario.endereco.xBairro', 'dest.enderDest.xBairro'],\n ['destinatario.endereco.xMun', 'dest.enderDest.xMun'],\n ['destinatario.endereco.xPais', 'dest.enderDest.xPais'],\n ...(['retirada', 'entrega'] as const).flatMap((g) =>\n (['xNome', 'xLgr', 'nro', 'xCpl', 'xBairro', 'xMun', 'email'] as const).map(\n (c) => [`${g}.${c}`, `${g}.${c}`] as const,\n ),\n ),\n ['itens[].produto.cProd', 'det.prod.cProd'],\n ['itens[].produto.xProd', 'det.prod.xProd'],\n ['itens[].produto.uCom', 'det.prod.uCom'],\n ['itens[].produto.uTrib', 'det.prod.uTrib'],\n ['itens[].produto.xPed', 'det.prod.xPed'],\n ['itens[].infAdProd', 'det.infAdProd'],\n ['transporte.transportador.xNome', 'transp.transporta.xNome'],\n ['transporte.transportador.xEnder', 'transp.transporta.xEnder'],\n ['transporte.transportador.xMun', 'transp.transporta.xMun'],\n ['transporte.volumes[].esp', 'transp.vol.esp'],\n ['transporte.volumes[].marca', 'transp.vol.marca'],\n ['transporte.volumes[].nVol', 'transp.vol.nVol'],\n ['cobranca.fatura.nFat', 'cobr.fat.nFat'],\n ['cobranca.duplicatas[].nDup', 'cobr.dup.nDup'],\n ['pagamento.detPag[].xPag', 'pag.detPag.xPag'],\n ['informacoesAdicionais.infAdFisco', 'infAdic.infAdFisco'],\n ['informacoesAdicionais.infCpl', 'infAdic.infCpl'],\n ['informacoesAdicionais.obsCont[].xTexto', 'infAdic.obsCont.xTexto'],\n ['informacoesAdicionais.obsFisco[].xTexto', 'infAdic.obsFisco.xTexto'],\n ['compra.xNEmp', 'compra.xNEmp'],\n ['compra.xPed', 'compra.xPed'],\n ['compra.xCont', 'compra.xCont'],\n];\n\n/** O tipo do elemento `nome` entre as partículas (sequências e escolhas aninhadas). */\nfunction elemento(p: Particle | undefined, nome: string): ComplexType | SimpleType | undefined {\n if (p === undefined || ehWildcard(p)) return undefined;\n if (ehElementParticle(p)) return p.e === nome ? p.t : undefined;\n for (const i of p.i) {\n const t = elemento(i, nome);\n if (t !== undefined) return t;\n }\n return undefined;\n}\n\n/** O tipo simples do elemento em `caminho` (pontos) a partir do `infNFe`; `undefined` se o PL não o tem. */\nfunction tipoEm(infNFe: ComplexType, caminho: string): SimpleType | undefined {\n let t: ComplexType | SimpleType | undefined = infNFe;\n for (const nome of caminho.split('.')) {\n if (t === undefined || !ehComplexType(t)) return undefined;\n t = elemento(t.c, nome);\n }\n return t === undefined || ehComplexType(t) ? undefined : t;\n}\n\nconst tiposPorPl = new WeakMap<ComplexType, ReadonlyMap<string, SimpleType>>();\n\n/** Tipo de cada campo da tabela no PL, calculado uma vez por PL. */\nfunction tiposDoPl(infNFe: ComplexType): ReadonlyMap<string, SimpleType> {\n let m = tiposPorPl.get(infNFe);\n if (m === undefined) {\n const novo = new Map<string, SimpleType>();\n for (const [entrada, xml] of CAMPOS) {\n const t = tipoEm(infNFe, xml);\n if (t !== undefined) novo.set(entrada, t);\n }\n m = novo;\n tiposPorPl.set(infNFe, m);\n }\n return m;\n}\n\n/** Os valores de `caminho` (com `[]` nas listas) na entrada, com o caminho concreto de cada um. */\nfunction valoresEm(raiz: unknown, caminho: string): [string, unknown][] {\n let atuais: [string, unknown][] = [['', raiz]];\n for (const parte of caminho.split('.')) {\n const lista = parte.endsWith('[]');\n const chave = lista ? parte.slice(0, -2) : parte;\n const proximos: [string, unknown][] = [];\n for (const [c, v] of atuais) {\n if (typeof v !== 'object' || v === null) continue;\n const filho = (v as Record<string, unknown>)[chave];\n const base = c === '' ? chave : `${c}.${chave}`;\n if (!lista) proximos.push([base, filho]);\n else if (Array.isArray(filho)) for (const [n, f] of filho.entries()) proximos.push([`${base}[${n}]`, f]);\n }\n atuais = proximos;\n }\n return atuais;\n}\n\n/** Caminhos de todos os textos da entrada com caractere que o XML não representa. */\nfunction textosForaDoXml(valor: unknown, caminho: string, saida: string[]): void {\n if (typeof valor === 'string') {\n if (!textoXmlValido(valor)) saida.push(caminho);\n } else if (Array.isArray(valor)) {\n for (const [n, v] of valor.entries()) textosForaDoXml(v, `${caminho}[${n}]`, saida);\n } else if (typeof valor === 'object' && valor !== null) {\n for (const [k, v] of Object.entries(valor)) textosForaDoXml(v, caminho === '' ? k : `${caminho}.${k}`, saida);\n }\n}\n\n/** Mensagem do caractere que não vai ao documento e que a pessoa não consegue ver (controle, invisível). */\nconst CARACTERE_INVISIVEL = 'caractere não aceito (símbolo ou caractere de controle)';\n\n/** Caractere que a pessoa enxerga: letra, marca, número, pontuação ou símbolo. */\nconst VISIVEL = /^[\\p{L}\\p{M}\\p{N}\\p{P}\\p{S}]$/u;\n\n/** O primeiro caractere de `valor` que o tipo não aceita no meio de um texto, ou `undefined` se todos passam. */\nfunction caractereRecusado(tipo: SimpleType, valor: string): string | undefined {\n for (const ch of new Set(valor)) {\n const saida: OcorrenciaSchema[] = [];\n conferirTipoSimples(tipo, `A${ch}A`, '', saida);\n if (saida.some((o) => o.code === 'padrao')) return ch;\n }\n return undefined;\n}\n\n/**\n * As regras do tipo que `valor` viola, em texto para quem preenche o campo. O código do validador decide a regra; a\n * mensagem diz o limite (do próprio tipo) e, no `padrao`, se o problema é o espaço nas pontas ou um caractere.\n */\nfunction mensagensDoTexto(tipo: SimpleType, valor: string, violadas: readonly OcorrenciaSchema[]): string[] {\n if (violadas.length === 0) return [];\n if (valor.trim() === '') return ['não pode ficar em branco'];\n const tamanho = [...valor].length;\n const mensagens = new Set<string>();\n for (const o of violadas) {\n if (o.code === 'tamanho_maximo' && tipo.mx !== undefined)\n mensagens.add(`no máximo ${tipo.mx} caracteres (tem ${tamanho})`);\n else if (o.code === 'tamanho_minimo' && tipo.mn !== undefined)\n mensagens.add(`no mínimo ${tipo.mn} caracteres (tem ${tamanho})`);\n else if (o.code === 'tamanho' && tipo.l !== undefined)\n mensagens.add(`exatamente ${tipo.l} caracteres (tem ${tamanho})`);\n else if (o.code === 'padrao') {\n const espaco = valor !== valor.trim();\n const ch = caractereRecusado(tipo, valor);\n if (espaco) mensagens.add('sem espaço no começo nem no fim');\n if (ch !== undefined) mensagens.add(VISIVEL.test(ch) ? `caractere não aceito: “${ch}”` : CARACTERE_INVISIVEL);\n if (!espaco && ch === undefined) mensagens.add('formato não aceito');\n } else mensagens.add('valor não aceito neste campo');\n }\n return [...mensagens];\n}\n\n/**\n * Confere os textos da entrada: em qualquer campo, o caractere que o XML não representa; nos campos da tabela, o tipo\n * do elemento no PL (tamanho, espaço nas pontas, caractere fora do conjunto aceito). Tudo sai como `campo_invalido`,\n * com o caminho da entrada, `origem: 'entrada'` e uma ocorrência por regra violada. O campo que já tem ocorrência (de\n * outra conferência da entrada) não ganha outra. `substituidos` são os campos que a montagem troca por um texto fixo\n * (o nome do destinatário em homologação): o tipo deles não é conferido, porque o texto informado não vai ao XML.\n */\nexport function conferirTextosDaEntrada(\n entrada: DadosNfe,\n infNFe: ComplexType,\n issues: Issues,\n substituidos: ReadonlySet<string> = new Set(),\n): void {\n const jaRecusados = new Set(issues.list.map((i) => i.caminho));\n const foraDoXml: string[] = [];\n textosForaDoXml(entrada, '', foraDoXml);\n for (const c of foraDoXml) {\n if (jaRecusados.has(c) || substituidos.has(c)) continue;\n issues.add(c, 'campo_invalido', CARACTERE_INVISIVEL);\n jaRecusados.add(c);\n }\n const tipos = tiposDoPl(infNFe);\n for (const [campo] of CAMPOS) {\n const tipo = tipos.get(campo);\n if (tipo === undefined) continue;\n for (const [caminho, valor] of valoresEm(entrada, campo)) {\n if (typeof valor !== 'string' || jaRecusados.has(caminho) || substituidos.has(caminho)) continue;\n const saida: OcorrenciaSchema[] = [];\n conferirTipoSimples(tipo, valor, caminho, saida);\n for (const m of mensagensDoTexto(tipo, valor, saida)) issues.add(caminho, 'campo_invalido', m);\n }\n }\n}\n",
18
+ "/**\n * Regras de validação da SEFAZ que dependem só do documento e que rejeições reais de um integrador em produção mostraram\n * chegando à SEFAZ: conferidas antes de assinar, com o caminho da entrada (ADR 0012).\n *\n * Só entra aqui regra obrigatória (`Obrig.` no MOC) cujo resultado sai do próprio documento, sem cadastro nem\n * configuração da UF. Exceção que depende de tabela externa ou do critério da UF faz a conferência não recusar: na\n * dúvida, a nota vai e a SEFAZ decide, porque recusar localmente uma nota que a SEFAZ aceitaria é pior que a rejeição.\n */\n\nimport type { Ocorrencia } from '@sinete/core';\nimport { indicadoresCfop } from '@sinete/validators';\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\nimport type { Instante } from '../time.ts';\nimport { formatarDh } from '../time.ts';\n\n/**\n * CFOP em que o CST 50 (suspensão) é aceito com destinatário contribuinte isento: conserto ou reparo e remessa para\n * demonstração dentro do estado (MOC 7.0 Anexo I, RV N12-80, exceção 1).\n */\nconst CFOP_CST50_ISENTO: ReadonlySet<string> = new Set([\n '1915',\n '1916',\n '2915',\n '2916',\n '5915',\n '5916',\n '6915',\n '6916',\n '1912',\n '1913',\n '5912',\n '5913',\n]);\n\n/**\n * CST 50 ou 51 com destinatário contribuinte isento de IE (indIEDest 2): rejeição 529 (MOC 7.0 Anexo I, RV N12-80,\n * obrigatória no modelo 55). Fica de fora o que as exceções liberam: o CST 50 nos CFOP da exceção 1 e o CST 51 em\n * qualquer operação interna, que a exceção 3 deixa a critério da UF. A exceção 3 fala em destinatário CNPJ, mas uma UF\n * autorizou em produção CST 51 interno com destinatário CPF isento; como o critério é da UF, o CST 51 interno não é\n * recusado aqui, seja qual for o documento do destinatário. A exceção 2 (emissão antes de 01/07/2016) não alcança nota\n * montada agora.\n */\nexport function cstComIsento(input: DadosNfe, idDest: string, issues: Issues): void {\n const d = input.destinatario;\n if (d?.indIEDest !== '2') return;\n input.itens.forEach((it, n) => {\n const icms = it.impostos.icms;\n if (icms === undefined || !('CST' in icms)) return;\n const cst = icms.CST;\n if (cst === '50' && CFOP_CST50_ISENTO.has(it.produto.CFOP.replace(/\\D/g, ''))) return;\n if (cst === '51' && idDest === '1') return;\n if (cst !== '50' && cst !== '51') return;\n issues.add(\n `itens[${n}].impostos.icms.CST`,\n 'combinacao_invalida',\n `CST ${cst} não se usa com destinatário contribuinte isento de IE (indIEDest 2) (N12-80, rejeição 529)`,\n );\n });\n}\n\n/** Data (`AAAA-MM-DD`) do instante no deslocamento dado, em minutos. */\nconst dataNoFuso = (instante: Instante, offsetMinutes: number): string =>\n formatarDh(instante, offsetMinutes).slice(0, 10);\n\n/** Brasília (UTC-3), o fuso das SEFAZ, para a comparação de datas que o MOC faz \"desconsiderando a hora\". */\nconst OFFSET_BRASILIA = -180;\n\n/**\n * Vencimento das duplicatas (grupo Y, modelo 55): uma parcela só, vencendo na data de emissão, cai na rejeição 853,\n * \"dados de cobrança não devem ser informados para pagamento à vista\" (NT 2025.001 v1.03, RV Y09-40, em produção desde\n * 01/09/2025).\n *\n * As RV Y09-20 (sem `dVenc` ou vencendo antes da emissão, rejeição 900) e Y09-30 (antes da parcela anterior, 850) não\n * são conferidas aqui: uma UF autorizou em produção, em 2026, parcela única vencendo dois meses antes da emissão, o que\n * mostra que a aplicação delas depende da UF. Na dúvida, a nota vai e a SEFAZ decide (ADR 0012).\n *\n * A data de emissão é a do `dhEmi`. O MOC não diz em que fuso a SEFAZ a compara; para não recusar nota que ela aceitaria,\n * \"na data da emissão\" só vale quando a data local do `dhEmi`, a de Brasília e a de UTC coincidem.\n */\nexport function vencimentos(\n input: DadosNfe,\n emissao: { readonly dhEmi: string; readonly instante: Instante },\n issues: Issues,\n): void {\n const dups = input.cobranca?.duplicatas;\n if (dups === undefined || dups.length !== 1) return;\n const unica = dups[0]?.dVenc;\n if (unica === undefined) return;\n const local = emissao.dhEmi.slice(0, 10);\n const datas = new Set([local, dataNoFuso(emissao.instante, OFFSET_BRASILIA), dataNoFuso(emissao.instante, 0)]);\n if (datas.size === 1 && datas.has(unica)) {\n issues.add(\n 'cobranca.duplicatas',\n 'combinacao_invalida',\n 'uma parcela só, vencendo na data de emissão, é pagamento à vista: não informe a cobrança (Y09-40, rejeição 853)',\n );\n }\n}\n\n/** Documento sem pontuação e em maiúsculas (o CNPJ alfanumérico mantém as letras). */\nconst soDocumento = (s: string): string => s.replace(/[^0-9A-Za-z]/g, '').toUpperCase();\n\n/**\n * Confere o emitente com o titular do certificado que assina a NF-e (MOC 7.0 Anexo I, grupo F):\n *\n * - e-CNPJ: o CNPJ-base (8 primeiros caracteres) do emitente é o do certificado, senão rejeição 213 (RV F03);\n * - e-CPF: o CPF do emitente é o do certificado, senão rejeição 227 (RV F03A).\n *\n * Só compara documento com documento do mesmo tipo: e-CNPJ assinando nota de emitente CPF (ou o contrário) fica para a\n * SEFAZ. O certificado da SEFAZ que a F03 dispensa só assina a nota avulsa, que o `montarNfe` não monta (procEmi 0).\n * Devolve as ocorrências (vazio quando confere), com o caminho da entrada.\n */\nexport function conferirEmitenteDoCertificado(\n nfe: DadosNfe,\n titular: { readonly cnpj?: string | undefined; readonly cpf?: string | undefined },\n): readonly Ocorrencia[] {\n const e = nfe.emitente;\n if (e.CNPJ !== undefined && titular.cnpj !== undefined) {\n const base = soDocumento(e.CNPJ).slice(0, 8);\n if (base !== soDocumento(titular.cnpj).slice(0, 8)) {\n return [\n {\n caminho: 'emitente.CNPJ',\n code: 'emitente_difere_do_certificado',\n mensagem: `CNPJ-base ${base} do emitente difere do CNPJ-base do certificado (F03, rejeição 213)`,\n origem: 'entrada',\n },\n ];\n }\n }\n if (e.CPF !== undefined && titular.cpf !== undefined && soDocumento(e.CPF) !== soDocumento(titular.cpf)) {\n return [\n {\n caminho: 'emitente.CPF',\n code: 'emitente_difere_do_certificado',\n mensagem: 'CPF do emitente difere do CPF do certificado (F03A, rejeição 227)',\n origem: 'entrada',\n },\n ];\n }\n return [];\n}\n\n/** A RV C17-42 (NFC-e sem IE) \"não se aplica a partir de 2033\". */\nconst NFCE_SEM_IE_ATE = '2033-01-01';\n\n/**\n * Contribuinte exclusivo do IBS/CBS: a nota sem `emitente.IE` (NT 2026.007 v1.10). Sai daqui o que a NT decide só com o\n * documento:\n *\n * - NFC-e sem IE, rejeição 156 (RV C17-42), até o fim de 2032; a data é a da emissão e a do fato gerador, e a conferência\n * só recusa quando todas as leituras (local, Brasília e UTC) caem antes de 2033;\n * - NF-e sem IE e sem CNPJ do emitente (emitente CPF), 157 (C17-43);\n * - NF-e sem IE com a IE do substituto tributário, 158 (C18-50);\n * - item com ICMS ou ICMS interestadual (`icmsUfDest`) na NF-e sem IE, 161 (N01-10), menos na devolução (finNFe 4) e na\n * nota de crédito de retorno por recusa ou não localização (tpNFCredito 03), as duas exceções da regra;\n * - item sem `impostos.ibsCbs` (nem o grupo pronto nem a classificação para a calculadora) na NF-e sem IE, 162\n * (UB12-11). O item classificado cujo cálculo falhou já tem a ocorrência da calculadora, de montagem.\n *\n * Ficam para a SEFAZ as regras da mesma NT que dependem de tabela ou cadastro: a 159 (tabela de CFOP do Portal), a 163 e\n * a 164 (CCC), as de local de retirada e entrega (CCC) e as da LCC-RFB (178 a 187). A 166 e a 188 são do roteamento.\n */\nexport function exclusivoIbsCbs(\n input: DadosNfe,\n contexto: { readonly nfce: boolean; readonly dhEmi: string; readonly instantes: readonly Instante[] },\n issues: Issues,\n): void {\n const e = input.emitente;\n if (e.IE !== undefined) return;\n if (contexto.nfce) {\n const datas = [\n contexto.dhEmi.slice(0, 10),\n ...contexto.instantes.flatMap((i) => [dataNoFuso(i, OFFSET_BRASILIA), dataNoFuso(i, 0)]),\n ];\n if (datas.every((d) => d < NFCE_SEM_IE_ATE)) {\n issues.add(\n 'emitente.IE',\n 'campo_obrigatorio',\n 'a NFC-e exige a IE do emitente: contribuinte exclusivo do IBS/CBS, sem IE, emite só NF-e (C17-42, rejeição 156)',\n );\n }\n return;\n }\n if (e.CNPJ === undefined) {\n issues.add(\n 'emitente.CNPJ',\n 'campo_obrigatorio',\n 'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) exige o CNPJ do emitente (C17-43, rejeição 157)',\n );\n }\n if (e.IEST !== undefined) {\n issues.add(\n 'emitente.IEST',\n 'combinacao_invalida',\n 'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) não leva a IE do substituto tributário (C18-50, rejeição 158)',\n );\n }\n const icmsLiberado = (input.finNFe ?? '1') === '4' || input.tpNFCredito === '03';\n input.itens.forEach((it, n) => {\n if (!icmsLiberado) {\n for (const [campo, grupo] of [\n ['icms', it.impostos.icms],\n ['icmsUfDest', it.impostos.icmsUfDest],\n ] as const) {\n if (grupo === undefined) continue;\n issues.add(\n `itens[${n}].impostos.${campo}`,\n 'grupo_vedado',\n 'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) não leva ICMS no item (N01-10, rejeição 161)',\n );\n }\n }\n if (it.impostos.ibsCbs === undefined) {\n issues.add(\n `itens[${n}].impostos.ibsCbs`,\n 'campo_obrigatorio',\n 'NF-e sem IE do emitente (contribuinte exclusivo do IBS/CBS) exige o grupo IBS/CBS em todo item (UB12-11, rejeição 162)',\n );\n }\n });\n}\n\n/** Nota de crédito que aceita CFOP de devolução (NT 2025.002 v1.52, RV I08-144, exceção): 03, 04 e 06. */\nconst CREDITO_COM_DEVOLUCAO: ReadonlySet<string> = new Set(['03', '04', '06']);\n\n/**\n * CFOP de devolução (Tabela CFOP, `indDevol`) em NF-e que não é de devolução nem complementar: rejeição 328 (MOC 7.0\n * Anexo I, RV I08-144, obrigatória no modelo 55; NT 2025.002 v1.52, que exclui a nota de crédito 03, 04 e 06). CFOP\n * fora da tabela versionada não é recusado.\n */\nexport function cfopDeDevolucao(input: DadosNfe, issues: Issues): void {\n const fin = input.finNFe ?? '1';\n if (fin === '2' || fin === '4') return;\n if (fin === '5' && input.tpNFCredito !== undefined && CREDITO_COM_DEVOLUCAO.has(input.tpNFCredito)) return;\n input.itens.forEach((it, n) => {\n if (indicadoresCfop(it.produto.CFOP.replace(/\\D/g, ''))?.indDevol !== true) return;\n issues.add(\n `itens[${n}].produto.CFOP`,\n 'combinacao_invalida',\n `CFOP ${it.produto.CFOP} é de devolução e a nota não é de devolução (finNFe ${fin}) (I08-144, rejeição 328)`,\n );\n });\n}\n\n/** CST aceitos com destinatário não contribuinte (RV N12-70; o 61 entrou pela NT 2023.001). */\nconst CST_NAO_CONTRIBUINTE: ReadonlySet<string> = new Set(['00', '20', '40', '41', '60', '61']);\n\n/** Códigos ANP que a exceção 5 da N12-70 deixa de fora (não derivados de petróleo). */\nconst ANP_FORA_DA_EXCECAO_5: ReadonlySet<string> = new Set([\n '820101001',\n '820101010',\n '810102001',\n '810102004',\n '810102002',\n '810102003',\n '810101002',\n '810101001',\n '810101003',\n '220101003',\n '220101004',\n '220101002',\n '220101001',\n '220101005',\n '220101006',\n '560101001',\n]);\n\n/** CFOP da exceção 7 da N12-70 (CST 51 em qualquer operação). */\nconst CFOP_CST51: ReadonlySet<string> = new Set(['5123', '5922', '6123', '6922']);\n\n/**\n * CST fora de 00, 20, 40, 41, 60 e 61 com destinatário não contribuinte (indIEDest 9): rejeição 508 (MOC 7.0 Anexo I,\n * RV N12-70, obrigatória no modelo 55, no texto da NT 2023.001 v1.60 e da NT 2023.003 v1.40). Só o CST: a regra não\n * fala do CSOSN. Ficam de fora todas as exceções:\n *\n * 1. NF-e de entrada; 3. nota com veículo novo (`veicProd`) em algum item; 6. CST 50 e 51 na devolução;\n * 2. CST 50 com CFOP de retorno ou remessa (Tabela CFOP, `indRetor`, `indRemes`) ou 5949 e 6949, e com CFOP fora da\n * tabela versionada, que a conferência não sabe classificar;\n * 5. CST 30 interestadual com combustível derivado de petróleo; 9. CST 30 interestadual com energia elétrica (NCM\n * 27160000);\n * 7. CST 51 com CFOP 5123, 5922, 6123 e 6922, e em qualquer operação interna: a NT 2023.001 diz \"operações internas\" e\n * a NT 2023.003 restringe ao retorno de depósito (5906 e 5907), e a conferência recusa só o que as duas recusam;\n * 8. CST 10 e 02 em operação interna, a critério da UF; e o CST 90 com CFOP 5403 ou 5405 no CE (observação da NT\n * 2023.003), também a critério da UF.\n *\n * A exceção 4 (emissão antes de 01/07/2016) não alcança nota montada agora.\n */\nexport function cstComNaoContribuinte(\n input: DadosNfe,\n contexto: { readonly idDest: string; readonly uf: string },\n issues: Issues,\n): void {\n if (input.destinatario?.indIEDest !== '9' || input.tpNF === '0') return;\n if (input.itens.some((it) => it.produto.especifico !== undefined && 'veicProd' in it.produto.especifico)) return;\n const fin = input.finNFe ?? '1';\n const interna = contexto.idDest === '1';\n const interestadual = contexto.idDest === '2';\n input.itens.forEach((it, n) => {\n const icms = it.impostos.icms;\n if (icms === undefined || !('CST' in icms)) return;\n const cst = icms.CST;\n if (CST_NAO_CONTRIBUINTE.has(cst)) return;\n const cfop = it.produto.CFOP.replace(/\\D/g, '');\n const esp = it.produto.especifico;\n if ((cst === '50' || cst === '51') && fin === '4') return;\n if (cst === '50') {\n const ind = indicadoresCfop(cfop);\n if (ind === undefined || ind.indRetor || ind.indRemes || cfop === '5949' || cfop === '6949') return;\n }\n if (cst === '51' && (CFOP_CST51.has(cfop) || interna)) return;\n if ((cst === '10' || cst === '02') && interna) return;\n if (cst === '30' && interestadual) {\n if (esp !== undefined && 'comb' in esp && !ANP_FORA_DA_EXCECAO_5.has(esp.comb.cProdANP)) return;\n if (it.produto.NCM.replace(/\\D/g, '') === '27160000') return;\n }\n if (cst === '90' && contexto.uf === 'CE' && (cfop === '5403' || cfop === '5405')) return;\n issues.add(\n `itens[${n}].impostos.icms.CST`,\n 'combinacao_invalida',\n `CST ${cst} não se usa com destinatário não contribuinte (indIEDest 9) (N12-70, rejeição 508)`,\n );\n });\n}\n",
19
+ "/**\n * Texto e tamanho dos campos de texto da NF-e conferidos na entrada (ADR 0011, revisão de 01/10/2026).\n *\n * Antes, o caractere que o XML não representa e o texto fora do tipo do leiaute (tamanho, espaço nas pontas,\n * caractere fora do `TString`) só apareciam na montagem, com o caminho do XML (`infNFe.det[0].prod.xProd` ou\n * `/infNFe/det[1]/prod/xProd`). Conferidos aqui, saem como `campo_invalido`, com `origem: 'entrada'`, o caminho da\n * entrada (`itens[0].produto.xProd`) e uma mensagem para quem preenche o campo (`no máximo 60 caracteres`), sem nome\n * de validador nem de tipo do XSD.\n *\n * O tipo de cada campo vem do schema do PL da montagem (o `TString` com o `maxLength` do elemento), nunca de um número\n * escrito aqui: a tabela abaixo só diz qual elemento do `infNFe` recebe cada campo da entrada.\n */\n\nimport type { CampoDeTexto, ComplexType } from '@sinete/schemas';\nimport { conferirTextos } from '@sinete/schemas';\nimport type { Issues } from '../issues.ts';\nimport type { DadosNfe } from '../model.ts';\n\nexport { textoXmlValido } from '@sinete/schemas';\n\n/**\n * Campo de texto da entrada (com `[]` onde a entrada é uma lista) e o elemento do `infNFe` que o recebe como veio. Só\n * os campos copiados sem transformação: o que a montagem calcula ou formata é conferido por ela.\n */\nconst CAMPOS: readonly CampoDeTexto[] = [\n ['natOp', 'ide.natOp'],\n ['emitente.xNome', 'emit.xNome'],\n ['emitente.xFant', 'emit.xFant'],\n ['emitente.endereco.xLgr', 'emit.enderEmit.xLgr'],\n ['emitente.endereco.nro', 'emit.enderEmit.nro'],\n ['emitente.endereco.xCpl', 'emit.enderEmit.xCpl'],\n ['emitente.endereco.xBairro', 'emit.enderEmit.xBairro'],\n ['emitente.endereco.xMun', 'emit.enderEmit.xMun'],\n ['destinatario.xNome', 'dest.xNome'],\n ['destinatario.email', 'dest.email'],\n ['destinatario.endereco.xLgr', 'dest.enderDest.xLgr'],\n ['destinatario.endereco.nro', 'dest.enderDest.nro'],\n ['destinatario.endereco.xCpl', 'dest.enderDest.xCpl'],\n ['destinatario.endereco.xBairro', 'dest.enderDest.xBairro'],\n ['destinatario.endereco.xMun', 'dest.enderDest.xMun'],\n ['destinatario.endereco.xPais', 'dest.enderDest.xPais'],\n ...(['retirada', 'entrega'] as const).flatMap((g) =>\n (['xNome', 'xLgr', 'nro', 'xCpl', 'xBairro', 'xMun', 'email'] as const).map(\n (c) => [`${g}.${c}`, `${g}.${c}`] as const,\n ),\n ),\n ['itens[].produto.cProd', 'det.prod.cProd'],\n ['itens[].produto.xProd', 'det.prod.xProd'],\n ['itens[].produto.uCom', 'det.prod.uCom'],\n ['itens[].produto.uTrib', 'det.prod.uTrib'],\n ['itens[].produto.xPed', 'det.prod.xPed'],\n ['itens[].infAdProd', 'det.infAdProd'],\n ['transporte.transportador.xNome', 'transp.transporta.xNome'],\n ['transporte.transportador.xEnder', 'transp.transporta.xEnder'],\n ['transporte.transportador.xMun', 'transp.transporta.xMun'],\n ['transporte.volumes[].esp', 'transp.vol.esp'],\n ['transporte.volumes[].marca', 'transp.vol.marca'],\n ['transporte.volumes[].nVol', 'transp.vol.nVol'],\n ['cobranca.fatura.nFat', 'cobr.fat.nFat'],\n ['cobranca.duplicatas[].nDup', 'cobr.dup.nDup'],\n ['pagamento.detPag[].xPag', 'pag.detPag.xPag'],\n ['informacoesAdicionais.infAdFisco', 'infAdic.infAdFisco'],\n ['informacoesAdicionais.infCpl', 'infAdic.infCpl'],\n ['informacoesAdicionais.obsCont[].xTexto', 'infAdic.obsCont.xTexto'],\n ['informacoesAdicionais.obsFisco[].xTexto', 'infAdic.obsFisco.xTexto'],\n ['compra.xNEmp', 'compra.xNEmp'],\n ['compra.xPed', 'compra.xPed'],\n ['compra.xCont', 'compra.xCont'],\n];\n\n/**\n * Confere os textos da entrada: em qualquer campo, o caractere que o XML não representa; nos campos da tabela, o tipo\n * do elemento no PL (tamanho, espaço nas pontas, caractere fora do conjunto aceito). Tudo sai como `campo_invalido`,\n * com o caminho da entrada, `origem: 'entrada'` e uma ocorrência por regra violada. O campo que já tem ocorrência (de\n * outra conferência da entrada) não ganha outra. `substituidos` são os campos que a montagem troca por um texto fixo\n * (o nome do destinatário em homologação): o tipo deles não é conferido, porque o texto informado não vai ao XML.\n */\nexport function conferirTextosDaEntrada(\n entrada: DadosNfe,\n infNFe: ComplexType,\n issues: Issues,\n substituidos: ReadonlySet<string> = new Set(),\n): void {\n const pular = new Set([...issues.list.map((i) => i.caminho), ...substituidos]);\n for (const t of conferirTextos(entrada, infNFe, CAMPOS, pular)) issues.add(t.caminho, 'campo_invalido', t.mensagem);\n}\n",
20
20
  "/**\n * IPI (O), II (P), PIS (Q, R), COFINS (S, T), ISSQN (U) e ICMS para a UF de destino (NA) do item.\n */\n\nimport type {\n TIpi,\n TNFe_infNFe_det_imposto_COFINS,\n TNFe_infNFe_det_imposto_COFINSST,\n TNFe_infNFe_det_imposto_ICMSUFDest,\n TNFe_infNFe_det_imposto_II,\n TNFe_infNFe_det_imposto_ISSQN,\n TNFe_infNFe_det_imposto_PIS,\n TNFe_infNFe_det_imposto_PISST,\n} from '@sinete/schemas/nfe/PL_010f';\nimport type { DecimalInput } from '../decimal.ts';\nimport { Decimal } from '../decimal.ts';\nimport { D0302A04, D1104, D1104V, D1204, D1204V, D1302, D1302_OPC } from '../format.ts';\nimport type { IcmsUfDest, ImpostoImportacao, Ipi, Issqn, PisCofins, PisCofinsSt } from '../model.ts';\nimport type { Ctx } from './values.ts';\nimport { clean, digits } from './values.ts';\n\ntype Out = Record<string, string | undefined>;\n\n/** IPI: por alíquota `vBC × pIPI` ou por unidade `qUnid × vUnid` (MOC O10 a O14; RV O14-10, nota *4). */\nexport function buildIpi(ctx: Ctx, input: Ipi, vOp: Decimal, path: string): { grupo: TIpi; vIPI: Decimal } {\n const head: Out = {\n CNPJProd: input.CNPJProd === undefined ? undefined : input.CNPJProd.replace(/[./-]/g, '').toUpperCase(),\n cSelo: input.cSelo,\n qSelo: input.qSelo,\n cEnq: input.cEnq,\n };\n if (!['00', '49', '50', '99'].includes(input.CST)) {\n return { grupo: { ...clean(head), IPINT: { CST: input.CST } } as unknown as TIpi, vIPI: Decimal.ZERO };\n }\n const i = input as {\n CST: string;\n vBC?: DecimalInput;\n pIPI?: DecimalInput;\n qUnid?: DecimalInput;\n vUnid?: DecimalInput;\n vIPI?: DecimalInput;\n };\n let trib: Out;\n let vIPI: Decimal;\n if (i.qUnid !== undefined || i.vUnid !== undefined) {\n const qUnid = ctx.req(i.qUnid, `${path}.qUnid`, D1204V);\n const vUnid = ctx.req(i.vUnid, `${path}.vUnid`, D1104);\n vIPI = ctx.calc(i.vIPI, qUnid.times(vUnid), `${path}.vIPI`, D1302, 'ipi');\n trib = { CST: i.CST, qUnid: ctx.s(qUnid, D1204V), vUnid: ctx.s(vUnid, D1104), vIPI: ctx.s(vIPI, D1302) };\n } else {\n const pIPI = ctx.req(i.pIPI, `${path}.pIPI`, D0302A04);\n const vBC = ctx.base(i.vBC, vOp, `${path}.vBC`, D1302, 'ipi');\n vIPI = ctx.calc(i.vIPI, vBC.percent(pIPI), `${path}.vIPI`, D1302, 'ipi');\n trib = { CST: i.CST, vBC: ctx.s(vBC, D1302), pIPI: ctx.s(pIPI, D0302A04), vIPI: ctx.s(vIPI, D1302) };\n }\n return { grupo: { ...clean(head), IPITrib: clean(trib) } as unknown as TIpi, vIPI };\n}\n\nexport function buildIi(\n ctx: Ctx,\n input: ImpostoImportacao,\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_II; vII: Decimal } {\n const vII = ctx.req(input.vII, `${path}.vII`, D1302);\n return {\n grupo: {\n vBC: ctx.s(ctx.req(input.vBC, `${path}.vBC`, D1302), D1302),\n vDespAdu: ctx.s(ctx.req(input.vDespAdu, `${path}.vDespAdu`, D1302), D1302),\n vII: ctx.s(vII, D1302),\n vIOF: ctx.s(ctx.req(input.vIOF, `${path}.vIOF`, D1302), D1302),\n },\n vII,\n };\n}\n\n/**\n * PIS ou COFINS (Q02 a Q05, S02 a S05): `valor = vBC × aliquota / 100` ou `qBCProd × vAliqProd` (RV Q09-10, S11-10,\n * nota *4). `tag` escolhe os nomes do leiaute (`PIS`/`pPIS`/`vPIS` ou `COFINS`/`pCOFINS`/`vCOFINS`).\n */\nexport function buildPisCofins(\n ctx: Ctx,\n input: PisCofins,\n tag: 'PIS' | 'COFINS',\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_PIS | TNFe_infNFe_det_imposto_COFINS; valor: Decimal } {\n const p = `p${tag}`;\n const v = `v${tag}`;\n const cst = input.CST;\n if (!('vBC' in input) && !('qBCProd' in input)) {\n return { grupo: { [`${tag}NT`]: { CST: cst } } as unknown as TNFe_infNFe_det_imposto_PIS, valor: Decimal.ZERO };\n }\n const i = input as {\n CST: string;\n vBC?: DecimalInput;\n aliquota?: DecimalInput;\n qBCProd?: DecimalInput;\n vAliqProd?: DecimalInput;\n valor?: DecimalInput;\n };\n let body: Out;\n let valor: Decimal;\n if (i.qBCProd !== undefined) {\n const q = ctx.req(i.qBCProd, `${path}.qBCProd`, D1204V);\n const a = ctx.req(i.vAliqProd, `${path}.vAliqProd`, D1104V);\n valor = ctx.calc(i.valor, q.times(a), `${path}.valor`, D1302, 'pisCofins');\n body = { CST: cst, qBCProd: ctx.s(q, D1204V), vAliqProd: ctx.s(a, D1104V), [v]: ctx.s(valor, D1302) };\n } else {\n const vBC = ctx.req(i.vBC, `${path}.vBC`, D1302);\n const a = ctx.req(i.aliquota, `${path}.aliquota`, D0302A04);\n valor = ctx.calc(i.valor, vBC.percent(a), `${path}.valor`, D1302, 'pisCofins');\n body = { CST: cst, vBC: ctx.s(vBC, D1302), [p]: ctx.s(a, D0302A04), [v]: ctx.s(valor, D1302) };\n }\n const nome = cst === '01' || cst === '02' ? 'Aliq' : cst === '03' ? 'Qtde' : 'Outr';\n return { grupo: { [`${tag}${nome}`]: body } as unknown as TNFe_infNFe_det_imposto_PIS, valor };\n}\n\n/** PIS ST ou COFINS ST (R, T). */\nexport function buildPisCofinsSt(\n ctx: Ctx,\n input: PisCofinsSt,\n tag: 'PIS' | 'COFINS',\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_PISST | TNFe_infNFe_det_imposto_COFINSST; valor: Decimal; soma: boolean } {\n let body: Out;\n let valor: Decimal;\n if (input.qBCProd !== undefined) {\n const q = ctx.req(input.qBCProd, `${path}.qBCProd`, D1204);\n const a = ctx.req(input.vAliqProd, `${path}.vAliqProd`, D1104);\n valor = ctx.calc(input.valor, q.times(a), `${path}.valor`, D1302, 'pisCofins');\n body = { qBCProd: ctx.s(q, D1204), vAliqProd: ctx.s(a, D1104) };\n } else {\n // No XSD o vBC do PISST é TDec_1302Opc (sem zero) e o do COFINSST é TDec_1302 (aceita zero).\n const fBC = tag === 'PIS' ? D1302_OPC : D1302;\n const vBC = ctx.req(input.vBC, `${path}.vBC`, fBC);\n const a = ctx.req(input.aliquota, `${path}.aliquota`, D0302A04);\n valor = ctx.calc(input.valor, vBC.percent(a), `${path}.valor`, D1302, 'pisCofins');\n body = { vBC: ctx.s(vBC, fBC), [`p${tag}`]: ctx.s(a, D0302A04) };\n }\n body[`v${tag}`] = ctx.s(valor, D1302);\n body[`indSoma${tag}ST`] = input.indSoma;\n return { grupo: clean(body) as unknown as TNFe_infNFe_det_imposto_PISST, valor, soma: input.indSoma === '1' };\n}\n\n/** ISSQN: `vISSQN = vBC × vAliq / 100` (RV U04-10, nota *4). */\nexport function buildIssqn(\n ctx: Ctx,\n input: Issqn,\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_ISSQN; vBC: Decimal; vISSQN: Decimal; opcionais: Record<string, Decimal> } {\n const vBC = ctx.req(input.vBC, `${path}.vBC`, D1302);\n const vAliq = ctx.req(input.vAliq, `${path}.vAliq`, D0302A04);\n const vISSQN = ctx.calc(input.vISSQN, vBC.percent(vAliq), `${path}.vISSQN`, D1302, 'issqn');\n const opcionais: Record<string, Decimal> = {};\n const opt = (k: 'vDeducao' | 'vOutro' | 'vDescIncond' | 'vDescCond' | 'vISSRet'): string | undefined => {\n const d = ctx.opt(input[k], `${path}.${k}`, D1302);\n if (d !== undefined) opcionais[k] = d;\n return ctx.so(d, D1302_OPC);\n };\n return {\n grupo: clean({\n vBC: ctx.s(vBC, D1302),\n vAliq: ctx.s(vAliq, D0302A04),\n vISSQN: ctx.s(vISSQN, D1302),\n cMunFG: input.cMunFG,\n cListServ: input.cListServ,\n vDeducao: opt('vDeducao'),\n vOutro: opt('vOutro'),\n vDescIncond: opt('vDescIncond'),\n vDescCond: opt('vDescCond'),\n vISSRet: opt('vISSRet'),\n indISS: input.indISS,\n cServico: input.cServico,\n cMun: input.cMun,\n cPais: input.cPais === undefined ? undefined : digits(input.cPais),\n nProcesso: input.nProcesso,\n indIncentivo: input.indIncentivo,\n }) as TNFe_infNFe_det_imposto_ISSQN,\n vBC,\n vISSQN,\n opcionais,\n };\n}\n\n/** ICMS para a UF de destino (NA): valores informados; defaults de partilha 100% e remetente zero desde 2019. */\nexport function buildIcmsUfDest(\n ctx: Ctx,\n input: IcmsUfDest,\n path: string,\n): { grupo: TNFe_infNFe_det_imposto_ICMSUFDest; vFCPUFDest: Decimal; vICMSUFDest: Decimal; vICMSUFRemet: Decimal } {\n const pFCPUFDest = ctx.opt(input.pFCPUFDest, `${path}.pFCPUFDest`, D0302A04);\n const vFCPUFDest = ctx.opt(input.vFCPUFDest, `${path}.vFCPUFDest`, D1302);\n if (pFCPUFDest !== undefined && vFCPUFDest === undefined) {\n ctx.issues.add(`${path}.vFCPUFDest`, 'campo_obrigatorio', 'pFCPUFDest informado exige vFCPUFDest');\n }\n const vICMSUFDest = ctx.req(input.vICMSUFDest, `${path}.vICMSUFDest`, D1302);\n const vICMSUFRemet = ctx.opt(input.vICMSUFRemet, `${path}.vICMSUFRemet`, D1302) ?? Decimal.ZERO;\n const vBCFCPUFDest = ctx.opt(input.vBCFCPUFDest, `${path}.vBCFCPUFDest`, D1302);\n return {\n grupo: clean({\n vBCUFDest: ctx.s(ctx.req(input.vBCUFDest, `${path}.vBCUFDest`, D1302), D1302),\n vBCFCPUFDest: ctx.so(vBCFCPUFDest, D1302),\n pFCPUFDest: ctx.so(pFCPUFDest, D0302A04),\n pICMSUFDest: ctx.s(ctx.req(input.pICMSUFDest, `${path}.pICMSUFDest`, D0302A04), D0302A04),\n pICMSInter: input.pICMSInter,\n pICMSInterPart: ctx.s(\n ctx.opt(input.pICMSInterPart, `${path}.pICMSInterPart`, D0302A04) ?? Decimal.HUNDRED,\n D0302A04,\n ),\n vFCPUFDest: ctx.so(vFCPUFDest, D1302),\n vICMSUFDest: ctx.s(vICMSUFDest, D1302),\n vICMSUFRemet: ctx.s(vICMSUFRemet, D1302),\n }) as TNFe_infNFe_det_imposto_ICMSUFDest,\n vFCPUFDest: vFCPUFDest ?? Decimal.ZERO,\n vICMSUFDest,\n vICMSUFRemet,\n };\n}\n",
21
21
  "/**\n * Modelo de entrada da NF-e: o que quem emite descreve. O builder (`montarNfe`) transforma isto no objeto tipado do\n * `@sinete/schemas` do pacote de liberação vigente, calcula os valores derivados e os totais em decimal exato e\n * confere as regras antes de qualquer serialização.\n *\n * Convenções:\n * - Nomes de campo do leiaute (MOC) onde eles existem (`xNome`, `NCM`, `CFOP`, `qCom`, `pICMS`); nomes em português\n * para os agrupamentos que o leiaute não nomeia (`emitente`, `itens`, `pagamento`).\n * - Números entram como `DecimalInput` (`'12.34'`, `12.34`, `12n` ou `Decimal`). Prefira texto: `number` perde dígitos\n * acima de 15 algarismos. Nada é convertido para ponto flutuante nas contas.\n * - Valores derivados (`vProd`, `vICMS`, `vPIS`, totais) são opcionais: omitidos, o builder calcula; informados, o\n * builder usa o valor dado e confere a coerência com tolerância de R$ 0,01 (a mesma das regras de validação).\n * - Códigos do leiaute ficam como uniões de literais (`CST: '00'`), com constantes nomeadas onde ajudam\n * (`MotivoDesoneracaoIcms`, `TipoPagamento`).\n * - Grupos raros ou puramente informativos (veículo novo, medicamento, combustível, DI, exportação, rastro, cana,\n * monofasia do IBS/CBS) entram já no tipo gerado do schema, sem tradução: o builder só os repassa.\n */\n\nimport type { Uf } from '@sinete/core';\nimport type {\n TCIBS_NFe,\n TIS,\n TMonofasia,\n TNFe_infNFe_agropecuario,\n TNFe_infNFe_cana,\n TNFe_infNFe_compra,\n TNFe_infNFe_det_obsItem,\n TNFe_infNFe_det_prod_arma,\n TNFe_infNFe_det_prod_comb,\n TNFe_infNFe_det_prod_DI,\n TNFe_infNFe_det_prod_detExport,\n TNFe_infNFe_det_prod_gCred,\n TNFe_infNFe_det_prod_infProdEmb,\n TNFe_infNFe_det_prod_infProdNFF,\n TNFe_infNFe_det_prod_med,\n TNFe_infNFe_det_prod_rastro,\n TNFe_infNFe_det_prod_veicProd,\n TNFe_infNFe_exporta,\n TNFe_infNFe_ide_NFref_refECF,\n TNFe_infNFe_ide_NFref_refNF,\n TNFe_infNFe_infAdic_obsCont,\n TNFe_infNFe_infAdic_obsFisco,\n TNFe_infNFe_infAdic_procRef,\n TNFe_infNFe_infIntermed,\n TNFe_infNFe_pag_detPag_card,\n TTribNFe,\n TVeiculo,\n} from '@sinete/schemas/nfe/PL_010f';\nimport type { DecimalInput } from './decimal.ts';\nimport type { Instante } from './time.ts';\n\n// ---------------------------------------------------------------------------------------------------------------\n// Participantes\n// ---------------------------------------------------------------------------------------------------------------\n\n/** CNPJ (numérico ou alfanumérico) ou CPF, exclusivos. Aceitam máscara; o builder normaliza. */\nexport type DocumentoPessoa =\n | { readonly CNPJ: string; readonly CPF?: never }\n | { readonly CPF: string; readonly CNPJ?: never };\n\n/** Endereço no Brasil (`TEnderEmi`, `TEndereco`, `TLocal`). */\nexport interface Endereco {\n readonly xLgr: string;\n readonly nro: string;\n readonly xCpl?: string;\n readonly xBairro: string;\n /** Código IBGE do município, 7 dígitos. */\n readonly cMun: string;\n readonly xMun: string;\n readonly UF: Uf;\n /** 8 dígitos, com ou sem máscara. */\n readonly CEP?: string;\n /** DDD + número, só dígitos (6 a 14). */\n readonly fone?: string;\n}\n\n/** Endereço de destinatário no exterior: o leiaute usa `cMun` 9999999, `xMun` EXTERIOR e `UF` EX. */\nexport interface EnderecoExterior {\n readonly exterior: true;\n readonly xLgr: string;\n readonly nro: string;\n readonly xCpl?: string;\n readonly xBairro: string;\n /** Código do país (tabela do BACEN, até 4 dígitos). */\n readonly cPais: string;\n readonly xPais: string;\n readonly fone?: string;\n}\n\n/** Código de Regime Tributário (C21): 1 Simples Nacional; 2 Simples com excesso de sublimite; 3 Regime Normal; 4 MEI. */\nexport type Crt = '1' | '2' | '3' | '4';\n\n/** Emitente (grupo C). Produtor rural pessoa física emite com CPF, nas séries 920 a 969. */\nexport type Emitente = DocumentoPessoa & {\n readonly xNome: string;\n readonly xFant?: string;\n /** No emitente o CEP é obrigatório (`TEnderEmi`). */\n readonly endereco: Endereco & { readonly CEP: string };\n /** Inscrição estadual; `ISENTO` só na NF-e avulsa (RV C17-30). Opcional a partir do PL_010f (NT 2026.007). */\n readonly IE?: string;\n /** IE do substituto tributário na UF de destino. */\n readonly IEST?: string;\n readonly IM?: string;\n readonly CNAE?: string;\n readonly CRT: Crt;\n readonly ISUFEmit?: string;\n};\n\n/**\n * Indicador da IE do destinatário (E16a): 1 contribuinte do ICMS; 2 contribuinte isento de inscrição (não informar a\n * IE); 9 não contribuinte.\n */\nexport type IndIEDest = '1' | '2' | '9';\n\n/** Destinatário (grupo E). No exterior, `idEstrangeiro` no lugar do CNPJ/CPF. */\nexport type Destinatario = (\n | DocumentoPessoa\n | { readonly idEstrangeiro: string; readonly CNPJ?: never; readonly CPF?: never }\n) & {\n readonly xNome?: string;\n readonly endereco?: Endereco | EnderecoExterior;\n readonly indIEDest: IndIEDest;\n readonly IE?: string;\n readonly ISUF?: string;\n readonly IM?: string;\n readonly email?: string;\n};\n\n/** Local de retirada ou de entrega (grupos F e G), quando diferente do endereço do emitente ou destinatário. */\nexport type Local = DocumentoPessoa &\n Endereco & {\n readonly xNome?: string;\n readonly email?: string;\n readonly IE?: string;\n };\n\n// ---------------------------------------------------------------------------------------------------------------\n// Documentos referenciados\n// ---------------------------------------------------------------------------------------------------------------\n\n/**\n * NF de produtor em papel (modelo 04) ou avulsa (01) referenciada (BA10). O modelo 04 foi extinto pelo Ajuste\n * SINIEF 10/2022; o builder só aceita a referência a notas emitidas antes do fim da vigência (`data/produtor-rural.json`).\n */\nexport type RefNfp = DocumentoPessoa & {\n readonly cUF: string;\n /** Ano e mês da emissão da nota referenciada, `AAMM`. */\n readonly AAMM: string;\n /** IE do produtor ou `ISENTO`. */\n readonly IE: string;\n readonly mod: '01' | '04';\n readonly serie: string | number;\n readonly nNF: string | number;\n};\n\n/** Documento referenciado no nível da nota (grupo BA). */\nexport type Referenciada =\n | { readonly refNFe: string }\n | { readonly refNFeSig: string }\n | { readonly refNF: TNFe_infNFe_ide_NFref_refNF }\n | { readonly refNFP: RefNfp }\n | { readonly refCTe: string }\n | { readonly refECF: TNFe_infNFe_ide_NFref_refECF };\n\n// ---------------------------------------------------------------------------------------------------------------\n// Produto\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Grupo específico do produto (choice do grupo I): no máximo um. Repassado como veio. */\nexport type ProdutoEspecifico =\n | { readonly veicProd: TNFe_infNFe_det_prod_veicProd }\n | { readonly med: TNFe_infNFe_det_prod_med }\n | { readonly arma: readonly TNFe_infNFe_det_prod_arma[] }\n | { readonly comb: TNFe_infNFe_det_prod_comb }\n | { readonly nRECOPI: string };\n\n/** Produto ou serviço do item (grupo I). */\nexport interface Produto {\n readonly cProd: string;\n /** GTIN; padrão `SEM GTIN`. */\n readonly cEAN?: string;\n readonly cBarra?: string;\n readonly xProd: string;\n /** NCM de 8 dígitos (ou só o capítulo, 2 dígitos, fora do comércio exterior). */\n readonly NCM: string;\n readonly NVE?: readonly string[];\n readonly CEST?: string;\n readonly indEscala?: 'S' | 'N';\n readonly CNPJFab?: string;\n readonly cBenef?: string;\n readonly gCred?: readonly TNFe_infNFe_det_prod_gCred[];\n readonly tpCredPresIBSZFM?: '0' | '1' | '2' | '3' | '4';\n readonly EXTIPI?: string;\n /** CFOP de 4 dígitos. */\n readonly CFOP: string;\n /** Unidade comercial (até 6 caracteres). */\n readonly uCom: string;\n /** Quantidade comercial, até 4 casas. */\n readonly qCom: DecimalInput;\n /** Valor unitário comercial, até 10 casas. */\n readonly vUnCom: DecimalInput;\n /** Valor bruto; padrão `qCom × vUnCom` arredondado em 2 casas. */\n readonly vProd?: DecimalInput;\n /** GTIN da unidade tributável; padrão igual a `cEAN`. */\n readonly cEANTrib?: string;\n readonly cBarraTrib?: string;\n /** Unidade tributável; padrão igual a `uCom`. */\n readonly uTrib?: string;\n /** Quantidade tributável; padrão igual a `qCom`. */\n readonly qTrib?: DecimalInput;\n /** Valor unitário tributável; padrão `vUnCom` quando unidade e quantidade coincidem, senão `vProd / qTrib`. */\n readonly vUnTrib?: DecimalInput;\n readonly vFrete?: DecimalInput;\n readonly vSeg?: DecimalInput;\n /** Desconto incondicional do item. */\n readonly vDesc?: DecimalInput;\n readonly vOutro?: DecimalInput;\n /** 1 (padrão): o valor do item compõe o total da nota; 0: não compõe. */\n readonly indTot?: '0' | '1';\n readonly indBemMovelUsado?: '1';\n readonly DI?: readonly TNFe_infNFe_det_prod_DI[];\n readonly detExport?: readonly TNFe_infNFe_det_prod_detExport[];\n readonly xPed?: string;\n readonly nItemPed?: string;\n readonly nFCI?: string;\n readonly rastro?: readonly TNFe_infNFe_det_prod_rastro[];\n readonly infProdNFF?: TNFe_infNFe_det_prod_infProdNFF;\n readonly infProdEmb?: TNFe_infNFe_det_prod_infProdEmb;\n readonly especifico?: ProdutoEspecifico;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// ICMS\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Origem da mercadoria (N11, `Torig`): 0 nacional; 1 e 2 estrangeira; 3 a 8 conforme conteúdo de importação. */\nexport type Origem = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8';\n\n/** Modalidade da BC do ICMS (N13): 0 MVA; 1 pauta; 2 preço tabelado máximo; 3 valor da operação. */\nexport type ModBC = '0' | '1' | '2' | '3';\n\n/** Modalidade da BC do ICMS ST (N18): 0 preço tabelado; 1 lista negativa; 2 positiva; 3 neutra; 4 MVA; 5 pauta; 6 valor da operação. */\nexport type ModBCST = '0' | '1' | '2' | '3' | '4' | '5' | '6';\n\n/**\n * Motivo da desoneração do ICMS (N28), com os nomes das tabelas do leiaute. Cada CST aceita um subconjunto (o tipo de\n * cada grupo restringe): CST 20 e 70 e 90: 3, 9, 10, 11, 12 (20) ou 3, 9, 12; CST 30: 6, 7, 9; CST 40/41/50: 1, 3, 4, 5,\n * 6, 7, 8, 9, 10, 11, 16, 90; partilha: 9, 10, 11.\n */\nexport const MotivoDesoneracaoIcms: {\n readonly TAXI: '1';\n readonly AGROPECUARIA: '3';\n readonly FROTISTA_LOCADORA: '4';\n readonly DIPLOMATICO_CONSULAR: '5';\n readonly UTILITARIOS_MOTOCICLETAS_AMAZONIA_ALC: '6';\n readonly SUFRAMA: '7';\n readonly VENDA_ORGAO_PUBLICO: '8';\n readonly OUTROS: '9';\n readonly DEFICIENTE_CONDUTOR: '10';\n readonly DEFICIENTE_NAO_CONDUTOR: '11';\n readonly FOMENTO_AGROPECUARIO: '12';\n readonly OLIMPIADAS_RIO_2016: '16';\n readonly SOLICITADO_PELO_FISCO: '90';\n} = {\n TAXI: '1',\n AGROPECUARIA: '3',\n FROTISTA_LOCADORA: '4',\n DIPLOMATICO_CONSULAR: '5',\n UTILITARIOS_MOTOCICLETAS_AMAZONIA_ALC: '6',\n SUFRAMA: '7',\n VENDA_ORGAO_PUBLICO: '8',\n OUTROS: '9',\n DEFICIENTE_CONDUTOR: '10',\n DEFICIENTE_NAO_CONDUTOR: '11',\n FOMENTO_AGROPECUARIO: '12',\n OLIMPIADAS_RIO_2016: '16',\n SOLICITADO_PELO_FISCO: '90',\n};\n\nexport type MotivoDesoneracaoIcms = (typeof MotivoDesoneracaoIcms)[keyof typeof MotivoDesoneracaoIcms];\n\n/** Desoneração do ICMS: valor e motivo andam juntos (RV N27a/N28). */\nexport interface Desoneracao<M extends MotivoDesoneracaoIcms> {\n readonly vICMSDeson: DecimalInput;\n readonly motDesICMS: M;\n /** 1: o desonerado deduz do valor do item e do total (NT 2023.004); 0 ou ausente: não deduz. */\n readonly indDeduzDeson?: '0' | '1';\n}\n\n/** Desoneração do ICMS-ST (N33a/N33b): 3 uso na agropecuária; 9 outros; 12 fomento agropecuário. */\nexport interface DesoneracaoSt {\n readonly vICMSSTDeson: DecimalInput;\n readonly motDesICMSST: '3' | '9' | '12';\n}\n\n/** Parte própria do ICMS. `vBC` padrão: valor da operação (vProd + vFrete + vSeg + vOutro - vDesc) já reduzido por `pRedBC`. */\nexport interface IcmsProprio {\n /** Padrão `'3'` (valor da operação). */\n readonly modBC?: ModBC;\n readonly vBC?: DecimalInput;\n readonly pICMS: DecimalInput;\n /** Padrão `vBC × pICMS / 100`. */\n readonly vICMS?: DecimalInput;\n}\n\n/** FCP da operação própria. `vBCFCP` padrão `vBC`; `vFCP` padrão `vBCFCP × pFCP / 100`. */\nexport interface IcmsFcp {\n readonly vBCFCP?: DecimalInput;\n readonly pFCP?: DecimalInput;\n readonly vFCP?: DecimalInput;\n}\n\n/**\n * ICMS retido por substituição tributária. Com `modBCST` 4 (MVA) e sem `vBCST`, a base é\n * (vProd + vFrete + vSeg + vOutro - vDesc + vIPI) × (1 + pMVAST/100) × (1 - pRedBCST/100). `vICMSST` padrão\n * `vBCST × pICMSST / 100 - ICMS próprio` (MOC N23); `vFCPST` padrão `vBCFCPST × pFCPST / 100 - vFCP` (RV N23d-10).\n */\nexport interface IcmsSt {\n readonly modBCST: ModBCST;\n readonly pMVAST?: DecimalInput;\n readonly pRedBCST?: DecimalInput;\n readonly vBCST?: DecimalInput;\n readonly pICMSST: DecimalInput;\n readonly vICMSST?: DecimalInput;\n readonly vBCFCPST?: DecimalInput;\n readonly pFCPST?: DecimalInput;\n readonly vFCPST?: DecimalInput;\n /**\n * ICMS próprio a abater do ST quando o grupo não tem ICMS próprio destacado (CST 30, CSOSN 201, 202, 203, 900).\n * Ausente, nada é abatido. Não vai para o XML.\n */\n readonly vICMSDeducaoST?: DecimalInput;\n}\n\n/** ICMS-ST retido anteriormente (CST 60, CSOSN 500). Todos informativos. */\nexport interface IcmsStRetido {\n readonly vBCSTRet?: DecimalInput;\n readonly pST?: DecimalInput;\n readonly vICMSSubstituto?: DecimalInput;\n readonly vICMSSTRet?: DecimalInput;\n readonly vBCFCPSTRet?: DecimalInput;\n readonly pFCPSTRet?: DecimalInput;\n readonly vFCPSTRet?: DecimalInput;\n readonly pRedBCEfet?: DecimalInput;\n readonly vBCEfet?: DecimalInput;\n readonly pICMSEfet?: DecimalInput;\n readonly vICMSEfet?: DecimalInput;\n}\n\ninterface IcmsBase {\n readonly orig: Origem;\n /** Discrimina os grupos de partilha (`Part`) e de repasse de ST (`ST`); ausente nos demais. */\n readonly grupo?: undefined;\n}\n\nexport interface Icms00 extends IcmsBase, IcmsProprio {\n readonly CST: '00';\n readonly pFCP?: DecimalInput;\n readonly vFCP?: DecimalInput;\n}\n\n/** Monofásico próprio sobre combustíveis. `vICMSMono` padrão `qBCMono × adRemICMS`. */\nexport interface Icms02 extends IcmsBase {\n readonly CST: '02';\n readonly qBCMono?: DecimalInput;\n readonly adRemICMS: DecimalInput;\n readonly vICMSMono?: DecimalInput;\n}\n\nexport interface Icms10 extends IcmsBase, IcmsProprio, IcmsFcp {\n readonly CST: '10';\n readonly st: IcmsSt;\n readonly desoneracaoSt?: DesoneracaoSt;\n}\n\n/** Monofásico próprio e com retenção sobre combustíveis. */\nexport interface Icms15 extends IcmsBase {\n readonly CST: '15';\n readonly qBCMono?: DecimalInput;\n readonly adRemICMS: DecimalInput;\n readonly vICMSMono?: DecimalInput;\n readonly qBCMonoReten?: DecimalInput;\n readonly adRemICMSReten: DecimalInput;\n readonly vICMSMonoReten?: DecimalInput;\n readonly pRedAdRem?: DecimalInput;\n readonly motRedAdRem?: '1' | '9';\n}\n\n/** Com redução de base de cálculo. `vBC` padrão: valor da operação × (1 - pRedBC/100). */\nexport interface Icms20 extends IcmsBase, IcmsProprio, IcmsFcp {\n readonly CST: '20';\n readonly pRedBC: DecimalInput;\n readonly desoneracao?: Desoneracao<'3' | '9' | '10' | '11' | '12'>;\n}\n\n/** Isenta ou não tributada, com ST. */\nexport interface Icms30 extends IcmsBase {\n readonly CST: '30';\n readonly st: IcmsSt;\n readonly desoneracao?: Desoneracao<'6' | '7' | '9'>;\n}\n\n/** 40 isenta, 41 não tributada, 50 suspensão. */\nexport interface Icms40 extends IcmsBase {\n readonly CST: '40' | '41' | '50';\n readonly desoneracao?: Desoneracao<'1' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '16' | '90'>;\n}\n\n/**\n * Diferimento (CST 51). Com `pICMS` e sem valores: `vICMSOp = vBC × pICMS`, `vICMSDif = vICMSOp × pDif`,\n * `vICMS = vICMSOp - vICMSDif` (RV N16a e N16c); o FCP segue a mesma conta com `pFCPDif`.\n */\nexport interface Icms51 extends IcmsBase, IcmsFcp {\n readonly CST: '51';\n readonly modBC?: ModBC;\n readonly pRedBC?: DecimalInput;\n readonly cBenefRBC?: string;\n readonly vBC?: DecimalInput;\n readonly pICMS?: DecimalInput;\n readonly vICMSOp?: DecimalInput;\n /** Percentual do diferimento; 100 difere tudo. */\n readonly pDif?: DecimalInput;\n readonly vICMSDif?: DecimalInput;\n readonly vICMS?: DecimalInput;\n readonly pFCPDif?: DecimalInput;\n readonly vFCPDif?: DecimalInput;\n readonly vFCPEfet?: DecimalInput;\n}\n\n/** Monofásico com recolhimento diferido. */\nexport interface Icms53 extends IcmsBase {\n readonly CST: '53';\n readonly qBCMono?: DecimalInput;\n readonly adRemICMS?: DecimalInput;\n readonly vICMSMonoOp?: DecimalInput;\n readonly pDif?: DecimalInput;\n readonly vICMSMonoDif?: DecimalInput;\n readonly vICMSMono?: DecimalInput;\n readonly qBCMonoDif?: DecimalInput;\n readonly adRemICMSDif?: DecimalInput;\n}\n\n/** ICMS cobrado anteriormente por ST. */\nexport interface Icms60 extends IcmsBase, IcmsStRetido {\n readonly CST: '60';\n}\n\n/** Monofásico cobrado anteriormente. */\nexport interface Icms61 extends IcmsBase {\n readonly CST: '61';\n readonly qBCMonoRet?: DecimalInput;\n readonly adRemICMSRet: DecimalInput;\n readonly vICMSMonoRet?: DecimalInput;\n}\n\n/** Com redução de base e ST. */\nexport interface Icms70 extends IcmsBase, IcmsProprio, IcmsFcp {\n readonly CST: '70';\n readonly pRedBC: DecimalInput;\n readonly st: IcmsSt;\n readonly desoneracao?: Desoneracao<'3' | '9' | '12'>;\n readonly desoneracaoSt?: DesoneracaoSt;\n}\n\n/** Outras. Tudo opcional; cada parte informada é calculada como nos grupos equivalentes. */\nexport interface Icms90 extends IcmsBase, IcmsFcp {\n readonly CST: '90';\n readonly modBC?: ModBC;\n readonly vBC?: DecimalInput;\n readonly pRedBC?: DecimalInput;\n readonly cBenefRBC?: string;\n readonly pICMS?: DecimalInput;\n readonly vICMSOp?: DecimalInput;\n readonly pDif?: DecimalInput;\n readonly vICMSDif?: DecimalInput;\n readonly vICMS?: DecimalInput;\n readonly pFCPDif?: DecimalInput;\n readonly vFCPDif?: DecimalInput;\n readonly vFCPEfet?: DecimalInput;\n readonly st?: IcmsSt;\n readonly desoneracao?: Desoneracao<'3' | '9' | '12'>;\n readonly desoneracaoSt?: DesoneracaoSt;\n}\n\n/** Partilha do ICMS entre UF de origem e destino (ICMSPart), CST 10 ou 90 (ou 20). */\nexport interface IcmsPartilha extends Omit<IcmsProprio, 'modBC'> {\n readonly grupo: 'Part';\n readonly orig: Origem;\n readonly CST: '10' | '20' | '90';\n readonly modBC: ModBC;\n readonly pRedBC?: DecimalInput;\n readonly st: IcmsSt;\n /** Percentual da base da operação própria. */\n readonly pBCOp: DecimalInput;\n /** UF para a qual o ICMS-ST é devido. */\n readonly UFST: Uf | 'EX';\n readonly desoneracao?: Desoneracao<'9' | '10' | '11'>;\n}\n\n/** Repasse de ICMS-ST retido anteriormente para a UF de destino (ICMSST), CST 41 ou 60. */\nexport interface IcmsRepasseSt extends IcmsStRetido {\n readonly grupo: 'ST';\n readonly orig: Origem;\n readonly CST: '41' | '60';\n readonly vBCSTRet: DecimalInput;\n readonly vICMSSTRet: DecimalInput;\n readonly vBCSTDest: DecimalInput;\n readonly vICMSSTDest: DecimalInput;\n}\n\n/** Simples Nacional 101: com permissão de crédito. `vCredICMSSN` padrão: valor da operação × pCredSN / 100. */\nexport interface IcmsSn101 extends IcmsBase {\n readonly CSOSN: '101';\n readonly pCredSN: DecimalInput;\n readonly vCredICMSSN?: DecimalInput;\n}\n\n/** Simples Nacional 102, 103, 300, 400. */\nexport interface IcmsSn102 {\n readonly CSOSN: '102' | '103' | '300' | '400';\n readonly orig?: Origem;\n readonly grupo?: undefined;\n}\n\n/** Simples Nacional 201: crédito e ST. */\nexport interface IcmsSn201 extends IcmsBase {\n readonly CSOSN: '201';\n readonly st: IcmsSt;\n readonly pCredSN: DecimalInput;\n readonly vCredICMSSN?: DecimalInput;\n}\n\n/** Simples Nacional 202 e 203: ST sem crédito. */\nexport interface IcmsSn202 extends IcmsBase {\n readonly CSOSN: '202' | '203';\n readonly st: IcmsSt;\n}\n\n/** Simples Nacional 500: cobrado anteriormente. */\nexport interface IcmsSn500 extends IcmsBase, IcmsStRetido {\n readonly CSOSN: '500';\n}\n\n/** Simples Nacional 900: outros. */\nexport interface IcmsSn900 {\n readonly CSOSN: '900';\n readonly orig?: Origem;\n readonly grupo?: undefined;\n readonly modBC?: ModBC;\n readonly vBC?: DecimalInput;\n readonly pRedBC?: DecimalInput;\n readonly pICMS?: DecimalInput;\n readonly vICMS?: DecimalInput;\n readonly st?: IcmsSt;\n readonly pCredSN?: DecimalInput;\n readonly vCredICMSSN?: DecimalInput;\n}\n\n/** Tributação do ICMS do item: um grupo por CST (regime normal) ou CSOSN (Simples Nacional). */\nexport type Icms =\n | Icms00\n | Icms02\n | Icms10\n | Icms15\n | Icms20\n | Icms30\n | Icms40\n | Icms51\n | Icms53\n | Icms60\n | Icms61\n | Icms70\n | Icms90\n | IcmsPartilha\n | IcmsRepasseSt\n | IcmsSn101\n | IcmsSn102\n | IcmsSn201\n | IcmsSn202\n | IcmsSn500\n | IcmsSn900;\n\n/**\n * ICMS de partilha para a UF de destino (NA, EC 87/2015), venda interestadual a não contribuinte. Os valores\n * `vICMSUFDest` e `vFCPUFDest` são obrigatórios: a conta muda entre base única e base dupla conforme a UF de destino, e\n * esse dado não está aqui.\n */\nexport interface IcmsUfDest {\n readonly vBCUFDest: DecimalInput;\n readonly vBCFCPUFDest?: DecimalInput;\n readonly pFCPUFDest?: DecimalInput;\n readonly pICMSUFDest: DecimalInput;\n readonly pICMSInter: '4.00' | '7.00' | '12.00';\n /** Padrão 100 (desde 2019). */\n readonly pICMSInterPart?: DecimalInput;\n readonly vFCPUFDest?: DecimalInput;\n readonly vICMSUFDest: DecimalInput;\n /** Padrão 0 (desde 2019). */\n readonly vICMSUFRemet?: DecimalInput;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// IPI, II, ISSQN, PIS, COFINS\n// ---------------------------------------------------------------------------------------------------------------\n\n/** IPI tributado (O07): por alíquota (`vBC` padrão valor da operação) ou por unidade (`qUnid × vUnid`). */\nexport type IpiTributado = {\n readonly CST: '00' | '49' | '50' | '99';\n readonly vIPI?: DecimalInput;\n} & (\n | { readonly vBC?: DecimalInput; readonly pIPI: DecimalInput; readonly qUnid?: never; readonly vUnid?: never }\n | { readonly qUnid: DecimalInput; readonly vUnid: DecimalInput; readonly vBC?: never; readonly pIPI?: never }\n);\n\n/** IPI não tributado (O08). */\nexport interface IpiNaoTributado {\n readonly CST: '01' | '02' | '03' | '04' | '05' | '51' | '52' | '53' | '54' | '55';\n}\n\nexport type Ipi = (IpiTributado | IpiNaoTributado) & {\n /** Código de enquadramento legal; `999` quando não há. */\n readonly cEnq: string;\n readonly CNPJProd?: string;\n readonly cSelo?: string;\n readonly qSelo?: string;\n};\n\n/** Imposto de importação (grupo P). */\nexport interface ImpostoImportacao {\n readonly vBC: DecimalInput;\n readonly vDespAdu: DecimalInput;\n readonly vII: DecimalInput;\n readonly vIOF: DecimalInput;\n}\n\n/** ISSQN (grupo U), NF-e conjugada. `vISSQN` padrão `vBC × vAliq / 100`. */\nexport interface Issqn {\n readonly vBC: DecimalInput;\n readonly vAliq: DecimalInput;\n readonly vISSQN?: DecimalInput;\n readonly cMunFG: string;\n readonly cListServ: string;\n readonly vDeducao?: DecimalInput;\n readonly vOutro?: DecimalInput;\n readonly vDescIncond?: DecimalInput;\n readonly vDescCond?: DecimalInput;\n readonly vISSRet?: DecimalInput;\n readonly indISS: '1' | '2' | '3' | '4' | '5' | '6' | '7';\n readonly cServico?: string;\n readonly cMun?: string;\n readonly cPais?: string;\n readonly nProcesso?: string;\n readonly indIncentivo: '1' | '2';\n}\n\n/** CSTs de PIS/COFINS do grupo \"outras operações\" (Q05, S05). */\nexport type CstPisCofinsOutras =\n | '49'\n | '50'\n | '51'\n | '52'\n | '53'\n | '54'\n | '55'\n | '56'\n | '60'\n | '61'\n | '62'\n | '63'\n | '64'\n | '65'\n | '66'\n | '67'\n | '70'\n | '71'\n | '72'\n | '73'\n | '74'\n | '75'\n | '98'\n | '99';\n\n/**\n * PIS ou COFINS (grupos Q e S), com a mesma forma. `vBC` é obrigatório: a base legal varia (exclusão do ICMS, receita\n * bruta, regime) e não há padrão seguro. O valor (`valor`) padrão é `vBC × aliquota / 100` ou `qBCProd × vAliqProd`.\n */\nexport type PisCofins =\n | {\n readonly CST: '01' | '02';\n readonly vBC: DecimalInput;\n readonly aliquota: DecimalInput;\n readonly valor?: DecimalInput;\n }\n | {\n readonly CST: '03';\n readonly qBCProd: DecimalInput;\n readonly vAliqProd: DecimalInput;\n readonly valor?: DecimalInput;\n }\n | { readonly CST: '04' | '05' | '06' | '07' | '08' | '09' }\n | {\n readonly CST: CstPisCofinsOutras;\n readonly vBC: DecimalInput;\n readonly aliquota: DecimalInput;\n readonly valor?: DecimalInput;\n readonly qBCProd?: never;\n }\n | {\n readonly CST: CstPisCofinsOutras;\n readonly qBCProd: DecimalInput;\n readonly vAliqProd: DecimalInput;\n readonly valor?: DecimalInput;\n readonly vBC?: never;\n };\n\n/** PIS ou COFINS ST (grupos R e T). `indSoma` 1: o valor compõe o total da nota. */\nexport type PisCofinsSt = {\n readonly valor?: DecimalInput;\n readonly indSoma?: '0' | '1';\n} & (\n | { readonly vBC: DecimalInput; readonly aliquota: DecimalInput; readonly qBCProd?: never }\n | { readonly qBCProd: DecimalInput; readonly vAliqProd: DecimalInput; readonly vBC?: never }\n);\n\n// ---------------------------------------------------------------------------------------------------------------\n// IBS / CBS\n// ---------------------------------------------------------------------------------------------------------------\n\n/**\n * Classificação do item para IBS/CBS (NT 2025.002): o que o `CalculadoraIbsCbs` recebe. `CST` e `cClassTrib` vêm do\n * cadastro do item (tabela de classificação tributária); o cálculo, as alíquotas e as reduções são da calculadora.\n */\nexport interface ClassificacaoIbsCbs {\n /** CST do IBS/CBS, 3 dígitos. */\n readonly CST: string;\n /** Código de classificação tributária, 6 dígitos. */\n readonly cClassTrib: string;\n /** Base de cálculo; padrão: o valor que a calculadora devolver. */\n readonly vBC?: DecimalInput;\n readonly indDoacao?: '1';\n /** Código do crédito presumido (`cCredPres`), quando o `cClassTrib` indica. */\n readonly cCredPres?: string;\n /**\n * Tributação regular (`gTribRegular`, UB68): CST e cClassTrib que valeriam sem o tratamento do `cClassTrib`\n * principal. Obrigatória nos que a exigem (suspensão, exportação: 550001 e afins); a calculadora devolve o grupo com\n * as alíquotas e os valores da tributação regular.\n */\n readonly gTribRegular?: { readonly CSTReg: string; readonly cClassTribReg: string };\n}\n\n/**\n * IBS/CBS do item: pela classificação (a calculadora injetada devolve o grupo) ou já calculado (grupo do schema\n * pronto, por exemplo vindo de outro sistema).\n */\nexport type IbsCbsItem =\n | { readonly classificacao: ClassificacaoIbsCbs; readonly grupo?: never }\n | { readonly grupo: TTribNFe; readonly classificacao?: never };\n\n/** Tributos do item (grupo M). ICMS ou ISSQN, exclusivos; o resto conforme a operação. */\nexport interface ImpostosItem {\n /** Lei 12.741/2012: valor aproximado dos tributos. */\n readonly vTotTrib?: DecimalInput;\n readonly icms?: Icms;\n readonly ipi?: Ipi;\n readonly ii?: ImpostoImportacao;\n readonly issqn?: Issqn;\n readonly pis?: PisCofins;\n readonly pisSt?: PisCofinsSt;\n readonly cofins?: PisCofins;\n readonly cofinsSt?: PisCofinsSt;\n readonly icmsUfDest?: IcmsUfDest;\n /** Imposto Seletivo, repassado como veio (sem cálculo nesta versão). */\n readonly is?: TIS;\n readonly ibsCbs?: IbsCbsItem;\n}\n\n/** Item da nota (grupo H). */\nexport interface Item {\n readonly produto: Produto;\n readonly impostos: ImpostosItem;\n /** Devolução: percentual devolvido e IPI devolvido (grupo UA). */\n readonly impostoDevol?: { readonly pDevol: DecimalInput; readonly vIPIDevol: DecimalInput };\n readonly infAdProd?: string;\n readonly obsItem?: TNFe_infNFe_det_obsItem;\n /** Referência a item de outro DF-e (grupo VC, NT 2025.002). */\n readonly DFeReferenciado?: { readonly chaveAcesso: string; readonly nItem?: string | number };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Transporte, cobrança, pagamento, informações adicionais\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Modalidade do frete (X02): 0 CIF; 1 FOB; 2 terceiros; 3 próprio do remetente; 4 próprio do destinatário; 9 sem frete. */\nexport type ModFrete = '0' | '1' | '2' | '3' | '4' | '9';\n\nexport interface Transportador {\n readonly CNPJ?: string;\n readonly CPF?: string;\n readonly xNome?: string;\n /** IE ou `ISENTO` (RV X07-20). */\n readonly IE?: string;\n readonly xEnder?: string;\n readonly xMun?: string;\n readonly UF?: Uf | 'EX';\n}\n\nexport interface Volume {\n readonly qVol?: string | number;\n readonly esp?: string;\n readonly marca?: string;\n readonly nVol?: string;\n /** Peso líquido em kg, 3 casas. */\n readonly pesoL?: DecimalInput;\n readonly pesoB?: DecimalInput;\n readonly lacres?: readonly string[];\n}\n\n/** Transporte (grupo X). */\nexport interface Transporte {\n readonly modFrete: ModFrete;\n readonly transportador?: Transportador;\n /** Retenção do ICMS do transporte; `vICMSRet` padrão `vBCRet × pICMSRet / 100`. */\n readonly retTransp?: {\n readonly vServ: DecimalInput;\n readonly vBCRet: DecimalInput;\n readonly pICMSRet: DecimalInput;\n readonly vICMSRet?: DecimalInput;\n readonly CFOP: string;\n readonly cMunFG: string;\n };\n readonly veicTransp?: TVeiculo;\n readonly reboque?: readonly TVeiculo[];\n readonly vagao?: string;\n readonly balsa?: string;\n readonly volumes?: readonly Volume[];\n}\n\n/** Cobrança (grupo Y). `fat.vLiq` padrão `vOrig - vDesc`. */\nexport interface Cobranca {\n readonly fatura?: {\n readonly nFat?: string;\n readonly vOrig?: DecimalInput;\n readonly vDesc?: DecimalInput;\n readonly vLiq?: DecimalInput;\n };\n readonly duplicatas?: readonly {\n /** Padrão: sequência com 3 dígitos (`001`, `002`), como pede a NT 2016.002. */\n readonly nDup?: string;\n /** `AAAA-MM-DD`. */\n readonly dVenc?: string;\n readonly vDup: DecimalInput;\n }[];\n}\n\n/** Meio de pagamento (YA02, NT 2020.006 e seguintes). */\nexport const TipoPagamento: {\n readonly DINHEIRO: '01';\n readonly CHEQUE: '02';\n readonly CARTAO_CREDITO: '03';\n readonly CARTAO_DEBITO: '04';\n readonly CREDITO_LOJA: '05';\n readonly VALE_ALIMENTACAO: '10';\n readonly VALE_REFEICAO: '11';\n readonly VALE_PRESENTE: '12';\n readonly VALE_COMBUSTIVEL: '13';\n readonly BOLETO: '15';\n readonly DEPOSITO: '16';\n readonly PIX_DINAMICO: '17';\n readonly TRANSFERENCIA_CARTEIRA_DIGITAL: '18';\n readonly FIDELIDADE_CASHBACK: '19';\n readonly PIX_ESTATICO: '20';\n readonly CREDITO_EM_LOJA: '21';\n readonly FALHA_HARDWARE: '22';\n readonly SEM_PAGAMENTO: '90';\n /** Pagamento posterior, com `vPag` zero (NT 2025.001 v1.03, YA02 e YA03-30). */\n readonly PAGAMENTO_POSTERIOR: '91';\n readonly OUTROS: '99';\n} = {\n DINHEIRO: '01',\n CHEQUE: '02',\n CARTAO_CREDITO: '03',\n CARTAO_DEBITO: '04',\n CREDITO_LOJA: '05',\n VALE_ALIMENTACAO: '10',\n VALE_REFEICAO: '11',\n VALE_PRESENTE: '12',\n VALE_COMBUSTIVEL: '13',\n BOLETO: '15',\n DEPOSITO: '16',\n PIX_DINAMICO: '17',\n TRANSFERENCIA_CARTEIRA_DIGITAL: '18',\n FIDELIDADE_CASHBACK: '19',\n PIX_ESTATICO: '20',\n CREDITO_EM_LOJA: '21',\n FALHA_HARDWARE: '22',\n SEM_PAGAMENTO: '90',\n PAGAMENTO_POSTERIOR: '91',\n OUTROS: '99',\n};\n\nexport type TipoPagamento = (typeof TipoPagamento)[keyof typeof TipoPagamento];\n\nexport interface DetalhePagamento {\n readonly indPag?: '0' | '1';\n readonly tPag: TipoPagamento;\n /** Descrição do meio de pagamento; recomendada com `tPag` 99. */\n readonly xPag?: string;\n readonly vPag: DecimalInput;\n /** `AAAA-MM-DD`. */\n readonly dPag?: string;\n readonly CNPJPag?: string;\n readonly UFPag?: Uf;\n readonly card?: TNFe_infNFe_pag_detPag_card;\n}\n\n/** Pagamento (grupo YA). Ausente, o builder informa `tPag` 90 (sem pagamento) com valor zero. */\nexport interface Pagamento {\n readonly detPag: readonly DetalhePagamento[];\n readonly vTroco?: DecimalInput;\n}\n\n/** Informações adicionais (grupo Z). */\nexport interface InformacoesAdicionais {\n readonly infAdFisco?: string;\n readonly infCpl?: string;\n readonly obsCont?: readonly TNFe_infNFe_infAdic_obsCont[];\n readonly obsFisco?: readonly TNFe_infNFe_infAdic_obsFisco[];\n readonly procRef?: readonly TNFe_infNFe_infAdic_procRef[];\n}\n\n/**\n * Responsável técnico (grupo ZD, NT 2018.005). O `hashCSRT` é calculado pelo builder a partir do CSRT (nunca vai para o\n * XML): Base64(SHA-1(CSRT + chave de acesso)).\n */\nexport interface ResponsavelTecnico {\n readonly CNPJ: string;\n readonly xContato: string;\n readonly email: string;\n readonly fone: string;\n /** CSRT fornecido pela SEFAZ da UF e seu identificador (`idCSRT`, 2 dígitos). */\n readonly csrt?: { readonly idCSRT: string; readonly CSRT: string };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Identificação e contingência\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Finalidade (B25): 1 normal; 2 complementar; 3 ajuste; 4 devolução; 5 nota de crédito; 6 nota de débito. */\nexport type FinNFe = '1' | '2' | '3' | '4' | '5' | '6';\n\n/**\n * Forma de emissão (B22) fora do normal. A contingência SVC usa o autorizador SVC-AN ou SVC-RS da UF (dado do\n * `@sinete/transport`); FS-DA e EPEC (4 e 5) ficam para outra versão, mas o modelo já os comporta. A NFC-e não tem SVC:\n * a contingência dela é a off-line (9), emitida sem a SEFAZ e transmitida depois.\n */\nexport interface Contingencia {\n /**\n * 6 SVC-AN, 7 SVC-RS; 2 FS-IA; 4 EPEC; 5 FS-DA; 9 off-line, só NFC-e. Para SVC, `tpEmisSvc` do `ClienteNfe` escolhe pelo\n * dado da UF.\n */\n readonly tpEmis: '2' | '4' | '5' | '6' | '7' | '9';\n /** Entrada em contingência (`dhCont`). Instante com fuso. */\n readonly dhCont: Instante;\n /** Justificativa, 15 a 256 caracteres. */\n readonly xJust: string;\n}\n\n/** Entrada completa de uma NF-e. */\nexport interface DadosNfe {\n /**\n * 55 (NF-e, padrão) ou 65 (NFC-e). Na NFC-e mudam os padrões (`indPres` 1, `indFinal` 1, `tpImp` 4), o destinatário\n * fica opcional, o pagamento passa a ser obrigatório e a montagem acrescenta o `infNFeSupl` (QR Code).\n */\n readonly modelo?: '55' | '65';\n /** 0 a 999; produtor rural pessoa física: 920 a 969. */\n readonly serie: number | string;\n readonly nNF: number | string;\n readonly natOp: string;\n /** 0 entrada; 1 saída. */\n readonly tpNF: '0' | '1';\n /** Padrão `'1'`. */\n readonly finNFe?: FinNFe;\n readonly tpNFDebito?: '01' | '02' | '03' | '04' | '05' | '06' | '07' | '08';\n readonly tpNFCredito?: '01' | '02' | '03' | '04' | '05' | '06';\n /** Padrão: 3 com destinatário estrangeiro, 2 com UF de destino diferente da do emitente, 1 nos demais casos. */\n readonly idDest?: '1' | '2' | '3';\n /** Padrão: 1 na NFC-e e quando o destinatário é não contribuinte (`indIEDest` 9), 0 nos demais. */\n readonly indFinal?: '0' | '1';\n /** Padrão `'9'` (não presencial, outros) na NF-e e `'1'` (presencial) na NFC-e. */\n readonly indPres?: '0' | '1' | '2' | '3' | '4' | '5' | '9';\n readonly indIntermed?: '0' | '1';\n /** Município do fato gerador; padrão o do emitente. */\n readonly cMunFG?: string;\n readonly cMunFGIBS?: string;\n /** Padrão `'1'` (DANFE retrato) na NF-e e `'4'` (DANFC-e impresso) na NFC-e. */\n readonly tpImp?: '0' | '1' | '2' | '3' | '4' | '5' | '6';\n /** Saída ou entrada da mercadoria. */\n readonly dhSaiEnt?: Instante;\n /** `AAAA-MM-DD`. */\n readonly dPrevEntrega?: string;\n /** Código numérico da chave; padrão aleatório (8 dígitos, fora das sequências proibidas). */\n readonly cNF?: string;\n readonly contingencia?: Contingencia;\n readonly referenciadas?: readonly Referenciada[];\n readonly gCompraGov?: {\n readonly tpEnteGov: '1' | '2' | '3' | '4' | '5' | '6';\n readonly pRedutor: DecimalInput;\n readonly tpOperGov: '1' | '2' | '3' | '4';\n readonly refDFeAnt?: readonly string[];\n };\n readonly gPagAntecipado?: readonly string[];\n readonly emitente: Emitente;\n readonly destinatario?: Destinatario;\n readonly retirada?: Local;\n readonly entrega?: Local;\n /** Até 10 CNPJ/CPF autorizados a baixar o XML. */\n readonly autXML?: readonly DocumentoPessoa[];\n readonly itens: readonly Item[];\n readonly transporte?: Transporte;\n readonly cobranca?: Cobranca;\n readonly pagamento?: Pagamento;\n readonly infIntermed?: TNFe_infNFe_infIntermed;\n readonly informacoesAdicionais?: InformacoesAdicionais;\n readonly exporta?: TNFe_infNFe_exporta;\n readonly compra?: TNFe_infNFe_compra;\n readonly cana?: TNFe_infNFe_cana;\n readonly respTec?: ResponsavelTecnico;\n /** Produtor rural: receituário de agrotóxico ou guia de trânsito (GTA e afins), grupo ZF (NT 2024.003). */\n readonly agropecuario?: TNFe_infNFe_agropecuario;\n}\n\n/** Os tipos do schema reexportados para quem passa grupos repassados. */\nexport type { TCIBS_NFe, TMonofasia, TTribNFe };\n",
22
22
  "/**\n * Rótulo em português do caminho de uma ocorrência da NF-e (ADR 0011), para mostrar a quem preencheu a nota: `Item 2,\n * Descrição do produto` em vez de `itens[1].produto.xProd`. Aceita os caminhos da entrada (`DadosNfe`) e os do\n * documento montado, tanto os das conferências do montador (`infNFe.det[1].prod.xProd`) quanto os do validador de XSD\n * (`/infNFe/det[2]/prod/xProd`).\n */\n\nimport type { GrupoDeCaminho } from '@sinete/core';\nimport { criarRotuloDoCaminho } from '@sinete/core';\n\nconst item =\n (prefixo: string) =>\n (n: number): string =>\n `${prefixo} ${n}`;\n\n/** Do mais específico ao mais geral. Os índices chegam somados de um. */\nconst GRUPOS: readonly GrupoDeCaminho[] = [\n // Entrada (DadosNfe)\n { padrao: /^emitente\\b/, rotulo: 'Emitente' },\n { padrao: /^destinatario\\b/, rotulo: 'Destinatário' },\n { padrao: /^retirada\\b/, rotulo: 'Local de retirada' },\n { padrao: /^entrega\\b/, rotulo: 'Local de entrega' },\n { padrao: /^autXML\\b/, rotulo: 'Autorizados a baixar o XML' },\n { padrao: /^referenciadas\\b/, rotulo: 'Nota referenciada' },\n { padrao: /^itens\\[(\\d+)\\]\\.impostos\\.icms\\b/, rotulo: item('ICMS do item') },\n { padrao: /^itens\\[(\\d+)\\]\\.impostos\\.ibsCbs\\b/, rotulo: item('IBS/CBS do item') },\n { padrao: /^itens\\[(\\d+)\\]\\.impostos\\b/, rotulo: item('Impostos do item') },\n { padrao: /^itens\\[(\\d+)\\]/, rotulo: item('Item') },\n { padrao: /^itens\\b/, rotulo: 'Itens' },\n { padrao: /^transporte\\b/, rotulo: 'Transporte' },\n { padrao: /^cobranca\\b/, rotulo: 'Cobrança' },\n { padrao: /^pagamento\\b/, rotulo: 'Pagamento' },\n { padrao: /^informacoesAdicionais\\b/, rotulo: 'Informações adicionais' },\n { padrao: /^agropecuario\\b/, rotulo: 'Produtos agropecuários' },\n { padrao: /^respTec\\b/, rotulo: 'Responsável técnico' },\n { padrao: /^contingencia\\b/, rotulo: 'Contingência' },\n { padrao: /^gCompraGov\\b/, rotulo: 'Compra governamental' },\n { padrao: /^exporta\\b/, rotulo: 'Exportação' },\n // Opções da montagem da NFC-e (qrCode, urlQrCode, urlChave) e o infNFeSupl montado\n { padrao: /^(?:qrCode|urlQrCode|urlChave)\\b/, rotulo: 'QR Code da NFC-e' },\n { padrao: /^(?:NFe\\.)?infNFeSupl\\b/, rotulo: 'QR Code da NFC-e' },\n // Documento montado (infNFe)\n { padrao: /^infNFe\\.ide\\.NFref\\b/, rotulo: 'Nota referenciada' },\n { padrao: /^infNFe\\.ide\\b/, rotulo: 'Identificação da nota' },\n { padrao: /^infNFe\\.emit\\b/, rotulo: 'Emitente' },\n { padrao: /^infNFe\\.dest\\b/, rotulo: 'Destinatário' },\n { padrao: /^infNFe\\.retirada\\b/, rotulo: 'Local de retirada' },\n { padrao: /^infNFe\\.entrega\\b/, rotulo: 'Local de entrega' },\n { padrao: /^infNFe\\.autXML\\b/, rotulo: 'Autorizados a baixar o XML' },\n { padrao: /^infNFe\\.det(?:\\[(\\d+)\\])?\\.imposto\\.ICMS\\b/, rotulo: item('ICMS do item') },\n { padrao: /^infNFe\\.det(?:\\[(\\d+)\\])?\\.imposto\\.IBSCBS\\b/, rotulo: item('IBS/CBS do item') },\n { padrao: /^infNFe\\.det(?:\\[(\\d+)\\])?\\.imposto\\b/, rotulo: item('Impostos do item') },\n { padrao: /^infNFe\\.det(?:\\[(\\d+)\\])?/, rotulo: item('Item') },\n { padrao: /^infNFe\\.total\\b/, rotulo: 'Totais da nota' },\n { padrao: /^infNFe\\.transp\\b/, rotulo: 'Transporte' },\n { padrao: /^infNFe\\.cobr\\b/, rotulo: 'Cobrança' },\n { padrao: /^infNFe\\.pag\\b/, rotulo: 'Pagamento' },\n { padrao: /^infNFe\\.infAdic\\b/, rotulo: 'Informações adicionais' },\n { padrao: /^infNFe\\.agropecuario\\b/, rotulo: 'Produtos agropecuários' },\n { padrao: /^infNFe\\.infRespTec\\b/, rotulo: 'Responsável técnico' },\n { padrao: /^infNFe\\.exporta\\b/, rotulo: 'Exportação' },\n];\n\n/** Campos pelo nome do leiaute (os mesmos na entrada e no XML). */\nconst CAMPOS: Readonly<Record<string, string>> = {\n IE: 'Inscrição estadual',\n IEST: 'Inscrição estadual do substituto tributário',\n IM: 'Inscrição municipal',\n CNPJ: 'CNPJ',\n CPF: 'CPF',\n idEstrangeiro: 'Identificação do estrangeiro',\n xNome: 'Nome',\n xFant: 'Nome fantasia',\n xLgr: 'Logradouro',\n nro: 'Número',\n xCpl: 'Complemento',\n xBairro: 'Bairro',\n cMun: 'Município',\n xMun: 'Município',\n UF: 'UF',\n CEP: 'CEP',\n fone: 'Telefone',\n email: 'E-mail',\n natOp: 'Natureza da operação',\n serie: 'Série',\n nNF: 'Número da nota',\n cProd: 'Código do produto',\n cEAN: 'GTIN',\n cEANTrib: 'GTIN da unidade tributável',\n xProd: 'Descrição do produto',\n NCM: 'NCM',\n CEST: 'CEST',\n cBenef: 'Código de benefício fiscal',\n CFOP: 'CFOP',\n uCom: 'Unidade comercial',\n qCom: 'Quantidade comercial',\n vUnCom: 'Valor unitário comercial',\n uTrib: 'Unidade tributável',\n qTrib: 'Quantidade tributável',\n vUnTrib: 'Valor unitário tributável',\n vProd: 'Valor do produto',\n vDesc: 'Desconto',\n vFrete: 'Frete',\n vSeg: 'Seguro',\n vOutro: 'Outras despesas',\n CST: 'CST',\n CSOSN: 'CSOSN',\n cClassTrib: 'Classificação tributária (cClassTrib)',\n vBC: 'Base de cálculo',\n refNFe: 'Chave da NF-e referenciada',\n refNFP: 'Nota de produtor referenciada',\n AAMM: 'Mês de emissão da nota referenciada',\n modFrete: 'Modalidade do frete',\n placa: 'Placa',\n RNTC: 'RNTC',\n tPag: 'Meio de pagamento',\n vPag: 'Valor do pagamento',\n vTroco: 'Troco',\n card: 'Cartão',\n CSC: 'CSC',\n idCSC: 'Identificador do CSC',\n versao: 'Versão',\n xJust: 'Justificativa',\n dhCont: 'Entrada em contingência',\n infCpl: 'Informações complementares',\n infAdFisco: 'Informações de interesse do fisco',\n};\n\nconst rotular = criarRotuloDoCaminho({ grupos: GRUPOS, campos: CAMPOS, padrao: 'Dados da NF-e' });\n\n/**\n * Rótulo em português do caminho de uma ocorrência da NF-e: `Grupo, Campo` quando os dois são conhecidos (`Emitente,\n * Inscrição estadual`), só um deles quando falta o outro, e `Dados da NF-e` quando nenhum é.\n */\nexport function rotuloDoCaminho(caminho: string): string {\n return rotular(caminho);\n}\n",
23
- "/**\n * Serviços da NF-e 4.00 sobre o `@sinete/transport` e a assinatura do `@sinete/core/xml`: status, autorização síncrona e\n * assíncrona (recibo e consulta do recibo com política de espera), consulta protocolo, eventos (cancelamento,\n * cancelamento por substituição, CC-e, manifestação do destinatário no AN), inutilização, consulta cadastro e\n * Distribuição DF-e. Contingência SVC por dado: o autorizador SVC-AN ou SVC-RS de cada UF vem do `@sinete/transport`.\n *\n * Todo desfecho que chega a uma resposta da SEFAZ é um `ResultadoSefaz` do core (autorizado, rejeitado, denegado,\n * pendente), com a dica do `@sinete/rejeicoes` na rejeição. Os documentos processados (`nfeProc`, `procEventoNFe`,\n * `ProcInutNFe`) são montados por splice: o XML assinado entra byte a byte, o protocolo entra como fatia da resposta.\n *\n * Idempotência da autorização (MOC 7.0, Visão Geral; RV de duplicidade 204 e 539): grave o XML assinado antes de\n * enviar; se o envio ficar sem resposta (timeout, conexão caída), nunca gere outro `cNF` nem outro `dhEmi` para o mesmo\n * número. Consulte a chave (`resolverEnvioSemResposta`) e, se ela não constar, reenvie exatamente os mesmos bytes.\n */\n\nimport type { Ambiente, Assinador, CUf, Logger, Relogio, ResultadoSefaz, Uf } from '@sinete/core';\nimport {\n criarAutorizado,\n criarDenegado,\n criarPendente,\n ErroDeConfiguracao,\n ErroDeValidacao,\n ErroRespostaInvalida,\n loggerSilencioso,\n tpAmbDoAmbiente,\n ufPorCUf,\n ufPorSigla,\n} from '@sinete/core';\nimport type { DocumentoXml, ElementoXml } from '@sinete/core/xml';\nimport { assinarXml, elementosFilhos, lerXml, primeiroFilho, textoDe } from '@sinete/core/xml';\nimport type { ComplexType, OcorrenciaSchema } from '@sinete/schemas';\nimport { decodificar, decodificarXml, serializar, serializarRaiz, validar } from '@sinete/schemas';\nimport type { TRetConsCad_infCons_infCad } from '@sinete/schemas/nfe/consulta-cadastro/PL_010d';\nimport { ConsCadElement, TRetConsCad } from '@sinete/schemas/nfe/consulta-cadastro/PL_010d';\nimport { consSitNFeElement, TProtNFe, TRetConsSitNFe } from '@sinete/schemas/nfe/consulta-protocolo/PL_010d';\nimport type { distDFeInt, resEvento, resNFe } from '@sinete/schemas/nfe/dist-dfe/PL_NFeDistDFe_104';\nimport {\n distDFeIntElement,\n resEventoElement,\n resNFeElement,\n retDistDFeInt,\n} from '@sinete/schemas/nfe/dist-dfe/PL_NFeDistDFe_104';\nimport { TEvento_infEvento as TEventoCanc, TRetEnvEvento } from '@sinete/schemas/nfe/evento-cancelamento/PL_010d';\nimport type { TEvento_infEvento_detEvento as DetCancSubst } from '@sinete/schemas/nfe/evento-cancelamento-substituicao/PL_010d';\nimport { TEvento_infEvento as TEventoCancSubst } from '@sinete/schemas/nfe/evento-cancelamento-substituicao/PL_010d';\nimport type { TEvento_infEvento_detEvento as DetCce } from '@sinete/schemas/nfe/evento-cce/PL_010d';\nimport { TEvento_infEvento as TEventoCce } from '@sinete/schemas/nfe/evento-cce/PL_010d';\nimport { TEvento_infEvento as TEventoCiencia } from '@sinete/schemas/nfe/evento-ciencia-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoConfirmacao } from '@sinete/schemas/nfe/evento-confirmacao-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoDesconhecimento } from '@sinete/schemas/nfe/evento-desconhecimento-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoNaoRealizada } from '@sinete/schemas/nfe/evento-operacao-nao-realizada/PL_010d';\nimport { TInutNFe_infInut, TRetInutNFe } from '@sinete/schemas/nfe/inutilizacao/PL_010d';\nimport { TRetConsReciNFe, TRetEnviNFe } from '@sinete/schemas/nfe/PL_010f';\nimport { consStatServElement, TRetConsStatServ } from '@sinete/schemas/nfe/status-servico/PL_009q';\nimport type { EndpointResolvido, NfeServico, Transporte } from '@sinete/transport';\nimport { nfceEndpoint, nfeContingenciaDaUf, nfeEndpoint } from '@sinete/transport';\nimport type { ChaveAcesso } from '@sinete/validators';\nimport { lerChaveAcesso, lerCnpj, lerCpf } from '@sinete/validators';\nimport { deslocamentoDaUf, formatarDh } from '../time.ts';\nimport { descomprimirGzipBase64 } from './gzip.ts';\nimport { cstatEm, rejeitado } from './outcome.ts';\nimport type { DocumentoAssinado } from './proc.ts';\nimport { documentoAssinado, envelope, NFE_NS, recortarElemento } from './proc.ts';\nimport type { RespostaSoap } from './soap.ts';\nimport { chamar } from './soap.ts';\n\n// ---------------------------------------------------------------------------------------------------------------\n// Configuração\n// ---------------------------------------------------------------------------------------------------------------\n\n/** CNPJ ou CPF de quem assina um evento ou consulta a distribuição. */\nexport type AutorDocumento =\n | { readonly CNPJ: string; readonly CPF?: never }\n | { readonly CPF: string; readonly CNPJ?: never };\n\n/** Espera injetável (testes passam uma que não dorme). */\nexport type Espera = (ms: number, signal?: AbortSignal) => Promise<void>;\n\nexport interface ClienteNfeOpcoes {\n readonly transporte: Transporte;\n /** Assina NF-e, eventos e inutilização (A1 WebCrypto, A3 via PKCS#11, HSM). */\n readonly assinador: Assinador;\n readonly ambiente: Ambiente;\n /**\n * UF dos serviços que não partem de um documento: status do serviço, inutilização, recibo consultado sem a NF-e,\n * `cUFAutor` padrão da distribuição e fuso da manifestação. Autorização, consulta, recibo com a NF-e e eventos da\n * própria nota vão ao autorizador da chave (cUF e tpEmis), seja qual for esta UF; sem ela, os serviços que precisam\n * dela lançam `ErroDeConfiguracao`.\n */\n readonly uf?: Uf;\n /** Relógio de emissão: `dhEvento`, número do lote. */\n readonly relogio: Relogio;\n readonly logger?: Logger;\n /** Prazo por requisição; padrão o do transporte. */\n readonly timeoutMs?: number;\n /** Fuso do emitente em minutos; padrão o da UF da chave nos eventos e o de `uf` na manifestação (`data/fusos.json`). */\n readonly deslocamentoMin?: number;\n /**\n * `svc`: o status do serviço e o recibo consultado sem a NF-e vão ao SVC-AN ou SVC-RS de `uf`. Não vale para o que\n * parte de um documento: a NF-e assinada em SVC (tpEmis 6 ou 7, na chave) vai ao SVC que a chave diz, e a assinada\n * fora dele vai à UF, com ou sem esta opção.\n */\n readonly contingencia?: 'svc';\n /** CNPJ ou CPF do titular do certificado: autor da manifestação, interessado da distribuição, emitente da inutilização. */\n readonly autor?: AutorDocumento;\n readonly esperar?: Espera;\n /**\n * Sobrepõe o endpoint da NFC-e (modelo 65) por serviço e UF. Sem ela, vale a tabela da NFC-e do `@sinete/transport`\n * (`nfceEndpoint`), que em várias UFs (SP, MG, PR, RS, SVRS) é outro host que o da NF-e. A NFC-e não tem SVC: com\n * `contingencia: 'svc'`, o documento modelo 65 continua indo ao autorizador normal da NFC-e.\n */\n readonly endpointNfce?: (servico: NfeServico, uf: Uf) => EndpointResolvido;\n /** Gerador de `idLote` (até 15 dígitos); padrão: os milissegundos do relógio. */\n readonly idLote?: () => string;\n}\n\n/** Opções de toda chamada que vai à rede. */\nexport interface EnvioOpcoes {\n /** Cancela a requisição em curso. */\n readonly signal?: AbortSignal;\n}\n\n/** Opções da consulta de um recibo. */\nexport interface ConsultaReciboOpcoes extends EnvioOpcoes {\n /**\n * Modelo do lote, para escolher o serviço (NFC-e vai pelo `nfceEndpoint`). Com a NF-e assinada o modelo vem da\n * chave e este campo, se vier, tem de bater; sem ela, é obrigatório para NFC-e e o padrão é 55.\n */\n readonly mod?: '55' | '65';\n}\n\n/** Política de consulta do recibo (autorização assíncrona). */\nexport interface PoliticaRecibo extends ConsultaReciboOpcoes {\n /** Consultas no máximo. Padrão 10. */\n readonly maxTentativas?: number;\n /** Espera antes da primeira consulta e mínima entre consultas. Padrão 2 000 ms (o MOC pede aguardar o tMed). */\n readonly esperaMinimaMs?: number;\n /** Fator de crescimento da espera. Padrão 1,5. */\n readonly multiplicador?: number;\n /** Teto da espera. Padrão 30 000 ms. */\n readonly esperaMaximaMs?: number;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Valores dos desfechos\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Status do serviço (cStat 107). */\nexport interface StatusServico {\n readonly cUF: string;\n readonly verAplic: string;\n readonly dhRecbto: string;\n /** Tempo médio de resposta, em segundos. */\n readonly tMed?: string;\n readonly dhRetorno?: string;\n readonly xObs?: string;\n}\n\n/** Protocolo de uma NF-e (autorização ou denegação). */\nexport interface ProtocoloNfe {\n readonly chNFe: string;\n readonly cStat: string;\n readonly xMotivo: string;\n readonly nProt?: string;\n readonly dhRecbto: string;\n readonly digVal?: string;\n readonly verAplic: string;\n /** `protNFe` como veio na resposta (fatia do texto). */\n readonly protNFe: string;\n /**\n * `nfeProc` com a NF-e assinada byte a byte e o `protNFe`; presente quando a NF-e assinada é conhecida e o `digVal`\n * do protocolo confere com o DigestValue dela.\n */\n readonly nfeProc?: string;\n}\n\n/** Desfecho da autorização: autorizada, denegada (número consumido), rejeitada ou pendente (recibo em `referencia`). */\nexport type ResultadoAutorizacao = ResultadoSefaz<ProtocoloNfe, ProtocoloNfe>;\n\n/** Situação da NF-e na consulta protocolo. */\nexport interface ConsultaNfe {\n readonly chNFe: string;\n readonly situacao: 'autorizada' | 'cancelada' | 'denegada';\n readonly protocolo?: ProtocoloNfe;\n /** `procEventoNFe` devolvidos, como fatias da resposta. */\n readonly eventos: readonly string[];\n /** Com a NF-e assinada dada: o `digVal` do protocolo é o DigestValue dela. */\n readonly digValConfere?: boolean;\n}\n\nexport type ResultadoConsulta = ResultadoSefaz<ConsultaNfe, ConsultaNfe>;\n\n/** Evento registrado (cStat 135, 136 ou 155). */\nexport interface EventoRegistrado {\n readonly chNFe: string;\n readonly tpEvento: string;\n readonly nSeqEvento: string;\n readonly nProt?: string;\n readonly dhRegEvento: string;\n /** `retEvento` como veio na resposta. */\n readonly retEvento: string;\n /** Evento assinado + `retEvento`. */\n readonly procEventoNFe: string;\n}\n\nexport type ResultadoEvento = ResultadoSefaz<EventoRegistrado, never>;\n\n/** Inutilização homologada (cStat 102). */\nexport interface Inutilizacao {\n readonly nProt?: string;\n readonly dhRecbto: string;\n readonly retInutNFe: string;\n readonly procInutNFe: string;\n}\n\nexport type ResultadoInutilizacao = ResultadoSefaz<Inutilizacao, never>;\n\nexport interface Cadastro {\n readonly UF: string;\n readonly dhCons: string;\n readonly infCad: readonly TRetConsCad_infCons_infCad[];\n}\n\n/** Documento devolvido pela Distribuição DF-e, já descompactado. */\nexport interface DocumentoDistribuido {\n readonly NSU: string;\n /** Schema que o AN informa (`resNFe_v1.01.xsd`, `procNFe_v4.00.xsd`...). */\n readonly schema: string;\n readonly tipo: 'resNFe' | 'resEvento' | 'procNFe' | 'procEventoNFe' | 'outro';\n /** XML como veio dentro do gzip. Guarde este texto; não reserialize. */\n readonly xml: string;\n readonly resNFe?: resNFe;\n readonly resEvento?: resEvento;\n}\n\nexport interface Distribuicao {\n readonly ultNSU: string;\n readonly maxNSU: string;\n readonly dhResp: string;\n readonly documentos: readonly DocumentoDistribuido[];\n}\n\nexport type ManifestacaoTipo = 'ciencia' | 'confirmacao' | 'desconhecimento' | 'nao-realizada';\n\nexport interface AutorizarOpcoes extends EnvioOpcoes {\n /** `indSinc` 1 (padrão) ou 0 (lote assíncrono com recibo). */\n readonly sincrono?: boolean;\n}\n\n/** Opções do status do serviço. */\nexport interface StatusServicoOpcoes extends EnvioOpcoes {\n /** `65` consulta o autorizador da NFC-e. Padrão 55. */\n readonly mod?: '55' | '65';\n}\n\nexport interface CancelamentoPedido {\n readonly chave: string;\n readonly nProt: string;\n readonly xJust: string;\n /** Padrão: o CNPJ ou CPF do emitente na chave. */\n readonly autor?: AutorDocumento;\n}\n\nexport interface CancelamentoSubstituicaoPedido {\n readonly chave: string;\n readonly nProt: string;\n readonly xJust: string;\n /** Chave da NFC-e que substitui a cancelada. */\n readonly chNFeRef: string;\n readonly cOrgaoAutor: string;\n readonly tpAutor?: '1';\n readonly verAplic: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface CartaCorrecaoPedido {\n readonly chave: string;\n readonly xCorrecao: string;\n /** 1 a 20; cada CC-e nova substitui a anterior e leva o sequencial seguinte. */\n readonly nSeqEvento: number;\n readonly autor?: AutorDocumento;\n}\n\nexport interface ManifestacaoPedido {\n readonly chave: string;\n readonly tipo: ManifestacaoTipo;\n /** Obrigatória na operação não realizada (15 a 255 caracteres). */\n readonly xJust?: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface InutilizacaoPedido {\n /** Ano com 2 ou 4 dígitos. */\n readonly ano: number | string;\n readonly serie: number | string;\n readonly nNFIni: number | string;\n readonly nNFFin: number | string;\n readonly xJust: string;\n readonly mod?: '55' | '65';\n readonly autor?: AutorDocumento;\n}\n\nexport type CadastroPedido = { readonly uf: Uf } & (\n | { readonly CNPJ: string }\n | { readonly CPF: string }\n | { readonly IE: string }\n);\n\nexport type DistribuicaoConsulta =\n | { readonly ultNSU: string | number }\n | { readonly NSU: string | number }\n | { readonly chNFe: string };\n\nexport interface DistribuicaoOpcoes extends EnvioOpcoes {\n /** UF do interessado; padrão a UF do cliente. */\n readonly cUFAutor?: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface ClienteNfe {\n readonly opcoes: ClienteNfeOpcoes;\n /**\n * Status do serviço de autorização na UF das opções (MOC 7.0, tabela 4.4.1: 107 em operação, 108 e 109 paralisado).\n * Com `mod: '65'`, o do autorizador da NFC-e, que em várias UFs é outro host.\n */\n statusServico(opcoes?: StatusServicoOpcoes): Promise<ResultadoSefaz<StatusServico, never>>;\n /** Envia uma NF-e assinada (a string devolvida pela assinatura, sem outra alteração). Padrão síncrono. */\n autorizar(nfeAssinada: string, opcoes?: AutorizarOpcoes): Promise<ResultadoAutorizacao>;\n /** Consulta o recibo de um lote assíncrono; com a NF-e assinada, monta o `nfeProc`. */\n consultarRecibo(nRec: string, nfeAssinada?: string, opcoes?: ConsultaReciboOpcoes): Promise<ResultadoAutorizacao>;\n /** Consulta o recibo até sair de pendente ou esgotar a política. */\n aguardarRecibo(nRec: string, nfeAssinada?: string, politica?: PoliticaRecibo): Promise<ResultadoAutorizacao>;\n consultar(chave: string, nfeAssinada?: string, opcoes?: EnvioOpcoes): Promise<ResultadoConsulta>;\n cancelar(p: CancelamentoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n /** Cancelamento por substituição (110112): só NFC-e (modelo 65). */\n cancelarPorSubstituicao(p: CancelamentoSubstituicaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n cartaCorrecao(p: CartaCorrecaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n /** Manifestação do destinatário, registrada no Ambiente Nacional (cOrgao 91). */\n manifestar(p: ManifestacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n inutilizar(p: InutilizacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoInutilizacao>;\n consultarCadastro(p: CadastroPedido, opcoes?: EnvioOpcoes): Promise<ResultadoSefaz<Cadastro, never>>;\n distribuicaoDFe(\n consulta: DistribuicaoConsulta,\n opcoes?: DistribuicaoOpcoes,\n ): Promise<ResultadoSefaz<Distribuicao, never>>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Utilitários\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Autorizador SVC da UF e o `tpEmis` que a NF-e emitida nele leva (6 SVC-AN, 7 SVC-RS; MOC 7.0, B22). */\nexport function autorizadorContingencia(\n uf: Uf,\n ambiente: Ambiente,\n): { readonly autorizador: 'SVC-AN' | 'SVC-RS'; readonly tpEmis: '6' | '7' } {\n const autorizador = nfeContingenciaDaUf(uf, ambiente);\n return { autorizador, tpEmis: autorizador === 'SVC-AN' ? '6' : '7' };\n}\n\nconst defaultSleep: Espera = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n // O listener sai também quando o prazo vence: um signal longo reaproveitado entre esperas não acumula listeners.\n const onAbort = (): void => {\n clearTimeout(t);\n reject(signal?.reason);\n };\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n\nfunction chaveValida(chave: string, path: string): ChaveAcesso {\n const r = lerChaveAcesso(chave, { caminho: path });\n if (!r.ok) throw new ErroDeValidacao(`chave de acesso inválida: ${r.erro.mensagem}`, [r.erro]);\n return r.valor;\n}\n\nfunction schemaIssues(what: string, issues: readonly OcorrenciaSchema[]): void {\n if (issues.length > 0) throw new ErroDeValidacao(`${what} não confere com o schema`, issues);\n}\n\nfunction documentoAutor(a: AutorDocumento, path: string): { CNPJ: string } | { CPF: string } {\n if (a.CNPJ !== undefined) {\n const r = lerCnpj(a.CNPJ, { caminho: `${path}.CNPJ` });\n if (!r.ok) throw new ErroDeValidacao('CNPJ do autor inválido', [r.erro]);\n return { CNPJ: r.valor };\n }\n const r = lerCpf(a.CPF ?? '', { caminho: `${path}.CPF` });\n if (!r.ok) throw new ErroDeValidacao('CPF do autor inválido', [r.erro]);\n return { CPF: r.valor };\n}\n\nfunction autorDaChave(c: ChaveAcesso): { CNPJ: string } | { CPF: string } {\n // lerChaveAcesso já exigiu CNPJ ou \"000\" + CPF válido nas 14 posições do emitente.\n return c.cnpj !== undefined ? { CNPJ: c.cnpj } : { CPF: c.cpf ?? c.emitente.slice(3) };\n}\n\n/**\n * Autor de um evento do emitente (cancelamento, cancelamento por substituição, CC-e): o informado tem de ser o CNPJ ou\n * o CPF do emitente na chave, senão a SEFAZ rejeita com 574 (MOC 7.0 Visão Geral, RV P12-44); sem autor, é o da chave.\n */\nfunction autorDoEmitente(a: AutorDocumento | undefined, c: ChaveAcesso): { CNPJ: string } | { CPF: string } {\n const daChave = autorDaChave(c);\n if (a === undefined) return daChave;\n const autor = documentoAutor(a, 'autor');\n const [campo, valor] = 'CNPJ' in autor ? ['CNPJ', autor.CNPJ] : ['CPF', autor.CPF];\n if (valor !== ('CNPJ' in daChave ? daChave.CNPJ : daChave.CPF) || campo !== ('CNPJ' in daChave ? 'CNPJ' : 'CPF')) {\n throw new ErroDeValidacao('o autor do evento não é o emitente da NF-e', [\n {\n caminho: `autor.${campo}`,\n code: 'autor_difere_do_emitente',\n mensagem: `o autor de um evento do emitente é o ${'CNPJ' in daChave ? 'CNPJ' : 'CPF'} da chave (P12-44, rejeição 574)`,\n origem: 'entrada',\n },\n ]);\n }\n return autor;\n}\n\n/**\n * Autorizador SVC pelo tpEmis da chave (MOC 7.0, B22: 6 SVC-AN, 7 SVC-RS). A nota assinada em contingência é\n * autorizada, consultada e cancelada no SVC que a autorizou, seja qual for a contingência de agora (NT 2013.007).\n */\nconst SVC_DO_TPEMIS: Readonly<Record<string, 'SVC-AN' | 'SVC-RS'>> = { '6': 'SVC-AN', '7': 'SVC-RS' };\n\n/** Chave do documento assinado, lida para rotear: o emitente é conferido pela SEFAZ, não aqui. */\nfunction chaveDoDocumento(a: DocumentoAssinado): ChaveAcesso {\n const r = lerChaveAcesso(a.id.slice(3), { caminho: 'infNFe.Id', conferirEmitente: false });\n if (!r.ok) throw new ErroDeConfiguracao(`Id da NF-e assinada não é uma chave de acesso: ${r.erro.mensagem}`);\n return r.valor;\n}\n\n/** Fatia autossuficiente (com o `xmlns` do elemento), para devolver ao chamador fora de um envelope. */\nfunction avulso(doc: DocumentoXml, el: ElementoXml): string {\n return recortarElemento(doc, el, '');\n}\n\n/** Protocolo lido e a fatia sem `xmlns` redundante, para entrar no `nfeProc`. */\ninterface ProtocoloLido {\n readonly p: Omit<ProtocoloNfe, 'nfeProc'>;\n readonly embutido: string;\n}\n\n/** Monta o protocolo a partir do `protNFe` da resposta. */\nfunction lerProtocolo(doc: DocumentoXml, el: ElementoXml): ProtocoloLido {\n const { valor: value } = decodificar(TProtNFe, el, doc.texto);\n const inf = value.infProt;\n if (!inf) throw new ErroRespostaInvalida('protNFe sem infProt');\n const p = {\n chNFe: inf.chNFe,\n cStat: inf.cStat,\n xMotivo: inf.xMotivo,\n dhRecbto: inf.dhRecbto,\n verAplic: inf.verAplic,\n protNFe: avulso(doc, el),\n ...(inf.nProt === undefined ? {} : { nProt: inf.nProt }),\n ...(inf.digVal === undefined ? {} : { digVal: inf.digVal }),\n };\n return { p, embutido: recortarElemento(doc, el) };\n}\n\n/**\n * Protocolo de uma NF-e que este cliente enviou: o `digVal` tem de ser o DigestValue da nota assinada, senão o\n * protocolo é de outro conteúdo e nenhum `nfeProc` é montado (`ErroRespostaInvalida`). Sem `digVal` não há como provar que o\n * protocolo é deste conteúdo: o desfecho volta sem `nfeProc` (confirme com `consultar`).\n */\nfunction desfechoDoProtocolo({ p, embutido }: ProtocoloLido, a: DocumentoAssinado | undefined): ResultadoAutorizacao {\n const status = { cStat: p.cStat, xMotivo: p.xMotivo };\n const autorizada = cstatEm(p.cStat, 'autorizada');\n const denegada = cstatEm(p.cStat, 'denegada');\n if (!autorizada && !denegada) return rejeitado(status);\n let full: ProtocoloNfe = p;\n if (a) {\n if (`NFe${p.chNFe}` !== a.id) {\n throw new ErroRespostaInvalida('protocolo de outra chave de acesso', { detalhes: { chNFe: p.chNFe } });\n }\n if (p.digVal !== undefined && p.digVal !== a.digestValue) {\n throw new ErroRespostaInvalida('digVal do protocolo difere do DigestValue da NF-e enviada', {\n detalhes: { chNFe: p.chNFe, cStat: p.cStat },\n });\n }\n if (p.digVal !== undefined) full = { ...p, nfeProc: envelope('nfeProc', '4.00', [a.xml, embutido]) };\n }\n return autorizada ? criarAutorizado(status, full) : criarDenegado(status, full);\n}\n\nfunction protNFeDaChave(parent: ElementoXml, a: DocumentoAssinado | undefined): ElementoXml | undefined {\n const prots = elementosFilhos(parent).filter((e) => e.local === 'protNFe' && e.ns === NFE_NS);\n if (!a) return prots[0];\n const chave = a.id.slice(3);\n return (\n prots.find((e) => {\n const inf = primeiroFilho(e, 'infProt', NFE_NS);\n const ch = inf && primeiroFilho(inf, 'chNFe', NFE_NS);\n return ch !== undefined && textoDe(ch).trim() === chave;\n }) ?? (prots.length === 1 ? prots[0] : undefined)\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Cliente\n// ---------------------------------------------------------------------------------------------------------------\n\nconst EVENTO_VERSAO = '1.00';\n/** Texto fixo das condições de uso da CC-e (schema e110110, primeira forma do enum). */\nconst XCONDUSO: DetCce['xCondUso'] =\n 'A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com: I - as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação; II - a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III - a data de emissão ou de saída.';\n\n/** Manifestação do destinatário (NT 2012.002): tipo de evento, descrição e schema do `detEvento`. */\nconst MANIFESTACOES: Readonly<\n Record<ManifestacaoTipo, { readonly tpEvento: string; readonly descEvento: string; readonly ct: ComplexType }>\n> = {\n confirmacao: { tpEvento: '210200', descEvento: 'Confirmacao da Operacao', ct: TEventoConfirmacao },\n ciencia: { tpEvento: '210210', descEvento: 'Ciencia da Operacao', ct: TEventoCiencia },\n desconhecimento: { tpEvento: '210220', descEvento: 'Desconhecimento da Operacao', ct: TEventoDesconhecimento },\n 'nao-realizada': { tpEvento: '210240', descEvento: 'Operacao nao Realizada', ct: TEventoNaoRealizada },\n};\n\ninterface EventoPedido {\n readonly ct: ComplexType;\n readonly tpEvento: string;\n readonly chave: string;\n readonly nSeqEvento: number;\n readonly cOrgao: string;\n readonly autor: { CNPJ: string } | { CPF: string };\n readonly detEvento: Readonly<Record<string, unknown>>;\n readonly endpoint: EndpointResolvido;\n /** Fuso do `dhEvento`. */\n readonly offsetMinutes: number;\n readonly signal: AbortSignal | undefined;\n}\n\n/** Cria o cliente dos serviços da NF-e. */\nexport function criarClienteNfe(opcoesDoCliente: ClienteNfeOpcoes): ClienteNfe {\n const logger = (opcoesDoCliente.logger ?? loggerSilencioso).child({\n modulo: 'nfe',\n ambiente: opcoesDoCliente.ambiente,\n });\n const sleep = opcoesDoCliente.esperar ?? defaultSleep;\n const tpAmb = tpAmbDoAmbiente(opcoesDoCliente.ambiente);\n const ufInfo = opcoesDoCliente.uf === undefined ? undefined : ufPorSigla(opcoesDoCliente.uf);\n if (opcoesDoCliente.uf !== undefined && !ufInfo)\n throw new ErroDeConfiguracao(`UF inválida: ${String(opcoesDoCliente.uf)}`);\n /** UF dos serviços sem documento; sem `opcoesDoCliente.uf`, `ErroDeConfiguracao` nomeando o serviço. */\n const ufPadrao = (servico: string): { readonly uf: Uf; readonly cUF: CUf } => {\n if (opcoesDoCliente.uf === undefined || ufInfo === undefined) {\n throw new ErroDeConfiguracao(`${servico} precisa da UF: informe ClienteNfeOpcoes.uf`);\n }\n return { uf: opcoesDoCliente.uf, cUF: ufInfo.cUF };\n };\n /** Fuso de um evento pela UF de quem o registra. */\n const offsetDe = (uf: Uf): number => opcoesDoCliente.deslocamentoMin ?? deslocamentoDaUf(uf);\n\n const idLote = (): string => {\n const id = opcoesDoCliente.idLote\n ? opcoesDoCliente.idLote()\n : String(opcoesDoCliente.relogio.agora().getTime()).slice(-15);\n if (!/^[0-9]{1,15}$/.test(id)) throw new ErroDeConfiguracao(`idLote inválido: ${id}`);\n return id;\n };\n\n /** Endpoint da NFC-e: a opção `endpointNfce` ou a tabela da NFC-e do transporte, sempre no autorizador normal. */\n const endpointNfce = (servico: NfeServico, uf: Uf): EndpointResolvido =>\n opcoesDoCliente.endpointNfce\n ? opcoesDoCliente.endpointNfce(servico, uf)\n : nfceEndpoint({ ambiente: opcoesDoCliente.ambiente, servico, uf });\n\n /**\n * Endpoint de um serviço sem documento, pela UF das opções: NF-e com SVC quando `contingencia` pede; NFC-e no\n * autorizador normal.\n */\n const endpoint = (servico: NfeServico, mod = '55'): EndpointResolvido => {\n const { uf } = ufPadrao(servico);\n if (mod === '65') return endpointNfce(servico, uf);\n return nfeEndpoint({\n ambiente: opcoesDoCliente.ambiente,\n servico,\n uf,\n ...(opcoesDoCliente.contingencia === undefined ? {} : { contingencia: opcoesDoCliente.contingencia }),\n });\n };\n\n /**\n * Endpoint de um serviço sobre um documento, pelo autorizador da chave: a UF do cUF e, no tpEmis 6 ou 7, o SVC que\n * autorizou a nota. `naUf` força o autorizador da UF (a CC-e não existe no SVC). A NFC-e vai sempre ao autorizador\n * normal da NFC-e.\n */\n const endpointDaChave = (servico: NfeServico, c: ChaveAcesso, naUf = false): EndpointResolvido => {\n if (c.mod === '65') return endpointNfce(servico, c.uf);\n const svc = naUf || c.tpEmis === undefined ? undefined : SVC_DO_TPEMIS[c.tpEmis];\n return nfeEndpoint({\n ambiente: opcoesDoCliente.ambiente,\n servico,\n ...(svc === undefined ? { uf: c.uf } : { autorizador: svc }),\n });\n };\n\n const call = (\n ep: EndpointResolvido,\n servico: NfeServico,\n mensagem: string,\n retorno: string,\n signal?: AbortSignal,\n ): Promise<RespostaSoap> =>\n chamar({\n transport: opcoesDoCliente.transporte,\n endpoint: ep,\n servico,\n mensagem,\n retorno,\n logger,\n ...(opcoesDoCliente.timeoutMs === undefined ? {} : { timeoutMs: opcoesDoCliente.timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n });\n\n const autorPadrao = (a: AutorDocumento | undefined, path: string): { CNPJ: string } | { CPF: string } => {\n const autor = a ?? opcoesDoCliente.autor;\n if (!autor) throw new ErroDeConfiguracao(`informe o CNPJ ou CPF do autor (${path} ou ClienteNfeOpcoes.autor)`);\n return documentoAutor(autor, path);\n };\n\n async function consultarRecibo(\n nRec: string,\n nfeAssinada?: string,\n opcoes: ConsultaReciboOpcoes = {},\n ): Promise<ResultadoAutorizacao> {\n if (!/^[0-9]{15}$/.test(nRec)) throw new ErroDeConfiguracao(`número de recibo inválido: ${nRec}`);\n const a = nfeAssinada === undefined ? undefined : documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n const c = a === undefined ? undefined : chaveDoDocumento(a);\n if (c !== undefined && opcoes.mod !== undefined && opcoes.mod !== c.mod) {\n throw new ErroDeConfiguracao(`mod ${opcoes.mod} não é o da NF-e assinada (${c.mod})`);\n }\n const msg = envelope('consReciNFe', '4.00', [`<tpAmb>${tpAmb}</tpAmb><nRec>${nRec}</nRec>`]);\n // O recibo é do autorizador que recebeu o lote: com a NF-e, o da chave; sem ela, o das opções.\n const ep =\n c === undefined ? endpoint('NFeRetAutorizacao', opcoes.mod ?? '55') : endpointDaChave('NFeRetAutorizacao', c);\n const r = await call(ep, 'NFeRetAutorizacao', msg, 'retConsReciNFe', opcoes.signal);\n const v = decodificar(TRetConsReciNFe, r.ret, r.doc.texto).valor;\n if (v.nRec !== undefined && v.nRec !== nRec) {\n throw new ErroRespostaInvalida('retorno de outro recibo', { detalhes: { nRec: v.nRec } });\n }\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.recibo', { nRec, cStat: v.cStat });\n if (cstatEm(v.cStat, 'loteEmProcessamento') || cstatEm(v.cStat, 'loteRecebido'))\n return criarPendente(status, { referencia: nRec });\n if (cstatEm(v.cStat, 'loteProcessado')) {\n const el = protNFeDaChave(r.ret, a);\n if (!el) throw new ErroRespostaInvalida('lote processado sem o protNFe da NF-e', { detalhes: { nRec } });\n return desfechoDoProtocolo(lerProtocolo(r.doc, el), a);\n }\n return rejeitado(status);\n }\n\n async function consultar(chave: string, nfeAssinada?: string, opcoes?: EnvioOpcoes): Promise<ResultadoConsulta> {\n const c = chaveValida(chave, 'chNFe');\n const a = nfeAssinada === undefined ? undefined : documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n if (a && a.id !== `NFe${c.chave}`) throw new ErroDeConfiguracao('a NF-e assinada não é a da chave consultada');\n const msg = serializarRaiz(consSitNFeElement, { versao: '4.00', tpAmb, xServ: 'CONSULTAR', chNFe: c.chave });\n const ep = endpointDaChave('NfeConsultaProtocolo', c);\n const r = await call(ep, 'NfeConsultaProtocolo', msg, 'retConsSitNFe', opcoes?.signal);\n const v = decodificar(TRetConsSitNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.consulta', { chNFe: c.chave, cStat: v.cStat });\n const situacao = cstatEm(v.cStat, 'autorizada')\n ? 'autorizada'\n : cstatEm(v.cStat, 'cancelada')\n ? 'cancelada'\n : cstatEm(v.cStat, 'denegada')\n ? 'denegada'\n : undefined;\n if (situacao === undefined) return rejeitado(status);\n const protEl = primeiroFilho(r.ret, 'protNFe', NFE_NS);\n const eventos = elementosFilhos(r.ret)\n .filter((e) => e.local === 'procEventoNFe' && e.ns === NFE_NS)\n .map((e) => avulso(r.doc, e));\n let protocolo: ProtocoloNfe | undefined;\n let digValConfere: boolean | undefined;\n if (protEl) {\n const { p, embutido } = lerProtocolo(r.doc, protEl);\n if (p.chNFe !== c.chave) {\n throw new ErroRespostaInvalida('protocolo de outra chave de acesso na consulta', {\n detalhes: { chNFe: p.chNFe },\n });\n }\n protocolo = p;\n if (a) {\n digValConfere = p.digVal !== undefined && p.digVal === a.digestValue;\n if (digValConfere) protocolo = { ...p, nfeProc: envelope('nfeProc', '4.00', [a.xml, embutido]) };\n }\n }\n const value: ConsultaNfe = {\n chNFe: c.chave,\n situacao,\n eventos,\n ...(protocolo === undefined ? {} : { protocolo }),\n ...(digValConfere === undefined ? {} : { digValConfere }),\n };\n return situacao === 'denegada' ? criarDenegado(status, value) : criarAutorizado(status, value);\n }\n\n async function enviarEvento(p: EventoPedido): Promise<ResultadoEvento> {\n const nSeq = p.nSeqEvento;\n if (!Number.isInteger(nSeq) || nSeq < 1 || nSeq > 99) throw new ErroDeConfiguracao(`nSeqEvento inválido: ${nSeq}`);\n const nSeqEvento = String(nSeq);\n // Id = \"ID\" + tpEvento + chave + nSeqEvento com 2 dígitos (leiaute do evento, atributo Id de infEvento).\n const id = `ID${p.tpEvento}${p.chave}${nSeqEvento.padStart(2, '0')}`;\n const inf = {\n Id: id,\n cOrgao: p.cOrgao,\n tpAmb,\n ...p.autor,\n chNFe: p.chave,\n dhEvento: formatarDh(opcoesDoCliente.relogio.agora(), p.offsetMinutes),\n tpEvento: p.tpEvento,\n nSeqEvento,\n verEvento: EVENTO_VERSAO,\n detEvento: p.detEvento,\n };\n const infXml = serializar(p.ct, 'infEvento', inf, NFE_NS);\n const evento = `<evento xmlns=\"${NFE_NS}\" versao=\"${EVENTO_VERSAO}\">${infXml}</evento>`;\n const infEl = primeiroFilho(lerXml(evento).raiz, 'infEvento', NFE_NS) as ElementoXml;\n schemaIssues('evento', validar(p.ct, infEl));\n const assinado = await assinarXml(evento, { id }, opcoesDoCliente.assinador);\n const msg = envelope('envEvento', EVENTO_VERSAO, [`<idLote>${idLote()}</idLote>`, assinado]);\n const r = await call(p.endpoint, 'RecepcaoEvento', msg, 'retEnvEvento', p.signal);\n const v = decodificar(TRetEnvEvento, r.ret, r.doc.texto).valor;\n logger.info('nfe.evento', { chNFe: p.chave, tpEvento: p.tpEvento, cStat: v.cStat });\n if (!cstatEm(v.cStat, 'loteEventoProcessado')) return rejeitado({ cStat: v.cStat, xMotivo: v.xMotivo });\n const retEl = elementosFilhos(r.ret).find((e) => e.local === 'retEvento' && e.ns === NFE_NS);\n const ret = v.retEvento?.[0]?.infEvento;\n if (!retEl || !ret) throw new ErroRespostaInvalida('lote de evento processado sem retEvento');\n // O retorno tem de ser deste evento: chave, tipo e sequência, quando vierem, iguais aos enviados.\n const divergentes = (\n [\n ['chNFe', ret.chNFe, p.chave],\n ['tpEvento', ret.tpEvento, p.tpEvento],\n ['nSeqEvento', ret.nSeqEvento === undefined ? undefined : String(Number(ret.nSeqEvento)), nSeqEvento],\n ] as const\n ).filter(([, veio, enviado]) => veio !== undefined && veio !== enviado);\n if (divergentes.length > 0) {\n throw new ErroRespostaInvalida('retEvento de outro evento', {\n detalhes: Object.fromEntries(divergentes.map(([k, veio]) => [k, veio])),\n });\n }\n const status = { cStat: ret.cStat, xMotivo: ret.xMotivo };\n if (!cstatEm(ret.cStat, 'eventoRegistrado')) return rejeitado(status);\n return criarAutorizado(status, {\n chNFe: p.chave,\n tpEvento: p.tpEvento,\n nSeqEvento,\n dhRegEvento: ret.dhRegEvento,\n retEvento: avulso(r.doc, retEl),\n procEventoNFe: envelope('procEventoNFe', EVENTO_VERSAO, [assinado, recortarElemento(r.doc, retEl)]),\n ...(ret.nProt === undefined ? {} : { nProt: ret.nProt }),\n });\n }\n\n const client: ClienteNfe = {\n opcoes: opcoesDoCliente,\n\n async statusServico(opcoes?: StatusServicoOpcoes): Promise<ResultadoSefaz<StatusServico, never>> {\n const { cUF } = ufPadrao('NfeStatusServico');\n const msg = serializarRaiz(consStatServElement, { versao: '4.00', tpAmb, cUF, xServ: 'STATUS' });\n const r = await call(\n endpoint('NfeStatusServico', opcoes?.mod),\n 'NfeStatusServico',\n msg,\n 'retConsStatServ',\n opcoes?.signal,\n );\n const v = decodificar(TRetConsStatServ, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.status', { cStat: v.cStat });\n if (!cstatEm(v.cStat, 'servicoEmOperacao')) return rejeitado(status);\n return criarAutorizado(status, {\n cUF: v.cUF,\n verAplic: v.verAplic,\n dhRecbto: v.dhRecbto,\n ...(v.tMed === undefined ? {} : { tMed: v.tMed }),\n ...(v.dhRetorno === undefined ? {} : { dhRetorno: v.dhRetorno }),\n ...(v.xObs === undefined ? {} : { xObs: v.xObs }),\n });\n },\n\n async autorizar(nfeAssinada: string, opcoes: AutorizarOpcoes = {}): Promise<ResultadoAutorizacao> {\n const a = documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n const sincrono = opcoes.sincrono ?? true;\n const msg = envelope('enviNFe', '4.00', [\n `<idLote>${idLote()}</idLote><indSinc>${sincrono ? '1' : '0'}</indSinc>`,\n a.xml,\n ]);\n // O autorizador é o do documento: a UF do cUF e, assinada em SVC (tpEmis 6 ou 7), o SVC da chave.\n const ep = endpointDaChave('NFeAutorizacao', chaveDoDocumento(a));\n const r = await call(ep, 'NFeAutorizacao', msg, 'retEnviNFe', opcoes.signal);\n const v = decodificar(TRetEnviNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.autorizacao', { chNFe: a.id.slice(3), cStat: v.cStat, sincrono });\n if (cstatEm(v.cStat, 'loteRecebido')) {\n const nRec = v.infRec?.nRec;\n if (!nRec) throw new ErroRespostaInvalida('lote recebido sem número de recibo');\n const tMed = Number(v.infRec?.tMed ?? '0');\n return criarPendente(status, { referencia: nRec, aguardarMs: Math.max(1, tMed) * 1000 });\n }\n const protEl = protNFeDaChave(r.ret, a);\n if (protEl) return desfechoDoProtocolo(lerProtocolo(r.doc, protEl), a);\n return rejeitado(status);\n },\n\n consultarRecibo,\n\n async aguardarRecibo(\n nRec: string,\n nfeAssinada?: string,\n politica: PoliticaRecibo = {},\n ): Promise<ResultadoAutorizacao> {\n const max = politica.maxTentativas ?? 10;\n const minimo = politica.esperaMinimaMs ?? 2000;\n const mult = politica.multiplicador ?? 1.5;\n const teto = politica.esperaMaximaMs ?? 30_000;\n if (!(max >= 1) || !(minimo >= 0) || !(mult >= 1) || !(teto >= minimo)) {\n throw new ErroDeConfiguracao('política de consulta do recibo inválida', {\n detalhes: { max, minimo, mult, teto },\n });\n }\n let espera = minimo;\n let ultimo: ResultadoAutorizacao | undefined;\n for (let i = 0; i < max; i++) {\n await sleep(espera, politica.signal);\n // O mesmo signal cancela a espera e a requisição em curso.\n ultimo = await consultarRecibo(nRec, nfeAssinada, politica);\n if (ultimo.tipo !== 'pendente') return ultimo;\n espera = Math.min(teto, Math.max(minimo, Math.round(espera * mult), ultimo.aguardarMs ?? 0));\n }\n return ultimo as ResultadoAutorizacao;\n },\n\n consultar,\n\n async cancelar(p: CancelamentoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n return enviarEvento({\n ct: TEventoCanc,\n tpEvento: '110111',\n chave: c.chave,\n nSeqEvento: 1,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento: { versao: EVENTO_VERSAO, descEvento: 'Cancelamento', nProt: p.nProt, xJust: p.xJust },\n // No autorizador da nota: o SVC só cancela a NF-e que ele autorizou, e a da UF só se cancela na UF.\n endpoint: endpointDaChave('RecepcaoEvento', c),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async cancelarPorSubstituicao(p: CancelamentoSubstituicaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n if (c.mod !== '65') {\n throw new ErroDeValidacao('cancelamento por substituição só existe para NFC-e', [\n {\n caminho: 'chave',\n code: 'modelo_nao_suportado',\n mensagem: 'O evento 110112 é exclusivo da NFC-e (modelo 65)',\n },\n ]);\n }\n const ref = chaveValida(p.chNFeRef, 'chNFeRef');\n // detEvento do e110112_v1.00.xsd (Evento_CancSubst_v1.01, NT 2018.004), validado com o envelope.\n const detEvento: DetCancSubst = {\n versao: EVENTO_VERSAO,\n descEvento: 'Cancelamento por substituicao',\n cOrgaoAutor: p.cOrgaoAutor as DetCancSubst['cOrgaoAutor'],\n tpAutor: p.tpAutor ?? '1',\n verAplic: p.verAplic,\n nProt: p.nProt,\n xJust: p.xJust,\n chNFeRef: ref.chave,\n };\n return enviarEvento({\n ct: TEventoCancSubst,\n tpEvento: '110112',\n chave: c.chave,\n nSeqEvento: 1,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento,\n endpoint: endpointDaChave('RecepcaoEvento', c),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async cartaCorrecao(p: CartaCorrecaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n if (!Number.isInteger(p.nSeqEvento) || p.nSeqEvento < 1 || p.nSeqEvento > 20) {\n throw new ErroDeConfiguracao(`nSeqEvento da CC-e vai de 1 a 20: ${p.nSeqEvento}`);\n }\n return enviarEvento({\n ct: TEventoCce,\n tpEvento: '110110',\n chave: c.chave,\n nSeqEvento: p.nSeqEvento,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento: {\n versao: EVENTO_VERSAO,\n descEvento: 'Carta de Correção',\n xCorrecao: p.xCorrecao,\n xCondUso: XCONDUSO,\n },\n // A CC-e vai sempre à UF: o SVC só recebe o cancelamento (NT 2013.007).\n endpoint: endpointDaChave('RecepcaoEvento', c, true),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async manifestar(p: ManifestacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n const m = MANIFESTACOES[p.tipo];\n if (!m) throw new ErroDeConfiguracao(`tipo de manifestação desconhecido: ${String(p.tipo)}`);\n return enviarEvento({\n ct: m.ct,\n tpEvento: m.tpEvento,\n chave: c.chave,\n nSeqEvento: 1,\n // Manifestação do destinatário: registrada no Ambiente Nacional, cOrgao 91 (NT 2012.002).\n cOrgao: '91',\n autor: autorPadrao(p.autor, 'autor'),\n detEvento: {\n versao: EVENTO_VERSAO,\n descEvento: m.descEvento,\n ...(p.xJust === undefined ? {} : { xJust: p.xJust }),\n },\n endpoint: nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'RecepcaoEvento', autorizador: 'AN' }),\n // Quem manifesta é o destinatário: o fuso é o da UF dele, quando informada.\n offsetMinutes: offsetDe(opcoesDoCliente.uf ?? c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async inutilizar(p: InutilizacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoInutilizacao> {\n const autor = autorPadrao(p.autor, 'autor');\n // NT 2018.001 v1.10, item 6.1: o controle de inutilização não se aplica ao emitente pessoa física, e o leiaute do\n // pedido não prevê o CPF; a série 910 a 969 (emitente CPF) é rejeitada com 266 (regra I02a, item 6.2).\n if (!('CNPJ' in autor)) {\n throw new ErroDeValidacao('inutilização não se aplica ao emitente pessoa física', [\n {\n caminho: 'autor.CPF',\n code: 'inutilizacao_emitente_cpf',\n mensagem: 'O pedido de inutilização só existe para emitente CNPJ (NT 2018.001 v1.10, item 6.1)',\n },\n ]);\n }\n const cnpj = autor.CNPJ;\n const { uf, cUF } = ufPadrao('NfeInutilizacao');\n const anoTxt = String(p.ano);\n const ano = anoTxt.length === 4 ? anoTxt.slice(2) : anoTxt.padStart(2, '0');\n const mod = p.mod ?? '55';\n const serie = String(p.serie);\n const ini = String(p.nNFIni);\n const fin = String(p.nNFFin);\n for (const [k, x, re] of [\n ['ano', ano, /^[0-9]{2}$/],\n ['serie', serie, /^(0|[1-9][0-9]{0,2})$/],\n ['nNFIni', ini, /^[1-9][0-9]{0,8}$/],\n ['nNFFin', fin, /^[1-9][0-9]{0,8}$/],\n ] as const) {\n if (!re.test(x)) throw new ErroDeConfiguracao(`${k} inválido para inutilização: ${x}`);\n }\n if (Number(fin) < Number(ini)) throw new ErroDeConfiguracao('nNFFin menor que nNFIni');\n if (Number(serie) >= 910 && Number(serie) <= 969) {\n throw new ErroDeValidacao('série de emitente pessoa física não se inutiliza', [\n {\n caminho: 'serie',\n code: 'inutilizacao_serie_cpf',\n mensagem:\n 'Série 910 a 969 identifica emitente CPF: a SEFAZ rejeita com 266 (NT 2018.001 v1.10, regra I02a)',\n },\n ]);\n }\n // Id = \"ID\" + cUF + ano + CNPJ + mod + série (3) + número inicial (9) + número final (9) (leiaute infInut).\n const id = `ID${cUF}${ano}${cnpj}${mod}${serie.padStart(3, '0')}${ini.padStart(9, '0')}${fin.padStart(9, '0')}`;\n const inf = {\n Id: id,\n tpAmb,\n xServ: 'INUTILIZAR' as const,\n cUF,\n ano,\n CNPJ: cnpj,\n mod,\n serie,\n nNFIni: ini,\n nNFFin: fin,\n xJust: p.xJust,\n };\n const infXml = serializar(TInutNFe_infInut, 'infInut', inf, NFE_NS);\n const inut = envelope('inutNFe', '4.00', [infXml]);\n const infEl = primeiroFilho(lerXml(inut).raiz, 'infInut', NFE_NS) as ElementoXml;\n schemaIssues('pedido de inutilização', validar(TInutNFe_infInut, infEl));\n const assinado = await assinarXml(inut, { id }, opcoesDoCliente.assinador);\n // A inutilização não existe no SVC (o SVC-RS nem publica o serviço): vai sempre ao autorizador normal da UF.\n const ep =\n mod === '65'\n ? endpointNfce('NfeInutilizacao', uf)\n : nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NfeInutilizacao', uf });\n const r = await call(ep, 'NfeInutilizacao', assinado, 'retInutNFe', opcoes?.signal);\n const v = decodificar(TRetInutNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.infInut.cStat, xMotivo: v.infInut.xMotivo };\n logger.info('nfe.inutilizacao', { id, cStat: status.cStat });\n if (!cstatEm(status.cStat, 'inutilizacaoHomologada')) return rejeitado(status);\n // A homologação tem de ser desta faixa: os campos que o retorno trouxer, iguais aos do pedido.\n const r0 = v.infInut;\n const n = (x: string | undefined): string | undefined => (x === undefined ? undefined : String(Number(x)));\n const confere: readonly (readonly [string, string | undefined, string])[] = [\n ['ano', r0.ano, ano],\n ['CNPJ', r0.CNPJ ?? (r0 as { CPF?: string }).CPF, cnpj],\n ['mod', r0.mod, mod],\n ['serie', n(r0.serie), String(Number(serie))],\n ['nNFIni', n(r0.nNFIni), String(Number(ini))],\n ['nNFFin', n(r0.nNFFin), String(Number(fin))],\n ];\n const fora = confere.filter(([, veio, pedido]) => veio !== undefined && veio !== pedido);\n if (fora.length > 0) {\n throw new ErroRespostaInvalida('retInutNFe de outra faixa', {\n detalhes: Object.fromEntries(fora.map(([k, v]) => [k, v])),\n });\n }\n return criarAutorizado(status, {\n dhRecbto: v.infInut.dhRecbto,\n retInutNFe: avulso(r.doc, r.ret),\n procInutNFe: envelope('ProcInutNFe', '4.00', [assinado, recortarElemento(r.doc, r.ret)]),\n ...(v.infInut.nProt === undefined ? {} : { nProt: v.infInut.nProt }),\n });\n },\n\n async consultarCadastro(p: CadastroPedido, opcoes?: EnvioOpcoes): Promise<ResultadoSefaz<Cadastro, never>> {\n const doc =\n 'CNPJ' in p\n ? documentoAutor({ CNPJ: p.CNPJ }, 'CNPJ')\n : 'CPF' in p\n ? documentoAutor({ CPF: p.CPF }, 'CPF')\n : { IE: p.IE.replace(/[^0-9A-Za-z]/g, '').toUpperCase() };\n const msg = serializarRaiz(ConsCadElement, { versao: '2.00', infCons: { xServ: 'CONS-CAD', UF: p.uf, ...doc } });\n const ep = nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NfeConsultaCadastro', uf: p.uf });\n const r = await call(ep, 'NfeConsultaCadastro', msg, 'retConsCad', opcoes?.signal);\n const v = decodificar(TRetConsCad, r.ret, r.doc.texto).valor;\n const i = v.infCons;\n const status = { cStat: i.cStat, xMotivo: i.xMotivo };\n logger.info('nfe.cadastro', { uf: p.uf, cStat: i.cStat });\n if (!cstatEm(i.cStat, 'cadastroEncontrado')) return rejeitado(status);\n return criarAutorizado(status, { UF: i.UF, dhCons: i.dhCons, infCad: i.infCad ?? [] });\n },\n\n async distribuicaoDFe(\n consulta: DistribuicaoConsulta,\n opcoes: DistribuicaoOpcoes = {},\n ): Promise<ResultadoSefaz<Distribuicao, never>> {\n const autor = autorPadrao(opcoes.autor, 'autor');\n const nsu = (x: string | number, k: string): string => {\n const s = String(x);\n if (!/^[0-9]{1,15}$/.test(s)) throw new ErroDeConfiguracao(`${k} inválido: ${s}`);\n return s.padStart(15, '0');\n };\n const grupo =\n 'ultNSU' in consulta\n ? { distNSU: { ultNSU: nsu(consulta.ultNSU, 'ultNSU') } }\n : 'NSU' in consulta\n ? { consNSU: { NSU: nsu(consulta.NSU, 'NSU') } }\n : { consChNFe: { chNFe: chaveValida(consulta.chNFe, 'chNFe').chave } };\n const cUFAutor = opcoes.cUFAutor ?? ufPadrao('NFeDistribuicaoDFe').cUF;\n if (ufPorCUf(cUFAutor) === undefined) throw new ErroDeConfiguracao(`cUFAutor inválido: ${cUFAutor}`);\n const msg = serializarRaiz(distDFeIntElement, {\n versao: '1.01',\n tpAmb,\n cUFAutor: cUFAutor as CUf,\n ...autor,\n ...grupo,\n } as distDFeInt);\n const ep = nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NFeDistribuicaoDFe' });\n const r = await call(ep, 'NFeDistribuicaoDFe', msg, 'retDistDFeInt', opcoes.signal);\n const v = decodificar(retDistDFeInt, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.distribuicao', { cStat: v.cStat, ultNSU: v.ultNSU, maxNSU: v.maxNSU });\n const base = { ultNSU: v.ultNSU, maxNSU: v.maxNSU, dhResp: v.dhResp };\n if (cstatEm(v.cStat, 'distribuicaoNenhumDocumento')) return criarAutorizado(status, { ...base, documentos: [] });\n if (!cstatEm(v.cStat, 'distribuicaoDocumentos')) return rejeitado(status);\n const documentos: DocumentoDistribuido[] = [];\n for (const z of v.loteDistDFeInt?.docZip ?? []) {\n const xml = await descomprimirGzipBase64(z.$text);\n documentos.push(documentoDistribuido(z.NSU ?? '', z.schema, xml));\n }\n return criarAutorizado(status, { ...base, documentos });\n },\n };\n return client;\n}\n\n/** Classifica e, nos resumos, decodifica o documento da distribuição pelo nome do schema. */\nfunction documentoDistribuido(NSU: string, schema: string, xml: string): DocumentoDistribuido {\n const nome = schema.replace(/_v?\\d.*$/, '');\n const base = { NSU, schema, xml };\n if (nome === 'resNFe') return { ...base, tipo: 'resNFe', resNFe: decodificarXml(resNFeElement, xml).valor };\n if (nome === 'resEvento')\n return { ...base, tipo: 'resEvento', resEvento: decodificarXml(resEventoElement, xml).valor };\n if (nome === 'procNFe') return { ...base, tipo: 'procNFe' };\n if (nome === 'procEventoNFe') return { ...base, tipo: 'procEventoNFe' };\n return { ...base, tipo: 'outro' };\n}\n",
23
+ "/**\n * Serviços da NF-e 4.00 sobre o `@sinete/transport` e a assinatura do `@sinete/core/xml`: status, autorização síncrona e\n * assíncrona (recibo e consulta do recibo com política de espera), consulta protocolo, eventos (cancelamento,\n * cancelamento por substituição, CC-e, manifestação do destinatário no AN), inutilização, consulta cadastro e\n * Distribuição DF-e. Contingência SVC por dado: o autorizador SVC-AN ou SVC-RS de cada UF vem do `@sinete/transport`.\n *\n * Todo desfecho que chega a uma resposta da SEFAZ é um `ResultadoSefaz` do core (autorizado, rejeitado, denegado,\n * pendente), com a dica do `@sinete/rejeicoes` na rejeição. Os documentos processados (`nfeProc`, `procEventoNFe`,\n * `ProcInutNFe`) são montados por splice: o XML assinado entra byte a byte, o protocolo entra como fatia da resposta.\n *\n * Idempotência da autorização (MOC 7.0, Visão Geral; RV de duplicidade 204 e 539): grave o XML assinado antes de\n * enviar; se o envio ficar sem resposta (timeout, conexão caída), nunca gere outro `cNF` nem outro `dhEmi` para o mesmo\n * número. Consulte a chave (`resolverEnvioSemResposta`) e, se ela não constar, reenvie exatamente os mesmos bytes.\n */\n\nimport type { Ambiente, Assinador, CUf, Logger, Recusado, Relogio, ResultadoSefaz, Uf } from '@sinete/core';\nimport {\n criarAutorizado,\n criarDenegado,\n criarPendente,\n ErroDeConfiguracao,\n ErroDeValidacao,\n ErroRespostaInvalida,\n loggerSilencioso,\n tpAmbDoAmbiente,\n ufPorCUf,\n ufPorSigla,\n} from '@sinete/core';\nimport type { DocumentoXml, ElementoXml } from '@sinete/core/xml';\nimport { assinarXml, elementosFilhos, lerXml, primeiroFilho, textoDe } from '@sinete/core/xml';\nimport type { ComplexType, OcorrenciaSchema } from '@sinete/schemas';\nimport { decodificar, decodificarXml, serializar, serializarRaiz, validar } from '@sinete/schemas';\nimport type { TRetConsCad_infCons_infCad } from '@sinete/schemas/nfe/consulta-cadastro/PL_010d';\nimport { ConsCadElement, TRetConsCad } from '@sinete/schemas/nfe/consulta-cadastro/PL_010d';\nimport { consSitNFeElement, TProtNFe, TRetConsSitNFe } from '@sinete/schemas/nfe/consulta-protocolo/PL_010d';\nimport type { distDFeInt, resEvento, resNFe } from '@sinete/schemas/nfe/dist-dfe/PL_NFeDistDFe_104';\nimport {\n distDFeIntElement,\n resEventoElement,\n resNFeElement,\n retDistDFeInt,\n} from '@sinete/schemas/nfe/dist-dfe/PL_NFeDistDFe_104';\nimport { TEvento_infEvento as TEventoCanc, TRetEnvEvento } from '@sinete/schemas/nfe/evento-cancelamento/PL_010d';\nimport type { TEvento_infEvento_detEvento as DetCancSubst } from '@sinete/schemas/nfe/evento-cancelamento-substituicao/PL_010d';\nimport { TEvento_infEvento as TEventoCancSubst } from '@sinete/schemas/nfe/evento-cancelamento-substituicao/PL_010d';\nimport type { TEvento_infEvento_detEvento as DetCce } from '@sinete/schemas/nfe/evento-cce/PL_010d';\nimport { TEvento_infEvento as TEventoCce } from '@sinete/schemas/nfe/evento-cce/PL_010d';\nimport { TEvento_infEvento as TEventoCiencia } from '@sinete/schemas/nfe/evento-ciencia-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoConfirmacao } from '@sinete/schemas/nfe/evento-confirmacao-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoDesconhecimento } from '@sinete/schemas/nfe/evento-desconhecimento-operacao/PL_010d';\nimport { TEvento_infEvento as TEventoNaoRealizada } from '@sinete/schemas/nfe/evento-operacao-nao-realizada/PL_010d';\nimport { TInutNFe_infInut, TRetInutNFe } from '@sinete/schemas/nfe/inutilizacao/PL_010d';\nimport { TRetConsReciNFe, TRetEnviNFe } from '@sinete/schemas/nfe/PL_010f';\nimport { consStatServElement, TRetConsStatServ } from '@sinete/schemas/nfe/status-servico/PL_009q';\nimport type { EndpointResolvido, NfeServico, Transporte } from '@sinete/transport';\nimport { nfceEndpoint, nfeContingenciaDaUf, nfeEndpoint } from '@sinete/transport';\nimport type { ChaveAcesso } from '@sinete/validators';\nimport { lerChaveAcesso, lerCnpj, lerCpf } from '@sinete/validators';\nimport { deslocamentoDaUf, formatarDh } from '../time.ts';\nimport { descomprimirGzipBase64 } from './gzip.ts';\nimport { cstatEm, rejeitado } from './outcome.ts';\nimport type { DocumentoAssinado } from './proc.ts';\nimport { documentoAssinado, envelope, NFE_NS, recortarElemento } from './proc.ts';\nimport type { RespostaSoap } from './soap.ts';\nimport { chamar } from './soap.ts';\n\n// ---------------------------------------------------------------------------------------------------------------\n// Configuração\n// ---------------------------------------------------------------------------------------------------------------\n\n/** CNPJ ou CPF de quem assina um evento ou consulta a distribuição. */\nexport type AutorDocumento =\n | { readonly CNPJ: string; readonly CPF?: never }\n | { readonly CPF: string; readonly CNPJ?: never };\n\n/** Espera injetável (testes passam uma que não dorme). */\nexport type Espera = (ms: number, signal?: AbortSignal) => Promise<void>;\n\nexport interface ClienteNfeOpcoes {\n readonly transporte: Transporte;\n /** Assina NF-e, eventos e inutilização (A1 WebCrypto, A3 via PKCS#11, HSM). */\n readonly assinador: Assinador;\n readonly ambiente: Ambiente;\n /**\n * UF dos serviços que não partem de um documento: status do serviço, inutilização, recibo consultado sem a NF-e,\n * `cUFAutor` padrão da distribuição e fuso da manifestação. Autorização, consulta, recibo com a NF-e e eventos da\n * própria nota vão ao autorizador da chave (cUF e tpEmis), seja qual for esta UF; sem ela, os serviços que precisam\n * dela lançam `ErroDeConfiguracao`.\n */\n readonly uf?: Uf;\n /** Relógio de emissão: `dhEvento`, número do lote. */\n readonly relogio: Relogio;\n readonly logger?: Logger;\n /** Prazo por requisição; padrão o do transporte. */\n readonly timeoutMs?: number;\n /** Fuso do emitente em minutos; padrão o da UF da chave nos eventos e o de `uf` na manifestação (`data/fusos.json`). */\n readonly deslocamentoMin?: number;\n /**\n * `svc`: o status do serviço e o recibo consultado sem a NF-e vão ao SVC-AN ou SVC-RS de `uf`. Não vale para o que\n * parte de um documento: a NF-e assinada em SVC (tpEmis 6 ou 7, na chave) vai ao SVC que a chave diz, e a assinada\n * fora dele vai à UF, com ou sem esta opção.\n */\n readonly contingencia?: 'svc';\n /** CNPJ ou CPF do titular do certificado: autor da manifestação, interessado da distribuição, emitente da inutilização. */\n readonly autor?: AutorDocumento;\n readonly esperar?: Espera;\n /**\n * Sobrepõe o endpoint da NFC-e (modelo 65) por serviço e UF. Sem ela, vale a tabela da NFC-e do `@sinete/transport`\n * (`nfceEndpoint`), que em várias UFs (SP, MG, PR, RS, SVRS) é outro host que o da NF-e. A NFC-e não tem SVC: com\n * `contingencia: 'svc'`, o documento modelo 65 continua indo ao autorizador normal da NFC-e.\n */\n readonly endpointNfce?: (servico: NfeServico, uf: Uf) => EndpointResolvido;\n /** Gerador de `idLote` (até 15 dígitos); padrão: os milissegundos do relógio. */\n readonly idLote?: () => string;\n /**\n * O titular emite NF-e sem inscrição estadual, como contribuinte exclusivo do IBS/CBS (NT 2026.007 v1.10). A\n * autorização dessa NF-e é só na SVRS (RV C17-11, rejeição 166), e os eventos de autoria do emitente dela também\n * (RV 1P10-40, rejeição 188), menos na série 890 a 919. Com a NF-e assinada na mão (`autorizar`, `consultar` e\n * `consultarRecibo` com ela) o cliente vê a falta de `emit/IE` sozinho; esta opção é para o que parte só da chave:\n * cancelamento, carta de correção, consulta e recibo sem a nota (o recibo sem a nota vai à SVRS no modelo 55). A série 890 a\n * 919 é exceção só dos eventos. Não vale para a NFC-e, que não admite emitente sem\n * IE (RV C17-42, rejeição 156).\n */\n readonly contribuinteExclusivoIbsCbs?: boolean;\n}\n\n/** Opções de toda chamada que vai à rede. */\nexport interface EnvioOpcoes {\n /** Cancela a requisição em curso. */\n readonly signal?: AbortSignal;\n}\n\n/** Opções da consulta de um recibo. */\nexport interface ConsultaReciboOpcoes extends EnvioOpcoes {\n /**\n * Modelo do lote, para escolher o serviço (NFC-e vai pelo `nfceEndpoint`). Com a NF-e assinada o modelo vem da\n * chave e este campo, se vier, tem de bater; sem ela, é obrigatório para NFC-e e o padrão é 55.\n */\n readonly mod?: '55' | '65';\n}\n\n/** Política de consulta do recibo (autorização assíncrona). */\nexport interface PoliticaRecibo extends ConsultaReciboOpcoes {\n /** Consultas no máximo. Padrão 10. */\n readonly maxTentativas?: number;\n /** Espera antes da primeira consulta e mínima entre consultas. Padrão 2 000 ms (o MOC pede aguardar o tMed). */\n readonly esperaMinimaMs?: number;\n /** Fator de crescimento da espera. Padrão 1,5. */\n readonly multiplicador?: number;\n /** Teto da espera. Padrão 30 000 ms. */\n readonly esperaMaximaMs?: number;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Valores dos desfechos\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Status do serviço (cStat 107). */\nexport interface StatusServico {\n readonly cUF: string;\n readonly verAplic: string;\n readonly dhRecbto: string;\n /** Tempo médio de resposta, em segundos. */\n readonly tMed?: string;\n readonly dhRetorno?: string;\n readonly xObs?: string;\n}\n\n/** Protocolo de uma NF-e (autorização ou denegação). */\nexport interface ProtocoloNfe {\n readonly chNFe: string;\n readonly cStat: string;\n readonly xMotivo: string;\n readonly nProt?: string;\n readonly dhRecbto: string;\n readonly digVal?: string;\n readonly verAplic: string;\n /** `protNFe` como veio na resposta (fatia do texto). */\n readonly protNFe: string;\n /**\n * `nfeProc` com a NF-e assinada byte a byte e o `protNFe`; presente quando a NF-e assinada é conhecida e o `digVal`\n * do protocolo confere com o DigestValue dela.\n */\n readonly nfeProc?: string;\n}\n\n/** Desfecho da autorização: autorizada, denegada (número consumido), rejeitada ou pendente (recibo em `referencia`). */\nexport type ResultadoAutorizacao = ResultadoSefaz<ProtocoloNfe, ProtocoloNfe>;\n\n/** Situação da NF-e na consulta protocolo. */\nexport interface ConsultaNfe {\n readonly chNFe: string;\n readonly situacao: 'autorizada' | 'cancelada' | 'denegada';\n readonly protocolo?: ProtocoloNfe;\n /** `procEventoNFe` devolvidos, como fatias da resposta. */\n readonly eventos: readonly string[];\n /** Com a NF-e assinada dada: o `digVal` do protocolo é o DigestValue dela. */\n readonly digValConfere?: boolean;\n}\n\nexport type ResultadoConsulta = ResultadoSefaz<ConsultaNfe, ConsultaNfe>;\n\n/** Evento registrado (cStat 135, 136 ou 155). */\nexport interface EventoRegistrado {\n readonly chNFe: string;\n readonly tpEvento: string;\n readonly nSeqEvento: string;\n readonly nProt?: string;\n readonly dhRegEvento: string;\n /** `retEvento` como veio na resposta. */\n readonly retEvento: string;\n /** Evento assinado + `retEvento`. */\n readonly procEventoNFe: string;\n}\n\nexport type ResultadoEvento = ResultadoSefaz<EventoRegistrado, never>;\n\n/** Inutilização homologada (cStat 102). */\nexport interface Inutilizacao {\n readonly nProt?: string;\n readonly dhRecbto: string;\n readonly retInutNFe: string;\n readonly procInutNFe: string;\n}\n\n/**\n * Protocolo da inutilização que já valia para a mesma faixa, trazido pelo 563 (MOC 7.0 Visão Geral, tabela 5-12,\n * regra I07). Não existe consulta de inutilização na NF-e 4.00: depois de um pedido sem resposta, reenviar a mesma\n * faixa e ler este campo é o único caminho para guardar o `nProt` que valeu. O `procInutNFe` não se monta com ele,\n * porque a resposta 563 não é a homologação.\n */\nexport interface InutilizacaoAnterior {\n readonly nProt: string;\n /** `retInutNFe` do 563 como veio na resposta. */\n readonly retInutNFe: string;\n}\n\n/** Recusa da inutilização; no 563 com protocolo, `anterior` traz o protocolo da faixa já inutilizada. */\nexport interface RecusadoInutilizacao extends Recusado {\n readonly anterior?: InutilizacaoAnterior;\n}\n\nexport type ResultadoInutilizacao = Exclude<ResultadoSefaz<Inutilizacao, never>, Recusado> | RecusadoInutilizacao;\n\nexport interface Cadastro {\n readonly UF: string;\n readonly dhCons: string;\n readonly infCad: readonly TRetConsCad_infCons_infCad[];\n}\n\n/** Documento devolvido pela Distribuição DF-e, já descompactado. */\nexport interface DocumentoDistribuido {\n readonly NSU: string;\n /** Schema que o AN informa (`resNFe_v1.01.xsd`, `procNFe_v4.00.xsd`...). */\n readonly schema: string;\n readonly tipo: 'resNFe' | 'resEvento' | 'procNFe' | 'procEventoNFe' | 'outro';\n /** XML como veio dentro do gzip. Guarde este texto; não reserialize. */\n readonly xml: string;\n readonly resNFe?: resNFe;\n readonly resEvento?: resEvento;\n}\n\nexport interface Distribuicao {\n readonly ultNSU: string;\n readonly maxNSU: string;\n readonly dhResp: string;\n readonly documentos: readonly DocumentoDistribuido[];\n}\n\nexport type ManifestacaoTipo = 'ciencia' | 'confirmacao' | 'desconhecimento' | 'nao-realizada';\n\nexport interface AutorizarOpcoes extends EnvioOpcoes {\n /** `indSinc` 1 (padrão) ou 0 (lote assíncrono com recibo). */\n readonly sincrono?: boolean;\n}\n\n/** Opções do status do serviço. */\nexport interface StatusServicoOpcoes extends EnvioOpcoes {\n /** `65` consulta o autorizador da NFC-e. Padrão 55. */\n readonly mod?: '55' | '65';\n}\n\nexport interface CancelamentoPedido {\n readonly chave: string;\n readonly nProt: string;\n readonly xJust: string;\n /** Padrão: o CNPJ ou CPF do emitente na chave. */\n readonly autor?: AutorDocumento;\n}\n\nexport interface CancelamentoSubstituicaoPedido {\n readonly chave: string;\n readonly nProt: string;\n readonly xJust: string;\n /** Chave da NFC-e que substitui a cancelada. */\n readonly chNFeRef: string;\n readonly cOrgaoAutor: string;\n readonly tpAutor?: '1';\n readonly verAplic: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface CartaCorrecaoPedido {\n readonly chave: string;\n readonly xCorrecao: string;\n /** 1 a 20; cada CC-e nova substitui a anterior e leva o sequencial seguinte. */\n readonly nSeqEvento: number;\n readonly autor?: AutorDocumento;\n}\n\nexport interface ManifestacaoPedido {\n readonly chave: string;\n readonly tipo: ManifestacaoTipo;\n /** Obrigatória na operação não realizada (15 a 255 caracteres). */\n readonly xJust?: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface InutilizacaoPedido {\n /** Ano com 2 ou 4 dígitos. */\n readonly ano: number | string;\n readonly serie: number | string;\n readonly nNFIni: number | string;\n readonly nNFFin: number | string;\n readonly xJust: string;\n readonly mod?: '55' | '65';\n readonly autor?: AutorDocumento;\n}\n\nexport type CadastroPedido = { readonly uf: Uf } & (\n | { readonly CNPJ: string }\n | { readonly CPF: string }\n | { readonly IE: string }\n);\n\nexport type DistribuicaoConsulta =\n | { readonly ultNSU: string | number }\n | { readonly NSU: string | number }\n | { readonly chNFe: string };\n\nexport interface DistribuicaoOpcoes extends EnvioOpcoes {\n /** UF do interessado; padrão a UF do cliente. */\n readonly cUFAutor?: string;\n readonly autor?: AutorDocumento;\n}\n\nexport interface ClienteNfe {\n readonly opcoes: ClienteNfeOpcoes;\n /**\n * Status do serviço de autorização na UF das opções (MOC 7.0, tabela 4.4.1: 107 em operação, 108 e 109 paralisado).\n * Com `mod: '65'`, o do autorizador da NFC-e, que em várias UFs é outro host.\n */\n statusServico(opcoes?: StatusServicoOpcoes): Promise<ResultadoSefaz<StatusServico, never>>;\n /** Envia uma NF-e assinada (a string devolvida pela assinatura, sem outra alteração). Padrão síncrono. */\n autorizar(nfeAssinada: string, opcoes?: AutorizarOpcoes): Promise<ResultadoAutorizacao>;\n /** Consulta o recibo de um lote assíncrono; com a NF-e assinada, monta o `nfeProc`. */\n consultarRecibo(nRec: string, nfeAssinada?: string, opcoes?: ConsultaReciboOpcoes): Promise<ResultadoAutorizacao>;\n /** Consulta o recibo até sair de pendente ou esgotar a política. */\n aguardarRecibo(nRec: string, nfeAssinada?: string, politica?: PoliticaRecibo): Promise<ResultadoAutorizacao>;\n consultar(chave: string, nfeAssinada?: string, opcoes?: EnvioOpcoes): Promise<ResultadoConsulta>;\n cancelar(p: CancelamentoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n /** Cancelamento por substituição (110112): só NFC-e (modelo 65). */\n cancelarPorSubstituicao(p: CancelamentoSubstituicaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n cartaCorrecao(p: CartaCorrecaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n /** Manifestação do destinatário, registrada no Ambiente Nacional (cOrgao 91). */\n manifestar(p: ManifestacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento>;\n inutilizar(p: InutilizacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoInutilizacao>;\n consultarCadastro(p: CadastroPedido, opcoes?: EnvioOpcoes): Promise<ResultadoSefaz<Cadastro, never>>;\n distribuicaoDFe(\n consulta: DistribuicaoConsulta,\n opcoes?: DistribuicaoOpcoes,\n ): Promise<ResultadoSefaz<Distribuicao, never>>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Utilitários\n// ---------------------------------------------------------------------------------------------------------------\n\n/** Autorizador SVC da UF e o `tpEmis` que a NF-e emitida nele leva (6 SVC-AN, 7 SVC-RS; MOC 7.0, B22). */\nexport function autorizadorContingencia(\n uf: Uf,\n ambiente: Ambiente,\n): { readonly autorizador: 'SVC-AN' | 'SVC-RS'; readonly tpEmis: '6' | '7' } {\n const autorizador = nfeContingenciaDaUf(uf, ambiente);\n return { autorizador, tpEmis: autorizador === 'SVC-AN' ? '6' : '7' };\n}\n\nconst defaultSleep: Espera = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n // O listener sai também quando o prazo vence: um signal longo reaproveitado entre esperas não acumula listeners.\n const onAbort = (): void => {\n clearTimeout(t);\n reject(signal?.reason);\n };\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n\nfunction chaveValida(chave: string, path: string): ChaveAcesso {\n const r = lerChaveAcesso(chave, { caminho: path });\n if (!r.ok) throw new ErroDeValidacao(`chave de acesso inválida: ${r.erro.mensagem}`, [r.erro]);\n return r.valor;\n}\n\nfunction schemaIssues(what: string, issues: readonly OcorrenciaSchema[]): void {\n if (issues.length > 0) throw new ErroDeValidacao(`${what} não confere com o schema`, issues);\n}\n\nfunction documentoAutor(a: AutorDocumento, path: string): { CNPJ: string } | { CPF: string } {\n if (a.CNPJ !== undefined) {\n const r = lerCnpj(a.CNPJ, { caminho: `${path}.CNPJ` });\n if (!r.ok) throw new ErroDeValidacao('CNPJ do autor inválido', [r.erro]);\n return { CNPJ: r.valor };\n }\n const r = lerCpf(a.CPF ?? '', { caminho: `${path}.CPF` });\n if (!r.ok) throw new ErroDeValidacao('CPF do autor inválido', [r.erro]);\n return { CPF: r.valor };\n}\n\nfunction autorDaChave(c: ChaveAcesso): { CNPJ: string } | { CPF: string } {\n // lerChaveAcesso já exigiu CNPJ ou \"000\" + CPF válido nas 14 posições do emitente.\n return c.cnpj !== undefined ? { CNPJ: c.cnpj } : { CPF: c.cpf ?? c.emitente.slice(3) };\n}\n\n/**\n * Autor de um evento do emitente (cancelamento, cancelamento por substituição, CC-e): o informado tem de ser o CNPJ ou\n * o CPF do emitente na chave, senão a SEFAZ rejeita com 574 (MOC 7.0 Visão Geral, RV P12-44); sem autor, é o da chave.\n */\nfunction autorDoEmitente(a: AutorDocumento | undefined, c: ChaveAcesso): { CNPJ: string } | { CPF: string } {\n const daChave = autorDaChave(c);\n if (a === undefined) return daChave;\n const autor = documentoAutor(a, 'autor');\n const [campo, valor] = 'CNPJ' in autor ? ['CNPJ', autor.CNPJ] : ['CPF', autor.CPF];\n if (valor !== ('CNPJ' in daChave ? daChave.CNPJ : daChave.CPF) || campo !== ('CNPJ' in daChave ? 'CNPJ' : 'CPF')) {\n throw new ErroDeValidacao('o autor do evento não é o emitente da NF-e', [\n {\n caminho: `autor.${campo}`,\n code: 'autor_difere_do_emitente',\n mensagem: `o autor de um evento do emitente é o ${'CNPJ' in daChave ? 'CNPJ' : 'CPF'} da chave (P12-44, rejeição 574)`,\n origem: 'entrada',\n },\n ]);\n }\n return autor;\n}\n\n/**\n * Autorizador SVC pelo tpEmis da chave (MOC 7.0, B22: 6 SVC-AN, 7 SVC-RS). A nota assinada em contingência é\n * autorizada, consultada e cancelada no SVC que a autorizou, seja qual for a contingência de agora (NT 2013.007).\n */\nconst SVC_DO_TPEMIS: Readonly<Record<string, 'SVC-AN' | 'SVC-RS'>> = { '6': 'SVC-AN', '7': 'SVC-RS' };\n\n/** A NF-e tem o grupo `emit` e ele não traz `IE`: contribuinte exclusivo do IBS/CBS (NT 2026.007). */\nfunction emitenteSemIe(a: DocumentoAssinado): boolean {\n const inf = primeiroFilho(a.documento.raiz, 'infNFe', NFE_NS);\n const emit = inf === undefined ? undefined : primeiroFilho(inf, 'emit', NFE_NS);\n return emit !== undefined && primeiroFilho(emit, 'IE', NFE_NS) === undefined;\n}\n\n/** Chave do documento assinado, lida para rotear: o emitente é conferido pela SEFAZ, não aqui. */\nfunction chaveDoDocumento(a: DocumentoAssinado): ChaveAcesso {\n const r = lerChaveAcesso(a.id.slice(3), { caminho: 'infNFe.Id', conferirEmitente: false });\n if (!r.ok) throw new ErroDeConfiguracao(`Id da NF-e assinada não é uma chave de acesso: ${r.erro.mensagem}`);\n return r.valor;\n}\n\n/** Fatia autossuficiente (com o `xmlns` do elemento), para devolver ao chamador fora de um envelope. */\nfunction avulso(doc: DocumentoXml, el: ElementoXml): string {\n return recortarElemento(doc, el, '');\n}\n\n/** Protocolo lido e a fatia sem `xmlns` redundante, para entrar no `nfeProc`. */\ninterface ProtocoloLido {\n readonly p: Omit<ProtocoloNfe, 'nfeProc'>;\n readonly embutido: string;\n}\n\n/** Monta o protocolo a partir do `protNFe` da resposta. */\nfunction lerProtocolo(doc: DocumentoXml, el: ElementoXml): ProtocoloLido {\n const { valor: value } = decodificar(TProtNFe, el, doc.texto);\n const inf = value.infProt;\n if (!inf) throw new ErroRespostaInvalida('protNFe sem infProt');\n const p = {\n chNFe: inf.chNFe,\n cStat: inf.cStat,\n xMotivo: inf.xMotivo,\n dhRecbto: inf.dhRecbto,\n verAplic: inf.verAplic,\n protNFe: avulso(doc, el),\n ...(inf.nProt === undefined ? {} : { nProt: inf.nProt }),\n ...(inf.digVal === undefined ? {} : { digVal: inf.digVal }),\n };\n return { p, embutido: recortarElemento(doc, el) };\n}\n\n/**\n * Protocolo de uma NF-e que este cliente enviou: o `digVal` tem de ser o DigestValue da nota assinada, senão o\n * protocolo é de outro conteúdo e nenhum `nfeProc` é montado (`ErroRespostaInvalida`). Sem `digVal` não há como provar que o\n * protocolo é deste conteúdo: o desfecho volta sem `nfeProc` (confirme com `consultar`).\n */\nfunction desfechoDoProtocolo({ p, embutido }: ProtocoloLido, a: DocumentoAssinado | undefined): ResultadoAutorizacao {\n const status = { cStat: p.cStat, xMotivo: p.xMotivo };\n const autorizada = cstatEm(p.cStat, 'autorizada');\n const denegada = cstatEm(p.cStat, 'denegada');\n if (!autorizada && !denegada) return rejeitado(status);\n let full: ProtocoloNfe = p;\n if (a) {\n if (`NFe${p.chNFe}` !== a.id) {\n throw new ErroRespostaInvalida('protocolo de outra chave de acesso', { detalhes: { chNFe: p.chNFe } });\n }\n if (p.digVal !== undefined && p.digVal !== a.digestValue) {\n throw new ErroRespostaInvalida('digVal do protocolo difere do DigestValue da NF-e enviada', {\n detalhes: { chNFe: p.chNFe, cStat: p.cStat },\n });\n }\n if (p.digVal !== undefined) full = { ...p, nfeProc: envelope('nfeProc', '4.00', [a.xml, embutido]) };\n }\n return autorizada ? criarAutorizado(status, full) : criarDenegado(status, full);\n}\n\nfunction protNFeDaChave(parent: ElementoXml, a: DocumentoAssinado | undefined): ElementoXml | undefined {\n const prots = elementosFilhos(parent).filter((e) => e.local === 'protNFe' && e.ns === NFE_NS);\n if (!a) return prots[0];\n const chave = a.id.slice(3);\n return (\n prots.find((e) => {\n const inf = primeiroFilho(e, 'infProt', NFE_NS);\n const ch = inf && primeiroFilho(inf, 'chNFe', NFE_NS);\n return ch !== undefined && textoDe(ch).trim() === chave;\n }) ?? (prots.length === 1 ? prots[0] : undefined)\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Cliente\n// ---------------------------------------------------------------------------------------------------------------\n\nconst EVENTO_VERSAO = '1.00';\n/** Texto fixo das condições de uso da CC-e (schema e110110, primeira forma do enum). */\nconst XCONDUSO: DetCce['xCondUso'] =\n 'A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com: I - as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação; II - a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III - a data de emissão ou de saída.';\n\n/** Manifestação do destinatário (NT 2012.002): tipo de evento, descrição e schema do `detEvento`. */\nconst MANIFESTACOES: Readonly<\n Record<ManifestacaoTipo, { readonly tpEvento: string; readonly descEvento: string; readonly ct: ComplexType }>\n> = {\n confirmacao: { tpEvento: '210200', descEvento: 'Confirmacao da Operacao', ct: TEventoConfirmacao },\n ciencia: { tpEvento: '210210', descEvento: 'Ciencia da Operacao', ct: TEventoCiencia },\n desconhecimento: { tpEvento: '210220', descEvento: 'Desconhecimento da Operacao', ct: TEventoDesconhecimento },\n 'nao-realizada': { tpEvento: '210240', descEvento: 'Operacao nao Realizada', ct: TEventoNaoRealizada },\n};\n\ninterface EventoPedido {\n readonly ct: ComplexType;\n readonly tpEvento: string;\n readonly chave: string;\n readonly nSeqEvento: number;\n readonly cOrgao: string;\n readonly autor: { CNPJ: string } | { CPF: string };\n readonly detEvento: Readonly<Record<string, unknown>>;\n readonly endpoint: EndpointResolvido;\n /** Fuso do `dhEvento`. */\n readonly offsetMinutes: number;\n readonly signal: AbortSignal | undefined;\n}\n\n/** Cria o cliente dos serviços da NF-e. */\nexport function criarClienteNfe(opcoesDoCliente: ClienteNfeOpcoes): ClienteNfe {\n const logger = (opcoesDoCliente.logger ?? loggerSilencioso).child({\n modulo: 'nfe',\n ambiente: opcoesDoCliente.ambiente,\n });\n const sleep = opcoesDoCliente.esperar ?? defaultSleep;\n const tpAmb = tpAmbDoAmbiente(opcoesDoCliente.ambiente);\n const ufInfo = opcoesDoCliente.uf === undefined ? undefined : ufPorSigla(opcoesDoCliente.uf);\n if (opcoesDoCliente.uf !== undefined && !ufInfo)\n throw new ErroDeConfiguracao(`UF inválida: ${String(opcoesDoCliente.uf)}`);\n /** UF dos serviços sem documento; sem `opcoesDoCliente.uf`, `ErroDeConfiguracao` nomeando o serviço. */\n const ufPadrao = (servico: string): { readonly uf: Uf; readonly cUF: CUf } => {\n if (opcoesDoCliente.uf === undefined || ufInfo === undefined) {\n throw new ErroDeConfiguracao(`${servico} precisa da UF: informe ClienteNfeOpcoes.uf`);\n }\n return { uf: opcoesDoCliente.uf, cUF: ufInfo.cUF };\n };\n /** Fuso de um evento pela UF de quem o registra. */\n const offsetDe = (uf: Uf): number => opcoesDoCliente.deslocamentoMin ?? deslocamentoDaUf(uf);\n\n const idLote = (): string => {\n const id = opcoesDoCliente.idLote\n ? opcoesDoCliente.idLote()\n : String(opcoesDoCliente.relogio.agora().getTime()).slice(-15);\n if (!/^[0-9]{1,15}$/.test(id)) throw new ErroDeConfiguracao(`idLote inválido: ${id}`);\n return id;\n };\n\n /** Endpoint da NFC-e: a opção `endpointNfce` ou a tabela da NFC-e do transporte, sempre no autorizador normal. */\n const endpointNfce = (servico: NfeServico, uf: Uf): EndpointResolvido =>\n opcoesDoCliente.endpointNfce\n ? opcoesDoCliente.endpointNfce(servico, uf)\n : nfceEndpoint({ ambiente: opcoesDoCliente.ambiente, servico, uf });\n\n /**\n * Endpoint de um serviço sem documento, pela UF das opções: NF-e com SVC quando `contingencia` pede; NFC-e no\n * autorizador normal.\n */\n const endpoint = (servico: NfeServico, mod = '55'): EndpointResolvido => {\n const { uf } = ufPadrao(servico);\n if (mod === '65') return endpointNfce(servico, uf);\n return nfeEndpoint({\n ambiente: opcoesDoCliente.ambiente,\n servico,\n uf,\n ...(opcoesDoCliente.contingencia === undefined ? {} : { contingencia: opcoesDoCliente.contingencia }),\n });\n };\n\n /**\n * Endpoint de um serviço sobre um documento, pelo autorizador da chave: a UF do cUF e, no tpEmis 6 ou 7, o SVC que\n * autorizou a nota. `naUf` força o autorizador da UF (a CC-e não existe no SVC). A NFC-e vai sempre ao autorizador\n * normal da NFC-e.\n */\n const endpointDaChave = (\n servico: NfeServico,\n c: ChaveAcesso,\n naUf = false,\n semIe = opcoesDoCliente.contribuinteExclusivoIbsCbs === true,\n ): EndpointResolvido => {\n if (c.mod === '65') return endpointNfce(servico, c.uf);\n // Contribuinte exclusivo do IBS/CBS (NT 2026.007): autorização, consulta e eventos do emitente só na SVRS (RV\n // C17-11 e 1P10-40). A série 890 a 919 é exceção só dos eventos (exceção 1 da RV 1P10-40).\n const serie = Number(c.serie);\n if (semIe && !(servico === 'RecepcaoEvento' && serie >= 890 && serie <= 919))\n return nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico, autorizador: 'SVRS' });\n const svc = naUf || c.tpEmis === undefined ? undefined : SVC_DO_TPEMIS[c.tpEmis];\n return nfeEndpoint({\n ambiente: opcoesDoCliente.ambiente,\n servico,\n ...(svc === undefined ? { uf: c.uf } : { autorizador: svc }),\n });\n };\n\n /** A NF-e assinada diz se o emitente tem IE; sem ela, vale a opção `contribuinteExclusivoIbsCbs`. */\n const semIeOuOpcao = (a: DocumentoAssinado | undefined): boolean =>\n a === undefined ? opcoesDoCliente.contribuinteExclusivoIbsCbs === true : emitenteSemIe(a);\n\n const call = (\n ep: EndpointResolvido,\n servico: NfeServico,\n mensagem: string,\n retorno: string,\n signal?: AbortSignal,\n ): Promise<RespostaSoap> =>\n chamar({\n transport: opcoesDoCliente.transporte,\n endpoint: ep,\n servico,\n mensagem,\n retorno,\n logger,\n ...(opcoesDoCliente.timeoutMs === undefined ? {} : { timeoutMs: opcoesDoCliente.timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n });\n\n const autorPadrao = (a: AutorDocumento | undefined, path: string): { CNPJ: string } | { CPF: string } => {\n const autor = a ?? opcoesDoCliente.autor;\n if (!autor) throw new ErroDeConfiguracao(`informe o CNPJ ou CPF do autor (${path} ou ClienteNfeOpcoes.autor)`);\n return documentoAutor(autor, path);\n };\n\n async function consultarRecibo(\n nRec: string,\n nfeAssinada?: string,\n opcoes: ConsultaReciboOpcoes = {},\n ): Promise<ResultadoAutorizacao> {\n if (!/^[0-9]{15}$/.test(nRec)) throw new ErroDeConfiguracao(`número de recibo inválido: ${nRec}`);\n const a = nfeAssinada === undefined ? undefined : documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n const c = a === undefined ? undefined : chaveDoDocumento(a);\n if (c !== undefined && opcoes.mod !== undefined && opcoes.mod !== c.mod) {\n throw new ErroDeConfiguracao(`mod ${opcoes.mod} não é o da NF-e assinada (${c.mod})`);\n }\n const msg = envelope('consReciNFe', '4.00', [`<tpAmb>${tpAmb}</tpAmb><nRec>${nRec}</nRec>`]);\n // O recibo é do autorizador que recebeu o lote: com a NF-e, o da chave; sem ela, o das opções.\n const ep =\n c === undefined\n ? (opcoes.mod ?? '55') === '55' && opcoesDoCliente.contribuinteExclusivoIbsCbs === true\n ? nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NFeRetAutorizacao', autorizador: 'SVRS' })\n : endpoint('NFeRetAutorizacao', opcoes.mod ?? '55')\n : endpointDaChave('NFeRetAutorizacao', c, false, semIeOuOpcao(a));\n const r = await call(ep, 'NFeRetAutorizacao', msg, 'retConsReciNFe', opcoes.signal);\n const v = decodificar(TRetConsReciNFe, r.ret, r.doc.texto).valor;\n if (v.nRec !== undefined && v.nRec !== nRec) {\n throw new ErroRespostaInvalida('retorno de outro recibo', { detalhes: { nRec: v.nRec } });\n }\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.recibo', { nRec, cStat: v.cStat });\n if (cstatEm(v.cStat, 'loteEmProcessamento') || cstatEm(v.cStat, 'loteRecebido'))\n return criarPendente(status, { referencia: nRec });\n if (cstatEm(v.cStat, 'loteProcessado')) {\n const el = protNFeDaChave(r.ret, a);\n if (!el) throw new ErroRespostaInvalida('lote processado sem o protNFe da NF-e', { detalhes: { nRec } });\n return desfechoDoProtocolo(lerProtocolo(r.doc, el), a);\n }\n return rejeitado(status);\n }\n\n async function consultar(chave: string, nfeAssinada?: string, opcoes?: EnvioOpcoes): Promise<ResultadoConsulta> {\n const c = chaveValida(chave, 'chNFe');\n const a = nfeAssinada === undefined ? undefined : documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n if (a && a.id !== `NFe${c.chave}`) throw new ErroDeConfiguracao('a NF-e assinada não é a da chave consultada');\n const msg = serializarRaiz(consSitNFeElement, { versao: '4.00', tpAmb, xServ: 'CONSULTAR', chNFe: c.chave });\n const ep = endpointDaChave('NfeConsultaProtocolo', c, false, semIeOuOpcao(a));\n const r = await call(ep, 'NfeConsultaProtocolo', msg, 'retConsSitNFe', opcoes?.signal);\n const v = decodificar(TRetConsSitNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.consulta', { chNFe: c.chave, cStat: v.cStat });\n const situacao = cstatEm(v.cStat, 'autorizada')\n ? 'autorizada'\n : cstatEm(v.cStat, 'cancelada')\n ? 'cancelada'\n : cstatEm(v.cStat, 'denegada')\n ? 'denegada'\n : undefined;\n if (situacao === undefined) return rejeitado(status);\n const protEl = primeiroFilho(r.ret, 'protNFe', NFE_NS);\n const eventos = elementosFilhos(r.ret)\n .filter((e) => e.local === 'procEventoNFe' && e.ns === NFE_NS)\n .map((e) => avulso(r.doc, e));\n let protocolo: ProtocoloNfe | undefined;\n let digValConfere: boolean | undefined;\n if (protEl) {\n const { p, embutido } = lerProtocolo(r.doc, protEl);\n if (p.chNFe !== c.chave) {\n throw new ErroRespostaInvalida('protocolo de outra chave de acesso na consulta', {\n detalhes: { chNFe: p.chNFe },\n });\n }\n protocolo = p;\n if (a) {\n digValConfere = p.digVal !== undefined && p.digVal === a.digestValue;\n if (digValConfere) protocolo = { ...p, nfeProc: envelope('nfeProc', '4.00', [a.xml, embutido]) };\n }\n }\n const value: ConsultaNfe = {\n chNFe: c.chave,\n situacao,\n eventos,\n ...(protocolo === undefined ? {} : { protocolo }),\n ...(digValConfere === undefined ? {} : { digValConfere }),\n };\n return situacao === 'denegada' ? criarDenegado(status, value) : criarAutorizado(status, value);\n }\n\n async function enviarEvento(p: EventoPedido): Promise<ResultadoEvento> {\n const nSeq = p.nSeqEvento;\n if (!Number.isInteger(nSeq) || nSeq < 1 || nSeq > 99) throw new ErroDeConfiguracao(`nSeqEvento inválido: ${nSeq}`);\n const nSeqEvento = String(nSeq);\n // Id = \"ID\" + tpEvento + chave + nSeqEvento com 2 dígitos (leiaute do evento, atributo Id de infEvento).\n const id = `ID${p.tpEvento}${p.chave}${nSeqEvento.padStart(2, '0')}`;\n const inf = {\n Id: id,\n cOrgao: p.cOrgao,\n tpAmb,\n ...p.autor,\n chNFe: p.chave,\n dhEvento: formatarDh(opcoesDoCliente.relogio.agora(), p.offsetMinutes),\n tpEvento: p.tpEvento,\n nSeqEvento,\n verEvento: EVENTO_VERSAO,\n detEvento: p.detEvento,\n };\n const infXml = serializar(p.ct, 'infEvento', inf, NFE_NS);\n const evento = `<evento xmlns=\"${NFE_NS}\" versao=\"${EVENTO_VERSAO}\">${infXml}</evento>`;\n const infEl = primeiroFilho(lerXml(evento).raiz, 'infEvento', NFE_NS) as ElementoXml;\n schemaIssues('evento', validar(p.ct, infEl));\n const assinado = await assinarXml(evento, { id }, opcoesDoCliente.assinador);\n const msg = envelope('envEvento', EVENTO_VERSAO, [`<idLote>${idLote()}</idLote>`, assinado]);\n const r = await call(p.endpoint, 'RecepcaoEvento', msg, 'retEnvEvento', p.signal);\n const v = decodificar(TRetEnvEvento, r.ret, r.doc.texto).valor;\n logger.info('nfe.evento', { chNFe: p.chave, tpEvento: p.tpEvento, cStat: v.cStat });\n if (!cstatEm(v.cStat, 'loteEventoProcessado')) return rejeitado({ cStat: v.cStat, xMotivo: v.xMotivo });\n const retEl = elementosFilhos(r.ret).find((e) => e.local === 'retEvento' && e.ns === NFE_NS);\n const ret = v.retEvento?.[0]?.infEvento;\n if (!retEl || !ret) throw new ErroRespostaInvalida('lote de evento processado sem retEvento');\n // O retorno tem de ser deste evento: chave, tipo e sequência, quando vierem, iguais aos enviados.\n const divergentes = (\n [\n ['chNFe', ret.chNFe, p.chave],\n ['tpEvento', ret.tpEvento, p.tpEvento],\n ['nSeqEvento', ret.nSeqEvento === undefined ? undefined : String(Number(ret.nSeqEvento)), nSeqEvento],\n ] as const\n ).filter(([, veio, enviado]) => veio !== undefined && veio !== enviado);\n if (divergentes.length > 0) {\n throw new ErroRespostaInvalida('retEvento de outro evento', {\n detalhes: Object.fromEntries(divergentes.map(([k, veio]) => [k, veio])),\n });\n }\n const status = { cStat: ret.cStat, xMotivo: ret.xMotivo };\n if (!cstatEm(ret.cStat, 'eventoRegistrado')) return rejeitado(status);\n return criarAutorizado(status, {\n chNFe: p.chave,\n tpEvento: p.tpEvento,\n nSeqEvento,\n dhRegEvento: ret.dhRegEvento,\n retEvento: avulso(r.doc, retEl),\n procEventoNFe: envelope('procEventoNFe', EVENTO_VERSAO, [assinado, recortarElemento(r.doc, retEl)]),\n ...(ret.nProt === undefined ? {} : { nProt: ret.nProt }),\n });\n }\n\n const client: ClienteNfe = {\n opcoes: opcoesDoCliente,\n\n async statusServico(opcoes?: StatusServicoOpcoes): Promise<ResultadoSefaz<StatusServico, never>> {\n const { cUF } = ufPadrao('NfeStatusServico');\n const msg = serializarRaiz(consStatServElement, { versao: '4.00', tpAmb, cUF, xServ: 'STATUS' });\n const r = await call(\n endpoint('NfeStatusServico', opcoes?.mod),\n 'NfeStatusServico',\n msg,\n 'retConsStatServ',\n opcoes?.signal,\n );\n const v = decodificar(TRetConsStatServ, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.status', { cStat: v.cStat });\n if (!cstatEm(v.cStat, 'servicoEmOperacao')) return rejeitado(status);\n return criarAutorizado(status, {\n cUF: v.cUF,\n verAplic: v.verAplic,\n dhRecbto: v.dhRecbto,\n ...(v.tMed === undefined ? {} : { tMed: v.tMed }),\n ...(v.dhRetorno === undefined ? {} : { dhRetorno: v.dhRetorno }),\n ...(v.xObs === undefined ? {} : { xObs: v.xObs }),\n });\n },\n\n async autorizar(nfeAssinada: string, opcoes: AutorizarOpcoes = {}): Promise<ResultadoAutorizacao> {\n const a = documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n const sincrono = opcoes.sincrono ?? true;\n const msg = envelope('enviNFe', '4.00', [\n `<idLote>${idLote()}</idLote><indSinc>${sincrono ? '1' : '0'}</indSinc>`,\n a.xml,\n ]);\n // O autorizador é o do documento: a UF do cUF e, assinada em SVC (tpEmis 6 ou 7), o SVC da chave.\n const ep = endpointDaChave('NFeAutorizacao', chaveDoDocumento(a), false, semIeOuOpcao(a));\n const r = await call(ep, 'NFeAutorizacao', msg, 'retEnviNFe', opcoes.signal);\n const v = decodificar(TRetEnviNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.autorizacao', { chNFe: a.id.slice(3), cStat: v.cStat, sincrono });\n if (cstatEm(v.cStat, 'loteRecebido')) {\n const nRec = v.infRec?.nRec;\n if (!nRec) throw new ErroRespostaInvalida('lote recebido sem número de recibo');\n const tMed = Number(v.infRec?.tMed ?? '0');\n return criarPendente(status, { referencia: nRec, aguardarMs: Math.max(1, tMed) * 1000 });\n }\n const protEl = protNFeDaChave(r.ret, a);\n if (protEl) return desfechoDoProtocolo(lerProtocolo(r.doc, protEl), a);\n return rejeitado(status);\n },\n\n consultarRecibo,\n\n async aguardarRecibo(\n nRec: string,\n nfeAssinada?: string,\n politica: PoliticaRecibo = {},\n ): Promise<ResultadoAutorizacao> {\n const max = politica.maxTentativas ?? 10;\n const minimo = politica.esperaMinimaMs ?? 2000;\n const mult = politica.multiplicador ?? 1.5;\n const teto = politica.esperaMaximaMs ?? 30_000;\n if (!(max >= 1) || !(minimo >= 0) || !(mult >= 1) || !(teto >= minimo)) {\n throw new ErroDeConfiguracao('política de consulta do recibo inválida', {\n detalhes: { max, minimo, mult, teto },\n });\n }\n let espera = minimo;\n let ultimo: ResultadoAutorizacao | undefined;\n for (let i = 0; i < max; i++) {\n await sleep(espera, politica.signal);\n // O mesmo signal cancela a espera e a requisição em curso.\n ultimo = await consultarRecibo(nRec, nfeAssinada, politica);\n if (ultimo.tipo !== 'pendente') return ultimo;\n espera = Math.min(teto, Math.max(minimo, Math.round(espera * mult), ultimo.aguardarMs ?? 0));\n }\n return ultimo as ResultadoAutorizacao;\n },\n\n consultar,\n\n async cancelar(p: CancelamentoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n return enviarEvento({\n ct: TEventoCanc,\n tpEvento: '110111',\n chave: c.chave,\n nSeqEvento: 1,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento: { versao: EVENTO_VERSAO, descEvento: 'Cancelamento', nProt: p.nProt, xJust: p.xJust },\n // No autorizador da nota: o SVC só cancela a NF-e que ele autorizou, e a da UF só se cancela na UF.\n endpoint: endpointDaChave('RecepcaoEvento', c),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async cancelarPorSubstituicao(p: CancelamentoSubstituicaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n if (c.mod !== '65') {\n throw new ErroDeValidacao('cancelamento por substituição só existe para NFC-e', [\n {\n caminho: 'chave',\n code: 'modelo_nao_suportado',\n mensagem: 'O evento 110112 é exclusivo da NFC-e (modelo 65)',\n },\n ]);\n }\n const ref = chaveValida(p.chNFeRef, 'chNFeRef');\n // detEvento do e110112_v1.00.xsd (Evento_CancSubst_v1.01, NT 2018.004), validado com o envelope.\n const detEvento: DetCancSubst = {\n versao: EVENTO_VERSAO,\n descEvento: 'Cancelamento por substituicao',\n cOrgaoAutor: p.cOrgaoAutor as DetCancSubst['cOrgaoAutor'],\n tpAutor: p.tpAutor ?? '1',\n verAplic: p.verAplic,\n nProt: p.nProt,\n xJust: p.xJust,\n chNFeRef: ref.chave,\n };\n return enviarEvento({\n ct: TEventoCancSubst,\n tpEvento: '110112',\n chave: c.chave,\n nSeqEvento: 1,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento,\n endpoint: endpointDaChave('RecepcaoEvento', c),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async cartaCorrecao(p: CartaCorrecaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n if (!Number.isInteger(p.nSeqEvento) || p.nSeqEvento < 1 || p.nSeqEvento > 20) {\n throw new ErroDeConfiguracao(`nSeqEvento da CC-e vai de 1 a 20: ${p.nSeqEvento}`);\n }\n return enviarEvento({\n ct: TEventoCce,\n tpEvento: '110110',\n chave: c.chave,\n nSeqEvento: p.nSeqEvento,\n cOrgao: c.cUF,\n autor: autorDoEmitente(p.autor, c),\n detEvento: {\n versao: EVENTO_VERSAO,\n descEvento: 'Carta de Correção',\n xCorrecao: p.xCorrecao,\n xCondUso: XCONDUSO,\n },\n // A CC-e vai sempre à UF: o SVC só recebe o cancelamento (NT 2013.007).\n endpoint: endpointDaChave('RecepcaoEvento', c, true),\n offsetMinutes: offsetDe(c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async manifestar(p: ManifestacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoEvento> {\n const c = chaveValida(p.chave, 'chave');\n const m = MANIFESTACOES[p.tipo];\n if (!m) throw new ErroDeConfiguracao(`tipo de manifestação desconhecido: ${String(p.tipo)}`);\n return enviarEvento({\n ct: m.ct,\n tpEvento: m.tpEvento,\n chave: c.chave,\n nSeqEvento: 1,\n // Manifestação do destinatário: registrada no Ambiente Nacional, cOrgao 91 (NT 2012.002).\n cOrgao: '91',\n autor: autorPadrao(p.autor, 'autor'),\n detEvento: {\n versao: EVENTO_VERSAO,\n descEvento: m.descEvento,\n ...(p.xJust === undefined ? {} : { xJust: p.xJust }),\n },\n endpoint: nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'RecepcaoEvento', autorizador: 'AN' }),\n // Quem manifesta é o destinatário: o fuso é o da UF dele, quando informada.\n offsetMinutes: offsetDe(opcoesDoCliente.uf ?? c.uf),\n signal: opcoes?.signal,\n });\n },\n\n async inutilizar(p: InutilizacaoPedido, opcoes?: EnvioOpcoes): Promise<ResultadoInutilizacao> {\n const autor = autorPadrao(p.autor, 'autor');\n // NT 2018.001 v1.10, item 6.1: o controle de inutilização não se aplica ao emitente pessoa física, e o leiaute do\n // pedido não prevê o CPF; a série 910 a 969 (emitente CPF) é rejeitada com 266 (regra I02a, item 6.2).\n if (!('CNPJ' in autor)) {\n throw new ErroDeValidacao('inutilização não se aplica ao emitente pessoa física', [\n {\n caminho: 'autor.CPF',\n code: 'inutilizacao_emitente_cpf',\n mensagem: 'O pedido de inutilização só existe para emitente CNPJ (NT 2018.001 v1.10, item 6.1)',\n },\n ]);\n }\n const cnpj = autor.CNPJ;\n const { uf, cUF } = ufPadrao('NfeInutilizacao');\n const anoTxt = String(p.ano);\n const ano = anoTxt.length === 4 ? anoTxt.slice(2) : anoTxt.padStart(2, '0');\n const mod = p.mod ?? '55';\n const serie = String(p.serie);\n const ini = String(p.nNFIni);\n const fin = String(p.nNFFin);\n for (const [k, x, re] of [\n ['ano', ano, /^[0-9]{2}$/],\n ['serie', serie, /^(0|[1-9][0-9]{0,2})$/],\n ['nNFIni', ini, /^[1-9][0-9]{0,8}$/],\n ['nNFFin', fin, /^[1-9][0-9]{0,8}$/],\n ] as const) {\n if (!re.test(x)) throw new ErroDeConfiguracao(`${k} inválido para inutilização: ${x}`);\n }\n if (Number(fin) < Number(ini)) throw new ErroDeConfiguracao('nNFFin menor que nNFIni');\n if (Number(serie) >= 910 && Number(serie) <= 969) {\n throw new ErroDeValidacao('série de emitente pessoa física não se inutiliza', [\n {\n caminho: 'serie',\n code: 'inutilizacao_serie_cpf',\n mensagem:\n 'Série 910 a 969 identifica emitente CPF: a SEFAZ rejeita com 266 (NT 2018.001 v1.10, regra I02a)',\n },\n ]);\n }\n // Id = \"ID\" + cUF + ano + CNPJ + mod + série (3) + número inicial (9) + número final (9) (leiaute infInut).\n const id = `ID${cUF}${ano}${cnpj}${mod}${serie.padStart(3, '0')}${ini.padStart(9, '0')}${fin.padStart(9, '0')}`;\n const inf = {\n Id: id,\n tpAmb,\n xServ: 'INUTILIZAR' as const,\n cUF,\n ano,\n CNPJ: cnpj,\n mod,\n serie,\n nNFIni: ini,\n nNFFin: fin,\n xJust: p.xJust,\n };\n const infXml = serializar(TInutNFe_infInut, 'infInut', inf, NFE_NS);\n const inut = envelope('inutNFe', '4.00', [infXml]);\n const infEl = primeiroFilho(lerXml(inut).raiz, 'infInut', NFE_NS) as ElementoXml;\n schemaIssues('pedido de inutilização', validar(TInutNFe_infInut, infEl));\n const assinado = await assinarXml(inut, { id }, opcoesDoCliente.assinador);\n // A inutilização não existe no SVC (o SVC-RS nem publica o serviço): vai sempre ao autorizador normal da UF.\n const ep =\n mod === '65'\n ? endpointNfce('NfeInutilizacao', uf)\n : nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NfeInutilizacao', uf });\n const r = await call(ep, 'NfeInutilizacao', assinado, 'retInutNFe', opcoes?.signal);\n const v = decodificar(TRetInutNFe, r.ret, r.doc.texto).valor;\n const status = { cStat: v.infInut.cStat, xMotivo: v.infInut.xMotivo };\n logger.info('nfe.inutilizacao', { id, cStat: status.cStat });\n const homologada = cstatEm(status.cStat, 'inutilizacaoHomologada');\n // `<nProt></nProt>` vazio não é protocolo: sem ele, o 563 fica como a recusa simples.\n const anterior = cstatEm(status.cStat, 'inutilizacaoJaHomologada') ? v.infInut.nProt || undefined : undefined;\n if (!homologada && anterior === undefined) return rejeitado(status);\n // A homologação (ou a anterior, no 563) tem de ser desta faixa: os campos que o retorno trouxer, iguais aos do pedido.\n const r0 = v.infInut;\n const n = (x: string | undefined): string | undefined => (x === undefined ? undefined : String(Number(x)));\n const confere: readonly (readonly [string, string | undefined, string])[] = [\n ['ano', r0.ano, ano],\n ['CNPJ', r0.CNPJ ?? (r0 as { CPF?: string }).CPF, cnpj],\n ['mod', r0.mod, mod],\n ['serie', n(r0.serie), String(Number(serie))],\n ['nNFIni', n(r0.nNFIni), String(Number(ini))],\n ['nNFFin', n(r0.nNFFin), String(Number(fin))],\n ];\n const fora = confere.filter(([, veio, pedido]) => veio !== undefined && veio !== pedido);\n if (fora.length > 0) {\n throw new ErroRespostaInvalida('retInutNFe de outra faixa', {\n detalhes: Object.fromEntries(fora.map(([k, v]) => [k, v])),\n });\n }\n if (anterior !== undefined) {\n return { ...rejeitado(status), anterior: { nProt: anterior, retInutNFe: avulso(r.doc, r.ret) } };\n }\n return criarAutorizado(status, {\n dhRecbto: v.infInut.dhRecbto,\n retInutNFe: avulso(r.doc, r.ret),\n procInutNFe: envelope('ProcInutNFe', '4.00', [assinado, recortarElemento(r.doc, r.ret)]),\n ...(v.infInut.nProt === undefined ? {} : { nProt: v.infInut.nProt }),\n });\n },\n\n async consultarCadastro(p: CadastroPedido, opcoes?: EnvioOpcoes): Promise<ResultadoSefaz<Cadastro, never>> {\n const doc =\n 'CNPJ' in p\n ? documentoAutor({ CNPJ: p.CNPJ }, 'CNPJ')\n : 'CPF' in p\n ? documentoAutor({ CPF: p.CPF }, 'CPF')\n : { IE: p.IE.replace(/[^0-9A-Za-z]/g, '').toUpperCase() };\n const msg = serializarRaiz(ConsCadElement, { versao: '2.00', infCons: { xServ: 'CONS-CAD', UF: p.uf, ...doc } });\n const ep = nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NfeConsultaCadastro', uf: p.uf });\n const r = await call(ep, 'NfeConsultaCadastro', msg, 'retConsCad', opcoes?.signal);\n const v = decodificar(TRetConsCad, r.ret, r.doc.texto).valor;\n const i = v.infCons;\n const status = { cStat: i.cStat, xMotivo: i.xMotivo };\n logger.info('nfe.cadastro', { uf: p.uf, cStat: i.cStat });\n if (!cstatEm(i.cStat, 'cadastroEncontrado')) return rejeitado(status);\n return criarAutorizado(status, { UF: i.UF, dhCons: i.dhCons, infCad: i.infCad ?? [] });\n },\n\n async distribuicaoDFe(\n consulta: DistribuicaoConsulta,\n opcoes: DistribuicaoOpcoes = {},\n ): Promise<ResultadoSefaz<Distribuicao, never>> {\n const autor = autorPadrao(opcoes.autor, 'autor');\n const nsu = (x: string | number, k: string): string => {\n const s = String(x);\n if (!/^[0-9]{1,15}$/.test(s)) throw new ErroDeConfiguracao(`${k} inválido: ${s}`);\n return s.padStart(15, '0');\n };\n const grupo =\n 'ultNSU' in consulta\n ? { distNSU: { ultNSU: nsu(consulta.ultNSU, 'ultNSU') } }\n : 'NSU' in consulta\n ? { consNSU: { NSU: nsu(consulta.NSU, 'NSU') } }\n : { consChNFe: { chNFe: chaveValida(consulta.chNFe, 'chNFe').chave } };\n const cUFAutor = opcoes.cUFAutor ?? ufPadrao('NFeDistribuicaoDFe').cUF;\n if (ufPorCUf(cUFAutor) === undefined) throw new ErroDeConfiguracao(`cUFAutor inválido: ${cUFAutor}`);\n const msg = serializarRaiz(distDFeIntElement, {\n versao: '1.01',\n tpAmb,\n cUFAutor: cUFAutor as CUf,\n ...autor,\n ...grupo,\n } as distDFeInt);\n const ep = nfeEndpoint({ ambiente: opcoesDoCliente.ambiente, servico: 'NFeDistribuicaoDFe' });\n const r = await call(ep, 'NFeDistribuicaoDFe', msg, 'retDistDFeInt', opcoes.signal);\n const v = decodificar(retDistDFeInt, r.ret, r.doc.texto).valor;\n const status = { cStat: v.cStat, xMotivo: v.xMotivo };\n logger.info('nfe.distribuicao', { cStat: v.cStat, ultNSU: v.ultNSU, maxNSU: v.maxNSU });\n const base = { ultNSU: v.ultNSU, maxNSU: v.maxNSU, dhResp: v.dhResp };\n if (cstatEm(v.cStat, 'distribuicaoNenhumDocumento')) return criarAutorizado(status, { ...base, documentos: [] });\n if (!cstatEm(v.cStat, 'distribuicaoDocumentos')) return rejeitado(status);\n const documentos: DocumentoDistribuido[] = [];\n for (const z of v.loteDistDFeInt?.docZip ?? []) {\n const xml = await descomprimirGzipBase64(z.$text);\n documentos.push(documentoDistribuido(z.NSU ?? '', z.schema, xml));\n }\n return criarAutorizado(status, { ...base, documentos });\n },\n };\n return client;\n}\n\n/** Classifica e, nos resumos, decodifica o documento da distribuição pelo nome do schema. */\nfunction documentoDistribuido(NSU: string, schema: string, xml: string): DocumentoDistribuido {\n const nome = schema.replace(/_v?\\d.*$/, '');\n const base = { NSU, schema, xml };\n if (nome === 'resNFe') return { ...base, tipo: 'resNFe', resNFe: decodificarXml(resNFeElement, xml).valor };\n if (nome === 'resEvento')\n return { ...base, tipo: 'resEvento', resEvento: decodificarXml(resEventoElement, xml).valor };\n if (nome === 'procNFe') return { ...base, tipo: 'procNFe' };\n if (nome === 'procEventoNFe') return { ...base, tipo: 'procEventoNFe' };\n return { ...base, tipo: 'outro' };\n}\n",
24
24
  "/**\n * Descompressão do `docZip` da Distribuição DF-e (gzip em base64, NT 2014.002). Usa o `DecompressionStream` da\n * plataforma (Node 18+, Bun, Deno e browsers), sem dependência.\n */\n\nimport { ErroNaoSuportado, ErroRespostaInvalida } from '@sinete/core';\nimport { decodificarBase64 } from '@sinete/core/xml';\n\n/** Base64 de um gzip para o texto UTF-8 de dentro. */\nexport async function descomprimirGzipBase64(b64: string): Promise<string> {\n const Ds = (globalThis as { DecompressionStream?: typeof DecompressionStream }).DecompressionStream;\n if (Ds === undefined)\n throw new ErroNaoSuportado('DecompressionStream indisponível nesta runtime; docZip não pode ser lido');\n let bytes: Uint8Array<ArrayBuffer>;\n try {\n bytes = decodificarBase64(b64.trim());\n } catch (cause) {\n throw new ErroRespostaInvalida('docZip com base64 inválido', { cause });\n }\n try {\n const stream = new Blob([bytes]).stream().pipeThrough(new Ds('gzip'));\n return await new Response(stream).text();\n } catch (cause) {\n throw new ErroRespostaInvalida('docZip não é um gzip válido', { cause });\n }\n}\n",
25
- "/**\n * Desfechos da SEFAZ a partir da tabela versionada de `cStat` (`data/cstat.json`, MOC 7.0 Anexo I, tabela 4.4.1).\n * Nenhuma lista de códigos fica no código: quem decide se um `cStat` é autorização, denegação ou pendência é o dado.\n */\n\nimport type { DicaRejeicao, Recusado, StatusSefaz } from '@sinete/core';\nimport { criarRecusado } from '@sinete/core';\nimport { completarRecusado } from '@sinete/rejeicoes';\nimport table from '../data/cstat.json' with { type: 'json' };\n\n/** Classes de `cStat` que a tabela descreve. */\nexport type CStatClasse =\n | 'autorizada'\n | 'denegada'\n | 'cancelada'\n | 'loteRecebido'\n | 'loteProcessado'\n | 'loteEmProcessamento'\n | 'loteNaoLocalizado'\n | 'servicoEmOperacao'\n | 'inutilizacaoHomologada'\n | 'eventoRegistrado'\n | 'loteEventoProcessado'\n | 'cadastroEncontrado'\n | 'distribuicaoNenhumDocumento'\n | 'distribuicaoDocumentos'\n | 'duplicidade'\n | 'duplicidadeChaveDiferente'\n | 'naoConsta'\n | 'outraNfeNoNumero'\n | 'consumoIndevido';\n\nconst CLASSES: Readonly<Record<CStatClasse, readonly string[]>> = table;\nconst DICAS: Readonly<Record<string, DicaRejeicao>> = table.dicas;\n\n/** O `cStat` pertence à classe da tabela. */\nexport function cstatEm(cStat: string, classe: CStatClasse): boolean {\n return CLASSES[classe].includes(cStat);\n}\n\n/**\n * Desfecho `recusado` enriquecido pelo `@sinete/rejeicoes`; sem curadoria lá, usa a dica própria do `@sinete/nfe`\n * (`dicas` em `data/cstat.json`) quando houver.\n */\nexport function rejeitado(status: StatusSefaz): Recusado {\n const r = completarRecusado(criarRecusado(status));\n if (r.dica !== undefined) return r;\n const dica = Object.hasOwn(DICAS, status.cStat) ? DICAS[status.cStat] : undefined;\n return dica === undefined ? r : criarRecusado(status, dica);\n}\n",
25
+ "/**\n * Desfechos da SEFAZ a partir da tabela versionada de `cStat` (`data/cstat.json`, MOC 7.0 Anexo I, tabela 4.4.1).\n * Nenhuma lista de códigos fica no código: quem decide se um `cStat` é autorização, denegação ou pendência é o dado.\n */\n\nimport type { DicaRejeicao, Recusado, StatusSefaz } from '@sinete/core';\nimport { criarRecusado } from '@sinete/core';\nimport { completarRecusado } from '@sinete/rejeicoes';\nimport table from '../data/cstat.json' with { type: 'json' };\n\n/** Classes de `cStat` que a tabela descreve. */\nexport type CStatClasse =\n | 'autorizada'\n | 'denegada'\n | 'cancelada'\n | 'loteRecebido'\n | 'loteProcessado'\n | 'loteEmProcessamento'\n | 'loteNaoLocalizado'\n | 'servicoEmOperacao'\n | 'inutilizacaoHomologada'\n | 'inutilizacaoJaHomologada'\n | 'eventoRegistrado'\n | 'loteEventoProcessado'\n | 'cadastroEncontrado'\n | 'distribuicaoNenhumDocumento'\n | 'distribuicaoDocumentos'\n | 'duplicidade'\n | 'duplicidadeChaveDiferente'\n | 'naoConsta'\n | 'outraNfeNoNumero'\n | 'consumoIndevido';\n\nconst CLASSES: Readonly<Record<CStatClasse, readonly string[]>> = table;\nconst DICAS: Readonly<Record<string, DicaRejeicao>> = table.dicas;\n\n/** O `cStat` pertence à classe da tabela. */\nexport function cstatEm(cStat: string, classe: CStatClasse): boolean {\n return CLASSES[classe].includes(cStat);\n}\n\n/**\n * Desfecho `recusado` enriquecido pelo `@sinete/rejeicoes`; sem curadoria lá, usa a dica própria do `@sinete/nfe`\n * (`dicas` em `data/cstat.json`) quando houver.\n */\nexport function rejeitado(status: StatusSefaz): Recusado {\n const r = completarRecusado(criarRecusado(status));\n if (r.dica !== undefined) return r;\n const dica = Object.hasOwn(DICAS, status.cStat) ? DICAS[status.cStat] : undefined;\n return dica === undefined ? r : criarRecusado(status, dica);\n}\n",
26
26
  "/**\n * Montagem dos documentos processados (`nfeProc`, `procEventoNFe`, `ProcInutNFe`) por splice de texto. O documento\n * assinado entra byte a byte como foi assinado e o protocolo entra como fatia da resposta recebida: nada é reparseado\n * para gerar saída nem reserializado (invariante do repositório, ADR 0003).\n */\n\nimport { ErroDeConfiguracao, ErroRespostaInvalida } from '@sinete/core';\nimport type { DocumentoXml, ElementoXml } from '@sinete/core/xml';\nimport {\n atributoDe,\n descendentes,\n lerXml,\n namespacesEmEscopo,\n primeiroFilho,\n textoDe,\n XMLDSIG_NS,\n} from '@sinete/core/xml';\n\n/** Namespace dos documentos da NF-e. */\nexport const NFE_NS = 'http://www.portalfiscal.inf.br/nfe';\n\nconst XML_DECL = /^\uFEFF?<\\?xml[^?]*\\?>\\s*/;\n\n/**\n * Recorta o elemento da fonte, acrescentando na tag de abertura só as declarações de namespace que ele usa e que\n * estão em ancestrais fora do recorte. O default entra apenas quando difere de `nsPadraoDoPai` (o default do\n * envelope onde a fatia vai morar).\n */\nexport function recortarElemento(documento: DocumentoXml, el: ElementoXml, nsPadraoDoPai: string = NFE_NS): string {\n const slice = documento.texto.slice(el.inicio, el.fim);\n // Só os prefixos usados por algum elemento ou atributo cuja declaração está fora do recorte: um prefixo redeclarado\n // dentro dele não pode ganhar outra declaração na raiz, que mudaria o C14N inclusivo de um irmão assinado.\n //\n // Declaração herdada e não usada (xmlns:soap, xmlns:xsi, xmlns:xsd do envelope da resposta) fica de fora de\n // propósito. O que a fatia leva é o contexto em que o autorizador montou o documento, não o do transporte: o\n // protocolo vai para o proc como o leiaute pede, e é assim que o proc confere depois. Copiar para a fatia todo\n // namespace em escopo mudaria o C14N inclusivo do documento assinado pelo emitente, que nunca viu o envelope.\n const used = new Set<string>();\n const cobertoDentro = (d: ElementoXml, p: string): boolean => {\n for (let e: ElementoXml | null = d; e; e = e === el ? null : e.pai) if (e.namespaces.has(p)) return true;\n return false;\n };\n for (const d of descendentes(el)) {\n const prefixos = [d.prefixo, ...d.atributos.map((a) => a.prefixo)].filter((p) => p !== '' && p !== 'xml');\n for (const p of prefixos) if (!cobertoDentro(d, p)) used.add(p);\n }\n const extra: string[] = [];\n const inScope = new Map<string, string>();\n for (let e: ElementoXml | null = el.pai; e; e = e.pai) {\n for (const [p, u] of e.namespaces) if (!inScope.has(p)) inScope.set(p, u);\n }\n // O default herdado de fora entra quando algum elemento sem prefixo do recorte (a raiz ou um descendente, inclusive\n // sob uma raiz prefixada) depende dele e ele difere do default do envelope de destino.\n const herdado = inScope.get('') ?? '';\n if (herdado !== nsPadraoDoPai && usaDefaultHerdado(el)) extra.push(` xmlns=\"${herdado}\"`);\n for (const p of [...used].sort()) {\n const uri = inScope.get(p);\n if (uri === undefined) throw new ErroRespostaInvalida(`prefixo ${p} sem declaração no recorte de ${el.nome}`);\n extra.push(` xmlns:${p}=\"${uri}\"`);\n }\n if (extra.length === 0) return slice;\n const at = 1 + el.nome.length;\n return slice.slice(0, at) + extra.join('') + slice.slice(at);\n}\n\n/** Algum elemento sem prefixo do recorte resolve o default por uma declaração de fora do recorte. */\nfunction usaDefaultHerdado(raiz: ElementoXml): boolean {\n for (const d of descendentes(raiz)) {\n if (d.prefixo !== '') continue;\n let coberto = false;\n for (let e: ElementoXml | null = d; e; e = e === raiz ? null : e.pai) {\n if (e.namespaces.has('')) {\n coberto = true;\n break;\n }\n }\n if (!coberto) return true;\n }\n return false;\n}\n\n/** Documento assinado já conferido: a string como veio (sem a declaração XML) e o que se lê dela. */\nexport interface DocumentoAssinado {\n /** O texto que vai no envelope, byte a byte o assinado (só a declaração XML inicial removida). */\n readonly xml: string;\n /** `Id` do elemento assinado (`NFe3526...`, `ID110111...`). */\n readonly id: string;\n /** DigestValue da assinatura (base64). */\n readonly digestValue: string;\n readonly documento: DocumentoXml;\n}\n\n/**\n * Confere que `xml` é um documento `raiz` assinado (no namespace da NF-e, com `Signature` referenciando o filho\n * `elemento`) e devolve a string sem a declaração XML. Lança `ErroDeConfiguracao` para qualquer outra coisa: o serviço nunca\n * \"conserta\" o documento de quem chama.\n */\nexport function documentoAssinado(xml: string, raiz: string, elemento: string): DocumentoAssinado {\n const text = xml.replace(XML_DECL, '');\n let doc: DocumentoXml;\n try {\n doc = lerXml(text);\n } catch (cause) {\n throw new ErroDeConfiguracao(`${raiz} assinado malformado`, { cause });\n }\n if (doc.raiz.local !== raiz || doc.raiz.ns !== NFE_NS) {\n throw new ErroDeConfiguracao(`esperado <${raiz}> no namespace da NF-e, veio <${doc.raiz.nome}>`);\n }\n // O envelope (nfeProc, procEventoNFe) declara o default da NF-e; o C14N inclusivo herda os namespaces dos\n // ancestrais, então a raiz assinada precisa declarar ela mesma esse default, ou a assinatura deixa de conferir\n // dentro do envelope. Não se conserta o documento de quem chama: recusa.\n if (doc.raiz.namespaces.get('') !== NFE_NS) {\n throw new ErroDeConfiguracao(`<${raiz}> assinado precisa declarar xmlns=\"${NFE_NS}\" na própria raiz`);\n }\n const alvo = primeiroFilho(doc.raiz, elemento, NFE_NS);\n const id = alvo ? atributoDe(alvo, 'Id') : undefined;\n const sig = primeiroFilho(doc.raiz, 'Signature', XMLDSIG_NS);\n const digest = sig && descendantText(sig, 'DigestValue');\n if (!id || digest === undefined)\n throw new ErroDeConfiguracao(`${raiz} sem ${elemento} identificado ou sem assinatura`);\n return { xml: text, id, digestValue: digest, documento: doc };\n}\n\nfunction descendantText(el: ElementoXml, local: string): string | undefined {\n for (const d of descendentes(el)) if (d.local === local && d.ns === XMLDSIG_NS) return textoDe(d).trim();\n return undefined;\n}\n\n/**\n * NF-e assinada de dentro de um `nfeProc` (ou a própria NF-e assinada), como fatia do texto e sem a declaração XML,\n * pronta para `consultar`, `resolverEnvioSemResposta` e a retomada, que recusam raiz sem `xmlns` próprio. O `NFe` dentro\n * do proc herda os namespaces do envelope; eles são declarados na raiz da fatia. O C14N inclusivo do `infNFe` já os\n * enxergava em escopo, então o digest e a assinatura são os mesmos dentro e fora do proc. Nada mais muda nos bytes.\n * Lança `ErroDeConfiguracao` quando não há NF-e assinada (proc de outro documento, NFe sem assinatura, XML malformado).\n */\nexport function nfeAssinadaDoProc(xml: string): string {\n const text = xml.replace(XML_DECL, '');\n let doc: DocumentoXml;\n try {\n doc = lerXml(text);\n } catch (cause) {\n throw new ErroDeConfiguracao('nfeProc malformado', { cause });\n }\n const noProc =\n doc.raiz.local === 'nfeProc' && doc.raiz.ns === NFE_NS ? primeiroFilho(doc.raiz, 'NFe', NFE_NS) : undefined;\n const el = noProc ?? (doc.raiz.local === 'NFe' && doc.raiz.ns === NFE_NS ? doc.raiz : undefined);\n if (el === undefined) throw new ErroDeConfiguracao(`esperado <nfeProc> ou <NFe> assinada, veio <${doc.raiz.nome}>`);\n const fatia = doc.texto.slice(el.inicio, el.fim);\n const herdados = [...namespacesEmEscopo(el)].filter(([p]) => p !== 'xml' && !el.namespaces.has(p));\n const decl = herdados\n .map(\n ([p, uri]) =>\n ` ${p === '' ? 'xmlns' : `xmlns:${p}`}=\"${uri.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;')}\"`,\n )\n .join('');\n const at = 1 + el.nome.length;\n const assinado = decl === '' ? fatia : fatia.slice(0, at) + decl + fatia.slice(at);\n // Confere raiz, Id e assinatura como a retomada vai conferir: o que sai daqui serve direto nela.\n return documentoAssinado(assinado, 'NFe', 'infNFe').xml;\n}\n\n/** `<raiz xmlns versao>` + partes + `</raiz>`, sem tocar nas partes. */\nexport function envelope(raiz: string, versao: string, partes: readonly string[]): string {\n return `<${raiz} xmlns=\"${NFE_NS}\" versao=\"${versao}\">${partes.join('')}</${raiz}>`;\n}\n",
27
27
  "/**\n * Chamada SOAP 1.2 a um web service da NF-e 4.00: monta o corpo com o namespace do WSDL (dado em `data/servicos.json`),\n * envia pelo `Transporte` injetado e devolve o elemento de retorno como fatia da resposta, com a árvore para leitura.\n */\n\nimport type { Logger } from '@sinete/core';\nimport { ErroRespostaInvalida } from '@sinete/core';\nimport type { DocumentoXml, ElementoXml } from '@sinete/core/xml';\nimport { descendentes, elementosFilhos, lerXml } from '@sinete/core/xml';\nimport type { EndpointResolvido, NfeServico, Transporte } from '@sinete/transport';\nimport { contentTypeSoap12, envelopeSoap12, lerSoapFault } from '@sinete/transport';\nimport servicos from '../data/servicos.json' with { type: 'json' };\nimport { NFE_NS } from './proc.ts';\n\ninterface ServicoInfo {\n readonly namespace: string;\n readonly operacao: string;\n readonly envelope?: string;\n /**\n * Autorizadores que pedem a mensagem dentro do elemento da operação do WSDL (`<operacao><nfeDadosMsg>`), como a\n * Distribuição DF-e faz para todos. Valor `operacao`; a fonte fica em `fonteEnvelope`.\n */\n readonly envelopeNoAutorizador?: Readonly<Record<string, string>>;\n readonly fonteEnvelope?: string;\n}\n\nconst SERVICOS: Readonly<Record<string, ServicoInfo>> = servicos.servicos;\n\n/** Namespace do WSDL e operação do serviço. */\nexport function servicoInfo(servico: NfeServico): ServicoInfo {\n const s = SERVICOS[servico];\n if (!s) throw new ErroRespostaInvalida(`serviço sem descrição em data/servicos.json: ${servico}`);\n return s;\n}\n\n/** Corpo SOAP do serviço: a mensagem entra como texto, sem reparse. */\nexport function soapBodyFor(servico: NfeServico, mensagem: string, autorizador?: string): string {\n const s = servicoInfo(servico);\n if (s.envelope === 'distDFeInteresse' || (autorizador && s.envelopeNoAutorizador?.[autorizador] === 'operacao')) {\n return `<${s.operacao} xmlns=\"${s.namespace}\"><nfeDadosMsg>${mensagem}</nfeDadosMsg></${s.operacao}>`;\n }\n return `<nfeDadosMsg xmlns=\"${s.namespace}\">${mensagem}</nfeDadosMsg>`;\n}\n\n/** Resposta de um serviço: o documento inteiro (para fatiar) e o elemento de retorno. */\nexport interface RespostaSoap {\n readonly doc: DocumentoXml;\n readonly ret: ElementoXml;\n readonly status: number;\n}\n\nexport interface ChamadaSoap {\n readonly transport: Transporte;\n readonly endpoint: EndpointResolvido;\n readonly servico: NfeServico;\n readonly mensagem: string;\n /** Nome local do elemento de retorno (`retEnviNFe`, `retConsSitNFe`...). */\n readonly retorno: string;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n readonly logger: Logger;\n}\n\n/** Envia e devolve o elemento de retorno. Fault SOAP, retorno ausente ou XML malformado viram `ErroRespostaInvalida`. */\nexport async function chamar(c: ChamadaSoap): Promise<RespostaSoap> {\n const s = servicoInfo(c.servico);\n const started = { servico: c.servico, autorizador: c.endpoint.autorizador, host: c.endpoint.host };\n const res = await c.transport.enviar({\n url: c.endpoint.url,\n endpoint: c.endpoint,\n metodo: 'POST',\n cabecalhos: { 'content-type': contentTypeSoap12(`${s.namespace}/${s.operacao}`) },\n corpo: envelopeSoap12(soapBodyFor(c.servico, c.mensagem, c.endpoint.autorizador)),\n ...(c.timeoutMs === undefined ? {} : { timeoutMs: c.timeoutMs }),\n ...(c.signal === undefined ? {} : { signal: c.signal }),\n });\n const text = res.texto();\n const fault = lerSoapFault(text);\n if (fault) {\n c.logger.warn('nfe.soap.fault', { ...started, status: res.status, code: fault.code });\n throw new ErroRespostaInvalida(`SOAP fault de ${c.endpoint.host}: ${fault.reason ?? fault.code ?? 'sem motivo'}`, {\n detalhes: { status: res.status, code: fault.code, reason: fault.reason, servico: c.servico },\n });\n }\n let doc: DocumentoXml;\n try {\n doc = lerXml(text.replace(/^\uFEFF/, ''));\n } catch (cause) {\n throw new ErroRespostaInvalida(`resposta de ${c.endpoint.host} não é XML (HTTP ${res.status})`, {\n cause,\n detalhes: { status: res.status, servico: c.servico },\n });\n }\n let ret: ElementoXml | undefined;\n for (const el of descendentes(doc.raiz)) {\n if (el.local === c.retorno && el.ns === NFE_NS) {\n ret = el;\n break;\n }\n }\n if (!ret) ret = retornoForaDoNamespace(doc.raiz, c.retorno);\n if (ret && ret.ns !== NFE_NS) {\n // A SEFAZ-MG devolve o <retConsCad> sem o namespace da NF-e: ele herda o default do WSDL do nfeResultMsg, e só\n // os filhos declaram o da NF-e (visto em homologação e em produção em 28/09/2026). O conteúdo é o do leiaute.\n c.logger.warn('nfe.soap.retorno_fora_do_namespace', { ...started, retorno: c.retorno, ns: ret.ns });\n }\n if (!ret) {\n throw new ErroRespostaInvalida(`resposta de ${c.endpoint.host} sem <${c.retorno}> (HTTP ${res.status})`, {\n detalhes: { status: res.status, servico: c.servico },\n });\n }\n if (!Array.from(descendentes(ret)).some((el) => el.local === 'cStat' && el.ns === NFE_NS)) {\n throw new ErroRespostaInvalida(`<${c.retorno}> de ${c.endpoint.host} sem cStat (HTTP ${res.status})`, {\n detalhes: { status: res.status, servico: c.servico },\n });\n }\n c.logger.debug('nfe.soap.resposta', { ...started, status: res.status });\n return { doc, ret, status: res.status };\n}\n\n/**\n * O elemento de retorno com o nome certo em outro namespace, aceito só quando os filhos dele estão no namespace da\n * NF-e: é o caso do autorizador que esquece o `xmlns` no elemento de retorno e o declara nos filhos. Com os filhos\n * fora do namespace, a resposta continua recusada.\n */\nfunction retornoForaDoNamespace(root: ElementoXml, retorno: string): ElementoXml | undefined {\n for (const el of descendentes(root)) {\n if (el.local !== retorno) continue;\n const filhos = elementosFilhos(el);\n if (filhos.length > 0 && filhos.every((f) => f.ns === NFE_NS)) return el;\n }\n return undefined;\n}\n",
28
28
  "/**\n * Recuperação de um evento que a SEFAZ registrou e cuja resposta se perdeu.\n *\n * Um pedido de evento sem resposta (timeout, conexão caída), ou respondido com 573 (duplicidade de evento) ou 580\n * (evento já registrado no contexto do cancelamento), pode ter sido registrado. O `cStat` sozinho não prova: 573 e\n * 580 dizem que algo foi registrado antes, não que foi este evento, com este conteúdo e para esta chave. A prova é a\n * consulta da chave, que devolve os `procEventoNFe` que a SEFAZ tem (MOC 7.0, Visão Geral, consulta protocolo). Esta\n * função lê o evento de lá e só o dá como registrado quando o retorno dele diz 135, 136 ou 155 para a mesma chave e o\n * mesmo tipo.\n */\n\nimport type { DocumentoXml, ElementoXml } from '@sinete/core/xml';\nimport { lerXml, primeiroFilho, textoDe } from '@sinete/core/xml';\nimport type { ClienteNfe, EnvioOpcoes, EventoRegistrado, ResultadoConsulta } from './client.ts';\nimport { cstatEm } from './outcome.ts';\nimport { NFE_NS, recortarElemento } from './proc.ts';\n\n/** Resultado da recuperação: o evento registrado, com a consulta que o prova, ou só a consulta. */\nexport type RecuperacaoEvento =\n | { readonly registrado: true; readonly evento: EventoRegistrado; readonly consulta: ResultadoConsulta }\n | { readonly registrado: false; readonly consulta: ResultadoConsulta };\n\n/** Texto do filho `local` no namespace da NF-e, se houver. */\nfunction campo(el: ElementoXml, local: string): string | undefined {\n const c = primeiroFilho(el, local, NFE_NS);\n return c === undefined ? undefined : textoDe(c).trim();\n}\n\n/** Lê um `procEventoNFe` da consulta; `undefined` para o que não é um evento com retorno legível. */\nfunction lerProcEvento(xml: string): EventoRegistrado | undefined {\n let doc: DocumentoXml;\n try {\n doc = lerXml(xml);\n } catch {\n return undefined;\n }\n const evento = primeiroFilho(doc.raiz, 'evento', NFE_NS);\n const pedido = evento === undefined ? undefined : primeiroFilho(evento, 'infEvento', NFE_NS);\n const retEl = primeiroFilho(doc.raiz, 'retEvento', NFE_NS);\n const ret = retEl === undefined ? undefined : primeiroFilho(retEl, 'infEvento', NFE_NS);\n if (doc.raiz.local !== 'procEventoNFe' || pedido === undefined || retEl === undefined || ret === undefined) {\n return undefined;\n }\n const cStat = campo(ret, 'cStat');\n const chNFe = campo(ret, 'chNFe');\n const tpEvento = campo(ret, 'tpEvento');\n const nSeq = campo(ret, 'nSeqEvento');\n const dhRegEvento = campo(ret, 'dhRegEvento');\n if (cStat === undefined || !cstatEm(cStat, 'eventoRegistrado')) return undefined;\n // O pedido e o retorno têm de falar do mesmo evento.\n // Chave, tipo e sequência têm de vir no retorno e ser iguais aos do pedido: um retorno registrado de outro evento, ou\n // sem dizer de qual, não prova nada.\n if (chNFe === undefined || tpEvento === undefined || nSeq === undefined) return undefined;\n const nSeqPedido = campo(pedido, 'nSeqEvento');\n if (campo(pedido, 'chNFe') !== chNFe || campo(pedido, 'tpEvento') !== tpEvento) return undefined;\n if (nSeqPedido === undefined || Number(nSeqPedido) !== Number(nSeq)) return undefined;\n if (chNFe === undefined || tpEvento === undefined || nSeq === undefined || dhRegEvento === undefined)\n return undefined;\n const nProt = campo(ret, 'nProt');\n return {\n chNFe,\n tpEvento,\n nSeqEvento: String(Number(nSeq)),\n dhRegEvento,\n retEvento: recortarElemento(doc, retEl, ''),\n procEventoNFe: xml,\n ...(nProt === undefined ? {} : { nProt }),\n };\n}\n\n/**\n * Consulta a chave e devolve o evento `tpEvento` que a SEFAZ registrou para ela (o de maior `nSeqEvento`, quando há\n * vários, como na CC-e; com `nSeqEvento`, só o dessa sequência). Serve depois de um pedido de evento sem resposta ou\n * respondido com 573 ou 580: nunca conclua que o evento existe só pelo `cStat` do pedido. `registrado: false` quer\n * dizer que a consulta não mostrou o evento (ou não decidiu: veja `consulta`); não quer dizer que o evento não existe.\n * `opcoes.signal` cancela a consulta.\n */\nexport async function recuperarEventoRegistrado(\n cliente: ClienteNfe,\n chave: string,\n tpEvento: string,\n nSeqEvento?: number,\n opcoes?: EnvioOpcoes,\n): Promise<RecuperacaoEvento> {\n const consulta = await cliente.consultar(chave, undefined, opcoes);\n if (consulta.tipo !== 'autorizado' && consulta.tipo !== 'denegado') return { registrado: false, consulta };\n let achado: EventoRegistrado | undefined;\n for (const xml of consulta.valor.eventos) {\n const e = lerProcEvento(xml);\n if (e === undefined || e.chNFe !== consulta.valor.chNFe || e.tpEvento !== tpEvento) continue;\n if (nSeqEvento !== undefined && Number(e.nSeqEvento) !== nSeqEvento) continue;\n if (achado === undefined || Number(e.nSeqEvento) > Number(achado.nSeqEvento)) achado = e;\n }\n return achado === undefined ? { registrado: false, consulta } : { registrado: true, evento: achado, consulta };\n}\n",
29
29
  "/**\n * Envio sem resposta e duplicidade na autorização.\n *\n * Idempotência: a chave de acesso contém o `cNF` e o número da nota, e o `digVal` do protocolo é o DigestValue do\n * conteúdo autorizado. Enquanto o mesmo XML assinado (os mesmos bytes) for reenviado, a SEFAZ ou autoriza, ou devolve\n * duplicidade (204) com o protocolo existente. Gerar outro `cNF`, outro `dhEmi` ou reassinar depois de um envio sem\n * resposta cria uma segunda nota para o mesmo número: a primeira pode ter sido autorizada, e a segunda cai em 539\n * (duplicidade com diferença na chave) ou, pior, é autorizada com outra chave se o número mudar. Por isso:\n *\n * 1. grave o XML assinado antes de enviar;\n * 2. envio sem resposta (timeout, conexão caída) ou 204: consulte a chave (`resolverEnvioSemResposta`);\n * 3. `reenviar` (cStat 217, a NF-e não consta): reenvie exatamente os bytes gravados;\n * 4. `concluida`: o `nfeProc` vem montado com o XML gravado, sem novo envio.\n *\n * O `digVal` é opcional no protocolo (`TProtNFe/infProt/digVal`, minOccurs 0 no `leiauteNFe_v4.00.xsd` do PL_010), e\n * há autorizador que o omite. Sem ele, nada prova que o conteúdo registrado é o destes bytes, e as duas decisões se\n * separam:\n *\n * - denegação (110, 301, 302, 303; MOC 7.0 Anexo I, tabela 4.4.3 e regras 1C17-40, 5E17-40 e 5E17-60) é decisão\n * sobre a chave: a NF-e fica registrada como denegada e o número não pode ser reaproveitado nem inutilizado, qualquer\n * que seja o conteúdo. A resolução é `concluida` com o protocolo, e `conteudo` diz se o `digVal` confere, falta ou\n * difere; o `nfeProc` só vem quando confere;\n * - autorização sem `digVal` não prova que a NF-e autorizada é esta: `sem-prova`, e quem chama decide com um humano.\n *\n * Fontes: MOC 7.0 Anexo I (RV 204 \"Duplicidade de NF-e\", RV 539 \"Duplicidade de NF-e com diferença na Chave de\n * Acesso [chNFe: ...]\") e serviço de consulta protocolo (cStat 217; 561, 562 e 613 quando a numeração tem outra NF-e).\n */\n\nimport type { Recusado } from '@sinete/core';\nimport { criarAutorizado, criarDenegado } from '@sinete/core';\nimport type { ClienteNfe, EnvioOpcoes, ProtocoloNfe, ResultadoAutorizacao, ResultadoConsulta } from './client.ts';\nimport { cstatEm } from './outcome.ts';\nimport { documentoAssinado } from './proc.ts';\n\n/**\n * O que o `digVal` do protocolo diz dos bytes assinados: `confere` (é o DigestValue deles), `sem-digval` (o protocolo\n * não o traz) ou `difere` (a SEFAZ registrou outro conteúdo com a mesma chave).\n */\nexport type ConteudoDoProtocolo = 'confere' | 'sem-digval' | 'difere';\n\n/** O que fazer com uma NF-e cujo envio ficou sem resposta ou voltou como duplicidade. */\nexport type ResolucaoEnvio =\n /**\n * A chave está decidida: autorizada (ou cancelada) com o mesmo conteúdo, e `resultado` traz o protocolo e o `nfeProc`;\n * ou denegada, com qualquer conteúdo (a denegação é da chave), e `resultado` traz o protocolo, com o `nfeProc` só\n * quando `conteudo` é `confere`.\n */\n | {\n readonly acao: 'concluida';\n readonly situacao: 'autorizada' | 'cancelada' | 'denegada';\n readonly conteudo: ConteudoDoProtocolo;\n readonly resultado: ResultadoAutorizacao;\n }\n /** A NF-e não consta na SEFAZ (217): reenvie `nfeAssinada`, os mesmos bytes. */\n | { readonly acao: 'reenviar'; readonly nfeAssinada: string }\n /**\n * Existe outra NF-e para o mesmo número: a mesma chave com outro conteúdo (`digVal` diferente) ou outra chave (539 no\n * envio, ou 561, 562 e 613 na consulta; `chNFe` extraída do `xMotivo` quando vier). Não reenvie: recupere a nota registrada e descarte a local.\n */\n | {\n readonly acao: 'divergente';\n readonly chNFe?: string;\n readonly consulta?: ResultadoConsulta;\n readonly motivo: Recusado | ResultadoConsulta;\n }\n /**\n * A chave está autorizada (ou cancelada), mas o protocolo não traz `digVal`: nada prova que o conteúdo autorizado é o\n * destes bytes. Não reenvie nem descarte a nota local, e não a guarde como autorizada sem conferir o XML registrado\n * na SEFAZ (a Distribuição DF-e ou o portal devolvem a NF-e autorizada).\n */\n | { readonly acao: 'sem-prova'; readonly situacao: 'autorizada' | 'cancelada'; readonly consulta: ResultadoConsulta }\n /**\n * A consulta não decidiu (serviço paralisado, consumo indevido, rejeição de schema, situação sem protocolo): tente de\n * novo mais tarde, sem descartar a nota local.\n */\n | { readonly acao: 'indefinida'; readonly resultado: ResultadoConsulta };\n\n/** Chave com CNPJ alfanumérico (NT 2025.001): 6 dígitos, 12 alfanuméricos, 26 dígitos. */\nconst CHAVE_NO_MOTIVO = /\\[\\s*chNFe\\s*:\\s*([0-9]{6}[0-9A-Z]{12}[0-9]{26})\\s*\\]/i;\n\n/** Chave de acesso que a SEFAZ informa no `xMotivo` da rejeição 539 (`[chNFe:...]`), se houver. */\nexport function chaveDaDuplicidade(xMotivo: string): string | undefined {\n return CHAVE_NO_MOTIVO.exec(xMotivo)?.[1]?.toUpperCase();\n}\n\n/**\n * Resolve um envio de autorização sem resposta, ou cuja resposta foi 204 ou 539, consultando a chave da NF-e\n * assinada. `anterior` é o desfecho do envio, quando houve um. `opcoes.signal` cancela a consulta (lança o\n * `ErroTransporte` com `code: 'cancelado'`).\n */\nexport async function resolverEnvioSemResposta(\n cliente: ClienteNfe,\n nfeAssinada: string,\n anterior?: ResultadoAutorizacao,\n opcoes?: EnvioOpcoes,\n): Promise<ResolucaoEnvio> {\n const a = documentoAssinado(nfeAssinada, 'NFe', 'infNFe');\n const chave = a.id.slice(3);\n if (anterior && anterior.tipo === 'recusado' && cstatEm(anterior.cStat, 'duplicidadeChaveDiferente')) {\n const outra = chaveDaDuplicidade(anterior.xMotivo);\n return { acao: 'divergente', motivo: anterior, ...(outra === undefined ? {} : { chNFe: outra }) };\n }\n const consulta = await cliente.consultar(chave, nfeAssinada, opcoes);\n if (consulta.tipo === 'recusado') {\n if (cstatEm(consulta.cStat, 'naoConsta')) return { acao: 'reenviar', nfeAssinada: a.xml };\n // 561, 562 e 613 na consulta: a chave local não consta, mas a numeração dela tem outra NF-e (outro mês, outro cNF\n // ou outra chave). É a mesma situação da 539 no envio; o 562 traz a chave registrada no xMotivo.\n if (cstatEm(consulta.cStat, 'outraNfeNoNumero')) {\n const outra = chaveDaDuplicidade(consulta.xMotivo);\n return { acao: 'divergente', motivo: consulta, ...(outra === undefined ? {} : { chNFe: outra }) };\n }\n return { acao: 'indefinida', resultado: consulta };\n }\n if (consulta.tipo === 'pendente') return { acao: 'indefinida', resultado: consulta };\n const v = consulta.valor;\n const p: ProtocoloNfe | undefined = v.protocolo;\n if (!p) return { acao: 'indefinida', resultado: consulta };\n const conteudo: ConteudoDoProtocolo =\n p.digVal === undefined ? 'sem-digval' : v.digValConfere === true ? 'confere' : 'difere';\n const protStatus = { cStat: p.cStat, xMotivo: p.xMotivo };\n // A denegação é da chave: o número está denegado com qualquer conteúdo, e o `conteudo` diz se é o destes bytes.\n if (v.situacao === 'denegada')\n return { acao: 'concluida', situacao: 'denegada', conteudo, resultado: criarDenegado(protStatus, p) };\n // Só um digVal presente e diferente prova outro conteúdo para a chave.\n if (conteudo === 'difere') return { acao: 'divergente', chNFe: chave, consulta, motivo: consulta };\n if (conteudo === 'sem-digval') return { acao: 'sem-prova', situacao: v.situacao, consulta };\n if (p.nfeProc === undefined) return { acao: 'indefinida', resultado: consulta };\n return { acao: 'concluida', situacao: v.situacao, conteudo, resultado: criarAutorizado(protStatus, p) };\n}\n"
30
30
  ],
31
- "mappings": "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",
32
- "debugId": "9351F0AE81B9EE1064756E2164756E21",
31
+ "mappings": "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",
32
+ "debugId": "ED0E3E2F03183E8464756E2164756E21",
33
33
  "names": []
34
34
  }