@fayz-ai/plugin-fiscal-br 0.13.4 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/GapScreens-RDPPFZMG.js +3 -0
  2. package/dist/GapScreens-RDPPFZMG.js.map +1 -0
  3. package/dist/InboundNotesPage-R72EC5E4.js +5 -0
  4. package/dist/InboundNotesPage-R72EC5E4.js.map +1 -0
  5. package/dist/InvoiceNotesButton-3SMNHWMQ.js +5 -0
  6. package/dist/InvoiceNotesButton-3SMNHWMQ.js.map +1 -0
  7. package/dist/NoteReconcileView-3KVXZLCG.js +4 -0
  8. package/dist/NoteReconcileView-3KVXZLCG.js.map +1 -0
  9. package/dist/OrderNoteCard-H6P66R4J.js +5 -0
  10. package/dist/OrderNoteCard-H6P66R4J.js.map +1 -0
  11. package/dist/UnitFiscalWidgets-KCHSISBS.js +503 -0
  12. package/dist/UnitFiscalWidgets-KCHSISBS.js.map +1 -0
  13. package/dist/chunk-2GHTB3Z2.js +66 -0
  14. package/dist/chunk-2GHTB3Z2.js.map +1 -0
  15. package/dist/chunk-7NW3EBOQ.js +101 -0
  16. package/dist/chunk-7NW3EBOQ.js.map +1 -0
  17. package/dist/chunk-G7T5YMNY.js +241 -0
  18. package/dist/chunk-G7T5YMNY.js.map +1 -0
  19. package/dist/chunk-JRP5AZFJ.js +64 -0
  20. package/dist/chunk-JRP5AZFJ.js.map +1 -0
  21. package/dist/chunk-OGXYHL3Z.js +590 -0
  22. package/dist/chunk-OGXYHL3Z.js.map +1 -0
  23. package/dist/chunk-RZT2BO6E.js +64 -0
  24. package/dist/chunk-RZT2BO6E.js.map +1 -0
  25. package/dist/chunk-UYGGBJCR.js +2314 -0
  26. package/dist/chunk-UYGGBJCR.js.map +1 -0
  27. package/dist/chunk-WID54RUV.js +498 -0
  28. package/dist/chunk-WID54RUV.js.map +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +146 -9391
  31. package/dist/index.js.map +1 -1
  32. package/dist/migrations/main.browser.js +39 -0
  33. package/dist/migrations/main.browser.js.map +1 -0
  34. package/dist/migrations/main.js +4912 -0
  35. package/dist/migrations/main.js.map +1 -0
  36. package/dist/views/InboundNotesPage.d.ts.map +1 -1
  37. package/dist/views/inventoryView.d.ts.map +1 -1
  38. package/package.json +11 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/nfe-xml.ts","../src/data/inbox.ts","../src/views/NoteAttachmentsCard.tsx","../src/views/PullByKeyDialog.tsx","../src/types.ts","../src/views/NoteReconcileView.tsx"],"names":["ImageIcon","useState","useEffect","jsx","jsxs","Button","Loader2","money","formatCurrency","day","useCallback","accepted","reavaliar","rodape","Fragment","ModalHeader","ModalTitle","ModalBody","ModalFooter","FileText","Hint","Card","Input","Trash2"],"mappings":"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","file":"chunk-UYGGBJCR.js","sourcesContent":["// ---------------------------------------------------------------------------\n// nfe-xml — read a supplier NF-e (layout 4.00) into the shape the inbox wants.\n// ---------------------------------------------------------------------------\n// The XML is decomposed HERE, in TypeScript, and not in PL/pgSQL. Three reasons,\n// in order of how much each one cost when ignored elsewhere:\n//\n// 1. A parser with a unit test is a parser you can trust. The assertions in\n// nfe-xml.test.ts compare against what the V1 itself read out of the same\n// three documents, so drift is caught by the origin rather than by a number\n// someone typed into an expectation.\n// 2. A file that is not a nota has to produce a sentence the operator can act\n// on (\"this is an NFC-e, not a supplier note\"), and `RAISE EXCEPTION` from\n// a trigger deep in a transaction is not that sentence.\n// 3. The same reader runs in the browser, so the drop zone can show what it\n// found before anything is written.\n//\n// No XML dependency. The reader below is ~70 lines because NF-e is\n// machine-generated: no CDATA in the elements we read, no DTD, no mixed content.\n// Adding a parser to the dependency tree of every app that installs this plugin\n// to avoid those 70 lines is the worse trade.\n// ---------------------------------------------------------------------------\n\nexport interface NfeSupplier {\n cnpj: string\n name: string\n tradeName?: string\n ie?: string\n city?: string\n state?: string\n}\n\nexport interface NfeItem {\n itemNumber: number\n supplierProductCode: string\n eanBarcode?: string\n description: string\n ncm?: string\n cest?: string\n cfop?: string\n unit?: string\n quantity: number\n unitPrice: number\n total: number\n discount?: number\n freight?: number\n other?: number\n icmsCst?: string\n icmsCsosn?: string\n icmsOrigin?: string\n icmsBase?: number\n icmsRate?: number\n icmsValue?: number\n pisValue?: number\n cofinsValue?: number\n ipiValue?: number\n}\n\nexport interface NfeDuplicate {\n index: number\n number?: string\n dueDate?: string\n value: number\n}\n\nexport interface NfePayment {\n index: number\n indicator?: string\n code?: string\n label?: string\n value: number\n}\n\nexport interface NfeTotals {\n total: number\n products: number\n discount: number\n freight: number\n insurance: number\n other: number\n icmsBase?: number\n icmsValue?: number\n pisValue?: number\n cofinsValue?: number\n ipiValue?: number\n}\n\nexport interface ParsedNfe {\n accessKey: string\n nfeNumber: string\n nfeSeries: string\n nfeModel: string\n issueDate: string\n natureOperation?: string\n supplier: NfeSupplier\n totals: NfeTotals\n items: NfeItem[]\n duplicates: NfeDuplicate[]\n payments: NfePayment[]\n additionalInfo?: string\n protocol?: string\n authorizedAt?: string\n}\n\nexport class NfeParseError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NfeParseError'\n }\n}\n\n// ── The reader ─────────────────────────────────────────────────────────────\n\ninterface XNode {\n name: string\n attrs: Record<string, string>\n children: XNode[]\n text: string\n}\n\nconst ENTITIES: Record<string, string> = {\n amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\",\n}\n\nfunction decode(raw: string): string {\n return raw.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, (whole, body: string) => {\n if (body.startsWith('#x') || body.startsWith('#X')) return String.fromCodePoint(parseInt(body.slice(2), 16))\n if (body.startsWith('#')) return String.fromCodePoint(parseInt(body.slice(1), 10))\n return ENTITIES[body] ?? whole\n })\n}\n\n// Namespace prefixes are dropped: the whole document lives in the portalfiscal\n// namespace and a supplier that emits `ns2:infNFe` is emitting the same note.\nconst bare = (name: string) => {\n const i = name.indexOf(':')\n return i < 0 ? name : name.slice(i + 1)\n}\n\nfunction parseXml(xml: string): XNode {\n // Declaration, comments and processing instructions carry nothing we read.\n const src = xml\n .replace(/<\\?[\\s\\S]*?\\?>/g, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_m, inner: string) => inner)\n .replace(/<!DOCTYPE[^>]*>/gi, '')\n\n const root: XNode = { name: '#root', attrs: {}, children: [], text: '' }\n const stack: XNode[] = [root]\n const tag = /<\\s*(\\/?)\\s*([A-Za-z_][\\w.:-]*)((?:\\s+[\\w.:-]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'))*)\\s*(\\/?)\\s*>/g\n\n let cursor = 0\n let m: RegExpExecArray | null\n while ((m = tag.exec(src)) !== null) {\n const [whole, closing, rawName, rawAttrs, selfClosing] = m\n const top = stack[stack.length - 1]\n const between = src.slice(cursor, m.index)\n if (between.trim()) top.text += decode(between)\n cursor = m.index + whole.length\n\n if (closing) {\n if (stack.length > 1) stack.pop()\n continue\n }\n\n const attrs: Record<string, string> = {}\n const attrRe = /([\\w.:-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g\n let a: RegExpExecArray | null\n while ((a = attrRe.exec(rawAttrs ?? '')) !== null) {\n attrs[bare(a[1])] = decode(a[2] ?? a[3] ?? '')\n }\n\n const node: XNode = { name: bare(rawName), attrs, children: [], text: '' }\n top.children.push(node)\n if (!selfClosing) stack.push(node)\n }\n return root\n}\n\nconst kids = (node: XNode | undefined, name: string): XNode[] =>\n node ? node.children.filter((c) => c.name === name) : []\n\nconst kid = (node: XNode | undefined, name: string): XNode | undefined => kids(node, name)[0]\n\n/** Walk a dot path (`ide.nNF`). Returns undefined at the first missing step. */\nfunction at(node: XNode | undefined, path: string): XNode | undefined {\n let cur = node\n for (const step of path.split('.')) {\n cur = kid(cur, step)\n if (!cur) return undefined\n }\n return cur\n}\n\nconst str = (node: XNode | undefined, path?: string): string | undefined => {\n const target = path ? at(node, path) : node\n const value = target?.text.trim()\n return value ? value : undefined\n}\n\n// The NF-e writes decimals with a dot and no thousands separator, so Number is\n// enough — but a missing tag must come back as undefined, not 0: a freight that\n// was not declared is not a freight of zero, and the difference shows up in the\n// total the payable is opened with.\nconst num = (node: XNode | undefined, path?: string): number | undefined => {\n const value = str(node, path)\n if (value === undefined) return undefined\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nconst zero = (node: XNode | undefined, path?: string): number => num(node, path) ?? 0\n\n// ── tPag → the V1's own payment vocabulary ─────────────────────────────────\n//\n// Table from NF-e 4.00 layout, collapsed onto the ten values V1 actually stores\n// (measured in `danfe_payments.payment_type`). Anything unmapped becomes\n// `outro`, which is what the V1 does with 107 of its 1.069 rows.\nconst PAYMENT_BY_CODE: Record<string, string> = {\n '01': 'dinheiro',\n '02': 'outro', // cheque\n '03': 'cartao_credito',\n '04': 'cartao_debito',\n '05': 'credito_loja',\n '10': 'outro', // vale alimentação\n '11': 'outro', // vale refeição\n '12': 'vale_presente',\n '13': 'outro', // vale combustível\n '14': 'duplicata_mercantil',\n '15': 'boleto',\n '16': 'outro', // depósito bancário\n '17': 'pix',\n '18': 'outro', // transferência bancária\n '19': 'outro', // programa de fidelidade\n '90': 'sem_pagamento',\n '99': 'outro',\n}\n\nconst PAYMENT_LABEL: Record<string, string> = {\n dinheiro: 'Dinheiro',\n cartao_credito: 'Cartão de crédito',\n cartao_debito: 'Cartão de débito',\n credito_loja: 'Crédito na loja',\n vale_presente: 'Vale presente',\n duplicata_mercantil: 'Duplicata mercantil',\n boleto: 'Boleto',\n pix: 'PIX',\n sem_pagamento: 'Sem pagamento',\n outro: 'Outro',\n}\n\n/** The V1's payment vocabulary for an NF-e `tPag` code. */\nexport function paymentTypeFromCode(code: string | undefined): string {\n if (!code) return 'outro'\n return PAYMENT_BY_CODE[code.padStart(2, '0')] ?? 'outro'\n}\n\nexport function paymentLabel(type: string): string {\n return PAYMENT_LABEL[type] ?? 'Outro'\n}\n\nexport const onlyDigits = (value: string | undefined): string => (value ?? '').replace(/\\D+/g, '')\n\n// ── The note ───────────────────────────────────────────────────────────────\n\n/**\n * Read a supplier NF-e. Accepts both the standalone `<NFe>` and the\n * `<nfeProc>` envelope the SEFAZ returns (which is what PlugNotas delivers and\n * what the V1 has stored for all 80 of Artorius' notes).\n */\nexport function parseNfeXml(xml: string): ParsedNfe {\n if (!xml || !xml.trim()) throw new NfeParseError('O arquivo está vazio.')\n\n const root = parseXml(xml)\n const proc = kid(root, 'nfeProc')\n const nfe = kid(proc ?? root, 'NFe') ?? kid(root, 'NFe')\n const inf = kid(nfe, 'infNFe')\n\n if (!inf) {\n throw new NfeParseError(\n 'Este arquivo não é uma NF-e: não encontrei <infNFe>. Se veio do fornecedor, peça o XML da nota, não o DANFE em PDF.',\n )\n }\n\n // The access key lives in the Id attribute as \"NFe\" + 44 digits. It is the\n // identity of the document — every idempotency key downstream derives from it.\n const accessKey = onlyDigits(inf.attrs.Id ?? inf.attrs.id ?? '')\n if (accessKey.length !== 44) {\n throw new NfeParseError(\n `A chave de acesso tem ${accessKey.length} dígitos e deveria ter 44. O arquivo pode estar truncado.`,\n )\n }\n\n const ide = kid(inf, 'ide')\n const model = str(ide, 'mod') ?? '55'\n if (model !== '55') {\n // 65 is NFC-e — a note the shop ISSUES at the till, not one a supplier sends.\n // Letting it through would open a payable against the shop's own customer.\n throw new NfeParseError(\n `Este XML é modelo ${model}${model === '65' ? ' (NFC-e, nota de venda no balcão)' : ''}, e a entrada de notas recebe NF-e modelo 55 de fornecedor.`,\n )\n }\n\n const emit = kid(inf, 'emit')\n const ender = kid(emit, 'enderEmit')\n const total = at(inf, 'total.ICMSTot')\n const dhEmi = str(ide, 'dhEmi') ?? str(ide, 'dEmi') ?? ''\n\n const items: NfeItem[] = kids(inf, 'det').map((det, i) => {\n const prod = kid(det, 'prod')\n const imposto = kid(det, 'imposto')\n // ICMS carries exactly one child, and which one depends on the supplier's tax\n // regime: ICMS00/20/40/60/90 for the normal regime, ICMSSN101/102/… for\n // Simples Nacional. Reading \"the child, whichever it is\" costs one line and\n // survives a supplier changing regime; a list of names does not.\n const icms = kid(imposto, 'ICMS')?.children[0]\n const pis = kid(imposto, 'PIS')?.children[0]\n const cofins = kid(imposto, 'COFINS')?.children[0]\n const ipi = kid(kid(imposto, 'IPI'), 'IPITrib')\n\n return {\n itemNumber: Number(det.attrs.nItem ?? i + 1) || i + 1,\n supplierProductCode: str(prod, 'cProd') ?? '',\n eanBarcode: str(prod, 'cEAN'),\n description: str(prod, 'xProd') ?? '(sem descrição)',\n ncm: str(prod, 'NCM'),\n cest: str(prod, 'CEST'),\n cfop: str(prod, 'CFOP'),\n unit: str(prod, 'uCom'),\n quantity: zero(prod, 'qCom'),\n unitPrice: zero(prod, 'vUnCom'),\n total: zero(prod, 'vProd'),\n discount: num(prod, 'vDesc'),\n freight: num(prod, 'vFrete'),\n other: num(prod, 'vOutro'),\n icmsCst: str(icms, 'CST'),\n icmsCsosn: str(icms, 'CSOSN'),\n icmsOrigin: str(icms, 'orig'),\n icmsBase: num(icms, 'vBC'),\n icmsRate: num(icms, 'pICMS'),\n icmsValue: num(icms, 'vICMS'),\n pisValue: num(pis, 'vPIS'),\n cofinsValue: num(cofins, 'vCOFINS'),\n ipiValue: num(ipi, 'vIPI'),\n }\n })\n\n if (items.length === 0) {\n throw new NfeParseError('A nota não tem nenhum item — não há o que dar entrada.')\n }\n\n // `cobr > dup` is the instalment plan the supplier declared. It is the reason\n // importing the note replaces typing the bill: the vencimentos come from the\n // document. A note without `dup` is not an error — it is paid on sight, and\n // the accept RPC opens a single instalment for it.\n const cobr = kid(inf, 'cobr')\n const duplicates: NfeDuplicate[] = kids(cobr, 'dup').map((dup, i) => ({\n index: i + 1,\n number: str(dup, 'nDup'),\n dueDate: str(dup, 'dVenc'),\n value: zero(dup, 'vDup'),\n }))\n\n const payments: NfePayment[] = kids(kid(inf, 'pag'), 'detPag').map((det, i) => {\n const code = str(det, 'tPag')\n const type = paymentTypeFromCode(code)\n return {\n index: i + 1,\n indicator: str(det, 'indPag'),\n code,\n label: paymentLabel(type),\n value: zero(det, 'vPag'),\n }\n })\n\n const prot = at(proc, 'protNFe.infProt')\n\n return {\n accessKey,\n nfeNumber: str(ide, 'nNF') ?? '',\n nfeSeries: str(ide, 'serie') ?? '',\n nfeModel: model,\n // The layout writes an ISO instant with offset; the inbox stores a date.\n issueDate: dhEmi.slice(0, 10),\n natureOperation: str(ide, 'natOp'),\n supplier: {\n cnpj: onlyDigits(str(emit, 'CNPJ') ?? str(emit, 'CPF')),\n name: str(emit, 'xNome') ?? '',\n tradeName: str(emit, 'xFant'),\n ie: str(emit, 'IE'),\n city: str(ender, 'xMun'),\n state: str(ender, 'UF'),\n },\n totals: {\n total: zero(total, 'vNF'),\n products: zero(total, 'vProd'),\n discount: zero(total, 'vDesc'),\n freight: zero(total, 'vFrete'),\n insurance: zero(total, 'vSeg'),\n other: zero(total, 'vOutro'),\n icmsBase: num(total, 'vBC'),\n icmsValue: num(total, 'vICMS'),\n pisValue: num(total, 'vPIS'),\n cofinsValue: num(total, 'vCOFINS'),\n ipiValue: num(total, 'vIPI'),\n },\n items,\n duplicates,\n payments,\n additionalInfo: str(at(inf, 'infAdic'), 'infCpl'),\n protocol: str(prot, 'nProt'),\n authorizedAt: str(prot, 'dhRecbto'),\n }\n}\n\n// ── The payload the staging RPC wants ──────────────────────────────────────\n//\n// `fiscalbr_stage_inbox_document` takes snake_case jsonb, and the mapping lives\n// next to the parser so a renamed field breaks in one place instead of being\n// silently dropped into a column that stays null.\n\nexport function toStagePayload(\n note: ParsedNfe,\n options: { unitId?: string | null; source?: string; xml?: string } = {},\n) {\n return {\n // O ARQUIVO VIAJA JUNTO. Ele já está na mão aqui — o parser acabou de lê-lo —\n // e sem isto os bytes morriam no fim da função: nota fiscal tem guarda legal\n // de cinco anos e a única cópia ficava na pasta de downloads de quem importou.\n ...(options.xml ? { xml: options.xml } : {}),\n access_key: note.accessKey,\n nfe_number: note.nfeNumber,\n nfe_series: note.nfeSeries,\n nfe_model: note.nfeModel,\n issue_date: note.issueDate,\n nature_operation: note.natureOperation ?? null,\n additional_info: note.additionalInfo ?? null,\n unit_id: options.unitId ?? null,\n source: options.source ?? 'xml_upload',\n supplier: {\n cnpj: note.supplier.cnpj,\n name: note.supplier.name,\n ie: note.supplier.ie ?? null,\n },\n totals: {\n total: note.totals.total,\n products: note.totals.products,\n discount: note.totals.discount,\n freight: note.totals.freight,\n insurance: note.totals.insurance,\n other: note.totals.other,\n },\n items: note.items.map((i) => ({\n item_number: i.itemNumber,\n supplier_product_code: i.supplierProductCode,\n ean_barcode: i.eanBarcode ?? null,\n description: i.description,\n ncm: i.ncm ?? null,\n cest: i.cest ?? null,\n cfop: i.cfop ?? null,\n unit: i.unit ?? null,\n quantity: i.quantity,\n unit_price: i.unitPrice,\n total: i.total,\n discount: i.discount ?? null,\n freight: i.freight ?? null,\n other: i.other ?? null,\n icms_cst: i.icmsCst ?? null,\n icms_csosn: i.icmsCsosn ?? null,\n icms_base: i.icmsBase ?? null,\n icms_rate: i.icmsRate ?? null,\n icms_value: i.icmsValue ?? null,\n pis_value: i.pisValue ?? null,\n cofins_value: i.cofinsValue ?? null,\n ipi_value: i.ipiValue ?? null,\n })),\n // The instalment carries the payment form the note declared, so the\n // reconciliation dialog opens with `Boleto` already chosen instead of blank.\n duplicates: note.duplicates.map((d) => ({\n index: d.index,\n number: d.number ?? null,\n due_date: d.dueDate ?? null,\n value: d.value,\n payment_type: note.payments.length === 1 ? paymentTypeFromCode(note.payments[0].code) : null,\n })),\n payments: note.payments.map((p) => ({\n index: p.index,\n indicator: p.indicator ?? null,\n code: p.code ?? null,\n label: p.label ?? null,\n value: p.value,\n })),\n }\n}\n","// ---------------------------------------------------------------------------\n// inbox — the data layer of Entrada de Notas.\n// ---------------------------------------------------------------------------\n// Reads go through PostgREST so RLS answers; every WRITE goes through one of the\n// four RPCs of migration 009. That split is the whole safety property of this\n// screen: the browser never inserts a stock movement or a payable, it asks the\n// database to do both in one transaction with an idempotency key derived from\n// the NF-e access key.\n//\n// Nothing here parses XML. `../lib/nfe-xml` does that, is unit-tested against\n// three real notes, and hands this module the payload the staging RPC wants.\n// ---------------------------------------------------------------------------\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { getActiveTenantId } from '@fayz-ai/admin'\nimport { parseNfeXml, toStagePayload, type ParsedNfe } from '../lib/nfe-xml'\nimport type {\n InboxNote, InboxNoteDetail, InboxItem, InboxInstalment,\n InboxStatusFilter, AcceptResult, StageResult, ProductOption,\n MeasurementUnitOption, ChartAccountOption, StockLocationOption,\n} from '../types'\n\nfunction sb() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\n// ── Leitura ────────────────────────────────────────────────────────────────\n\n// The two states the V1 list shows side by side, and they are NOT the same\n// question: `reconciled/total` counts items bound to a product, `stocked_at`\n// says the entry happened. 55 notes in the V1 were reconciled and never\n// stocked — a single \"status\" column would have hidden all 55.\nconst NOTE_COLUMNS = `\n id, access_key, nfe_number, nfe_series, issue_date, received_at, status,\n manifestation_status, manifested_at, manifestation_attempts,\n nature_operation, supplier_name, supplier_cnpj, supplier_party_id, xml_content,\n total_value, total_products, total_discount, total_freight,\n invoice_id, inventory_operation_id, stocked_at, reviewed_at,\n default_chart_account_id, default_location_id, unit_id, document_id, metadata,\n items:plg_fiscalbr_inbox_items(id, reconciled, entry_type),\n duplicates:plg_fiscalbr_inbox_duplicates(id, value)\n`\n\ninterface RawNote {\n items?: Array<{ id: string; reconciled: boolean | null; entry_type: string | null }>\n duplicates?: Array<{ id: string; value: number | string | null }>\n [key: string]: unknown\n}\n\nfunction rowToNote(row: RawNote): InboxNote {\n const items = row.items ?? []\n const duplicates = row.duplicates ?? []\n return {\n id: String(row.id),\n accessKey: String(row.access_key ?? ''),\n number: String(row.nfe_number ?? ''),\n series: String(row.nfe_series ?? ''),\n issueDate: (row.issue_date as string) ?? null,\n receivedAt: (row.received_at as string) ?? null,\n status: (row.status as string) ?? 'pending',\n manifestationStatus: (row.manifestation_status as string) ?? null,\n manifestedAt: (row.manifested_at as string) ?? null,\n manifestationAttempts: Number(row.manifestation_attempts ?? 0),\n natureOperation: (row.nature_operation as string) ?? null,\n supplierName: (row.supplier_name as string) ?? '',\n supplierCnpj: (row.supplier_cnpj as string) ?? null,\n supplierPartyId: (row.supplier_party_id as string) ?? null,\n total: Number(row.total_value ?? 0),\n itemCount: items.length,\n reconciledCount: items.filter((i) => i.reconciled).length,\n instalmentCount: duplicates.length,\n // The sum of instalments, because that is the total the payable is opened\n // with (financial/084) — showing the note total here would make the list and\n // Contas a Pagar disagree on 6,3% of notes.\n instalmentTotal: duplicates.reduce((acc, d) => acc + Number(d.value ?? 0), 0),\n invoiceId: (row.invoice_id as string) ?? null,\n operationId: (row.inventory_operation_id as string) ?? null,\n stockedAt: (row.stocked_at as string) ?? null,\n documentId: (row.document_id as string) ?? null,\n hasXml: Boolean(row.xml_content),\n unitId: (row.unit_id as string) ?? null,\n }\n}\n\nexport async function listInboxNotes(options: {\n filter?: InboxStatusFilter\n search?: string\n /** Narrows to one unit. Omitted = every unit the person reaches (RLS fences\n * the rest), which is what the V1 list did on \"Todas as unidades\". */\n unitId?: string\n /** Emission window, YYYY-MM-DD and inclusive. */\n from?: string\n to?: string\n limit?: number\n} = {}): Promise<InboxNote[]> {\n const { filter = 'all', search, unitId, from, to, limit = 200 } = options\n let query = sb().from('plg_fiscalbr_inbox_documents').select(NOTE_COLUMNS)\n\n if (unitId) query = query.eq('unit_id', unitId)\n // A nota sem data de emissão não some do recorte: ela ainda não foi lida do\n // XML, e esconder o que falta ler é esconder o trabalho.\n if (from) query = query.or(`issue_date.gte.${from},issue_date.is.null`)\n if (to) query = query.or(`issue_date.lte.${to},issue_date.is.null`)\n\n // `stocked` and `pending` are about the STOCK column, not about `status`:\n // \"pendente\" in the V1 list means the entry has not happened, whatever the\n // reconciliation says.\n if (filter === 'stocked') query = query.not('stocked_at', 'is', null)\n if (filter === 'pending') query = query.is('stocked_at', null)\n if (filter === 'rejected') query = query.eq('status', 'rejected')\n if (filter === 'manifest_error') query = query.eq('manifestation_status', 'erro')\n if (search?.trim()) {\n const term = search.trim()\n query = query.or(\n `supplier_name.ilike.%${term}%,nfe_number.ilike.%${term}%,access_key.ilike.%${term}%`,\n )\n }\n\n const { data, error } = await query\n .order('issue_date', { ascending: false, nullsFirst: false })\n .order('received_at', { ascending: false })\n .limit(limit)\n if (error) throw error\n return (data ?? []).map(rowToNote)\n}\n\nconst ITEM_COLUMNS = `\n id, item_number, supplier_product_code, ean_barcode, description, ncm, cest, cfop,\n unit_commercial, quantity_commercial, unit_price_commercial, total_price, discount,\n unit_taxable, quantity_taxable,\n icms_cst, icms_csosn, icms_base, icms_rate, icms_value, pis_value, cofins_value, ipi_value,\n product_id, entry_type, chart_account_id, stock_unit_id, stock_quantity,\n conversion_factor, cost_mode, unit_cost_new, reconciled, stock_movement_id,\n shortage_quantity, shortage_reason, shortage_note, suggested_by, suggestion_confidence\n`\n\nfunction rowToItem(row: Record<string, any>): InboxItem {\n const quantity = Number(row.quantity_commercial ?? 0)\n const factor = Number(row.conversion_factor ?? 1) || 1\n return {\n id: String(row.id),\n itemNumber: Number(row.item_number ?? 0),\n supplierProductCode: row.supplier_product_code ?? '',\n eanBarcode: row.ean_barcode ?? null,\n description: row.description ?? '',\n ncm: row.ncm ?? null,\n cest: row.cest ?? null,\n cfop: row.cfop ?? null,\n unit: row.unit_commercial ?? null,\n quantity,\n unitPrice: Number(row.unit_price_commercial ?? 0),\n total: Number(row.total_price ?? 0),\n unitTaxable: row.unit_taxable ?? null,\n quantityTaxable: row.quantity_taxable == null ? null : Number(row.quantity_taxable),\n discount: row.discount == null ? null : Number(row.discount),\n icmsCst: row.icms_cst ?? null,\n icmsCsosn: row.icms_csosn ?? null,\n icmsValue: row.icms_value == null ? null : Number(row.icms_value),\n productId: row.product_id ?? null,\n entryType: row.entry_type ?? null,\n chartAccountId: row.chart_account_id ?? null,\n stockUnitId: row.stock_unit_id ?? null,\n conversionFactor: factor,\n // Derived AND stored by the RPC. Reading the stored value keeps the screen\n // showing the number the operator accepted, and falls back to the product of\n // the two only while the decision has not been saved yet.\n stockQuantity: row.stock_quantity == null ? quantity * factor : Number(row.stock_quantity),\n costMode: row.cost_mode ?? 'novo',\n unitCostNew: row.unit_cost_new == null ? null : Number(row.unit_cost_new),\n reconciled: Boolean(row.reconciled),\n suggestedBy: row.suggested_by === 'ai' || row.suggested_by === 'ean' || row.suggested_by === 'supplier_map'\n ? row.suggested_by\n : null,\n suggestionConfidence: row.suggestion_confidence == null ? null : Number(row.suggestion_confidence),\n stockMovementId: row.stock_movement_id ?? null,\n shortageQuantity: row.shortage_quantity == null ? null : Number(row.shortage_quantity),\n shortageReason: row.shortage_reason ?? null,\n shortageNote: row.shortage_note ?? null,\n }\n}\n\nexport async function getInboxNote(id: string): Promise<InboxNoteDetail | null> {\n const { data, error } = await sb()\n .from('plg_fiscalbr_inbox_documents')\n .select(NOTE_COLUMNS)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n if (!data) return null\n\n const [items, instalments, payments] = await Promise.all([\n sb().from('plg_fiscalbr_inbox_items').select(ITEM_COLUMNS)\n .eq('inbox_document_id', id).order('item_number'),\n sb().from('plg_fiscalbr_inbox_duplicates')\n .select('id, duplicate_index, number, due_date, value, payment_type, barcode, pix_key, payment_method_id')\n .eq('inbox_document_id', id).order('duplicate_index'),\n sb().from('plg_fiscalbr_inbox_payments')\n .select('id, payment_index, payment_type_code, payment_type_label, value')\n .eq('inbox_document_id', id).order('payment_index'),\n ])\n if (items.error) throw items.error\n if (instalments.error) throw instalments.error\n\n return {\n ...rowToNote(data as RawNote),\n natureOperation: (data as any).nature_operation ?? null,\n defaultChartAccountId: (data as any).default_chart_account_id ?? null,\n defaultLocationId: (data as any).default_location_id ?? null,\n items: (items.data ?? []).map(rowToItem),\n instalments: (instalments.data ?? []).map((d: any): InboxInstalment => ({\n id: String(d.id),\n index: Number(d.duplicate_index ?? 0),\n number: d.number ?? null,\n dueDate: d.due_date ?? null,\n amount: Number(d.value ?? 0),\n paymentType: d.payment_type ?? null,\n barcode: d.barcode ?? null,\n pixKey: d.pix_key ?? null,\n paymentMethodId: d.payment_method_id ?? null,\n })),\n declaredPayments: (payments.data ?? []).map((p: any) => ({\n index: Number(p.payment_index ?? 0),\n code: p.payment_type_code ?? null,\n label: p.payment_type_label ?? null,\n value: Number(p.value ?? 0),\n })),\n }\n}\n\n// ── Escrita: sempre por RPC ────────────────────────────────────────────────\n\n/**\n * Read one XML file and stage it. Returns what the parser found together with\n * how many items the de-para already bound, because that is the number the drop\n * zone reports: \"3 itens, 2 já vinculados\" is the difference between a screen\n * that remembers the supplier and one that does not.\n */\nexport async function stageNoteFromXml(\n xml: string,\n options: { unitId?: string | null } = {},\n): Promise<StageResult & { parsed: ParsedNfe }> {\n const parsed = parseNfeXml(xml)\n const { data, error } = await sb().rpc('fiscalbr_stage_inbox_document', {\n p_note: toStagePayload(parsed, { unitId: options.unitId ?? null, xml }),\n })\n if (error) throw error\n const res = (data ?? {}) as Record<string, unknown>\n return {\n documentId: String(res.document_id ?? ''),\n accessKey: String(res.access_key ?? parsed.accessKey),\n alreadyAccepted: Boolean(res.already_accepted),\n supplierPartyId: (res.supplier_party_id as string) ?? null,\n itemCount: Number(res.items ?? 0),\n matchedCount: Number(res.matched ?? 0),\n parsed,\n }\n}\n\n/**\n * Lines only, for a note that already became payable or stock but has none:\n * restaging is refused for those, so the stored XML fills the lines and nothing else.\n */\nexport async function fillInboxLines(documentId: string, xml: string): Promise<number> {\n const payload = toStagePayload(parseNfeXml(xml))\n const { data, error } = await sb().rpc('fiscalbr_fill_inbox_lines', {\n p_document_id: documentId,\n p_items: payload.items,\n })\n if (error) throw error\n return Number((data as Record<string, unknown> | null)?.items ?? 0)\n}\n\nexport interface HealResult {\n changed: boolean\n /** The payable it pointed at was gone and no live one matched: the note can be accepted again. */\n released: boolean\n}\n\n/** Re-points or clears a payable/movement link whose target was deleted. */\nexport async function healInboxNote(documentId: string): Promise<HealResult> {\n const { data, error } = await sb().rpc('fiscalbr_heal_inbox_note', { p_document_id: documentId })\n if (error) throw error\n const r = (data as Record<string, unknown> | null) ?? {}\n return { changed: Boolean(r.changed), released: Boolean(r.released) }\n}\n\nexport interface NotePayable {\n id: string\n number: string | null\n total: number\n cancelledAt: string | null\n}\n\n/** The payable an accepted note opened; null when it no longer exists. */\nexport async function getNotePayable(invoiceId: string): Promise<NotePayable | null> {\n const { data, error } = await sb().from('plg_financial_invoices')\n .select('id, number, total, cancelled_at').eq('id', invoiceId).maybeSingle()\n if (error) throw error\n if (!data) return null\n return { id: data.id, number: data.number ?? null, total: Number(data.total ?? 0), cancelledAt: data.cancelled_at ?? null }\n}\n\nexport interface PullCnpjOption { id: string; name: string; cnpj: string }\n\n/** Why a pull by key did not stage a note — each one has a different fix on screen. */\nexport class PullByKeyError extends Error {\n constructor(message: string, readonly code?: string, readonly options?: PullCnpjOption[]) {\n super(message)\n }\n}\n\nexport type PullByKeyResult =\n | ({ status: 'staged' } & StageResult & { parsed: ParsedNfe })\n | { status: 'pending'; message: string }\n\n/**\n * Ask the SEFAZ (via PlugNotas) for one note by its access key, then stage it\n * exactly like a dropped XML. Nothing here manifests the note.\n */\nexport async function pullNoteByKey(\n key: string,\n options: { legalEntityId?: string; unitId?: string | null } = {},\n): Promise<PullByKeyResult> {\n const { data, error } = await sb().functions.invoke('fiscalbr-dfe-pull', {\n body: { key: key.replace(/\\D/g, ''), legalEntityId: options.legalEntityId, tenantId: getActiveTenantId() ?? null },\n })\n if (error) {\n // The function's own message lives in the response body, not in `error.message`.\n let body: any = null\n try { body = await (error as any)?.context?.json?.() } catch { /* keep generic */ }\n throw new PullByKeyError(body?.error || error.message || 'Falha ao falar com a SEFAZ.', body?.code, body?.options)\n }\n if (data?.pending) return { status: 'pending', message: String(data.message ?? '') }\n if (!data?.xml) throw new PullByKeyError('A SEFAZ não devolveu o XML desta nota.')\n return { status: 'staged', ...(await stageNoteFromXml(String(data.xml), { unitId: options.unitId })) }\n}\n\n/** The DANFE of an inbound note, from the fiscal provider. Rejects with the provider's reason. */\nexport async function getInboxNotePdf(accessKey: string): Promise<Blob> {\n const { data, error } = await sb().functions.invoke('fiscalbr-dfe-pull', {\n body: { action: 'pdf', key: accessKey, tenantId: getActiveTenantId() ?? null },\n })\n if (error) {\n let body: any = null\n try { body = await (error as any)?.context?.json?.() } catch { /* keep generic */ }\n throw new PullByKeyError(body?.error || error.message || 'Falha ao buscar o DANFE.', body?.code)\n }\n if (!(data instanceof Blob)) throw new PullByKeyError('O serviço fiscal não devolveu um PDF.')\n return data\n}\n\nexport interface ItemDecisionInput {\n id: string\n productId?: string | null\n entryType?: string | null\n chartAccountId?: string | null\n stockUnitId?: string | null\n conversionFactor?: number\n costMode?: string | null\n /** Quem escreveu. `null`/ausente grava NULL, que é «uma pessoa escolheu». */\n suggestedBy?: 'ai' | 'ean' | 'supplier_map' | null\n suggestionConfidence?: number | null\n shortageQuantity?: number | null\n shortageReason?: string | null\n shortageNote?: string | null\n}\n\nexport interface InstalmentInput {\n index: number\n number?: string | null\n dueDate?: string | null\n amount: number\n paymentType?: string | null\n barcode?: string | null\n pixKey?: string | null\n paymentMethodId?: string | null\n}\n\nexport async function saveNoteDecision(input: {\n documentId: string\n items: ItemDecisionInput[]\n defaultChartAccountId?: string | null\n defaultLocationId?: string | null\n instalments?: InstalmentInput[] | null\n}): Promise<{ saved: number; items: number; reconciled: number }> {\n const { data, error } = await sb().rpc('fiscalbr_save_inbox_decision', {\n p_document_id: input.documentId,\n p_items: input.items.map((i) => ({\n id: i.id,\n product_id: i.productId ?? null,\n entry_type: i.entryType ?? null,\n chart_account_id: i.chartAccountId ?? null,\n stock_unit_id: i.stockUnitId ?? null,\n conversion_factor: i.conversionFactor ?? 1,\n cost_mode: i.costMode ?? 'novo',\n suggested_by: i.suggestedBy ?? null,\n suggestion_confidence: i.suggestionConfidence ?? null,\n shortage_quantity: i.shortageQuantity ?? null,\n shortage_reason: i.shortageReason ?? null,\n shortage_note: i.shortageNote ?? null,\n })),\n p_default_chart_account_id: input.defaultChartAccountId ?? null,\n p_default_location_id: input.defaultLocationId ?? null,\n p_duplicates: input.instalments\n ? input.instalments.map((d) => ({\n index: d.index,\n number: d.number ?? null,\n due_date: d.dueDate ?? null,\n value: d.amount,\n payment_type: d.paymentType ?? null,\n barcode: d.barcode ?? null,\n pix_key: d.pixKey ?? null,\n payment_method_id: d.paymentMethodId ?? null,\n }))\n : null,\n })\n if (error) throw error\n const res = (data ?? {}) as Record<string, unknown>\n return {\n saved: Number(res.saved ?? 0),\n items: Number(res.items ?? 0),\n reconciled: Number(res.reconciled ?? 0),\n }\n}\n\n/**\n * Accept: stock entry and payable, one transaction. `alreadyAccepted` coming\n * back true is not an error — it is the second click, and the RPC is idempotent\n * on the NF-e access key.\n */\n/**\n * Bind the note to its supplier by CNPJ. With `create`, a supplier missing from\n * the registry is created from the note's name and CNPJ — the V1 gesture.\n */\nexport async function linkInboxSupplier(documentId: string, create = false): Promise<{ supplierPartyId: string | null; created: boolean }> {\n const { data, error } = await sb().rpc('fiscalbr_link_inbox_supplier', { p_document_id: documentId, p_create: create })\n if (error) throw error\n const res = (data ?? {}) as Record<string, unknown>\n return { supplierPartyId: (res.supplier_party_id as string) ?? null, created: Boolean(res.created) }\n}\n\nexport async function acceptNote(documentId: string, locationId?: string | null): Promise<AcceptResult> {\n // The payable takes its counterparty from the note, so the supplier is bound\n // (or created) first — otherwise the title is born without one.\n await linkInboxSupplier(documentId, true).catch((e: { code?: string }) => {\n // A pool without migration 020 has no such function; accepting still works there.\n if (e?.code !== 'PGRST202' && e?.code !== '42883') throw e\n })\n const { data, error } = await sb().rpc('fiscalbr_accept_inbox_document', {\n p_document_id: documentId,\n p_location_id: locationId ?? null,\n })\n if (error) throw error\n const res = (data ?? {}) as Record<string, unknown>\n return {\n documentId: String(res.document_id ?? documentId),\n alreadyAccepted: Boolean(res.already_accepted),\n invoiceId: (res.invoice_id as string) ?? null,\n invoiceTotal: Number(res.invoice_total ?? 0),\n instalments: Number(res.installments ?? 0),\n operationId: (res.operation_id as string) ?? null,\n stockLines: Number(res.stock_lines ?? 0),\n }\n}\n\nexport async function rejectNote(documentId: string, reason?: string): Promise<void> {\n const { error } = await sb().rpc('fiscalbr_reject_inbox_document', {\n p_document_id: documentId,\n p_reason: reason ?? null,\n })\n if (error) throw error\n}\n\n// ── Os cadastros que a conciliação precisa ─────────────────────────────────\n\nexport async function searchProducts(term: string, limit = 20): Promise<ProductOption[]> {\n let query = sb().from('products')\n .select('id, name, sku, unit, cost, kind')\n .eq('is_active', true)\n .limit(limit)\n if (term.trim()) query = query.or(`name.ilike.%${term.trim()}%,sku.ilike.%${term.trim()}%`)\n const { data, error } = await query.order('name')\n if (error) throw error\n return (data ?? []).map((p: any) => ({\n id: String(p.id), name: p.name ?? '', sku: p.sku ?? null,\n unit: p.unit ?? null, cost: p.cost == null ? null : Number(p.cost), kind: p.kind ?? null,\n }))\n}\n\n/**\n * O XML autorizado desta nota, como ele chegou.\n *\n * Consulta à parte e não campo do detalhe: são 10–50 KB de texto por nota, e a\n * lista de uma conta grande carregaria megabytes que ninguém abriu. Desce quando\n * alguém clica em baixar.\n */\nexport async function getInboxNoteXml(id: string): Promise<string | null> {\n const { data, error } = await sb().from('plg_fiscalbr_inbox_documents')\n .select('xml_content').eq('id', id).maybeSingle()\n if (error) throw error\n return (data as { xml_content?: string } | null)?.xml_content ?? null\n}\n\n/**\n * Qual nota tem este número, quando ele é único na conta.\n *\n * É o caminho das linhas IMPORTADAS do V1: elas trazem «Entrada via DANFE NF-e\n * 10592» escrito no motivo e não trazem operação nenhuma — o importador copiou o\n * movimento e não o vínculo. Das 3.088 assim, as 3.088 acham a nota aqui.\n *\n * Exige UNICIDADE: número de NF-e repete entre fornecedores, e abrir a nota\n * errada é pior que não abrir nenhuma.\n */\nexport async function findInboxNoteByNumber(nfeNumber: string): Promise<string | null> {\n const n = (nfeNumber ?? '').replace(/\\D/g, '')\n if (!n) return null\n const { data, error } = await sb().from('plg_fiscalbr_inbox_documents')\n .select('id').eq('nfe_number', n).limit(2)\n if (error) throw error\n const linhas = (data ?? []) as Array<{ id: string }>\n return linhas.length === 1 ? linhas[0].id : null\n}\n\n/**\n * Qual nota originou esta operação de estoque.\n *\n * O movimento guarda `operation_id`; a nota guarda `inventory_operation_id`. É o\n * único elo entre o razão do estoque e o documento que o produziu, e é o que\n * permite à linha de Movimentações abrir a NF-e de onde ela veio.\n */\nexport async function findInboxNoteByOperation(operationId: string): Promise<string | null> {\n if (!operationId) return null\n const { data, error } = await sb().from('plg_fiscalbr_inbox_documents')\n .select('id').eq('inventory_operation_id', operationId).limit(1).maybeSingle()\n if (error) throw error\n return (data as { id?: string } | null)?.id ?? null\n}\n\n/** O que a edge function de sugestão devolve. */\nexport interface SuggestNoteItemsResult {\n /** Itens que o modelo deixou PRONTOS — com produto. */\n applied: number\n /** Itens em que ele só soube dizer o tipo: continuam «falta decidir». */\n typedOnly: number\n /** Itens que o índice ligou sozinho, sem modelo (EAN ou de-para). */\n bound: number\n boundByEan: number\n /** Nomes que o modelo propôs para o que não existe no catálogo. */\n newProductNames: string[]\n warnings: string[]\n}\n\n/**\n * Pede a sugestão ao servidor.\n *\n * É edge function e não turno de agente porque o broker de chat recusou a\n * pergunta («Message is too long») e, antes disso, porque um turno de chat tem\n * teto de rodadas, morre na navegação e persiste tudo no histórico de alguém.\n * Ver `functions/fiscalbr-suggest-note-items`.\n *\n * A FUNCTION GRAVA. Ela escreve pela mesma RPC do «Salvar conciliação» (que não\n * marca `reconciled`), então quem chama só precisa recarregar a nota — e a\n * sugestão sobrevive a fechar o modal, que era o buraco da versão anterior.\n *\n * O TENANT VAI NO CORPO, nunca em cabeçalho. É a regra que o console já aplica\n * (ver `isEdgeFunctionCall` em `@fayz-ai/admin/data/client`): a borda declara\n * uma lista fixa de `Access-Control-Allow-Headers`, e um cabeçalho fora da lista\n * faz o NAVEGADOR recusar o preflight e bloquear o POST antes de ele sair — não\n * sobra requisição no log, só um `OPTIONS` sozinho, e quem está usando lê «CORS».\n * Foi assim que vinte funções pararam de uma vez.\n *\n * Do outro lado a function põe `x-fayz-tenant` no PRÓPRIO cliente dela, porque é\n * o PostgREST que lê esse cabeçalho (`app.requested_tenant()`), e ali não há\n * preflight nenhum. Sem isso, quem tem mais de uma conta não tem tenant: o recuo\n * de `app._current_tenant_id_raw()` é «sua única conta», e com dez contas ele\n * devolve NULL — a nota existe, a RLS a esconde, e a tela diz 404.\n */\nexport async function suggestNoteItems(\n documentId: string,\n reevaluate = false,\n): Promise<SuggestNoteItemsResult> {\n const { data, error } = await sb().functions.invoke('fiscalbr-suggest-note-items', {\n body: { documentId, reevaluate, tenantId: getActiveTenantId() ?? null },\n })\n // A function responde `{ok:false,error}` com status 4xx/5xx; o cliente do\n // Supabase embrulha isso num FunctionsHttpError cujo `message` é genérico\n // («non-2xx status code»), então a mensagem útil mora no corpo.\n if (error) {\n const corpo = await (error as { context?: Response }).context?.json?.().catch(() => null)\n throw new Error((corpo as { error?: string } | null)?.error ?? error.message)\n }\n const res = (data ?? {}) as Record<string, unknown>\n if (res.ok === false) throw new Error(String(res.error ?? 'A sugestão falhou.'))\n return {\n applied: Number(res.applied ?? 0),\n typedOnly: Number(res.typedOnly ?? 0),\n bound: Number(res.bound ?? 0),\n boundByEan: Number(res.boundByEan ?? 0),\n newProductNames: Array.isArray(res.newProductNames)\n ? res.newProductNames.filter((n): n is string => typeof n === 'string')\n : [],\n warnings: Array.isArray(res.warnings)\n ? res.warnings.filter((w): w is string => typeof w === 'string')\n : [],\n }\n}\n\n/**\n * Os produtos JÁ VINCULADOS, pelo id.\n *\n * `plg_fiscalbr_inbox_items.product_id` guarda o id e mais nada, e o seletor de\n * produto precisa do NOME para mostrar o que está escolhido. Sem isto a linha\n * abria com o campo vazio sobre um produto vinculado — a tela dizia «conferido»\n * apontando para um campo em branco.\n */\nexport async function listProductsByIds(ids: string[]): Promise<ProductOption[]> {\n if (ids.length === 0) return []\n const { data, error } = await sb().from('products')\n .select('id, name, sku, unit, cost, kind')\n .in('id', ids)\n if (error) throw error\n return (data ?? []).map((p: any) => ({\n id: String(p.id), name: p.name ?? '', sku: p.sku ?? null,\n unit: p.unit ?? null, cost: p.cost == null ? null : Number(p.cost), kind: p.kind ?? null,\n }))\n}\n\nexport async function listMeasurementUnits(): Promise<MeasurementUnitOption[]> {\n const { data, error } = await sb().from('plg_inventory_measurement_units')\n .select('id, name, abbreviation, is_base').eq('is_active', true).order('name')\n if (error) throw error\n return (data ?? []).map((u: any) => ({\n id: String(u.id), name: u.name ?? '', abbreviation: u.abbreviation ?? '',\n isBase: Boolean(u.is_base),\n }))\n}\n\n/**\n * Leaf accounts only. `kind` never existed on this table: PostgREST answered 400\n * to the whole query and the caught error left the picker silently empty.\n */\nexport async function listChartAccounts(): Promise<ChartAccountOption[]> {\n const { data, error } = await sb().from('plg_financial_chart_of_accounts')\n .select('id, code, name, account_type, node_type, parent_id, is_active').order('code')\n if (error) throw error\n const rows = (data ?? []).filter((a: any) => a.is_active !== false)\n const parents = new Set(rows.map((a: any) => a.parent_id).filter(Boolean).map(String))\n return rows\n .filter((a: any) => a.node_type !== 'group' && !parents.has(String(a.id)))\n .map((a: any) => ({\n id: String(a.id), code: a.code ?? '', name: a.name ?? '', kind: a.account_type ?? null,\n }))\n}\n\nexport async function listStockLocations(): Promise<StockLocationOption[]> {\n const { data, error } = await sb().from('plg_inventory_stock_locations')\n .select('id, name, unit_id, is_active').order('name')\n if (error) throw error\n return (data ?? [])\n .filter((l: any) => l.is_active !== false)\n .map((l: any) => ({ id: String(l.id), name: l.name ?? '', unitId: l.unit_id ?? null }))\n}\n\n/**\n * What the supplier catalogue already remembers. The reconciliation screen shows\n * it next to a bound product so the operator can tell a de-para hit from a\n * product that appeared out of nowhere.\n */\nexport async function listSupplierMap(supplierCnpj: string): Promise<Array<{\n supplierProductCode: string; productId: string; hitCount: number; lastUsedAt: string | null\n}>> {\n if (!supplierCnpj) return []\n const { data, error } = await sb().from('plg_fiscalbr_supplier_product_map')\n .select('supplier_product_code, product_id, hit_count, last_used_at')\n .eq('supplier_cnpj', supplierCnpj)\n if (error) throw error\n return (data ?? []).map((m: any) => ({\n supplierProductCode: m.supplier_product_code ?? '',\n productId: String(m.product_id),\n hitCount: Number(m.hit_count ?? 0),\n lastUsedAt: m.last_used_at ?? null,\n }))\n}\n\n// ── Anexos: a casa é `public.documents`, como os do título ───────────────────\n\nexport interface NoteAttachment {\n id: string\n fileName: string\n fileSize?: number\n mimeType?: string\n /** Signed, short-lived. Absent when the bytes cannot be opened from here. */\n url?: string\n createdAt: string\n}\n\nconst NOTE_SUBJECT = 'fiscalbr_inbox_document'\nconst INVOICE_SUBJECT = 'financial_invoice'\n\n/**\n * The note's attachments and, once it has a payable, the payable's — one list,\n * because to the operator the boleto belongs to the purchase, not to a table.\n */\nexport async function listNoteAttachments(noteId: string, invoiceId?: string | null): Promise<NoteAttachment[]> {\n const subjects = [`and(subject_type.eq.${NOTE_SUBJECT},subject_id.eq.${noteId})`]\n if (invoiceId) subjects.push(`and(subject_type.eq.${INVOICE_SUBJECT},subject_id.eq.${invoiceId})`)\n const { data, error } = await sb().from('documents')\n .select('id, file_name, file_size, mime_type, storage_bucket, storage_path, created_at')\n .or(subjects.join(','))\n .eq('is_active', true)\n .order('created_at')\n if (error) throw error\n const rows = (data ?? []) as Array<Record<string, any>>\n // The bucket is private: the stored public URL answers 400, so sign on read.\n const signed = new Map<string, string>()\n const byBucket = new Map<string, string[]>()\n for (const r of rows) {\n if (!r.storage_bucket || !r.storage_path) continue\n byBucket.set(r.storage_bucket, [...(byBucket.get(r.storage_bucket) ?? []), r.storage_path])\n }\n for (const [bucket, paths] of byBucket) {\n const { data: urls } = await sb().storage.from(bucket).createSignedUrls(paths, 60 * 30)\n for (const u of urls ?? []) if (u.path && u.signedUrl) signed.set(u.path, u.signedUrl)\n }\n return rows.map((r) => ({\n id: r.id,\n fileName: r.file_name ?? 'Anexo',\n fileSize: r.file_size ?? undefined,\n mimeType: r.mime_type ?? undefined,\n url: signed.get(r.storage_path) ?? undefined,\n createdAt: r.created_at,\n }))\n}\n\n/** Attach to the payable when it exists, otherwise to the note (moved on accept). */\nexport async function addNoteAttachment(noteId: string, invoiceId: string | null | undefined, file: File): Promise<void> {\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('Conta sem empresa ativa')\n const subjectType = invoiceId ? INVOICE_SUBJECT : NOTE_SUBJECT\n const subjectId = invoiceId ?? noteId\n // The bucket policy only accepts paths under the tenant's own folder.\n const path = `${tenantId}/${subjectType}/${subjectId}/${Date.now()}_${file.name.replace(/[^\\w.\\-]+/g, '_')}`\n const { error: upErr } = await sb().storage.from('attachments').upload(path, file, { contentType: file.type || undefined })\n if (upErr) throw upErr\n const { error } = await sb().from('documents').insert({\n tenant_id: tenantId,\n kind: 'attachment',\n status: 'active',\n subject_type: subjectType,\n subject_id: subjectId,\n file_name: file.name,\n file_size: file.size,\n mime_type: file.type || null,\n storage_provider: 'supabase',\n storage_bucket: 'attachments',\n storage_path: path,\n })\n if (error) {\n await sb().storage.from('attachments').remove([path]).catch(() => {})\n throw error\n }\n}\n\nexport async function removeNoteAttachment(id: string): Promise<void> {\n const { error } = await sb().from('documents').update({ is_active: false }).eq('id', id)\n if (error) throw error\n}\n\n/** After accept the payable exists: what was attached to the note becomes its. */\nexport async function moveNoteAttachmentsToInvoice(noteId: string, invoiceId: string): Promise<void> {\n const { error } = await sb().from('documents')\n .update({ subject_type: INVOICE_SUBJECT, subject_id: invoiceId })\n .eq('subject_type', NOTE_SUBJECT)\n .eq('subject_id', noteId)\n if (error) throw error\n}\n\nexport interface PaymentCode {\n kind: 'barcode' | 'pix'\n code: string\n amount: number | null\n dueDate: string | null\n}\n\n/** Read a boleto barcode or a Pix code off an image/PDF — the V1 automation. */\nexport async function extractPaymentCode(file: File): Promise<PaymentCode | null> {\n const base64 = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => { const r = String(reader.result); resolve(r.slice(r.indexOf(',') + 1)) }\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n const { data, error } = await sb().functions.invoke('fiscalbr-payment-extract', {\n body: { name: file.name, mime: file.type, base64 },\n })\n if (error) {\n let body: any = null\n try { body = await (error as any)?.context?.json?.() } catch { /* keep generic */ }\n throw new Error(body?.error || error.message || 'Falha ao ler o boleto.')\n }\n if (!data?.ok || data.kind === 'none' || !data.code) return null\n const code = String(data.code)\n if (data.kind === 'barcode') {\n const parsed = parseBoleto(code)\n return {\n kind: 'barcode',\n code: code.replace(/\\D/g, ''),\n amount: parsed?.amount ?? (typeof data.amount === 'number' ? data.amount : null),\n dueDate: parsed?.dueDate ?? (data.due_date ?? null),\n }\n }\n return { kind: 'pix', code, amount: typeof data.amount === 'number' ? data.amount : null, dueDate: data.due_date ?? null }\n}\n\n/**\n * Amount and due date straight from a bank boleto's digits, so the instalment\n * does not depend on the model reading the printed value right. Concessionária\n * slips (starting with 8) carry no due-date factor and fall back to the model.\n */\nexport function parseBoleto(raw: string): { amount: number | null; dueDate: string | null } | null {\n const d = raw.replace(/\\D/g, '')\n if (d.startsWith('8')) return null\n let barcode: string\n if (d.length === 44) barcode = d\n else if (d.length === 47) barcode = d.slice(0, 4) + d[32] + d.slice(33, 47) + d.slice(4, 9) + d.slice(10, 20) + d.slice(21, 31)\n else return null\n const factor = Number(barcode.slice(5, 9))\n const cents = Number(barcode.slice(9, 19))\n let dueDate: string | null = null\n if (factor > 0) {\n // FEBRABAN reset the factor at 1000 on 22/02/2025 (it hit 9999 the day before).\n const base = factor >= 1000 && Date.now() >= Date.UTC(2025, 1, 22)\n ? Date.UTC(2025, 1, 22) - 1000 * 86400000\n : Date.UTC(1997, 9, 7)\n dueDate = new Date(base + factor * 86400000).toISOString().slice(0, 10)\n }\n return { amount: cents > 0 ? cents / 100 : null, dueDate }\n}\n\nexport interface InboxIntakeHealth {\n /** CNPJs that should receive notes from SEFAZ and are not. */\n stalled: number\n /** Last time any of them received, for \"não chegam desde…\". */\n since: string | null\n /** When the A1 certificate expired, if that is the reason. */\n certificateExpiredAt: string | null\n /** The provider's own words, when the reason is something else. */\n error: string | null\n /** A unit of the affected CNPJ, whose tax settings take the new certificate. */\n unitId: string | null\n}\n\nconst STALE_AFTER_MS = 24 * 60 * 60 * 1000\n\n/** Parses \"Certificado vencido em: 02/10/2026 10:16:00\" from the provider's error. */\nfunction expiryFromError(error: string | null): string | null {\n const m = error?.match(/vencido em:?\\s*(\\d{2})\\/(\\d{2})\\/(\\d{4})/i)\n return m ? `${m[3]}-${m[2]}-${m[1]}` : null\n}\n\n/** Whether automatic intake from SEFAZ is working for this account, and why not. Null when it is. */\nexport async function getInboxIntakeHealth(): Promise<InboxIntakeHealth | null> {\n const { data, error } = await sb().from('plg_fiscalbr_emitter_settings')\n .select('legal_entity_id, dfe_sync_enabled, dfe_last_sync_at, dfe_last_error, certificate_expires_at')\n .eq('dfe_sync_enabled', true)\n if (error) throw error\n const now = Date.now()\n const stalled = (data ?? []).filter((r: any) => {\n const expired = r.certificate_expires_at && Date.parse(r.certificate_expires_at) < now\n const stale = !r.dfe_last_sync_at || now - Date.parse(r.dfe_last_sync_at) > STALE_AFTER_MS\n return expired || stale || Boolean(r.dfe_last_error)\n })\n if (stalled.length === 0) return null\n const since = stalled.map((r: any) => r.dfe_last_sync_at as string | null).filter(Boolean).sort()[0] ?? null\n const withError = stalled.find((r: any) => r.dfe_last_error)\n const certificateExpiredAt = stalled\n .map((r: any) => (r.certificate_expires_at && Date.parse(r.certificate_expires_at) < now\n ? (r.certificate_expires_at as string)\n : expiryFromError(r.dfe_last_error)))\n .find(Boolean) ?? null\n const target = stalled.find((r: any) => r.certificate_expires_at && Date.parse(r.certificate_expires_at) < now)\n ?? withError ?? stalled[0]\n const { data: unit } = await sb().from('v_unit_company_legal_entities')\n .select('unit_id').eq('company_legal_entity_id', target.legal_entity_id).limit(1).maybeSingle()\n return { stalled: stalled.length, since, certificateExpiredAt, error: withError?.dfe_last_error ?? null, unitId: unit?.unit_id ?? null }\n}\n\nexport interface SyncNewNotesResult {\n added: number\n /** Delivered by SEFAZ only as a summary (not manifested yet) or still being fetched. */\n waiting: number\n failed: number\n}\n\n/**\n * Brings in the notes SEFAZ delivered since the newest one here: the server lists\n * the access keys, and each missing one goes through `pullNoteByKey` — the same\n * path as «Puxar por chave», so nothing here bypasses its permissions.\n */\nexport async function syncNewNotes(max = 25): Promise<SyncNewNotesResult> {\n const { data: newest } = await sb().from('plg_fiscalbr_inbox_documents')\n .select('issue_date').order('issue_date', { ascending: false }).limit(1).maybeSingle()\n // Two days of overlap: SEFAZ indexes some notes a day after they are issued.\n const since = newest?.issue_date\n ? new Date(Date.parse(newest.issue_date) - 2 * 86_400_000).toISOString().slice(0, 10)\n : undefined\n const { data, error } = await sb().functions.invoke('fiscalbr-dfe-pull', {\n body: { action: 'list', since, tenantId: getActiveTenantId() ?? null },\n })\n if (error) {\n let body: any = null\n try { body = await (error as any)?.context?.json?.() } catch { /* generic below */ }\n throw new PullByKeyError(body?.error || error.message || 'Falha ao falar com a SEFAZ.', body?.code)\n }\n const listed = (data?.notes ?? []) as Array<{ key: string; legalEntityId: string }>\n if (listed.length === 0) return { added: 0, waiting: 0, failed: (data?.failures ?? []).length }\n\n const keys = [...new Set(listed.map((n) => n.key))]\n const { data: known } = await sb().from('plg_fiscalbr_inbox_documents').select('access_key').in('access_key', keys)\n const have = new Set((known ?? []).map((r: any) => r.access_key as string))\n const missing = listed.filter((n, i) => !have.has(n.key) && listed.findIndex((m) => m.key === n.key) === i).slice(0, max)\n\n const result: SyncNewNotesResult = { added: 0, waiting: 0, failed: (data?.failures ?? []).length }\n for (const n of missing) {\n try {\n const r = await pullNoteByKey(n.key, { legalEntityId: n.legalEntityId })\n if (r.status === 'staged') result.added++\n else result.waiting++\n } catch (e) {\n if (e instanceof PullByKeyError && (e.code === 'summary_only' || e.code === 'throttled')) result.waiting++\n else result.failed++\n }\n }\n return result\n}\n\n/** Each product's stock unit (inventory details), for prefilling the note's lines. */\nexport async function listProductStockUnits(productIds: string[]): Promise<Map<string, string>> {\n if (productIds.length === 0) return new Map()\n const { data, error } = await sb().from('plg_inventory_product_details')\n .select('product_id, measurement_unit_id').in('product_id', productIds).not('measurement_unit_id', 'is', null)\n if (error) throw error\n return new Map((data ?? []).map((r: any) => [String(r.product_id), String(r.measurement_unit_id)]))\n}\n","import { formatCurrency } from '@fayz-ai/core'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { FileText, Image as ImageIcon, Loader2, Paperclip, ScanLine, Trash2, UploadCloud } from 'lucide-react'\nimport { Button, Card, Hint } from '@fayz-ai/ui'\nimport {\n addNoteAttachment, extractPaymentCode, listNoteAttachments, removeNoteAttachment,\n type InstalmentInput, type NoteAttachment, type PaymentCode,\n} from '../data/inbox'\n\nconst MAX_BYTES = 15 * 1024 * 1024\nconst money = (v: number) => formatCurrency(v || 0)\nconst day = (iso: string | null) => (iso ? iso.slice(0, 10).split('-').reverse().join('/') : '—')\nconst size = (b?: number) => (!b ? '' : b < 1024 * 1024 ? `${Math.max(1, Math.round(b / 1024))} KB` : `${(b / 1024 / 1024).toFixed(1)} MB`)\n\n/**\n * Put a read payment code on the instalment it belongs to: the empty one with\n * the same amount, else the first empty one, else a new instalment. Never\n * overwrites a code already there.\n */\nexport function applyPaymentCode(list: InstalmentInput[], code: PaymentCode): { next: InstalmentInput[]; index: number } {\n const field = code.kind === 'pix' ? 'pixKey' : 'barcode'\n const free = list.map((p, i) => ({ p, i })).filter(({ p }) => !p[field])\n const sameAmount = code.amount != null ? free.find(({ p }) => Math.abs((Number(p.amount) || 0) - code.amount!) < 0.01) : undefined\n const target = sameAmount ?? free[0]\n const patch = (p: InstalmentInput): InstalmentInput => ({\n ...p,\n [field]: code.code,\n paymentType: code.kind === 'pix' ? 'pix' : 'boleto',\n dueDate: p.dueDate || code.dueDate,\n amount: Number(p.amount) > 0 ? p.amount : (code.amount ?? 0),\n })\n if (target) return { next: list.map((p, i) => (i === target.i ? patch(p) : p)), index: target.i }\n const fresh = patch({ index: list.length, amount: 0 })\n return { next: [...list, fresh], index: list.length }\n}\n\nexport function NoteAttachmentsCard({ noteId, invoiceId, readOnly, instalments, onInstalments }: {\n noteId: string\n invoiceId?: string | null\n readOnly?: boolean\n instalments: InstalmentInput[]\n onInstalments: (next: InstalmentInput[]) => void\n}) {\n const input = useRef<HTMLInputElement>(null)\n const [items, setItems] = useState<NoteAttachment[] | null>(null)\n const [busy, setBusy] = useState<string | null>(null)\n const [over, setOver] = useState(false)\n const [confirming, setConfirming] = useState<string | null>(null)\n const [messages, setMessages] = useState<Array<{ tone: 'ok' | 'warn' | 'error'; text: string }>>([])\n // The latest instalments, so several files read in sequence each see the previous fill.\n const current = useRef(instalments)\n current.current = instalments\n\n const load = useCallback(async () => {\n try { setItems(await listNoteAttachments(noteId, invoiceId)) } catch { setItems([]) }\n }, [noteId, invoiceId])\n useEffect(() => { void load() }, [load])\n\n const upload = async (files: File[]) => {\n const out: typeof messages = []\n for (const file of files) {\n if (!(file.type.startsWith('image/') || file.type === 'application/pdf') || file.size > MAX_BYTES) {\n out.push({ tone: 'error', text: `${file.name}: envie imagem ou PDF de até 15 MB.` })\n continue\n }\n setBusy(`Anexando ${file.name}…`)\n try {\n await addNoteAttachment(noteId, invoiceId, file)\n } catch (e) {\n out.push({ tone: 'error', text: `${file.name}: ${e instanceof Error ? e.message : String(e)}` })\n continue\n }\n if (readOnly) continue\n setBusy(`Lendo ${file.name}…`)\n try {\n const code = await extractPaymentCode(file)\n if (!code) {\n out.push({ tone: 'warn', text: `${file.name}: anexado. Não achei código de boleto nem Pix nele.` })\n } else {\n const { next, index } = applyPaymentCode(current.current, code)\n current.current = next\n onInstalments(next)\n const p = next[index]\n out.push({\n tone: 'ok',\n text: `${code.kind === 'pix' ? 'Pix' : 'Boleto'} lido → parcela ${index + 1}: ${money(Number(p.amount) || 0)}, vence ${day(p.dueDate ?? null)}. Confira e salve.`,\n })\n }\n } catch (e) {\n out.push({ tone: 'warn', text: `${file.name}: anexado, mas não consegui ler o código (${e instanceof Error ? e.message : String(e)}).` })\n }\n }\n setBusy(null)\n setMessages(out)\n await load()\n }\n\n const remove = async (a: NoteAttachment) => {\n setBusy(`Removendo ${a.fileName}…`)\n try {\n await removeNoteAttachment(a.id)\n setMessages([{ tone: 'ok', text: `${a.fileName} removido.` }])\n } catch (e) {\n setMessages([{ tone: 'error', text: `${a.fileName}: ${e instanceof Error ? e.message : String(e)}` }])\n } finally {\n setBusy(null)\n await load()\n }\n }\n\n return (\n <Card className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Anexos da conta</h3>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Boleto, comprovante, foto da nota. Boleto e Pix anexados são lidos e preenchem a parcela.\n </p>\n </div>\n {items && items.length > 0 && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{items.length} {items.length === 1 ? 'anexo' : 'anexos'}</span>\n )}\n </div>\n\n {items === null ? (\n <div className=\"mt-3 h-10 animate-pulse rounded-md bg-muted\" />\n ) : items.length > 0 && (\n <ul className=\"mt-3 divide-y rounded-md border\">\n {items.map((a) => (\n <li key={a.id} className=\"flex items-center gap-2 px-3 py-2 text-sm\">\n {a.mimeType?.startsWith('image/')\n ? <ImageIcon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n : <FileText className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />}\n {a.url\n ? <a href={a.url} target=\"_blank\" rel=\"noreferrer\" className=\"min-w-0 flex-1 truncate hover:underline\">{a.fileName}</a>\n : <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">{a.fileName}</span>}\n {confirming === a.id ? (\n // Inline, not a dialog: this card already lives inside a modal.\n <span className=\"flex shrink-0 items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">Remover?</span>\n <Button variant=\"destructive\" size=\"sm\" onClick={() => { setConfirming(null); void remove(a) }}>Remover</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setConfirming(null)}>Cancelar</Button>\n </span>\n ) : (\n <>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{size(a.fileSize)}</span>\n <Hint label=\"Remover anexo\">\n <Button variant=\"ghost\" size=\"icon\" aria-label={`Remover ${a.fileName}`} disabled={!!busy} onClick={() => setConfirming(a.id)}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </Hint>\n </>\n )}\n </li>\n ))}\n </ul>\n )}\n\n <div\n className={`mt-3 flex flex-col items-center gap-1 rounded-md border border-dashed px-4 py-5 text-center transition-colors ${over ? 'border-primary bg-primary/5' : 'border-input'}`}\n onDragOver={(e) => { e.preventDefault(); setOver(true) }}\n onDragLeave={() => setOver(false)}\n onDrop={(e) => { e.preventDefault(); setOver(false); void upload(Array.from(e.dataTransfer.files)) }}\n >\n {busy ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\"><Loader2 className=\"h-4 w-4 animate-spin\" />{busy}</p>\n ) : (\n <>\n <UploadCloud className=\"h-6 w-6 text-muted-foreground\" aria-hidden />\n <p className=\"text-sm\">Arraste o boleto ou o comprovante aqui</p>\n <div className=\"mt-1 flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => input.current?.click()} data-testid=\"note-attach\">\n <Paperclip className=\"mr-1.5 h-4 w-4\" />\n Anexar arquivo\n </Button>\n </div>\n {!readOnly && (\n <p className=\"mt-1 flex items-center gap-1 text-[11px] text-muted-foreground\">\n <ScanLine className=\"h-3 w-3\" aria-hidden /> o código de barras e o Pix são lidos sozinhos\n </p>\n )}\n </>\n )}\n <input\n ref={input}\n type=\"file\"\n multiple\n accept=\"image/*,application/pdf\"\n className=\"hidden\"\n onChange={(e) => { void upload(Array.from(e.target.files ?? [])); e.target.value = '' }}\n />\n </div>\n\n {messages.length > 0 && (\n <ul className=\"mt-3 space-y-1\">\n {messages.map((m, i) => (\n <li\n key={i}\n className={`text-xs ${m.tone === 'ok' ? 'text-success-soft-foreground' : m.tone === 'warn' ? 'text-warning-soft-foreground' : 'text-destructive'}`}\n >\n {m.text}\n </li>\n ))}\n </ul>\n )}\n </Card>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { KeyRound, Loader2 } from 'lucide-react'\nimport {\n Button, Input, Modal, ModalBody, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@fayz-ai/ui'\nimport { pullNoteByKey, PullByKeyError, type PullCnpjOption, type PullByKeyResult } from '../data/inbox'\n\nconst formatCnpj = (d: string) => `${d.slice(0, 2)}.${d.slice(2, 5)}.${d.slice(5, 8)}/${d.slice(8, 12)}-${d.slice(12)}`\n\n/** Groups of four, the way the key is printed on the DANFE, so a typo is findable by eye. */\nconst groupKey = (digits: string) => digits.replace(/(\\d{4})(?=\\d)/g, '$1 ')\n\nexport interface PullByKeyDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n unitId?: string | null\n /** Opens with this key already typed, for a note that is already on screen. */\n initialKey?: string\n /** Called after a note was staged, with what the parser found. */\n onPulled: (result: Extract<PullByKeyResult, { status: 'staged' }>) => void\n}\n\nexport function PullByKeyDialog({ open, onOpenChange, unitId, initialKey, onPulled }: PullByKeyDialogProps) {\n const [value, setValue] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [cnpjOptions, setCnpjOptions] = useState<PullCnpjOption[] | null>(null)\n const [legalEntityId, setLegalEntityId] = useState('')\n\n useEffect(() => {\n if (open) { if (initialKey) setValue(initialKey); return }\n setValue(''); setError(null); setNotice(null); setCnpjOptions(null); setLegalEntityId('')\n }, [open, initialKey])\n\n const digits = value.replace(/\\D/g, '').slice(0, 44)\n const needsCnpj = !!cnpjOptions && !legalEntityId\n const blocked = digits.length !== 44\n ? `Faltam ${44 - digits.length} dígitos`\n : needsCnpj ? 'Escolha o CNPJ' : null\n\n const pull = async () => {\n setBusy(true); setError(null); setNotice(null)\n try {\n const result = await pullNoteByKey(digits, { legalEntityId: legalEntityId || undefined, unitId })\n if (result.status === 'pending') { setNotice(result.message); return }\n onPulled(result)\n onOpenChange(false)\n } catch (e) {\n if (e instanceof PullByKeyError && e.code === 'choose_cnpj' && e.options?.length) {\n setCnpjOptions(e.options)\n setError(null)\n return\n }\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!busy) onOpenChange(o) }}>\n <ModalContent size=\"md\">\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2\">\n <KeyRound className=\"h-5 w-5\" aria-hidden />\n Puxar NF-e por chave de acesso\n </ModalTitle>\n <ModalDescription>\n Para baixar uma nota que não veio na coleta automática (por exemplo, emitida antes de ligar o\n recebimento de DANFes). Cole a chave de acesso de 44 dígitos.\n </ModalDescription>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n <Input\n value={groupKey(digits)}\n onChange={(e) => { setValue(e.target.value); setError(null); setNotice(null) }}\n onKeyDown={(e) => { if (e.key === 'Enter' && !blocked && !busy) void pull() }}\n placeholder=\"0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000\"\n inputMode=\"numeric\"\n autoFocus\n className=\"font-mono tabular-nums\"\n aria-label=\"Chave de acesso\"\n data-testid=\"pull-by-key-input\"\n />\n <p className={`text-xs tabular-nums ${digits.length === 44 ? 'text-success-soft-foreground' : 'text-muted-foreground'}`}>\n {digits.length}/44 dígitos\n </p>\n\n {cnpjOptions && (\n <div className=\"space-y-1.5\">\n <p className=\"text-sm font-medium\">De qual CNPJ é esta nota?</p>\n <Select value={legalEntityId} onValueChange={setLegalEntityId}>\n <SelectTrigger><SelectValue placeholder=\"Escolha o CNPJ destinatário\" /></SelectTrigger>\n <SelectContent>\n {cnpjOptions.map((o) => (\n <SelectItem key={o.id} value={o.id}>{o.name} · {formatCnpj(o.cnpj)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {error && <p className=\"rounded-md bg-destructive/10 px-3 py-2 text-sm text-destructive\" role=\"alert\">{error}</p>}\n {notice && <p className=\"rounded-md bg-warning-soft px-3 py-2 text-sm text-warning-soft-foreground\" role=\"status\">{notice}</p>}\n\n <p className=\"text-xs text-muted-foreground\">\n Puxar não manifesta a nota na SEFAZ — a manifestação continua sendo feita no sistema antigo.\n </p>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={busy}>Cancelar</Button>\n <Button onClick={() => { void pull() }} disabled={busy || !!blocked} data-testid=\"pull-by-key-submit\">\n {busy ? <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-4 w-4\" />}\n {busy ? 'Buscando na SEFAZ…' : blocked ?? 'Puxar nota'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","/** The preview contract deliberately excludes production emission. */\nexport type PlugNotasEnvironment = 'sandbox' | 'homologation'\nexport type PlugNotasDocumentStatus = 'draft' | 'processing' | 'issued' | 'cancelled' | 'error'\n\nexport interface PlugNotasSetupState {\n emitterCnpj: string\n environment: PlugNotasEnvironment\n certificateReady: boolean\n cscReady: boolean\n providerEmitterId?: string\n certificateExpiresAt?: string\n certificateFingerprint?: string\n}\n\nexport interface PlugNotasDocumentResult {\n status: PlugNotasDocumentStatus\n providerDocumentId?: string\n integrationId?: string\n number?: string\n series?: string\n accessKey?: string\n message?: string\n}\n\nexport interface PlugNotasFiscalGateway {\n issue(input: { notaId: string; idempotencyKey: string }): Promise<PlugNotasDocumentResult>\n refresh(input: { notaId: string }): Promise<PlugNotasDocumentResult>\n cancel(input: { notaId: string; reason: string }): Promise<PlugNotasDocumentResult>\n artifact(input: {\n notaId: string\n kind: 'xml' | 'pdf' | 'cancellation_xml'\n }): Promise<{ url: string }>\n}\n\nexport interface PlugNotasConnectorClient {\n testEmitter?(input: {\n emitterCnpj: string\n environment: PlugNotasEnvironment\n }): Promise<{ ok: boolean; message?: string }>\n disconnectEmitter?(): Promise<void>\n}\n\nexport interface PlugNotasFinancialProviderOptions {\n base: import('@fayz-ai/financial/data/provider').FinancialDataProvider\n gateway: PlugNotasFiscalGateway\n}\n\n// ---------------------------------------------------------------------------\n// Entrada de Notas — a nota que o fornecedor emitiu contra o CNPJ da casa.\n// ---------------------------------------------------------------------------\n// Dois estados, e eles NÃO respondem à mesma pergunta. `reconciledCount/itemCount`\n// diz quantos itens já sabem a que produto correspondem; `stockedAt` diz se a\n// entrada aconteceu. No V1 havia 55 notas conciliadas e nunca estocadas — uma\n// coluna de \"status\" só teria escondido as 55.\n\n/** Os cinco tipos de registro do V1, medidos em 3.402 linhas de produção. */\nexport type InboxEntryType = 'insumo' | 'revenda' | 'patrimonio' | 'uso_consumo' | 'despesa' | 'servico'\n\n/** Despesa e serviço nunca viram estoque: viram só título a pagar. */\nexport const STOCK_BEARING_ENTRY_TYPES: readonly InboxEntryType[] = ['insumo', 'revenda', 'patrimonio', 'uso_consumo']\n\nexport const isStockBearing = (type: string | null | undefined): boolean =>\n STOCK_BEARING_ENTRY_TYPES.includes(type as InboxEntryType)\n\nexport type InboxCostMode = 'novo' | 'media'\n\nexport type InboxStatusFilter = 'all' | 'pending' | 'stocked' | 'rejected' | 'manifest_error'\n\nexport interface InboxNote {\n id: string\n accessKey: string\n number: string\n series: string\n issueDate: string | null\n receivedAt: string | null\n status: string\n manifestationStatus: string | null\n manifestedAt: string | null\n manifestationAttempts: number\n natureOperation: string | null\n supplierName: string\n supplierCnpj: string | null\n supplierPartyId: string | null\n /** O total declarado na NOTA. */\n total: number\n itemCount: number\n reconciledCount: number\n instalmentCount: number\n /** A soma das PARCELAS — é com este total que o título nasce (financial/084). */\n instalmentTotal: number\n invoiceId: string | null\n operationId: string | null\n stockedAt: string | null\n documentId: string | null\n /** O XML está guardado nesta nota. Falso nas importadas antes da migration 016. */\n hasXml: boolean\n unitId: string | null\n}\n\nexport interface InboxItem {\n id: string\n itemNumber: number\n supplierProductCode: string\n eanBarcode: string | null\n description: string\n ncm: string | null\n cest: string | null\n cfop: string | null\n unit: string | null\n quantity: number\n unitPrice: number\n total: number\n /**\n * `uTrib`/`qTrib` do XML — a unidade e a quantidade TRIBUTÁVEIS.\n *\n * É a evidência mais forte que existe para o fator de conversão, e ela já\n * estava no banco: 558 dos 3.691 itens têm unidade tributável diferente da\n * comercial. «4 CX» com `qTrib` 88,224 KG diz que a caixa tem 22,056 kg — e o\n * caso Artorius (carne a R$ 397/kg) foi exatamente esta conta não ter sido\n * feita. Ver `taxableFactor`.\n */\n unitTaxable: string | null\n quantityTaxable: number | null\n discount: number | null\n icmsCst: string | null\n icmsCsosn: string | null\n icmsValue: number | null\n productId: string | null\n entryType: string | null\n chartAccountId: string | null\n stockUnitId: string | null\n conversionFactor: number\n /** Quantidade × fator, menos a falta. É o número que a tela mostra ANTES de aceitar. */\n stockQuantity: number\n costMode: string\n unitCostNew: number | null\n reconciled: boolean\n /**\n * Quem escreveu a decisão desta linha. `null` é «uma pessoa escolheu», e é o\n * caso que importa: igualdade (`ean`, `supplier_map`) e semelhança (`ai`) não\n * se conferem do mesmo jeito que uma escolha humana. Ver a migration 013.\n */\n suggestedBy: 'ai' | 'ean' | 'supplier_map' | null\n /** 0..1, só quando `suggestedBy === 'ai'`. Abaixo de 0,6 a tela pede conferência. */\n suggestionConfidence: number | null\n stockMovementId: string | null\n shortageQuantity: number | null\n shortageReason: string | null\n shortageNote: string | null\n}\n\nexport interface InboxInstalment {\n id: string\n index: number\n number: string | null\n dueDate: string | null\n amount: number\n paymentType: string | null\n barcode: string | null\n pixKey: string | null\n paymentMethodId: string | null\n}\n\nexport interface InboxNoteDetail extends InboxNote {\n defaultChartAccountId: string | null\n defaultLocationId: string | null\n items: InboxItem[]\n instalments: InboxInstalment[]\n /** `pag > detPag` do XML: o que o fornecedor DECLAROU, não o que se decidiu. */\n declaredPayments: Array<{ index: number; code: string | null; label: string | null; value: number }>\n}\n\nexport interface StageResult {\n documentId: string\n accessKey: string\n alreadyAccepted: boolean\n supplierPartyId: string | null\n itemCount: number\n /** Quantos itens o de-para do fornecedor já vinculou sozinho. */\n matchedCount: number\n}\n\nexport interface AcceptResult {\n documentId: string\n /** `true` é o segundo clique, não um erro: a RPC é idempotente na chave de acesso. */\n alreadyAccepted: boolean\n invoiceId: string | null\n invoiceTotal: number\n instalments: number\n operationId: string | null\n stockLines: number\n}\n\nexport interface ProductOption {\n id: string\n name: string\n sku: string | null\n unit: string | null\n cost: number | null\n kind: string | null\n}\n\n/**\n * Um candidato a produto para uma linha da nota, com o motivo de ter aparecido.\n *\n * Devolvido pela RPC `fiscalbr_match_product_candidates` (migration 012) e lido\n * DENTRO da edge function de sugestão — o cliente não chama essa RPC, porque quem\n * decide o que fazer com `reason` é quem monta a pergunta ao modelo.\n *\n * O motivo é a parte que importa: `ean` e `supplier_map` são igualdade — liga e\n * pronto. `text` é semelhança, e semelhança se confere.\n */\nexport interface ProductMatch {\n /** O id do item da nota que originou a busca. */\n ref: string\n productId: string\n name: string\n sku: string | null\n unit: string | null\n cost: number | null\n score: number\n reason: 'supplier_map' | 'ean' | 'text'\n}\n\nexport interface MeasurementUnitOption {\n id: string\n name: string\n abbreviation: string\n isBase: boolean\n}\n\nexport interface ChartAccountOption {\n id: string\n code: string\n name: string\n kind: string | null\n}\n\nexport interface StockLocationOption {\n id: string\n name: string\n unitId: string | null\n}\n","// ---------------------------------------------------------------------------\n// Conciliação — onde a nota do fornecedor vira estoque e dinheiro.\n// ---------------------------------------------------------------------------\n// Os quatro blocos do V1, na mesma ordem: situação fiscal · itens · pagamento ·\n// anexos. O que mudou de forma, e por quê:\n//\n// O V1 põe isto num DIÁLOGO, e é o que esta tela faz de novo (`chrome='modal'`):\n// quem fecha a nota tem de CAIR DE VOLTA onde estava na lista — mesmo recorte,\n// mesma busca, mesma rolagem — e uma subpágina desmontava a lista inteira para\n// remontá-la depois com o filtro no estado inicial.\n//\n// O que fez o diálogo do V1 ser ruim era rolagem dentro de rolagem com o\n// «Aceitar» escondido atrás do rodapé. Aqui o modal rola num lugar só (o corpo)\n// e o rodapé é `sticky` DENTRO dele, então o gesto mais importante da tela nunca\n// sai de vista. `chrome='page'` continua existindo para quem abre a nota por\n// deep link em tela cheia.\n//\n// A regra que a tela existe para cumprir: a **Qtd estoque (calc.)** muda na tela\n// ANTES de aceitar. O FLOW.md do V1 diz que fator de conversão errado é\n// silencioso e que esse número é a única defesa.\n// ---------------------------------------------------------------------------\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { AlertTriangle, Check, ChevronDown, ChevronRight, Download, FileCode2, FileDown, FileText, Gift, Loader2, Plus, RefreshCw, Trash2, UserPlus, X } from 'lucide-react'\nimport { formatCurrency } from '@fayz-ai/core'\nimport { PersonLink } from '@fayz-ai/admin'\nimport { NoteAttachmentsCard } from './NoteAttachmentsCard'\nimport { PullByKeyDialog } from './PullByKeyDialog'\nimport {\n EmBreve, AiActionButton, Button, Card, InlineLink, Input, SearchSelect, Skeleton, SubpageHeader, DatePicker, Hint,\n ModalBody, ModalFooter, ModalHeader, ModalTitle, Dropdown, DropdownContent, DropdownItem, DropdownTrigger,\n} from '@fayz-ai/ui'\nimport {\n getInboxNote, saveNoteDecision, acceptNote, rejectNote,\n searchProducts, listProductsByIds, listMeasurementUnits, listChartAccounts, listStockLocations,\n suggestNoteItems, getInboxNoteXml, stageNoteFromXml, fillInboxLines, healInboxNote, listProductStockUnits, getNotePayable, getInboxNotePdf, linkInboxSupplier, moveNoteAttachmentsToInvoice,\n type ItemDecisionInput, type InstalmentInput, type NotePayable,\n} from '../data/inbox'\nimport type { SearchSelectOption } from '@fayz-ai/ui'\nimport type {\n InboxNoteDetail, InboxItem, InboxEntryType, ProductMatch,\n MeasurementUnitOption, ChartAccountOption, StockLocationOption, AcceptResult,\n} from '../types'\nimport { isStockBearing } from '../types'\nimport { packagingCount } from '../lib/note-suggestion'\n\nconst money = (v: number) => formatCurrency(v || 0, 'BRL')\nconst qty = (v: number) => new Intl.NumberFormat('pt-BR', { maximumFractionDigits: 4 }).format(v || 0)\nconst day = (iso: string | null | undefined) => (iso ? iso.slice(0, 10).split('-').reverse().join('/') : '—')\n\n// O vocabulário é o do V1, e a ordem é a de uso: insumo é 2.303 das 3.402 linhas.\nconst ENTRY_TYPES: Array<{ value: InboxEntryType; label: string; hint?: string }> = [\n { value: 'insumo', label: 'Insumo' },\n { value: 'revenda', label: 'Produto Revenda' },\n { value: 'patrimonio', label: 'Patrimônio' },\n { value: 'uso_consumo', label: 'Uso e Consumo', hint: 'com estoque' },\n { value: 'despesa', label: 'Despesa', hint: 'não vira estoque' },\n { value: 'servico', label: 'Serviço', hint: 'não vira estoque' },\n]\n\n/** O estado editável de uma linha. Espelha `ItemDecisionInput`, mais o que a tela calcula. */\ninterface Draft {\n productId: string | null\n productLabel: string\n entryType: InboxEntryType | null\n chartAccountId: string | null\n stockUnitId: string | null\n conversionFactor: string\n costMode: 'novo' | 'media'\n shortageQuantity: string\n /** Quem escreveu esta linha. `null` = uma pessoa. Ver a migration 013. */\n suggestedBy: 'ai' | 'ean' | 'supplier_map' | null\n suggestionConfidence: number | null\n}\n\n/**\n * `SearchSelect` não tem prop `options`: ele é sempre dirigido por busca — o que é\n * a escolha certa para produto (o catálogo tem 171) e continua servindo para as\n * listas curtas (plano de contas, unidade, local), filtrando em memória.\n */\nconst localSearch = (options: SearchSelectOption[]) => (query: string): SearchSelectOption[] => {\n const q = query.trim().toLowerCase()\n return (q ? options.filter((o) => o.label.toLowerCase().includes(q)) : options).slice(0, 40)\n}\n\nconst labelOf = (options: SearchSelectOption[], id: string | null | undefined) =>\n options.find((o) => o.id === id)?.label\n\n// The note's commercial unit, as the unit code a tenant registers ('KG' → 'kg').\n// Packaging (CX, FD…) is not a stock unit; the factor check handles those.\nconst NOTE_UNIT_CODES: Record<string, string> = {\n KG: 'kg', KGS: 'kg', KILO: 'kg', QUILO: 'kg', G: 'g', GR: 'g', GRS: 'g',\n L: 'l', LT: 'l', LTS: 'l', LITRO: 'l', ML: 'ml',\n UN: 'un', UND: 'un', UNID: 'un', UNI: 'un', UNIDADE: 'un',\n}\n\n/** The stock unit a line should get when nobody chose one: the product's, else the note's. */\nfunction suggestedStockUnit(\n item: InboxItem, units: MeasurementUnitOption[], productUnits: Map<string, string>, productId: string | null,\n): string | null {\n const fromProduct = productId ? productUnits.get(productId) : undefined\n if (fromProduct && units.some((u) => u.id === fromProduct)) return fromProduct\n if (packagingCount(item.unit) !== null) return null\n const code = NOTE_UNIT_CODES[String(item.unit ?? '').trim().toUpperCase().replace(/\\d+$/, '')]\n return code ? units.find((u) => u.abbreviation.toLowerCase() === code)?.id ?? null : null\n}\n\nconst draftOf = (item: InboxItem): Draft => ({\n productId: item.productId,\n productLabel: '',\n entryType: (item.entryType as InboxEntryType) ?? null,\n chartAccountId: item.chartAccountId,\n stockUnitId: item.stockUnitId,\n conversionFactor: String(item.conversionFactor ?? 1),\n costMode: (item.costMode === 'media' ? 'media' : 'novo'),\n shortageQuantity: item.shortageQuantity == null ? '' : String(item.shortageQuantity),\n // Vem do SERVIDOR: é o que faz o selo sobreviver a recarregar a página.\n suggestedBy: item.suggestedBy,\n suggestionConfidence: item.suggestionConfidence,\n})\n\nexport interface NoteReconcileViewProps {\n noteId: string\n onBack: () => void\n /** Onde o título a pagar abre depois de aceitar. O host sabe a rota; esta tela não. */\n onOpenInvoice?: (invoiceId: string) => void\n /**\n * `modal` quando o anfitrião já desenhou a moldura (título e fechar): o\n * cabeçalho de subpágina sai, porque dois títulos na mesma caixa é o defeito\n * que o `page-header-no-duplicate-title` descreve.\n */\n chrome?: 'page' | 'modal'\n}\n\nexport function NoteReconcileView({ noteId, onBack, onOpenInvoice, chrome = 'page' }: NoteReconcileViewProps) {\n const emModal = chrome === 'modal'\n /** O rodapé encosta nas bordas da caixa que o contém, e ela tem padding diferente. */\n const sangria = emModal ? '-mx-6 px-6' : '-mx-4 px-4'\n const cabecalho = (titulo: string) =>\n emModal ? null : <SubpageHeader title={titulo} onBack={onBack} parentLabel=\"Manifesto de Notas\" />\n const [note, setNote] = useState<InboxNoteDetail | null>(null)\n const [loading, setLoading] = useState(true)\n const [drafts, setDrafts] = useState<Record<string, Draft>>({})\n const [instalments, setInstalments] = useState<InstalmentInput[]>([])\n const [defaultAccount, setDefaultAccount] = useState<string | null>(null)\n const [location, setLocation] = useState<string | null>(null)\n const [units, setUnits] = useState<MeasurementUnitOption[]>([])\n const [productUnits, setProductUnits] = useState<Map<string, string>>(() => new Map())\n const [accounts, setAccounts] = useState<ChartAccountOption[]>([])\n const [locations, setLocations] = useState<StockLocationOption[]>([])\n const [saving, setSaving] = useState(false)\n const [accepting, setAccepting] = useState(false)\n // One item open at a time: 11 expanded rows bury the one still missing a decision.\n const [openIds, setOpenIds] = useState<string[]>([])\n const [checked, setChecked] = useState<Record<string, boolean>>({})\n // A registry that fails to load leaves an empty picker, which reads as \"no data\".\n const [registryWarning, setRegistryWarning] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [accepted, setAccepted] = useState<AcceptResult | null>(null)\n const [baixandoXml, setBaixandoXml] = useState(false)\n const [suggesting, setSuggesting] = useState(false)\n const [suggestionNote, setSuggestionNote] = useState<string | null>(null)\n const [pullOpen, setPullOpen] = useState(false)\n // undefined: not looked up (or no link); null: the note points at a payable that does not exist.\n const [payable, setPayable] = useState<NotePayable | null | undefined>(undefined)\n const [payableLost, setPayableLost] = useState(false)\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n // A NOTA primeiro, e sozinha. Juntar tudo num `Promise.all` fazia a tela\n // MENTIR: bastava um dos três cadastros falhar para a promessa rejeitar, a\n // nota nunca ser atribuída, e a tela dizer «Nota não encontrada» sobre uma\n // nota que está lá. Foi o que aconteceu no primeiro E2E — a nota existia,\n // a consulta dela respondia 200, e a tela dizia que não existia.\n let detail = await getInboxNote(noteId)\n // Notes that crossed from the V1, or whose supplier was registered later,\n // arrive unbound; matching by CNPJ here costs one call and fixes the screen.\n if (detail && !detail.supplierPartyId && detail.supplierCnpj) {\n const linked = await linkInboxSupplier(noteId).catch(() => null)\n if (linked?.supplierPartyId) detail = { ...detail, supplierPartyId: linked.supplierPartyId }\n }\n // \"Accepted\" is read from the links; a payable deleted elsewhere must not lock the note.\n if (detail && (detail.invoiceId || detail.stockedAt)) {\n const healed = await healInboxNote(noteId).catch(() => null)\n if (healed?.released) setPayableLost(true)\n if (healed?.changed) detail = (await getInboxNote(noteId)) ?? detail\n }\n setPayable(detail?.invoiceId ? await getNotePayable(detail.invoiceId).catch(() => undefined) : undefined)\n // A note copied from the V1 can carry its XML but no lines: read them from\n // the stored file, by the same staging path as a dropped XML.\n // An accepted one only gets its lines; its payable and stock stay as they are.\n if (detail && detail.items.length === 0 && detail.hasXml && detail.status !== 'rejected') {\n const xml = await getInboxNoteXml(noteId).catch(() => null)\n if (xml) {\n const accepted = Boolean(detail.stockedAt || detail.invoiceId)\n const filled = accepted\n ? await fillInboxLines(noteId, xml).catch(() => 0)\n : (await stageNoteFromXml(xml, { unitId: detail.unitId }).catch(() => null))?.itemCount ?? 0\n if (filled) detail = (await getInboxNote(noteId)) ?? detail\n }\n }\n setNote(detail)\n\n // Os cadastros são para PREENCHER os seletores. Um que não carrega deixa um\n // seletor vazio — que é ruim, e é visível — em vez de esconder a nota.\n const failed: string[] = []\n const [u, a, l] = await Promise.all([\n listMeasurementUnits().catch(() => { failed.push('unidades'); return [] as MeasurementUnitOption[] }),\n listChartAccounts().catch(() => { failed.push('plano de contas'); return [] as ChartAccountOption[] }),\n listStockLocations().catch(() => { failed.push('locais de estoque'); return [] as StockLocationOption[] }),\n ])\n setUnits(u); setAccounts(a); setLocations(l)\n setRegistryWarning(failed.length ? `Não consegui carregar ${failed.join(', ')}. Estes seletores vão aparecer vazios.` : null)\n if (detail) {\n // O NOME DO PRODUTO JÁ VINCULADO. Sem isto o seletor abria VAZIO em toda\n // linha que já tinha produto — o id estava lá, o rótulo não — e a tela\n // dizia «conferido» sobre um campo que parecia em branco. Vale para toda\n // nota reaberta, não só para as que a IA tocou.\n const vinculados = [...new Set(detail.items.map((i) => i.productId).filter((id): id is string => !!id))]\n const nomes = vinculados.length\n ? new Map((await listProductsByIds(vinculados).catch(() => [])).map((p) => [p.id, p.name]))\n : new Map<string, string>()\n const unidadesDoProduto = await listProductStockUnits(vinculados).catch(() => new Map<string, string>())\n setProductUnits(unidadesDoProduto)\n setDrafts(Object.fromEntries(detail.items.map((i) => [\n i.id,\n {\n ...draftOf(i),\n productLabel: (i.productId && nomes.get(i.productId)) || '',\n // Stocked lines keep what was recorded; open ones get a unit instead of a blank.\n stockUnitId: i.stockUnitId ?? (i.stockMovementId ? null : suggestedStockUnit(i, u, unidadesDoProduto, i.productId)),\n },\n ])))\n // Server-side `reconciled` seeds the checks, so saving does not undo them.\n // SUBSTITUI, não mescla. Mesclando, um «conferido» marcado antes nunca\n // voltava atrás: a linha perdia o produto, o servidor devolvia\n // `reconciled: false`, e a tela continuava dizendo que estava conferida\n // porque a chave antiga sobrevivia ao recarregamento. Depois de um load o\n // servidor é a verdade.\n setChecked(Object.fromEntries(detail.items.filter((i) => i.reconciled).map((i) => [i.id, true])))\n const pending = detail.items.find((i) => !i.reconciled)\n setOpenIds(pending ? [pending.id] : [])\n setInstalments(detail.instalments.map((d) => ({\n index: d.index, number: d.number, dueDate: d.dueDate, amount: d.amount,\n paymentType: d.paymentType, barcode: d.barcode, pixKey: d.pixKey,\n })))\n setDefaultAccount(detail.defaultChartAccountId)\n setLocation(detail.defaultLocationId ?? l[0]?.id ?? null)\n }\n } catch (e) {\n // Falhar buscando a nota é diferente de não achar a nota, e a tela tem de\n // dizer qual dos dois foi.\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setLoading(false)\n }\n }, [noteId])\n\n useEffect(() => { void load() }, [load])\n\n /**\n * EDITAR À MÃO APAGA A AUTORIA DA MÁQUINA.\n *\n * O selo diz «este valor é o que a máquina escreveu». No instante em que\n * alguém corrige o fator, o selo passaria a mentir — e mentiria para o lado\n * pior, pedindo conferência de um número que acabou de ser conferido. Então a\n * regra é uma só, aqui, e não espalhada por quinze `onChange`: toda mudança\n * que não declara autoria zera a autoria.\n */\n const patch = (id: string, change: Partial<Draft>) =>\n setDrafts((prev) => ({\n ...prev,\n [id]: {\n ...prev[id],\n ...('suggestedBy' in change ? {} : { suggestedBy: null, suggestionConfidence: null }),\n ...change,\n },\n }))\n\n const accountOptions = useMemo<SearchSelectOption[]>(\n () => accounts.map((a) => ({ id: a.id, label: `${a.code} · ${a.name}` })),\n [accounts],\n )\n const unitOptions = useMemo<SearchSelectOption[]>(\n () => units.map((u) => ({ id: u.id, label: u.abbreviation, subtitle: u.name })),\n [units],\n )\n const locationOptions = useMemo<SearchSelectOption[]>(\n () => locations.map((l) => ({ id: l.id, label: l.name })),\n [locations],\n )\n\n /**\n * O rascunho virado em decisão. É FUNÇÃO e não só `useMemo` porque o\n * auto-salvar da sugestão precisa gravar o rascunho que ELE acabou de montar —\n * o memo ainda é o de antes do `setDrafts`, e salvar com ele gravaria a tela\n * anterior em cima da sugestão.\n */\n const buildDecisions = useCallback((rascunhos: Record<string, Draft>): ItemDecisionInput[] => {\n if (!note) return []\n return note.items.map((item) => {\n const d = rascunhos[item.id] ?? draftOf(item)\n return {\n id: item.id,\n productId: isStockBearing(d.entryType) ? d.productId : null,\n entryType: d.entryType,\n // A herança que a legenda do V1 promete: «itens sem plano herdarão este».\n chartAccountId: d.chartAccountId ?? defaultAccount,\n stockUnitId: d.stockUnitId,\n conversionFactor: Number(d.conversionFactor.replace(',', '.')) || 1,\n costMode: d.costMode,\n suggestedBy: d.suggestedBy,\n suggestionConfidence: d.suggestionConfidence,\n shortageQuantity: d.shortageQuantity === '' ? null : Number(d.shortageQuantity.replace(',', '.')),\n }\n })\n }, [note, defaultAccount])\n\n const decisions = useMemo(() => buildDecisions(drafts), [buildDecisions, drafts])\n\n const stockLines = decisions.filter((d) => isStockBearing(d.entryType))\n const missingProduct = stockLines.filter((d) => !d.productId).length\n // A stock line without a unit enters as a bare number the screens read as \"unidade\".\n const missingUnit = stockLines.filter((d) => {\n const item = note?.items.find((i) => i.id === d.id)\n return !d.stockUnitId && !item?.stockMovementId\n }).length\n const missingType = decisions.filter((d) => !d.entryType).length\n\n /**\n * FATOR DE EMBALAGEM QUE NINGUÉM CONFIRMOU.\n *\n * A unidade comercial declara conteúdo (MI = 1.000, DZ = 12, CENTO = 100) e uma\n * das duas coisas está em aberto: o fator continua 1 (a conta não foi feita), ou\n * a unidade de estoque não foi escolhida (a conta foi feita no escuro, porque o\n * produto não tem `unit` no cadastro).\n *\n * Nos dois casos a máquina chegou até onde podia e a palavra final é de gente:\n * «1 MI a R$ 616,00» são 1.000 sacos a R$ 0,616 ou 1 saco a R$ 616,00, e a\n * diferença entre as duas leituras é o estoque e o custo médio da casa.\n *\n * O cabeçalho deste arquivo diz que a «Qtd estoque (calc.)» é a única defesa\n * contra fator errado. Uma defesa que não trava o «Aceitar» não é defesa.\n */\n const suspectFactor = (item: InboxItem, d: Draft) =>\n packagingCount(item.unit) !== null\n && isStockBearing(d.entryType)\n && ((Number(d.conversionFactor.replace(',', '.')) || 1) === 1 || !d.stockUnitId)\n\n const unverifiedFactor = note\n ? note.items.filter((i) => suspectFactor(i, drafts[i.id] ?? draftOf(i))).length\n : 0\n const instalmentSum = instalments.reduce((acc, d) => acc + (Number(d.amount) || 0), 0)\n // A payable alone is not \"done\": the V1 opened it before reconciling, and many\n // of those notes never reached stock. Done = stocked, or nothing left to stock.\n const hasPayable = Boolean(note?.invoiceId)\n const pendingStock = (note?.items ?? []).some((i) =>\n !i.stockMovementId && (!i.entryType || isStockBearing(i.entryType)))\n const readOnly = Boolean(note?.stockedAt || (hasPayable && !pendingStock))\n const paymentLocked = readOnly || hasPayable\n\n // Same rule the save RPC uses for `reconciled`: checking adds no second state.\n const isReady = (item: InboxItem, d: Draft) =>\n Boolean(d.entryType)\n && (!isStockBearing(d.entryType) || Boolean(d.productId))\n && !suspectFactor(item, d)\n const doneCount = note ? note.items.filter((i) => checked[i.id]).length : 0\n\n const toggleItem = (id: string) =>\n setOpenIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]))\n\n /** Checking closes this item and opens the next pending one. */\n const confirmItem = (id: string) => {\n setChecked((prev) => ({ ...prev, [id]: true }))\n setOpenIds((prev) => {\n const rest = prev.filter((x) => x !== id)\n const next = note?.items.find((i) => i.id !== id && !checked[i.id])\n return next && !rest.includes(next.id) ? [...rest, next.id] : rest\n })\n }\n\n // ── Sugerir com IA ────────────────────────────────────────────────────────\n // A SUGESTÃO ACONTECE NO SERVIDOR, como no V1. A edge function pergunta ao\n // índice (de-para do fornecedor e EAN resolvem sem modelo), manda só o que\n // sobrou com os candidatos daquele item, aplica as evidências de fator que são\n // aritmética (uTrib/qTrib, milheiro) e GRAVA pela mesma RPC do «Salvar\n // conciliação». Então aqui não há merge de rascunho: pede, e recarrega.\n //\n // A primeira versão disto foi um turno de agente e o broker recusou no\n // primeiro clique real — `Message is too long`. Ver `lib/note-suggestion.ts`.\n\n /**\n * Grava o rascunho recebido, sem recarregar.\n *\n * Existe separada do `save()` porque o auto-salvar da sugestão precisa gravar um\n * rascunho que ele mesmo tem em mão, e não o que o `useMemo` ainda enxerga.\n */\n const persistir = useCallback(async (rascunhos: Record<string, Draft>) => {\n if (!note) return\n await saveNoteDecision({\n documentId: note.id,\n items: buildDecisions(rascunhos),\n defaultChartAccountId: defaultAccount,\n defaultLocationId: location,\n instalments,\n })\n }, [note, buildDecisions, defaultAccount, location, instalments])\n\n /** Só o que falta decidir. Decide o rótulo do botão e se ele existe. */\n const pendingItems = useMemo(\n () => (note?.items ?? []).filter((item) => {\n const d = drafts[item.id] ?? draftOf(item)\n return !d.entryType || (isStockBearing(d.entryType) && !d.productId)\n }),\n [note, drafts],\n )\n\n /**\n * Itens que a MÁQUINA decidiu. É o alvo do «Rodar IA novamente».\n *\n * Reavaliar nunca toca no que uma pessoa escolheu: `suggestedBy` nulo é escolha\n * humana, e sobrescrevê-la seria desfazer trabalho — o V1 tinha esse botão e\n * respeitava a mesma fronteira.\n */\n const machineItems = useMemo(\n () => (note?.items ?? []).filter((item) => (drafts[item.id] ?? draftOf(item)).suggestedBy !== null),\n [note, drafts],\n )\n\n const sugerir = useCallback(async (reavaliar = false) => {\n if (!note) return\n setSuggesting(true); setSuggestionNote(null); setError(null)\n try {\n // GRAVA O RASCUNHO ANTES DE PEDIR. A function escreve no banco e a tela\n // recarrega em seguida; rascunho não salvo seria apagado pelo que voltar.\n await persistir(drafts)\n\n const res = await suggestNoteItems(note.id, reavaliar)\n // A nota volta inteira do servidor: é ela que carrega `suggested_by`, e é\n // o que faz o selo sobreviver a recarregar a página.\n await load()\n\n if (res.applied === 0 && res.bound === 0 && res.typedOnly === 0) {\n setSuggestionNote(res.warnings[0] ?? 'Não achei nada para preencher nestes itens.')\n return\n }\n const semIA = res.bound\n ? `Sem IA: ${res.boundByEan ? `${res.boundByEan} pelo código de barras` : ''}`\n + (res.boundByEan && res.bound - res.boundByEan ? ' e ' : '')\n + (res.bound - res.boundByEan ? `${res.bound - res.boundByEan} pelo catálogo deste fornecedor` : '')\n + '.'\n : ''\n // A FRASE SEGUE A TELA. «Preenchido» é só o que ficou pronto; a linha que\n // recebeu o tipo e nenhum produto continua em «falta decidir», e dizer que\n // ela foi preenchida é a tela mentindo sobre o próprio trabalho.\n setSuggestionNote([\n semIA,\n res.applied\n ? `${res.applied} ${res.applied === 1 ? 'item preenchido' : 'itens preenchidos'} pela IA.`\n : '',\n res.typedOnly\n ? `${res.typedOnly} ${res.typedOnly === 1 ? 'item ficou' : 'itens ficaram'} sem produto no catálogo`\n + (res.newProductNames.length ? ` (${res.newProductNames.slice(0, 3).join(', ')})` : '')\n + ' — escolha o produto ou cadastre antes de aceitar.'\n : '',\n res.applied || res.bound ? 'Salvo.' : '',\n ...res.warnings,\n ].filter(Boolean).join(' '))\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setSuggesting(false)\n }\n }, [note, drafts, persistir, load])\n\n // O botão do V1, com o roxo que a conciliação já usa para «isto a máquina\n // O botão do V1, com o roxo que a conciliação já usa para «isto a máquina\n // propôs». Ele não existe quando não há nada a decidir: pedir sugestão para uma\n // nota pronta só poderia DESFAZER escolha de gente.\n //\n // E não depende mais de chave no cliente: a credencial do modelo mora na edge\n // function, então todo app que tem o plugin tem a sugestão — control,\n // full-control e ticket incluídos, que nunca tiveram VITE_FAYZ_AGENT_KEY.\n //\n // Depois da primeira rodada não há mais item pendente, e o botão SUMIA — a\n // sugestão ruim ficava sem segunda chance, e um botão que evapora ao ser usado\n // é esquisito. O V1 trocava o rótulo; aqui também, e «rodar de novo» só\n // reavalia o que a máquina decidiu.\n const reavaliar = pendingItems.length === 0 && machineItems.length > 0\n const botaoIA = readOnly || (pendingItems.length === 0 && !reavaliar)\n ? null\n : (\n <AiActionButton\n size=\"sm\"\n className=\"shrink-0\"\n busy={suggesting}\n busyLabel=\"Pensando…\"\n onClick={() => { void sugerir(reavaliar) }}\n >\n {reavaliar ? 'Rodar IA novamente' : 'Sugerir com IA'}\n </AiActionButton>\n )\n\n /**\n * A moldura do modal. O título e o «Sugerir com IA» ficam no CABEÇALHO, fora da\n * área que rola: a sugestão preenche onze itens de uma vez, e um botão que sai\n * de vista ao rolar até o item 7 é um botão que ninguém acha na segunda nota.\n */\n const moldura = (node: React.ReactNode, titulo: string, rodape?: { start: React.ReactNode; end: React.ReactNode } | null) => (emModal ? (\n <>\n <ModalHeader className=\"shrink-0 flex-row items-center justify-between gap-3 space-y-0 border-b px-6 py-3 pr-14 text-left sm:flex-row\">\n <ModalTitle className=\"min-w-0 truncate\">{titulo}</ModalTitle>\n <div className=\"flex shrink-0 items-center gap-1\">\n {botaoIA}\n {ferramentas}\n </div>\n </ModalHeader>\n <ModalBody className=\"px-6 py-4\">{node}</ModalBody>\n {rodape && <ModalFooter variant=\"bar\" start={rodape.start}>{rodape.end}</ModalFooter>}\n </>\n ) : (\n // Em tela cheia não há moldura onde pendurar o rodapé: ele volta para dentro\n // do conteúdo, grudado na base da janela enquanto a página rola.\n <>\n {node}\n {rodape && (\n <div className={`sticky bottom-0 ${sangria} flex items-center justify-between gap-3 border-t bg-card/95 py-3 pr-16 backdrop-blur`}>\n <div className=\"flex min-w-0 items-center gap-3\">{rodape.start}</div>\n <div className=\"flex shrink-0 items-center gap-2\">{rodape.end}</div>\n </div>\n )}\n </>\n ))\n\n /**\n * Baixa o XML desta nota.\n *\n * O texto desce agora e não junto do detalhe: são 10–50 KB por nota, e carregá-lo\n * em toda abertura da tela seria pagar por um arquivo que quase ninguém abre.\n */\n const [cadastrando, setCadastrando] = useState(false)\n const cadastrarFornecedor = useCallback(async () => {\n if (!note) return\n setCadastrando(true); setError(null)\n try {\n const { supplierPartyId } = await linkInboxSupplier(note.id, true)\n if (supplierPartyId) setNote({ ...note, supplierPartyId })\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setCadastrando(false)\n }\n }, [note])\n\n const [abrindoPdf, setAbrindoPdf] = useState(false)\n const abrirPdf = useCallback(async () => {\n if (!note?.accessKey) return\n // Opened before the await: a tab opened after it is a popup the browser blocks.\n const tab = window.open('', '_blank')\n setAbrindoPdf(true); setError(null)\n try {\n const pdf = await getInboxNotePdf(note.accessKey)\n if (tab) tab.location.href = URL.createObjectURL(pdf)\n } catch (e) {\n tab?.close()\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setAbrindoPdf(false)\n }\n }, [note])\n\n const baixarXml = useCallback(async () => {\n if (!note) return\n setBaixandoXml(true); setError(null)\n try {\n const xml = await getInboxNoteXml(note.id)\n if (!xml) { setError('O arquivo desta nota não está guardado.'); return }\n const url = URL.createObjectURL(new Blob([xml], { type: 'application/xml' }))\n const a = document.createElement('a')\n // O nome é a CHAVE DE ACESSO, como a Receita e todo contador esperam —\n // `nota.xml` numa pasta com trinta notas não diz qual é qual.\n a.href = url\n a.download = `${note.accessKey || note.number || 'nfe'}.xml`\n a.click()\n URL.revokeObjectURL(url)\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setBaixandoXml(false)\n }\n }, [note])\n\n // The note's own tools live in the header, beside the title, so they never\n // scroll away. The XML exists per note: notes staged before the file was kept\n // have no bytes, and the menu item says so instead of failing.\n const ferramentas = note ? (\n <div className=\"flex items-center gap-1\">\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" disabled={baixandoXml || abrindoPdf}>\n {baixandoXml || abrindoPdf\n ? <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" />\n : <Download className=\"mr-1.5 h-4 w-4\" />}\n Baixar\n <ChevronDown className=\"ml-1 h-3.5 w-3.5 opacity-60\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem className=\"gap-2\" disabled={!note.hasXml} onSelect={() => { void baixarXml() }}>\n <FileCode2 className=\"h-4 w-4\" />\n {note.hasXml ? 'XML da nota' : 'XML não guardado — reimporte o .xml'}\n </DropdownItem>\n <DropdownItem className=\"gap-2\" disabled={!note.accessKey} onSelect={() => { void abrirPdf() }}>\n <FileText className=\"h-4 w-4\" />\n DANFE (PDF)\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n <Hint label=\"Atualizar\">\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Atualizar a nota\" onClick={() => { void load() }}>\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n </Hint>\n </div>\n ) : null\n\n\n const save = async () => {\n if (!note) return\n setSaving(true); setError(null)\n try {\n await saveNoteDecision({\n documentId: note.id, items: decisions,\n defaultChartAccountId: defaultAccount, defaultLocationId: location,\n instalments,\n })\n await load()\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setSaving(false)\n }\n }\n\n const accept = async () => {\n if (!note) return\n setAccepting(true); setError(null)\n try {\n // Salvar e aceitar num gesto: o operador clicou «Aceitar», e pedir que ele\n // salve antes seria uma etapa que só existe por causa do nosso desenho.\n await saveNoteDecision({\n documentId: note.id, items: decisions,\n defaultChartAccountId: defaultAccount, defaultLocationId: location,\n instalments,\n })\n const result = await acceptNote(note.id, location)\n // What was attached before the payable existed now belongs to it.\n if (result.invoiceId) await moveNoteAttachmentsToInvoice(note.id, result.invoiceId).catch(() => {})\n setAccepted(result)\n await load()\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setAccepting(false)\n }\n }\n\n // Skeleton mirrors the real layout so the page does not jump when it arrives.\n if (loading) {\n return moldura((\n <div className=\"space-y-4\">\n {cabecalho('Conciliação')}\n <Card className=\"p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <div className=\"mt-3 grid gap-x-6 gap-y-3 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2, 3, 4, 5].map((i) => (\n <div key={i}>\n <Skeleton className=\"h-3 w-20\" />\n <Skeleton className=\"mt-1.5 h-4 w-36\" />\n </div>\n ))}\n </div>\n </Card>\n <Card className=\"p-4\">\n <Skeleton className=\"h-4 w-36\" />\n <div className=\"mt-3 grid gap-4 sm:grid-cols-2\">\n {[0, 1].map((i) => (\n <div key={i}>\n <Skeleton className=\"h-3 w-28\" />\n <Skeleton className=\"mt-1.5 h-9 w-full\" />\n </div>\n ))}\n </div>\n </Card>\n <Skeleton className=\"h-4 w-24\" />\n <div className=\"space-y-2\">\n {[0, 1, 2].map((i) => (\n <Card key={i} className=\"flex items-center gap-3 px-4 py-3\">\n <Skeleton className=\"h-4 w-4 rounded-full\" />\n <div className=\"min-w-0 flex-1\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"mt-1.5 h-3 w-1/3\" />\n </div>\n <Skeleton className=\"h-4 w-20\" />\n </Card>\n ))}\n </div>\n </div>\n ), 'Conciliação')\n }\n\n if (!note) {\n return moldura((\n <div className=\"space-y-4\">\n {cabecalho('Conciliação')}\n <Card className=\"p-8 text-center text-sm\">\n {error\n ? <span className=\"text-destructive\">Não consegui carregar a nota: {error}</span>\n : <span className=\"text-muted-foreground\">Nota não encontrada.</span>}\n </Card>\n </div>\n ), 'Conciliação')\n }\n\n // ── Rejeitar / Salvar / Aceitar ──────────────────────────────────────────\n const pendencias = [\n unverifiedFactor > 0 && `${unverifiedFactor} com fator por conferir`,\n missingType > 0 && `${missingType} sem tipo`,\n missingProduct > 0 && `${missingProduct} sem produto`,\n missingUnit > 0 && `${missingUnit} sem unidade de estoque`,\n ].filter(Boolean).join(' · ')\n const rodape = readOnly ? null : {\n start: (\n <>\n {!hasPayable && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive hover:bg-destructive/10 hover:text-destructive\"\n onClick={async () => { await rejectNote(note.id); onBack() }}\n disabled={saving || accepting}\n >\n <X className=\"mr-1.5 h-3.5 w-3.5\" />\n Rejeitar\n </Button>\n )}\n {pendencias && <span className=\"truncate text-xs text-muted-foreground\">{pendencias}</span>}\n </>\n ),\n end: (\n <>\n <Button variant=\"outline\" size=\"sm\" onClick={() => { void save() }} disabled={saving || accepting}>\n {saving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Salvar conciliação\n </Button>\n <Button\n size=\"sm\"\n onClick={() => { void accept() }}\n disabled={accepting || saving || missingType > 0 || missingProduct > 0 || missingUnit > 0 || unverifiedFactor > 0}\n >\n {accepting ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <Check className=\"mr-1.5 h-3.5 w-3.5\" />}\n {hasPayable ? 'Dar entrada no estoque' : 'Aceitar'}\n </Button>\n </>\n ),\n }\n\n return moldura((\n <div className={`space-y-4 ${emModal ? '' : 'pb-24'}`}>\n {cabecalho(`Conciliação · NF-e ${note.number}`)}\n\n {accepted && (\n <Card className=\"border-success bg-success-soft p-4\">\n <p className=\"text-sm font-medium text-success-soft-foreground\">\n {accepted.alreadyAccepted\n ? 'Esta nota já havia sido aceita — nada foi lançado de novo.'\n : accepted.instalments === 0\n ? `Entrada no estoque: ${accepted.stockLines} ${accepted.stockLines === 1 ? 'linha' : 'linhas'}, ligadas à conta a pagar que a nota já tinha (${money(accepted.invoiceTotal)}).`\n : `Aceita: ${accepted.stockLines} ${accepted.stockLines === 1 ? 'linha' : 'linhas'} de estoque e um título de ${money(accepted.invoiceTotal)} em ${accepted.instalments} ${accepted.instalments === 1 ? 'parcela' : 'parcelas'}.`}\n </p>\n {accepted.invoiceId && onOpenInvoice && (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={() => onOpenInvoice(accepted.invoiceId!)}>\n Abrir a conta a pagar\n </Button>\n )}\n </Card>\n )}\n\n {payableLost && !readOnly && (\n <Card className=\"border-warning bg-warning-soft p-4\" data-testid=\"note-payable-lost\">\n <p className=\"text-sm font-medium text-warning-soft-foreground\">\n A conta a pagar e a entrada no estoque desta nota foram apagadas fora daqui.\n </p>\n <p className=\"mt-1 text-xs text-warning-soft-foreground\">\n Confira a conciliação e clique em Aceitar para lançar as duas de novo.\n </p>\n </Card>\n )}\n\n {!accepted && (\n <Card className=\"p-4\" data-testid=\"note-postings\">\n <h3 className=\"text-sm font-semibold\">Lançamentos desta nota</h3>\n <dl className=\"mt-3 grid gap-x-6 gap-y-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-xs text-muted-foreground\">Conta a pagar</dt>\n <dd className=\"mt-0.5 flex flex-wrap items-center gap-2\">\n {!note.invoiceId && (\n <span className={payableLost ? 'text-destructive' : 'text-muted-foreground'}>\n {payableLost\n ? 'Não existe mais — foi apagada; aceite a nota para lançar de novo'\n : readOnly ? 'Nenhuma — esta nota não abriu conta a pagar' : 'Ainda não lançada — nasce quando a nota for aceita'}\n </span>\n )}\n {note.invoiceId && payable === null && (\n <span className=\"text-destructive\">Não encontrada — a conta foi apagada</span>\n )}\n {payable && (\n <span data-testid=\"note-payable-link\">\n {onOpenInvoice\n ? <InlineLink onClick={() => onOpenInvoice(payable.id)}>{payable.number ?? 'Conta a pagar'}</InlineLink>\n : (payable.number ?? 'Conta a pagar')}\n {' · '}{money(payable.total)}\n {payable.cancelledAt && <span className=\"text-destructive\"> · cancelada</span>}\n </span>\n )}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-muted-foreground\">Estoque</dt>\n <dd className=\"mt-0.5\">\n {note.stockedAt\n ? `Entrada em ${day(note.stockedAt)}`\n : <span className=\"text-muted-foreground\">{readOnly ? 'Sem entrada no estoque' : hasPayable ? 'Ainda sem entrada — conclua a conciliação e dê entrada' : 'Ainda sem entrada — entra quando a nota for aceita'}</span>}\n </dd>\n </div>\n </dl>\n </Card>\n )}\n\n {/* ── 1. Situação fiscal ─────────────────────────────────────────── */}\n <Card className=\"p-4\">\n <h3 className=\"text-sm font-semibold\">Situação fiscal</h3>\n <dl className=\"mt-3 grid gap-x-6 gap-y-2 text-sm sm:grid-cols-2 lg:grid-cols-3\">\n <div>\n <dt className=\"text-xs text-muted-foreground\">Fornecedor</dt>\n <dd className=\"text-sm\">\n {note.supplierPartyId\n ? <PersonLink personId={note.supplierPartyId} name={note.supplierName || '—'} kind=\"supplier\" />\n : (note.supplierName || '—')}\n </dd>\n </div>\n <Field label=\"CNPJ\" value={note.supplierCnpj ?? '—'} mono />\n <Field label=\"Natureza da operação\" value={note.natureOperation ?? '—'} />\n <Field\n label=\"Manifestação\"\n value={`${note.manifestationStatus ?? 'não manifestada'}${note.manifestationAttempts ? ` · ${note.manifestationAttempts} tentativa(s)` : ''}`}\n />\n <Field label=\"Manifestada em\" value={day(note.manifestedAt)} />\n <Field label=\"Recebida em\" value={day(note.receivedAt)} />\n </dl>\n {/* O aviso é um bloco, não um trecho de texto: solto ele vazava do card e\n empurrava o botão para debaixo da própria frase. */}\n {!note.supplierPartyId && (\n <div className=\"mt-3 flex flex-wrap items-center justify-between gap-2 rounded-md border border-input bg-muted/40 px-3 py-2\">\n <p className=\"text-xs text-muted-foreground\">\n {note.supplierCnpj\n ? <>Este fornecedor ainda não está no cadastro. Ao aceitar, ele é cadastrado com o nome e o CNPJ da nota.</>\n : <>A nota não traz o CNPJ do fornecedor, então a conta a pagar vai nascer <strong>sem fornecedor</strong>.</>}\n </p>\n {note.supplierCnpj && !readOnly && (\n <Button variant=\"outline\" size=\"sm\" disabled={cadastrando} onClick={() => { void cadastrarFornecedor() }}>\n {cadastrando ? <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" /> : <UserPlus className=\"mr-1.5 h-4 w-4\" />}\n Cadastrar agora\n </Button>\n )}\n </div>\n )}\n {/* A nota de bonificação entra no estoque e NÃO deve gerar título. Hoje\n gera: 57 notas assim no V1 da Artorius, em 11 grafias de natureza. */}\n {/bonific|brinde|doacao|doação/i.test(note.natureOperation ?? '') && (\n <div className=\"mt-3 rounded-md border border-dashed border-input px-3 py-2\">\n <p className=\"text-xs text-muted-foreground\">\n <Gift className=\"mr-1 inline h-3.5 w-3.5\" aria-hidden />\n A natureza desta nota é <strong>bonificação</strong>. Ela deveria entrar no estoque{' '}\n <strong>sem</strong> abrir conta a pagar — hoje ainda abre.{' '}\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px]\">Em breve</span>\n </p>\n </div>\n )}\n\n {!emModal && <div className=\"mt-3 flex flex-wrap items-center gap-2\">{ferramentas}</div>}\n </Card>\n\n {/* ── 2. Padrões da nota ─────────────────────────────────────────── */}\n <Card className=\"p-4\">\n <h3 className=\"text-sm font-semibold\">Padrões desta nota</h3>\n {registryWarning && (\n <div className=\"mt-2 rounded-md border border-warning bg-warning-soft px-3 py-2\">\n <p className=\"text-xs text-warning-soft-foreground\">\n <AlertTriangle className=\"mr-1 inline h-3.5 w-3.5\" aria-hidden />\n {registryWarning}\n </p>\n </div>\n )}\n <div className=\"mt-3 grid gap-4 sm:grid-cols-2\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Plano de contas padrão</span>\n <SearchSelect\n onSearch={localSearch(accountOptions)}\n value={defaultAccount ?? undefined}\n displayValue={labelOf(accountOptions, defaultAccount)}\n onChange={(id) => setDefaultAccount(id || null)}\n minChars={0}\n placeholder=\"Escolher plano de contas\"\n noResultsLabel=\"Nenhum plano de contas\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n disabled={readOnly}\n />\n <span className=\"mt-1 block text-[11px] text-muted-foreground\">\n Itens sem plano herdarão este.\n </span>\n </label>\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Local de estoque</span>\n <SearchSelect\n onSearch={localSearch(locationOptions)}\n value={location ?? undefined}\n displayValue={labelOf(locationOptions, location)}\n onChange={(id) => setLocation(id || null)}\n minChars={0}\n placeholder=\"Escolher local\"\n noResultsLabel=\"Nenhum local de estoque\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n disabled={readOnly}\n />\n <span className=\"mt-1 block text-[11px] text-muted-foreground\">\n Onde as linhas de estoque desta nota entram.\n </span>\n </label>\n </div>\n </Card>\n\n {/* ── 3. Itens — one collapsed group per item, with progress ─────── */}\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h3 className=\"text-sm font-semibold\">\n Itens <span className=\"font-normal text-muted-foreground\">({note.items.length})</span>\n </h3>\n <div className=\"h-1.5 min-w-[6rem] flex-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${note.items.length ? (doneCount / note.items.length) * 100 : 0}%` }}\n />\n </div>\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {doneCount}/{note.items.length} conferidos\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setOpenIds(openIds.length ? [] : note.items.map((i) => i.id))}\n >\n {openIds.length ? 'Recolher todos' : 'Abrir todos'}\n </Button>\n {/* Em tela cheia não há cabeçalho de modal onde pendurá-lo, então ele\n fica junto do que ele preenche. */}\n {!emModal && botaoIA}\n </div>\n\n {suggestionNote && (\n <div className=\"flex items-start gap-2 rounded-md border border-magic/30 bg-magic-soft px-3 py-2\">\n <p className=\"flex-1 text-xs text-magic-soft-foreground\">{suggestionNote}</p>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n className=\"shrink-0 text-xs text-magic-soft-foreground/70 hover:underline font-normal\"\n onClick={() => setSuggestionNote(null)}\n >\n Fechar\n </Button>\n </div>\n )}\n {/* Notes that crossed from the V1 without their XML arrive with a header\n and no lines; pulling the same key restages this very note. */}\n {note.items.length === 0 && (\n <Card className=\"p-6 text-center\" data-testid=\"note-without-items\">\n <p className=\"text-sm font-medium\">Esta nota chegou sem os itens</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {readOnly || !note.accessKey\n ? 'Não há o XML dela guardado para ler os itens.'\n : note.hasXml\n ? 'O XML guardado é só o resumo da SEFAZ, sem os itens. Busque a nota completa pela chave de acesso.'\n : 'O XML dela não veio junto. Busque na SEFAZ pela chave de acesso para conciliar.'}\n </p>\n {!readOnly && note.accessKey && note.status !== 'rejected' && (\n <Button className=\"mt-3\" size=\"sm\" onClick={() => setPullOpen(true)}>\n <Download className=\"mr-1.5 h-4 w-4\" /> Buscar itens na SEFAZ\n </Button>\n )}\n <PullByKeyDialog\n open={pullOpen}\n onOpenChange={setPullOpen}\n unitId={note.unitId}\n initialKey={note.accessKey ?? undefined}\n onPulled={() => { void load() }}\n />\n </Card>\n )}\n {note.items.map((item) => {\n const d = drafts[item.id] ?? draftOf(item)\n const factor = Number(d.conversionFactor.replace(',', '.')) || 1\n const shortage = d.shortageQuantity === '' ? 0 : Number(d.shortageQuantity.replace(',', '.')) || 0\n const stockQty = item.quantity * factor - shortage\n const unitCost = factor > 0 ? item.unitPrice / factor : item.unitPrice\n const bearing = isStockBearing(d.entryType)\n\n const open = openIds.includes(item.id)\n const done = Boolean(checked[item.id])\n const ready = isReady(item, d)\n const typeLabel = ENTRY_TYPES.find((t) => t.value === d.entryType)?.label\n\n return (\n <Card key={item.id} className=\"overflow-hidden\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => toggleItem(item.id)}\n aria-expanded={open}\n className=\"flex w-full items-center justify-start gap-3 rounded-none px-4 py-3 text-left font-normal transition-colors hover:bg-muted/30\"\n >\n <ChevronRight\n className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${open ? 'rotate-90' : ''}`}\n aria-hidden\n />\n <span className=\"w-5 shrink-0 text-xs tabular-nums text-muted-foreground\">{item.itemNumber}</span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium leading-tight\">{item.description}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {qty(item.quantity)} {item.unit ?? ''} · {money(item.unitPrice)}\n {typeLabel ? ` · ${typeLabel}` : ' · sem tipo'}\n </span>\n </span>\n <span className=\"shrink-0 text-sm tabular-nums\">{money(item.total)}</span>\n {/* Quem escreveu neste item. Sem isto, «Falta decidir» e «A\n conferir» tratam igual o que a pessoa escolheu e o que a\n máquina chutou — e o fator errado é silencioso. */}\n {d.suggestedBy && !done && <AuthorBadge draft={d} />}\n <ItemState done={done && ready} ready={ready} />\n </Button>\n\n {open && (\n <div className=\"grid gap-4 border-t p-4 lg:grid-cols-2\">\n {/* ITEM NA NOTA — o que o documento diz, e não se edita. */}\n <div>\n <p className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Item na nota\n </p>\n <p className=\"mt-1 font-medium leading-tight\">{item.itemNumber}. {item.description}</p>\n <dl className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-xs sm:grid-cols-4\">\n <Field small label=\"Qtd\" value={`${qty(item.quantity)} ${item.unit ?? ''}`} />\n <Field small label=\"Vl. unit.\" value={money(item.unitPrice)} />\n <Field small label=\"Total\" value={money(item.total)} />\n <Field small label=\"Cód\" value={item.supplierProductCode || '—'} mono />\n <Field small label=\"EAN\" value={item.eanBarcode ?? '—'} mono />\n <Field small label=\"NCM\" value={item.ncm ?? '—'} mono />\n <Field small label=\"CFOP\" value={item.cfop ?? '—'} mono />\n <Field small label=\"CST/CSOSN\" value={item.icmsCst ?? item.icmsCsosn ?? '—'} mono />\n </dl>\n </div>\n\n {/* ITEM NO ESTOQUE — a decisão. */}\n <div className=\"space-y-3 lg:border-l lg:pl-4\">\n <p className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Item no estoque\n </p>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Tipo do registro</span>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {ENTRY_TYPES.map((t) => (\n <Button variant=\"bare\" size=\"bare\"\n key={t.value}\n type=\"button\"\n disabled={readOnly}\n onClick={() => patch(item.id, { entryType: t.value })}\n className={`gap-0 font-normal rounded-full border px-2.5 py-1 text-[11px] transition-colors disabled:opacity-60 ${\n d.entryType === t.value\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-input hover:bg-muted'\n }`}\n >\n {t.label}\n {t.hint && <span className=\"ml-1 opacity-70\">· {t.hint}</span>}\n </Button>\n ))}\n </div>\n </label>\n\n {bearing && (\n <>\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Produto vinculado</span>\n <SearchSelect\n value={d.productId ?? undefined}\n displayValue={d.productLabel || undefined}\n onChange={(id, option) => {\n patch(item.id, { productId: id || null, productLabel: option?.label ?? '' })\n // The product's own unit wins over the note's guess, unless someone picked one.\n if (id && !d.stockUnitId) {\n void listProductStockUnits([id]).then((m) => {\n setProductUnits((prev) => new Map([...prev, ...m]))\n const unit = suggestedStockUnit(item, units, m, id)\n if (unit) patch(item.id, { stockUnitId: unit })\n }).catch(() => {})\n }\n }}\n onSearch={async (term: string) => {\n // Busca vazia traz o que mais se parece com a descrição da\n // nota: o operador quase sempre quer justamente aquilo.\n const found = await searchProducts(term || item.description.slice(0, 24))\n return found.map((prod) => ({\n id: prod.id,\n label: prod.name,\n subtitle: prod.sku ?? undefined,\n }))\n }}\n minChars={0}\n placeholder=\"Buscar produto do catálogo\"\n noResultsLabel=\"Nenhum produto encontrado\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n disabled={readOnly}\n />\n </label>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Fator de conversão</span>\n <Input\n value={d.conversionFactor}\n onChange={(e) => patch(item.id, { conversionFactor: e.target.value })}\n inputMode=\"decimal\"\n disabled={readOnly}\n />\n </label>\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Unidade de estoque</span>\n <SearchSelect\n onSearch={localSearch(unitOptions)}\n value={d.stockUnitId ?? undefined}\n displayValue={labelOf(unitOptions, d.stockUnitId)}\n onChange={(id) => patch(item.id, { stockUnitId: id || null })}\n minChars={0}\n placeholder=\"Escolha a unidade\"\n noResultsLabel=\"Nenhuma unidade\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n disabled={readOnly}\n />\n </label>\n </div>\n\n {suspectFactor(item, d) && (\n <div className=\"rounded-md border border-warning bg-warning-soft px-3 py-2\">\n <p className=\"text-xs text-warning-soft-foreground\">\n <AlertTriangle className=\"mr-1 inline h-3.5 w-3.5\" aria-hidden />\n Este item vem em <strong>{item.unit}</strong>, que são{' '}\n {qty(packagingCount(item.unit) ?? 0)} por embalagem.{' '}\n {!d.stockUnitId\n ? <>Escolha a <strong>unidade de estoque</strong> para confirmar o fator — o\n produto está cadastrado sem unidade.</>\n : <>O fator ainda é 1: do jeito que está entrariam {qty(item.quantity)}{' '}\n em vez de {qty(item.quantity * (packagingCount(item.unit) ?? 1))}.</>}\n </p>\n </div>\n )}\n\n {/* A única defesa contra fator errado, e ela tem de ser\n legível ANTES de aceitar. */}\n <div className=\"rounded-md bg-muted/50 px-3 py-2\">\n <div className=\"flex items-baseline justify-between text-sm\">\n <span className=\"text-xs text-muted-foreground\">Qtd estoque (calc.)</span>\n <span className=\"font-semibold tabular-nums\">{qty(stockQty)}</span>\n </div>\n <div className=\"flex items-baseline justify-between text-sm\">\n <span className=\"text-xs text-muted-foreground\">Novo custo unitário</span>\n <span className=\"tabular-nums\">{money(unitCost)}</span>\n </div>\n </div>\n\n {/* Os dois gestos que hoje mandam a Laissa sair da tela. */}\n <div className=\"flex flex-wrap gap-2\">\n <EmBreve\n label=\"Criar produto daqui\"\n o_que=\"Cadastrar o produto a partir desta linha da nota, com nome, código e unidade já preenchidos\"\n quantas=\"ela criou 33 produtos no V1 no meio de importações\"\n />\n <EmBreve\n label=\"Lote e validade\"\n o_que=\"Informar lote e vencimento desta entrada — a coluna já existe no movimento de estoque\"\n quantas=\"usado 5 vezes no V1; numa churrascaria é validade de carne\"\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Modo de custo</span>\n <div className=\"mt-1 flex gap-1\">\n {(['novo', 'media'] as const).map((mode) => (\n <Button variant=\"bare\" size=\"bare\"\n key={mode}\n type=\"button\"\n disabled={readOnly}\n onClick={() => patch(item.id, { costMode: mode })}\n className={`font-normal flex-1 rounded-md border px-2 py-1 text-[11px] disabled:opacity-60 ${\n d.costMode === mode ? 'border-primary bg-primary/10' : 'border-input hover:bg-muted'\n }`}\n >\n {mode === 'novo' ? 'Novo' : 'Média'}\n </Button>\n ))}\n </div>\n </label>\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Falta (qtd)</span>\n <Input\n value={d.shortageQuantity}\n onChange={(e) => patch(item.id, { shortageQuantity: e.target.value })}\n inputMode=\"decimal\"\n placeholder=\"0\"\n disabled={readOnly}\n />\n </label>\n </div>\n </>\n )}\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Plano de contas</span>\n <SearchSelect\n onSearch={localSearch(accountOptions)}\n value={(d.chartAccountId ?? defaultAccount) ?? undefined}\n displayValue={labelOf(accountOptions, d.chartAccountId ?? defaultAccount)}\n onChange={(id) => patch(item.id, { chartAccountId: id || null })}\n minChars={0}\n placeholder=\"Herda o padrão da nota\"\n noResultsLabel=\"Nenhum plano de contas\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n disabled={readOnly}\n />\n </label>\n\n {item.stockMovementId && (\n <p className=\"text-[11px] text-success-soft-foreground\">\n <Check className=\"mr-1 inline h-3 w-3\" aria-hidden />\n Esta linha já deu entrada no estoque.\n </p>\n )}\n\n {!readOnly && (\n <div className=\"flex items-center justify-end gap-3 border-t pt-3\">\n {!ready && (\n <span className=\"text-[11px] text-muted-foreground\">\n {!d.entryType ? 'Escolha o tipo do registro' : 'Vincule o produto'}\n </span>\n )}\n <Button\n size=\"sm\"\n variant={done ? 'ghost' : 'outline'}\n disabled={!ready}\n onClick={() => (done ? setChecked((prev) => ({ ...prev, [item.id]: false })) : confirmItem(item.id))}\n >\n <Check className=\"mr-1.5 h-4 w-4\" />\n {done ? 'Conferido' : 'Conferir item'}\n </Button>\n </div>\n )}\n </div>\n </div>\n )}\n </Card>\n )\n })}\n </div>\n\n {/* ── 4. Dados de pagamento ──────────────────────────────────────── */}\n <Card className=\"p-4\">\n <div className=\"flex items-baseline justify-between\">\n <h3 className=\"text-sm font-semibold\">Dados de pagamento</h3>\n <p className=\"text-xs text-muted-foreground\">\n {instalments.length} {instalments.length === 1 ? 'parcela' : 'parcelas'} ·{' '}\n <span className=\"tabular-nums\">{money(instalmentSum)}</span>\n </p>\n </div>\n\n {note.declaredPayments.length > 0 && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n A nota declarou: {note.declaredPayments.map((p) => `${p.label ?? p.code} ${money(p.value)}`).join(' · ')}\n </p>\n )}\n\n <div className=\"mt-3 space-y-2\">\n {instalments.map((inst, i) => (\n <div key={i} className=\"grid items-end gap-2 sm:grid-cols-[2rem_1fr_1fr_1fr_2rem]\">\n <span className=\"pb-2 text-xs tabular-nums text-muted-foreground\">{inst.index}</span>\n <label className=\"block\">\n <span className=\"text-[11px] text-muted-foreground\">Vencimento</span>\n {/* Nota já aceita não tem vencimento editável, e um seletor de data\n apagado confunde mais que o texto: a parcela virou título. */}\n {paymentLocked ? (\n <p className=\"py-2 text-sm tabular-nums\">{day(inst.dueDate)}</p>\n ) : (\n <DatePicker\n value={inst.dueDate ?? ''}\n onChange={(v: string) =>\n setInstalments((prev) => prev.map((p, j) => (j === i ? { ...p, dueDate: v || null } : p)))}\n />\n )}\n </label>\n <label className=\"block\">\n <span className=\"text-[11px] text-muted-foreground\">Valor</span>\n <Input\n value={String(inst.amount)}\n inputMode=\"decimal\"\n disabled={paymentLocked}\n onChange={(e) =>\n setInstalments((prev) => prev.map((p, j) =>\n (j === i ? { ...p, amount: Number(e.target.value.replace(',', '.')) || 0 } : p)))}\n />\n </label>\n <label className=\"block\">\n <span className=\"text-[11px] text-muted-foreground\">Cód. barras / PIX</span>\n <Input\n value={inst.barcode ?? inst.pixKey ?? ''}\n disabled={paymentLocked}\n onChange={(e) =>\n setInstalments((prev) => prev.map((p, j) => (j === i ? { ...p, barcode: e.target.value } : p)))}\n />\n </label>\n {!paymentLocked && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remover a parcela ${inst.index}`}\n onClick={() => setInstalments((prev) => prev.filter((_, j) => j !== i))}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ))}\n </div>\n\n {!paymentLocked && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => setInstalments((prev) => [...prev, {\n index: prev.length + 1, number: null, dueDate: note.issueDate, amount: 0, paymentType: 'boleto',\n }])}\n >\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Adicionar parcela\n </Button>\n )}\n\n {/* O título nasce com a soma das parcelas. Se ela não bate com a nota, a\n tela diz — é a divergência que a financial/084 mediu em 6,3% dos casos. */}\n {Math.abs(instalmentSum - note.total) > 0.01 && (\n <Hint className=\"mt-3\">\n <span>\n <AlertTriangle className=\"mr-1 inline h-3.5 w-3.5\" aria-hidden />\n A nota diz {money(note.total)} e as parcelas somam {money(instalmentSum)}. O título vai\n nascer com <strong>{money(instalmentSum)}</strong> — é a soma das parcelas que define o\n saldo a pagar.\n </span>\n </Hint>\n )}\n </Card>\n\n {/* ── 5. Anexos da conta ─────────────────────────────────────────── */}\n <NoteAttachmentsCard\n noteId={note.id}\n invoiceId={note.invoiceId}\n readOnly={readOnly}\n instalments={instalments}\n onInstalments={setInstalments}\n />\n\n {error && (\n <Card className=\"border-destructive bg-destructive/5 p-4\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </Card>\n )}\n\n </div>\n ), `Conciliação · NF-e ${note.number}`, rodape)\n}\n\n/**\n * QUEM escreveu esta linha, quando não foi gente.\n *\n * Igualdade e semelhança em cores diferentes porque se conferem de maneiras\n * diferentes: um EAN batido não precisa de leitura, um «parecido» precisa. Roxo\n * (`magic`) é a cor do que a máquina propôs em todo o produto; azul é o vínculo\n * exato, que é informação e não aviso.\n */\nfunction AuthorBadge({ draft }: { draft: Draft }) {\n if (draft.suggestedBy === 'ai') {\n const confira = draft.suggestionConfidence != null && draft.suggestionConfidence < 0.6\n return (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-magic-soft px-2 py-0.5 text-[11px] font-medium text-magic-soft-foreground\">\n IA{confira ? ' · confira' : ''}\n </span>\n )\n }\n return (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-info-soft px-2 py-0.5 text-[11px] font-medium text-info-soft-foreground\">\n {draft.suggestedBy === 'ean' ? 'EAN' : 'fornecedor'}\n </span>\n )\n}\n\n/**\n * O estado da linha, e ele NUNCA diz «conferido» sobre o que não está pronto.\n *\n * `done` sozinho mentia: a marca de conferência sobrevive a mexer no campo\n * depois — e ninguém confere de novo um item que a tela já deu por fechado.\n * Quem chama passa `done && ready`.\n */\nfunction ItemState({ done, ready }: { done: boolean; ready: boolean }) {\n if (done) {\n return (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-success-soft px-2 py-0.5 text-[11px] font-medium text-success-soft-foreground\">\n <Check className=\"mr-1 h-3 w-3\" aria-hidden />\n Conferido\n </span>\n )\n }\n return (\n <span className={`inline-flex shrink-0 items-center rounded-full px-2 py-0.5 text-[11px] font-medium ${\n ready ? 'bg-muted text-muted-foreground' : 'bg-warning-soft text-warning-soft-foreground'\n }`}>\n {ready ? 'A conferir' : 'Falta decidir'}\n </span>\n )\n}\n\nfunction Field({ label, value, mono, small }: { label: string; value: string; mono?: boolean; small?: boolean }) {\n return (\n <div>\n <dt className={`text-muted-foreground ${small ? 'text-[10px]' : 'text-xs'}`}>{label}</dt>\n <dd className={`${mono ? 'tabular-nums' : ''} ${small ? 'text-xs' : 'text-sm'}`}>{value}</dd>\n </div>\n )\n}\n"]}