{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/crypto/xml-signer.ts","../src/index.ts","../src/types/index.ts","../src/types/enums.ts","../src/types/dtos.ts","../src/types/context.ts","../src/service/contribuinte-service.ts","../src/xml/dps-builder.ts","../src/xml/escape.ts","../src/xml/eventos-builder.ts","../src/utils/id-generator.ts","../src/utils/cpf-cnpj.ts","../src/crypto/certificate.ts","../src/http/sefin-client.ts","../src/utils/endpoint-resolver.ts","../src/xml/nfse-parser.ts","../src/validator/dps-validator.ts","../src/validator/dps-schema.ts","../src/utils/xsd-string.ts","../src/data/ibs-cbs-class-trib.ts","../src/danfe/danfe-service.ts","../src/danfe/html-renderer.ts","../src/danfe/pdf-generator.ts","../src/danfe/preview-builder.ts","../src/utils/cpf-cnpj-generator.ts","../src/utils/tax-calculator.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n  typeof document === \"undefined\" \n    ? new URL(`file:${__filename}`).href \n    : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n      ? document.currentScript.src \n      : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Assinador de XML com XMLDSig (RSA-SHA256)\n * Migrado de nfse-php/src/Signer/XmlSigner.php\n */\n\nimport { SignedXml } from 'xml-crypto'\nimport type { CertificateInfo } from './certificate.js'\n\nexport type SignatureAlgorithm = 'SHA1' | 'SHA256'\n\n/**\n * Assina um XML com XMLDSig enveloped (RSA-SHA256 por padrão).\n *\n * @throws {Error} Se o conteúdo XML for vazio.\n * @throws {Error} Se a tag a assinar não for encontrada no XML.\n * @throws {Error} Se a tag encontrada não possuir o atributo `Id` (ou estiver vazio).\n */\nexport function signXml(\n  xml: string,\n  tagName: string,\n  cert: CertificateInfo,\n  algorithm: SignatureAlgorithm = 'SHA256'\n): string {\n  // Guards — portado de nfse-php/src/Signer/XmlSigner.php\n  if (!xml || xml.trim() === '') {\n    throw new Error('Conteúdo XML vazio.')\n  }\n\n  // Detecta tag de abertura: <tagName>, <tagName attr...>, <tagName/>\n  // Usa lookahead de [\\s>/] para não bater em nomes mais longos (ex: <infDPSExtended)\n  const tagRegex = new RegExp(`<${tagName}[\\\\s>/]`)\n  if (!tagRegex.test(xml)) {\n    throw new Error(`Tag ${tagName} não encontrada para assinatura.`)\n  }\n\n  const idRegex = new RegExp(`<${tagName}[^>]*\\\\sId=\"([^\"]*)\"`)\n  const idMatch = idRegex.exec(xml)\n  if (!idMatch || idMatch[1] === '') {\n    throw new Error(`Tag a ser assinada deve possuir um atributo 'Id'.`)\n  }\n\n  const sigAlgorithm = algorithm === 'SHA256'\n    ? 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'\n    : 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'\n\n  const digestAlgorithm = algorithm === 'SHA256'\n    ? 'http://www.w3.org/2001/04/xmlenc#sha256'\n    : 'http://www.w3.org/2000/09/xmldsig#sha1'\n\n  const sig = new SignedXml({\n    privateKey: cert.privateKeyPem,\n    publicCert: cert.certificatePem,\n    signatureAlgorithm: sigAlgorithm,\n    canonicalizationAlgorithm: 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315',\n  })\n\n  sig.addReference({\n    xpath: `//*[local-name(.)='${tagName}']`,\n    digestAlgorithm,\n    transforms: [\n      'http://www.w3.org/2000/09/xmldsig#enveloped-signature',\n      'http://www.w3.org/TR/2001/REC-xml-c14n-20010315',\n    ],\n  })\n\n  sig.computeSignature(xml, {\n    location: {\n      reference: `//*[local-name(.)='${tagName}']`,\n      action: 'after',\n    },\n  })\n\n  let signedXml = sig.getSignedXml()\n  return injectCertificate(signedXml, cert.certificateClean)\n}\n\nfunction injectCertificate(signedXml: string, certificateClean: string): string {\n  const keyInfoBlock = `<KeyInfo><X509Data><X509Certificate>${certificateClean}</X509Certificate></X509Data></KeyInfo>`\n  if (signedXml.includes('<KeyInfo>')) {\n    return signedXml.replace(/<KeyInfo>[\\s\\S]*?<\\/KeyInfo>/, keyInfoBlock)\n  }\n  return signedXml.replace('</Signature>', `${keyInfoBlock}</Signature>`)\n}\n\n/**\n * Comprime XML para GZip+Base64 (formato exigido pela SEFIN Nacional)\n */\nexport async function compressXml(xml: string): Promise<string> {\n  const data = new TextEncoder().encode(xml)\n  const cs = new CompressionStream('gzip')\n  const writer = cs.writable.getWriter()\n  writer.write(data)\n  writer.close()\n\n  const chunks: Uint8Array[] = []\n  const reader = cs.readable.getReader()\n  while (true) {\n    const { done, value } = await reader.read()\n    if (done) break\n    chunks.push(value)\n  }\n\n  const total = chunks.reduce((acc, c) => acc + c.length, 0)\n  const out = new Uint8Array(total)\n  let offset = 0\n  for (const chunk of chunks) { out.set(chunk, offset); offset += chunk.length }\n  return Buffer.from(out).toString('base64')\n}\n\n/**\n * Descomprime Base64+GZip recebido da SEFIN\n */\nexport async function decompressXml(base64: string): Promise<string> {\n  const compressed = Buffer.from(base64, 'base64')\n  const ds = new DecompressionStream('gzip')\n  const writer = ds.writable.getWriter()\n  writer.write(compressed)\n  writer.close()\n\n  const chunks: Uint8Array[] = []\n  const reader = ds.readable.getReader()\n  while (true) {\n    const { done, value } = await reader.read()\n    if (done) break\n    chunks.push(value)\n  }\n\n  const total = chunks.reduce((acc, c) => acc + c.length, 0)\n  const out = new Uint8Array(total)\n  let offset = 0\n  for (const chunk of chunks) { out.set(chunk, offset); offset += chunk.length }\n  return new TextDecoder().decode(out)\n}\n","/**\n * gerador-nfse-nacional-bun\n * Gerador de NFS-e Nacional em TypeScript/Bun\n *\n * Migrado de:\n * - nfse-php (https://github.com/nfse-nacional/nfse-php)\n * - direction-nfse-danfe (https://github.com/JairoMarques/direction-nfse-danfe)\n */\n\n// Types\nexport * from './types/index.js'\n\n// Services\nexport { ContribuinteService, DpsValidationError, NfseNaoEncontradaError, NfseJaCanceladaError } from './service/contribuinte-service.js'\nexport { DanfeService } from './danfe/danfe-service.js'\nexport type { DanfeResult, DanfeGenerateOptions, PreviewOptions, PreviewResult } from './danfe/danfe-service.js'\nexport { DanfePreviewFormat } from './danfe/danfe-service.js'\nexport { renderDanfseHtml, buildQrUrl } from './danfe/html-renderer.js'\nexport type { DanfeWarning, DanfeRenderResult, DanfeOptions } from './danfe/html-renderer.js'\nexport { buildPreviewSchema } from './danfe/preview-builder.js'\n\n// XML builders\nexport { buildDpsXml } from './xml/dps-builder.js'\nexport { buildPedRegEventoXml } from './xml/eventos-builder.js'\nexport { parseNfseXml } from './xml/nfse-parser.js'\nexport type { NfseSchema, InfNFSeSchema } from './xml/nfse-parser.js'\n\n// Crypto\nexport { loadCertificate, signWithKey } from './crypto/certificate.js'\nexport type { CertificateInfo } from './crypto/certificate.js'\nexport { signXml, compressXml, decompressXml } from './crypto/xml-signer.js'\n\n// Utils\nexport { formatCpf, formatCnpj, formatCep, formatTelefone, onlyDigits, isValidCpf, isValidCnpj } from './utils/cpf-cnpj.js'\nexport {\n  normalizeTsString,\n  normalizeXsString,\n  isTsString,\n  isTsCep,\n  isTsCodPaisIso,\n  missingFieldsMessage,\n  TS_LOGRADOURO_MAX,\n  TS_NUMERO_ENDERECO_MAX,\n  TS_COMPLEMENTO_ENDERECO_MAX,\n  TS_BAIRRO_MAX,\n  TS_EMAIL_MAX,\n  TS_CIDADE_MAX,\n  TS_ESTADO_PROV_REGIAO_MAX,\n  TS_CODIGO_END_POSTAL_MAX,\n  TS_NOME_RAZAO_SOCIAL_MAX,\n  TS_NIF_MAX,\n  TS_INSC_MUN_MAX,\n  TS_DESC_INF_COMPL_MAX,\n  TS_DESC_255_MAX,\n  TS_IDE_EVENTO_MAX,\n} from './utils/xsd-string.js'\n\n// Tabela oficial CST × cClassTrib (usada pelo validateDps).\n// A correlação do Anexo VIII e o sugerirIbsCbs vivem em 'nfse-nacional/tabelas'.\nexport { IBS_CBS_CST_TABLE, IBS_CBS_CST_INDEX, IBS_CBS_CST_TABLE_ATUALIZADA_EM } from './data/ibs-cbs-class-trib.js'\nexport type { CstInfo, ClassTribInfo } from './data/ibs-cbs-class-trib.js'\nexport { generateDpsId, generateNumDps, formatDataCompetencia, formatDhEmissao } from './utils/id-generator.js'\nexport { generateCpf, generateCnpj } from './utils/cpf-cnpj-generator.js'\nexport { calculateTax } from './utils/tax-calculator.js'\n\n// Validator\nexport { validateDps } from './validator/dps-validator.js'\nexport type { ValidationResult } from './validator/dps-validator.js'\nexport {\n  DpsSchema,\n  InfDpsSchema,\n  PrestadorSchema,\n  TomadorSchema,\n  ServicoSchema,\n  ValoresSchema,\n  TributacaoSchema,\n  IbsCbsSchema,\n} from './validator/dps-schema.js'\nexport type { DpsSchemaInput, DpsSchemaOutput } from './validator/dps-schema.js'\n\n// HTTP client (baixo nível)\nexport { SefinClient, NfseApiError } from './http/sefin-client.js'\n","export * from './enums.js'\nexport * from './dtos.js'\nexport * from './context.js'\n","/**\n * Enumerações para o sistema NFS-e Nacional\n * Migrado de nfse-php/src/Enums/\n */\n\nexport enum TipoAmbiente {\n  Producao = 1,\n  Homologacao = 2,\n}\n\nexport enum TipoPessoa {\n  PessoaFisica = 1,\n  PessoaJuridica = 2,\n  Estrangeiro = 3,\n}\n\nexport enum EmitenteDPS {\n  Prestador = 1,\n  Tomador = 2,\n  Intermediario = 3,\n  NaoAplicavel = 4,\n}\n\nexport enum ModoPrestacao {\n  Presencial = 1,\n  PorMeioDeTelecomunicacoes = 2,\n  Online = 3,\n  NaoAplicavel = 4,\n}\n\n/**\n * Motivo para não informação do NIF (`cNaoNIF`) — XSD `TSCodNaoNIF`.\n */\nexport enum MotivoNaoNif {\n  /**\n   * Não informado na nota de origem.\n   *\n   * ⚠️ **Não serve para emitir.** A SEFIN rejeita com **E0226** — este motivo\n   * só existe para representar notas de origem/substituição em que o dado não\n   * veio preenchido. `validateDps` rejeita antes do envio. Para emissão use\n   * {@link MotivoNaoNif.DispensadoDoNif} ou\n   * {@link MotivoNaoNif.NaoExigenciaDoNif}.\n   */\n  NaoInformadoNaOrigem = '0',\n  /** Tomador dispensado do NIF. */\n  DispensadoDoNif = '1',\n  /** País do tomador não exige NIF. */\n  NaoExigenciaDoNif = '2',\n}\n\nexport enum ProcessoEmissao {\n  Normal = 1,\n  SubstituicaoNFSe = 2,\n}\n\nexport enum CodigoStatus {\n  Ativo = 1,\n  Cancelado = 2,\n  Substituido = 3,\n}\n\n/**\n * Situação tributária do ISSQN (`tribISSQN`) — XSD `TSTribISSQN` v1.01.\n *\n * O XSD aceita SOMENTE 1..4. Não existe \"Isento\" nem \"Não Tributada SN\":\n * o que coloquialmente se chama de \"isenção\" de ISS é, no modelo da NFS-e\n * nacional, uma **Imunidade** (`Imunidade = 2`), detalhada por `tpImunidade`.\n */\nexport enum TributacaoIssqn {\n  OperacaoTributavel = 1,\n  Imunidade = 2,\n  ExportacaoServico = 3,\n  NaoIncidencia = 4,\n}\n\nexport enum TipoRetencaoIssqn {\n  NaoRetido = 1,\n  RetidoTomador = 2,\n  RetidoIntermediario = 3,\n}\n\nexport enum TipoRetencaoPisCofins {\n  NaoRetido = 0,\n  Retido = 1,\n}\n\nexport enum TipoImunidade {\n  SemImunidade = 0,\n  PatrimonioRendaServicos = 1,\n  Templos = 2,\n  PartidosPoliticos = 3,\n  EntidadesEducacionais = 4,\n  EntidadesAssistenciais = 5,\n}\n\nexport enum TipoDeducaoReducao {\n  Deducao = 1,\n  Reducao = 2,\n}\n\nexport enum TipoSuspensao {\n  SemSuspensao = 0,\n  SuspensaoJudicial = 1,\n  SuspensaoAdministrativa = 2,\n}\n\nexport enum OpcaoSimplesNacional {\n  NaoOptante = 1,\n  Optante = 2,\n}\n\nexport enum RegimeApuracaoSN {\n  Competencia = 1,\n  Caixa = 2,\n}\n\nexport enum RegimeEspecialTributacao {\n  Nenhum = 0,\n  MicroEmpresaMunicipal = 1,\n  Estimativa = 2,\n  SociedadeProfissionais = 3,\n  Cooperativa = 4,\n  MicroEmpresarioIndividual = 5,\n  MicroEmpresarioEmpresaPequenoPorte = 6,\n}\n\nexport enum MotivoEmissaoTomadorIntermediario {\n  NaoAplicavel = 0,\n  ForcaMaior = 1,\n  PorDeterminacaoLegal = 2,\n  PrestadorNaoEmitiu = 3,\n}\n\nexport enum AmbienteGerador {\n  NacionalSefinNacional = 1,\n  MunicipalSefimMunicipal = 2,\n}\n\nexport enum IndicadorTotalTributos {\n  NaoInformado = 0,\n  Informado = 1,\n}\n\nexport enum DanfeEnvironment {\n  Production = 1,\n  Restricted = 2,\n}\n\n/**\n * Todos os tipos de evento previstos no XSD `tiposEventos_v1.01.xsd`.\n *\n * Use este enum no campo `tipoEvento` de `PedRegEventoData`.\n *\n * Grupos:\n *  - 1xxxxx  Cancelamento (iniciado pelo contribuinte ou autoridade fiscal)\n *  - 2xxxxx  Manifestação (confirmação / rejeição do serviço)\n *  - 3xxxxx  Atos de ofício (bloqueio / desbloqueio pela SEFIN)\n */\nexport enum TipoEvento {\n  // ── Cancelamento ────────────────────────────────────────────────────────────\n  /** e101101 — Cancelamento de NFS-e (uso mais comum; requer cMotivo). */\n  Cancelamento                         = 101101,\n  /** e105102 — Cancelamento de NFS-e por Substituição. */\n  CancelamentoPorSubstituicao          = 105102,\n  /** e101103 — Solicitação de Análise Fiscal para Cancelamento de NFS-e. */\n  SolicitacaoAnaliseFiscal             = 101103,\n  /** e105104 — Cancelamento de NFS-e Deferido por Análise Fiscal. */\n  CancelamentoDeferidoAnaliseFiscal    = 105104,\n  /** e105105 — Cancelamento de NFS-e Indeferido por Análise Fiscal. */\n  CancelamentoIndeferidoAnaliseFiscal  = 105105,\n\n  // ── Manifestação ────────────────────────────────────────────────────────────\n  /** e202201 — Confirmação do Prestador. */\n  ConfirmacaoPrestador    = 202201,\n  /** e203202 — Confirmação do Tomador. */\n  ConfirmacaoTomador      = 203202,\n  /** e204203 — Confirmação do Intermediário. */\n  ConfirmacaoIntermediario = 204203,\n  /** e205204 — Confirmação Tácita. */\n  ConfirmacaoTacita       = 205204,\n  /** e202205 — Rejeição do Prestador. */\n  RejeicaoPrestador       = 202205,\n  /** e203206 — Rejeição do Tomador. */\n  RejeicaoTomador         = 203206,\n  /** e204207 — Rejeição do Intermediário. */\n  RejeicaoIntermediario   = 204207,\n  /** e205208 — Anulação da Rejeição. */\n  AnulacaoRejeicao        = 205208,\n\n  // ── Ofício ──────────────────────────────────────────────────────────────────\n  /** e305101 — Cancelamento de NFS-e por Ofício. */\n  CancelamentoPorOficio   = 305101,\n  /** e305102 — Bloqueio de NFS-e por Ofício. */\n  BloqueioPorOficio       = 305102,\n  /** e305103 — Desbloqueio de NFS-e por Ofício. */\n  DesbloqueioDeOficio     = 305103,\n}\n\n/**\n * Código de justificativa de cancelamento (TSCodJustCanc).\n *\n * Obrigatório apenas para o evento `TipoEvento.Cancelamento` (e101101).\n * Enviado no campo `cMotivo` de `PedRegEventoData`.\n */\nexport enum MotivoEventoCancelamento {\n  /** Erro ocorrido durante a emissão da nota. */\n  ErroNaEmissao      = 1,\n  /** Serviço descrito na nota não foi efetivamente prestado. */\n  ServicoNaoPrestado = 2,\n  /** Outros motivos não enquadrados nas opções anteriores. */\n  Outros             = 9,\n}\n\n/**\n * Atalho semântico — subconjunto de `TipoEvento` para cancelamentos\n * iniciados diretamente pelo contribuinte.\n *\n * @deprecated Prefira `TipoEvento` para maior clareza.\n */\nexport enum TipoEventoCancelamento {\n  /** `TipoEvento.Cancelamento` — cancelamento direto (requer cMotivo). */\n  Cancelamento                = TipoEvento.Cancelamento,\n  /** `TipoEvento.CancelamentoPorSubstituicao` — substituição por nova nota. */\n  PorSubstituicao             = TipoEvento.CancelamentoPorSubstituicao,\n  /** `TipoEvento.SolicitacaoAnaliseFiscal` — pedido de análise fiscal. */\n  SolicitacaoAnaliseFiscal    = TipoEvento.SolicitacaoAnaliseFiscal,\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Comércio Exterior (bloco <comExt> / XSD TCInfoComExt)\n//\n// Estes enums são STRING (não numéricos): vários códigos têm zero à esquerda\n// (`'00'`..`'26'`) que um enum numérico do TS converteria para `1`, quebrando o\n// XML. Para uniformidade, os de dígito único também são string — o tipo XSD é\n// `xs:string`. Fonte: tiposSimples_v1.01.xsd.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Modo de prestação no comércio exterior (`mdPrestacao`) — XSD `TSModoPrestacao`.\n */\nexport enum ModoPrestacaoComExt {\n  /** Desconhecido (tipo não informado na nota de origem). */\n  Desconhecido = '0',\n  Transfronteirico = '1',\n  ConsumoNoBrasil = '2',\n  PresencaComercialExterior = '3',\n  MovimentoTemporarioPessoasFisicas = '4',\n}\n\n/**\n * Vínculo entre as partes no negócio (`vincPrest`) — XSD `TSVincPrest`.\n */\nexport enum VinculoPrestacao {\n  SemVinculo = '0',\n  Controlada = '1',\n  Controladora = '2',\n  Coligada = '3',\n  Matriz = '4',\n  FilialOuSucursal = '5',\n  OutroVinculo = '6',\n}\n\n/**\n * Mecanismo de apoio/fomento ao Comércio Exterior do **prestador**\n * (`mecAFComexP`) — XSD `TSMecAFComExPrest`.\n */\nexport enum MecAFComexPrestador {\n  /** Desconhecido (tipo não informado na nota de origem). */\n  Desconhecido = '00',\n  Nenhum = '01',\n  /** ACC — Adiantamento sobre Contrato de Câmbio (redução a zero do IR e IOF). */\n  ACC = '02',\n  /** ACE — Adiantamento sobre Cambiais Entregues (redução a zero do IR e IOF). */\n  ACE = '03',\n  BNDESEximPosEmbarque = '04',\n  BNDESEximPreEmbarque = '05',\n  /** FGE — Fundo de Garantia à Exportação. */\n  FGE = '06',\n  ProexEqualizacao = '07',\n  ProexFinanciamento = '08',\n}\n\n/**\n * Mecanismo de apoio/fomento ao Comércio Exterior do **tomador**\n * (`mecAFComexT`) — XSD `TSMecAFComExToma`.\n */\nexport enum MecAFComexTomador {\n  /** Desconhecido (tipo não informado na nota de origem). */\n  Desconhecido = '00',\n  Nenhum = '01',\n  AdmPublicaRepInternacional = '02',\n  AlugueisArrendMaquinasEmbarcAeronaves = '03',\n  ArrendAeronaveTransporteAereoPublico = '04',\n  ComissaoAgentesExternosExportacao = '05',\n  DespesasArmazenagemMovTransporteExterior = '06',\n  EventosFifaSubsidiaria = '07',\n  EventosFifa = '08',\n  FretesArrendEmbarcacoesAeronaves = '09',\n  MaterialAeronautico = '10',\n  PromocaoBensExterior = '11',\n  PromocaoDestinosTuristicosBrasileiros = '12',\n  PromocaoBrasilExterior = '13',\n  PromocaoServicosExterior = '14',\n  Recine = '15',\n  Recopa = '16',\n  RegistroManutencaoMarcasPatentesCultivares = '17',\n  Reicomp = '18',\n  Reidi = '19',\n  Repenec = '20',\n  Repes = '21',\n  Retaero = '22',\n  Retid = '23',\n  RoyaltiesAssistenciaTecnicaCientifica = '24',\n  ServicosAvaliacaoConformidadeOMC = '25',\n  /** ZPE — Zona de Processamento de Exportação. */\n  ZPE = '26',\n}\n\n/**\n * Vínculo da operação à movimentação temporária de bens (`movTempBens`) —\n * XSD `TSMovTempBens`.\n */\nexport enum MovimentacaoTemporariaBens {\n  /** Desconhecido (tipo não informado na nota de origem). */\n  Desconhecido = '0',\n  Nao = '1',\n  VinculadaImportacao = '2',\n  VinculadaExportacao = '3',\n}\n\n/**\n * Compartilhamento das informações da NFS-e com a Secretaria de Comércio\n * Exterior (`mdic`) — XSD `TSEnvMDIC`.\n */\nexport enum EnvioMDIC {\n  NaoEnviar = '0',\n  Enviar = '1',\n}\n\n/**\n * Código de moeda da transação (`tpMoeda`) — XSD `TSCodMoeda` (`[0-9]{3}`).\n *\n * **Não é um enum fechado:** o XSD aceita qualquer código de 3 dígitos da\n * tabela de moedas do BACEN. Os membros abaixo são atalhos para as moedas mais\n * comuns; outros códigos podem ser informados como string crua de 3 dígitos.\n *\n * Códigos conforme a Tabela de Moedas do BACEN (≠ ISO 4217 numérico).\n */\nexport enum CodigoMoeda {\n  /** Real brasileiro. */\n  Real = '790',\n  /** Dólar dos Estados Unidos. */\n  DolarEUA = '220',\n  /** Euro. */\n  Euro = '978',\n  /** Libra esterlina. */\n  LibraEsterlina = '540',\n  /** Iene japonês. */\n  Iene = '470',\n  /** Franco suíço. */\n  FrancoSuico = '425',\n}\n\n/** Formato de saída do preview da DANF-Se. */\nexport enum DanfePreviewFormat {\n  /** HTML puro — rápido, sem Puppeteer. Abra no browser para visualizar. */\n  Html = 'html',\n  /** PDF gerado via Puppeteer — requer `bun add puppeteer`. */\n  Pdf = 'pdf',\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// IBS/CBS — Reforma Tributária (bloco <IBSCBS> / XSD TCRTCInfoIBSCBS)\n//\n// Também STRING enums: `CST` e `cClassTrib` têm zeros à esquerda (`'000'`,\n// `'000001'`) que um enum numérico do TS destruiria. Fontes: tabelas oficiais\n// do Portal Nacional (Anexo VIII — correlação item LC 116/2003 × NBS × indOp ×\n// cClassTrib) e tiposSimples_v1.01.xsd.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Finalidade da emissão da NFS-e (`finNFSe`) — XSD `TSRTCFinNFSe`.\n */\nexport enum FinalidadeNFSe {\n  /** NFS-e regular (único valor aceito hoje pelo XSD v1.01). */\n  Normal = '0',\n}\n\n/**\n * Indicador de destinatário (`indDest`) — XSD `TSRTCIndDest`.\n */\nexport enum IndicadorDestinatario {\n  /** `0` — tomador = adquirente = destinatário (identificado na própria NFS-e). */\n  TomadorEhDestinatario = '0',\n  /**\n   * `1` — tomador = adquirente ≠ destinatário: outra pessoa física/jurídica (ou\n   * equiparada), ou estabelecimento diferente do indicado como tomador. Exige o\n   * grupo `dest`, **ainda não implementado neste builder**.\n   */\n  DestinatarioDiferente = '1',\n}\n\n/**\n * Operação de uso ou consumo pessoal — art. 57 (`indFinal`) — XSD `TSRTCIndFinal`.\n *\n * **Obrigatório** dentro do grupo `IBSCBS` (o XSD não marca `minOccurs=\"0\"`).\n */\nexport enum IndicadorConsumidorFinal {\n  Nao = '0',\n  Sim = '1',\n}\n\n/**\n * Tipo de operação com entes governamentais **ou outros serviços sobre bens\n * imóveis** (`tpOper`) — XSD `TSRTCTpOper`.\n */\nexport enum TipoOperacaoEnteGov {\n  /** `1` — Fornecimento com pagamento posterior. */\n  FornecimentoComPagamentoPosterior = '1',\n  /** `2` — Recebimento do pagamento com fornecimento já realizado. */\n  RecebimentoComFornecimentoRealizado = '2',\n  /** `3` — Fornecimento com pagamento já realizado. */\n  FornecimentoComPagamentoRealizado = '3',\n  /** `4` — Recebimento do pagamento com fornecimento posterior. */\n  RecebimentoComFornecimentoPosterior = '4',\n  /** `5` — Fornecimento e recebimento do pagamento concomitantes. */\n  FornecimentoERecebimentoConcomitantes = '5',\n}\n\n/**\n * Tipo de ente governamental (`tpEnteGov`) — XSD `TSRTCTpEnteGov`.\n * Vale para a administração pública direta e suas autarquias e fundações.\n *\n * O campo `tpEnteGov` **ainda não é emitido** pelo builder — o enum existe para\n * quando for.\n */\nexport enum TipoEnteGovernamental {\n  Uniao = '1',\n  Estado = '2',\n  DistritoFederal = '3',\n  Municipio = '4',\n}\n\n/**\n * CST — Código de Situação Tributária do IBS/CBS (`CST`, 3 dígitos).\n *\n * **Não é um enum fechado:** a tabela oficial de CST do IBS/CBS é extensa. Os\n * membros abaixo são atalhos para os casos mais comuns na prestação de\n * serviços; qualquer outro código pode ser informado como string de 3 dígitos.\n */\nexport enum CstIbsCbs {\n  /** `000` — Tributação integral pelo IBS e CBS. */\n  TributacaoIntegral = '000',\n  /** `410` — Imunidade e não incidência (inclui exportação de serviço). */\n  ImunidadeNaoIncidencia = '410',\n}\n\n/**\n * cClassTrib — Código de Classificação Tributária do IBS/CBS (6 dígitos).\n *\n * **Não é um enum fechado:** vale o mesmo aviso de {@link CstIbsCbs}. Cada\n * `cClassTrib` pertence a um `CST`; use a combinação prevista na tabela\n * oficial (os dois primeiros dígitos repetem o CST).\n */\nexport enum ClassTribIbsCbs {\n  /** `000001` — Situações tributadas integralmente pelo IBS e CBS (CST `000`). */\n  TributacaoIntegral = '000001',\n  /** `410004` — Exportações de bens e serviços (CST `410`). */\n  ExportacaoBensServicos = '410004',\n}\n\n/**\n * cIndOp — Código indicador da operação de fornecimento (6 dígitos).\n *\n * **Não é um enum fechado:** o Anexo VIII do Portal Nacional traz a tabela\n * completa, correlacionada com o item da LC 116/2003 e com o `cClassTrib`. Os\n * membros abaixo cobrem os \"demais serviços em operações onerosas\".\n */\nexport enum CodigoIndOp {\n  /**\n   * `100301` — Demais serviços, em operações onerosas. Local do domicílio\n   * principal do adquirente residente ou domiciliado no País.\n   */\n  DemaisServicosAdquirenteNoPais = '100301',\n  /**\n   * `100302` — Demais serviços, em operações onerosas, quando o adquirente\n   * **não** é residente nem domiciliado no País (exportação de serviço).\n   */\n  DemaisServicosAdquirenteExterior = '100302',\n}\n","/**\n * DTOs para o sistema NFS-e Nacional\n * Migrado de nfse-php/src/Dto/Nfse/ e direction-nfse-danfe/src/Danfe/Schemas/\n */\n\nimport type {\n  TipoAmbiente,\n  EmitenteDPS,\n  MotivoNaoNif,\n  TributacaoIssqn,\n  TipoRetencaoIssqn,\n  TipoRetencaoPisCofins,\n  TipoImunidade,\n  TipoSuspensao,\n  OpcaoSimplesNacional,\n  RegimeEspecialTributacao,\n  MotivoEmissaoTomadorIntermediario,\n  IndicadorTotalTributos,\n  TipoEvento,\n  MotivoEventoCancelamento,\n  ModoPrestacaoComExt,\n  VinculoPrestacao,\n  CodigoMoeda,\n  MecAFComexPrestador,\n  MecAFComexTomador,\n  MovimentacaoTemporariaBens,\n  EnvioMDIC,\n  FinalidadeNFSe,\n  IndicadorDestinatario,\n  IndicadorConsumidorFinal,\n  TipoOperacaoEnteGov,\n  CstIbsCbs,\n  ClassTribIbsCbs,\n  CodigoIndOp,\n} from './enums.js'\n\n// ---------------------------------------------------------------------------\n// Endereço\n// ---------------------------------------------------------------------------\n\n/**\n * Endereço no exterior (elemento `endExt` no XML, dentro de `<end>`).\n * Usado quando o prestador, tomador ou intermediário não tem endereço nacional.\n * Mutuamente exclusivo com `cMun` (XSD TCEndereco: choice entre `endNac` e `endExt`).\n */\nexport interface EnderecoExteriorData {\n  /**\n   * Código do país conforme tabela de países do exterior da NFS-e (`cPais`).\n   * Ex.: `SA` (Arábia Saudita), `US` (Estados Unidos), `PT` (Portugal).\n   */\n  cPais: string\n  /** Código de endereçamento postal estrangeiro (`cEndPost`). Ex.: `13332-7663`. */\n  cEndPost?: string\n  /** Nome da cidade no exterior (`xCidade`). Ex.: `RIYADH`. */\n  xCidade: string\n  /** Estado, província ou região no exterior (`xEstProvReg`). Ex.: `ARABIA SAUDITA`. */\n  xEstProvReg?: string\n}\n\n/**\n * Endereço do prestador, tomador ou intermediário (elemento `end`/`enderNac` no XML).\n *\n * Por padrão representa um endereço **nacional** (`endNac`, com `cMun`). Para\n * endereços no **exterior**, preencha `exterior` (`endExt`) e omita `cMun` — os\n * dois são mutuamente exclusivos conforme o XSD (TCEndereco: choice endNac|endExt).\n */\nexport interface EnderecoData {\n  /** Logradouro — nome da rua, avenida, travessa etc. (`xLgr`). */\n  xLgr?: string\n  /** Número do imóvel (`nro`). */\n  nro?: string\n  /** Complemento do endereço (`xCpl`). */\n  xCpl?: string\n  /** Nome do bairro (`xBairro`). */\n  xBairro?: string\n  /**\n   * Código IBGE do município com 7 dígitos (`cMun`). Ex.: `3106200` para Belo Horizonte/MG.\n   * Obrigatório para endereço nacional; omita quando `exterior` for informado.\n   */\n  cMun?: string\n  /** Sigla da UF. Ex.: `MG`. */\n  uf?: string\n  /** CEP com 8 dígitos, sem hífen (`CEP`). Ex.: `30100000`. */\n  cep?: string\n  /** Código do país conforme tabela BACEN (`cPais`). Padrão: `1058` (Brasil). */\n  cPais?: string\n  /** Nome do município por extenso (`xMun`). */\n  xMun?: string\n  /**\n   * Endereço no exterior (`endExt`). Quando informado, o builder emite `<endExt>`\n   * no lugar de `<endNac>` e `cMun` deve ser omitido.\n   */\n  exterior?: EnderecoExteriorData\n}\n\n// ---------------------------------------------------------------------------\n// Prestador\n// ---------------------------------------------------------------------------\n\n/**\n * Regime tributário do prestador (`regTrib` no XML).\n * Obrigatório quando o prestador é optante do Simples Nacional.\n */\nexport interface RegimeTributarioData {\n  /** Opção pelo Simples Nacional (`opSimpNac`): `1` = Não optante, `2` = Optante. */\n  opSimpNac: OpcaoSimplesNacional\n  /** Regime de apuração no Simples Nacional (XML: `regApTribSN`): `1` = Competência, `2` = Caixa. */\n  regApurSN?: number\n  /** Regime especial de tributação municipal (`regEspTrib`). */\n  regEspTrib?: RegimeEspecialTributacao\n}\n\n/**\n * Identificação e dados do prestador de serviços (`prest` no XML do DPS).\n * Deve conter pelo menos um dos identificadores: `cnpj`, `cpf` ou `nif`.\n */\nexport interface PrestadorData {\n  /** CNPJ do prestador, somente dígitos, 14 caracteres. */\n  cnpj?: string\n  /** CPF do prestador, somente dígitos, 11 caracteres. */\n  cpf?: string\n  /** NIF — Número de Identificação Fiscal para prestador estrangeiro. */\n  nif?: string\n  /** Código para prestador estrangeiro sem NIF (`cNaoNIF`). Ex.: `1` = Dispensado de NIF. */\n  codigoNaoNif?: MotivoNaoNif\n  /** CAEPF — Cadastro de Atividade Econômica da Pessoa Física (`CAEPF`), 14 dígitos. */\n  caepf?: string\n  /** Inscrição Municipal do prestador no município (`IM`). */\n  inscricaoMunicipal?: string\n  /** Razão social ou nome do prestador (`xNome`). */\n  nome?: string\n  /** Endereço do prestador (`enderNac`). */\n  endereco?: EnderecoData\n  /** Telefone de contato somente dígitos (`fone`). */\n  telefone?: string\n  /** E-mail de contato (`email`). */\n  email?: string\n  /** Regime tributário do prestador (`regTrib`). */\n  regimeTributario?: RegimeTributarioData\n}\n\n// ---------------------------------------------------------------------------\n// Tomador\n// ---------------------------------------------------------------------------\n\n/**\n * Identificação e dados do tomador de serviços (`toma` no XML do DPS).\n * Quando o serviço for isento, imune ou exportação, o preenchimento do tomador\n * pode ser dispensado conforme regras da Receita Federal e do município.\n */\nexport interface TomadorData {\n  /** CNPJ do tomador, somente dígitos, 14 caracteres. */\n  cnpj?: string\n  /** CPF do tomador, somente dígitos, 11 caracteres. */\n  cpf?: string\n  /** NIF — Número de Identificação Fiscal para tomador estrangeiro. */\n  nif?: string\n  /** Código para tomador estrangeiro sem NIF (`cNaoNIF`). */\n  codigoNaoNif?: MotivoNaoNif\n  /** Inscrição Municipal do tomador (`IM`). */\n  inscricaoMunicipal?: string\n  /** Razão social ou nome do tomador (`xNome`). Obrigatório pelo XSD (TCInfoPessoa). */\n  nome: string\n  /** Endereço do tomador (`enderNac`). */\n  endereco?: EnderecoData\n  /** Telefone somente dígitos (`fone`). */\n  telefone?: string\n  /** E-mail de contato (`email`). */\n  email?: string\n}\n\n// ---------------------------------------------------------------------------\n// Intermediário\n// ---------------------------------------------------------------------------\n\n/**\n * Intermediário do serviço (`interm` no XML do DPS).\n * Pessoa que intermedeia a prestação de serviços entre prestador e tomador.\n * Preenchido quando `tipoEmitente` for `Intermediario` ou quando houver\n * retenção de ISSQN pelo intermediário.\n */\nexport interface IntermediarioData {\n  /** CNPJ do intermediário, somente dígitos, 14 caracteres. */\n  cnpj?: string\n  /** CPF do intermediário, somente dígitos, 11 caracteres. */\n  cpf?: string\n  /** NIF do intermediário estrangeiro (`NIF`). Exclusivo com cnpj/cpf/codigoNaoNif. */\n  nif?: string\n  /** Motivo de não possuir NIF (`cNaoNIF`). Exclusivo com cnpj/cpf/nif. */\n  codigoNaoNif?: MotivoNaoNif\n  /** Inscrição Municipal do intermediário (`IM`). */\n  inscricaoMunicipal?: string\n  /** Razão social ou nome do intermediário (`xNome`). Obrigatório pelo XSD (TCInfoPessoa). */\n  nome: string\n}\n\n// ---------------------------------------------------------------------------\n// Serviço\n// ---------------------------------------------------------------------------\n\n/**\n * Local de prestação do serviço (`locPrest` no XML).\n * Define o município onde o serviço foi executado, determinando qual\n * ente tributante é competente para cobrar o ISSQN.\n */\nexport interface LocalPrestacaoData {\n  /**\n   * Código IBGE do município de prestação com 7 dígitos (`cLocPrestacao`).\n   * Determina o município competente para tributar o ISSQN.\n   * Ex.: `3106200` (Belo Horizonte/MG), `3550308` (São Paulo/SP).\n   */\n  cLocPrestacao: string\n  /**\n   * Código do país de prestação conforme tabela BACEN (`cPaisPrestacao`).\n   * Informar somente quando o serviço for prestado no exterior.\n   * Padrão: `1058` (Brasil).\n   */\n  cPaisPrestacao?: string\n}\n\n/**\n * Classificação fiscal do serviço (`cServ` no XML).\n * O código de serviço nacional (`cServTribNac`) é definido pela Receita Federal\n * na tabela de serviços da NFS-e Nacional e segue o padrão `XXXXXXXXX`.\n */\nexport interface CodigoServicoData {\n  /**\n   * Código de serviço da tributação nacional (`cServTribNac`), formato `XXXXXXXXX`.\n   * Tabela: https://www.gov.br/nfse/pt-br/mei-e-demais-empresas/codigos-de-tributacao-nacional-nbs\n   * Ex.: `010100163` = Desenvolvimento e licenciamento de programas de computador.\n   */\n  cServTribNac: string\n  /**\n   * Código de tributação municipal (`cServMun` → `cTribMun`).\n   * Conforme XSD v1.01 (TCCodTribMun): exatamente **3 dígitos numéricos**.\n   * Obtido via `ConsultarDadosCadastrais` → `Atividades[].cTribMun`.\n   * Ex.: `'109'`, `'142'`.\n   */\n  cServMun?: string\n  /**\n   * Código NBS principal (`cNBSPrinc`) — Nomenclatura Brasileira de Serviços.\n   * Formato: `X.XXXX.XX.XX`. Tabela NBS disponível em portais do MDIC.\n   */\n  cNBSPrinc?: string\n  /** Código interno do contribuinte para o serviço (`cIntContrib`). Uso facultativo. */\n  cIntContrib?: string\n}\n\n/** Informações complementares do serviço prestado. */\nexport interface InformacaoComplementarData {\n  /** Identificador de Documento de Responsabilidade Técnica: ART, RRT, DRT (`idDocTec`). */\n  idDocTec?: string\n  /** Número de documento de referência emitido pelo prestador (`docRef`). */\n  docRef?: string\n  /** Número do pedido/ordem de compra/ordem de serviço (`xPed`). */\n  xPed?: string\n  /** Descrição complementar livre (`xInfComp`), até 2.000 caracteres. */\n  xInfComp?: string\n}\n\n/**\n * Dados de obra de construção civil (`obra` no XML).\n * Obrigatório para serviços de construção civil com código de serviço que exija ART.\n * Para informar o número da ART/RRT/DRT, use `informacaoComplemento.idDocTec`.\n */\nexport interface ObraData {\n  /** Inscrição imobiliária fiscal do imóvel (`inscImobFisc`). */\n  inscImobFisc?: string\n  /** Código da obra (`cObra`), conforme cadastro municipal (CNO ou CEI). */\n  cObra?: string\n}\n\n/**\n * Comércio exterior do serviço (`comExt` no XML, dentro de `<serv>`).\n * Preenchido quando o serviço envolve operação de comércio exterior — tipicamente\n * exportação/importação de serviços, com tomador ou prestador no exterior.\n * Ref XSD: `TCInfoComExt`.\n */\nexport interface ComercioExteriorData {\n  /**\n   * Modo de prestação do serviço no comércio exterior (`mdPrestacao`).\n   * Ex.: `ModoPrestacaoComExt.Transfronteirico`.\n   */\n  mdPrestacao: ModoPrestacaoComExt\n  /** Vínculo entre as partes da prestação (`vincPrest`). Ex.: `VinculoPrestacao.SemVinculo`. */\n  vincPrest: VinculoPrestacao\n  /**\n   * Código da moeda da transação (`tpMoeda`), conforme tabela de moedas do BACEN\n   * (3 dígitos). Use `CodigoMoeda` para as comuns ou uma string de 3 dígitos.\n   */\n  tpMoeda: CodigoMoeda | (string & {})\n  /** Valor do serviço na moeda estrangeira informada em `tpMoeda` (`vServMoeda`). */\n  vServMoeda: number\n  /** Mecanismo de apoio/fomento ao comércio exterior do prestador (`mecAFComexP`). */\n  mecAFComexP?: MecAFComexPrestador\n  /** Mecanismo de apoio/fomento ao comércio exterior do tomador (`mecAFComexT`). */\n  mecAFComexT?: MecAFComexTomador\n  /** Movimentação temporária de bens (`movTempBens`). Ex.: `MovimentacaoTemporariaBens.Nao`. */\n  movTempBens?: MovimentacaoTemporariaBens\n  /** Compartilhamento das informações com o MDIC/SECEX (`mdic`). */\n  mdic?: EnvioMDIC\n}\n\n/**\n * Dados do serviço prestado (`serv` no XML do DPS).\n * Agrupa localização, classificação fiscal e descrição do serviço.\n */\nexport interface ServicoData {\n  /** Local onde o serviço foi executado — define o município competente para o ISSQN. */\n  localPrestacao: LocalPrestacaoData\n  /** Classificação fiscal: código nacional, municipal e NBS. */\n  codigoServico: CodigoServicoData\n  /**\n   * Descrição do serviço prestado (`xDescServ`), até 2.000 caracteres.\n   * Deve descrever de forma clara e objetiva a natureza do serviço.\n   */\n  xDescServ: string\n  /**\n   * Comércio exterior (`comExt`) — informar quando o serviço envolve operação\n   * internacional (tomador/prestador no exterior).\n   */\n  comercioExterior?: ComercioExteriorData\n  /** Dados de obra de construção civil, quando aplicável. */\n  obra?: ObraData\n  /**\n   * Atividade/evento (`atvEvento`) — **obrigatório** para os serviços do item 12\n   * da LC 116/2003 (diversões, lazer, entretenimento e congêneres).\n   */\n  atvEvento?: AtvEventoData\n  /** Informações complementares ao serviço. */\n  informacaoComplemento?: InformacaoComplementarData\n}\n\n/**\n * Atividade, evento ou local do serviço prestado (`atvEvento` no XML).\n * Ref XSD: `TCAtvEvento` — exigido pela Regra 276 nos serviços do item 12.\n *\n * `idAtvEvt` e `endereco` são **mutuamente exclusivos** (`<xs:choice>`): informe\n * o código do evento dado pela administração municipal, ou o endereço onde ele\n * ocorre.\n */\nexport interface AtvEventoData {\n  /** Descrição do evento artístico, cultural, esportivo etc. (`xNome`, até 255). */\n  xNome: string\n  /** Data de início da atividade (`dtIni`), formato `YYYY-MM-DD`. */\n  dtIni: string\n  /** Data de fim da atividade (`dtFim`), formato `YYYY-MM-DD`. */\n  dtFim: string\n  /**\n   * Identificação da atividade de evento (`idAtvEvt`, até 30), código atribuído\n   * pela administração tributária municipal. Exclusivo com `endereco`.\n   */\n  idAtvEvt?: string\n  /**\n   * Endereço onde a atividade ocorre (`end`). Exclusivo com `idAtvEvt`.\n   *\n   * Ref XSD `TCEnderecoSimples`: `choice(CEP | endExt)` seguido de `xLgr`,\n   * `nro`, `xCpl?`, `xBairro` — diferente de `TCEndereco`, o nacional aqui leva\n   * só o CEP, sem `cMun`.\n   */\n  endereco?: EnderecoAtvEventoData\n}\n\n/** Endereço da atividade/evento. Ref XSD: `TCEnderecoSimples`. */\nexport interface EnderecoAtvEventoData {\n  /** CEP do local, somente dígitos (endereço nacional). Exclusivo com `exterior`. */\n  cep?: string\n  /**\n   * Endereço no exterior. Exclusivo com `cep`.\n   *\n   * Ref XSD `TCEnderExtSimples` — **sem `cPais`**, ao contrário do `TCEnderExt`\n   * usado no endereço de pessoa.\n   */\n  exterior?: {\n    /** Código postal (`cEndPost`). */\n    cEndPost: string\n    /** Cidade (`xCidade`). */\n    xCidade: string\n    /** Estado/província/região (`xEstProvReg`). */\n    xEstProvReg: string\n  }\n  /** Logradouro (`xLgr`). */\n  xLgr: string\n  /** Número (`nro`). */\n  nro: string\n  /** Complemento (`xCpl`). */\n  xCpl?: string\n  /** Bairro (`xBairro`). */\n  xBairro: string\n}\n\n// ---------------------------------------------------------------------------\n// Tributação e valores\n// ---------------------------------------------------------------------------\n\n/**\n * Tributação do ISSQN — Imposto Sobre Serviços de Qualquer Natureza (`tribISSQN` no XML).\n * Define a situação tributária do serviço e os parâmetros para cálculo do imposto.\n */\nexport interface IssqnData {\n  /**\n   * Situação tributária do ISSQN (`tribISSQN`), conforme XSD `TSTribISSQN` v1.01:\n   * `1` Operação tributável, `2` Imunidade,\n   * `3` Exportação de serviço, `4` Não Incidência.\n   * Não existe valor para \"isento\": a isenção coloquial de ISS é modelada\n   * como Imunidade (`2`) + `tipoImunidade`.\n   */\n  tributacaoIssqn?: TributacaoIssqn\n  /** Tipo de imunidade do ISSQN (`tpImunidade`), obrigatório quando `tributacaoIssqn = 2` (Imunidade). */\n  tipoImunidade?: TipoImunidade\n  /** Tipo de suspensão da exigibilidade do ISSQN (`tpSuspensao`). */\n  tipoSuspensao?: TipoSuspensao\n  /** Número do processo judicial ou administrativo de suspensão (`nProcessoSuspensao`). */\n  numeroProcessoSuspensao?: string\n  /**\n   * Responsável pela retenção do ISSQN (`tpRetISSQN`):\n   * `1` Não retido, `2` Retido pelo tomador, `3` Retido pelo intermediário.\n   */\n  tipoRetencaoIssqn?: TipoRetencaoIssqn\n  /**\n   * Alíquota do ISSQN como decimal (`pAliq`). Ex.: `0.05` = 5%.\n   * Mínimo legal: 2% (LC 116/2003, art. 8º, § 1º).\n   * Máximo legal: 5% (LC 116/2003, art. 8º, § 1º).\n   */\n  aliquota?: number\n  /** Exigibilidade do ISS conforme LC 116/2003 (`exigISSQN`). */\n  exigibilidadeISS?: number\n  /**\n   * Código IBGE do município do fato gerador do ISSQN (`cMunFG`), 7 dígitos.\n   * Preenchido quando diferente do município de prestação.\n   */\n  cMunFG?: string\n}\n\n/**\n * Valores monetários do serviço e do ISSQN (`valores` no XML do DPS).\n * Todos os valores devem ser informados em reais (BRL) com até 2 casas decimais.\n */\nexport interface ValoresServicoData {\n  /** Valor bruto total do serviço prestado (`vServico`). */\n  vServico: number\n  /**\n   * Valor recebido pelo **intermediário** do serviço (`vReceb`).\n   * Só deve ser informado quando `tipoEmitente = 3` (Intermediário).\n   * Proibido para prestador (1) e tomador (2) — erro E0424 da API.\n   */\n  vReceb?: number\n  /** Valor do desconto condicionado (`vDescCondicionado`). */\n  vDescCondicionado?: number\n  /** Valor do desconto incondicionado (`vDescIncondicionado`). */\n  vDescIncondicionado?: number\n  /** Base de cálculo do ISSQN (`vBC`). Normalmente igual a `vServico` menos deduções. */\n  vBC?: number\n  /** Valor do ISSQN calculado (`vISSQN`). Resultado de `vBC × pAliq`. */\n  vISSQN?: number\n  /** Valor líquido do serviço após deduções e retenções (`vLiq`). */\n  vLiq?: number\n  /** Percentual de alíquota do ISSQN aplicada (`pAliq`), em decimal. Ex.: `0.05`. */\n  pAliq?: number\n  /** Valor total das retenções (ISSQN + federais) (`vTotalRet`). */\n  vTotalRet?: number\n}\n\n/**\n * Retenções de tributos federais sobre o serviço (`tribFed` no XML).\n * Aplicável quando o tomador é obrigado a reter na fonte: IRRF, CSLL, PIS, COFINS.\n */\nexport interface TributacaoFederalData {\n  /** Valor retido da CP — Contribuição Previdenciária (`vRetCP`). */\n  valorRetidoCp?: number\n  /** Valor retido do IRRF — Imposto de Renda Retido na Fonte (`vRetIRRF`). */\n  valorRetidoIrrf?: number\n  /** Valor retido da CSLL — Contribuição Social sobre o Lucro Líquido (`vRetCSLL`). */\n  valorRetidoCsll?: number\n  /** CST — Código de Situação Tributária do PIS/COFINS (`cstPisCofins`). */\n  cstPisCofins?: string\n  /** Base de cálculo do PIS e COFINS (`vBCPisCofins`). */\n  baseCalculoPisCofins?: number\n  /** Alíquota do PIS em decimal (`pAliqPis`). Ex.: `0.0065` = 0,65%. */\n  aliquotaPis?: number\n  /** Alíquota do COFINS em decimal (`pAliqCofins`). Ex.: `0.03` = 3%. */\n  aliquotaCofins?: number\n  /** Valor do PIS calculado (`vPis`). */\n  valorPis?: number\n  /** Valor do COFINS calculado (`vCofins`). */\n  valorCofins?: number\n  /** Indica se o PIS/COFINS é retido na fonte pelo tomador. */\n  tipoRetencaoPisCofins?: TipoRetencaoPisCofins\n}\n\n/**\n * Tributação completa do DPS — ISSQN e tributos federais (`trib` no XML).\n * Agrupa todas as informações fiscais necessárias para emissão da NFS-e.\n */\nexport interface TributacaoData {\n  /** Tributação do ISSQN (imposto municipal sobre serviços). */\n  issqn?: IssqnData\n  /** Retenções de tributos federais (IRRF, CSLL, PIS, COFINS). */\n  federal?: TributacaoFederalData\n  /**\n   * Percentual total de tributos para contribuintes do Simples Nacional (`pTotTribSN`).\n   * Conforme faixa de receita bruta da tabela do Simples.\n   */\n  percentualTotalTributosSN?: number\n  /** Valor total dos tributos federais incidentes sobre o serviço (`vTotTribFed`). */\n  valorTotalTributosFederais?: number\n  /** Valor total dos tributos estaduais incidentes sobre o serviço (`vTotTribEst`). */\n  valorTotalTributosEstaduais?: number\n  /** Valor total dos tributos municipais, inclui ISSQN (`vTotTribMun`). */\n  valorTotalTributosMunicipais?: number\n  /**\n   * Percentual total aproximado dos tributos federais (`pTotTribFed`).\n   * Usar para Não Optante quando município está ativo no SNNFSe (E0713).\n   * Ex.: `11.33` para 11,33%.\n   */\n  percentualTotalTributosFederais?: number\n  /**\n   * Percentual total aproximado dos tributos estaduais (`pTotTribEst`).\n   * Ex.: `0.00`.\n   */\n  percentualTotalTributosEstaduais?: number\n  /**\n   * Percentual total aproximado dos tributos municipais (`pTotTribMun`).\n   * Ex.: `2.00` para 2%.\n   */\n  percentualTotalTributosMunicipais?: number\n  /**\n   * Indica se o valor total de tributos foi informado (`indTotTrib`).\n   * **Proibido para Não Optante (opSimpNac=1)** — use percentual* ou valorTotal* — E0713.\n   */\n  indicadorTotalTributos?: IndicadorTotalTributos\n}\n\n// ---------------------------------------------------------------------------\n// IBS/CBS (v1.01 — Reforma Tributária)\n// ---------------------------------------------------------------------------\n\n/**\n * Classificação tributária IBS/CBS (`gIBSCBS` no XML).\n * Ref XSD: `TCRTCInfoTributosSitClas`\n */\nexport interface IbsCbsGIbsCbsData {\n  /**\n   * CST — Código de Situação Tributária IBS/CBS (3 dígitos).\n   * Ex.: `CstIbsCbs.TributacaoIntegral` (`'000'`).\n   */\n  CST: CstIbsCbs | (string & {})\n  /**\n   * cClassTrib — Código de Classificação Tributária (6 dígitos).\n   * Precisa ser compatível com o `CST` informado.\n   */\n  cClassTrib: ClassTribIbsCbs | (string & {})\n  /** cCredPres — Código de Crédito Presumido (opcional). */\n  cCredPres?: string\n}\n\n/**\n * Valores tributários IBS/CBS.\n * Ref XSD: `TCRTCInfoValoresIBSCBS`\n */\nexport interface IbsCbsValoresData {\n  trib: {\n    gIBSCBS: IbsCbsGIbsCbsData\n  }\n}\n\n/**\n * Grupo IBS/CBS — **obrigatório** na DPS versão 1.01 (Reforma Tributária).\n * Ref XSD: `TCRTCInfoIBSCBS`\n *\n * @example\n * ```ts\n * ibsCbs: {\n *   finNFSe: FinalidadeNFSe.Normal,\n *   indFinal: IndicadorConsumidorFinal.Nao,\n *   cIndOp: CodigoIndOp.DemaisServicosAdquirenteNoPais, // 100301\n *   indDest: IndicadorDestinatario.TomadorEhDestinatario,\n *   valores: { trib: { gIBSCBS: {\n *     CST: CstIbsCbs.TributacaoIntegral,              // 000\n *     cClassTrib: ClassTribIbsCbs.TributacaoIntegral, // 000001\n *   } } },\n * }\n * ```\n */\nexport interface IbsCbsData {\n  /** finNFSe — Finalidade da emissão. */\n  finNFSe: FinalidadeNFSe\n  /**\n   * cIndOp — Código indicador da operação de fornecimento (6 dígitos).\n   * Tabela completa no Anexo VIII do Portal Nacional.\n   */\n  cIndOp: CodigoIndOp | (string & {})\n  /** indDest — Indicador de destinatário. */\n  indDest: IndicadorDestinatario\n  /** indFinal — Operação de uso/consumo pessoal (art. 57). Obrigatório no XSD. */\n  indFinal: IndicadorConsumidorFinal\n  /** tpOper — Tipo de operação com entes governamentais. */\n  tpOper?: TipoOperacaoEnteGov\n  /** valores — Informações de tributação IBS/CBS para o serviço. */\n  valores: IbsCbsValoresData\n}\n\n// ---------------------------------------------------------------------------\n// DPS\n// ---------------------------------------------------------------------------\n\n/**\n * Informações do Documento Preliminar de Serviço (`infDPS` no XML).\n *\n * O DPS é o documento eletrônico estruturado emitido pelo contribuinte contendo\n * todas as informações necessárias para a geração da NFS-e pelo sistema SEFIN Nacional.\n *\n * **Referência:** API SEFIN Nacional — elemento `infDPS`\n * https://sefin.nfse.gov.br/SefinNacional/docs/index\n */\nexport interface InfDpsData {\n  /**\n   * Identificador único do DPS (`Id`), atributo XML.\n   * Gerado pela função `generateDpsId()` no formato:\n   * `DPS` + CodMun(7) + TipoInscrição(1) + CNPJ/CPF(14) + Série(5) + Número(15) = 45 chars.\n   */\n  id: string\n  /**\n   * Ambiente de destino (`tpAmb`):\n   * `1` = Produção (SEFIN Nacional),\n   * `2` = Homologação (ambiente de testes).\n   */\n  tipoAmbiente: TipoAmbiente\n  /**\n   * Data e hora de emissão do DPS no formato ISO 8601 com offset BRT (`dhEmi`).\n   * Ex.: `2024-03-15T12:00:00-03:00`. Use `formatDhEmissao()` para gerar.\n   */\n  dataEmissao: string\n  /** Identificação da versão do aplicativo emissor (`verAplic`). Uso facultativo. */\n  versaoAplicativo?: string\n  /**\n   * Série do DPS (`serie`), até 5 caracteres alfanuméricos.\n   * Padrão recomendado: `001`. Permite segregar emissões por estabelecimento ou sistema.\n   */\n  serie?: string\n  /**\n   * Número sequencial do DPS (`nDPS`), até 15 dígitos.\n   * Deve ser único por série e CNPJ/CPF do prestador.\n   * Use `generateNumDps()` para geração automática.\n   */\n  numeroDps: string\n  /**\n   * Competência tributária do serviço no formato `YYYY-MM-DD` (`dCompet`).\n   * Define o mês/ano de referência para apuração e recolhimento do ISSQN.\n   * Ex.: `2024-03` para serviços prestados em março de 2024.\n   */\n  dataCompetencia: string\n  /**\n   * Tipo do emitente do DPS (`tpEmit`):\n   * `1` = Prestador (padrão), `2` = Tomador,\n   * `3` = Intermediário, `4` = Não aplicável.\n   * Tomador e intermediário só emitem em casos previstos na legislação.\n   */\n  tipoEmitente: EmitenteDPS\n  /**\n   * Código IBGE do município onde o DPS foi emitido, 7 dígitos (`cLocEmi`).\n   * Corresponde ao município do domicílio fiscal do emitente.\n   */\n  codigoLocalEmissao: string\n  /**\n   * Motivo da emissão pelo tomador ou intermediário (`motEmissao`).\n   * Informar quando `tipoEmitente ≠ Prestador` (força maior, determinação legal, etc.).\n   */\n  motivoEmissao?: MotivoEmissaoTomadorIntermediario\n  /**\n   * Chave de acesso da NFS-e rejeitada que originou esta reemissão (`chNFSeRej`).\n   * Usar apenas em casos de substituição por rejeição da NFS-e anterior.\n   */\n  chaveNfseRejeitada?: string\n  /** Dados do prestador de serviços (`prest`). */\n  prestador: PrestadorData\n  /** Dados do tomador de serviços (`toma`). Obrigatório na maioria dos casos. */\n  tomador?: TomadorData\n  /** Dados do intermediário, quando houver (`interm`). */\n  intermediario?: IntermediarioData\n  /** Dados do serviço prestado (`serv`). */\n  servico: ServicoData\n  /** Valores monetários do serviço e do ISSQN (`valores`). */\n  valores: ValoresServicoData\n  /** Tributação completa — ISSQN e tributos federais (`trib`). */\n  tributacao?: TributacaoData\n  /**\n   * Grupo IBS/CBS — **opcional** durante o período de transição da Reforma Tributária.\n   * O Comitê Gestor do IBS dispensou penalidades pelo não preenchimento enquanto\n   * os regulamentos do IBS/CBS não forem publicados. Omita para replicar o comportamento\n   * do EmissorWeb (que não inclui o bloco). Quando informado, use `finNFSe: '0'`,\n   * `cIndOp` (6 dígitos — consulte Anexo VII), `indDest` e `valores.trib.gIBSCBS`.\n   */\n  ibsCbs?: IbsCbsData\n}\n\n/**\n * Documento Preliminar de Serviço — DPS.\n *\n * Estrutura raiz do documento eletrônico enviado à API SEFIN Nacional para\n * geração da NFS-e. Após autorização, o sistema retorna a NFS-e assinada\n * com chave de acesso de 43 dígitos.\n *\n * **Fluxo:** DPS (emitente) → SEFIN Nacional → NFS-e (autorizada)\n *\n * **Referência:** API SEFIN Nacional (Swagger)\n * Produção: https://sefin.nfse.gov.br/SefinNacional/docs/index\n * Homologação: https://sefin.producaorestrita.nfse.gov.br/API/SefinNacional/docs/index\n *\n * @example\n * ```ts\n * const dps: DpsData = {\n *   infDps: {\n *     id: generateDpsId(cnpj, codIbge, '001', '1'),\n *     tipoAmbiente: TipoAmbiente.Homologacao,\n *     dataEmissao: formatDhEmissao(new Date()),\n *     numeroDps: generateNumDps(),\n *     dataCompetencia: formatDataCompetencia(new Date()),\n *     tipoEmitente: EmitenteDPS.Prestador,\n *     codigoLocalEmissao: '3106200',\n *     prestador: { cnpj: '12345678000195', inscricaoMunicipal: '12345' },\n *     servico: {\n *       localPrestacao: { cLocPrestacao: '3106200' },\n *       codigoServico: { cServTribNac: '01.01.00163', cServMun: '14.01' },\n *       xDescServ: 'Desenvolvimento de software sob encomenda',\n *     },\n *     valores: { vServico: 1000.00, vBC: 1000.00, pAliq: 0.05, vISSQN: 50.00 },\n *   },\n * }\n * ```\n */\nexport interface DpsData {\n  /** Versão do esquema XML do DPS (`versao`). Padrão: `1.01`. */\n  versao?: string\n  /** Informações do DPS (`infDPS`). */\n  infDps: InfDpsData\n}\n\n// ---------------------------------------------------------------------------\n// NFS-e\n// ---------------------------------------------------------------------------\nexport interface InfNfseData {\n  id?: string\n  cStat?: string\n  xMotivo?: string\n  chNFSe?: string\n  nNFSe?: string\n  dhProc?: string\n  xLocEmi?: string\n  xLocPrestacao?: string\n  nNfse?: string\n  cLocIncid?: string\n  xTribNac?: string\n  xTribMun?: string\n  verAplic?: string\n  ambGer?: number\n  tpEmis?: number\n  procEmi?: number\n  cRegTrib?: string\n  xRegTrib?: string\n  nfseXmlGZipB64?: string\n}\n\nexport interface NfseData {\n  infNfse?: InfNfseData\n  originalXml?: string\n}\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\nexport interface EmissaoNfseResponse {\n  cStat: string\n  xMotivo: string\n  /** Chave de acesso da NFS-e emitida — use para consultar, cancelar ou baixar a DANF-Se. */\n  chaveAcesso?: string\n  /** ID da NFS-e gerada pela SEFIN (`idDps` no JSON de resposta). */\n  idNfse?: string\n  nfse?: NfseData\n  dps?: DpsData\n  nfseXmlGZipB64?: string\n}\n\nexport interface ConsultaNfseResponse {\n  cStat: string\n  xMotivo: string\n  nfse?: NfseData\n}\n\nexport interface ConsultaDpsResponse {\n  /**\n   * Chave de acesso da NFS-e correspondente à DPS consultada.\n   * Retornada apenas se o certificado do solicitante corresponder a um ator da NFS-e\n   * (Prestador, Tomador ou Intermediário).\n   */\n  chaveAcesso?: string\n  /** Campos de erro quando a DPS não é localizada ou o acesso é negado. */\n  cStat?: string\n  xMotivo?: string\n}\n\nexport interface RegistroEventoResponse {\n  /** Código de status do processamento (extraído do XML do evento retornado). */\n  cStat: string\n  /** Descrição do status. */\n  xMotivo: string\n  /** Base64+GZip do XML de retorno do evento, se disponível. */\n  eventoXmlGZipB64?: string\n}\n\n// ---------------------------------------------------------------------------\n// Evento (cancelamento, etc.)\n// ---------------------------------------------------------------------------\nexport interface PedRegEventoData {\n  /** Chave de acesso da NFS-e a ser cancelada (50 dígitos). */\n  chNFSe: string\n  /**\n   * Tipo do evento. Use o enum `TipoEvento`.\n   */\n  tipoEvento: TipoEvento | number\n  /** Ambiente (`tpAmb`): `1` = Produção, `2` = Homologação. Padrão: `1`. */\n  tipoAmbiente?: number\n  /** Data/hora do evento ISO 8601 (padrão: agora com offset BRT -03:00). */\n  dhEvento?: string\n  /**\n   * CNPJ do autor do evento (prestador ou intermediário).\n   * Obrigatório quando o autor usa CNPJ (use `cpfAutor` para CPF).\n   */\n  cnpjAutor?: string\n  /** CPF do autor do evento. Use quando o prestador é Pessoa Física. */\n  cpfAutor?: string\n  /** Código do motivo (`cMotivo`). Obrigatório para `TipoEvento.Cancelamento` (e101101). */\n  cMotivo?: MotivoEventoCancelamento\n  /** Descrição estendida do motivo (`xMotivo`). */\n  xMotivo?: string\n}\n","/**\n * Contexto de configuração para o cliente NFS-e\n * Equivalente a NfseContext.php\n */\n\nimport type { TipoAmbiente } from './enums.js'\n\nexport interface Endpoint {\n  producao: string\n  homologacao: string\n}\n\nexport interface NfseContext {\n  /** Ambiente de emissão (produção ou homologação) */\n  ambiente: TipoAmbiente\n\n  /** Caminho para o arquivo .pfx do certificado digital */\n  certificatePath?: string\n\n  /** Conteúdo do certificado .pfx em memória (alternativa ao certificatePath) */\n  certificateData?: ArrayBuffer | Buffer\n\n  /** Senha do certificado .pfx */\n  certificatePassword: string\n\n  /** Código IBGE do município (7 dígitos) - opcional para alguns endpoints */\n  codigoMunicipio?: string\n\n  /** Endpoint customizado (sobrescreve o padrão do SEFIN) */\n  endpoint?: Endpoint\n\n  /**\n   * Quando `true`, salva o XML gerado (antes e após assinatura) em arquivos\n   * na pasta `debug/` antes de enviar à API.\n   */\n  debug?: boolean\n}\n","/**\n * Serviço principal para emissão e consulta de NFS-e pelo prestador\n * Migrado de nfse-php/src/Service/ContribuinteService.php\n *\n * Fluxo: DPS → XML → XMLDSig → GZip+Base64 → API SEFIN Nacional\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { NfseContext } from '../types/context.js'\nimport type {\n  DpsData,\n  EmissaoNfseResponse,\n  ConsultaNfseResponse,\n  ConsultaDpsResponse,\n  RegistroEventoResponse,\n  PedRegEventoData,\n} from '../types/dtos.js'\nimport { buildDpsXml } from '../xml/dps-builder.js'\nimport { buildPedRegEventoXml } from '../xml/eventos-builder.js'\nimport { loadCertificate, resolveCertSource } from '../crypto/certificate.js'\nimport { signXml, compressXml } from '../crypto/xml-signer.js'\nimport { SefinClient, NfseApiError } from '../http/sefin-client.js'\nimport { validateDps } from '../validator/dps-validator.js'\n\nexport class ContribuinteService {\n  private client: SefinClient\n\n  constructor(private context: NfseContext) {\n    this.client = new SefinClient(context)\n  }\n\n  /**\n   * Emite uma NFS-e a partir de um DPS.\n   * Valida o DPS (schema XSD v1.01 + regras de negócio) antes de enviar.\n   * Lança `DpsValidationError` se houver erros, evitando chamadas desnecessárias à API.\n   */\n  async emitir(dps: DpsData): Promise<EmissaoNfseResponse> {\n    const validation = validateDps(dps)\n    if (!validation.isValid) {\n      throw new DpsValidationError(validation.errors)\n    }\n    const xml = buildDpsXml(dps)\n    const cert = loadCertificate(resolveCertSource(this.context), this.context.certificatePassword)\n    const signedXml = signXml(xml, 'infDPS', cert, 'SHA256')\n    if (this.context.debug) {\n      await saveDebugXml(dps.infDps.id, xml, signedXml)\n    }\n    const gzipB64 = await compressXml(signedXml)\n    return this.client.emitirNfse(gzipB64)\n  }\n\n  async consultar(chaveAcesso: string): Promise<ConsultaNfseResponse> {\n    return this.client.consultarNfse(chaveAcesso)\n  }\n\n  async consultarDps(idDps: string): Promise<ConsultaDpsResponse> {\n    return this.client.consultarDps(idDps)\n  }\n\n  async verificarDps(idDps: string): Promise<boolean> {\n    return this.client.verificarDps(idDps)\n  }\n\n  /**\n   * Cancela uma NFS-e via registro de evento.\n   *\n   * Antes de enviar o cancelamento, consulta a NFS-e pela chave de acesso para\n   * verificar sua existência. Lança `NfseNaoEncontradaError` se não for localizada.\n   */\n  async cancelar(evento: PedRegEventoData): Promise<RegistroEventoResponse> {\n    const consulta = await this.client.consultarNfse(evento.chNFSe)\n    if (!consulta.nfse?.originalXml) {\n      throw new NfseNaoEncontradaError(\n        evento.chNFSe,\n        consulta.cStat || '404',\n        consulta.xMotivo || 'NFS-e não localizada na SEFIN.',\n      )\n    }\n\n    const eventoXml = buildPedRegEventoXml(evento)\n    const cert = loadCertificate(resolveCertSource(this.context), this.context.certificatePassword)\n    const signedEvento = signXml(eventoXml, 'infPedReg', cert, 'SHA256')\n    if (this.context.debug) {\n      await saveDebugXml(`EVT_${evento.chNFSe}`, eventoXml, signedEvento)\n    }\n    const gzipB64 = await compressXml(signedEvento)\n    try {\n      return await this.client.registrarEvento(evento.chNFSe, gzipB64)\n    } catch (err) {\n      if (err instanceof NfseApiError && err.body?.includes('E0840')) {\n        throw new NfseJaCanceladaError(evento.chNFSe)\n      }\n      throw err\n    }\n  }\n\n  /** Lista todos os eventos de uma NFS-e. */\n  async consultarEventos(chaveAcesso: string): Promise<unknown[]> {\n    return this.client.listarEventos(chaveAcesso)\n  }\n\n  /** Lista eventos de um tipo específico (ex: `TipoEventoCancelamento.ErroEmissao`). */\n  async consultarEventosPorTipo(chaveAcesso: string, tipoEvento: number): Promise<unknown[]> {\n    return this.client.listarEventosPorTipo(chaveAcesso, tipoEvento)\n  }\n\n  /** Consulta um evento específico por tipo e número sequencial. */\n  async consultarEvento(chaveAcesso: string, tipoEvento: number, numSeqEvento = 1): Promise<unknown> {\n    return this.client.consultarEvento(chaveAcesso, tipoEvento, numSeqEvento)\n  }\n\n  async downloadDanfse(chaveAcesso: string): Promise<string> {\n    return this.client.downloadDanfse(chaveAcesso)\n  }\n\n  async consultarConvenio(codMunicipio: string): Promise<unknown> {\n    return this.client.consultarParametrosConvenio(codMunicipio)\n  }\n\n  async consultarAliquota(codMunicipio: string, codServico: string): Promise<unknown> {\n    return this.client.consultarAliquota(codMunicipio, codServico)\n  }\n}\n\nasync function saveDebugXml(id: string, xml: string, signedXml: string): Promise<void> {\n  const dir = join(process.cwd(), 'debug')\n  await mkdir(dir, { recursive: true })\n  const ts = new Date().toISOString().replace(/[:.]/g, '-')\n  await writeFile(join(dir, `${ts}_dps.xml`), xml, 'utf-8')\n  await writeFile(join(dir, `${ts}_dps-signed.xml`), signedXml, 'utf-8')\n  console.log(`[debug] XMLs salvos em debug/${ts}_dps.xml e debug/${ts}_dps-signed.xml`)\n}\n\n/**\n * Erro lançado quando o DPS falha na validação antes do envio à API.\n * A propriedade `errors` contém todas as mensagens em português com o campo correspondente.\n */\nexport class DpsValidationError extends Error {\n  constructor(public readonly errors: string[]) {\n    super(`DPS inválido — ${errors.length} erro(s):\\n${errors.map(e => `  • ${e}`).join('\\n')}`)\n    this.name = 'DpsValidationError'\n  }\n}\n\n/**\n * Erro lançado quando a NFS-e não é localizada na SEFIN antes do cancelamento.\n */\nexport class NfseNaoEncontradaError extends Error {\n  override readonly name = 'NfseNaoEncontradaError'\n  constructor(\n    public readonly chaveAcesso: string,\n    public readonly cStat: string,\n    public readonly xMotivo: string,\n  ) {\n    super(`NFS-e nao encontrada para cancelamento - chave: ${chaveAcesso} | cStat: ${cStat} | ${xMotivo}`)\n  }\n}\n\n/**\n * Erro lançado quando a NFS-e já possui um evento de cancelamento vinculado (E0840).\n * A nota não pode ser cancelada novamente.\n */\nexport class NfseJaCanceladaError extends Error {\n  override readonly name = 'NfseJaCanceladaError'\n  constructor(public readonly chaveAcesso: string) {\n    super(`NFS-e ja esta cancelada - chave: ${chaveAcesso}`)\n  }\n}\n","/**\n * Construtor do XML do DPS (Declaração de Prestação de Serviços)\n * Migrado de nfse-php/src/Xml/DpsXmlBuilder.php\n *\n * Namespace: http://www.sped.fazenda.gov.br/nfse\n */\n\nimport type {\n  DpsData,\n  PrestadorData,\n  TomadorData,\n  IntermediarioData,\n  ServicoData,\n  ValoresServicoData,\n  TributacaoData,\n  EnderecoData,\n  IbsCbsData,\n} from '../types/dtos.js'\nimport { escapeXml } from './escape.js'\n\nconst NAMESPACE = 'http://www.sped.fazenda.gov.br/nfse'\nconst VERSAO = '1.01'\n\nfunction fmt(value: number, decimals = 2): string {\n  return value.toFixed(decimals)\n}\n\nfunction tag(name: string, value: string | number | undefined | null): string {\n  if (value === undefined || value === null || value === '') return ''\n  return `<${name}>${escapeXml(value)}</${name}>`\n}\n\nfunction buildEndereco(end: EnderecoData): string {\n  // TCEndereco (XSD): choice(endNac | endExt), seguido de xLgr, nro, xCpl, xBairro.\n  const ext = end.exterior\n  const endChoice = ext\n    ? `<endExt>${\n      tag('cPais', ext.cPais)\n    }${tag('cEndPost', ext.cEndPost)\n    }${tag('xCidade', ext.xCidade)\n    }${tag('xEstProvReg', ext.xEstProvReg)\n    }</endExt>`\n    : `<endNac>${tag('cMun', end.cMun)}${tag('CEP', end.cep?.replace(/\\D/g, ''))}</endNac>`\n  return endChoice\n    + tag('xLgr', end.xLgr)\n    + tag('nro', end.nro)\n    + tag('xCpl', end.xCpl)\n    + tag('xBairro', end.xBairro)\n}\n\nfunction buildPrestador(prest: PrestadorData): string {\n  const rt = prest.regimeTributario\n  // regTrib é obrigatório em TCInfoPrestador; opSimpNac e regEspTrib são filhos\n  // obrigatórios. Usamos defaults (1=Não Optante, 0=Nenhum) quando omitidos.\n  const regTribXml = `<regTrib>${\n    tag('opSimpNac', rt?.opSimpNac ?? 1)\n  }${tag('regApTribSN', rt?.regApurSN)\n  }${tag('regEspTrib', rt?.regEspTrib ?? 0)\n  }</regTrib>`\n  return `<prest>${\n    tag('CNPJ', prest.cnpj?.replace(/\\D/g, ''))\n  }${tag('CPF', prest.cpf?.replace(/\\D/g, ''))\n  }${tag('NIF', prest.nif)\n  }${tag('cNaoNIF', prest.codigoNaoNif)\n  }${tag('CAEPF', prest.caepf)\n  }${tag('IM', prest.inscricaoMunicipal)\n  }${tag('xNome', prest.nome)\n  }${prest.endereco ? `<end>${buildEndereco(prest.endereco)}</end>` : ''\n  }${tag('fone', prest.telefone)\n  }${tag('email', prest.email)\n  }${regTribXml\n  }</prest>`\n}\n\nfunction buildTomador(toma: TomadorData): string {\n  return `<toma>${\n    tag('CNPJ', toma.cnpj?.replace(/\\D/g, ''))\n  }${tag('CPF', toma.cpf?.replace(/\\D/g, ''))\n  }${tag('NIF', toma.nif)\n  }${tag('cNaoNIF', toma.codigoNaoNif)\n  }${tag('IM', toma.inscricaoMunicipal)\n  }${tag('xNome', toma.nome)\n  }${toma.endereco ? `<end>${buildEndereco(toma.endereco)}</end>` : ''\n  }${tag('fone', toma.telefone)\n  }${tag('email', toma.email)\n  }</toma>`\n}\n\nfunction buildIntermediario(interm: IntermediarioData): string {\n  return `<interm>${\n    tag('CNPJ', interm.cnpj?.replace(/\\D/g, ''))\n  }${tag('CPF', interm.cpf?.replace(/\\D/g, ''))\n  }${tag('NIF', interm.nif)\n  }${tag('cNaoNIF', interm.codigoNaoNif)\n  }${tag('IM', interm.inscricaoMunicipal)\n  }${tag('xNome', interm.nome)\n  }</interm>`\n}\n\nfunction buildServico(serv: ServicoData): string {\n  // TCInfoObra (XSD): inscImobFisc?, then choice(cObra | cCIB | end).\n  // O elemento <art> não existe no schema — identificação de ART/RRT/DRT vai em <infoCompl><idDocTec>.\n  const obraXml = serv.obra && (serv.obra.inscImobFisc || serv.obra.cObra)\n    ? `<obra>${tag('inscImobFisc', serv.obra.inscImobFisc)}${tag('cObra', serv.obra.cObra)}</obra>`\n    : ''\n\n  // TCAtvEvento (XSD): xNome, dtIni, dtFim, choice(idAtvEvt | end).\n  // O <end> aqui é TCEnderecoSimples — choice(CEP | endExt) e o endExt sem cPais.\n  const atv = serv.atvEvento\n  const atvEventoXml = atv\n    ? `<atvEvento>${\n      tag('xNome', atv.xNome)\n    }${tag('dtIni', atv.dtIni)\n    }${tag('dtFim', atv.dtFim)\n    }${atv.idAtvEvt\n      ? tag('idAtvEvt', atv.idAtvEvt)\n      : atv.endereco\n        ? `<end>${\n          atv.endereco.exterior\n            ? `<endExt>${\n              tag('cEndPost', atv.endereco.exterior.cEndPost)\n            }${tag('xCidade', atv.endereco.exterior.xCidade)\n            }${tag('xEstProvReg', atv.endereco.exterior.xEstProvReg)\n            }</endExt>`\n            : tag('CEP', atv.endereco.cep?.replace(/\\D/g, ''))\n        }${tag('xLgr', atv.endereco.xLgr)\n        }${tag('nro', atv.endereco.nro)\n        }${tag('xCpl', atv.endereco.xCpl)\n        }${tag('xBairro', atv.endereco.xBairro)\n        }</end>`\n        : ''\n    }</atvEvento>`\n    : ''\n\n  // TCInfoCompl (XSD): idDocTec?, docRef?, xPed?, gItemPed?, xInfComp?\n  const info = serv.informacaoComplemento\n  const infoComplXml = info && (info.idDocTec || info.docRef || info.xPed || info.xInfComp)\n    ? `<infoCompl>${\n      tag('idDocTec', info.idDocTec)\n    }${tag('docRef', info.docRef)\n    }${tag('xPed', info.xPed)\n    }${tag('xInfComp', info.xInfComp)\n    }</infoCompl>`\n    : ''\n\n  // TCInfoComExt (XSD): mdPrestacao, vincPrest, tpMoeda, vServMoeda, mecAFComexP?,\n  // mecAFComexT?, movTempBens?, mdic? — emitido após <cServ>.\n  const ce = serv.comercioExterior\n  const comExtXml = ce\n    ? `<comExt>${\n      tag('mdPrestacao', ce.mdPrestacao)\n    }${tag('vincPrest', ce.vincPrest)\n    }${tag('tpMoeda', ce.tpMoeda)\n    }${tag('vServMoeda', fmt(ce.vServMoeda))\n    }${tag('mecAFComexP', ce.mecAFComexP)\n    }${tag('mecAFComexT', ce.mecAFComexT)\n    }${tag('movTempBens', ce.movTempBens)\n    }${tag('mdic', ce.mdic)\n    }</comExt>`\n    : ''\n\n  return `<serv><locPrest>${\n    tag('cLocPrestacao', serv.localPrestacao.cLocPrestacao)\n  }${tag('cPaisPrestacao', serv.localPrestacao.cPaisPrestacao)\n  }</locPrest><cServ>${\n    tag('cTribNac', serv.codigoServico.cServTribNac?.replace(/\\D/g, ''))\n  }${tag('cTribMun', serv.codigoServico.cServMun?.replace(/\\D/g, ''))\n  }${tag('xDescServ', serv.xDescServ)\n  }${tag('cNBS', serv.codigoServico.cNBSPrinc)\n  }${tag('cIntContrib', serv.codigoServico.cIntContrib)\n  }</cServ>${comExtXml}${obraXml}${atvEventoXml}${infoComplXml}</serv>`\n}\n\nfunction buildValores(val: ValoresServicoData, trib?: TributacaoData): string {\n  const issqn = trib?.issqn\n  const fed = trib?.federal\n\n  // vDescCondIncond\n  const descXml = (val.vDescIncondicionado !== undefined || val.vDescCondicionado !== undefined)\n    ? `<vDescCondIncond>${tag('vDescIncond', val.vDescIncondicionado !== undefined ? fmt(val.vDescIncondicionado) : undefined)}${tag('vDescCond', val.vDescCondicionado !== undefined ? fmt(val.vDescCondicionado) : undefined)}</vDescCondIncond>`\n    : ''\n\n  // tribMun — obrigatório dentro de <trib>. tribISSQN e tpRetISSQN são obrigatórios;\n  // usamos 1 (Operação tributável / Não retido) como fallback quando não informados.\n  const exigSuspXml = issqn?.tipoSuspensao !== undefined\n    ? `<exigSusp>${tag('tpSusp', issqn.tipoSuspensao)}${tag('nProcesso', issqn.numeroProcessoSuspensao)}</exigSusp>`\n    : ''\n  const tribMunXml = `<tribMun>${\n    tag('tribISSQN', issqn?.tributacaoIssqn ?? 1)\n  }${tag('tpImunidade', issqn?.tipoImunidade)\n  }${exigSuspXml\n  }${tag('tpRetISSQN', issqn?.tipoRetencaoIssqn ?? 1)\n  }${issqn?.aliquota !== undefined ? tag('pAliq', fmt(issqn.aliquota * 100)) : ''\n  }</tribMun>`\n\n  // tribFed — opcional\n  const tribFedXml = fed ? (() => {\n    const piscofinXml = fed.cstPisCofins\n      ? `<piscofins>${tag('CST', fed.cstPisCofins)}${fed.baseCalculoPisCofins !== undefined ? tag('vBCPisCofins', fmt(fed.baseCalculoPisCofins)) : ''}${fed.aliquotaPis !== undefined ? tag('pAliqPis', fmt(fed.aliquotaPis * 100)) : ''}${fed.aliquotaCofins !== undefined ? tag('pAliqCofins', fmt(fed.aliquotaCofins * 100)) : ''}${fed.valorPis !== undefined ? tag('vPis', fmt(fed.valorPis)) : ''}${fed.valorCofins !== undefined ? tag('vCofins', fmt(fed.valorCofins)) : ''}${tag('tpRetPisCofins', fed.tipoRetencaoPisCofins)}</piscofins>`\n      : ''\n    return `<tribFed>${piscofinXml}${fed.valorRetidoIrrf !== undefined ? tag('vRetIRRF', fmt(fed.valorRetidoIrrf)) : ''}${fed.valorRetidoCsll !== undefined ? tag('vRetCSLL', fmt(fed.valorRetidoCsll)) : ''}</tribFed>`\n  })() : ''\n\n  // totTrib — obrigatório dentro de <trib>. XSD define choice entre 4 variantes;\n  // quando nenhum dado é fornecido, cai no indTotTrib=0 (fixo por regra do schema).\n  let totTribXml: string\n  if (trib?.percentualTotalTributosSN !== undefined) {\n    totTribXml = `<totTrib>${tag('pTotTribSN', fmt(trib.percentualTotalTributosSN))}</totTrib>`\n  } else if (trib?.valorTotalTributosFederais !== undefined || trib?.valorTotalTributosEstaduais !== undefined || trib?.valorTotalTributosMunicipais !== undefined) {\n    totTribXml = `<totTrib><vTotTrib>${tag('vTotTribFed', trib.valorTotalTributosFederais !== undefined ? fmt(trib.valorTotalTributosFederais) : undefined)}${tag('vTotTribEst', trib.valorTotalTributosEstaduais !== undefined ? fmt(trib.valorTotalTributosEstaduais) : undefined)}${tag('vTotTribMun', trib.valorTotalTributosMunicipais !== undefined ? fmt(trib.valorTotalTributosMunicipais) : undefined)}</vTotTrib></totTrib>`\n  } else if (trib?.percentualTotalTributosFederais !== undefined || trib?.percentualTotalTributosEstaduais !== undefined || trib?.percentualTotalTributosMunicipais !== undefined) {\n    totTribXml = `<totTrib><pTotTrib>${tag('pTotTribFed', fmt(trib.percentualTotalTributosFederais ?? 0))}${tag('pTotTribEst', fmt(trib.percentualTotalTributosEstaduais ?? 0))}${tag('pTotTribMun', fmt(trib.percentualTotalTributosMunicipais ?? 0))}</pTotTrib></totTrib>`\n  } else {\n    totTribXml = `<totTrib>${tag('indTotTrib', trib?.indicadorTotalTributos ?? 0)}</totTrib>`\n  }\n\n  const tribXml = `<trib>${tribMunXml}${tribFedXml}${totTribXml}</trib>`\n\n  return `<valores><vServPrest>${val.vReceb !== undefined ? tag('vReceb', fmt(val.vReceb)) : ''}${tag('vServ', fmt(val.vServico))}</vServPrest>${descXml}${tribXml}</valores>`\n}\n\nfunction buildIbsCbs(ibs: IbsCbsData): string {\n  const gi = ibs.valores.trib.gIBSCBS\n  const gIbsCbsXml = `<gIBSCBS>${tag('CST', gi.CST)}${tag('cClassTrib', gi.cClassTrib)}${tag('cCredPres', gi.cCredPres)}</gIBSCBS>`\n  const tribXml = `<trib>${gIbsCbsXml}</trib>`\n  const valoresXml = `<valores>${tribXml}</valores>`\n  // Ordem conforme TCRTCInfoIBSCBS no XSD v1.01:\n  // finNFSe, indFinal?, cIndOp, tpOper?, gRefNFSe?, tpEnteGov?, indDest, dest?, imovel?, valores\n  return `<IBSCBS>${\n    tag('finNFSe', ibs.finNFSe)\n  }${tag('indFinal', ibs.indFinal)\n  }${tag('cIndOp', ibs.cIndOp)\n  }${tag('tpOper', ibs.tpOper)\n  }${tag('indDest', ibs.indDest)\n  }${valoresXml}</IBSCBS>`\n}\n\n/**\n * Constrói o XML do DPS (sem assinatura) conforme XSD v1.01.\n * O resultado deve ser assinado pelo XmlSigner antes de ser enviado.\n */\nexport function buildDpsXml(dps: DpsData): string {\n  const inf = dps.infDps\n  const versao = dps.versao ?? VERSAO\n\n  // Ordem dos elementos conforme TCInfDPS no XSD v1.01:\n  // tpAmb, dhEmi, verAplic, serie, nDPS, dCompet, tpEmit,\n  // cMotivoEmisTI?, chNFSeRej?, cLocEmi, subst?, prest, toma?, interm?,\n  // serv, valores, IBSCBS, pag?\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><DPS xmlns=\"${NAMESPACE}\" versao=\"${versao}\"><infDPS Id=\"${inf.id}\">${\n    tag('tpAmb', inf.tipoAmbiente)\n  }${tag('dhEmi', inf.dataEmissao)\n  }${tag('verAplic', inf.versaoAplicativo ?? '1.01')\n  }${tag('serie', inf.serie)\n  }${tag('nDPS', inf.numeroDps)\n  }${tag('dCompet', inf.dataCompetencia)\n  }${tag('tpEmit', inf.tipoEmitente)\n  }${inf.motivoEmissao !== undefined ? tag('cMotivoEmisTI', inf.motivoEmissao) : ''\n  }${inf.chaveNfseRejeitada ? tag('chNFSeRej', inf.chaveNfseRejeitada) : ''\n  }${tag('cLocEmi', inf.codigoLocalEmissao)\n  }${buildPrestador(inf.prestador)\n  }${inf.tomador ? buildTomador(inf.tomador) : ''\n  }${inf.intermediario ? buildIntermediario(inf.intermediario) : ''\n  }${buildServico(inf.servico)\n  }${buildValores(inf.valores, inf.tributacao)\n  }${inf.ibsCbs ? buildIbsCbs(inf.ibsCbs) : ''\n  }</infDPS></DPS>`\n}\n","/**\n * Escape de conteúdo de elemento XML.\n *\n * Os builders montam o XML por concatenação de string, então qualquer texto\n * livre vindo do chamador (`xNome`, `xDescServ`, `xInfComp`, `xLgr`, `xMotivo`)\n * precisa passar por aqui. Uma razão social como `A & B LTDA` produz XML\n * malformado sem escape — a assinatura falha ou a SEFIN recusa o esquema.\n *\n * Escapa apenas o necessário para conteúdo de elemento: `&`, `<` e `>`. Aspas\n * não precisam ser escapadas fora de atributo, e os builders não interpolam\n * texto livre em atributo (`Id` é gerado, `versao` é constante).\n *\n * O `&` vem primeiro — inverter a ordem escaparia duas vezes o `&` das próprias\n * entidades.\n */\nexport function escapeXml(value: string | number): string {\n  if (typeof value === 'number') return String(value)\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n}\n","/**\n * Construtor do XML de eventos (cancelamento, etc.)\n * Referência: nfse-php/src/Xml/EventosXmlBuilder.php\n *\n * Formato do Id (TSIdPedRegEvt, desde jan/2026):\n *   PRE + chNFSe(50) + tipoEvento(6) = PRE[0-9]{56} = 59 chars\n *   (nPedRegEvento foi removido do Id)\n */\n\nimport type { PedRegEventoData } from '../types/dtos.js'\nimport { formatDhEmissao } from '../utils/id-generator.js'\nimport { escapeXml } from './escape.js'\n\nconst NAMESPACE = 'http://www.sped.fazenda.gov.br/nfse'\nconst VERSAO    = '1.01'\nconst VER_APLIC = 'nfse-nacional-1.0'\n\nfunction tag(name: string, value: string | number | undefined | null): string {\n  if (value === undefined || value === null || value === '') return ''\n  return `<${name}>${escapeXml(value)}</${name}>`\n}\n\n/**\n * Descrição fixa (enumerada no XSD tiposEventos_v1.01.xsd) para cada tipo de evento.\n * O campo `xDesc` deve conter exatamente o valor definido no XSD.\n */\nconst XDESC: Record<number, string> = {\n  // Cancelamento\n  101101: 'Cancelamento de NFS-e',\n  105102: 'Cancelamento de NFS-e por Substituição',\n  101103: 'Solicitação de Análise Fiscal para Cancelamento de NFS-e',\n  105104: 'Cancelamento de NFS-e Deferido por Análise Fiscal',\n  105105: 'Cancelamento de NFS-e Indeferido por Análise Fiscal',\n  // Manifestação\n  202201: 'Confirmação do Prestador',\n  203202: 'Confirmação do Tomador',\n  204203: 'Confirmação do Intermediário',\n  205204: 'Confirmação Tácita',\n  202205: 'Rejeição do Prestador',\n  203206: 'Rejeição do Tomador',\n  204207: 'Rejeição do Intermediário',\n  205208: 'Anulação da Rejeição',\n  // Ofício\n  305101: 'Cancelamento de NFS-e por Ofício',\n  305102: 'Bloqueio de NFS-e por Ofício',\n  305103: 'Desbloqueio de NFS-e por Ofício',\n}\n\n/**\n * Tipos de evento suportados — use o enum `TipoEvento` (ou `TipoEventoCancelamento`).\n */\nexport function buildPedRegEventoXml(data: PedRegEventoData): string {\n  const dhEvento = data.dhEvento ?? formatDhEmissao(new Date(), -3)\n  const tpAmb    = data.tipoAmbiente ?? 1\n\n  // Desde jan/2026: Id = PRE + chNFSe(50) + tipoEvento(6) — sem nSeqEvento\n  const idPedReg  = `PRE${data.chNFSe}${data.tipoEvento}`\n  const eventoTag = `e${data.tipoEvento}`\n  const xDesc     = XDESC[data.tipoEvento] ?? 'Cancelamento de NFS-e'\n\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><pedRegEvento xmlns=\"${NAMESPACE}\" versao=\"${VERSAO}\"><infPedReg Id=\"${idPedReg}\">${\n    tag('tpAmb', tpAmb)\n  }${tag('verAplic', VER_APLIC)\n  }${tag('dhEvento', dhEvento)\n  }${tag('CNPJAutor', data.cnpjAutor)\n  }${tag('CPFAutor', data.cpfAutor)\n  }${tag('chNFSe', data.chNFSe)\n  }<${eventoTag}>${tag('xDesc', xDesc)}${tag('cMotivo', data.cMotivo)}${tag('xMotivo', data.xMotivo)}</${eventoTag}></infPedReg></pedRegEvento>`\n}\n","/**\n * Gerador de ID para o DPS\n * Migrado de nfse-php/src/Support/IdGenerator.php\n *\n * Formato: DPS + CodMun(7) + TipoInscrição(1) + CPF/CNPJ(14) + Série(5) + Número(15) = 45 chars\n * Os campos <serie> e <nDPS> no XML usam valores sem padding (validados pelo TSserieDPS/TSNumDPS).\n * O atributo Id usa sempre os valores com zero-padding (TSIdDPS = DPS[0-9]{42}).\n */\n\nimport { onlyDigits } from './cpf-cnpj.js'\n\nexport type TipoInscricao = 1 | 2 | 3\n\nexport function generateDpsId(\n  cpfCnpj: string,\n  codIbge: string,\n  serieDps: string,\n  numDps: string | number\n): string {\n  const digits = onlyDigits(cpfCnpj)\n  const tipoInscricao: TipoInscricao = digits.length === 14 ? 2 : 1  // 2=CNPJ, 1=CPF\n\n  const munCode = codIbge.padStart(7, '0').slice(0, 7)\n  const inscricao = digits.padStart(14, '0').slice(0, 14)\n  const serie = String(serieDps).padStart(5, '0').slice(0, 5)\n  const numero = String(numDps).padStart(15, '0').slice(0, 15)\n\n  return `DPS${munCode}${tipoInscricao}${inscricao}${serie}${numero}`\n}\n\nexport function generateNumDps(): string {\n  return Date.now().toString()\n}\n\nexport function formatDataCompetencia(date: Date = new Date()): string {\n  const y = date.getFullYear()\n  const m = String(date.getMonth() + 1).padStart(2, '0')\n  const d = String(date.getDate()).padStart(2, '0')\n  return `${y}-${m}-${d}`\n}\n\nexport function formatDhEmissao(date: Date = new Date(), offsetHours = -3): string {\n  const sign = offsetHours < 0 ? '-' : '+'\n  const absH = Math.abs(offsetHours)\n  const offset = `${sign}${String(absH).padStart(2, '0')}:00`\n  const adjusted = new Date(date.getTime() + offsetHours * 3600000)\n  const iso = adjusted.toISOString().replace('Z', '').split('.')[0]\n  return `${iso}${offset}`\n}\n","/**\n * Utilitários para formatação de CPF/CNPJ\n * Migrado de nfse-php/src/Support/CpfCnpjFormatter.php\n */\n\nexport function onlyDigits(value: string): string {\n  return value.replace(/\\D/g, '')\n}\n\nexport function formatCpf(cpf: string): string {\n  const d = onlyDigits(cpf).padStart(11, '0')\n  return `${d.slice(0, 3)}.${d.slice(3, 6)}.${d.slice(6, 9)}-${d.slice(9, 11)}`\n}\n\nexport function formatCnpj(cnpj: string): string {\n  const d = onlyDigits(cnpj).padStart(14, '0')\n  return `${d.slice(0, 2)}.${d.slice(2, 5)}.${d.slice(5, 8)}/${d.slice(8, 12)}-${d.slice(12, 14)}`\n}\n\nexport function formatCep(cep: string): string {\n  const d = onlyDigits(cep).padStart(8, '0')\n  return `${d.slice(0, 5)}-${d.slice(5)}`\n}\n\nexport function formatTelefone(tel: string): string {\n  const d = onlyDigits(tel)\n  if (d.length === 11) return `(${d.slice(0, 2)}) ${d.slice(2, 7)}-${d.slice(7)}`\n  if (d.length === 10) return `(${d.slice(0, 2)}) ${d.slice(2, 6)}-${d.slice(6)}`\n  return d\n}\n\nexport function unformat(value: string): string {\n  return onlyDigits(value)\n}\n\nexport function isCnpj(value: string): boolean {\n  return onlyDigits(value).length === 14\n}\n\n// ---------------------------------------------------------------------------\n// Dígitos verificadores (Mod 11)\n// ---------------------------------------------------------------------------\n\n/** Peso decrescente a partir de `start`, ciclando de 9 para 2 (regra do CNPJ). */\nfunction mod11Dv(values: number[], startWeight: number): number {\n  let weight = startWeight\n  let sum = 0\n  for (const value of values) {\n    sum += value * weight\n    weight = weight === 2 ? 9 : weight - 1\n  }\n  const rest = sum % 11\n  return rest < 2 ? 0 : 11 - rest\n}\n\n/**\n * Valida um CPF pelos dígitos verificadores (Mod 11).\n *\n * Aceita com ou sem formatação. Sequências de dígito repetido\n * (`111.111.111-11`) passam na aritmética do Mod 11 e são rejeitadas à parte.\n */\nexport function isValidCpf(value: string): boolean {\n  const digits = onlyDigits(value)\n  if (digits.length !== 11) return false\n  if (/^(\\d)\\1{10}$/.test(digits)) return false\n\n  const nums = [...digits].map(Number)\n  const dv1 = mod11Dv(nums.slice(0, 9), 10)\n  const dv2 = mod11Dv(nums.slice(0, 10), 11)\n  return dv1 === nums[9] && dv2 === nums[10]\n}\n\n/**\n * Valida um CNPJ pelos dígitos verificadores (Mod 11), **numérico ou\n * alfanumérico**.\n *\n * O CNPJ alfanumérico (IN RFB 2.229/2024) mantém 14 posições: 12 alfanuméricas\n * (`0-9`, `A-Z`) + 2 dígitos verificadores numéricos. O valor de cada posição no\n * cálculo é `código ASCII − 48`, o que faz `'0'` valer 0 e `'A'` valer 17 — a\n * mesma conta serve para os dois formatos.\n *\n * ⚠️ O XSD v1.01 da NFS-e ainda restringe `TSCNPJ` a `[0-9]{14}`: um CNPJ\n * alfanumérico é legalmente válido e **recusado pelo schema vigente** até a\n * SEFIN publicar a atualização.\n *\n * Aceita com ou sem formatação. Caracteres repetidos em todas as posições são\n * rejeitados.\n */\nexport function isValidCnpj(value: string): boolean {\n  const clean = value.replace(/[^0-9A-Za-z]/g, '').toUpperCase()\n  if (clean.length !== 14) return false\n  if (/^(.)\\1{13}$/.test(clean)) return false\n  // Os dois dígitos verificadores são sempre numéricos.\n  if (!/^[0-9A-Z]{12}[0-9]{2}$/.test(clean)) return false\n\n  const values = [...clean].map(char => char.charCodeAt(0) - 48)\n  const dv1 = mod11Dv(values.slice(0, 12), 5)\n  const dv2 = mod11Dv(values.slice(0, 13), 6)\n  return dv1 === values[12] && dv2 === values[13]\n}\n","/**\n * Gerenciamento de certificado digital A1 (.pfx / .p12)\n * Migrado de nfse-php/src/Signer/Certificate.php\n *\n * Usa node-forge para leitura do PFX sem dependências nativas de OpenSSL\n */\n\nimport forge from 'node-forge'\nimport { readFileSync } from 'node:fs'\nimport type { NfseContext } from '../types/context.js'\n\nexport interface CertificateInfo {\n  privateKeyPem: string\n  certificatePem: string\n  certificateClean: string\n  expiresAt: Date\n  commonName: string\n  pfxBuffer: Buffer\n  password: string\n}\n\nexport function loadCertificate(pfxPathOrBuffer: string | Buffer, password: string): CertificateInfo {\n  const pfxBuffer =\n    typeof pfxPathOrBuffer === 'string'\n      ? readFileSync(pfxPathOrBuffer)\n      : pfxPathOrBuffer\n\n  const pfxDer = forge.util.createBuffer(pfxBuffer.toString('binary'))\n  const pfxAsn1 = forge.asn1.fromDer(pfxDer)\n\n  let pkcs12: forge.pkcs12.Pkcs12Pfx\n  try {\n    pkcs12 = forge.pkcs12.pkcs12FromAsn1(pfxAsn1, password)\n  } catch (err) {\n    throw new Error(`Falha ao abrir o certificado. Verifique a senha. Detalhe: ${(err as Error).message}`)\n  }\n\n  const KEY_OID = forge.pki.oids.pkcs8ShroudedKeyBag as string\n  const keyBags = pkcs12.getBags({ bagType: KEY_OID })\n  const keyBag = keyBags[KEY_OID]?.[0]\n  if (!keyBag?.key) throw new Error('Chave privada não encontrada no certificado')\n\n  const privateKeyPem = forge.pki.privateKeyToPem(keyBag.key)\n\n  const CERT_OID = forge.pki.oids.certBag as string\n  const certBags = pkcs12.getBags({ bagType: CERT_OID })\n  const certBag = certBags[CERT_OID]?.[0]\n  if (!certBag?.cert) throw new Error('Certificado público não encontrado no PFX')\n\n  const cert = certBag.cert\n  const certificatePem = forge.pki.certificateToPem(cert)\n  const certificateClean = certificatePem\n    .replace('-----BEGIN CERTIFICATE-----', '')\n    .replace('-----END CERTIFICATE-----', '')\n    .replace(/\\r?\\n/g, '')\n    .trim()\n\n  const expiresAt = cert.validity.notAfter\n  if (expiresAt < new Date()) {\n    throw new Error(`Certificado expirado em ${expiresAt.toISOString()}`)\n  }\n\n  const cn = cert.subject.getField('CN')\n  const commonName = cn?.value ?? 'Desconhecido'\n\n  return { privateKeyPem, certificatePem, certificateClean, expiresAt, commonName, pfxBuffer, password }\n}\n\nexport function resolveCertSource(context: NfseContext): string | Buffer {\n  if (context.certificateData) {\n    return Buffer.isBuffer(context.certificateData)\n      ? context.certificateData\n      : Buffer.from(context.certificateData)\n  }\n  if (context.certificatePath) return context.certificatePath\n  throw new Error('Informe certificatePath ou certificateData no contexto NfseContext')\n}\n\nexport function signWithKey(content: string, privateKeyPem: string, algorithm: 'SHA1' | 'SHA256' = 'SHA256'): Buffer {\n  const privateKey = forge.pki.privateKeyFromPem(privateKeyPem)\n  const md = algorithm === 'SHA256' ? forge.md.sha256.create() : forge.md.sha1.create()\n  md.update(content, 'utf8')\n  const signature = privateKey.sign(md)\n  return Buffer.from(signature, 'binary')\n}\n","/**\n * Cliente HTTP para a API SEFIN Nacional com mTLS\n * Migrado de nfse-php/src/Http/Client/SefinClient.php\n *\n * Bun: fetch() com opção não padrão `tls` (certificado de cliente).\n * Node: Undici não suporta `tls` no RequestInit — usa `https.request`.\n */\n\nimport * as https from 'node:https'\nimport type { NfseContext } from '../types/context.js'\nimport type {\n  EmissaoNfseResponse,\n  ConsultaNfseResponse,\n  ConsultaDpsResponse,\n  RegistroEventoResponse,\n} from '../types/dtos.js'\nimport { resolveBaseUrl } from '../utils/endpoint-resolver.js'\nimport { decompressXml } from '../crypto/xml-signer.js'\nimport { parseNfseXml } from '../xml/nfse-parser.js'\nimport { loadCertificate, resolveCertSource } from '../crypto/certificate.js'\n\nfunction isBunRuntime(): boolean {\n  return typeof process !== 'undefined'\n    && process.versions != null\n    && 'bun' in process.versions\n}\n\nexport class SefinClient {\n  private baseUrl: string\n  private tlsKey: string\n  private tlsCert: string\n  private readonly bunMtls: boolean\n\n  constructor(private context: NfseContext) {\n    this.baseUrl = resolveBaseUrl(context).replace(/\\/$/, '')\n    const cert = loadCertificate(resolveCertSource(context), context.certificatePassword)\n    this.tlsKey = cert.privateKeyPem\n    this.tlsCert = cert.certificatePem\n    this.bunMtls = isBunRuntime()\n  }\n\n  /**\n   * Requisição HTTPS com certificado de cliente (mTLS).\n   * Bun e Node divergem na API suportada pelo fetch global.\n   */\n  private async mtlsFetch(\n    urlStr: string,\n    opts: { method: string; headers: Record<string, string>; body?: string },\n  ): Promise<Response> {\n    if (this.bunMtls) {\n      type BunMtlsInit = RequestInit & {\n        tls: { key: string; cert: string; rejectUnauthorized: boolean }\n      }\n      return fetch(urlStr, {\n        method: opts.method,\n        headers: opts.headers,\n        body: opts.body,\n        tls: { key: this.tlsKey, cert: this.tlsCert, rejectUnauthorized: false },\n      } as BunMtlsInit)\n    }\n\n    const u = new URL(urlStr)\n    const port = u.port === '' ? 443 : Number(u.port)\n\n    return await new Promise<Response>((resolve, reject) => {\n      const req = https.request(\n        {\n          hostname: u.hostname,\n          port,\n          path: `${u.pathname}${u.search}`,\n          method: opts.method,\n          headers: opts.headers,\n          key: this.tlsKey,\n          cert: this.tlsCert,\n          rejectUnauthorized: false,\n        },\n        (incoming) => {\n          const chunks: Buffer[] = []\n          incoming.on('data', (chunk: Buffer) => { chunks.push(chunk) })\n          incoming.on('end', () => {\n            const text = Buffer.concat(chunks).toString('utf8')\n            const status = incoming.statusCode ?? 0\n            resolve(new Response(text, { status, statusText: incoming.statusMessage ?? '' }))\n          })\n        },\n      )\n      req.on('error', reject)\n      if (opts.body !== undefined) req.write(opts.body)\n      req.end()\n    })\n  }\n\n  async emitirNfse(dpsXmlGZipB64: string): Promise<EmissaoNfseResponse> {\n    const data = await this.post('/nfse', { dpsXmlGZipB64 })\n    return this.parseEmissaoResponse(data)\n  }\n\n  async consultarNfse(chaveAcesso: string): Promise<ConsultaNfseResponse> {\n    const data = await this.get(`/nfse/${chaveAcesso}`)\n    return this.parseConsultaResponse(data)\n  }\n\n  async consultarDps(idDps: string): Promise<ConsultaDpsResponse> {\n    // O endpoint GET /dps/{id} espera 42 dígitos numéricos (sem prefixo DPS)\n    // e retorna a chave de acesso da NFS-e correspondente.\n    const id = idDps.replace(/^DPS/, '')\n    const data = await this.get(`/dps/${id}`) as Record<string, unknown>\n\n    if (this.context.debug) {\n      console.log('[debug] Resposta bruta consultarDps:', JSON.stringify(data, null, 2))\n    }\n\n    return {\n      chaveAcesso: data?.['chaveAcesso'] ? String(data['chaveAcesso']) : undefined,\n      cStat:   data?.['cStat']   ? String(data['cStat'])   : undefined,\n      xMotivo: data?.['xMotivo'] ? String(data['xMotivo']) : undefined,\n    }\n  }\n\n  /** HEAD /dps/{id} — verifica existência sem retornar chave de acesso. */\n  async verificarDps(idDps: string): Promise<boolean> {\n    try {\n      const id = idDps.replace(/^DPS/, '')\n      const res = await this.mtlsFetch(`${this.baseUrl}/dps/${id}`, { method: 'HEAD', headers: {} })\n      return res.ok\n    } catch { return false }\n  }\n\n  async registrarEvento(chaveAcesso: string, eventoXmlGZipB64: string): Promise<RegistroEventoResponse> {\n    // Campo correto conforme PHP SDK de referência: pedidoRegistroEventoXmlGZipB64\n    const data = await this.post(`/nfse/${chaveAcesso}/eventos`, { pedidoRegistroEventoXmlGZipB64: eventoXmlGZipB64 }) as Record<string, unknown>\n    if (this.context.debug) {\n      console.log('[debug] Resposta bruta registrarEvento:', JSON.stringify(data, null, 2))\n    }\n\n    const result: RegistroEventoResponse = {\n      cStat:   String(data?.['cStat']   ?? ''),\n      xMotivo: String(data?.['xMotivo'] ?? ''),\n    }\n\n    // A API retorna o XML do evento processado em eventoXmlGZipB64\n    // cStat/xMotivo costumam estar dentro do XML, não na raiz do JSON\n    const xmlB64 = data?.['eventoXmlGZipB64'] ? String(data['eventoXmlGZipB64']) : undefined\n    if (xmlB64) {\n      result.eventoXmlGZipB64 = xmlB64\n      try {\n        const xml = await decompressXml(xmlB64)\n        // Extrai cStat/xMotivo do XML de retorno do evento\n        const cStatMatch  = xml.match(/<cStat>(\\d+)<\\/cStat>/)\n        const xMotivoMatch = xml.match(/<xMotivo>([^<]+)<\\/xMotivo>/)\n        if (!result.cStat   && cStatMatch?.[1])   result.cStat   = cStatMatch[1]\n        if (!result.xMotivo && xMotivoMatch?.[1]) result.xMotivo = xMotivoMatch[1]\n      } catch { /* mantém o que tiver */ }\n    }\n\n    return result\n  }\n\n  async downloadDanfse(chaveAcesso: string): Promise<string> {\n    const data = await this.get(`/nfse/${chaveAcesso}/pdf`) as Record<string, unknown>\n    return String(data?.['pdf'] ?? data?.['danfse'] ?? '')\n  }\n\n  /** GET /nfse/{chaveAcesso}/eventos */\n  async listarEventos(chaveAcesso: string): Promise<unknown[]> {\n    const data = await this.get(`/nfse/${chaveAcesso}/eventos`)\n    return Array.isArray(data) ? data : ((data as Record<string, unknown>)?.['eventos'] as unknown[] ?? [])\n  }\n\n  /** GET /nfse/{chaveAcesso}/eventos/{tipoEvento} */\n  async listarEventosPorTipo(chaveAcesso: string, tipoEvento: number): Promise<unknown[]> {\n    const data = await this.get(`/nfse/${chaveAcesso}/eventos/${tipoEvento}`)\n    return Array.isArray(data) ? data : ((data as Record<string, unknown>)?.['eventos'] as unknown[] ?? [])\n  }\n\n  /** GET /nfse/{chaveAcesso}/eventos/{tipoEvento}/{numSeqEvento} */\n  async consultarEvento(chaveAcesso: string, tipoEvento: number, numSeqEvento: number): Promise<unknown> {\n    return this.get(`/nfse/${chaveAcesso}/eventos/${tipoEvento}/${numSeqEvento}`)\n  }\n\n  /** GET /parametros_municipais/{codigoMunicipio}/convenio */\n  async consultarParametrosConvenio(codMunicipio: string): Promise<unknown> {\n    return this.get(`/parametros_municipais/${codMunicipio}/convenio`)\n  }\n\n  /** GET /parametros_municipais/{codigoMunicipio}/{codigoServico} */\n  async consultarAliquota(codMunicipio: string, codServico: string): Promise<unknown> {\n    return this.get(`/parametros_municipais/${codMunicipio}/${codServico}`)\n  }\n\n  private async post(path: string, body: unknown): Promise<unknown> {\n    const res = await this.mtlsFetch(`${this.baseUrl}${path}`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify(body),\n    })\n    return this.handleResponse(res)\n  }\n\n  private async get(path: string): Promise<unknown> {\n    const res = await this.mtlsFetch(`${this.baseUrl}${path}`, {\n      method: 'GET',\n      headers: { 'Accept': 'application/json' },\n    })\n    return this.handleResponse(res)\n  }\n\n  private async handleResponse(res: Response): Promise<unknown> {\n    const text = await res.text()\n    if (!res.ok) throw new NfseApiError(`Erro ${res.status}: ${res.statusText}`, res.status, text)\n    try { return JSON.parse(text) } catch { return { raw: text } }\n  }\n\n  private async parseEmissaoResponse(data: unknown): Promise<EmissaoNfseResponse> {\n    const d = data as Record<string, unknown>\n\n    if (this.context.debug) {\n      console.log('[debug] Resposta bruta da API:', JSON.stringify(d, null, 2))\n    }\n\n    const result: EmissaoNfseResponse = {\n      cStat:       String(d?.['cStat'] ?? ''),\n      xMotivo:     String(d?.['xMotivo'] ?? ''),\n      chaveAcesso: d?.['chaveAcesso'] ? String(d['chaveAcesso']) : undefined,\n      idNfse:      d?.['idDps'] ? String(d['idDps']) : undefined,\n    }\n\n    if (d?.['nfseXmlGZipB64']) {\n      result.nfseXmlGZipB64 = String(d['nfseXmlGZipB64'])\n      try {\n        const xml = await decompressXml(result.nfseXmlGZipB64)\n        const schema = parseNfseXml(xml)\n        result.nfse = {\n          infNfse: schema.infNFSe ? {\n            id: schema.infNFSe.id,\n            chNFSe: schema.infNFSe.chNFSe,\n            nNFSe: schema.infNFSe.nNFSe,\n            dhProc: schema.infNFSe.dhProc,\n            cStat: schema.infNFSe.cStat,\n            xMotivo: schema.infNFSe.xMotivo,\n          } : undefined,\n          originalXml: xml,\n        }\n        // A API retorna cStat/xMotivo no XML da NFS-e quando não os inclui na raiz\n        if (!result.cStat && schema.infNFSe?.cStat) result.cStat = String(schema.infNFSe.cStat)\n        if (!result.xMotivo && schema.infNFSe?.xMotivo) result.xMotivo = String(schema.infNFSe.xMotivo)\n        // chaveAcesso pode vir no XML como chNFSe\n        if (!result.chaveAcesso && schema.infNFSe?.chNFSe) result.chaveAcesso = String(schema.infNFSe.chNFSe)\n      } catch { /* mantém só o base64 */ }\n    }\n\n    // Fallback: nfseXmlGZipB64 presente = emissão aprovada\n    if (!result.cStat && result.nfseXmlGZipB64) result.cStat = '100'\n    if (result.cStat === '100' && !result.xMotivo) result.xMotivo = 'NFS-e emitida com sucesso'\n\n    return result\n  }\n\n  private async parseConsultaResponse(data: unknown): Promise<ConsultaNfseResponse> {\n    const d = data as Record<string, unknown>\n\n    if (this.context.debug) {\n      console.log('[debug] Resposta bruta consulta:', JSON.stringify(d, null, 2))\n    }\n\n    const result: ConsultaNfseResponse = {\n      cStat: String(d?.['cStat'] ?? ''),\n      xMotivo: String(d?.['xMotivo'] ?? ''),\n    }\n\n    const xmlB64 = d?.['nfseXmlGZipB64'] ? String(d['nfseXmlGZipB64']) : undefined\n    if (xmlB64) {\n      try {\n        const xml = await decompressXml(xmlB64)\n        const schema = parseNfseXml(xml)\n        result.nfse = { originalXml: xml }\n        // cStat/xMotivo costumam vir dentro do XML, não no root do JSON\n        if (!result.cStat && schema.infNFSe?.cStat)   result.cStat   = String(schema.infNFSe.cStat)\n        if (!result.xMotivo && schema.infNFSe?.xMotivo) result.xMotivo = String(schema.infNFSe.xMotivo)\n      } catch { /* mantém o que tiver */ }\n      // Fallback: se o XML chegou, a nota existe e está ativa\n      if (!result.cStat)   result.cStat   = '100'\n      if (!result.xMotivo) result.xMotivo = 'NFS-e ativa'\n    }\n\n    return result\n  }\n}\n\nexport class NfseApiError extends Error {\n  constructor(message: string, public readonly statusCode: number, public readonly body: string) {\n    super(message)\n    this.name = 'NfseApiError'\n  }\n}\n","/**\n * Resolver de endpoints do SEFIN Nacional e municipais\n * Migrado de nfse-php/src/Support/SefinEndpointResolver.php\n */\n\nimport { TipoAmbiente } from '../types/enums.js'\nimport type { NfseContext } from '../types/context.js'\n\nconst DEFAULT_ENDPOINTS = {\n  producao: 'https://sefin.nfse.gov.br/sefinNacional',\n  homologacao: 'https://sefin.producaorestrita.nfse.gov.br/sefinNacional',\n}\n\n/**\n * Endpoints específicos por município (código IBGE 7 dígitos)\n */\nconst MUNICIPALITY_ENDPOINTS: Record<string, { producao: string; homologacao: string }> = {\n  '3511102': {\n    producao: 'https://164.152.60.237/nota/nacional',\n    homologacao: 'https://catanduva.prefeitura.rlz.com.br/nota/nacional',\n  },\n}\n\nexport function resolveBaseUrl(context: NfseContext): string {\n  if (context.endpoint) {\n    return context.ambiente === TipoAmbiente.Producao\n      ? context.endpoint.producao\n      : context.endpoint.homologacao\n  }\n\n  if (context.codigoMunicipio && MUNICIPALITY_ENDPOINTS[context.codigoMunicipio]) {\n    const ep = MUNICIPALITY_ENDPOINTS[context.codigoMunicipio]!\n    return context.ambiente === TipoAmbiente.Producao ? ep.producao : ep.homologacao\n  }\n\n  return context.ambiente === TipoAmbiente.Producao\n    ? DEFAULT_ENDPOINTS.producao\n    : DEFAULT_ENDPOINTS.homologacao\n}\n","/**\n * Parser do XML da NFS-e\n * Migrado de nfse-php/src/Xml/NfseXmlParser.php\n * e direction-nfse-danfe/src/Danfe/Schemas/NFSeSchema.cs\n *\n * Diferenças importantes entre emit e toma:\n *  - emit.enderNac  → todos os campos (xLgr, nro, xBairro, cMun, UF, CEP) direto no <enderNac>\n *  - toma/interm.end → xLgr/nro/xCpl/xBairro direto em <end>; cMun/CEP aninhados em <end><endNac>\n */\n\nimport { XMLParser } from 'fast-xml-parser'\n\nconst xmlParser = new XMLParser({\n  ignoreAttributes: false,\n  attributeNamePrefix: '@_',\n  removeNSPrefix: true,\n  parseTagValue: false,\n  parseAttributeValue: false,\n  trimValues: true,\n})\n\n// ---------------------------------------------------------------------------\n// API pública\n// ---------------------------------------------------------------------------\n\nexport function parseNfseXml(xml: string): NfseSchema {\n  const sanitized = xml\n    .replace(/^\\uFEFF/, '')\n    .replace(/[^\\x09\\x0A\\x0D\\x20-\\uD7FF\\uE000-\\uFFFD]/g, '')\n    .trim()\n\n  const parsed = xmlParser.parse(sanitized)\n  const root = parsed['NFSe'] ?? parsed['nfseNacional'] ?? parsed['retornoEmissaoNFSe'] ?? parsed\n  return extractNfseSchema(root)\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction str(v: unknown, fallback = ''): string {\n  return v != null && v !== '' ? String(v) : fallback\n}\n\nfunction num(v: unknown): number {\n  const n = Number(v)\n  return isNaN(n) ? 0 : n\n}\n\nfunction rec(v: unknown): Record<string, unknown> | undefined {\n  return v && typeof v === 'object' ? v as Record<string, unknown> : undefined\n}\n\n// ---------------------------------------------------------------------------\n// Extratores\n// ---------------------------------------------------------------------------\n\nfunction extractNfseSchema(root: Record<string, unknown>): NfseSchema {\n  const inf = rec(root?.['infNFSe'] ?? root?.['InfNFSe']) ?? root\n  const id = str(inf?.['@_Id'])\n  // chNFSe pode não existir como elemento — extrair do atributo Id (prefixo \"NFS\" + 44 dígitos)\n  const chNFSe = str(inf?.['chNFSe']) || (id.startsWith('NFS') ? id.slice(3) : '')\n  return {\n    versao: str(root?.['@_versao']) || undefined,\n    infNFSe: inf ? {\n      id:            id || undefined,\n      cStat:         str(inf['cStat']),\n      xMotivo:       str(inf['xMotivo']),\n      chNFSe,\n      nNFSe:         str(inf['nNFSe']),\n      nDFSe:         str(inf['nDFSe']),\n      dhProc:        str(inf['dhProc']),\n      xLocEmi:       str(inf['xLocEmi']),\n      xLocPrestacao: str(inf['xLocPrestacao']),\n      cLocIncid:     str(inf['cLocIncid']),\n      xLocIncid:     str(inf['xLocIncid']),\n      xTribNac:      str(inf['xTribNac']),\n      xTribMun:      str(inf['xTribMun']),\n      xNBS:          str(inf['xNBS']),\n      verAplic:      str(inf['verAplic']),\n      ambGer:        num(inf['ambGer']),\n      tpEmis:        num(inf['tpEmis']),\n      procEmi:       num(inf['procEmi']),\n      xOutInf:       str(inf['xOutInf']),\n      emit:          extractEmit(rec(inf['emit'])),\n      DPS:           extractDps(rec(inf['DPS'])),\n      valores:       extractValoresNfse(rec(inf['valores'])),\n      IBSCBS:        extractIBSCBS(rec(inf['IBSCBS'])),\n    } : undefined,\n  }\n}\n\n/**\n * Emitente da NFS-e — endereço em <enderNac> (todos os campos planos)\n */\nfunction extractEmit(emit: Record<string, unknown> | undefined): EmitSchema | undefined {\n  if (!emit) return undefined\n  return {\n    CNPJ:     str(emit['CNPJ']),\n    CPF:      str(emit['CPF']),\n    IM:       str(emit['IM']),\n    xNome:    str(emit['xNome']),\n    xFant:    str(emit['xFant']),\n    enderNac: extractEnderecoPlano(rec(emit['enderNac'])),\n    fone:     str(emit['fone']),\n    email:    str(emit['email']),\n    regTrib:  extractRegTrib(rec(emit['regTrib'])),\n  }\n}\n\n/**\n * Tomador / intermediário — endereço em <end> com <endNac> aninhado para cMun/CEP\n */\nfunction extractTomador(toma: Record<string, unknown> | undefined): TomadorSchema | undefined {\n  if (!toma) return undefined\n  const end    = rec(toma['end'])\n  const endNac = end ? rec(end['endNac']) : undefined\n  const endExt = end ? rec(end['endExt']) : undefined\n  return {\n    CNPJ:     str(toma['CNPJ']),\n    CPF:      str(toma['CPF']),\n    NIF:      str(toma['NIF']),\n    cNaoNIF:  str(toma['cNaoNIF']),\n    IM:       str(toma['IM']),\n    xNome:    str(toma['xNome']),\n    enderNac: end ? {\n      xLgr:    str(end['xLgr']),\n      nro:     str(end['nro']),\n      xCpl:    str(end['xCpl']),\n      xBairro: str(end['xBairro']),\n      cMun:    str(endNac?.['cMun'] ?? end['cMun']),\n      UF:      str(endNac?.['UF']   ?? end['UF']),\n      CEP:     str(endNac?.['CEP']  ?? end['CEP']),\n      // Endereço estrangeiro (<endExt>): cPais aqui é alfabético (ex: \"SA\"), não BACEN\n      cPais:       str(endExt?.['cPais'] ?? endNac?.['cPais'] ?? end['cPais'], '1058'),\n      cEndPost:    str(endExt?.['cEndPost']),\n      xCidade:     str(endExt?.['xCidade']),\n      xEstProvReg: str(endExt?.['xEstProvReg']),\n    } : extractEnderecoPlano(rec(toma['enderNac'])),\n    fone:  str(toma['fone']),\n    email: str(toma['email']),\n  }\n}\n\n/**\n * Endereço plano — todos os campos como filhos diretos do elemento (usado em <enderNac> do emit)\n */\nfunction extractEnderecoPlano(end: Record<string, unknown> | undefined): EnderNacSchema | undefined {\n  if (!end) return undefined\n  return {\n    xLgr:    str(end['xLgr']),\n    nro:     str(end['nro']),\n    xCpl:    str(end['xCpl']),\n    xBairro: str(end['xBairro']),\n    cMun:    str(end['cMun']),\n    UF:      str(end['UF']),\n    CEP:     str(end['CEP']),\n    cPais:   str(end['cPais'], '1058'),\n  }\n}\n\nfunction extractRegTrib(r: Record<string, unknown> | undefined) {\n  if (!r) return undefined\n  return {\n    opSimpNac:  num(r['opSimpNac']),\n    regApurSN:  num(r['regApurSN']),\n    regEspTrib: num(r['regEspTrib']),\n  }\n}\n\nfunction extractDps(dps: Record<string, unknown> | undefined): DpsSchema | undefined {\n  if (!dps) return undefined\n  const infDPS = rec(dps['infDPS']) ?? dps\n  const serv     = rec(infDPS['serv'])\n  const cServ    = serv ? rec(serv['cServ']) : undefined\n  const locPrest = serv ? rec(serv['locPrest']) : undefined\n  const infoCompl = serv ? rec(serv['infoCompl']) : undefined\n  const substRaw = rec(infDPS['subst'])\n\n  return {\n    infDPS: {\n      tpAmb:    num(infDPS['tpAmb']),\n      verAplic: str(infDPS['verAplic']),\n      serie:    str(infDPS['serie']),\n      nDPS:     str(infDPS['nDPS']),\n      dhEmi:    str(infDPS['dhEmi']),\n      dCompet:  str(infDPS['dCompet']),\n      tpEmit:   num(infDPS['tpEmit']),\n      cLocEmi:  str(infDPS['cLocEmi']),\n      subst: substRaw ? {\n        chSubstda: str(substRaw['chSubstda']),\n        cMotivo:   str(substRaw['cMotivo']),\n        xMotivo:   str(substRaw['xMotivo']),\n      } : undefined,\n      prest:    extractEmit(rec(infDPS['prest'])),\n      toma:     extractTomador(rec(infDPS['toma'])),\n      interm:   extractTomador(rec(infDPS['interm'])),\n      serv: serv ? {\n        xDescServ:    str(cServ?.['xDescServ']),\n        cTribNac:     str(cServ?.['cTribNac']),\n        cServMun:     str(cServ?.['cTribMun']),\n        cNBS:         str(cServ?.['cNBS']),\n        cIntContrib:  str(cServ?.['cIntContrib']),\n        cLocPrestacao: str(locPrest?.['cLocPrestacao']),\n        // xInfComp pode estar em serv.infoCompl.xInfComp ou direto em serv.xInfComp (compat)\n        xInfComp:     str(infoCompl?.['xInfComp'] ?? serv['xInfComp']),\n        idDocTec:     str(infoCompl?.['idDocTec']),\n        docRef:       str(infoCompl?.['docRef']),\n        xPed:         str(infoCompl?.['xPed']),\n      } : undefined,\n      valores: extractValoresDps(rec(infDPS['valores'])),\n    },\n  }\n}\n\n/**\n * Valores da NFS-e (infNFSe.valores) — campos calculados pela SEFIN\n * Nota: vServico não vem aqui; o renderer usa o valor do DPS quando disponível.\n */\nfunction extractValoresNfse(val: Record<string, unknown> | undefined): ValoresNfseSchema | undefined {\n  if (!val) return undefined\n  return {\n    vBC:                 num(val['vBC']),\n    pAliqAplic:          num(val['pAliqAplic']),\n    vISSQN:              num(val['vISSQN']),\n    vLiq:                num(val['vLiq']),\n    vServico:            num(val['vServico']),   // presente em algumas versões / fallback para DPS\n    vCalcBM:             num(val['vCalcBM']),\n    vCalcDR:             num(val['vCalcDR']),\n    vTotalRet:           num(val['vTotalRet']),\n    vDescCondicionado:   num(val['vDescCondicionado']),\n    vDescIncondicionado: num(val['vDescIncondicionado']),\n    IRRF:                num(val['vRetIRRF']),\n    CP:                  num(val['CP']),\n    CSLL:                num(val['vRetCSLL']),\n    PIS:                 num(val['vPis']),\n    COFINS:              num(val['vCofins']),\n  }\n}\n\n/**\n * Valores do DPS (infDPS.valores) — estrutura diferente da NFS-e\n *   <vServPrest><vServ/></vServPrest>\n *   <trib><tribMun/><tribFed/><totTrib/></trib>\n */\nfunction extractValoresDps(val: Record<string, unknown> | undefined): ValoresDpsSchema | undefined {\n  if (!val) return undefined\n  const vServPrest      = rec(val['vServPrest'])\n  const vDescCondIncond = rec(val['vDescCondIncond'])\n  const vDedRedRaw      = rec(val['vDedRed'])\n  const trib       = rec(val['trib'])\n  const tribMun    = trib ? rec(trib['tribMun']) : undefined\n  const tribFed    = trib ? rec(trib['tribFed']) : undefined\n  const piscofins  = tribFed ? rec(tribFed['piscofins']) : undefined\n  const totTrib    = trib ? rec(trib['totTrib']) : undefined\n  const pTotTrib   = totTrib ? rec(totTrib['pTotTrib']) : undefined\n  const exigSusp = tribMun ? rec(tribMun['exigSusp']) : undefined\n  const bm       = tribMun ? rec(tribMun['BM']) : undefined\n  return {\n    vReceb:        num(vServPrest?.['vReceb']),\n    vServ:         num(vServPrest?.['vServ']),\n    vDescIncond:   num(vDescCondIncond?.['vDescIncond']),\n    vDescCond:     num(vDescCondIncond?.['vDescCond']),\n    pDR:           num(vDedRedRaw?.['pDR']),\n    vDR:           num(vDedRedRaw?.['vDR']),\n    tribISSQN:     str(tribMun?.['tribISSQN']),\n    cPaisResult:   str(tribMun?.['cPaisResult']),\n    tpImunidade:   str(tribMun?.['tpImunidade']),\n    tpSusp:        str(exigSusp?.['tpSusp']),\n    nProcesso:     str(exigSusp?.['nProcesso']),\n    nBM:           str(bm?.['nBM']),\n    vRedBCBM:      num(bm?.['vRedBCBM']),\n    pRedBCBM:      num(bm?.['pRedBCBM']),\n    tpRetISSQN:    str(tribMun?.['tpRetISSQN']),\n    pAliq:         str(tribMun?.['pAliq']),\n    vRetCP:        num(tribFed?.['vRetCP']),\n    vRetIRRF:      num(tribFed?.['vRetIRRF']),\n    vRetCSLL:      num(tribFed?.['vRetCSLL']),\n    cstPisCofins:  str(piscofins?.['CST']),\n    vBCPisCofins:  num(piscofins?.['vBCPisCofins']),\n    pAliqPis:      num(piscofins?.['pAliqPis']),\n    pAliqCofins:   num(piscofins?.['pAliqCofins']),\n    vPis:          num(piscofins?.['vPis']),\n    vCofins:       num(piscofins?.['vCofins']),\n    tpRetPisCofins: str(piscofins?.['tpRetPisCofins']),\n    pTotTribFed:   num(pTotTrib?.['pTotTribFed']),\n    pTotTribEst:   num(pTotTrib?.['pTotTribEst']),\n    pTotTribMun:   num(pTotTrib?.['pTotTribMun']),\n  }\n}\n\n/**\n * IBSCBS — bloco de retorno NFS-e com valores calculados de IBS/CBS\n */\nfunction extractIBSCBS(ibscbs: Record<string, unknown> | undefined): IBSCBSSchema | undefined {\n  if (!ibscbs) return undefined\n  const valores  = rec(ibscbs['valores'])\n  const uf       = valores ? rec(valores['uf']) : undefined\n  const mun      = valores ? rec(valores['mun']) : undefined\n  const fed      = valores ? rec(valores['fed']) : undefined\n  const totCIBS  = rec(ibscbs['totCIBS'])\n  const gIBS     = totCIBS ? rec(totCIBS['gIBS']) : undefined\n  const gCBS     = totCIBS ? rec(totCIBS['gCBS']) : undefined\n  const gIBSUF   = gIBS ? rec(gIBS['gIBSUFTot']) : undefined\n  const gIBSMun  = gIBS ? rec(gIBS['gIBSMunTot']) : undefined\n  return {\n    cLocalidadeIncid: str(ibscbs['cLocalidadeIncid']),\n    xLocalidadeIncid: str(ibscbs['xLocalidadeIncid']),\n    pRedutor:         num(ibscbs['pRedutor']),\n    vBC:              num(valores?.['vBC']),\n    pIBSUF:           num(uf?.['pIBSUF']),\n    pAliqEfetUF:      num(uf?.['pAliqEfetUF']),\n    pIBSMun:          num(mun?.['pIBSMun']),\n    pAliqEfetMun:     num(mun?.['pAliqEfetMun']),\n    pCBS:             num(fed?.['pCBS']),\n    pAliqEfetCBS:     num(fed?.['pAliqEfetCBS']),\n    vIBSTot:          num(gIBS?.['vIBSTot']),\n    vIBSUF:           num(gIBSUF?.['vIBSUF']),\n    vIBSMun:          num(gIBSMun?.['vIBSMun']),\n    vCBS:             num(gCBS?.['vCBS']),\n    vTotNF:           num(totCIBS?.['vTotNF']),\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Schemas (interfaces de saída)\n// ---------------------------------------------------------------------------\n\nexport interface NfseSchema {\n  versao?: string\n  infNFSe?: InfNFSeSchema\n}\n\nexport interface InfNFSeSchema {\n  id?: string\n  cStat: string\n  xMotivo: string\n  /** Chave de acesso (44 dígitos) */\n  chNFSe: string\n  /** Número sequencial da NFS-e no município */\n  nNFSe: string\n  /** Número do DFSe no sistema nacional */\n  nDFSe: string\n  dhProc: string\n  xLocEmi: string\n  xLocPrestacao: string\n  cLocIncid: string\n  xLocIncid: string\n  xTribNac: string\n  xTribMun: string\n  xNBS: string\n  verAplic: string\n  ambGer: number\n  tpEmis: number\n  procEmi: number\n  /** Uso da Administração Tributária Municipal */\n  xOutInf: string\n  emit?: EmitSchema\n  DPS?: DpsSchema\n  /** Valores calculados pela SEFIN (alíquota aplicada, ISSQN, base de cálculo) */\n  valores?: ValoresNfseSchema\n  /** Bloco IBS/CBS calculado pela SEFIN (reforma tributária) */\n  IBSCBS?: IBSCBSSchema\n}\n\nexport interface EmitSchema {\n  CNPJ: string\n  CPF: string\n  IM: string\n  xNome: string\n  xFant: string\n  /** Endereço plano (todos os campos dentro de <enderNac>) */\n  enderNac?: EnderNacSchema\n  fone: string\n  email: string\n  regTrib?: { opSimpNac: number; regApurSN: number; regEspTrib: number }\n}\n\nexport interface TomadorSchema {\n  CNPJ: string\n  CPF: string\n  /** NIF — Número de Identificação Fiscal de tomador estrangeiro */\n  NIF: string\n  /** Motivo para não informação do NIF (<cNaoNIF>) — tomador estrangeiro sem NIF */\n  cNaoNIF: string\n  IM: string\n  xNome: string\n  /** Endereço extraído de <end>/<endNac> (ou <end>/<endExt> para estrangeiro) */\n  enderNac?: EnderNacSchema\n  fone: string\n  email: string\n}\n\nexport interface EnderNacSchema {\n  xLgr: string\n  nro: string\n  xCpl: string\n  xBairro: string\n  cMun: string\n  UF: string\n  CEP: string\n  cPais: string\n  /** Código postal estrangeiro (<endExt><cEndPost>) — vazio para endereço nacional */\n  cEndPost?: string\n  /** Cidade estrangeira (<endExt><xCidade>) — vazio para endereço nacional */\n  xCidade?: string\n  /** Estado/província/região estrangeira (<endExt><xEstProvReg>) */\n  xEstProvReg?: string\n}\n\nexport interface DpsSchema {\n  infDPS: {\n    tpAmb: number\n    verAplic: string\n    serie: string\n    nDPS: string\n    dhEmi: string\n    dCompet: string\n    tpEmit: number\n    cLocEmi: string\n    subst?: { chSubstda: string; cMotivo: string; xMotivo: string }\n    prest?: EmitSchema\n    toma?: TomadorSchema\n    interm?: TomadorSchema\n    serv?: {\n      xDescServ: string\n      cTribNac: string\n      cServMun: string\n      cNBS: string\n      cIntContrib: string\n      cLocPrestacao: string\n      xInfComp: string\n      idDocTec: string\n      docRef: string\n      xPed: string\n    }\n    valores?: ValoresDpsSchema\n  }\n}\n\nexport interface ValoresNfseSchema {\n  /** Valor do serviço (presente em algumas versões de resposta; usar DPS como fallback) */\n  vServico: number\n  vBC: number\n  pAliqAplic: number\n  vISSQN: number\n  vLiq: number\n  vCalcBM: number\n  vCalcDR: number\n  vTotalRet: number\n  vDescCondicionado: number\n  vDescIncondicionado: number\n  IRRF: number\n  CP: number\n  CSLL: number\n  PIS: number\n  COFINS: number\n}\n\nexport interface ValoresDpsSchema {\n  vReceb: number\n  vServ: number\n  vDescIncond: number\n  vDescCond: number\n  /** Percentual de dedução/redução */\n  pDR: number\n  /** Valor monetário de dedução/redução */\n  vDR: number\n  tribISSQN: string\n  cPaisResult: string\n  tpImunidade: string\n  tpSusp: string\n  nProcesso: string\n  nBM: string\n  vRedBCBM: number\n  pRedBCBM: number\n  tpRetISSQN: string\n  pAliq: string\n  vRetCP: number\n  vRetIRRF: number\n  vRetCSLL: number\n  cstPisCofins: string\n  vBCPisCofins: number\n  pAliqPis: number\n  pAliqCofins: number\n  vPis: number\n  vCofins: number\n  tpRetPisCofins: string\n  pTotTribFed: number\n  pTotTribEst: number\n  pTotTribMun: number\n}\n\nexport interface IBSCBSSchema {\n  cLocalidadeIncid: string\n  xLocalidadeIncid: string\n  pRedutor: number\n  vBC: number\n  pIBSUF: number\n  pAliqEfetUF: number\n  pIBSMun: number\n  pAliqEfetMun: number\n  pCBS: number\n  pAliqEfetCBS: number\n  vIBSTot: number\n  vIBSUF: number\n  vIBSMun: number\n  vCBS: number\n  vTotNF: number\n}\n","/**\n * Validador de DPS — estrutura (Zod/XSD v1.01) + regras de negócio (SEFIN)\n *\n * 1ª camada: schema Zod derivado do XSD v1.01 (campos obrigatórios, padrões, formatos)\n * 2ª camada: regras de negócio E0128/E0129 e regras 260, 276, 303, 307, 309\n */\n\nimport { z } from 'zod'\nimport { DpsSchema } from './dps-schema.js'\nimport { EmitenteDPS, MotivoNaoNif, TributacaoIssqn } from '../types/enums.js'\nimport type { DpsData, InfDpsData, ValoresServicoData, ServicoData, TomadorData, TributacaoData, IbsCbsData } from '../types/dtos.js'\nimport { IBS_CBS_CST_INDEX } from '../data/ibs-cbs-class-trib.js'\n\n/** Resultado da validação de um DPS. */\nexport interface ValidationResult {\n  /** `true` se o DPS passou em todas as validações. */\n  isValid: boolean\n  /** Mensagens de erro em português. Vazia quando `isValid = true`. */\n  errors: string[]\n}\n\n/**\n * Converte erros do Zod em mensagens de erro legíveis em português,\n * incluindo o caminho do campo para facilitar a depuração.\n */\nfunction zodErrorsToMessages(error: z.ZodError): string[] {\n  return error.issues.map(issue => {\n    const path = issue.path.length > 0 ? `[${issue.path.join('.')}] ` : ''\n    return `${path}${issue.message}`\n  })\n}\n\n/**\n * Códigos de serviço de construção civil que exigem o grupo `obra`\n * conforme Regra 260 do Manual de Integração NFS-e Nacional.\n */\nconst CONSTRUCTION_CODES = new Set([\n  '070201', '070202', '070401', '070501', '070502',\n  '070601', '070602', '070701', '070801', '071701', '071901',\n])\n\n/**\n * Valida um {@link DpsData} em duas camadas:\n * 1. Schema Zod (XSD v1.01): campos obrigatórios, formatos e padrões\n * 2. Regras de negócio: E0128/E0129, Regras 260, 276, 303, 307, 309\n *\n * @example\n * ```ts\n * const result = validateDps(dps)\n * if (!result.isValid) {\n *   console.error('DPS inválido:', result.errors)\n * }\n * ```\n */\nexport function validateDps(dps: DpsData): ValidationResult {\n  // 1ª camada: validação estrutural via Zod (XSD v1.01)\n  const parsed = DpsSchema.safeParse(dps)\n  if (!parsed.success) {\n    return { isValid: false, errors: zodErrorsToMessages(parsed.error) }\n  }\n\n  // 2ª camada: regras de negócio\n  const errors: string[] = []\n  const infDps = dps.infDps\n\n  validatePrestador(infDps, errors)\n  validateTomador(infDps.tomador, errors)\n  validateValores(infDps.valores, errors)\n  validateServico(infDps.servico, errors)\n  validateTributacao(infDps.tributacao, errors)\n  validateIbsCbs(infDps.ibsCbs, errors)\n\n  return errors.length > 0\n    ? { isValid: false, errors }\n    : { isValid: true, errors: [] }\n}\n\n// ---------------------------------------------------------------------------\n// Regras de negócio\n// ---------------------------------------------------------------------------\n\nfunction validatePrestador(infDps: InfDpsData, errors: string[]): void {\n  const prestador = infDps.prestador\n  const tpEmit = infDps.tipoEmitente\n\n  if (!prestador) {\n    errors.push('Prestador é obrigatório.')\n    return\n  }\n\n  // E0129: quando o prestador NÃO é o emitente, endereço é obrigatório\n  if (tpEmit !== EmitenteDPS.Prestador && !prestador.endereco) {\n    errors.push('E0129: Endereço do prestador é obrigatório quando o prestador não for o emitente.')\n  }\n}\n\nfunction validateTomador(tomador: TomadorData | undefined, errors: string[]): void {\n  if (!tomador) return\n\n  const isIdentified = Boolean(tomador.cpf || tomador.cnpj || tomador.nif || tomador.codigoNaoNif)\n  if (!isIdentified) return\n\n  if (!tomador.endereco) {\n    errors.push('Endereço do tomador é obrigatório quando o tomador é identificado.')\n    return\n  }\n\n  if (!tomador.nif && !tomador.codigoNaoNif && !tomador.endereco.cMun) {\n    errors.push('Código do município do tomador (endereco.cMun) é obrigatório para tomador nacional.')\n  }\n\n  // E0226: `cNaoNIF = 0` (\"não informado na nota de origem\") só é aceito em nota\n  // de origem/substituição. Na emissão direta a SEFIN rejeita — falhar aqui em\n  // vez de deixar vir como erro opaco da API.\n  if (tomador.codigoNaoNif === MotivoNaoNif.NaoInformadoNaOrigem) {\n    errors.push(\n      'E0226: codigoNaoNif = 0 (\"não informado na nota de origem\") não é aceito na emissão. ' +\n        'Use MotivoNaoNif.DispensadoDoNif (1) ou MotivoNaoNif.NaoExigenciaDoNif (2), ou informe o NIF.',\n    )\n  }\n}\n\nfunction validateValores(valores: ValoresServicoData, errors: string[]): void {\n  const vServ = valores.vServico ?? 0\n  const vDescIncond = valores.vDescIncondicionado ?? 0\n  const vDescCond = valores.vDescCondicionado ?? 0\n\n  // Regra 307\n  if (vDescIncond > 0 && vDescIncond >= vServ) {\n    errors.push('Regra 307: O desconto incondicionado deve ser menor que o valor do serviço.')\n  }\n\n  // Regra 309\n  if (vDescCond > 0 && vDescCond >= vServ) {\n    errors.push('Regra 309: O desconto condicionado deve ser menor que o valor do serviço.')\n  }\n\n  // Regra 303\n  if (vServ < vDescIncond + vDescCond) {\n    errors.push(\n      'Regra 303: O valor do serviço deve ser maior ou igual ao somatório dos descontos incondicionado e condicionado.',\n    )\n  }\n}\n\nfunction validateTributacao(tributacao: TributacaoData | undefined, errors: string[]): void {\n  const issqn = tributacao?.issqn\n  if (!issqn) return\n\n  // XSD TCTribMunicipal: tpImunidade \"somente para o caso de Imunidade\".\n  // Quando tribISSQN = 2 (Imunidade), tipoImunidade é obrigatório.\n  if (issqn.tributacaoIssqn === TributacaoIssqn.Imunidade && issqn.tipoImunidade == null) {\n    errors.push(\n      'tributacao.issqn.tipoImunidade é obrigatório quando tributacaoIssqn = 2 (Imunidade) — ' +\n      'informe o fundamento da imunidade (TipoImunidade, 0..5).',\n    )\n  }\n\n  // Exportação de serviço (tribISSQN = 3) exige cPaisResult no XSD, ainda não\n  // suportado pelo builder — rejeitamos em vez de emitir um DPS inválido.\n  if (issqn.tributacaoIssqn === TributacaoIssqn.ExportacaoServico) {\n    errors.push(\n      'tributacao.issqn.tributacaoIssqn = 3 (Exportação de serviço) ainda não é suportado: ' +\n      'a exportação exige o país de resultado (cPaisResult), não emitido pelo builder. ' +\n      'Use a situação 1, 2 ou 4 por enquanto.',\n    )\n  }\n}\n\nfunction validateServico(servico: ServicoData | undefined, errors: string[]): void {\n  if (!servico) return\n\n  const cTribNac = (servico.codigoServico?.cServTribNac ?? '').replace(/\\D/g, '')\n\n  // Regra 260: serviços de construção civil exigem dados de obra\n  if (CONSTRUCTION_CODES.has(cTribNac) && !servico.obra) {\n    errors.push('Regra 260: O grupo de informações de obra é obrigatório para o serviço informado.')\n  }\n\n  // Regra 276: serviços do item 12 exigem atividade/evento\n  if (cTribNac.startsWith('12') && !servico.atvEvento) {\n    errors.push('Regra 276: O grupo de informações de Atividade/Evento (servico.atvEvento) é obrigatório para o serviço informado.')\n  }\n}\n\n/**\n * Pareamento CST × cClassTrib contra a tabela oficial.\n *\n * O schema só confere o formato (`[0-9]{3}` e `[0-9]{6}`), então uma combinação\n * inexistente — ou existente mas de outro documento fiscal — passa pelo Zod e é\n * recusada pela SEFIN.\n */\nfunction validateIbsCbs(ibsCbs: IbsCbsData | undefined, errors: string[]): void {\n  if (!ibsCbs) return\n\n  const { CST, cClassTrib } = ibsCbs.valores.trib.gIBSCBS\n  const cst = IBS_CBS_CST_INDEX.get(CST)\n\n  if (!cst) {\n    const validos = [...IBS_CBS_CST_INDEX.keys()].join(', ')\n    errors.push(\n      `ibsCbs: CST \"${CST}\" não consta na tabela oficial de IBS/CBS válida para NFS-e. ` +\n      `CSTs aceitos: ${validos}.`,\n    )\n    return\n  }\n\n  if (!cst.classes.some(c => c.codigo === cClassTrib)) {\n    const validos = cst.classes.map(c => c.codigo).join(', ')\n    errors.push(\n      `ibsCbs: cClassTrib \"${cClassTrib}\" não pertence ao CST ${CST} (${cst.descricao}) ` +\n      `ou não vale para NFS-e. Classificações aceitas para este CST: ${validos}.`,\n    )\n  }\n}\n","/**\n * Schema Zod do DPS — baseado no XSD v1.01 da NFS-e Nacional\n * https://www.notacontrol.com.br/download/nfse/schema_v101.xsd\n *\n * Cada campo inclui mensagem de erro em português descrevendo o motivo da falha.\n * Compatível com Zod v4.\n */\n\nimport { z } from 'zod'\nimport { isValidCpf, isValidCnpj } from '../utils/cpf-cnpj.js'\nimport {\n  TS_LOGRADOURO_MAX,\n  TS_NUMERO_ENDERECO_MAX,\n  TS_COMPLEMENTO_ENDERECO_MAX,\n  TS_BAIRRO_MAX,\n  TS_EMAIL_MAX,\n  TS_CIDADE_MAX,\n  TS_ESTADO_PROV_REGIAO_MAX,\n  TS_CODIGO_END_POSTAL_MAX,\n  TS_NOME_RAZAO_SOCIAL_MAX,\n  TS_NIF_MAX,\n  TS_INSC_MUN_MAX,\n  TS_DESC_INF_COMPL_MAX,\n  TS_DESC_255_MAX,\n  TS_IDE_EVENTO_MAX,\n} from '../utils/xsd-string.js'\nimport {\n  ModoPrestacaoComExt,\n  VinculoPrestacao,\n  MecAFComexPrestador,\n  MecAFComexTomador,\n  MovimentacaoTemporariaBens,\n  EnvioMDIC,\n  MotivoNaoNif,\n} from '../types/enums.js'\n\n// ---------------------------------------------------------------------------\n// Padrões de regex do XSD\n// ---------------------------------------------------------------------------\n\nconst RE_ID_DPS = /^DPS[0-9]{42}$/\nconst RE_NUM_DPS = /^[1-9][0-9]{0,14}$/\nconst RE_SERIE_DPS = /^0{0,4}\\d{1,5}$/\n\n// CNPJ alfanumérico (IN RFB 2.229/2024): 12 posições alfanuméricas + 2 dígitos verificadores.\nconst RE_CNPJ_ALFANUM = /^[0-9A-Z]{12}[0-9]{2}$/\nconst RE_CPF = /^[0-9]{11}$/\nconst RE_CEP = /^[0-9]{8}$/\nconst RE_COD_MUN = /^[0-9]{7}$/\nconst RE_COD_TRIB_NAC = /^[0-9]{6}$/\nconst RE_FONE = /^[0-9]{6,20}$/\nconst RE_COD_PAIS_ISO = /^[A-Z]{2}$/\nconst RE_IBSCBS_IND_OP = /^[0-9]{6}$/\nconst RE_IBSCBS_CST = /^[0-9]{3}$/\nconst RE_IBSCBS_CLASS_TRIB = /^[0-9]{6}$/\nconst RE_IBSCBS_CRED_PRES = /^[0-9]{2}$/\n\n// TSData: YYYY-MM-DD\nconst RE_DATA = /^(20\\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$/\n\n// TSDateTimeUTC: YYYY-MM-DDThh:mm:ss+/-HH:00\nconst RE_DATETIME_UTC =\n  /^(20\\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d([+-](0\\d|1[0-2]):00|\\+12:00)$/\n\n// ---------------------------------------------------------------------------\n// Tipos simples\n// ---------------------------------------------------------------------------\n\nexport const IdDPSSchema = z\n  .string()\n  .regex(RE_ID_DPS, 'Id do DPS inválido — formato: \"DPS\" + 7 dígitos município + 1 tipo inscrição + 14 CNPJ/CPF + 5 série + 15 número = 45 chars (TSIdDPS: DPS[0-9]{42})')\n\nexport const NumeroDpsSchema = z\n  .string()\n  .regex(RE_NUM_DPS, 'Número do DPS inválido — não pode ter zeros à esquerda; use generateNumDps() (TSNumDPS: [1-9][0-9]{0,14})')\n\nexport const SerieDpsSchema = z\n  .string()\n  .regex(RE_SERIE_DPS, 'Série do DPS inválida — até 5 dígitos com zeros à esquerda opcionais (TSSerieDPS: 0{0,4}\\\\d{1,5})')\n\n/**\n * CNPJ — 14 posições, com dígitos verificadores conferidos.\n *\n * Aceita também o **CNPJ alfanumérico** (IN RFB 2.229/2024): 12 posições\n * alfanuméricas + 2 dígitos verificadores. ⚠️ O XSD v1.01 ainda restringe\n * `TSCNPJ` a `[0-9]{14}`, então um CNPJ alfanumérico é legalmente válido e\n * recusado pelo schema vigente da SEFIN — o SDK aceita para não bloquear\n * documento legítimo, mas a rejeição virá da API até a SEFIN atualizar o XSD.\n */\nexport const CnpjSchema = z\n  .string()\n  .regex(RE_CNPJ_ALFANUM, 'CNPJ deve ter 14 posições sem formatação (14 dígitos, ou 12 alfanuméricas + 2 dígitos no CNPJ alfanumérico)')\n  .refine(isValidCnpj, 'CNPJ inválido — dígitos verificadores não conferem')\n\nexport const CpfSchema = z\n  .string()\n  .regex(RE_CPF, 'CPF deve ter exatamente 11 dígitos numéricos sem formatação')\n  .refine(isValidCpf, 'CPF inválido — dígitos verificadores não conferem')\n\nexport const CepSchema = z\n  .string()\n  .regex(RE_CEP, 'CEP deve ter 8 dígitos numéricos sem hífen')\n\nexport const CodMunIBGESchema = z\n  .string()\n  .regex(RE_COD_MUN, 'Código IBGE do município deve ter exatamente 7 dígitos')\n\nexport const CodTribNacSchema = z\n  .string()\n  .refine(v => RE_COD_TRIB_NAC.test(v.replace(/\\D/g, '')), {\n    message: 'Código de tributação nacional (cServTribNac) deve ter 6 dígitos após remover pontos/traços (ex: \"100102\" ou \"10.01.02\")',\n  })\n\n/** A regex garante o formato; esta função garante que a data existe no calendário. */\nfunction isDataReal(value: string): boolean {\n  const [ano, mes, dia] = value.split('-').map(Number) as [number, number, number]\n  const date = new Date(Date.UTC(ano, mes - 1, dia))\n  return date.getUTCFullYear() === ano && date.getUTCMonth() === mes - 1 && date.getUTCDate() === dia\n}\n\nexport const DataCompetenciaSchema = z\n  .string()\n  .regex(RE_DATA, 'Data de competência inválida — use formato YYYY-MM-DD (ex: \"2024-03-15\")')\n  .refine(isDataReal, 'Data de competência inexistente no calendário (ex: 2025-02-30)')\n\nexport const DhEmissaoSchema = z\n  .string()\n  .regex(RE_DATETIME_UTC, 'Data/hora de emissão inválida — use formato ISO 8601 com offset UTC (ex: \"2024-03-15T10:00:00-03:00\"); use formatDhEmissao()')\n\n// ---------------------------------------------------------------------------\n// Endereço\n// ---------------------------------------------------------------------------\n\n/**\n * `TCEnderExt` — os quatro campos são obrigatórios no XSD.\n *\n * Bloco incompleto é a causa do `E1235 — Falha no esquema XML do DF-e`, que a\n * SEFIN devolve sem dizer qual campo faltou. `end` inteiro é opcional; **parcial\n * é que é inválido**.\n */\nexport const EnderecoExteriorSchema = z.object({\n  cPais: z\n    .string()\n    .regex(RE_COD_PAIS_ISO, 'endereco.exterior.cPais deve ser o código ISO de 2 letras maiúsculas (ex: \"PT\", \"VG\") — TSCodPaisISO'),\n  cEndPost: z\n    .string()\n    .min(1, 'endereco.exterior.cEndPost (código postal) é obrigatório no endereço estrangeiro')\n    .max(TS_CODIGO_END_POSTAL_MAX, `endereco.exterior.cEndPost deve ter no máximo ${TS_CODIGO_END_POSTAL_MAX} caracteres`),\n  xCidade: z\n    .string()\n    .min(1, 'endereco.exterior.xCidade (cidade) é obrigatória no endereço estrangeiro')\n    .max(TS_CIDADE_MAX, `endereco.exterior.xCidade deve ter no máximo ${TS_CIDADE_MAX} caracteres`),\n  xEstProvReg: z\n    .string()\n    .min(1, 'endereco.exterior.xEstProvReg (estado/província/região) é obrigatório no endereço estrangeiro')\n    .max(TS_ESTADO_PROV_REGIAO_MAX, `endereco.exterior.xEstProvReg deve ter no máximo ${TS_ESTADO_PROV_REGIAO_MAX} caracteres`),\n})\n\n/**\n * `TCEndereco` — `choice(endNac | endExt)` seguido de `xLgr`, `nro`, `xCpl?` e\n * `xBairro`. Só `xCpl` é opcional; `endNac` exige `cMun` **e** `CEP`.\n */\nexport const EnderecoSchema = z\n  .object({\n    cMun: CodMunIBGESchema.optional(),\n    cep: CepSchema.optional(),\n    xLgr: z\n      .string()\n      .min(1, 'endereco.xLgr (logradouro) é obrigatório')\n      .max(TS_LOGRADOURO_MAX, `endereco.xLgr deve ter no máximo ${TS_LOGRADOURO_MAX} caracteres`),\n    nro: z\n      .string()\n      .min(1, 'endereco.nro (número) é obrigatório — use \"0\" para imóvel sem número')\n      .max(TS_NUMERO_ENDERECO_MAX, `endereco.nro deve ter no máximo ${TS_NUMERO_ENDERECO_MAX} caracteres`),\n    xCpl: z\n      .string()\n      .max(TS_COMPLEMENTO_ENDERECO_MAX, `endereco.xCpl deve ter no máximo ${TS_COMPLEMENTO_ENDERECO_MAX} caracteres`)\n      .optional(),\n    xBairro: z\n      .string()\n      .min(1, 'endereco.xBairro (bairro) é obrigatório')\n      .max(TS_BAIRRO_MAX, `endereco.xBairro deve ter no máximo ${TS_BAIRRO_MAX} caracteres`),\n    exterior: EnderecoExteriorSchema.optional(),\n  })\n  .refine(e => Boolean(e.cMun) !== Boolean(e.exterior), {\n    message:\n      'Endereço deve ter exatamente um entre cMun (endereço nacional) e exterior (endExt) — ' +\n      'são mutuamente exclusivos (XSD TCEndereco: choice endNac|endExt)',\n    path: ['cMun'],\n  })\n  .refine(e => Boolean(e.exterior) || Boolean(e.cep), {\n    message: 'endereco.cep é obrigatório no endereço nacional (XSD TCEnderNac exige cMun e CEP)',\n    path: ['cep'],\n  })\n\n// ---------------------------------------------------------------------------\n// Regime tributário (obrigatório no prestador)\n// ---------------------------------------------------------------------------\n\n// TSRegEspTrib: valores discretos 0,1,2,3,4,5,6,9 (7 e 8 não existem)\nconst REG_ESP_TRIB_VALUES = new Set([0, 1, 2, 3, 4, 5, 6, 9])\n\nexport const RegimeTributarioSchema = z.object({\n  // TSOpSimpNac: 1=Não Optante, 2=MEI, 3=ME/EPP\n  opSimpNac: z\n    .number()\n    .int()\n    .min(1)\n    .max(3, { error: 'opSimpNac inválido: 1=Não Optante, 2=MEI, 3=ME/EPP' }),\n  // TSRegimeApuracaoSimpNac: 1,2,3\n  regApurSN: z.number().int().min(1).max(3).optional(),\n  // TSRegEspTrib: 0,1,2,3,4,5,6,9\n  regEspTrib: z\n    .number()\n    .int()\n    .refine(v => REG_ESP_TRIB_VALUES.has(v), {\n      message:\n        'regEspTrib inválido: 0=Nenhum, 1=Cooperativa, 2=Estimativa, 3=Microempresa Municipal, 4=Notário, 5=Autônomo, 6=Soc. Profissionais, 9=Outros',\n    }),\n})\n\n// ---------------------------------------------------------------------------\n// Prestador (TCInfoPrestador)\n// ---------------------------------------------------------------------------\n\n/**\n * Conta quantos identificadores de `TCInfoPessoa` foram preenchidos.\n * O XSD define `choice(CNPJ | CPF | NIF | cNaoNIF)`: exatamente um.\n */\nfunction contarIdentificadores(p: {\n  cnpj?: string\n  cpf?: string\n  nif?: string\n  codigoNaoNif?: string\n}): number {\n  return [p.cnpj, p.cpf, p.nif, p.codigoNaoNif].filter(Boolean).length\n}\n\nconst MSG_IDENTIFICADOR_UNICO =\n  'deve ter exatamente um identificador: cnpj, cpf, nif ou codigoNaoNif — ' +\n  'são mutuamente exclusivos (XSD TCInfoPessoa: choice CNPJ|CPF|NIF|cNaoNIF)'\n\nexport const PrestadorSchema = z\n  .object({\n    cnpj: CnpjSchema.optional(),\n    cpf: CpfSchema.optional(),\n    nif: z.string().max(TS_NIF_MAX, `NIF deve ter no máximo ${TS_NIF_MAX} caracteres`).optional(),\n    codigoNaoNif: z.enum(MotivoNaoNif, { error: 'codigoNaoNif inválido (ver MotivoNaoNif)' }).optional(),\n    caepf: z.string().regex(/^[0-9]{14}$/, 'CAEPF deve ter 14 dígitos').optional(),\n    inscricaoMunicipal: z\n      .string()\n      .max(TS_INSC_MUN_MAX, `Inscrição municipal deve ter no máximo ${TS_INSC_MUN_MAX} caracteres`)\n      .optional(),\n    // xNome é obrigatório em TCInfoPessoa, mas o prestador emitente é\n    // identificado pelo CNPJ na base da SEFIN — o nome pode ser omitido.\n    nome: z\n      .string()\n      .max(TS_NOME_RAZAO_SOCIAL_MAX, `Prestador.nome (xNome) deve ter no máximo ${TS_NOME_RAZAO_SOCIAL_MAX} caracteres`)\n      .optional(),\n    endereco: EnderecoSchema.optional(),\n    telefone: z.string().regex(RE_FONE, 'Telefone deve ter entre 6 e 20 dígitos').optional(),\n    email: z.string().max(TS_EMAIL_MAX, `E-mail deve ter no máximo ${TS_EMAIL_MAX} caracteres`).optional(),\n    regimeTributario: RegimeTributarioSchema,\n  })\n  .refine(p => contarIdentificadores(p) === 1, {\n    message: `Prestador ${MSG_IDENTIFICADOR_UNICO}`,\n    path: ['cnpj'],\n  })\n\n// ---------------------------------------------------------------------------\n// Tomador / Intermediário (TCInfoPessoa)\n// ---------------------------------------------------------------------------\n\n// TCInfoPessoa: xNome é obrigatório (sem minOccurs=0 no XSD) e deve ter de 1 a 300 caracteres.\nexport const TomadorSchema = z\n  .object({\n    cnpj: CnpjSchema.optional(),\n    cpf: CpfSchema.optional(),\n    nif: z.string().max(TS_NIF_MAX, `NIF deve ter no máximo ${TS_NIF_MAX} caracteres`).optional(),\n    codigoNaoNif: z.enum(MotivoNaoNif, { error: 'codigoNaoNif inválido (ver MotivoNaoNif)' }).optional(),\n    inscricaoMunicipal: z\n      .string()\n      .max(TS_INSC_MUN_MAX, `Inscrição municipal deve ter no máximo ${TS_INSC_MUN_MAX} caracteres`)\n      .optional(),\n    nome: z\n      .string()\n      .min(1, 'Tomador.nome (xNome) é obrigatório')\n      .max(TS_NOME_RAZAO_SOCIAL_MAX, `Tomador.nome (xNome) deve ter no máximo ${TS_NOME_RAZAO_SOCIAL_MAX} caracteres`),\n    endereco: EnderecoSchema.optional(),\n    telefone: z.string().regex(RE_FONE, 'Telefone deve ter entre 6 e 20 dígitos').optional(),\n    email: z.string().max(TS_EMAIL_MAX, `E-mail deve ter no máximo ${TS_EMAIL_MAX} caracteres`).optional(),\n  })\n  .refine(t => contarIdentificadores(t) === 1, {\n    message: `Tomador ${MSG_IDENTIFICADOR_UNICO}`,\n    path: ['cnpj'],\n  })\n\nexport const IntermediarioSchema = z\n  .object({\n    cnpj: CnpjSchema.optional(),\n    cpf: CpfSchema.optional(),\n    nif: z.string().max(TS_NIF_MAX, `NIF deve ter no máximo ${TS_NIF_MAX} caracteres`).optional(),\n    codigoNaoNif: z.enum(MotivoNaoNif, { error: 'codigoNaoNif inválido (ver MotivoNaoNif)' }).optional(),\n    inscricaoMunicipal: z\n      .string()\n      .max(TS_INSC_MUN_MAX, `Inscrição municipal deve ter no máximo ${TS_INSC_MUN_MAX} caracteres`)\n      .optional(),\n    nome: z\n      .string()\n      .min(1, 'Intermediario.nome (xNome) é obrigatório')\n      .max(TS_NOME_RAZAO_SOCIAL_MAX, `Intermediario.nome (xNome) deve ter no máximo ${TS_NOME_RAZAO_SOCIAL_MAX} caracteres`),\n  })\n  .refine(i => contarIdentificadores(i) === 1, {\n    message: `Intermediário ${MSG_IDENTIFICADOR_UNICO}`,\n    path: ['cnpj'],\n  })\n\n// ---------------------------------------------------------------------------\n// Serviço (TCCServ / TCServ)\n// ---------------------------------------------------------------------------\n\nexport const CodigoServicoSchema = z.object({\n  cServTribNac: CodTribNacSchema,\n  cServMun: z\n    .union([z.string(), z.number()])\n    .transform(v => String(v).replace(/\\D/g, ''))\n    .refine(v => /^[0-9]{3}$/.test(v), {\n      message: 'Código de tributação municipal (cServMun) deve ter exatamente 3 dígitos numéricos (TCCodTribMun: [0-9]{3})',\n    })\n    .optional(),\n  // TSCodNBS: 9 dígitos. A NBS \"1.0905.21.00\" vira \"109052100\".\n  cNBSPrinc: z\n    .string()\n    .refine(v => /^[0-9]{9}$/.test(v.replace(/\\D/g, '')), {\n      message: 'Código NBS (cNBSPrinc) deve ter 9 dígitos após remover pontos (ex: \"109052100\" ou \"1.0905.21.00\")',\n    })\n    .optional(),\n  cIntContrib: z.string().optional(),\n})\n\n/**\n * `TCEnderecoSimples` — `choice(CEP | endExt)` + `xLgr`, `nro`, `xCpl?`,\n * `xBairro`. O `endExt` aqui (`TCEnderExtSimples`) **não tem `cPais`**.\n */\nconst EnderecoAtvEventoSchema = z\n  .object({\n    cep: CepSchema.optional(),\n    exterior: z\n      .object({\n        cEndPost: z.string().min(1).max(TS_CODIGO_END_POSTAL_MAX),\n        xCidade: z.string().min(1).max(TS_CIDADE_MAX),\n        xEstProvReg: z.string().min(1).max(TS_ESTADO_PROV_REGIAO_MAX),\n      })\n      .optional(),\n    xLgr: z.string().min(1).max(TS_LOGRADOURO_MAX),\n    nro: z.string().min(1).max(TS_NUMERO_ENDERECO_MAX),\n    xCpl: z.string().max(TS_COMPLEMENTO_ENDERECO_MAX).optional(),\n    xBairro: z.string().min(1).max(TS_BAIRRO_MAX),\n  })\n  .refine(e => Boolean(e.cep) !== Boolean(e.exterior), {\n    message: 'atvEvento.endereco deve ter exatamente um entre cep e exterior (XSD TCEnderecoSimples: choice CEP|endExt)',\n    path: ['cep'],\n  })\n\n/** `TCAtvEvento` — atividade/evento, exigido nos serviços do item 12. */\nexport const AtvEventoSchema = z\n  .object({\n    xNome: z.string().min(1, 'atvEvento.xNome é obrigatório').max(TS_DESC_255_MAX, `atvEvento.xNome deve ter no máximo ${TS_DESC_255_MAX} caracteres`),\n    dtIni: z.string().regex(RE_DATA, 'atvEvento.dtIni inválida — use YYYY-MM-DD'),\n    dtFim: z.string().regex(RE_DATA, 'atvEvento.dtFim inválida — use YYYY-MM-DD'),\n    idAtvEvt: z.string().max(TS_IDE_EVENTO_MAX, `atvEvento.idAtvEvt deve ter no máximo ${TS_IDE_EVENTO_MAX} caracteres`).optional(),\n    endereco: EnderecoAtvEventoSchema.optional(),\n  })\n  .refine(a => Boolean(a.idAtvEvt) !== Boolean(a.endereco), {\n    message: 'atvEvento deve ter exatamente um entre idAtvEvt e endereco (XSD TCAtvEvento: choice idAtvEvt|end)',\n    path: ['idAtvEvt'],\n  })\n  .refine(a => a.dtFim >= a.dtIni, {\n    message: 'atvEvento.dtFim não pode ser anterior a dtIni',\n    path: ['dtFim'],\n  })\n\nexport const ServicoSchema = z.object({\n  localPrestacao: z\n    .object({\n      cLocPrestacao: CodMunIBGESchema.optional(),\n      cPaisPrestacao: z.string().optional(),\n    })\n    .refine(v => v.cLocPrestacao || v.cPaisPrestacao, {\n      message: 'localPrestacao deve ter cLocPrestacao (código IBGE do município) ou cPaisPrestacao (código ISO do país)',\n    }),\n  codigoServico: CodigoServicoSchema,\n  xDescServ: z\n    .string()\n    .min(1, 'Descrição do serviço (xDescServ) não pode ser vazia')\n    .max(TS_DESC_INF_COMPL_MAX, `Descrição do serviço (xDescServ) deve ter no máximo ${TS_DESC_INF_COMPL_MAX} caracteres`),\n  comercioExterior: z\n    .object({\n      mdPrestacao: z.enum(ModoPrestacaoComExt, { error: 'comercioExterior.mdPrestacao inválido (ver ModoPrestacaoComExt)' }),\n      vincPrest: z.enum(VinculoPrestacao, { error: 'comercioExterior.vincPrest inválido (ver VinculoPrestacao)' }),\n      tpMoeda: z.string().regex(/^[0-9]{3}$/, 'comercioExterior.tpMoeda deve ter 3 dígitos (tabela de moedas do BACEN)'),\n      vServMoeda: z.number().positive('comercioExterior.vServMoeda deve ser positivo'),\n      mecAFComexP: z.enum(MecAFComexPrestador, { error: 'comercioExterior.mecAFComexP inválido (ver MecAFComexPrestador)' }).optional(),\n      mecAFComexT: z.enum(MecAFComexTomador, { error: 'comercioExterior.mecAFComexT inválido (ver MecAFComexTomador)' }).optional(),\n      movTempBens: z.enum(MovimentacaoTemporariaBens, { error: 'comercioExterior.movTempBens inválido (ver MovimentacaoTemporariaBens)' }).optional(),\n      mdic: z.enum(EnvioMDIC, { error: 'comercioExterior.mdic inválido (ver EnvioMDIC)' }).optional(),\n    })\n    .optional(),\n  obra: z\n    .object({\n      inscImobFisc: z.string().optional(),\n      cObra: z.string().optional(),\n    })\n    // TCInfoObra: inscImobFisc? seguido de choice(cObra|cCIB|end). Um objeto\n    // vazio satisfazia a Regra 260 no validador mas não emitia <obra> nenhum.\n    .refine(o => Boolean(o.inscImobFisc || o.cObra), {\n      message: 'servico.obra precisa de inscImobFisc ou cObra — um objeto vazio não emite o grupo <obra>',\n      path: ['cObra'],\n    })\n    .optional(),\n  atvEvento: AtvEventoSchema.optional(),\n  informacaoComplemento: z\n    .object({\n      idDocTec: z.string().optional(),\n      docRef: z.string().optional(),\n      xPed: z.string().optional(),\n      xInfComp: z\n        .string()\n        .max(TS_DESC_INF_COMPL_MAX, `informacaoComplemento.xInfComp deve ter no máximo ${TS_DESC_INF_COMPL_MAX} caracteres`)\n        .optional(),\n    })\n    .optional(),\n})\n\n// ---------------------------------------------------------------------------\n// Valores\n// ---------------------------------------------------------------------------\n\nexport const ValoresSchema = z.object({\n  vServico: z\n    .number()\n    .positive('Valor do serviço (valores.vServico) deve ser positivo'),\n  vReceb: z.number().positive().optional(),\n  vLiq: z.number().optional(),\n  vDescCondicionado: z.number().optional(),\n  vDescIncondicionado: z.number().optional(),\n  vBC: z.number().optional(),\n  vISSQN: z.number().optional(),\n  pAliq: z.number().optional(),\n  vTotalRet: z.number().optional(),\n})\n\n// ---------------------------------------------------------------------------\n// Tributação\n// ---------------------------------------------------------------------------\n\nexport const TributacaoSchema = z\n  .object({\n    issqn: z\n      .object({\n        // TSTribISSQN: 1=Tributável, 2=Imunidade, 3=Exportação, 4=Não Incidência\n        tributacaoIssqn: z\n          .number()\n          .int()\n          .min(1)\n          .max(4, { error: 'tributacaoIssqn inválido: 1=Tributável, 2=Imunidade, 3=Exportação, 4=Não Incidência' })\n          .optional(),\n        aliquota: z.number().min(0).max(1, { error: 'Alíquota ISSQN deve ser decimal entre 0 e 1 (ex: 0.05 = 5%)' }).optional(),\n        // TSTipoRetISSQN: 1=Não retido, 2=Retido pelo Tomador, 3=Retido pelo Intermediário\n        tipoRetencaoIssqn: z.number().int().min(1).max(3).optional(),\n        // TSTipoImunidadeISSQN: 0..5\n        tipoImunidade: z\n          .number()\n          .int()\n          .min(0)\n          .max(5, { error: 'tipoImunidade inválido: 0..5 (ver TSTipoImunidadeISSQN)' })\n          .optional(),\n        // TSOpExigSuspensa: 1=Judicial, 2=Administrativo\n        tipoSuspensao: z.number().int().min(1).max(2).optional(),\n        numeroProcessoSuspensao: z.string().optional(),\n        exigibilidadeISS: z.number().optional(),\n        cMunFG: CodMunIBGESchema.optional(),\n      })\n      // XSD TCTribMunicipal/exigSusp: tpSusp e nProcesso são irmãos obrigatórios\n      // dentro do grupo — o builder emite <exigSusp> assim que tipoSuspensao\n      // aparece, então sem o processo o grupo sai incompleto.\n      .refine(i => i.tipoSuspensao === undefined || Boolean(i.numeroProcessoSuspensao), {\n        message: 'tributacao.issqn.numeroProcessoSuspensao é obrigatório quando tipoSuspensao é informado (grupo exigSusp)',\n        path: ['numeroProcessoSuspensao'],\n      })\n      .optional(),\n    federal: z\n      .object({\n        valorRetidoIrrf: z.number().optional(),\n        valorRetidoCsll: z.number().optional(),\n        cstPisCofins: z.string().optional(),\n        baseCalculoPisCofins: z.number().optional(),\n        // Decimais, como a alíquota do ISS: o builder multiplica por 100 ao\n        // emitir (0.0065 → <pAliqPis>0.65</pAliqPis>). Sem o teto, passar 5\n        // emitiria 500,00%.\n        aliquotaPis: z.number().min(0).max(1, { error: 'aliquotaPis deve ser decimal entre 0 e 1 (ex: 0.0065 = 0,65%)' }).optional(),\n        aliquotaCofins: z.number().min(0).max(1, { error: 'aliquotaCofins deve ser decimal entre 0 e 1 (ex: 0.03 = 3%)' }).optional(),\n        valorPis: z.number().optional(),\n        valorCofins: z.number().optional(),\n        tipoRetencaoPisCofins: z.number().optional(),\n      })\n      .optional(),\n    percentualTotalTributosSN: z.number().optional(),\n    valorTotalTributosFederais: z.number().optional(),\n    valorTotalTributosEstaduais: z.number().optional(),\n    valorTotalTributosMunicipais: z.number().optional(),\n    percentualTotalTributosFederais: z.number().optional(),\n    percentualTotalTributosEstaduais: z.number().optional(),\n    percentualTotalTributosMunicipais: z.number().optional(),\n    indicadorTotalTributos: z.number().optional(),\n  })\n  .optional()\n\n// ---------------------------------------------------------------------------\n// IBSCBS — obrigatório na DPS v1.01\n// ---------------------------------------------------------------------------\n\nexport const IbsCbsSchema = z.object({\n  finNFSe: z.literal('0', {\n    error: 'ibsCbs.finNFSe deve ser \"0\" (NFS-e regular)',\n  }),\n  cIndOp: z.string().regex(RE_IBSCBS_IND_OP, {\n    message: 'ibsCbs.cIndOp deve ter 6 dígitos numéricos (código indicador de operação — consulte tabela oficial)',\n  }),\n  indDest: z.enum(['0', '1'], {\n    error: 'ibsCbs.indDest deve ser \"0\" (destinatário = tomador) ou \"1\" (destinatário ≠ tomador)',\n  }),\n  indFinal: z.enum(['0', '1'], {\n    error: 'ibsCbs.indFinal é obrigatório: \"0\" (não) ou \"1\" (uso/consumo pessoal — art. 57)',\n  }),\n  tpOper: z.enum(['1', '2', '3', '4', '5']).optional(),\n  valores: z.object({\n    trib: z.object({\n      gIBSCBS: z.object({\n        CST: z.string().regex(RE_IBSCBS_CST, {\n          message: 'ibsCbs.valores.trib.gIBSCBS.CST deve ter 3 dígitos (Código de Situação Tributária IBS/CBS)',\n        }),\n        cClassTrib: z.string().regex(RE_IBSCBS_CLASS_TRIB, {\n          message: 'ibsCbs.valores.trib.gIBSCBS.cClassTrib deve ter 6 dígitos (Código de Classificação Tributária)',\n        }),\n        cCredPres: z\n          .string()\n          .regex(RE_IBSCBS_CRED_PRES, {\n            message: 'ibsCbs.valores.trib.gIBSCBS.cCredPres deve ter 2 dígitos (Código de Crédito Presumido)',\n          })\n          .optional(),\n      }),\n    }),\n  }),\n})\n\n// ---------------------------------------------------------------------------\n// infDPS\n// ---------------------------------------------------------------------------\n\nexport const InfDpsSchema = z.object({\n  id: IdDPSSchema,\n  tipoAmbiente: z\n    .number()\n    .int()\n    .min(1)\n    .max(2, { error: 'tipoAmbiente deve ser 1 (Produção) ou 2 (Homologação)' }),\n  dataEmissao: DhEmissaoSchema,\n  versaoAplicativo: z.string().optional(),\n  serie: SerieDpsSchema.optional(),\n  numeroDps: NumeroDpsSchema,\n  dataCompetencia: DataCompetenciaSchema,\n  tipoEmitente: z\n    .number()\n    .int()\n    .min(1)\n    .max(3, { error: 'tipoEmitente deve ser 1=Prestador, 2=Tomador, 3=Intermediário' }),\n  codigoLocalEmissao: CodMunIBGESchema,\n  motivoEmissao: z.number().int().min(1).max(4).optional(),\n  chaveNfseRejeitada: z\n    .string()\n    .regex(/^[0-9]{50}$/, 'Chave NFS-e rejeitada deve ter 50 dígitos')\n    .optional(),\n  prestador: PrestadorSchema,\n  tomador: TomadorSchema.optional(),\n  intermediario: IntermediarioSchema.optional(),\n  servico: ServicoSchema,\n  valores: ValoresSchema,\n  tributacao: TributacaoSchema,\n  ibsCbs: IbsCbsSchema.optional(),\n})\n.refine(\n  d => !(d.valores.vReceb !== undefined && d.tipoEmitente !== 3),\n  {\n    message: 'valores.vReceb só pode ser informado quando o emitente for o Intermediário (tipoEmitente=3) — E0424',\n    path: ['valores', 'vReceb'],\n  },\n)\n.refine(\n  d => {\n    const opSimpNac = d.prestador.regimeTributario?.opSimpNac\n    const aliquota  = d.tributacao?.issqn?.aliquota\n    return !(opSimpNac === 1 && aliquota !== undefined)\n  },\n  {\n    message:\n      'tributacao.issqn.aliquota (pAliq) não deve ser informada quando o prestador não é optante do Simples Nacional ' +\n      '(opSimpNac=1) e o município está ativo no Sistema Nacional NFS-e — E0617',\n    path: ['tributacao', 'issqn', 'aliquota'],\n  },\n)\n.refine(\n  d => {\n    const opSimpNac = d.prestador.regimeTributario?.opSimpNac\n    if (opSimpNac !== 1) return true\n    const trib = d.tributacao\n    const temIndTotTrib = trib?.indicadorTotalTributos !== undefined\n    const temSN = trib?.percentualTotalTributosSN !== undefined\n    return !temIndTotTrib && !temSN\n  },\n  {\n    message:\n      'Para Não Optante (opSimpNac=1) não é permitido informar indicadorTotalTributos nem ' +\n      'percentualTotalTributosSN — use valorTotal* ou percentualTotal* — E0713',\n    path: ['tributacao', 'indicadorTotalTributos'],\n  },\n)\n\n// ---------------------------------------------------------------------------\n// DPS (raiz)\n// ---------------------------------------------------------------------------\n\nexport const DpsSchema = z.object({\n  versao: z.string().optional(),\n  infDps: InfDpsSchema,\n})\n\nexport type DpsSchemaInput = z.input<typeof DpsSchema>\nexport type DpsSchemaOutput = z.output<typeof DpsSchema>\n","/**\n * Regras de texto dos tipos simples do XSD da NFS-e nacional\n * (`PL_NFSE_NT04_RTCv101/tiposSimples_v1.01.xsd`).\n *\n * Existem dois regimes de texto no schema e confundi-los custa caro:\n *\n * - **`TSString`** (logradouro, número, complemento, bairro, e-mail) restringe o\n *   charset a `[!-ÿ]` — U+0021..U+00FF, o Latin-1 imprimível, com espaço\n *   permitido só no meio. Acento latino passa; cirílico e CJK, não.\n * - **`xs:string`** (cidade, estado/província, código postal, nome/razão social,\n *   NIF) não restringe charset nenhum: cidade chinesa e nome cirílico são\n *   válidos, só o `maxLength` vale.\n *\n * `validateDps` **rejeita** o que estiver fora da regra, com o campo apontado.\n * Normalizar é decisão de quem chama — estes helpers existem para isso, para o\n * caso comum de dado vindo de cadastro (colado de e-mail, PDF ou planilha).\n */\n\n/** Comprimento máximo por tipo do XSD. */\nexport const TS_LOGRADOURO_MAX = 255\nexport const TS_NUMERO_ENDERECO_MAX = 60\nexport const TS_COMPLEMENTO_ENDERECO_MAX = 156\nexport const TS_BAIRRO_MAX = 60\nexport const TS_EMAIL_MAX = 80\nexport const TS_CIDADE_MAX = 60\nexport const TS_ESTADO_PROV_REGIAO_MAX = 60\nexport const TS_CODIGO_END_POSTAL_MAX = 11\nexport const TS_NOME_RAZAO_SOCIAL_MAX = 300\nexport const TS_NIF_MAX = 40\nexport const TS_INSC_MUN_MAX = 15\nexport const TS_DESC_INF_COMPL_MAX = 2000\nexport const TS_DESC_255_MAX = 255\nexport const TS_IDE_EVENTO_MAX = 30\n\n/** Charset do `TSString`: U+0021..U+00FF (Latin-1 imprimível) e espaço. */\nconst TS_STRING_ALLOWED_CHAR = /[!-ÿ ]/\n\n/** `TSCEP` — exatamente 8 dígitos. */\nconst TS_CEP_PATTERN = /^[0-9]{8}$/\n\n/** `TSCodPaisISO` — exatamente 2 letras maiúsculas. */\nconst TS_COD_PAIS_ISO_PATTERN = /^[A-Z]{2}$/\n\n/**\n * Pontuação tipográfica comum em cadastro estrangeiro que o `TSString` não\n * aceita e que o Unicode não decompõe — mapeada à mão para o equivalente ASCII\n * em vez de ser descartada.\n */\nconst TYPOGRAPHIC_FALLBACK: Record<string, string> = {\n  '‘': \"'\", '’': \"'\", '‚': \"'\",\n  '“': '\"', '”': '\"', '„': '\"',\n  '–': '-', '—': '-', '−': '-',\n  '…': '...',\n  // Letras latinas fora do Latin-1 que o Unicode não decompõe (o traço/gancho\n  // faz parte do glifo). Sem isto, `Łódź` viraria `ódz` — pior que traduzir a\n  // letra, porque ela desaparece no meio da palavra sem ninguém notar.\n  'Ł': 'L', 'ł': 'l',\n  'Đ': 'D', 'đ': 'd',\n  'Œ': 'OE', 'œ': 'oe',\n  'ı': 'i',\n  ' ': ' ', ' ': ' ', ' ': ' ',\n}\n\n/**\n * Normaliza um valor para o charset do `TSString` e corta em `maxLength`.\n *\n * Três passos por caractere: (1) dentro de U+0021..U+00FF ou espaço → mantém,\n * então `é`, `Ã` e `ç` sobrevivem; (2) fora → tenta o mapa tipográfico e a\n * decomposição NFKD (`ł`→`l`, `ﬁ`→`fi`); (3) sem equivalente (cirílico, CJK) →\n * descarta. Quebra de linha e tab viram espaço — não passam no charset, mas\n * separam palavras, e colar os termos vizinhos seria pior.\n *\n * @returns `undefined` quando não sobra nada de aproveitável — caso em que o\n * chamador deve tratar o campo como ausente, não como string vazia.\n */\nexport function normalizeTsString(\n  value: string | null | undefined,\n  maxLength: number,\n): string | undefined {\n  if (!value) return undefined\n\n  let out = ''\n  for (const char of value.replace(/[\\r\\n\\t]/g, ' ')) {\n    if (TS_STRING_ALLOWED_CHAR.test(char)) {\n      out += char\n      continue\n    }\n    const fallback = TYPOGRAPHIC_FALLBACK[char]\n    if (fallback) {\n      out += fallback\n      continue\n    }\n    // NFKD separa o diacrítico da letra base; mantemos o que couber no charset.\n    for (const decomposed of char.normalize('NFKD')) {\n      if (TS_STRING_ALLOWED_CHAR.test(decomposed)) out += decomposed\n    }\n  }\n\n  const normalized = out.replace(/\\s+/g, ' ').trim().slice(0, maxLength).trim()\n  return normalized || undefined\n}\n\n/**\n * Normaliza um valor de tipo com base `xs:string` (sem restrição de charset,\n * como `TSCidade`, `TSCodigoEndPostal` e `TSNIF`): só trim e corte no\n * `maxLength`.\n */\nexport function normalizeXsString(\n  value: string | null | undefined,\n  maxLength: number,\n): string | undefined {\n  if (!value) return undefined\n  const normalized = value.trim().slice(0, maxLength).trim()\n  return normalized || undefined\n}\n\n/** `TSString`: todos os caracteres cabem no charset Latin-1 imprimível? */\nexport function isTsString(value: string): boolean {\n  return [...value].every(char => TS_STRING_ALLOWED_CHAR.test(char))\n}\n\n/** `TSCEP`: exatamente 8 dígitos — não há como normalizar o que falta. */\nexport function isTsCep(value: string | undefined): boolean {\n  return typeof value === 'string' && TS_CEP_PATTERN.test(value)\n}\n\n/** `TSCodPaisISO`: exatamente 2 letras maiúsculas (`BR`, `VG`, `PT`). */\nexport function isTsCodPaisIso(value: string | undefined): boolean {\n  return typeof value === 'string' && TS_COD_PAIS_ISO_PATTERN.test(value)\n}\n\n/**\n * Lista os campos ausentes/inválidos numa mensagem só, para o usuário corrigir\n * tudo de uma vez em vez de descobrir um por requisição.\n *\n * @param fields Rótulo → valor (ou `true`/`false` para checagens já resolvidas).\n */\nexport function missingFieldsMessage(\n  prefix: string,\n  fields: Record<string, unknown>,\n): string {\n  const missing = Object.entries(fields)\n    .filter(([, value]) => !value)\n    .map(([label]) => label)\n  return missing.length > 0 ? `${prefix}. Faltando: ${missing.join(', ')}.` : prefix\n}\n","/**\n * Tabela oficial CST × cClassTrib do IBS/CBS, restrita ao que vale para NFS-e.\n */\n\n/** Data da última atualização desta tabela contra a publicação oficial. */\nexport const IBS_CBS_CST_TABLE_ATUALIZADA_EM = '2026-08-19'\n\n/** Uma classificação tributária válida para NFS-e. */\nexport interface ClassTribInfo {\n  /** Código de 6 dígitos (`cClassTrib`). */\n  codigo: string\n  /** Descrição oficial. */\n  descricao: string\n}\n\n/** Um CST de IBS/CBS e as classificações que aceitam NFS-e. */\nexport interface CstInfo {\n  /** Código de 3 dígitos (`CST`). */\n  cst: string\n  /** Descrição oficial. */\n  descricao: string\n  /**\n   * Classificações válidas **para NFS-e** (flag `IndNFSE` da tabela oficial).\n   * As demais existem para NF-e, CT-e, NFCom etc. e são recusadas numa DPS.\n   */\n  classes: ClassTribInfo[]\n}\n\n/** Tabela oficial CST × cClassTrib, restrita ao que vale para NFS-e. */\nexport const IBS_CBS_CST_TABLE: readonly CstInfo[] = [\n  {\n    \"cst\": \"000\",\n    \"descricao\": \"Tributação integral\",\n    \"classes\": [\n      {\n        \"codigo\": \"000001\",\n        \"descricao\": \"Situações tributadas integralmente pelo IBS e CBS.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"010\",\n    \"descricao\": \"Tributação com alíquotas uniformes\",\n    \"classes\": [\n      {\n        \"codigo\": \"010001\",\n        \"descricao\": \"Operações do FGTS não realizadas pela Caixa Econômica Federal, observado o art. 212 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"010002\",\n        \"descricao\": \"Operações do serviço financeiro\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"011\",\n    \"descricao\": \"Tributação com alíquotas uniformes reduzidas\",\n    \"classes\": [\n      {\n        \"codigo\": \"011003\",\n        \"descricao\": \"Intermediação de planos de assistência à saúde, observado o art. 240 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"200\",\n    \"descricao\": \"Alíquota reduzida\",\n    \"classes\": [\n      {\n        \"codigo\": \"200001\",\n        \"descricao\": \"Serviços de transporte de bens até as zonas de processamento de exportação e bens exportados a partir das zonas de processamento de exportação, observado o art. 103 da Lei Complementar n 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200004\",\n        \"descricao\": \"Fornecimento de dispositivos médicos com a especificação das respectivas classificações da NCM/SH previstas no Anexo XII da Lei Complementar nº 214, de 2025, observado o art. 144 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200005\",\n        \"descricao\": \"Fornecimento de dispositivos médicos com a especificação das respectivas classificações da NCM/SH previstas no Anexo IV da Lei Complementar nº 214, de 2025, quando adquiridos por órgãos da administração pública direta, autarquias, fundações públicas e entidades de saúde imunes, observado o art. 144 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200006\",\n        \"descricao\": \"Situação de emergência de saúde pública reconhecida pelo Poder Legislativo federal, estadual, distrital ou municipal competente, ato conjunto do Ministro da Fazenda e do Comitê Gestor do IBS poderá ser editado, a qualquer momento, para incluir dispositivos não listados no Anexo XII da Lei Complementar nº 214, de 2025, limitada a vigência do benefício ao período e à localidade da emergência de saúde pública, observado o art. 144 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200007\",\n        \"descricao\": \"Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo XIII da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 145 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200008\",\n        \"descricao\": \"Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo V da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, quando adquiridos por órgãos da administração pública direta, autarquias, fundações públicas e entidades imunes, observado o art. 145 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200016\",\n        \"descricao\": \"Prestação de serviços de pesquisa e desenvolvimento por Instituição Científica, Tecnológica e de Inovação (ICT) sem fins lucrativos para a administração pública direta, autarquias e fundações públicas ou para o contribuinte sujeito ao regime regular do IBS e da CBS, observado o disposto no art. 156  da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200017\",\n        \"descricao\": \"Operações relacionadas ao FGTS, considerando aquelas necessárias à aplicação da Lei nº 8.036, de 1990, realizadas pelo Conselho Curador ou Secretaria Executiva do FGTS, observado o art. 212 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200019\",\n        \"descricao\": \"Importador dos serviços financeiros que seja contribuinte e tenha direito de apropriação de créditos na aquisição do mesmo serviço financeiro no País, observado o art. 231 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200020\",\n        \"descricao\": \"Operação praticada por sociedades cooperativas optantes por regime específico do IBS e CBS, quando o associado destinar bem ou serviço à cooperativa de que participa, e a cooperativa fornecer bem ou serviço ao associado sujeito ao regime regular do IBS e da CBS, observado o art. 271 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200021\",\n        \"descricao\": \"Serviços de transporte público coletivo de passageiros ferroviário e hidroviário urbanos, semiurbanos e metropolitanos, observado o art. 285 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200025\",\n        \"descricao\": \"Fornecimento dos serviços de educação relacionados ao Programa Universidade para Todos (Prouni), instituído pela Lei nº 11.096, de 13 de janeiro de 2005, observado o art. 308 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200026\",\n        \"descricao\": \"Locação de imóveis localizados nas zonas reabilitadas, pelo prazo de 5 (cinco) anos, contado da data de expedição do habite-se, e relacionados a projetos de reabilitação urbana de zonas históricas e de áreas críticas de recuperação e reconversão urbanística dos Municípios ou do Distrito Federal, a serem delimitadas por lei municipal ou distrital, observado o art. 158 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200027\",\n        \"descricao\": \"Operações de locação, cessão onerosa e arrendamento de bens imóveis, observado o art. 261 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200028\",\n        \"descricao\": \"Fornecimento dos serviços de educação relacionados no Anexo II da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da Nomenclatura Brasileira de Serviços, Intangíveis e Outras Operações que Produzam Variações no Patrimônio (NBS), observado o art. 129 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200029\",\n        \"descricao\": \"Fornecimento dos serviços de saúde humana relacionados no Anexo III da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS, observado o art. 130 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200030\",\n        \"descricao\": \"Venda dos dispositivos médicos relacionados no Anexo IV da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 131 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200031\",\n        \"descricao\": \"Fornecimento dos dispositivos de acessibilidade próprios para pessoas com deficiência relacionados no Anexo V da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH, observado o art. 132 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200037\",\n        \"descricao\": \"Fornecimento de serviços ambientais de conservação ou recuperação da vegetação nativa, mesmo que fornecidos sob a forma de manejo sustentável de sistemas agrícolas, agroflorestais e agrossilvopastoris, em conformidade com as definições e requisitos da legislação específica, observado o art. 137 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200038\",\n        \"descricao\": \"Fornecimento dos insumos agropecuários e aquícolas relacionados no Anexo IX da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH e da NBS, observado o art. 138 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200039\",\n        \"descricao\": \"Fornecimento dos bens e serviços listados no Anexo X da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NCM/SH e NBS, nos casos relacionados com produções nacionais artísticas, culturais, de eventos, jornalísticas e audiovisuais, observado o art. 139 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200040\",\n        \"descricao\": \"Fornec dos seguintes serv de comunic instit à admin púb direta, autarq e fund púb: serviços direcionados ao planej, criação, programação e manutenção de páginas eletrônicas da admin pública, ao monitor e gestão de suas redes sociais e à otimização de páginas e canais digitais para mecanismos de buscas e produção de mensagens, infográficos, painéis interativos e conteúdo institucional, serviços de relações com a imprensa, que reúnem estrat org para promover e reforçar a comunicação dos órgãos e das entidades contratantes com seus públicos de interesse, por meio da interação com prof da imprensa, e serviços de relações públicas, que compreendem o esforço de comunic planej, coeso e contínuo que tem por obj estab adequada percepção da atuação e dos obj instituc, a partir do estímulo à compreensão mútua e da manut de padrões de relac e fluxos de inf entre os órgãos e as entidades contrat e seus públicos de interesse, no País e no exterior, obs o art. 140 da Lei Compl nº 214, de 2025\"\n      },\n      {\n        \"codigo\": \"200041\",\n        \"descricao\": \"Operações relacionadas às seguintes atividades desportivas: fornecimento de serviço de educação desportiva, classificado no código 1.2205.12.00 da NBS, e gestão e exploração do desporto por associações e clubes esportivos filiados ao órgão estadual ou federal responsável pela coordenação dos desportos, inclusive por meio de venda de ingressos para eventos desportivos, fornecimento oneroso ou não de bens e serviços, inclusive ingressos, por meio de programas de sócio-torcedor, cessão dos direitos desportivos dos atletas e transferência de atletas para outra entidade desportiva ou seu retorno à atividade em outra entidade desportiva, observado o art. 141 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200042\",\n        \"descricao\": \"Operações relacionadas às seguintes atividades desportivas: gestão e exploração do desporto por associações e clubes esportivos filiados ao órgão estadual ou federal responsável pela coordenação dos desportos, observado o art. 141 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200043\",\n        \"descricao\": \"Fornecimento à administração pública direta, autarquias e fundações púbicas dos serviços e dos bens relativos à soberania e à segurança nacional, à segurança da informação e à segurança cibernética relacionados no Anexo XI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS e da NCM/SH, observado o art. 142 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200044\",\n        \"descricao\": \"Operações e prestações de serviços de segurança da informação e segurança cibernética desenvolvidos por sociedade que tenha sócio brasileiro com o mínimo de 20% (vinte por cento) do seu capital social, relacionados no Anexo XI da Lei Complementar nº 214, de 2025, com a especificação das respectivas classificações da NBS e da NCM/SH, observado o art. 142 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200045\",\n        \"descricao\": \"Operações relacionadas a projetos de reabilitação urbana de zonas históricas e de áreas críticas de recuperação e reconversão urbanística dos Municípios ou do Distrito Federal, a serem delimitadas por lei municipal ou distrital, observado o art. 158 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200046\",\n        \"descricao\": \"Operações com bens imóveis, observado o art. 261 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200048\",\n        \"descricao\": \"Hotelaria, Parques de Diversão e Parques Temáticos, observado o art. 281 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200051\",\n        \"descricao\": \"Agências de Turismo, observado o art. 289 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200052\",\n        \"descricao\": \"Prestação de serviços das seguintes profissões intelectuais de natureza científica, literária ou artística, submetidas à fiscalização por conselho profissional: administradores, advogados, arquitetos e urbanistas, assistentes sociais, bibliotecários, biólogos, contabilistas, economistas, economistas domésticos, profissionais de educação física, engenheiros e agrônomos, estatísticos, médicos veterinários e zootecnistas, museólogos, químicos, profissionais de relações públicas, técnicos industriais e técnicos agrícolas, observado o art. 127 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"200054\",\n        \"descricao\": \"Fornecimento de bem material pela cooperativa de produção agropecuária a associado não sujeito ao regime regular do IBS e da CBS com anulação de créditos referentes ao bem fornecido, observado o art. 271 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"221\",\n    \"descricao\": \"Alíquota fixa proporcional\",\n    \"classes\": [\n      {\n        \"codigo\": \"221001\",\n        \"descricao\": \"Locação, cessão onerosa ou arrendamento de bem imóvel com alíquota sobre a receita bruta, observado o art. 487 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"400\",\n    \"descricao\": \"Isenção\",\n    \"classes\": [\n      {\n        \"codigo\": \"400001\",\n        \"descricao\": \"Fornecimento de serviços de transporte público coletivo de passageiros rodoviário e metroviário de caráter urbano, semiurbano e metropolitano, sob regime de autorização, permissão ou concessão pública, observado o art. 157 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"410\",\n    \"descricao\": \"Imunidade e não incidência\",\n    \"classes\": [\n      {\n        \"codigo\": \"410001\",\n        \"descricao\": \"Fornecimento de bonificações quando constem do respectivo documento fiscal e que não dependam de evento posterior, observado o art. 5º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410003\",\n        \"descricao\": \"Doações que não tenham por objeto bens ou serviços que tenham permitido a apropriação de créditos pelo doador, observado o art. 6º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410004\",\n        \"descricao\": \"Exportações de bens e serviços, observado o art. 8º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410005\",\n        \"descricao\": \"Fornecimentos realizados pela União, pelos Estados, pelo Distrito Federal e pelos Municípios, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410006\",\n        \"descricao\": \"Fornecimentos realizados por entidades religiosas e templos de qualquer culto, inclusive suas organizações assistenciais e beneficentes, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410007\",\n        \"descricao\": \"Fornecimentos realizados por partidos políticos, inclusive suas fundações, entidades sindicais dos trabalhadores e instituições de educação e de assistência social, sem fins lucrativos, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410008\",\n        \"descricao\": \"Fornecimentos de livros, jornais, periódicos e do papel destinado a sua impressão, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410009\",\n        \"descricao\": \"Fornecimentos de fonogramas e videofonogramas musicais produzidos no Brasil contendo obras musicais ou literomusicais de autores brasileiros e/ou obras em geral interpretadas por artistas brasileiros, bem como os suportes materiais ou arquivos digitais que os contenham, salvo na etapa de replicação industrial de mídias ópticas de leitura a laser, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410010\",\n        \"descricao\": \"Fornecimentos de serviço de comunicação nas modalidades de radiodifusão sonora e de sons e imagens de recepção livre e gratuita, observado o art. 9º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410012\",\n        \"descricao\": \"Fornecimento de condomínio edilício não optante pelo regime regular, observado o art. 26 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410014\",\n        \"descricao\": \"Fornecimento de produtor rural não contribuinte, observado o art. 164 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410015\",\n        \"descricao\": \"Fornecimento por transportador autônomo não contribuinte, observado o art. 169 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410026\",\n        \"descricao\": \"Doações sem contraprestação em benefício do doador, com anulação de crédito apropriados pelo doador referente ao fornecimento doado, observado o art. 6º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410027\",\n        \"descricao\": \"Fornecimento de bens e serviços, desde que vinculados direta e exclusivamente à exportação de bens materiais ou associados à entrega no exterior de bens materiais, observado o art. 6º da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410028\",\n        \"descricao\": \"Operações com bens imóveis realizadas por pessoas físicas não consideradas contribuintes do regime regular do IBS e da CBS, observado o art. 251 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410033\",\n        \"descricao\": \"Operações com bens imóveis, inclusive operações com direitos reais sobre bens imóveis, realizadas por Fundos de Investimento Imobiliário (FII) e Fundos de Investimento nas Cadeias Produtivas do Agronegócio (Fiagro), observado o art. 26 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410035\",\n        \"descricao\": \"Fornecimento realizado por nanoempreendedor, observado o art. 26 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"410999\",\n        \"descricao\": \"Operações não onerosas sem previsão de tributação, não especificadas anteriormente, observado o art. 4º da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"515\",\n    \"descricao\": \"Diferimento com redução de alíquota\",\n    \"classes\": [\n      {\n        \"codigo\": \"515001\",\n        \"descricao\": \"Operações, sujeitas a diferimento, com insumos agropecuários e aquícolas, observado o art. 138 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"550\",\n    \"descricao\": \"Suspensão\",\n    \"classes\": [\n      {\n        \"codigo\": \"550016\",\n        \"descricao\": \"Regime Especial de Incentivos para o Desenvolvimento da Infraestrutura - Reidi, observado o art. 106 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"550022\",\n        \"descricao\": \"Regime Especial de Incentivos para a Produção de Hidrogênio de Baixa Emissão de Carbono (Rehidro),  observado o art. 106 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"800\",\n    \"descricao\": \"Transferência de crédito\",\n    \"classes\": [\n      {\n        \"codigo\": \"800001\",\n        \"descricao\": \"Fusão, cisão ou incorporação, observado o art. 55 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"800002\",\n        \"descricao\": \"Transferência de crédito do associado, inclusive as cooperativas singulares, para cooperativa de que participa das operações antecedentes às operações em que fornece bens e serviços e os créditos presumidos, observado o art. 272 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"811\",\n    \"descricao\": \"Ajustes\",\n    \"classes\": [\n      {\n        \"codigo\": \"811001\",\n        \"descricao\": \"Anulação de crédito proporcional ao valor das operações imunes e isentas, observado o art. 51 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"811002\",\n        \"descricao\": \"Débitos de notas fiscais não processadas na apuração, observado o art. 45 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"811003\",\n        \"descricao\": \"Débitos apurados após o desenquadramento do regime Simples Nacional, observado o art. 41 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  },\n  {\n    \"cst\": \"820\",\n    \"descricao\": \"Tributação em documento específico\",\n    \"classes\": [\n      {\n        \"codigo\": \"820001\",\n        \"descricao\": \"Documento com informações de fornecimento de serviços de planos de assistência à saúde elencados no art. 234 da Lei Complementar nº 214, de 2025, mas com tributação realizada por outro meio\"\n      },\n      {\n        \"codigo\": \"820002\",\n        \"descricao\": \"Documento com informações de fornecimento de serviços de planos de assinstência funerária, mas com tributação realizada por outro meio, observado o art. 236 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"820003\",\n        \"descricao\": \"Documento com informações de fornecimento de serviços de planos de assinstência à saúde de animais domésticos, mas com tributação realizada por outro meio, observado o art. 243 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"820004\",\n        \"descricao\": \"Documento com informações de prestação de serviços de consursos de prognósticos, mas com tributação realizada por outro meio, observado o art. 248 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"820006\",\n        \"descricao\": \"Documento com informações de fornecimento de serviços de exploração de via, mas com tributação realizada por outro meio, observado o art. 11 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"820007\",\n        \"descricao\": \"Documento com informações de fornecimento de serviços financeiros, mas com tributação realizada por outro meio, observado o art. 181 da Lei Complementar nº 214, de 2025.\"\n      },\n      {\n        \"codigo\": \"820009\",\n        \"descricao\": \"Cobrança relativa a fornecimentos declarados em outro documento, observado o art. 60 da Lei Complementar nº 214, de 2025.\"\n      }\n    ]\n  }\n] as const\n\n/** Índice `CST` → classificações, para consulta O(1). */\nexport const IBS_CBS_CST_INDEX: ReadonlyMap<string, CstInfo> = new Map(\n  IBS_CBS_CST_TABLE.map(cst => [cst.cst, cst]),\n)\n","/**\n * Serviço principal de geração da DANF-Se\n * Migrado de direction-nfse-danfe/src/Danfe/Public/DanfeService.cs\n */\n\nimport { parseNfseXml, type NfseSchema } from '../xml/nfse-parser.js'\nimport { renderDanfseHtml, type DanfeOptions, type DanfeWarning } from './html-renderer.js'\nimport { generatePdfFromHtml, type PdfOptions } from './pdf-generator.js'\nimport { buildPreviewSchema } from './preview-builder.js'\nimport { DanfeEnvironment, DanfePreviewFormat } from '../types/enums.js'\nimport type { InfDpsData } from '../types/dtos.js'\nimport { writeFileSync } from 'node:fs'\n\nexport interface DanfeResult {\n  environment: DanfeEnvironment\n  html: string\n  pdfBytes: Buffer\n  warnings: DanfeWarning[]\n}\n\nexport interface DanfeGenerateOptions {\n  danfe?: DanfeOptions\n  pdf?: PdfOptions\n  isCancelled?: boolean\n  /**\n   * Chave de acesso da NFS-e retornada pela API SEFIN (`chaveAcesso` no JSON).\n   * Usada quando o XML da NFS-e não contém o elemento `<chNFSe>` — o que ocorre\n   * em algumas versões do EmissorWeb onde a chave é enviada apenas na raiz JSON.\n   */\n  chaveAcesso?: string\n}\n\nexport { DanfePreviewFormat } from '../types/enums.js'\n\nexport interface PreviewOptions {\n  /** Formato de saída. Padrão: `DanfePreviewFormat.Html`. */\n  format?: DanfePreviewFormat\n  danfe?: Omit<DanfeOptions, 'isPreview'>\n  pdf?: PdfOptions\n}\n\nexport interface PreviewResult {\n  format: DanfePreviewFormat\n  html: string\n  /** Disponível apenas quando `format === DanfePreviewFormat.Pdf`. */\n  pdfBytes?: Buffer\n  warnings: DanfeWarning[]\n  environment: DanfeEnvironment\n}\n\nexport class DanfeService {\n  constructor(private options: DanfeOptions = {}) {}\n\n  async generateFromXml(xml: string, opts: DanfeGenerateOptions = {}): Promise<DanfeResult> {\n    return this.generate(parseNfseXml(xml), opts)\n  }\n\n  async generateFromGzipB64(gzipB64: string, opts: DanfeGenerateOptions = {}): Promise<DanfeResult> {\n    const { decompressXml } = await import('../crypto/xml-signer.js')\n    const xml = await decompressXml(gzipB64)\n    return this.generateFromXml(xml, opts)\n  }\n\n  async generate(schema: NfseSchema, opts: DanfeGenerateOptions = {}): Promise<DanfeResult> {\n    // Injeta chaveAcesso quando o XML não traz <chNFSe> (comportamento do EmissorWeb)\n    if (opts.chaveAcesso && schema.infNFSe && !schema.infNFSe.chNFSe) {\n      schema.infNFSe.chNFSe = opts.chaveAcesso\n    }\n    const danfeOpts = { ...this.options, ...opts.danfe }\n    const { html, warnings, environment } = await renderDanfseHtml(schema, opts.isCancelled ?? false, danfeOpts)\n    const pdfBytes = await generatePdfFromHtml(html, opts.pdf)\n    return { environment, html, pdfBytes, warnings }\n  }\n\n  async saveToFile(xmlOrGzipB64: string, outputPath: string, isGzip = false, opts: DanfeGenerateOptions = {}): Promise<DanfeResult> {\n    const result = isGzip\n      ? await this.generateFromGzipB64(xmlOrGzipB64, opts)\n      : await this.generateFromXml(xmlOrGzipB64, opts)\n    writeFileSync(outputPath, result.pdfBytes)\n    return result\n  }\n\n  /**\n   * Gera um preview da DANF-Se a partir dos dados do DPS, **antes** de enviar\n   * à API SEFIN. O documento gerado possui uma marca d'água \"PRÉVIA — SEM VALOR\n   * FISCAL\" e não representa uma NFS-e válida.\n   *\n   * @param dps    - Dados do DPS (o mesmo objeto passado para `emitirNfse`).\n   * @param opts   - Opções de saída (`format`: `'html'` ou `'pdf'`).\n   */\n  async previewFromDps(dps: InfDpsData, opts: PreviewOptions = {}): Promise<PreviewResult> {\n    const format = opts.format ?? DanfePreviewFormat.Html\n    const schema = buildPreviewSchema(dps)\n    const danfeOpts: DanfeOptions = { ...this.options, ...opts.danfe, isPreview: true }\n    const { html, warnings, environment } = await renderDanfseHtml(schema, false, danfeOpts)\n\n    if (format === DanfePreviewFormat.Html) {\n      return { format, html, warnings, environment }\n    }\n\n    const pdfBytes = await generatePdfFromHtml(html, opts.pdf)\n    return { format, html, pdfBytes, warnings, environment }\n  }\n}\n","/**\n * Renderizador HTML da DANF-Se\n * Migrado de direction-nfse-danfe/src/Danfe/Rendering/DanfeHtmlRenderer.cs\n */\n\nimport { readFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport QRCode from 'qrcode'\nimport type { NfseSchema, ValoresNfseSchema, EnderNacSchema, IBSCBSSchema } from '../xml/nfse-parser.js'\nimport { formatCnpj, formatCpf, formatCep, formatTelefone } from '../utils/cpf-cnpj.js'\nimport { DanfeEnvironment } from '../types/enums.js'\n\nconst SIMPLES_NACIONAL: Record<number, string> = {\n  1: 'Não Optante', 2: 'MEI', 3: 'ME/EPP',\n}\n\nconst REGIME_ESP_TRIB: Record<number, string> = {\n  0: 'Nenhum', 1: 'Cooperativa', 2: 'Estimativa',\n  3: 'Microempresa Municipal', 4: 'Notário ou Registrador',\n  5: 'Profissional Autônomo', 6: 'Sociedade de Profissionais', 9: 'Outros',\n}\n\nconst TRIB_ISSQN: Record<string, string> = {\n  '1': 'Operação Tributável', '2': 'Imunidade', '3': 'Exportação de Serviço', '4': 'Não Incidência',\n}\n\nconst RET_ISSQN: Record<string, string> = {\n  '1': 'Não Retido', '2': 'Retido pelo Tomador', '3': 'Retido pelo Intermediário',\n}\n\nconst MOTIVO_NAO_NIF: Record<string, string> = {\n  '0': 'Sem NIF (não informado na nota de origem)',\n  '1': 'Sem NIF (dispensado)',\n  '2': 'Sem NIF (não exigido)',\n}\n\nconst TP_IMUNIDADE: Record<string, string> = {\n  '0': 'Tipo não informado', '1': 'Patrimônio, renda ou serviços (Art 150, VI, a)',\n  '2': 'Templos de qualquer culto', '3': 'Partidos, sindicatos, instituições (Art 150, VI, c)',\n  '4': 'Livros, jornais, periódicos', '5': 'Fonogramas e videofonogramas',\n}\n// bun build gera dist/index.js (bundle único) — __dirname aponta para dist/ → ../assets\n// em testes (src/danfe/) → ../../assets; tenta o mais próximo, cai no outro se não existir\nconst _distAssets = join(__dirname, '../assets')\nconst ASSETS_DIR = existsSync(_distAssets) ? _distAssets : join(__dirname, '../../assets')\nconst TEMPLATE_PATH = join(ASSETS_DIR, 'templates/danfe.html')\nconst MUNICIPIOS_CSV = join(ASSETS_DIR, 'municipios.csv')\n\nexport interface DanfeOptions {\n  fontFamily?: string\n  fontSize?: number\n  templatePath?: string\n  logoPath?: string\n  /** Texto exibido na marca d'água quando isPreview=true. Padrão: 'SEM VALOR FISCAL'. */\n  watermarkText?: string\n  /** Quando true, sobrepõe uma marca d'água no documento renderizado. */\n  isPreview?: boolean\n}\n\nexport interface DanfeWarning {\n  code: string\n  message: string\n  field?: string\n}\n\nexport interface DanfeRenderResult {\n  html: string\n  warnings: DanfeWarning[]\n  environment: DanfeEnvironment\n}\n\nlet municipioCache: Map<string, { nome: string; uf: string }> | null = null\n\nfunction loadMunicipios(): Map<string, { nome: string; uf: string }> {\n  if (municipioCache) return municipioCache\n  municipioCache = new Map()\n  try {\n    const lines = readFileSync(MUNICIPIOS_CSV, 'utf-8').split('\\n').slice(1)\n    for (const line of lines) {\n      const [cod, nome, uf] = line.split(';')\n      if (cod && nome) municipioCache.set(cod.trim(), { nome: nome.trim(), uf: (uf ?? '').trim() })\n    }\n  } catch { /* CSV não obrigatório */ }\n  return municipioCache\n}\n\nfunction getMunicipio(codIbge: string) {\n  return loadMunicipios().get(codIbge.padStart(7, '0'))\n}\n\nfunction fmt(value: number, decimals = 2): string {\n  return value.toLocaleString('pt-BR', { minimumFractionDigits: decimals, maximumFractionDigits: decimals })\n}\n\nfunction fmtDate(d: string): string {\n  if (!d) return '-'\n  try {\n    // Datas sem hora (YYYY-MM-DD) são parseadas como UTC → exibem dia anterior em GMT-3.\n    // Adicionamos T12:00:00 para evitar esse problema.\n    const safe = /^\\d{4}-\\d{2}(-\\d{2})?$/.test(d) ? `${d}T12:00:00` : d\n    return new Date(safe).toLocaleDateString('pt-BR')\n  } catch { return d }\n}\n\nfunction fmtDateTime(d: string): string {\n  if (!d) return '-'\n  try { return new Date(d).toLocaleString('pt-BR') } catch { return d }\n}\n\nfunction h(value: string | undefined | null): string {\n  return (value ?? '-')\n    .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n}\n\n// Endereço sem município e CEP (exibidos como campos separados no template)\nfunction fmtEnderecoSemMunCep(end?: EnderNacSchema): string {\n  if (!end) return '-'\n  const parts: string[] = []\n  if (end.xLgr) parts.push(end.xLgr)\n  if (end.nro) parts.push(end.nro)\n  if (end.xCpl) parts.push(end.xCpl)\n  if (end.xBairro) parts.push(end.xBairro)\n  return parts.join(', ') || '-'\n}\n\nfunction fmtDoc(cnpj: string, cpf: string, nif = '', cNaoNIF = ''): string {\n  if (cnpj.replace(/\\D/g, '').length === 14) return formatCnpj(cnpj)\n  if (cpf.replace(/\\D/g, '').length === 11) return formatCpf(cpf)\n  // Tomador estrangeiro: NIF não tem máscara fixa — exibe como veio\n  if (nif) return nif\n  // Tomador estrangeiro sem NIF: exibe o motivo (cNaoNIF)\n  if (cNaoNIF) return MOTIVO_NAO_NIF[cNaoNIF] ?? cNaoNIF\n  return '-'\n}\n\n// Município do tomador: nacional (lookup IBGE por cMun) ou estrangeiro (cidade do endExt)\nfunction fmtMunicipio(\n  mun: { nome: string; uf: string } | undefined,\n  end?: EnderNacSchema,\n): string {\n  if (mun) return `${mun.nome} - ${mun.uf}`\n  if (end?.xCidade) {\n    const regiao = end.xEstProvReg || end.cPais\n    return regiao ? `${end.xCidade} - ${regiao}` : end.xCidade\n  }\n  return end?.cMun || '-'\n}\n\nfunction buildWatermarkHtml(text: string): string {\n  return `\n<style>\n  .danfe-preview-watermark {\n    position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n    display: flex; align-items: center; justify-content: center;\n    pointer-events: none; z-index: 9999; overflow: hidden;\n  }\n  .danfe-preview-watermark span {\n    display: block;\n    font-size: 60px; font-weight: 900; letter-spacing: 0.05em;\n    color: rgba(200, 0, 0, 0.13);\n    transform: rotate(-40deg);\n    white-space: nowrap; text-transform: uppercase;\n    font-family: Arial, sans-serif;\n    line-height: 1;\n  }\n  @media print {\n    .danfe-preview-watermark { position: fixed; }\n  }\n</style>\n<div class=\"danfe-preview-watermark\"><span>${text}</span></div>`\n}\n\nfunction injectWatermark(html: string, text: string): string {\n  const watermark = buildWatermarkHtml(text)\n  const closeBody = html.lastIndexOf('</body>')\n  if (closeBody !== -1) return html.slice(0, closeBody) + watermark + html.slice(closeBody)\n  return html + watermark\n}\n\nfunction applyConditionals(html: string, flags: Record<string, boolean>): string {\n  let result = html\n  for (const [key, show] of Object.entries(flags)) {\n    const begin = `{{${key}:BEGIN}}`, end = `{{${key}:END}}`\n    const bi = result.indexOf(begin), ei = result.indexOf(end)\n    if (bi === -1 || ei === -1) continue\n    if (show) { result = result.replace(begin, '').replace(end, '') }\n    else { result = result.slice(0, bi) + result.slice(ei + end.length) }\n  }\n  return result\n}\n\n/**\n * Monta a URL de consulta pública embutida no QR Code da DANF-Se.\n * O host varia por ambiente: produção (`tpAmb === 1`) usa nfse.gov.br;\n * homologação (produção restrita) usa producaorestrita.nfse.gov.br.\n */\nexport function buildQrUrl(chNFSe: string, tpAmb?: number | string): string {\n  const isProd = String(tpAmb ?? 1) === '1'\n  const host = isProd ? 'https://www.nfse.gov.br' : 'https://www.producaorestrita.nfse.gov.br'\n  return chNFSe ? `${host}/ConsultaPublica/?tpc=1&chave=${chNFSe}` : host\n}\n\nexport async function renderDanfseHtml(\n  schema: NfseSchema,\n  isCancelled = false,\n  options: DanfeOptions = {}\n): Promise<DanfeRenderResult> {\n  const warnings: DanfeWarning[] = []\n  const inf = schema.infNFSe\n  if (!inf) throw new Error('NFS-e inválida: infNFSe não encontrado')\n\n  const emit = inf.emit\n  const dps = inf.DPS?.infDPS\n  const val = inf.valores\n  const dpsVal = dps?.valores\n  // vServico pode não vir em infNFSe.valores — usa DPS como fallback\n  const vServico = val?.vServico || dpsVal?.vServ || 0\n  const toma = dps?.toma\n  const interm = dps?.interm\n  const serv = dps?.serv\n\n  // Valores federais: prioriza infNFSe.valores, fallback para DPS.tribFed\n  const irrf   = val?.IRRF   || dpsVal?.vRetIRRF  || 0\n  const csll   = val?.CSLL   || dpsVal?.vRetCSLL   || 0\n  const pis    = val?.PIS    || dpsVal?.vPis       || 0\n  const cofins = val?.COFINS || dpsVal?.vCofins    || 0\n  const cp     = val?.CP     || dpsVal?.vRetCP     || 0\n  const ibs    = inf.IBSCBS\n\n  const chNFSe = inf.chNFSe ?? ''\n  const qrUrl = buildQrUrl(chNFSe, dps?.tpAmb)\n  const qrImg = await QRCode.toDataURL(qrUrl, { width: 120, margin: 0 }).catch(() => '')\n\n  // Resolve município do emitente e do local de prestação\n  const munEmit = getMunicipio(emit?.enderNac?.cMun ?? '')\n  const munLocPrest = getMunicipio(serv?.cLocPrestacao ?? '')\n  const munToma = getMunicipio(dps?.toma?.enderNac?.cMun ?? '')\n\n  // Regime tributário: prioriza emit (NFS-e), fallback prest (DPS)\n  const regTrib = emit?.regTrib ?? dps?.prest?.regTrib\n\n  // Formata cTribNac \"171201\" → \"17.12.01\"\n  function fmtCTribNac(code: string): string {\n    if (!code || code.length < 6) return code\n    return `${code.slice(0, 2)}.${code.slice(2, 4)}.${code.slice(4, 6)}${code.length > 6 ? code.slice(6) : ''}`\n  }\n\n  // ISSQN Apurado: usa infNFSe.valores.vISSQN quando disponível (render from XML),\n  // ou dpsVal.pAliq × vServ (calculado pelo renderer para prévia)\n  const vISSQNApurado = (() => {\n    if (val?.vISSQN != null && val.vISSQN > 0) return val.vISSQN\n    const pAliq = dpsVal?.pAliq ? Number(dpsVal.pAliq) : 0\n    const vServ = val?.vBC ?? dpsVal?.vServ ?? 0\n    return pAliq > 0 && vServ > 0 ? Math.round(vServ * (pAliq / 100) * 100) / 100 : 0\n  })()\n\n  // ISSQN Retido: apenas quando tpRetISSQN ≠ 1 (Não Retido)\n  const issqnNaoRetido = !dpsVal?.tpRetISSQN || dpsVal.tpRetISSQN === '1'\n  const vISSQNRetido = issqnNaoRetido ? 0 : vISSQNApurado\n\n  const totalRetFed = irrf + cp + csll\n\n  const p: Record<string, string> = {\n    '{{CHAVE_NFSE}}': h(chNFSe),\n    '{{QRCODE_IMG}}': qrImg ? `<img src=\"${qrImg}\" alt=\"QR Code\" />` : '',\n    '{{MUN_HEADER}}': munEmit ? h(`${munEmit.nome} - ${munEmit.uf}`) : h(inf.xLocEmi || ''),\n    '{{NFSE_NUMERO}}': h(inf.nNFSe),\n    '{{NFSE_NDFSE}}': h(inf.nDFSe),\n    '{{NFSE_COMPETENCIA}}': h(fmtDate(dps?.dCompet ?? '')),\n    '{{NFSE_DH_PROC}}': h(fmtDateTime(inf.dhProc ?? '')),\n    '{{NFSE_DH_EMI}}': h(fmtDateTime(dps?.dhEmi ?? '')),\n    '{{DPS_NUMERO}}': h(dps?.nDPS),\n    '{{DPS_SERIE}}': h(dps?.serie),\n    '{{PREST_CNPJ}}': h(fmtDoc(emit?.CNPJ ?? '', emit?.CPF ?? '')),\n    '{{PREST_XNOME}}': h(emit?.xNome),\n    '{{PREST_XFANT}}': h(emit?.xFant),\n    '{{PREST_IM}}': h(emit?.IM),\n    '{{PREST_ENDERECO}}': h(fmtEnderecoSemMunCep(emit?.enderNac)),\n    '{{PREST_MUNICIPIO}}': munEmit ? h(`${munEmit.nome} - ${munEmit.uf}`) : h(emit?.enderNac?.cMun || '-'),\n    '{{PREST_CEP}}': h(emit?.enderNac?.CEP ? formatCep(emit.enderNac.CEP) : '-'),\n    '{{PREST_FONE}}': h(emit?.fone ? formatTelefone(emit.fone) : '-'),\n    '{{PREST_EMAIL}}': h(emit?.email),\n    '{{PREST_REGIME}}': h(regTrib ? (REGIME_ESP_TRIB[regTrib.regEspTrib] ?? String(regTrib.regEspTrib)) : '-'),\n    '{{PREST_SIMPNAC}}': h(regTrib ? (SIMPLES_NACIONAL[regTrib.opSimpNac] ?? String(regTrib.opSimpNac)) : '-'),\n    '{{TOMA_CNPJ}}': h(fmtDoc(toma?.CNPJ ?? '', toma?.CPF ?? '', toma?.NIF ?? '', toma?.cNaoNIF ?? '')),\n    '{{TOMA_XNOME}}': h(toma?.xNome),\n    '{{TOMA_IM}}': h(toma?.IM),\n    '{{TOMA_ENDERECO}}': h(fmtEnderecoSemMunCep(toma?.enderNac)),\n    '{{TOMA_MUNICIPIO}}': h(fmtMunicipio(munToma, toma?.enderNac)),\n    '{{TOMA_CEP}}': h(\n      toma?.enderNac?.CEP ? formatCep(toma.enderNac.CEP) : (toma?.enderNac?.cEndPost || '-'),\n    ),\n    '{{TOMA_FONE}}': h(toma?.fone ? formatTelefone(toma.fone) : '-'),\n    '{{TOMA_EMAIL}}': h(toma?.email),\n    '{{INTERM_CNPJ}}': h(fmtDoc(interm?.CNPJ ?? '', interm?.CPF ?? '')),\n    '{{INTERM_XNOME}}': h(interm?.xNome),\n    '{{SERVICO_CTRIBNAC}}': (() => {\n      const ctn = serv?.cTribNac ?? ''\n      const xtn = inf.xTribNac ?? ''\n      const fmt_ = fmtCTribNac(ctn)\n      return h(fmt_ && xtn ? `${fmt_} - ${xtn}` : (fmt_ || xtn || '-'))\n    })(),\n    '{{SERVICO_XNS}}': h(serv?.cNBS || inf.xNBS),\n    '{{SERVICO_XCM}}': h(serv?.cServMun),\n    '{{SERVICO_XCLES}}': munLocPrest ? h(`${munLocPrest.nome} - ${munLocPrest.uf}`) : h(inf.xLocPrestacao || serv?.cLocPrestacao),\n    '{{SERVICO_XPA}}': '-',\n    '{{SERVICO_DESCRICAO}}': h(serv?.xDescServ ?? '-').replace(/\\n/g, '<br>'),\n    '{{ISSQN_TPIMUNICIPAL}}': h(TRIB_ISSQN[dpsVal?.tribISSQN ?? ''] ?? (inf.xTribMun || inf.xTribNac)),\n    '{{ISSQN_CPAISRESULT}}': h(dpsVal?.cPaisResult || '-'),\n    '{{ISSQN_CMUNICIPIO}}': munEmit ? h(`${munEmit.nome} - ${munEmit.uf}`) : h(inf.xLocIncid || inf.xLocEmi || '-'),\n    '{{ISSQN_REGESPECIA}}': h(regTrib ? (REGIME_ESP_TRIB[regTrib.regEspTrib] ?? String(regTrib.regEspTrib)) : '-'),\n    '{{ISSQN_TPIMUNIDADE}}': h(dpsVal?.tpImunidade ? (TP_IMUNIDADE[dpsVal.tpImunidade] ?? dpsVal.tpImunidade) : '-'),\n    '{{ISSQN_TPSUSP_TEXT}}': h(dpsVal?.tpSusp ? `Sim (tipo ${dpsVal.tpSusp})` : 'Não'),\n    '{{ISSQN_NPROCESSO}}': h(dpsVal?.nProcesso || '-'),\n    '{{ISSQN_NBM}}': h(dpsVal?.nBM || '-'),\n    '{{ISSQN_VSERVICO}}': h(`R$ ${fmt(vServico)}`),\n    '{{ISSQN_VDESCINCOND}}': dpsVal?.vDescIncond ? h(`R$ ${fmt(dpsVal.vDescIncond)}`) : '-',\n    '{{ISSQN_VDEDUCOES}}': dpsVal?.vDR ? h(`R$ ${fmt(dpsVal.vDR)}`) : (dpsVal?.pDR ? h(`${fmt(dpsVal.pDR, 2)}%`) : '-'),\n    '{{ISSQN_VBASE}}': val ? h(`R$ ${fmt(val.vBC)}`) : (dpsVal ? h(`R$ ${fmt(dpsVal.vServ)}`) : '-'),\n    '{{ISSQN_PALIQ}}': val ? h(`${fmt(val.pAliqAplic, 2)}%`) : (dpsVal?.pAliq ? h(`${fmt(Number(dpsVal.pAliq), 2)}%`) : '-'),\n    '{{ISSQN_RET}}': h(RET_ISSQN[dpsVal?.tpRetISSQN ?? ''] ?? dpsVal?.tpRetISSQN ?? '-'),\n    '{{ISSQN_VCALCBM}}': h(`R$ ${fmt(vISSQNApurado)}`),\n    '{{IRRF_VALUE}}': irrf > 0 ? h(`R$ ${fmt(irrf)}`) : '-',\n    '{{FED_CONTRIB_PREV}}': cp > 0 ? h(`R$ ${fmt(cp)}`) : '-',\n    '{{FED_CONTRIB_SOC}}': csll > 0 ? h(`R$ ${fmt(csll)}`) : '-',\n    '{{FED_CONTRIB_SOC_DESC}}': '-',\n    '{{FED_PIS_PROPRIO}}': pis > 0 ? h(`R$ ${fmt(pis)}`) : '-',\n    '{{FED_COFINS_PROPRIO}}': cofins > 0 ? h(`R$ ${fmt(cofins)}`) : '-',\n    '{{FINANCEIRO_VSERVICO}}': h(`R$ ${fmt(vServico)}`),\n    '{{FINANCEIRO_VDESCCONDICIONAL}}': (() => {\n      const v = val?.vDescCondicionado ?? dpsVal?.vDescCond ?? 0\n      return v > 0 ? h(`R$ ${fmt(v)}`) : '-'\n    })(),\n    '{{FINANCEIRO_VDESCONTOINCOND}}': (() => {\n      const v = val?.vDescIncondicionado ?? dpsVal?.vDescIncond ?? 0\n      return v > 0 ? h(`R$ ${fmt(v)}`) : '-'\n    })(),\n    '{{FINANCEIRO_VISSQN_RETIDO}}': vISSQNRetido > 0 ? h(`R$ ${fmt(vISSQNRetido)}`) : '-',\n    '{{FINANCEIRO_TOTALRET}}': totalRetFed > 0 ? h(`R$ ${fmt(totalRetFed)}`) : '-',\n    '{{FINANCEIRO_PISCOFINS_PROPRIO}}': (pis + cofins) > 0 ? h(`R$ ${fmt(pis + cofins)}`) : '-',\n    '{{FINANCEIRO_VLIQ}}': val ? h(`R$ ${fmt(val.vLiq)}`) : '-',\n    '{{TRIB_PCT_FED}}': h(`${fmt(dpsVal?.pTotTribFed ?? 0, 2)} %`),\n    '{{TRIB_PCT_EST}}': h(`${fmt(dpsVal?.pTotTribEst ?? 0, 2)} %`),\n    '{{TRIB_PCT_MUN}}': h(`${fmt(dpsVal?.pTotTribMun ?? 0, 2)} %`),\n    '{{COMPL_NBS}}': h(serv?.cNBS || inf.xNBS || '-'),\n    '{{IBSCBS_VBC}}': ibs ? h(`R$ ${fmt(ibs.vBC)}`) : '-',\n    '{{IBSCBS_PIBSUF}}': ibs ? h(`${fmt(ibs.pAliqEfetUF || ibs.pIBSUF, 4)}%`) : '-',\n    '{{IBSCBS_VIBSUF}}': ibs ? h(`R$ ${fmt(ibs.vIBSUF)}`) : '-',\n    '{{IBSCBS_PIBSMUN}}': ibs ? h(`${fmt(ibs.pAliqEfetMun || ibs.pIBSMun, 4)}%`) : '-',\n    '{{IBSCBS_VIBSMUN}}': ibs ? h(`R$ ${fmt(ibs.vIBSMun)}`) : '-',\n    '{{IBSCBS_PCBS}}': ibs ? h(`${fmt(ibs.pAliqEfetCBS || ibs.pCBS, 4)}%`) : '-',\n    '{{IBSCBS_VCBS}}': ibs ? h(`R$ ${fmt(ibs.vCBS)}`) : '-',\n    '{{IBSCBS_VIBSTOT}}': ibs ? h(`R$ ${fmt(ibs.vIBSTot)}`) : '-',\n    '{{IBSCBS_VTOTNF}}': ibs ? h(`R$ ${fmt(ibs.vTotNF)}`) : '-',\n    '{{SUBST_CHAVE}}': h(dps?.subst?.chSubstda || '-'),\n    '{{SUBST_CMOTIVO}}': h(dps?.subst?.cMotivo || '-'),\n    '{{SUBST_XMOTIVO}}': h(dps?.subst?.xMotivo || '-'),\n    '{{COMPLEMENTO_XOUTINF}}': h(inf.xOutInf || '-'),\n    '{{COMPLEMENTO_XINFADINAL}}': h(serv?.xInfComp || '-'),\n    '{{COMPLEMENTO_IDDOCTEC}}': h(serv?.idDocTec || '-'),\n    '{{COMPLEMENTO_DOCREF}}': h(serv?.docRef || '-'),\n    '{{COMPLEMENTO_XPED}}': h(serv?.xPed || '-'),\n    '{{IS_CANCELADA}}': isCancelled ? 'block' : 'none',\n  }\n\n  const templatePath = options.templatePath ?? TEMPLATE_PATH\n  let html = readFileSync(templatePath, 'utf-8')\n\n  // Ambiente da nota: produção (tpAmb=1) vs homologação/produção restrita (tpAmb=2).\n  // Determina, junto com isPreview, se exibimos os dizeres de \"não-validade fiscal\":\n  // numa nota REAL de produção eles são falsos, então são suprimidos.\n  const env = (dps?.tpAmb ?? 1) === 1 ? DanfeEnvironment.Production : DanfeEnvironment.Restricted\n  const showSemValidade = options.isPreview === true || env === DanfeEnvironment.Restricted\n\n  const intermIdentificado = !!(interm?.CNPJ || interm?.CPF)\n  html = applyConditionals(html, {\n    TOMADOR_IDENTIFIED: !!(toma?.CNPJ || toma?.CPF || toma?.NIF || toma?.cNaoNIF || toma?.xNome),\n    INTERM_DADOS_IDENTIFIED: intermIdentificado,\n    INTERM_NAO_IDENTIFICADO: !intermIdentificado,\n    SUBSTITUICAO_IDENTIFIED: !!(dps?.subst),\n    IBSCBS_IDENTIFIED: !!ibs,\n    IS_CANCELADA: isCancelled,\n    SEM_VALIDADE_HEADER: showSemValidade,\n    SEM_VALIDADE_FOOTER: showSemValidade,\n  })\n\n  for (const [key, value] of Object.entries(p)) {\n    html = html.replaceAll(key, value)\n  }\n\n  const remaining = html.match(/\\{\\{[A-Z_:]+\\}\\}/g) ?? []\n  for (const ph of remaining) {\n    warnings.push({ code: 'PLACEHOLDER_EMPTY', message: `Placeholder não substituído: ${ph}`, field: ph })\n    html = html.replaceAll(ph, '-')\n  }\n\n  if (options.isPreview) html = injectWatermark(html, options.watermarkText ?? 'SEM VALOR FISCAL')\n\n  return { html, warnings, environment: env }\n}\n","/**\n * Gerador de PDF via Puppeteer (HTML → PDF)\n * Migrado de direction-nfse-danfe/src/Danfe/Pdf/DanfePdfGenerator.cs\n * (que usava NReco.PdfGenerator em .NET)\n */\n\nexport interface PdfOptions {\n  format?: 'A4' | 'A3' | 'Letter'\n  printBackground?: boolean\n  marginTop?: string\n  marginBottom?: string\n  marginLeft?: string\n  marginRight?: string\n}\n\nconst DEFAULT_OPTIONS: PdfOptions = {\n  format: 'A4',\n  printBackground: true,\n  marginTop: '10mm',\n  marginBottom: '0mm',\n  marginLeft: '0mm',\n  marginRight: '0mm',\n}\n\nexport async function generatePdfFromHtml(html: string, options: PdfOptions = {}): Promise<Buffer> {\n  const opts = { ...DEFAULT_OPTIONS, ...options }\n\n  // puppeteer é uma dependência opcional — instale com: npm install puppeteer\n  const { default: puppeteer } = await import('puppeteer').catch(() => {\n    throw new Error('puppeteer não encontrado. Instale-o para gerar PDF: npm install puppeteer')\n  })\n\n  const browser = await puppeteer.launch({\n    headless: true,\n    args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],\n  })\n\n  try {\n    const page = await browser.newPage()\n    await page.setContent(html, { waitUntil: 'networkidle0' })\n\n    const pdf = await page.pdf({\n      format: opts.format,\n      printBackground: opts.printBackground,\n      margin: {\n        top: opts.marginTop,\n        bottom: opts.marginBottom,\n        left: opts.marginLeft,\n        right: opts.marginRight,\n      },\n    })\n\n    return Buffer.from(pdf)\n  } finally {\n    await browser.close()\n  }\n}\n","/**\n * Constrói um NfseSchema de prévia a partir de dados DPS (antes da emissão).\n * Os campos exclusivos da NFS-e (chave, número, dhProc) recebem marcadores\n * de prévia — o documento gerado não tem valor fiscal.\n */\n\nimport type { InfDpsData, EnderecoData } from '../types/dtos.js'\nimport type { NfseSchema, EnderNacSchema } from '../xml/nfse-parser.js'\nimport { TipoRetencaoIssqn } from '../types/enums.js'\n\nfunction mapEndereco(e?: EnderecoData): EnderNacSchema | undefined {\n  if (!e) return undefined\n  const ext = e.exterior\n  return {\n    xLgr:        e.xLgr    ?? '',\n    nro:         e.nro     ?? '',\n    xCpl:        e.xCpl    ?? '',\n    xBairro:     e.xBairro ?? '',\n    cMun:        e.cMun    ?? '',\n    UF:          e.uf      ?? '',\n    CEP:         e.cep     ?? '',\n    cPais:       ext?.cPais ?? e.cPais ?? '1058',\n    cEndPost:    ext?.cEndPost    ?? '',\n    xCidade:     ext?.xCidade     ?? '',\n    xEstProvReg: ext?.xEstProvReg ?? '',\n  }\n}\n\nexport function buildPreviewSchema(dps: InfDpsData): NfseSchema {\n  const prest = dps.prestador\n  const toma  = dps.tomador\n  const serv  = dps.servico\n  const vals  = dps.valores\n  const trib  = dps.tributacao\n\n  return {\n    versao: '1.00',\n    infNFSe: {\n      id:            undefined,\n      cStat:         '000',\n      xMotivo:       'PRÉVIA — documento sem valor fiscal',\n      chNFSe:        '',\n      nNFSe:         'PRÉVIA',\n      nDFSe:         '',\n      dhProc:        new Date().toISOString(),\n      xLocEmi:       '',\n      xLocPrestacao: '',\n      cLocIncid:     serv.localPrestacao.cLocPrestacao,\n      xLocIncid:     '',\n      xTribNac:      '',\n      xTribMun:      '',\n      xNBS:          serv.codigoServico.cNBSPrinc ?? '',\n      verAplic:      dps.versaoAplicativo ?? '',\n      ambGer:        dps.tipoAmbiente,\n      tpEmis:        1,\n      procEmi:       1,\n      xOutInf:       '',\n      emit: {\n        CNPJ:    prest.cnpj  ?? '',\n        CPF:     prest.cpf   ?? '',\n        IM:      prest.inscricaoMunicipal ?? '',\n        xNome:   prest.nome  ?? '',\n        xFant:   '',\n        enderNac: mapEndereco(prest.endereco),\n        fone:    prest.telefone ?? '',\n        email:   prest.email    ?? '',\n        regTrib: prest.regimeTributario ? {\n          opSimpNac:  prest.regimeTributario.opSimpNac,\n          regApurSN:  prest.regimeTributario.regApurSN  ?? 1,\n          regEspTrib: prest.regimeTributario.regEspTrib ?? 0,\n        } : undefined,\n      },\n      DPS: {\n        infDPS: {\n          tpAmb:    dps.tipoAmbiente,\n          verAplic: dps.versaoAplicativo ?? '',\n          serie:    dps.serie            ?? '001',\n          nDPS:     dps.numeroDps,\n          dhEmi:    dps.dataEmissao,\n          dCompet:  dps.dataCompetencia,\n          tpEmit:   dps.tipoEmitente,\n          cLocEmi:  dps.codigoLocalEmissao,\n          toma: toma ? {\n            CNPJ:     toma.cnpj   ?? '',\n            CPF:      toma.cpf    ?? '',\n            NIF:      toma.nif    ?? '',\n            cNaoNIF:  toma.codigoNaoNif ?? '',\n            IM:       toma.inscricaoMunicipal ?? '',\n            xNome:    toma.nome   ?? '',\n            enderNac: mapEndereco(toma.endereco),\n            fone:     toma.telefone ?? '',\n            email:    toma.email    ?? '',\n          } : undefined,\n          interm: dps.intermediario ? {\n            CNPJ:     dps.intermediario.cnpj ?? '',\n            CPF:      dps.intermediario.cpf  ?? '',\n            NIF:      '',\n            cNaoNIF:  '',\n            IM:       dps.intermediario.inscricaoMunicipal ?? '',\n            xNome:    dps.intermediario.nome ?? '',\n            enderNac: undefined,\n            fone:     '',\n            email:    '',\n          } : undefined,\n          serv: {\n            xDescServ:     serv.xDescServ,\n            cTribNac:      serv.codigoServico.cServTribNac,\n            cServMun:      serv.codigoServico.cServMun     ?? '',\n            cNBS:          serv.codigoServico.cNBSPrinc    ?? '',\n            cIntContrib:   serv.codigoServico.cIntContrib  ?? '',\n            cLocPrestacao: serv.localPrestacao.cLocPrestacao,\n            xInfComp:      serv.informacaoComplemento?.xInfComp ?? '',\n            idDocTec:      serv.informacaoComplemento?.idDocTec ?? '',\n            docRef:        serv.informacaoComplemento?.docRef ?? '',\n            xPed:          serv.informacaoComplemento?.xPed ?? '',\n          },\n          valores: {\n            vReceb:      0,\n            vServ:       vals.vServico,\n            vDescIncond: vals.vDescIncondicionado ?? 0,\n            vDescCond:   vals.vDescCondicionado   ?? 0,\n            pDR:         0,\n            vDR:         0,\n            tribISSQN:   String(trib?.issqn?.tributacaoIssqn   ?? ''),\n            cPaisResult: '',\n            tpImunidade: String(trib?.issqn?.tipoImunidade ?? ''),\n            tpSusp:      String(trib?.issqn?.tipoSuspensao ?? ''),\n            nProcesso:   String(trib?.issqn?.numeroProcessoSuspensao ?? ''),\n            nBM:         '',\n            vRedBCBM:    0,\n            pRedBCBM:    0,\n            tpRetISSQN:  String(trib?.issqn?.tipoRetencaoIssqn ?? ''),\n            pAliq:       trib?.issqn?.aliquota != null ? String(trib.issqn.aliquota * 100) : '',\n            vRetCP:      trib?.federal?.valorRetidoCp    ?? 0,\n            vRetIRRF:    trib?.federal?.valorRetidoIrrf  ?? 0,\n            vRetCSLL:    trib?.federal?.valorRetidoCsll  ?? 0,\n            cstPisCofins: trib?.federal?.cstPisCofins ?? '',\n            vBCPisCofins: trib?.federal?.baseCalculoPisCofins ?? 0,\n            pAliqPis:    trib?.federal?.aliquotaPis      ?? 0,\n            pAliqCofins: trib?.federal?.aliquotaCofins   ?? 0,\n            vPis:        trib?.federal?.valorPis         ?? 0,\n            vCofins:     trib?.federal?.valorCofins      ?? 0,\n            tpRetPisCofins: String(trib?.federal?.tipoRetencaoPisCofins ?? ''),\n            pTotTribFed: trib?.percentualTotalTributosFederais   ?? 0,\n            pTotTribEst: trib?.percentualTotalTributosEstaduais  ?? 0,\n            pTotTribMun: trib?.percentualTotalTributosMunicipais ?? 0,\n          },\n        },\n      },\n      valores: (() => {\n        const vBC      = vals.vBC ?? vals.vServico\n        const aliquota = trib?.issqn?.aliquota\n          ?? vals.pAliq\n          ?? ((vals.vISSQN != null && vals.vISSQN > 0 && vBC > 0) ? vals.vISSQN / vBC : 0)\n        const vISSQN   = vals.vISSQN ?? Math.round(vBC * aliquota * 100) / 100\n        const tpRet        = trib?.issqn?.tipoRetencaoIssqn\n        const vRetido      = (tpRet != null && tpRet !== TipoRetencaoIssqn.NaoRetido) ? vISSQN : 0\n        const vTotalRetFed = (trib?.federal?.valorRetidoIrrf ?? 0)\n                           + (trib?.federal?.valorRetidoCsll  ?? 0)\n                           + (trib?.federal?.valorPis          ?? 0)\n                           + (trib?.federal?.valorCofins       ?? 0)\n        const vTotalRet    = vals.vTotalRet ?? vTotalRetFed\n        const vLiq         = vals.vLiq ?? (vals.vServico - vRetido - (vals.vDescIncondicionado ?? 0) - (vals.vDescCondicionado ?? 0) - vTotalRet)\n        return {\n        vServico:            vals.vServico,\n        vBC,\n        pAliqAplic:          aliquota * 100,\n        vISSQN,\n        vLiq,\n        vCalcBM:             0,\n        vCalcDR:             0,\n        vTotalRet,\n        vDescCondicionado:   vals.vDescCondicionado   ?? 0,\n        vDescIncondicionado: vals.vDescIncondicionado ?? 0,\n        IRRF:                trib?.federal?.valorRetidoIrrf  ?? 0,\n        CP:                  0,\n        CSLL:                trib?.federal?.valorRetidoCsll  ?? 0,\n        PIS:                 trib?.federal?.valorPis         ?? 0,\n        COFINS:              trib?.federal?.valorCofins      ?? 0,\n        }\n      })(),\n    },\n  }\n}\n","/**\n * Gerador de CPF e CNPJ válidos com dígitos verificadores (algoritmo Mod11)\n * Portado de nfse-php/src/Support/CpfCnpjGenerator.php\n *\n * Útil para gerar dados de teste em ambiente de homologação.\n */\n\nimport { formatCpf, formatCnpj } from './cpf-cnpj.js'\n\n/**\n * Gera um CPF válido com dígitos verificadores calculados pelo algoritmo Mod11.\n *\n * @param formatted Se `true`, retorna no formato `XXX.XXX.XXX-XX`.\n *\n * @example\n * ```ts\n * generateCpf()        // '06672992383'\n * generateCpf(true)    // '066.729.923-83'\n * ```\n */\nexport function generateCpf(formatted = false): string {\n  const d = Array.from({ length: 9 }, () => Math.floor(Math.random() * 10)) as\n    [number, number, number, number, number, number, number, number, number]\n\n  const sum1 = d[8] * 2 + d[7] * 3 + d[6] * 4 + d[5] * 5 +\n               d[4] * 6 + d[3] * 7 + d[2] * 8 + d[1] * 9 + d[0] * 10\n  let v1 = 11 - mod(sum1, 11)\n  if (v1 >= 10) v1 = 0\n\n  const sum2 = v1 * 2 + d[8] * 3 + d[7] * 4 + d[6] * 5 + d[5] * 6 +\n               d[4] * 7 + d[3] * 8 + d[2] * 9 + d[1] * 10 + d[0] * 11\n  let v2 = 11 - mod(sum2, 11)\n  if (v2 >= 10) v2 = 0\n\n  const cpf = d.join('') + v1 + v2\n  return formatted ? formatCpf(cpf) : cpf\n}\n\n/**\n * Gera um CNPJ válido com dígitos verificadores calculados pelo algoritmo Mod11.\n * O sufixo de filial é sempre `0001` (matriz).\n *\n * @param formatted Se `true`, retorna no formato `XX.XXX.XXX/XXXX-XX`.\n *\n * @example\n * ```ts\n * generateCnpj()       // '12345678000195'\n * generateCnpj(true)   // '12.345.678/0001-95'\n * ```\n */\nexport function generateCnpj(formatted = false): string {\n  // 8 dígitos aleatórios + filial fixa 0001\n  const d = [...Array.from({ length: 8 }, () => Math.floor(Math.random() * 10)), 0, 0, 0, 1] as\n    [number, number, number, number, number, number, number, number, number, number, number, number]\n\n  const sum1 = d[11] * 2 + d[10] * 3 + d[9] * 4 + d[8] * 5 + d[7] * 6 + d[6] * 7 +\n               d[5] * 8 + d[4] * 9 + d[3] * 2 + d[2] * 3 + d[1] * 4 + d[0] * 5\n  let v1 = 11 - mod(sum1, 11)\n  if (v1 >= 10) v1 = 0\n\n  const sum2 = v1 * 2 + d[11] * 3 + d[10] * 4 + d[9] * 5 + d[8] * 6 + d[7] * 7 + d[6] * 8 +\n               d[5] * 9 + d[4] * 2 + d[3] * 3 + d[2] * 4 + d[1] * 5 + d[0] * 6\n  let v2 = 11 - mod(sum2, 11)\n  if (v2 >= 10) v2 = 0\n\n  const cnpj = d.join('') + v1 + v2\n  return formatted ? formatCnpj(cnpj) : cnpj\n}\n\n/** Resto da divisão com arredondamento (equivalente ao `mod()` do PHP). */\nfunction mod(dividend: number, divisor: number): number {\n  return Math.round(dividend - Math.floor(dividend / divisor) * divisor)\n}\n","/**\n * Calculadora de tributos para NFS-e Nacional\n * Portado de nfse-php/src/Support/TaxCalculator.php\n */\n\n/**\n * Calcula o valor do tributo dado a base de cálculo e a alíquota.\n *\n * @param baseCalculation Base de cálculo em reais (BRL).\n * @param aliquot Alíquota em **porcentagem** (ex.: `5` para 5%, `2.5` para 2,5%).\n * @returns Valor do tributo arredondado para 2 casas decimais.\n *\n * @example\n * ```ts\n * calculateTax(1000, 5)   // 50.00\n * calculateTax(1500, 2.5) // 37.50\n * calculateTax(750, 3)    // 22.50\n * ```\n */\nexport function calculateTax(baseCalculation: number, aliquot: number): number {\n  return Math.round(baseCalculation * (aliquot / 100) * 100) / 100\n}\n"],"mappings":"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","names":["TipoAmbiente","TipoPessoa","EmitenteDPS","ModoPrestacao","MotivoNaoNif","ProcessoEmissao","CodigoStatus","TributacaoIssqn","TipoRetencaoIssqn","TipoRetencaoPisCofins","TipoImunidade","TipoDeducaoReducao","TipoSuspensao","OpcaoSimplesNacional","RegimeApuracaoSN","RegimeEspecialTributacao","MotivoEmissaoTomadorIntermediario","AmbienteGerador","IndicadorTotalTributos","DanfeEnvironment","TipoEvento","MotivoEventoCancelamento","TipoEventoCancelamento","ModoPrestacaoComExt","VinculoPrestacao","MecAFComexPrestador","MecAFComexTomador","MovimentacaoTemporariaBens","EnvioMDIC","CodigoMoeda","DanfePreviewFormat","FinalidadeNFSe","IndicadorDestinatario","IndicadorConsumidorFinal","TipoOperacaoEnteGov","TipoEnteGovernamental","CstIbsCbs","ClassTribIbsCbs","CodigoIndOp","NAMESPACE","VERSAO","tag","forge","import_zod","import_node_fs","import_node_path","fmt","QRCode","import_node_fs","decompressXml"]}