@fayz-ai/plugin-financial 0.26.4 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FinancialPage-NZFBBVY4.js → FinancialPage-HIVSEGJE.js} +3 -3
- package/dist/{FinancialPage-NZFBBVY4.js.map → FinancialPage-HIVSEGJE.js.map} +1 -1
- package/dist/{chunk-K37Q7SKX.js → chunk-IQHWMVUM.js} +112 -13
- package/dist/chunk-IQHWMVUM.js.map +1 -0
- package/dist/data/registries.d.ts.map +1 -1
- package/dist/index.js +122 -15
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/main.browser.js +2 -1
- package/dist/migrations/main.browser.js.map +1 -1
- package/dist/migrations/main.js +286 -2
- package/dist/migrations/main.js.map +1 -1
- package/dist/views/InvoiceDetailView.d.ts.map +1 -1
- package/dist/views/InvoiceFormView.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-K37Q7SKX.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/routes.ts","../src/views/cardChip.tsx","../src/lib/br-banks.ts","../src/components/BankPicker.tsx","../src/components/PaymentIcons.tsx","../src/components/AccountPicker.tsx","../src/components/PaymentFields.tsx","../src/components/PaymentModal.tsx","../src/lib/item-icons.ts","../src/components/InstallmentSource.tsx","../src/components/InstallmentStatusBadge.tsx","../src/components/InstallmentRow.tsx","../src/components/PaymentReceiptModal.tsx","../src/lib/installment-amounts.ts","../src/components/InvoiceAttachmentsModal.tsx","../src/components/CancelInvoiceDialog.tsx","../src/components/ReceiveStockDialog.tsx","../src/components/StockEntryNote.tsx","../src/views/InvoiceDetailView.tsx","../src/components/UnitField.tsx","../src/components/FinancialCounterpartySearchSelect.tsx","../src/views/focusItem.ts","../src/lib/useStockedItemTypes.ts","../src/components/ReceiptPicker.tsx","../src/views/InvoiceFormView.tsx"],"names":["size","useState","jsx","Landmark","norm","React","jsxs","Banknote","QrCode","CreditCard","ArrowRightLeft","FileCheck","useEffect","Fragment","Button","Input","useTranslation","Check","Receipt","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","INLINE_LINK_TONE","CurrencyInput","DatePicker","DollarSign","Wallet","Modal","ModalContent","ModalHeader","ModalTitle","Paperclip","ModalBody","ImageIcon","FileText","ChevronRight","Loader2","ModalFooter","useRef","createIdempotencyKey","toast","useMemo","ModalTask","Ban","SearchSelect","Skeleton","ChoiceSelect","day","Package","resolveCurrency","CircleDashed","CircleEllipsis","CircleCheckBig","CircleAlert","cancelled","Pencil","PackagePlus","ExternalLink","describePayment","how","reversiblePayments","Checkbox","useUnitMode","usePermissionOptional","Building2","adminNavigateTo","React10","useCurrency","useUnitFilter","WidgetSlot","MoreVertical","X","Textarea","SegmentedControl","CurrencyScope"],"mappings":"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","file":"chunk-IQHWMVUM.js","sourcesContent":["/** The Contas registry screen — one door, linked from every account picker. */\nexport const ACCOUNTS_ROUTE = '/registry/accounts'\nexport const CHART_OF_ACCOUNTS_ROUTE = '/settings/financial/chart-of-accounts'\nexport const COST_CENTERS_ROUTE = '/settings/financial/cost-centers'\n\n/**\n * Where other plugins plug into the invoice screen. Props given to a widget:\n * `invoiceId`, `direction` and `cancelled`.\n */\nexport { FINANCIAL_INVOICE_ZONES } from '@fayz-ai/financial/views/zones'\n","import { useEffect, useState } from 'react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n// ---------------------------------------------------------------------------\n// O cartãozinho: a cor do cartão, a bandeira e os quatro últimos.\n//\n// Existe porque a lista de Contas de uma casa real tem «Cartão Silvio Mario»,\n// «Cartão Silvio Master 0307» e «Cartão Silvio Amex 0016» — três linhas que\n// começam com as mesmas duas palavras. Ler qual é qual custa a linha inteira;\n// reconhecer pela cor custa um relance, que é como a pessoa acha o cartão na\n// própria carteira.\n//\n// Por isso ele tem PROPORÇÃO de cartão e não de selo: o retângulo deitado com a\n// tarja em cima é a forma que o olho já conhece, e é ela que faz a célula ser\n// lida como «um cartão» antes de ser lida como «um texto colorido».\n//\n// Sem cor ainda serve: o final sozinho já distingue as três. A cor é o atalho.\n// ---------------------------------------------------------------------------\n\n/** Preto ou branco por cima da cor escolhida — o que for legível nela. */\nfunction ink(hex: string): string {\n const h = hex.replace('#', '')\n if (h.length !== 6) return '#fff'\n const [r, g, b] = [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16))\n // Luminância relativa, arredondada: a conta exata não muda a escolha e\n // custaria uma dependência.\n return (r * 299 + g * 587 + b * 114) / 1000 > 150 ? '#111' : '#fff'\n}\n\n/**\n * A bandeira ABREVIADA. «American Express» inteiro não cabe num cartão de\n * 68px, e o cartão de verdade também não escreve tudo — ele mostra a marca.\n */\nfunction brandShort(name: string): string {\n const n = name.trim()\n const map: Record<string, string> = {\n 'american express': 'AMEX',\n mastercard: 'MASTER',\n 'diners club': 'DINERS',\n hipercard: 'HIPER',\n }\n return (map[n.toLowerCase()] ?? n).toUpperCase().slice(0, 7)\n}\n\n/**\n * O catálogo de bandeiras, carregado UMA vez para a lista inteira.\n *\n * A linha traz `cardBrandId`, não o nome — e uma consulta por célula seria uma\n * por cartão. Como o catálogo é pequeno e fixo (a 102 semeia doze), ele cabe\n * num mapa de módulo que a primeira célula preenche e as outras leem.\n */\nlet brandCache: Map<string, string> | null = null\nlet brandPromise: Promise<void> | null = null\n\nfunction loadBrands(): Promise<void> {\n if (!brandPromise) {\n const client = getSupabaseClientOptional() as any\n brandPromise = client\n ? client.from('plg_financial_card_brands').select('id, name')\n .then(({ data }: { data: Array<{ id: string; name: string }> | null }) => {\n brandCache = new Map((data ?? []).map((b) => [b.id, b.name]))\n })\n .catch(() => { brandCache = new Map() })\n : Promise.resolve().then(() => { brandCache = new Map() })\n }\n return brandPromise!\n}\n\nfunction useBrandName(id: string | undefined): string | undefined {\n const [, force] = useState(0)\n useEffect(() => {\n if (!id || brandCache) return\n let alive = true\n void loadBrands().then(() => { if (alive) force((n) => n + 1) })\n return () => { alive = false }\n }, [id])\n return id ? brandCache?.get(id) : undefined\n}\n\n/**\n * O cartão desenhado. `sm` é a célula da lista; `lg` é o alto da ficha, onde\n * ele toma o lugar da foto — um cartão tem cara, e ela identifica melhor que a\n * inicial do nome num quadrado colorido.\n */\nexport function CardVisual({\n lastFour,\n color,\n brandId,\n size = 'sm',\n}: {\n lastFour?: string\n color?: string\n brandId?: string\n size?: 'xs' | 'sm' | 'lg'\n}) {\n const brand = useBrandName(brandId)\n const last = (lastFour ?? '').trim()\n if (!last && !color && !brand) return null\n\n const bg = color && /^#[0-9a-fA-F]{6}$/.test(color) ? color : undefined\n const lg = size === 'lg'\n\n // Micro: a square the size of a bank logo, only the last four digits — for pickers.\n if (size === 'xs') {\n return (\n <span\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-[3px] border align-middle text-[6px] font-semibold leading-none tabular-nums\"\n style={bg ? { backgroundColor: bg, color: ink(bg), borderColor: 'transparent' } : undefined}\n title={[brand, last && `•••• ${last}`].filter(Boolean).join(' ')}\n >\n {last}\n </span>\n )\n }\n\n return (\n <span\n // 1,6 : 1 — a proporção do cartão de verdade, deitado.\n className={`inline-flex flex-col justify-between border align-middle ${\n lg ? 'h-20 w-32 rounded-lg px-2.5 py-2' : 'h-[30px] w-[48px] rounded-[4px] px-1 py-1'\n }`}\n style={bg ? { backgroundColor: bg, color: ink(bg), borderColor: 'transparent' } : undefined}\n >\n <span className=\"flex items-start justify-between gap-1\">\n {/* A tarja, que é o que faz o retângulo virar cartão. */}\n <span\n className={`rounded-[1px] ${lg ? 'h-3 w-6' : 'h-1.5 w-2.5'}`}\n style={{ backgroundColor: bg ? 'rgba(0,0,0,.25)' : 'var(--muted)' }}\n />\n {brand && (\n <span className={`truncate font-semibold leading-none tracking-wide opacity-80 ${lg ? 'text-[10px]' : 'text-[6px]'}`}>\n {brandShort(brand)}\n </span>\n )}\n </span>\n <span className={`font-medium leading-none tabular-nums ${lg ? 'text-sm' : 'text-[9px]'}`}>\n {last ? `•••• ${last}` : ''}\n </span>\n </span>\n )\n}\n\n/** A célula da lista. */\nexport function renderCardChip(value: unknown, row: unknown): React.ReactNode {\n const r = row as { color?: string; cardBrandId?: string } | null\n return <CardVisual lastFour={value == null ? '' : String(value)} color={r?.color} brandId={r?.cardBrandId} />\n}\n\n/** O alto da ficha — só para cartão; as outras espécies seguem com a inicial. */\nexport function renderAccountAvatar(item: unknown): React.ReactNode {\n const r = item as { kind?: string; lastFour?: string; color?: string; cardBrandId?: string } | null\n if (!r || r.kind !== 'card_payable') return null\n return <CardVisual size=\"lg\" lastFour={r.lastFour} color={r.color} brandId={r.cardBrandId} />\n}\n","// The banks a Brazilian business actually keeps money in, by COMPE code.\n//\n// Not the full Bacen list (~400 institutions, most of them never seen in a\n// small business): the picker still accepts any name typed by hand, so a\n// missing bank costs a logo, not the record.\n//\n// Logos come from github.com/Tgentil/Bancos-em-SVG through jsDelivr, pinned to\n// a commit so a rename upstream cannot break the image.\n\nconst LOGO_BASE = 'https://cdn.jsdelivr.net/gh/Tgentil/Bancos-em-SVG@fe1d43f0cf379135bd01c987bc147a04fdf48c6d'\n\nexport interface BrBank {\n code: string\n name: string\n /** Other names people type for it (\"nubank\", \"caixa\"). */\n aliases?: string[]\n logo?: string\n}\n\nconst logo = (path: string) => `${LOGO_BASE}/${path.split('/').map(encodeURIComponent).join('/')}`\n\nexport const BR_BANKS: BrBank[] = [\n { code: '001', name: 'Banco do Brasil', aliases: ['bb'], logo: logo('Banco do Brasil S.A/banco-do-brasil-sem-fundo.svg') },\n { code: '341', name: 'Itaú', aliases: ['itau', 'itaú unibanco'], logo: logo('Itaú Unibanco S.A/itau.svg') },\n { code: '237', name: 'Bradesco', logo: logo('Bradesco S.A/bradesco.svg') },\n { code: '104', name: 'Caixa Econômica Federal', aliases: ['caixa', 'cef'], logo: logo('Caixa Econômica Federal/caixa-economica-federal-1.svg') },\n { code: '033', name: 'Santander', logo: logo('Banco Santander Brasil S.A/banco-santander-logo.svg') },\n { code: '260', name: 'Nubank', aliases: ['nu pagamentos'], logo: logo('Nu Pagamentos S.A/nubank-logo-2021.svg') },\n { code: '077', name: 'Inter', aliases: ['banco inter'], logo: logo('Banco Inter S.A/inter.svg') },\n { code: '336', name: 'C6 Bank', aliases: ['c6'], logo: logo('Banco C6 S.A/c6 bank.svg') },\n { code: '208', name: 'BTG Pactual', aliases: ['btg'], logo: logo('Banco BTG Pacutal/btg-pactual.svg') },\n { code: '756', name: 'Sicoob', logo: logo('Sicoob/sicoob-vector-logo.svg') },\n { code: '748', name: 'Sicredi', logo: logo('Sicredi/logo-svg2.svg') },\n { code: '290', name: 'PagBank', aliases: ['pagseguro'], logo: logo('PagSeguro Internet S.A/logo-pagbank.svg') },\n { code: '197', name: 'Stone', logo: logo('Stone Pagamentos S.A/stone.svg') },\n { code: '323', name: 'Mercado Pago', logo: logo('Mercado Pago/mercado-pago.svg') },\n { code: '542', name: 'InfinitePay', aliases: ['cloudwalk'], logo: logo('InfinitePay/InfitePay.svg') },\n { code: '403', name: 'Cora', logo: logo('Cora Sociedade Credito Direto S.A/icone-cora-rosa-pequeno.svg') },\n { code: '380', name: 'PicPay', logo: logo('PicPay/Logo-PicPay.svg') },\n { code: '364', name: 'Efí', aliases: ['gerencianet', 'efi bank'], logo: logo('Efí - Gerencianet/logo-efi-bank-laranja.svg') },\n { code: '461', name: 'Asaas', logo: logo('Asaas IP S.A/header-logo-azul.svg') },\n { code: '422', name: 'Safra', logo: logo('Banco Safra S.A/logo-safra.svg') },\n { code: '212', name: 'Banco Original', aliases: ['original'], logo: logo('Banco Original S.A/banco-original-logo-verde.svg') },\n { code: '655', name: 'Banco BV', aliases: ['votorantim', 'bv'], logo: logo('Banco Votorantim/banco-bv-logo.svg') },\n { code: '041', name: 'Banrisul', logo: logo('Banrisul/banrisul-logo-2023.svg') },\n { code: '070', name: 'BRB', aliases: ['banco de brasília'], logo: logo('BRB - Banco de Brasilia/brb-logo.svg') },\n { code: '136', name: 'Unicred', logo: logo('Unicred/verde.svg') },\n { code: '133', name: 'Cresol', logo: logo('Cresol/Icone-original.svg') },\n { code: '085', name: 'Ailos', logo: logo('Ailos/logo-ailos.svg') },\n { code: '004', name: 'Banco do Nordeste', aliases: ['bnb'], logo: logo('Banco do Nordeste do Brasil S.A/Logo_BNB.svg') },\n { code: '021', name: 'Banestes', logo: logo('Banco do Estado do Espirito Santo/banestes.svg') },\n { code: '037', name: 'Banpará', logo: logo('Banco do Estado do Para/Logo_do_Banpará.svg') },\n { code: '047', name: 'Banese', logo: logo('Banco do Estado do Sergipe/logo banese.svg') },\n { code: '389', name: 'Mercantil do Brasil', aliases: ['mercantil'], logo: logo('Banco Mercantil do Brasil S.A/banco-mercantil-novo-azul.svg') },\n { code: '318', name: 'BMG', logo: logo('Banco BMG/banco-bmg-logo.svg') },\n { code: '707', name: 'Daycoval', logo: logo('Banco Daycoval/logo-Daycoval.svg') },\n { code: '246', name: 'ABC Brasil', logo: logo('ABC Brasil/logoabc.svg') },\n { code: '218', name: 'BS2', logo: logo('Banco BS2 S.A/Banco_BS2.svg') },\n { code: '102', name: 'XP', aliases: ['xp investimentos'], logo: logo('XP Investimentos/xp-investimentos-logo.svg') },\n { code: '536', name: 'Neon', logo: logo('Neon/header-logo-neon.svg') },\n]\n\nconst norm = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().trim()\nconst digits = (s: string) => s.replace(/\\D/g, '')\n\n/** The bank a stored code or name points at, if it is one we know. */\nexport function findBrBank(code?: string | null, name?: string | null): BrBank | undefined {\n const c = digits(code ?? '')\n if (c) {\n const byCode = BR_BANKS.find((b) => Number(b.code) === Number(c))\n if (byCode) return byCode\n }\n const n = norm(name ?? '')\n if (!n) return undefined\n return BR_BANKS.find((b) => norm(b.name) === n || b.aliases?.some((a) => norm(a) === n))\n}\n\n/** Matches by code prefix, name or alias. Empty query lists everything. */\nexport function searchBrBanks(query: string): BrBank[] {\n const q = norm(query)\n if (!q) return BR_BANKS\n const qd = digits(q)\n return BR_BANKS.filter((b) =>\n (qd && qd === q && (b.code.startsWith(qd) || b.code.replace(/^0+/, '').startsWith(qd)))\n || norm(b.name).includes(q)\n || b.aliases?.some((a) => norm(a).includes(q)),\n )\n}\n","import { useState } from 'react'\nimport { Landmark } from 'lucide-react'\nimport { SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { findBrBank, searchBrBanks, type BrBank } from '../lib/br-banks'\nimport type { BankCatalogEntry } from '@fayz-ai/financial/domain/account'\n\nexport function BankLogo({ bank, size = 20 }: { bank?: BrBank; size?: number }) {\n const [broken, setBroken] = useState(false)\n if (!bank?.logo || broken) {\n return <Landmark className=\"text-muted-foreground\" style={{ width: size * 0.8, height: size * 0.8 }} aria-hidden />\n }\n return (\n <img\n src={bank.logo}\n alt=\"\"\n width={size}\n height={size}\n loading=\"lazy\"\n onError={() => setBroken(true)}\n className=\"shrink-0 object-contain\"\n style={{ width: size, height: size }}\n />\n )\n}\n\n/** A catalogue row the picker can show, whatever answered it. */\nconst fromCatalog = (entry: BankCatalogEntry): BrBank | null =>\n entry.compe ? { code: entry.compe, name: entry.name, logo: entry.logoUrl } : null\n\n/**\n * Searchable bank field that answers the code and the name together. A name\n * outside the catalogue is still accepted as typed and keeps whatever code is\n * already there.\n *\n * `search` is the Bacen registry (`public.banks`) when the provider offers it.\n * It falls back to the static list — including when the query answers nothing,\n * which is what a pool without migration 167 looks like.\n */\nexport function BankPicker({ code, name, search, onChange }: {\n code?: string\n name?: string\n search?: (query: string) => Promise<BankCatalogEntry[]>\n onChange: (next: { code: string; name: string }) => void\n}) {\n const known = findBrBank(code, name)\n const toOption = (b: BrBank): SearchSelectOption => ({\n id: b.code,\n label: b.name,\n subtitle: b.code,\n icon: <BankLogo bank={b} />,\n data: b,\n })\n\n const onSearch = async (query: string): Promise<SearchSelectOption[]> => {\n const local = searchBrBanks(query)\n if (!search) return local.map(toOption)\n try {\n // An institution with no COMPE is PIX-only: it cannot carry a CNAB file\n // and has no business in this picker.\n const remote = (await search(query)).map(fromCatalog).filter(Boolean) as BrBank[]\n if (!remote.length) return local.map(toOption)\n // The static entries keep the logo and the short name people recognise.\n const merged = remote.map((bank) => findBrBank(bank.code) ?? bank)\n const seen = new Set(merged.map((bank) => bank.code))\n return [...merged, ...local.filter((bank) => !seen.has(bank.code))].map(toOption)\n } catch {\n return local.map(toOption)\n }\n }\n\n return (\n <SearchSelect\n value={name ? (known?.code ?? `name:${name}`) : ''}\n displayValue={name ?? ''}\n leading={name ? <BankLogo bank={known} size={18} /> : undefined}\n placeholder=\"Busque pelo nome ou número\"\n minChars={0}\n loadOnOpen\n onSearch={onSearch}\n onChange={(_id, option) => {\n const b = option?.data as BrBank | undefined\n onChange(b ? { code: b.code, name: b.name } : { code: '', name: '' })\n }}\n allowCreate\n createLabel=\"Usar\"\n clearLabel=\"Limpar\"\n onCreate={(q) => onChange({ code: code ?? '', name: q.trim() })}\n noResultsLabel=\"Nenhum banco com esse nome\"\n debounce={0}\n />\n )\n}\n","import React from 'react'\nimport { ArrowRightLeft, Banknote, CreditCard, FileCheck, Landmark, QrCode, Receipt, Ticket, Wallet } from 'lucide-react'\nimport { BankLogo } from './BankPicker'\nimport { CardVisual } from '../views/cardChip'\nimport { findBrBank } from '../lib/br-banks'\nimport type { BankAccount } from '@fayz-ai/financial/domain/account'\nimport type { PaymentMethodType } from '@fayz-ai/financial/domain/payment-method'\n\n/** Icon per payment-method `transaction_type`. */\nexport const METHOD_ICONS: Record<string, React.ElementType> = {\n cash: Banknote,\n pix: QrCode,\n credit_card: CreditCard,\n debit_card: CreditCard,\n bank_transfer: ArrowRightLeft,\n check: FileCheck,\n boleto: Receipt,\n voucher: Ticket,\n}\n\nexport function MethodIcon({ type }: { type?: Pick<PaymentMethodType, 'transactionType'> }) {\n const Icon = METHOD_ICONS[type?.transactionType ?? ''] ?? Wallet\n return <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n}\n\n/** The bank's logo, the drawn card for card accounts, a note for cash. */\nexport function AccountIcon({ account }: { account?: BankAccount }) {\n if (!account) return null\n if (account.accountType === 'card_payable' && (account.lastFour || account.color || account.cardBrandId)) {\n return <CardVisual size=\"xs\" lastFour={account.lastFour ?? undefined} color={account.color ?? undefined} brandId={account.cardBrandId ?? undefined} />\n }\n if (account.accountType.startsWith('card_')) return <CreditCard className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n if (account.accountType === 'cash_physical' || account.accountType === 'cash_session') {\n return <Banknote className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n }\n const bank = findBrBank(account.bankCode, account.bankName ?? account.name)\n return bank?.logo ? <BankLogo bank={bank} size={16} /> : <Landmark className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n}\n","import React from 'react'\nimport { Check, ChevronDown, Search, Settings } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, Input } from '@fayz-ai/ui'\nimport type { BankAccount } from '@fayz-ai/financial/domain/account'\nimport { AccountIcon } from './PaymentIcons'\n\nconst FIELD_CLASS =\n 'mt-1 flex w-full items-center gap-2 rounded-input border border-input bg-card px-3 py-2 text-left text-sm ' +\n 'shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring'\n\nconst norm = (v: string) => v.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase()\n\n/** Account picker with type-to-search — tenants can have many accounts. */\nexport function AccountPicker({ accounts, value, onChange, disabled, title, placeholder, ariaLabel, clearLabel, className, onManage, manageLabel, variant = 'inline' }: {\n accounts: BankAccount[]\n value?: string\n onChange: (id: string | undefined) => void\n disabled?: boolean\n title?: string\n placeholder: string\n ariaLabel: string\n clearLabel: string\n className?: string\n onManage?: () => void\n manageLabel?: string\n /** `field` draws a full-width form box, for dialogs; `inline` is the dashed word of an installment row. */\n variant?: 'inline' | 'field'\n}) {\n const [open, setOpen] = React.useState(false)\n const [q, setQ] = React.useState('')\n const selected = accounts.find((a) => a.id === value)\n const list = q ? accounts.filter((a) => norm(a.name).includes(norm(q))) : accounts\n const pick = (id: string | undefined) => { onChange(id); setOpen(false); setQ('') }\n return (\n <Popover open={open} onOpenChange={(o) => { setOpen(o); if (!o) setQ('') }}>\n <PopoverTrigger asChild>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={disabled}\n title={title}\n aria-label={ariaLabel}\n className={`font-normal whitespace-normal justify-start ${variant === 'field' ? FIELD_CLASS : 'inline-flex max-w-full items-center gap-1 text-xs'} disabled:cursor-not-allowed disabled:opacity-50 ${className ?? ''}`}\n >\n {selected\n ? <><AccountIcon account={selected} /><span className=\"truncate\">{selected.name}</span></>\n : <span className={variant === 'field' ? 'text-muted-foreground' : undefined}>{placeholder}</span>}\n <ChevronDown className={`${variant === 'field' ? 'ml-auto h-4 w-4' : 'h-3 w-3'} shrink-0 opacity-50`} aria-hidden />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className={variant === 'field' ? 'w-[var(--radix-popover-trigger-width)] p-1' : 'w-64 p-1'}>\n <div className=\"relative mb-1\">\n <Search className=\"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <Input\n autoFocus\n value={q}\n onChange={(e) => setQ(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter' && list[0]) { e.preventDefault(); pick(list[0].id) } }}\n placeholder=\"Buscar conta…\"\n className=\"h-8 rounded-md border-0 bg-muted/50 pl-7 pr-2 text-xs shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto\">\n {list.length === 0 ? (\n <p className=\"px-2 py-3 text-center text-xs text-muted-foreground\">Nenhuma conta encontrada</p>\n ) : list.map((a) => (\n <Button variant=\"bare\" size=\"bare\"\n key={a.id}\n type=\"button\"\n onClick={() => pick(a.id)}\n className={`font-normal whitespace-normal justify-start flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-muted ${a.id === value ? 'font-medium' : ''}`}\n >\n <AccountIcon account={a} />\n <span className=\"min-w-0 flex-1 truncate\">{a.name}</span>\n {a.id === value && <Check className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />}\n </Button>\n ))}\n </div>\n {value && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => pick(undefined)} className=\"font-normal whitespace-normal justify-start mt-1 w-full rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground hover:bg-muted\">\n {clearLabel}\n </Button>\n )}\n {onManage && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { setOpen(false); onManage() }}\n className=\"font-normal whitespace-normal justify-start mt-1 flex w-full items-center gap-2 rounded-md border-t px-2 py-1.5 text-left text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Settings className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n {manageLabel}\n </Button>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { Banknote, QrCode, CreditCard, ArrowRightLeft, FileCheck, Pencil } from 'lucide-react'\nimport { Button, CurrencyInput, DatePicker, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { useTranslation, appHref } from '@fayz-ai/core'\nimport { useFinancialConfig, useFinancialStore, formatCurrency } from '../context'\nimport type { BankAccount, BankAccountType } from '@fayz-ai/financial/domain/account'\nimport type { PaymentMethodType } from '@fayz-ai/financial/domain/payment-method'\nimport type { TransactionDirection } from '@fayz-ai/financial/domain/movement'\nimport { CardVisual } from '../views/cardChip'\nimport { AccountPicker } from './AccountPicker'\n\n// ---------------------------------------------------------------------------\n// COMO O DINHEIRO ANDOU — uma pergunta, um formulário.\n//\n// Isto era o corpo do `PaymentModal` e nada mais. Saiu de lá porque a\n// Conciliação faz a MESMA pergunta no último passo dela, e a segunda versão de\n// um seletor de forma de pagamento é o segundo vocabulário de dinheiro\n// nascendo: as regras de qual conta aceita qual método, o caixa aberto que o\n// dinheiro exige, a bandeira e as parcelas do cartão — tudo isso tem de estar\n// certo nos dois lugares ou o balcão aprende duas verdades.\n//\n// O `PaymentModal` continua sendo a moldura (título, rodapé, idempotência); daqui\n// saem só os campos e o motivo de o botão estar bloqueado.\n// ---------------------------------------------------------------------------\n\n// Fallback for a payment type that carries no `allowed_account_types` of its\n// own. It MUST mirror the table, because a wrong value here does not fall back\n// to \"all accounts\" — it filters to none, and the operator gets a payment form\n// with no account to pick.\nconst ACCOUNT_TYPES_FOR_TX: Record<string, BankAccountType[]> = {\n cash: ['cash_physical', 'cash_session'],\n credit_card: ['card_receivable_credit'],\n debit_card: ['card_receivable_debit'],\n pix: ['bank'],\n bank_transfer: ['bank'],\n boleto: ['bank'],\n check: ['bank'],\n voucher: ['bank'],\n}\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n cash: Banknote,\n pix: QrCode,\n credit_card: CreditCard,\n debit_card: CreditCard,\n bank_transfer: ArrowRightLeft,\n check: FileCheck,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n cash: 'border-success/30 bg-success/5 hover:bg-success/10 data-[active=true]:border-success data-[active=true]:bg-success/15',\n pix: 'border-teal-500/30 bg-teal-500/5 hover:bg-teal-500/10 data-[active=true]:border-teal-500 data-[active=true]:bg-teal-500/15',\n credit_card: 'border-info/30 bg-info/5 hover:bg-info/10 data-[active=true]:border-info data-[active=true]:bg-info/15',\n debit_card: 'border-magic/30 bg-magic/5 hover:bg-magic/10 data-[active=true]:border-magic data-[active=true]:bg-magic/15',\n bank_transfer: 'border-warning/30 bg-warning/5 hover:bg-warning/10 data-[active=true]:border-warning data-[active=true]:bg-warning/15',\n check: 'border-border bg-muted/40 hover:bg-muted/60 data-[active=true]:border-foreground data-[active=true]:bg-muted',\n}\n\nconst ICON_COLORS: Record<string, string> = {\n cash: 'text-success',\n pix: 'text-teal-500',\n credit_card: 'text-info',\n debit_card: 'text-magic',\n bank_transfer: 'text-warning',\n check: 'text-muted-foreground',\n}\n\n/**\n * AS CONTAS QUE ESTA FORMA ACEITA — uma regra, dois lugares.\n *\n * A linha do vencimento (InvoiceFormView) pergunta a mesma coisa que o diálogo,\n * só que antes dele. Se a lista divergir, a tela oferece na linha uma conta que\n * a RPC recusa no confirmar — \"method credit_card must settle in a\n * card_receivable_credit account\", com o operador olhando para a conta que ele\n * acabou de escolher.\n *\n * Quando nada casa a lista fica VAZIA de propósito: cair de volta para todas as\n * contas é o que produzia exatamente essa recusa.\n */\nexport function eligibleAccountsFor(\n bankAccounts: BankAccount[],\n direction: TransactionDirection,\n type: PaymentMethodType | undefined,\n): BankAccount[] {\n const txType = type?.transactionType ?? ''\n const active = bankAccounts.filter((a) => a.isActive !== false)\n if (direction === 'debit') {\n // Mirrors financial_receive_payment for payables (migration 092).\n if (txType === 'credit_card') return active.filter((a) => a.accountType === 'card_payable')\n // Money leaves the tenant's own bank or cash — never a customer/supplier\n // ledger account, which made the list thousands of names long.\n const own = (type?.allowedAccountTypes?.length ? type.allowedAccountTypes : ACCOUNT_TYPES_FOR_TX[txType])\n ?.filter((k) => !k.startsWith('card_'))\n const kinds = own?.length ? own : ['bank', 'cash_physical', 'cash_session']\n return active.filter((a) => kinds.includes(a.accountType))\n }\n const allowed = (type?.allowedAccountTypes && type.allowedAccountTypes.length)\n ? type.allowedAccountTypes\n : ACCOUNT_TYPES_FOR_TX[txType]\n if (!allowed || !allowed.length) return bankAccounts\n return bankAccounts.filter((a) => allowed.includes(a.accountType))\n}\n\n/** O que o formulário respondeu — pronto para `payMovement`. */\nexport interface PaymentFieldsValue {\n amount: number\n paymentDate: string\n paymentMethodId?: string\n paymentMethodTypeId?: string\n bankAccountId?: string\n cashSessionId?: string\n cardBrand?: string\n cardInstallments?: number\n notes?: string\n}\n\nexport interface UsePaymentFieldsOptions {\n /** `debit` = conta a pagar, `credit` = conta a receber. Muda as contas elegíveis. */\n direction: TransactionDirection\n initialAmount: number\n initialDate?: string\n /**\n * O valor vira um número escrito, não um campo.\n *\n * É o caso da conciliação: quem diz quanto foi é o EXTRATO, e um campo\n * editável ali convida a gravar um valor que o banco nunca viu.\n */\n lockAmount?: boolean\n disabled?: boolean\n /**\n * A FORMA E A CONTA JÁ FORAM RESPONDIDAS LÁ FORA.\n *\n * É o fluxo do V1: a linha do vencimento tem as colunas Forma e Conta, o\n * operador escolhe ali, e o diálogo abre só para conferir valor e data. Sem\n * isso o diálogo repetia a pergunta que a linha já tinha feito.\n *\n * Com as duas respondidas, o diálogo abre com elas resumidas numa linha só —\n * o `lock_payment_source` do V1, com volta: o lápis reabre os seletores em\n * vez de obrigar a fechar o diálogo, corrigir a linha e reabrir.\n */\n initialMethodTypeId?: string\n initialMethodId?: string\n initialAccountId?: string\n /** Enter em qualquer campo confirma — o chamador decide o que confirmar. */\n onSubmit?: () => void\n}\n\nexport interface PaymentFields {\n node: React.ReactNode\n value: PaymentFieldsValue\n /** O que falta para o pagamento ser possível — `null` quando está pronto. */\n blockedReason: string | null\n setAmount: (n: number) => void\n}\n\n/**\n * Os campos do pagamento, com as regras que o banco vai cobrar.\n *\n * `blockedReason` é texto, nunca um booleano: ação bloqueada DIZ o que falta.\n * Um botão morto em silêncio é a pessoa clicando três vezes e indo embora.\n */\nexport function usePaymentFields(options: UsePaymentFieldsOptions): PaymentFields {\n const t = useTranslation()\n const { currency } = useFinancialConfig()\n const {\n direction, initialAmount, initialDate, lockAmount = false, disabled = false, onSubmit,\n initialMethodTypeId, initialMethodId, initialAccountId,\n } = options\n\n // O caixa aberto do operador. O pagamento precisa PERTENCER a ele: sem isto,\n // `cash_session_id` fica nulo, o fechamento não tem o que conferir e a quebra\n // de caixa é sempre zero — o caixa fecha certo por não saber de nada.\n const cashSessions = useFinancialStore((s) => s.cashSessions)\n const fetchCashSessions = useFinancialStore((s) => s.fetchCashSessions)\n const openSession = cashSessions.find((s) => s.status === 'open')\n const bankAccounts = useFinancialStore((s) => s.bankAccounts)\n const paymentMethods = useFinancialStore((s) => s.paymentMethods)\n const paymentMethodTypes = useFinancialStore((s) => s.paymentMethodTypes)\n const fetchBankAccounts = useFinancialStore((s) => s.fetchBankAccounts)\n const fetchPaymentMethods = useFinancialStore((s) => s.fetchPaymentMethods)\n\n const [amount, setAmount] = useState(initialAmount)\n const [paymentDate, setPaymentDate] = useState(initialDate ?? new Date().toISOString().slice(0, 10))\n const [selectedTypeId, setSelectedTypeId] = useState(initialMethodTypeId ?? '')\n const [paymentMethodId, setPaymentMethodId] = useState(initialMethodId ?? '')\n const [bankAccountId, setBankAccountId] = useState(initialAccountId ?? '')\n const [cardBrand, setCardBrand] = useState('')\n const [cardInstallments, setCardInstallments] = useState(1)\n const [notes, setNotes] = useState('')\n // Com a forma já respondida lá fora, a grade de métodos nasce fechada: o que\n // o diálogo ainda pergunta é valor e data.\n const [expandMethodPicker, setExpandMethodPicker] = useState(!initialMethodTypeId)\n // A linha do vencimento já respondeu forma E conta: o diálogo as resume e\n // abre direto no que falta. O lápis desfaz o resumo.\n const [editSource, setEditSource] = useState(false)\n const sourceAnswered = !!initialMethodTypeId && !!initialAccountId && !editSource\n\n useEffect(() => {\n fetchBankAccounts()\n fetchPaymentMethods()\n }, [])\n\n useEffect(() => { void fetchCashSessions() }, [fetchCashSessions])\n\n // O valor travado acompanha a fonte da verdade quando ela muda (o operador\n // trocou de linha do extrato sem fechar o passo).\n useEffect(() => { if (lockAmount) setAmount(initialAmount) }, [lockAmount, initialAmount])\n\n const selectedType = useMemo(\n () => paymentMethodTypes.find((tp) => tp.id === selectedTypeId),\n [paymentMethodTypes, selectedTypeId],\n )\n\n const txType = selectedType?.transactionType ?? ''\n\n const filteredMethods = useMemo(\n () => paymentMethods.filter((m) => m.paymentMethodTypeId === selectedTypeId),\n [paymentMethods, selectedTypeId],\n )\n\n // A bill is paid FROM one of the company's own cards, which already knows\n // its brand and last digits — the operator picks the card, not a bank\n // account and a brand.\n const isPayable = direction === 'debit'\n const payingByCompanyCard = isPayable && txType === 'credit_card'\n const needsCard = !isPayable && (txType === 'credit_card' || txType === 'debit_card')\n const needsCardInstallments = txType === 'credit_card'\n\n // As contas que o método ACEITA — ver `eligibleAccountsFor`, que a linha do\n // vencimento usa pela mesma porta.\n const eligibleAccounts = useMemo(\n () => eligibleAccountsFor(bankAccounts, direction, selectedType),\n [bankAccounts, direction, selectedType],\n )\n\n // Auto-pick a sensible destination account so the payment is always linked to one.\n useEffect(() => {\n if (selectedTypeId && !bankAccountId && eligibleAccounts.length) {\n setBankAccountId(eligibleAccounts[0].id)\n }\n }, [selectedTypeId, eligibleAccounts])\n\n function handleSelectType(typeId: string) {\n setSelectedTypeId(typeId)\n setExpandMethodPicker(false)\n setPaymentMethodId('')\n setBankAccountId('')\n setCardBrand('')\n setCardInstallments(1)\n }\n\n // Dinheiro exige caixa aberto. É a regra do V1 e ela é sobre conferência, não\n // sobre burocracia: dinheiro recebido fora de um caixa não aparece na\n // contagem de ninguém, e a diferença some junto. Cartão e Pix caem direto na\n // conta e não dependem de gaveta.\n const needsOpenCashSession = txType === 'cash' && !openSession\n\n const blockedReason: string | null =\n amount <= 0 ? t('financial.payment.amountRequired')\n : !selectedTypeId ? t('financial.payment.methodRequired')\n : needsOpenCashSession ? t('financial.payment.cashNeedsOpenSession')\n : !bankAccountId ? t('financial.payment.accountRequired')\n : null\n\n // Enter anywhere submits (unless typing in a textarea / Shift+Enter).\n function handleKeyDown(e: React.KeyboardEvent) {\n if (!onSubmit) return\n if (e.key !== 'Enter' || e.shiftKey) return\n if ((e.target as HTMLElement).tagName === 'TEXTAREA') return\n e.preventDefault()\n if (!blockedReason) onSubmit()\n }\n\n const SelectedIcon = selectedType ? (TYPE_ICONS[txType] ?? Banknote) : null\n const selectedAccount = bankAccounts.find((a) => a.id === bankAccountId)\n\n const node = (\n <div onKeyDown={handleKeyDown}>\n <fieldset disabled={disabled} className=\"space-y-4\">\n {/* FORMA E CONTA JÁ VIERAM DA LINHA DO VENCIMENTO.\n Uma faixa só, de leitura, em vez de repetir as duas perguntas: o\n diálogo abre no que ainda falta — quanto e quando. O lápis desfaz o\n resumo e devolve os seletores inteiros. */}\n {sourceAnswered && (\n <div className=\"flex items-center gap-2 rounded-button border bg-muted/30 px-3 py-2.5\">\n {SelectedIcon && <SelectedIcon className={`h-4 w-4 shrink-0 ${ICON_COLORS[txType] ?? ''}`} aria-hidden />}\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n <span className=\"font-medium\">{selectedType?.name ?? ''}</span>\n {selectedAccount && (\n <>\n <span className=\"text-muted-foreground\"> · </span>\n <span className=\"text-muted-foreground\">{selectedAccount.name}</span>\n </>\n )}\n </span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { setEditSource(true); setExpandMethodPicker(true) }}\n aria-label={t('financial.payment.changeSource')}\n title={t('financial.payment.changeSource')}\n className=\"shrink-0 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n </div>\n )}\n\n {/* Payment method type selector */}\n <div hidden={sourceAnswered}>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.method')}</label>\n\n {/* Collapsed: show selected as inline chip */}\n <div\n className=\"grid transition-all duration-200 ease-out\"\n style={{ gridTemplateRows: selectedTypeId && !expandMethodPicker ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {selectedType && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setExpandMethodPicker(true)}\n className={`font-normal justify-start whitespace-normal flex items-center gap-2 mt-1.5 w-full rounded-button border px-3 py-2.5 text-left transition-colors hover:bg-muted/30 ${TYPE_COLORS[txType] ?? ''}`}\n data-active=\"true\"\n >\n {SelectedIcon && <SelectedIcon className={`h-4 w-4 ${ICON_COLORS[txType] ?? ''}`} />}\n <span className=\"text-sm font-medium flex-1\">{selectedType?.name}</span>\n <Pencil className=\"h-3 w-3 text-muted-foreground\" />\n </Button>\n )}\n </div>\n </div>\n\n {/* Expanded: full grid */}\n <div\n className=\"grid transition-all duration-200 ease-out\"\n style={{ gridTemplateRows: expandMethodPicker ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {paymentMethodTypes.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-input bg-muted/30 px-3 py-3 text-center mt-1.5\">\n <p className=\"text-xs text-muted-foreground\">{t('financial.payment.noMethods')}</p>\n <a href={appHref('/financial/settings')} className=\"mt-1.5 inline-block text-xs font-medium text-primary hover:underline\">\n {t('financial.payment.configureMethods')} →\n </a>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-2 mt-1.5\">\n {paymentMethodTypes.map((type) => {\n const tt = type.transactionType ?? ''\n const Icon = TYPE_ICONS[tt] ?? Banknote\n const isActive = selectedTypeId === type.id\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={type.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => handleSelectType(type.id)}\n className={`font-normal flex flex-col items-center justify-start gap-1.5 rounded-button border px-2 py-3 text-center transition-all ${TYPE_COLORS[tt] ?? TYPE_COLORS.cash}`}\n >\n <Icon className={`h-5 w-5 ${isActive ? ICON_COLORS[tt] ?? '' : 'text-muted-foreground'}`} />\n <span className={`text-[11px] font-medium leading-tight ${isActive ? 'text-foreground' : 'text-muted-foreground'}`}>{type.name}</span>\n </Button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Form fields — only after method selected */}\n {selectedTypeId && (\n <div key={selectedTypeId} className=\"space-y-4\">\n {/* Amount + Date side by side */}\n <div className=\"stagger-field grid grid-cols-2 items-start gap-3\" style={{ animationDelay: '0ms' }}>\n {lockAmount ? (\n // O extrato mandou o valor. Ele aparece como FATO, e a linha\n // abaixo diz por quê — um campo cinza sem explicação faz a\n // pessoa procurar onde se edita.\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.amount')}</label>\n <p className=\"mt-1 text-base font-semibold\">{formatCurrency(amount, currency)}</p>\n <p className=\"text-[10px] text-muted-foreground\">{t('financial.payment.amountFromStatement')}</p>\n </div>\n ) : (\n <CurrencyInput\n label={t('financial.payment.amount')}\n value={amount}\n onChange={setAmount}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n )}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.date')}</label>\n <DatePicker value={paymentDate} onChange={setPaymentDate} className=\"mt-1\" />\n </div>\n </div>\n\n {/* Specific payment method */}\n {filteredMethods.length > 0 && !isPayable && (\n <div className=\"stagger-field\" style={{ animationDelay: '50ms' }}>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {needsCard ? t('financial.payment.card') : t('financial.payment.account')}\n </label>\n <Select value={paymentMethodId} onValueChange={setPaymentMethodId}>\n <SelectTrigger className=\"mt-1\"><SelectValue placeholder={t('financial.payment.select')} /></SelectTrigger>\n <SelectContent>\n {filteredMethods.map((m) => <SelectItem key={m.id} value={m.id}>{m.name}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Card fields side by side */}\n {(needsCard || payingByCompanyCard) && (\n <div className={`stagger-field ${needsCard && needsCardInstallments ? 'fz-fields-2' : 'fz-fields'}`} style={{ animationDelay: '100ms' }}>\n {needsCard && <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.cardBrand')}</label>\n <Select value={cardBrand} onValueChange={setCardBrand}>\n <SelectTrigger className=\"mt-1\"><SelectValue placeholder={t('financial.payment.selectBrand')} /></SelectTrigger>\n <SelectContent>\n {['Visa', 'Mastercard', 'American Express', 'Elo', 'Hipercard', 'Diners Club'].map((b) => (\n <SelectItem key={b} value={b}>{b}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>}\n {needsCardInstallments && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.cardInstallments')}</label>\n <Select value={String(cardInstallments)} onValueChange={(v) => setCardInstallments(Number(v))}>\n <SelectTrigger className=\"mt-1\"><SelectValue /></SelectTrigger>\n <SelectContent>\n {Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (\n <SelectItem key={n} value={String(n)}>{n}x {n > 1 ? formatCurrency(amount / n, currency) : ''}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n )}\n\n {/* Sem caixa aberto o dinheiro não tem gaveta: diz isso ANTES da\n conta, porque é o que impede o botão, e leva direto para onde\n se abre o caixa. */}\n {needsOpenCashSession && (\n <div className=\"stagger-field rounded-lg border border-dashed border-warning/40 bg-warning/5 px-3 py-2.5 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('financial.payment.cashNeedsOpenSession')}</p>\n <a href={appHref('/financial/cash-registers')} className=\"mt-1 inline-block text-xs font-medium text-primary hover:underline\">\n {t('financial.payment.openCashSession')} →\n </a>\n </div>\n )}\n\n {payingByCompanyCard && !sourceAnswered && (\n <div className=\"stagger-field\" style={{ animationDelay: '50ms' }}>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.whichCard')}</label>\n {eligibleAccounts.length === 0 ? (\n <div className=\"mt-1 rounded-lg border border-dashed border-input bg-muted/30 px-3 py-2.5 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('financial.payment.noCompanyCards')}</p>\n <a href={appHref('/settings/financial/bank-accounts')} className=\"mt-1 inline-block text-xs font-medium text-primary hover:underline\">\n {t('financial.payment.registerCard')} →\n </a>\n </div>\n ) : (\n <div className=\"mt-1.5 grid grid-cols-2 gap-2\" role=\"radiogroup\">\n {eligibleAccounts.map((card) => {\n // `lastFour` é a coluna do cartão (101); o número da\n // conta é o recuo para quem foi cadastrado antes dela.\n const last4 = (card.lastFour ?? card.accountNumber ?? '').replace(/\\D/g, '').slice(-4)\n const active = bankAccountId === card.id\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={card.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n onClick={() => setBankAccountId(card.id)}\n className={`font-normal whitespace-normal flex items-center gap-2.5 rounded-button border px-2.5 py-2 text-left transition-colors ${\n active ? 'border-primary bg-primary/5 ring-2 ring-primary/20' : 'hover:bg-muted/40'\n }`}\n >\n {/* O MESMO CARTÃOZINHO DA LISTA DE CONTAS. Quem tem\n quatro escolhe pelos quatro últimos e pela\n bandeira, que é como eles se distinguem na\n carteira. Ver views/cardChip. */}\n <span aria-hidden className=\"shrink-0\">\n <CardVisual\n lastFour={last4}\n color={card.color ?? undefined}\n brandId={card.cardBrandId ?? undefined}\n />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-xs font-medium\">{card.name}</span>\n {card.bankName && (\n <span className=\"block truncate text-[10px] text-muted-foreground\">{card.bankName}</span>\n )}\n </span>\n </Button>\n )\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Destination account — always shown so every payment links to an account */}\n {!payingByCompanyCard && !sourceAnswered && (\n <div className=\"stagger-field\" style={{ animationDelay: '100ms' }}>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.bankAccount')}</label>\n {eligibleAccounts.length === 0 ? (\n <div className=\"mt-1 rounded-lg border border-dashed border-input bg-muted/30 px-3 py-2.5 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {bankAccounts.length > 0 && selectedType\n ? t('financial.payment.noAccountForMethod', { method: selectedType.name })\n : t('financial.payment.noAccounts')}\n </p>\n <a href={appHref('/settings/financial/bank-accounts')} className=\"mt-1 inline-block text-xs font-medium text-primary hover:underline\">\n {t('financial.payment.configureAccounts')} →\n </a>\n </div>\n ) : (\n <AccountPicker\n variant=\"field\"\n accounts={eligibleAccounts}\n value={bankAccountId || undefined}\n onChange={(id) => setBankAccountId(id ?? '')}\n placeholder={t('financial.payment.selectAccount')}\n ariaLabel={t('financial.payment.bankAccount')}\n clearLabel={t('financial.invoiceForm.clear')}\n />\n )}\n </div>\n )}\n\n {/* Notes */}\n <div className=\"stagger-field\" style={{ animationDelay: '150ms' }}>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.payment.notes')}</label>\n <Input type=\"text\" value={notes} onChange={(e) => setNotes(e.target.value)} placeholder={t('financial.payment.optionalNotes')} className=\"mt-1\" />\n </div>\n </div>\n )}\n </fieldset>\n\n {/* Keyframe for staggered field entrance */}\n <style>{`\n .stagger-field {\n animation: field-slide-in 250ms ease-out both;\n }\n @keyframes field-slide-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n </div>\n )\n\n return {\n node,\n blockedReason,\n setAmount,\n value: {\n amount,\n paymentDate,\n paymentMethodId: paymentMethodId || undefined,\n paymentMethodTypeId: selectedTypeId || undefined,\n bankAccountId: bankAccountId || undefined,\n // Todo pagamento feito com caixa aberto pertence a ele, não só o em\n // dinheiro: o fechamento confere o cartão da sessão também.\n cashSessionId: openSession?.id,\n cardBrand: needsCard ? cardBrand || undefined : undefined,\n cardInstallments: needsCardInstallments ? cardInstallments : undefined,\n notes: notes.trim() || undefined,\n },\n }\n}\n","import React, { useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, Check, Loader2, TriangleAlert } from 'lucide-react'\nimport { useFinancialConfig, useFinancialStore, formatCurrency } from '../context'\nimport { createPendingCommand, useTranslation } from '@fayz-ai/core'\nimport { Button } from '@fayz-ai/ui'\nimport { ModalTask, useInModalTaskHost } from '@fayz-ai/ui'\nimport type { FinancialMovement, PayMovementInput } from '@fayz-ai/financial/domain/movement'\nimport { createIdempotencyKey } from '@fayz-ai/financial/data/idempotency'\nimport { usePaymentFields } from './PaymentFields'\n\n// ---------------------------------------------------------------------------\n// A MOLDURA do pagamento de uma parcela.\n//\n// Os campos saíram daqui para `PaymentFields`: a Conciliação faz a mesma\n// pergunta no último passo dela, e duas cópias do seletor de forma de pagamento\n// são duas regras de \"qual conta aceita qual método\" que divergem no primeiro\n// bug corrigido de um lado só. O que sobra aqui é o que só este lugar tem —\n// título, saldo restante, idempotência e o rodapé.\n// ---------------------------------------------------------------------------\n\nexport function PaymentModal({ movement, receiptUrl, onClose, onPaid }: {\n movement: FinancialMovement\n /** Comprovante já fotografado — entra junto com o pagamento. */\n receiptUrl?: string\n onClose: () => void\n onPaid: () => void\n}) {\n const t = useTranslation()\n const { currency } = useFinancialConfig()\n const payMovement = useFinancialStore((s) => s.payMovement)\n\n const remaining = movement.amount - movement.paidAmount\n const [saving, setSaving] = useState(false)\n const command = React.useRef(createPendingCommand<PayMovementInput>(() => createIdempotencyKey('financial:payment'), (input) => input.movementId))\n const [pending, setPending] = useState(false)\n const [visible, setVisible] = useState(false)\n\n React.useEffect(() => { requestAnimationFrame(() => setVisible(true)) }, [])\n\n // A LINHA DO VENCIMENTO JÁ DISSE POR ONDE O DINHEIRO SAI.\n //\n // Forma e conta são escolhidas na própria parcela (o fluxo do V1) e ficam na\n // `metadata` dela — que `v_financial_installment_balances` devolve e\n // `billRowToMovement` copia para cá. Ler daqui, e não de uma prop, faz o\n // detalhe da fatura herdar o mesmo pré-preenchimento sem nenhuma fiação.\n const source = (movement.metadata ?? {}) as Record<string, unknown>\n const str = (v: unknown) => (typeof v === 'string' && v ? v : undefined)\n\n const fields = usePaymentFields({\n direction: movement.direction,\n initialAmount: remaining,\n disabled: pending,\n initialMethodTypeId: str(source.payMethodTypeId),\n initialMethodId: str(source.payMethodId),\n initialAccountId: str(source.payAccountId),\n onSubmit: () => { if (!saving) void handlePay() },\n })\n\n function handleClose() {\n if (command.current.pending || command.current.running) return\n setVisible(false)\n setTimeout(onClose, 200)\n }\n\n async function handlePay() {\n if (command.current.running) return\n if (!command.current.pending && fields.blockedReason) return\n setSaving(true)\n setPending(true)\n try {\n await command.current.run({\n // O comprovante viaja com o pagamento — é dele que ele é prova.\n metadata: receiptUrl ? { receiptUrl } : undefined,\n movementId: movement.id,\n ...fields.value,\n }, payMovement)\n setVisible(false)\n setTimeout(onPaid, 200)\n } catch {\n // toast handled by store\n } finally {\n setSaving(false)\n setPending(command.current.pending)\n }\n }\n\n const receiving = movement.direction === 'credit'\n const title = t(receiving ? 'financial.payment.titleReceive' : 'financial.payment.title')\n const body = <div className=\"px-5 py-4\">{fields.node}</div>\n\n // `sticky` age no cartão rolante do portal; na moldura de tarefa o rodapé já\n // vive fora do scroller e só o `shrink-0` importa.\n const footer = (\n <div className=\"shrink-0 border-t sticky bottom-0 bg-card px-5 py-4 space-y-2\">\n {/* O AVISO MORA JUNTO DO BOTÃO QUE ELE GOVERNA.\n Ele nascia no alto do diálogo, em amarelo e corpo inteiro, empurrando\n o formulário para baixo no exato momento em que a pessoa espera — e\n falando de \"tentar de novo\" a dois palmos do botão de tentar de novo.\n Aqui ele é uma linha discreta logo acima da ação, que é onde o olho\n já está. */}\n {/* `!saving`: enquanto a roda gira, quem fala é o botão. Este aviso é\n para o caso em que a chamada VOLTOU e a confirmação não veio. */}\n {pending && !saving && (\n <p role=\"status\" className=\"flex items-start gap-1.5 text-[11px] leading-snug text-muted-foreground\">\n <TriangleAlert className=\"mt-px h-3 w-3 shrink-0 text-warning\" aria-hidden />\n {t('financial.payment.pendingRetry')}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleClose} disabled={pending || saving}>\n {t('financial.payment.cancel')}\n </Button>\n {/* Ação bloqueada DIZ o que falta: o rótulo do botão vira o motivo, em\n vez de um botão morto em silêncio. */}\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handlePay}\n disabled={saving || (!pending && !!fields.blockedReason)}\n title={fields.blockedReason ?? undefined}\n >\n {/* O botão é quem diz que está processando: o cheque vira roda, no\n mesmo lugar, e o rótulo troca. */}\n {saving\n ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden />\n : <Check className=\"h-3.5 w-3.5\" aria-hidden />}\n {saving\n ? t('financial.payment.processing')\n : fields.blockedReason && !pending\n ? fields.blockedReason\n : t(receiving ? 'financial.payment.receiveAmount' : 'financial.payment.payAmount', { amount: formatCurrency(fields.value.amount, currency) })}\n </Button>\n </div>\n </div>\n )\n\n // Aberto de DENTRO de outro modal (a aba Financeiro do agendamento), o portal\n // para o body morre: o Dialog anfitrião põe pointer-events:none no resto da\n // página, e o pagamento aparece por cima porém surdo — a tela \"trava no\n // Receber\". Dentro de um ModalTaskHost a tarefa toma a moldura do anfitrião,\n // que é a regra da casa para modal sobre modal.\n const inTaskHost = useInModalTaskHost()\n\n if (inTaskHost) {\n return (\n <ModalTask\n open\n title={title}\n hint={`${t('financial.payment.installment', { number: String(movement.installmentNumber ?? 1) })} · ${t('financial.payment.remaining', { amount: formatCurrency(remaining, currency) })}`}\n onClose={handleClose}\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{body}</div>\n {footer}\n </ModalTask>\n )\n }\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center transition-colors duration-200\"\n style={{ backgroundColor: visible ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)' }}\n onClick={handleClose}\n >\n <div\n className=\"fz-container w-full max-w-md rounded-modal border bg-card shadow-lg mx-4 transition-all duration-200 max-h-[90vh] overflow-y-auto\"\n style={{\n opacity: visible ? 1 : 0,\n transform: visible ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(8px)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b sticky top-0 bg-card z-10\">\n <div>\n <h3 className=\"text-base font-semibold\">{title}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {t('financial.payment.installment', { number: String(movement.installmentNumber ?? 1) })} · {t('financial.payment.remaining', { amount: formatCurrency(remaining, currency) })}\n </p>\n </div>\n <Button variant=\"bare\" size=\"bare\" onClick={handleClose} className=\"p-1 text-muted-foreground hover:text-foreground transition-colors\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {body}\n {footer}\n </div>\n </div>,\n document.body\n )\n}\n","import type React from 'react'\nimport { Briefcase, Gift, Package, Receipt } from 'lucide-react'\n\nexport const ITEM_ICONS: Record<string, React.ComponentType<{ className?: string; strokeWidth?: string | number }>> = {\n product: Package,\n service: Briefcase,\n gift_card: Gift,\n other: Receipt,\n}\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { adminNavigateTo, usePermissionOptional } from '@fayz-ai/admin'\nimport { INLINE_LINK_TONE, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { useFinancialStore } from '../context'\nimport type { TransactionDirection } from '@fayz-ai/financial/domain/movement'\nimport { eligibleAccountsFor } from './PaymentFields'\nimport { MethodIcon } from './PaymentIcons'\nimport { AccountPicker } from './AccountPicker'\nimport { ACCOUNTS_ROUTE } from '../lib/routes'\n\n// ---------------------------------------------------------------------------\n// POR ONDE A PARCELA SAI — a Forma e a Conta do vencimento, em DUAS telas.\n//\n// É a coluna **Forma** e a coluna **Conta** do V1, e ela existe nos dois lugares\n// onde a parcela aparece: o formulário (editar a conta) e o detalhe (acompanhar\n// a conta). Dois pares de seletores seriam duas regras de \"qual conta aceita\n// qual forma\" divergindo no primeiro conserto feito de um lado só — a mesma\n// razão por que `PaymentFields` saiu do `PaymentModal`.\n//\n// O GATILHO É A PRÓPRIA PALAVRA, sublinhada em tracejado — sem moldura de\n// campo. Uma linha de parcela com dois seletores cinzentos ocupa a largura\n// inteira e grita por preenchimento numa tela onde quase sempre não há nada a\n// fazer; vazia, a coluna diz só \"Forma de pagamento\" e some no cinza.\n//\n// E O MENU É NOSSO, não o do sistema operacional. A lista do `<select>` nativo\n// ignora o tema, muda de desenho em cada sistema e obriga o gatilho a ser uma\n// caixa — exatamente o contrário do que esta linha tenta ser.\n// ---------------------------------------------------------------------------\n\n/** Radix não aceita item de valor vazio; esta é a linha \"sem resposta\". */\nconst NONE = '__none__'\n\n// A tinta é a do `InlineLink`, não uma borda inferior própria: o mesmo traço\n// estava escrito aqui, no `DatePicker variant=\"inline\"` e na barra de\n// ferramentas, em três grafias — com deslocamentos diferentes entre si.\nconst TRIGGER_CLASS =\n 'h-auto w-auto justify-start gap-1 rounded-none border-0 ' +\n 'bg-transparent p-0 text-xs font-normal shadow-none ring-offset-0 ' +\n `focus:ring-0 focus:ring-offset-0 [&>svg]:h-3 [&>svg]:w-3 ${INLINE_LINK_TONE.dashed}`\n\nexport interface InstallmentSourceValue {\n payMethodTypeId?: string\n payAccountId?: string\n}\n\nexport function InstallmentSourceFields({\n direction,\n value,\n onChange,\n disabled = false,\n}: {\n direction: TransactionDirection\n value: InstallmentSourceValue\n /** Recebe o par inteiro: trocar a forma pode invalidar a conta escolhida. */\n onChange: (next: InstallmentSourceValue) => void\n disabled?: boolean\n}) {\n const t = useTranslation()\n const paymentMethodTypes = useFinancialStore((s) => s.paymentMethodTypes)\n const bankAccounts = useFinancialStore((s) => s.bankAccounts)\n const can = usePermissionOptional()\n\n const selectedType = paymentMethodTypes.find((tp) => tp.id === value.payMethodTypeId)\n const selectedAccount = bankAccounts.find((a) => a.id === value.payAccountId)\n const accounts = eligibleAccountsFor(bankAccounts, direction, selectedType)\n\n function pickMethod(raw: string) {\n const typeId = raw === NONE ? '' : raw\n const tipo = paymentMethodTypes.find((tp) => tp.id === typeId)\n const elegiveis = eligibleAccountsFor(bankAccounts, direction, tipo)\n // Uma conta só elegível é escolha nenhuma — o V1 já a preenche, e pedir um\n // clique cuja resposta é única é pedir por pedir.\n const conta = elegiveis.length === 1\n ? elegiveis[0]!.id\n : elegiveis.some((a) => a.id === value.payAccountId) ? value.payAccountId : undefined\n onChange({ payMethodTypeId: typeId || undefined, payAccountId: typeId ? conta : undefined })\n }\n\n // Optional pre-selection: the payment dialog asks for whatever is still empty, so no alarm color.\n // A bottom border, not `decoration-*`: the Select trigger is flex and text underline skips its children.\n const tone = (filled: boolean) =>\n filled\n ? 'text-foreground'\n : 'text-foreground border-b border-dashed border-foreground/60'\n\n return (\n <div className=\"flex shrink-0 flex-col items-start gap-0.5\">\n <Select\n value={value.payMethodTypeId ?? ''}\n disabled={disabled}\n onValueChange={pickMethod}\n >\n <SelectTrigger\n aria-label={t('financial.invoiceForm.paidWith')}\n className={`${TRIGGER_CLASS} ${tone(!!selectedType)}`}\n >\n <SelectValue placeholder={t('financial.invoiceForm.paidWith')} />\n </SelectTrigger>\n <SelectContent>\n {paymentMethodTypes.map((tp) => (\n <SelectItem key={tp.id} value={tp.id}>\n <span className=\"flex items-center gap-2\"><MethodIcon type={tp} />{tp.name}</span>\n </SelectItem>\n ))}\n {value.payMethodTypeId && (\n <SelectItem value={NONE} className=\"text-muted-foreground\">\n {t('financial.invoiceForm.clear')}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n\n <AccountPicker\n accounts={accounts}\n value={value.payAccountId}\n // Without a method there is no account list: each method settles into a different kind of account.\n disabled={disabled || !value.payMethodTypeId}\n title={value.payMethodTypeId ? undefined : t('financial.invoiceForm.selectMethodFirst')}\n placeholder={t('financial.payment.account')}\n ariaLabel={t('financial.invoiceForm.paidFrom')}\n clearLabel={t('financial.invoiceForm.clear')}\n className={`${INLINE_LINK_TONE.dashed} ${tone(!!selectedAccount)}`}\n onChange={(id) => onChange({ ...value, payAccountId: id })}\n onManage={can('financial', 'manage') ? () => adminNavigateTo(ACCOUNTS_ROUTE) : undefined}\n manageLabel={t('financial.invoiceForm.manageAccounts')}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Ban, CircleAlert, CircleCheckBig, CircleDashed, CircleEllipsis } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\n\nconst STATUS: Record<string, { bg: string; icon: React.ElementType; labelKey: string }> = {\n open: { bg: 'bg-info-soft text-info-soft-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusOpen' },\n pending: { bg: 'bg-warning-soft text-warning-soft-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusPending' },\n partial: { bg: 'bg-warning-soft text-warning-soft-foreground', icon: CircleEllipsis, labelKey: 'financial.invoice.statusPartial' },\n paid: { bg: 'bg-success-soft text-success-soft-foreground', icon: CircleCheckBig, labelKey: 'financial.invoice.statusPaid' },\n overdue: { bg: 'bg-destructive-soft text-destructive-soft-foreground', icon: CircleAlert, labelKey: 'financial.invoice.statusOverdue' },\n draft: { bg: 'bg-muted text-muted-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusDraft' },\n cancelled: { bg: 'bg-muted text-muted-foreground', icon: Ban, labelKey: 'financial.invoice.statusCancelled' },\n}\n\n/** One installment status chip for the invoice detail and the invoice form. */\nexport function InstallmentStatusBadge({ status }: { status?: string }) {\n const t = useTranslation()\n const s = STATUS[status ?? ''] ?? STATUS.pending\n const Icon = s.icon\n return (\n <span className={`inline-flex shrink-0 items-center gap-0.5 rounded-full px-1.5 py-0.5 text-[9px] font-medium capitalize ${s.bg}`}>\n <Icon className=\"h-2 w-2\" /> {t(s.labelKey)}\n </span>\n )\n}\n","import React from 'react'\nimport { ChevronRight, DollarSign, Paperclip } from 'lucide-react'\nimport { Button, CurrencyInput, DatePicker, INLINE_LINK_TONE } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { InstallmentStatusBadge } from './InstallmentStatusBadge'\n\n/** The amount as its own trigger: click, type, Enter. Same dashed ink as the due date. */\nfunction InlineAmount({ label, value, onCommit }: { label: string; value: number; onCommit: (value: number) => void }) {\n const [draft, setDraft] = React.useState<number | null>(null)\n if (draft === null) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setDraft(value) }}\n className={`font-normal whitespace-normal shrink-0 text-sm font-medium tabular-nums hover:opacity-80 ${INLINE_LINK_TONE.dashed}`}\n >\n {label}\n </Button>\n )\n }\n const commit = () => {\n setDraft(null)\n if (Math.round(draft * 100) !== Math.round(value * 100)) onCommit(draft)\n }\n return (\n <div\n onClick={(e) => e.stopPropagation()}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit()\n if (e.key === 'Escape') setDraft(null)\n }}\n >\n <CurrencyInput autoFocus value={draft} onChange={setDraft} className=\"w-36\" />\n </div>\n )\n}\n\n/**\n * One payment-schedule line, shared by the invoice detail and the invoice form\n * so both modes keep the same slots: amount + status, due date under them,\n * source (method/account) and actions on the right.\n */\nexport function InstallmentRow({\n number, amount, amountValue, onAmountChange, status, dueDate, onDueDateChange, dueExtra, source, actions, onClick,\n}: {\n number: number | string\n amount: string\n /** With `onAmountChange`: the amount is editable inline. */\n amountValue?: number\n onAmountChange?: (value: number) => void\n status?: string\n dueDate: string\n /** Present = the due date is editable inline. */\n onDueDateChange?: (value: string) => void\n dueExtra?: React.ReactNode\n source?: React.ReactNode\n actions?: React.ReactNode\n /** Present = the row opens something (the receipt); shows a chevron. */\n onClick?: () => void\n}) {\n const t = useTranslation()\n const stop = (e: React.MouseEvent) => e.stopPropagation()\n return (\n <div\n className={`flex flex-wrap items-center gap-3 px-4 py-3 ${onClick ? 'cursor-pointer transition-colors hover:bg-muted/20' : ''}`}\n onClick={onClick}\n >\n <span className=\"w-6 shrink-0 text-xs font-medium text-muted-foreground\">#{number}</span>\n <div className=\"flex min-w-0 flex-1 flex-col items-start gap-0.5\">\n <div className=\"flex items-center gap-2\">\n {onAmountChange && amountValue !== undefined\n ? <InlineAmount label={amount} value={amountValue} onCommit={onAmountChange} />\n : <span className=\"shrink-0 text-sm font-medium tabular-nums\">{amount}</span>}\n {status && <InstallmentStatusBadge status={status} />}\n </div>\n <span className=\"flex shrink-0 items-center gap-1 whitespace-nowrap text-[10px] text-muted-foreground\" onClick={stop}>\n {t('financial.payment.due')}\n {onDueDateChange\n ? <DatePicker value={dueDate} variant=\"inline\" format=\"numeric\" onChange={onDueDateChange} />\n : dueDate}\n {dueExtra}\n </span>\n </div>\n {/* Fixed width so the column doesn't shift as the chosen labels change. */}\n <div className=\"w-44 shrink-0\" onClick={stop}>{source}</div>\n {(actions || onClick) && (\n // Min width fits attach + \"Pagar\": rows where Pay is absent (unsaved, paid) keep the source column aligned.\n <div className=\"flex min-w-32 shrink-0 items-center justify-end gap-1.5\" onClick={stop}>\n {actions}\n {onClick && <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />}\n </div>\n )}\n </div>\n )\n}\n\nconst BTN = 'inline-flex shrink-0 items-center gap-1 px-3 py-1.5 text-xs font-medium transition-colors active:shadow-button-inset disabled:pointer-events-none disabled:opacity-40'\n\n/** \"Pagar\" — primary when it settles the line, outline for a partial remainder. */\nexport function InstallmentPayButton({ onClick, disabled, title, children, variant = 'primary' }: {\n onClick: () => void\n disabled?: boolean\n title?: string\n children: React.ReactNode\n variant?: 'primary' | 'outline'\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`font-normal ${variant === 'primary'\n ? `${BTN} rounded-button border border-primary bg-primary text-primary-foreground shadow-button-primary hover:bg-primary/90`\n : `${BTN} rounded-lg border bg-card shadow-button hover:bg-muted`}`}\n >\n <DollarSign className=\"h-3 w-3\" />\n {children}\n </Button>\n )\n}\n\n/** Outline action with an icon (reverse, etc). */\nexport function InstallmentActionButton({ onClick, icon: Icon, children }: {\n onClick: () => void\n icon: React.ElementType\n children: React.ReactNode\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClick} className={`font-normal ${`${BTN} rounded-lg border bg-card shadow-button hover:bg-muted`}`}>\n <Icon className=\"h-3 w-3\" />\n {children}\n </Button>\n )\n}\n\n/** Attachments of the line/invoice; tinted once something is attached, highlighted when a read photo is waiting. */\nexport function InstallmentReceiptButton({ onClick, title, attached, pending, count }: {\n onClick: () => void\n title: string\n attached?: boolean\n pending?: boolean\n count?: number\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onClick}\n title={title}\n aria-label={title}\n className={`relative inline-flex shrink-0 items-center gap-1 rounded-lg border bg-card px-2.5 py-1.5 text-xs font-medium shadow-button transition-colors hover:bg-muted active:shadow-button-inset ${\n attached ? 'text-success' : pending ? 'text-primary' : ''\n }`}\n >\n <Paperclip className=\"h-3 w-3\" />\n {/* Same counter badge as the invoice list's clip. */}\n {!!count && (\n <span className=\"absolute -right-1.5 -top-1.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-semibold leading-none text-primary-foreground tabular-nums\">{count}</span>\n )}\n </Button>\n )\n}\n","import React from 'react'\nimport {\n Banknote, Building2, Calendar, CreditCard, DollarSign, FileText, Trash2, Unlink,\n User, Wallet,\n} from 'lucide-react'\nimport {\n Button, Hint, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalTitle,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useFinancialConfig, formatCurrency } from '../context'\nimport { describePayment, type DescribePaymentContext } from '@fayz-ai/financial/domain/payment-method'\nimport { reversiblePayments, type FinancialMovement } from '@fayz-ai/financial/domain/movement'\n\n/** `2026-09-09` é como a coluna guarda; `09/09/2026` é como se lê no balcão. */\nconst dataBR = (iso: string) => {\n const [ano, mes, dia] = iso.slice(0, 10).split('-')\n return ano && mes && dia ? `${dia}/${mes}/${ano}` : iso\n}\n\n// ---------------------------------------------------------------------------\n// O RECIBO DE UM PAGAMENTO.\n//\n// A quitação aparecia como uma tira de texto dentro da parcela aberta —\n// «R$ 100,00 · Pix · Itaú · 29/09/2026 · Quitação via conciliação…» —, tudo na\n// mesma linha, truncado, e sem nenhuma ação. Quem precisa conferir um\n// pagamento precisa LER os campos, e quem precisa desfazê-lo precisa de um\n// lugar onde a ação mora. É a anatomia do V1: rótulo à esquerda com ícone,\n// valor à direita, observação no rodapé, e as duas ações embaixo.\n// ---------------------------------------------------------------------------\n\n/** Uma linha do recibo. O que o provedor não mandou simplesmente NÃO aparece. */\nfunction Campo({ icon: Icon, label, children, tone }: {\n icon: React.ElementType\n label: string\n children: React.ReactNode\n tone?: 'money'\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex shrink-0 items-center gap-2 text-sm text-muted-foreground\">\n <Icon className=\"h-3.5 w-3.5\" aria-hidden />\n {label}\n </span>\n <span className={`min-w-0 truncate text-right text-sm ${\n tone === 'money' ? 'text-base font-bold text-success' : 'font-medium'\n }`}>\n {children}\n </span>\n </div>\n )\n}\n\nexport interface PaymentReceiptModalProps {\n /**\n * TODOS os pagamentos da parcela, na ordem em que aconteceram.\n *\n * Uma parcela pode ser quitada em duas vezes, e pode ter um estorno em\n * seguida — e as três coisas são o mesmo assunto. Abrir um diálogo por\n * pagamento faria a pessoa fechar e reabrir para somar o que a parcela\n * recebeu.\n */\n payments: FinancialMovement[]\n /** Contexto para traduzir forma e conta — o mesmo do detalhe da fatura. */\n howCtx: DescribePaymentContext\n /** De quem é o dinheiro, do cabeçalho da conta. */\n counterpartyName?: string\n /** `true` numa conta a receber — muda «Forma Pgto.» para «Forma Receb.». */\n isReceivable: boolean\n /** Ausente = a conta está cancelada e nada pode ser estornado. */\n onReverse?: (payment: FinancialMovement) => void\n onClose: () => void\n}\n\n/** O estorno se reconhece por `metadata.reversal_of` — o sinal que a própria\n * RPC grava —, não pela direção, que já é invertida entre pagar e receber. */\nconst ehEstorno = (m: FinancialMovement) =>\n !!(m.metadata as Record<string, unknown> | undefined)?.reversal_of\n\nexport function PaymentReceiptModal({\n payments, howCtx, counterpartyName, isReceivable, onReverse, onClose,\n}: PaymentReceiptModalProps) {\n const t = useTranslation()\n const { currency } = useFinancialConfig()\n const fmt = (n: number) => formatCurrency(n, currency)\n\n // ENTRA, SAI, ENTRA — na ordem em que aconteceu. Fora de ordem, o estorno se\n // lê como mais um recebimento e a soma na cabeça de quem confere dá três\n // entradas para uma parcela de uma.\n const ordenados = [...payments].sort((a, b) =>\n (a.paymentDate ?? '').localeCompare(b.paymentDate ?? '')\n || (a.createdAt ?? '').localeCompare(b.createdAt ?? ''))\n const estornaveis = new Set(reversiblePayments(ordenados).map((m) => m.id))\n // What still stands is the answer; a payment that was reversed and its\n // reversal are one corrected mistake, kept below as history. Listed as five\n // \"payments\", a parcel paid once read as paid five times.\n const vivos = ordenados.filter((m) => estornaveis.has(m.id))\n const desfeitos = ordenados\n .filter((m) => !ehEstorno(m) && !estornaveis.has(m.id))\n .map((m) => ({\n payment: m,\n reversal: ordenados.find((r) => (r.metadata as Record<string, unknown> | undefined)?.reversal_of === m.id),\n }))\n const [verDesfeitos, setVerDesfeitos] = React.useState(false)\n const total = vivos.reduce((soma, m) => soma + (m.paidAmount || m.amount), 0)\n\n return (\n <Modal open onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"sm\">\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2\">\n <DollarSign className=\"h-5 w-5 text-success\" aria-hidden />\n {t('financial.paymentReceipt.title')}\n </ModalTitle>\n </ModalHeader>\n\n <ModalBody className=\"space-y-2\">\n {vivos.length > 1 && (\n <div className=\"flex items-center justify-between rounded-card bg-muted/60 px-4 py-2\">\n <span className=\"text-sm font-medium\">\n {t('financial.paymentReceipt.count', { count: vivos.length })}\n </span>\n <span className=\"text-sm font-bold text-success\">{fmt(total)}</span>\n </div>\n )}\n {vivos.map((payment, indice) => {\n const how = describePayment(payment, howCtx)\n const estorno = ehEstorno(payment)\n return (\n <div key={payment.id} className=\"space-y-2.5 rounded-card bg-muted/40 px-4 py-3\">\n {vivos.length > 1 && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n {estorno\n ? t('financial.paymentReceipt.reversalNumber', { number: indice + 1 })\n : t('financial.paymentReceipt.paymentNumber', { number: indice + 1 })}\n </p>\n )}\n {payment.paymentDate && (\n <Campo icon={Calendar} label={t('financial.paymentReceipt.date')}>\n {dataBR(payment.paymentDate)}\n </Campo>\n )}\n\n <Campo icon={DollarSign} label={t('financial.paymentReceipt.amount')} tone=\"money\">\n {estorno ? '− ' : ''}{fmt(payment.paidAmount || payment.amount)}\n </Campo>\n\n {/* Nenhum valor de banco cru na tela: `how.method` já é o nome do\n catálogo. Sem método, o V1 escreve N/A — e aqui isso é\n verdade e não lacuna: a conciliação quita SEM forma, porque a\n forma é o próprio extrato. */}\n <Campo icon={FileText} label={isReceivable\n ? t('financial.paymentReceipt.methodIn')\n : t('financial.paymentReceipt.methodOut')}>\n <span className=\"rounded border px-1.5 py-0.5 text-xs\">\n {how.method || t('financial.paymentReceipt.methodNone')}\n </span>\n </Campo>\n\n {how.account && (\n <Campo icon={Building2} label={t('financial.paymentReceipt.account')}>\n {how.account.name}\n </Campo>\n )}\n\n {payment.cardBrand && (\n <Campo icon={CreditCard} label={t('financial.paymentReceipt.cardBrand')}>\n {payment.cardBrand}\n {payment.cardInstallments && payment.cardInstallments > 1\n ? ` · ${payment.cardInstallments}x`\n : ''}\n </Campo>\n )}\n\n {(payment.feeAmount ?? 0) > 0 && (\n <Campo icon={Banknote} label={t('financial.paymentReceipt.fee')}>\n <span className=\"text-warning\">{fmt(payment.feeAmount ?? 0)}</span>\n </Campo>\n )}\n\n {counterpartyName && (\n <Campo icon={User} label={isReceivable\n ? t('financial.paymentReceipt.receivedFrom')\n : t('financial.paymentReceipt.payer')}>\n {counterpartyName}\n </Campo>\n )}\n\n {/* «Pago por» do V1 NÃO está aqui, e a ausência é deliberada:\n `plg_financial_movements.created_by` é um uuid de usuário, e o\n nome dele mora em `app.memberships` — outro schema, que o\n PostgREST não cruza. Mostrar o uuid numa linha rotulada \"Pago\n por\" não responde a pergunta, responde outra. Falta uma view\n pública `v_*` para esse nome. */}\n\n {payment.cashSessionId && (\n <Campo icon={Wallet} label={t('financial.paymentReceipt.cashSession')}>\n {t('financial.paymentReceipt.cashSessionYes')}\n </Campo>\n )}\n\n {payment.notes && (\n <div className=\"border-t border-border/60 pt-2\">\n <span className=\"text-xs text-muted-foreground\">{t('financial.paymentReceipt.notes')}: </span>\n <span className=\"text-xs\">{payment.notes}</span>\n </div>\n )}\n\n {/* AS AÇÕES MORAM NO PAGAMENTO QUE ELAS GOVERNAM. Numa parcela com\n dois pagamentos, um botão no rodapé do diálogo não diz qual dos\n dois ele estorna. */}\n {(onReverse && estornaveis.has(payment.id)) && (\n <div className=\"space-y-1 border-t border-border/60 pt-2\">\n {/* «Desvincular» PRESERVA o pagamento e reabre a parcela: o\n valor vira crédito da contraparte, aplicável em outra conta.\n O V2 não tem essa operação — `plg_financial_allocations`\n existe, mas mexer nela pela tela sem uma RPC deixaria a\n parcela aberta e o dinheiro sem dono. Ação bloqueada DIZ o\n que falta, em vez de sumir: quem procura a operação do V1\n descobre por que ela não está aqui. */}\n <Hint label={t('financial.paymentReceipt.unlinkUnavailable')}>\n {/* Indisponível LEVA A CARA DE indisponível: em âmbar fino\n sobre cartão branco ele parecia um botão ativo de baixo\n contraste, e quem clicava não entendia o silêncio. */}\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\" disabled>\n <Unlink className=\"h-3.5 w-3.5\" aria-hidden />\n {t('financial.paymentReceipt.unlink')}\n </Button>\n </Hint>\n {/* ESTORNAR, e não apagar. A contrapartida é lançada e o\n balancete continua fechando — um pagamento apagado deixa o\n extrato do mês sem explicação para um saldo que mudou. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full border-destructive/40 text-destructive hover:border-destructive hover:bg-destructive/10\"\n onClick={() => onReverse(payment)}\n >\n <Trash2 className=\"h-3.5 w-3.5\" aria-hidden />\n {t('financial.paymentReceipt.reverse')}\n </Button>\n </div>\n )}\n </div>\n )})}\n {vivos.length === 0 && (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">\n {t('financial.paymentReceipt.empty')}\n </p>\n )}\n {desfeitos.length > 0 && (\n <div className=\"rounded-card border border-dashed px-4 py-2\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n className=\"font-normal whitespace-normal flex w-full items-center justify-between text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={() => setVerDesfeitos((v) => !v)}\n >\n <span>{t('financial.paymentReceipt.reversedCount', { count: desfeitos.length })}</span>\n <span>{verDesfeitos ? t('financial.paymentReceipt.hide') : t('financial.paymentReceipt.show')}</span>\n </Button>\n {verDesfeitos && (\n <ul className=\"mt-2 space-y-2\">\n {desfeitos.map(({ payment, reversal }) => {\n const how = describePayment(payment, howCtx)\n const reason = (reversal?.metadata as Record<string, unknown> | undefined)?.reason as string | undefined\n return (\n <li key={payment.id} className=\"text-xs text-muted-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate\">\n {payment.paymentDate ? dataBR(payment.paymentDate) : ''}\n {how.account ? ` · ${how.account.name}` : ''}\n </span>\n <span className=\"shrink-0 line-through\">{fmt(payment.paidAmount || payment.amount)}</span>\n </div>\n <p>\n {reversal?.paymentDate\n ? t('financial.paymentReceipt.reversedOn', { date: dataBR(reversal.paymentDate) })\n : t('financial.paymentReceipt.reversed')}\n {reason ? ` — ${reason}` : ''}\n </p>\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )}\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>{t('common.close')}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","const cents = (v: number) => Math.round(v * 100)\n\n/**\n * One installment takes a new amount and the rest of the open ones absorb the\n * difference, so the schedule still sums to the invoice total.\n *\n * `locked` lines (paid, partly paid, cancelled) never move. Lines the person\n * already set by hand (`pinned`) are spared while another open line can take\n * the difference; when none can, they give way rather than leave the sum open.\n * Returns null when no other line can absorb it.\n */\nexport function rebalanceInstallments(input: {\n amounts: number[]\n index: number\n value: number\n total: number\n locked?: boolean[]\n pinned?: boolean[]\n}): number[] | null {\n const { amounts, index, total } = input\n const locked = input.locked ?? []\n const pinned = input.pinned ?? []\n if (locked[index]) return null\n\n const open = amounts.map((_, i) => i).filter((i) => i !== index && !locked[i])\n if (open.length === 0) return null\n const free = open.filter((i) => !pinned[i])\n const absorbers = free.length > 0 ? free : open\n\n const fixed = amounts.reduce((sum, a, i) => (i === index || absorbers.includes(i) ? sum : sum + cents(a)), 0)\n const room = cents(total) - fixed\n if (room < 0) return null\n const mine = Math.min(Math.max(cents(input.value), 0), room)\n\n const rest = room - mine\n const each = Math.floor(rest / absorbers.length)\n const next = amounts.map(cents)\n next[index] = mine\n absorbers.forEach((i, n) => { next[i] = each + (n === 0 ? rest - each * absorbers.length : 0) })\n return next.map((c) => c / 100)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ArrowLeft, ChevronLeft, ChevronRight, ExternalLink, FileText, Image as ImageIcon, Loader2, Paperclip, UploadCloud } from 'lucide-react'\nimport { Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalTitle, toast } from '@fayz-ai/ui'\nimport { useFinancialProvider } from '../context'\nimport type { InvoiceAttachment } from '@fayz-ai/financial/domain/invoice'\n\nconst ACCEPT = 'image/*,application/pdf'\nconst MAX_BYTES = 15 * 1024 * 1024\n\nfunction size(bytes?: number) {\n if (!bytes) return ''\n return bytes < 1024 * 1024 ? `${Math.max(1, Math.round(bytes / 1024))} KB` : `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\n/**\n * The invoice's attachments (receipts, bills, proofs of payment) plus a drop\n * zone to add more. A file previews inside the same modal with a back step,\n * instead of stacking a viewer on top of it.\n */\nexport function InvoiceAttachmentsModal({ invoiceId, onClose, onChanged }: {\n invoiceId: string\n onClose: () => void\n onChanged?: () => void\n}) {\n const provider = useFinancialProvider()\n const inputRef = useRef<HTMLInputElement>(null)\n const [items, setItems] = useState<InvoiceAttachment[] | null>(null)\n const [uploading, setUploading] = useState(0)\n const [over, setOver] = useState(false)\n const [preview, setPreview] = useState<number | null>(null)\n const [added, setAdded] = useState(0)\n\n async function load() {\n try {\n setItems(await (provider.getInvoiceAttachments?.(invoiceId) ?? Promise.resolve([])))\n } catch (e: any) {\n setItems([])\n toast.error(e?.message ?? String(e))\n }\n }\n useEffect(() => { void load() }, [invoiceId])\n\n async function upload(files: FileList | File[]) {\n const list = Array.from(files)\n if (!list.length || !provider.addInvoiceAttachment) return\n const invalid = list.filter((f) => !(f.type.startsWith('image/') || f.type === 'application/pdf') || f.size > MAX_BYTES)\n if (invalid.length) toast.error('Envie imagem ou PDF de até 15 MB.')\n const ok = list.filter((f) => !invalid.includes(f))\n if (!ok.length) return\n setUploading((n) => n + ok.length)\n for (const file of ok) {\n try {\n await provider.addInvoiceAttachment(invoiceId, file)\n setAdded((n) => n + 1)\n } catch (e: any) {\n toast.error(`${file.name}: ${e?.message ?? String(e)}`)\n } finally {\n setUploading((n) => n - 1)\n }\n }\n await load()\n onChanged?.()\n }\n\n return (\n <Modal open onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size={preview !== null ? '3xl' : 'sm'}>\n {preview !== null && items?.[preview] ? (\n <AttachmentPreview\n items={items}\n index={preview}\n onIndex={setPreview}\n onBack={() => setPreview(null)}\n />\n ) : (<>\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2\">\n <Paperclip className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n Anexos da conta\n </ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n {items === null ? (\n <ul className=\"divide-y rounded-card border\" aria-busy=\"true\">\n {[0, 1].map((i) => (\n <li key={i} className=\"flex items-center gap-3 px-3 py-2.5\">\n <div className=\"h-4 w-4 shrink-0 animate-pulse rounded bg-muted\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div className=\"h-3 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"h-2.5 w-1/3 animate-pulse rounded bg-muted\" />\n </div>\n </li>\n ))}\n </ul>\n ) : items.length === 0 ? (\n <div className=\"rounded-card bg-muted/40 px-4 py-5 text-center\">\n <p className=\"text-sm font-medium\">Nenhum anexo ainda</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Guarde aqui o boleto, a nota ou o comprovante de pagamento — fica tudo junto da conta.\n </p>\n </div>\n ) : (\n <ul className=\"divide-y rounded-card border\">\n {items.map((a, i) => {\n const Icon = (a.mimeType ?? '').startsWith('image/') ? ImageIcon : FileText\n return (\n <li key={a.id}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setPreview(i)}\n className=\"font-normal whitespace-normal justify-start flex w-full items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-muted/40\"\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm\">{a.fileName}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n {a.pending ? 'Arquivo ainda não disponível' : [size(a.fileSize), a.createdAt?.slice(0, 10).split('-').reverse().join('/')].filter(Boolean).join(' · ')}\n </p>\n </div>\n <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n\n {provider.addInvoiceAttachment && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setOver(true) }}\n onDragLeave={() => setOver(false)}\n onDrop={(e) => { e.preventDefault(); setOver(false); void upload(e.dataTransfer.files) }}\n disabled={uploading > 0}\n className={`font-normal whitespace-normal justify-start ${`flex w-full flex-col items-center gap-1 rounded-card border-2 border-dashed px-4 py-5 text-center transition-colors ${\n over ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n }`}`}\n >\n {uploading > 0\n ? <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n : <UploadCloud className=\"h-5 w-5 text-muted-foreground\" aria-hidden />}\n <span className=\"text-sm font-medium\">{uploading > 0 ? 'Enviando…' : 'Solte arquivos aqui ou clique para escolher'}</span>\n <span className=\"text-[11px] text-muted-foreground\">Imagem ou PDF, até 15 MB</span>\n </Button>\n )}\n <input\n ref={inputRef}\n type=\"file\"\n accept={ACCEPT}\n multiple\n className=\"hidden\"\n onChange={(e) => { const f = e.target.files; if (f) void upload(f); e.target.value = '' }}\n />\n </ModalBody>\n <ModalFooter>\n {/* After an upload the person needs a clear \"done\", not a hunt for the X. */}\n <Button onClick={onClose} disabled={uploading > 0} variant={added > 0 ? 'default' : 'outline'}>\n {uploading > 0 ? 'Enviando…' : added > 0 ? 'Concluir' : 'Fechar'}\n </Button>\n </ModalFooter>\n </>)}\n </ModalContent>\n </Modal>\n )\n}\n\nfunction AttachmentPreview({ items, index, onIndex, onBack }: {\n items: InvoiceAttachment[]\n index: number\n onIndex: (i: number) => void\n onBack: () => void\n}) {\n const doc = items[index]\n const isImage = (doc.mimeType ?? '').startsWith('image/')\n const isPdf = doc.mimeType === 'application/pdf'\n const go = (d: number) => onIndex((index + d + items.length) % items.length)\n return (\n <>\n <ModalHeader>\n <div className=\"flex items-center gap-2 pr-8\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onBack}\n className=\"font-normal inline-flex shrink-0 items-center gap-1 rounded-md px-1.5 py-1 text-sm text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden /> Voltar\n </Button>\n <ModalTitle className=\"min-w-0 flex-1 truncate text-sm font-medium\" title={doc.fileName}>{doc.fileName}</ModalTitle>\n {items.length > 1 && (\n <span className=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => go(-1)} aria-label=\"Anterior\" className=\"font-normal rounded-md p-1 hover:bg-muted\"><ChevronLeft className=\"h-4 w-4\" /></Button>\n {index + 1} de {items.length}\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => go(1)} aria-label=\"Próximo\" className=\"font-normal rounded-md p-1 hover:bg-muted\"><ChevronRight className=\"h-4 w-4\" /></Button>\n </span>\n )}\n {doc.url && (\n <a\n href={doc.url} target=\"_blank\" rel=\"noreferrer\" aria-label=\"Abrir em nova aba\"\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n </ModalHeader>\n <ModalBody>\n <div className=\"flex h-[65vh] items-center justify-center overflow-hidden rounded-card bg-muted/40\">\n {doc.pending || !doc.url ? (\n <p className=\"max-w-sm p-8 text-center text-sm text-muted-foreground\">\n O registro deste anexo atravessou, o arquivo ainda não. Ele continua no V1 — procure por{' '}\n <span className=\"font-mono text-xs\">{doc.fileName}</span>.\n </p>\n ) : isImage ? (\n <img src={doc.url} alt={doc.fileName} className=\"max-h-full max-w-full object-contain\" />\n ) : isPdf ? (\n <iframe src={doc.url} title={doc.fileName} className=\"h-full w-full bg-white\" />\n ) : (\n <p className=\"p-8 text-center text-sm text-muted-foreground\">Este tipo de arquivo não tem pré-visualização. Use o botão de abrir.</p>\n )}\n </div>\n </ModalBody>\n </>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { Ban } from 'lucide-react'\nimport { Badge, Button, Checkbox, ChoiceSelect, ModalTask, SegmentedControl, Skeleton, toast, Input } from '@fayz-ai/ui'\nimport { useFinancialConfig, useFinancialProvider, formatCurrency } from '../context'\nimport { createIdempotencyKey } from '@fayz-ai/financial/data/idempotency'\nimport type { CancellationReason, InvoiceItem, InvoiceStockEntry, StockDestination } from '@fayz-ai/financial/domain/invoice'\n\n// V1 contract: financeiro/contas-a-pagar-cancelamento/FLOW.md — the wording below is V1's, word for word.\nconst DESTINATIONS: Array<{ value: StockDestination; label: string }> = [\n { value: 'devolver', label: 'Devolver ao fornecedor' },\n { value: 'perda', label: 'Baixar como perda' },\n { value: 'manter', label: 'Manter no estoque' },\n]\n\nfunction day(iso: string): string {\n const [y, m, d] = iso.slice(0, 10).split('-')\n return `${d}/${m}/${y}`\n}\n\nfunction CancelReasonFields({ reasons, reasonId, onReason, detail, onDetail }: {\n reasons: CancellationReason[] | null\n reasonId?: string\n onReason: (id: string | undefined) => void\n detail: string\n onDetail: (value: string) => void\n}) {\n return (\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">Motivo do cancelamento</div>\n {reasons === null\n ? <Skeleton className=\"h-9 w-full\" />\n : (\n <ChoiceSelect\n aria-label=\"Motivo do cancelamento\"\n options={reasons.map((r) => ({ value: r.id, label: r.name }))}\n value={reasonId}\n onChange={onReason}\n placeholder=\"Selecione um motivo...\"\n />\n )}\n <textarea\n value={detail}\n onChange={(e) => onDetail(e.target.value)}\n placeholder=\"Detalhe (opcional)...\"\n className=\"min-h-20 w-full resize-y rounded-input border border-input bg-card px-3 py-2 text-sm\"\n />\n </div>\n )\n}\n\nexport function CancelInvoiceDialog({ invoiceId, counterpartyName, totalAmount, items, preselectItemId, onClose, onCancelled }: {\n invoiceId: string\n counterpartyName?: string\n totalAmount: number\n /** Live (not yet cancelled) lines of the invoice. */\n items: InvoiceItem[]\n /** Opened from one line's own Cancelar: only that line starts checked. */\n preselectItemId?: string\n onClose: () => void\n onCancelled: () => void\n}) {\n const { currency } = useFinancialConfig()\n const provider = useFinancialProvider()\n const [selected, setSelected] = useState<Set<string>>(\n () => new Set(preselectItemId ? [preselectItemId] : items.map((i) => i.id)),\n )\n const [reasons, setReasons] = useState<CancellationReason[] | null>(null)\n const [reasonId, setReasonId] = useState<string | undefined>()\n const [detail, setDetail] = useState('')\n const [entries, setEntries] = useState<InvoiceStockEntry[] | null>(null)\n const [destinations, setDestinations] = useState<Record<string, { destination?: StockDestination; note: string }>>({})\n const [busy, setBusy] = useState(false)\n const requestKey = useRef(createIdempotencyKey('financial:invoice-cancel-items'))\n\n useEffect(() => {\n let alive = true\n Promise.all([\n provider.listCancellationReasons?.() ?? Promise.resolve([]),\n provider.getInvoiceStockEntries?.(invoiceId) ?? Promise.resolve([]),\n ]).then(([r, e]) => { if (alive) { setReasons(r); setEntries(e) } })\n .catch((err) => { if (alive) { setReasons([]); setEntries([]); toast.error('Não foi possível carregar o cancelamento', { description: err?.message }) } })\n return () => { alive = false }\n }, [provider, invoiceId])\n\n const whole = items.length > 0 && items.every((i) => selected.has(i.id))\n const amount = whole ? totalAmount : items.filter((i) => selected.has(i.id)).reduce((s, i) => s + i.totalAmount, 0)\n\n // One row per stocked line, however many locations it entered.\n const stocked = useMemo(() => {\n const byItem = new Map<string, { entered: number; enteredOn: string }>()\n for (const e of entries ?? []) {\n const cur = byItem.get(e.itemId)\n byItem.set(e.itemId, { entered: (cur?.entered ?? 0) + e.entered, enteredOn: cur?.enteredOn ?? e.enteredOn })\n }\n return byItem\n }, [entries])\n const stockedSelected = items.filter((i) => selected.has(i.id) && stocked.has(i.id))\n\n const missing = selected.size === 0\n ? 'Selecione pelo menos um item'\n : stockedSelected.find((i) => !destinations[i.id]?.destination)\n ? 'Diga o que acontece com a mercadoria'\n : !reasonId\n ? 'Escolha o motivo do cancelamento'\n : null\n\n function toggle(id: string, on: boolean) {\n setSelected((prev) => {\n const next = new Set(prev)\n if (on) next.add(id); else next.delete(id)\n return next\n })\n }\n\n async function submit() {\n if (missing || !reasonId || !provider.cancelInvoiceItems) return\n setBusy(true)\n try {\n const result = await provider.cancelInvoiceItems({\n invoiceId,\n itemIds: whole ? [] : [...selected],\n reasonId,\n detail,\n stock: stockedSelected.map((i) => ({\n itemId: i.id, destination: destinations[i.id]!.destination!, note: destinations[i.id]?.note,\n })),\n idempotencyKey: requestKey.current,\n })\n if (result.creditAmount > 0) {\n toast.success(result.whole ? 'Conta cancelada' : 'Itens cancelados', {\n description: `${formatCurrency(result.creditAmount, currency)} em pagamentos ficaram como crédito${counterpartyName ? ` de ${counterpartyName}` : ''}.`,\n })\n } else {\n toast.success(result.whole ? 'Conta cancelada' : 'Itens cancelados')\n }\n onCancelled()\n } catch (err: any) {\n toast.error('Não foi possível cancelar', { description: err?.message })\n requestKey.current = createIdempotencyKey('financial:invoice-cancel-items')\n } finally {\n setBusy(false)\n }\n }\n\n const loading = reasons === null || entries === null\n\n return (\n <ModalTask\n open\n title={<span className=\"inline-flex items-center gap-2 text-destructive\"><Ban className=\"h-4 w-4\" /> Cancelar</span>}\n width=\"max-w-lg\"\n onClose={onClose}\n >\n <div className=\"fz-container min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n {/* In the body, not the header hint: the hint is one line and cut the sentence mid-word. */}\n <p className=\"text-sm text-muted-foreground\">\n Selecione o que cancelar. Pagamentos já alocados ao que for cancelado serão liberados como crédito{counterpartyName ? ` de ${counterpartyName}` : ''}.\n </p>\n {items.length > 1 && (\n <label className=\"flex cursor-pointer items-center gap-3 rounded-lg border border-destructive/30 bg-destructive-soft px-3 py-2.5 text-sm font-medium text-destructive\">\n <Checkbox\n checked={whole}\n indeterminate={!whole && selected.size > 0}\n color=\"destructive\"\n onChange={(on) => setSelected(on ? new Set(items.map((i) => i.id)) : new Set())}\n />\n Cancelar a conta inteira\n </label>\n )}\n\n <div className=\"space-y-2\">\n {items.map((it) => (\n <label key={it.id} className=\"flex cursor-pointer items-center gap-3 rounded-lg border px-3 py-2.5\">\n <Checkbox checked={selected.has(it.id)} onChange={(on) => toggle(it.id, on)} />\n <span className=\"min-w-0 flex-1 truncate text-sm\">{it.description}</span>\n {loading\n ? <Skeleton className=\"h-5 w-16\" />\n : stocked.has(it.id) && <Badge variant=\"success\" className=\"shrink-0\">No estoque</Badge>}\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{formatCurrency(it.totalAmount, currency)}</span>\n </label>\n ))}\n </div>\n\n {stockedSelected.length > 0 && (\n <div className=\"space-y-4 rounded-lg border border-warning/40 bg-warning-soft p-3\">\n <p className=\"text-xs text-warning-soft-foreground\">\n Estes itens deram entrada no estoque. Diga o que acontece com a mercadoria: o destino vale para o saldo que ainda está na posição; o que já foi consumido fica registrado.\n </p>\n {stockedSelected.map((it) => {\n const info = stocked.get(it.id)!\n const choice = destinations[it.id]\n return (\n <div key={it.id} className=\"space-y-2\">\n <div>\n <div className=\"text-sm font-medium\">{it.description}</div>\n <div className=\"text-xs text-muted-foreground\">\n Entrou no estoque: {info.entered.toLocaleString('pt-BR')} · {day(info.enteredOn)}\n </div>\n </div>\n <SegmentedControl<StockDestination | ''>\n aria-label={`Destino de ${it.description}`}\n options={DESTINATIONS}\n value={choice?.destination ?? ''}\n onChange={(v) => setDestinations((d) => ({ ...d, [it.id]: { note: d[it.id]?.note ?? '', destination: v || undefined } }))}\n className=\"flex-wrap\"\n />\n <Input\n value={choice?.note ?? ''}\n onChange={(e) => setDestinations((d) => ({ ...d, [it.id]: { destination: d[it.id]?.destination, note: e.target.value } }))}\n placeholder=\"Observação (ex.: nota de devolução 8226400)\"\n />\n </div>\n )\n })}\n </div>\n )}\n\n <div className=\"flex items-center justify-between border-t pt-3 text-sm font-medium\">\n <span>{whole ? 'Conta inteira será cancelada' : 'Total a cancelar'}</span>\n <span className=\"tabular-nums\">{formatCurrency(amount, currency)}</span>\n </div>\n\n <CancelReasonFields reasons={reasons} reasonId={reasonId} onReason={setReasonId} detail={detail} onDetail={setDetail} />\n </div>\n\n <div className=\"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3\">\n {missing && !loading && <span className=\"mr-auto text-xs text-muted-foreground\">{missing}</span>}\n <Button variant=\"outline\" size=\"sm\" onClick={onClose} disabled={busy}>Voltar</Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={submit} disabled={busy || loading || !!missing}>\n <Ban className=\"h-3.5 w-3.5\" />\n {busy ? 'Cancelando…' : whole ? 'Cancelar conta' : 'Cancelar itens'}\n </Button>\n </div>\n </ModalTask>\n )\n}\n\nexport interface CancelInvoiceTarget {\n id: string\n label: string\n counterpartyName?: string\n totalAmount: number\n}\n\n/**\n * Cancel from a list. One invoice opens the same dialog as its detail screen;\n * several share one reason and are cancelled whole, one by one.\n */\nexport function CancelInvoicesDialog({ targets, onClose, onCancelled }: {\n targets: CancelInvoiceTarget[]\n onClose: () => void\n onCancelled: () => void\n}) {\n if (targets.length === 1) return <CancelOneFromList target={targets[0]!} onClose={onClose} onCancelled={onCancelled} />\n return <CancelManyDialog targets={targets} onClose={onClose} onCancelled={onCancelled} />\n}\n\nfunction CancelOneFromList({ target, onClose, onCancelled }: {\n target: CancelInvoiceTarget\n onClose: () => void\n onCancelled: () => void\n}) {\n const provider = useFinancialProvider()\n const [loaded, setLoaded] = useState<{ items: InvoiceItem[]; totalAmount: number; counterpartyName?: string } | null>(null)\n\n useEffect(() => {\n let alive = true\n Promise.all([provider.getInvoiceItems(target.id), provider.getInvoiceById(target.id)])\n .then(([items, invoice]) => {\n if (!alive) return\n setLoaded({\n items: items.filter((i) => !i.cancelledAt),\n // The list row may be one installment; the dialog cancels the invoice.\n totalAmount: invoice?.totalAmount ?? target.totalAmount,\n counterpartyName: invoice?.contactName ?? target.counterpartyName,\n })\n })\n .catch((err) => { if (alive) { toast.error('Não foi possível carregar o cancelamento', { description: err?.message }); onClose() } })\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, target.id])\n\n if (!loaded) {\n return (\n <ModalTask\n open\n title={<span className=\"inline-flex items-center gap-2 text-destructive\"><Ban className=\"h-4 w-4\" /> Cancelar</span>}\n width=\"max-w-lg\"\n onClose={onClose}\n >\n <div className=\"space-y-3 px-5 py-4\">\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n </ModalTask>\n )\n }\n return (\n <CancelInvoiceDialog\n invoiceId={target.id}\n counterpartyName={loaded.counterpartyName}\n totalAmount={loaded.totalAmount}\n items={loaded.items}\n onClose={onClose}\n onCancelled={onCancelled}\n />\n )\n}\n\nfunction CancelManyDialog({ targets, onClose, onCancelled }: {\n targets: CancelInvoiceTarget[]\n onClose: () => void\n onCancelled: () => void\n}) {\n const { currency } = useFinancialConfig()\n const provider = useFinancialProvider()\n const [reasons, setReasons] = useState<CancellationReason[] | null>(null)\n const [reasonId, setReasonId] = useState<string | undefined>()\n const [detail, setDetail] = useState('')\n const [busy, setBusy] = useState(false)\n const requestKey = useRef(createIdempotencyKey('financial:invoice-bulk-cancel'))\n\n useEffect(() => {\n let alive = true\n ;(provider.listCancellationReasons?.() ?? Promise.resolve([]))\n .then((r) => { if (alive) setReasons(r) })\n .catch((err) => { if (alive) { setReasons([]); toast.error('Não foi possível carregar o cancelamento', { description: err?.message }) } })\n return () => { alive = false }\n }, [provider])\n\n const total = targets.reduce((s, x) => s + x.totalAmount, 0)\n\n async function submit() {\n if (!reasonId) return\n setBusy(true)\n let done = 0\n let failed = 0\n let firstError: string | undefined\n const reasonName = reasons?.find((r) => r.id === reasonId)?.name ?? ''\n for (const target of targets) {\n const idempotencyKey = `${requestKey.current}:${target.id}`\n try {\n if (provider.cancelInvoiceItems) {\n await provider.cancelInvoiceItems({ invoiceId: target.id, itemIds: [], reasonId, detail, stock: [], idempotencyKey })\n } else {\n await provider.cancelInvoice({ invoiceId: target.id, reason: [reasonName, detail.trim()].filter(Boolean).join(' — '), idempotencyKey })\n }\n done++\n } catch (err: any) {\n failed++\n firstError ??= err?.message\n }\n }\n setBusy(false)\n if (done > 0) toast.success(done === 1 ? '1 conta cancelada' : `${done} contas canceladas`)\n if (failed > 0) {\n toast.error(failed === 1 ? '1 conta não pôde ser cancelada' : `${failed} contas não puderam ser canceladas`, {\n description: firstError ?? 'Abra a conta para cancelar: ela pode ter mercadoria no estoque.',\n })\n }\n onCancelled()\n }\n\n return (\n <ModalTask\n open\n title={<span className=\"inline-flex items-center gap-2 text-destructive\"><Ban className=\"h-4 w-4\" /> Cancelar</span>}\n width=\"max-w-lg\"\n onClose={onClose}\n >\n <div className=\"fz-container min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <p className=\"text-sm text-muted-foreground\">\n As {targets.length} contas abaixo serão canceladas por inteiro. Pagamentos já alocados a elas serão liberados como crédito.\n </p>\n <div className=\"max-h-48 space-y-2 overflow-y-auto\">\n {targets.map((x) => (\n <div key={x.id} className=\"flex items-center gap-3 rounded-lg border px-3 py-2.5\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">{x.label}</span>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{formatCurrency(x.totalAmount, currency)}</span>\n </div>\n ))}\n </div>\n <div className=\"flex items-center justify-between border-t pt-3 text-sm font-medium\">\n <span>Total a cancelar</span>\n <span className=\"tabular-nums\">{formatCurrency(total, currency)}</span>\n </div>\n <CancelReasonFields reasons={reasons} reasonId={reasonId} onReason={setReasonId} detail={detail} onDetail={setDetail} />\n </div>\n\n <div className=\"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3\">\n {!reasonId && reasons !== null && <span className=\"mr-auto text-xs text-muted-foreground\">Escolha o motivo do cancelamento</span>}\n <Button variant=\"outline\" size=\"sm\" onClick={onClose} disabled={busy}>Voltar</Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={submit} disabled={busy || reasons === null || !reasonId}>\n <Ban className=\"h-3.5 w-3.5\" />\n {busy ? 'Cancelando…' : 'Cancelar contas'}\n </Button>\n </div>\n </ModalTask>\n )\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { PackagePlus } from 'lucide-react'\nimport { Button, ChoiceSelect, Input, CurrencyInput, ModalTask, SearchSelect, Skeleton, toast } from '@fayz-ai/ui'\nimport { useHouseCurrency } from '@fayz-ai/admin'\nimport { resolveCurrency } from '@fayz-ai/core'\nimport { useFinancialConfig, useFinancialProvider, formatCurrency } from '../context'\nimport { createIdempotencyKey } from '@fayz-ai/financial/data/idempotency'\nimport type { InvoiceItem } from '@fayz-ai/financial/domain/invoice'\n\ntype Variant = { id: string; name: string; isDefault: boolean }\ntype Entered = { variantName?: string; quantity: number }\n\nconst num = (text: string) => Number(text.replace(',', '.')) || 0\n\n/**\n * One bill line into stock, as it really arrived: which product, where, and how\n * many of each size. The count is what was received, not what was billed, and\n * the line can be received again later for what comes next.\n */\nexport function ReceiveStockDialog({ item, invoiceCurrency, entered, onClose, onReceived }: {\n item: InvoiceItem\n /** The bill's own currency; the stock side converts it to its unit's. */\n invoiceCurrency?: string\n /** What this line already brought into stock. */\n entered?: Entered[]\n onClose: () => void\n onReceived: () => void\n}) {\n const { currency } = useFinancialConfig()\n const provider = useFinancialProvider()\n const house = useHouseCurrency()\n const billCurrency = resolveCurrency(currency, invoiceCurrency)\n const linkedProductId = item.itemKind === 'product' ? item.referenceId : undefined\n\n const [locations, setLocations] = useState<Array<{ id: string; name: string }> | null>(null)\n const [locationId, setLocationId] = useState<string | undefined>()\n const [product, setProduct] = useState<{ id: string; name: string } | null>(null)\n const [variants, setVariants] = useState<Variant[] | null>(null)\n const [quantities, setQuantities] = useState<Record<string, string>>({})\n const billedUnitCost = item.quantity ? item.totalAmount / item.quantity : item.unitPrice\n const [unitCost, setUnitCost] = useState(Math.round(billedUnitCost * 100) / 100)\n // Until the person types a cost, it follows what arrived: the line's value\n // spread over the units received.\n const [costTouched, setCostTouched] = useState(false)\n // The day's rate, looked up — never typed. `undefined` while loading, `null` when there is none.\n const [fx, setFx] = useState<number | null | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const requestKey = useRef(createIdempotencyKey('financial:invoice-item-stock'))\n\n const alreadyIn = (entered ?? []).reduce((sum, e) => sum + e.quantity, 0)\n const productId = linkedProductId ?? product?.id\n\n useEffect(() => {\n let alive = true\n ;(provider.listStockLocations?.() ?? Promise.resolve([])).then((rows) => {\n if (!alive) return\n setLocations(rows)\n if (rows.length === 1) setLocationId(rows[0]!.id)\n })\n // A line typed by hand usually carries the product's name: offer the match.\n if (!linkedProductId) {\n void provider.searchStockProducts?.(item.description.slice(0, 24)).then((rows) => {\n if (alive && rows.length === 1) setProduct(rows[0]!)\n })\n }\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, item.id])\n\n useEffect(() => {\n if (!productId) { setVariants(null); return }\n let alive = true\n setVariants(null)\n ;(provider.listProductVariants?.(productId) ?? Promise.resolve([])).then((rows) => {\n if (!alive) return\n // Real sizes replace the stand-in \"default\" one; a product with no sizes keeps it.\n const sized = rows.filter((v) => !v.isDefault)\n const shown = sized.length > 0 ? sized : rows.slice(0, 1)\n setVariants(shown)\n const remaining = Math.max(item.quantity - alreadyIn, 0)\n setQuantities(shown.length === 1 ? { [shown[0]!.id]: String(remaining || item.quantity) } : {})\n })\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, productId])\n\n const single = (variants?.length ?? 0) <= 1\n const entries = useMemo(\n () => (variants ?? []).map((v) => ({ variant: v, quantity: num(quantities[v.id] ?? '') })).filter((e) => e.quantity > 0),\n [variants, quantities],\n )\n const total = entries.reduce((sum, e) => sum + e.quantity, 0)\n // Bill in one currency, stock kept in another: the cost is converted on entry.\n const foreign = !!invoiceCurrency && !!house && invoiceCurrency !== house\n\n useEffect(() => {\n if (costTouched || total <= 0) return\n setUnitCost(Math.round((item.totalAmount / total) * 100) / 100)\n }, [costTouched, total, item.totalAmount])\n\n useEffect(() => {\n if (!foreign || !invoiceCurrency || !house) return\n let alive = true\n setFx(undefined)\n ;(provider.getFxRate?.(invoiceCurrency, house) ?? Promise.resolve(null))\n .then((value) => { if (alive) setFx(value) })\n .catch(() => { if (alive) setFx(null) })\n return () => { alive = false }\n }, [provider, foreign, invoiceCurrency, house])\n\n const missing = !productId\n ? 'Escolha o produto desta linha'\n : !locationId\n ? 'Escolha onde a mercadoria entra'\n : total <= 0\n ? 'Informe quanto chegou'\n : null\n\n async function submit() {\n if (missing || !locationId || !provider.receiveInvoiceItemStock) return\n setBusy(true)\n try {\n await provider.receiveInvoiceItemStock({\n itemId: item.id,\n locationId,\n productId: linkedProductId ? undefined : product?.id,\n // The stand-in variant is the stock side's default; naming it is not needed.\n entries: entries.map((e) => ({ variantId: e.variant.isDefault ? undefined : e.variant.id, quantity: e.quantity })),\n unitCost,\n fxRate: foreign && fx ? fx : undefined,\n idempotencyKey: requestKey.current,\n })\n toast.success(`${total.toLocaleString('pt-BR')} em estoque`)\n onReceived()\n } catch (err: any) {\n toast.error('Não foi possível dar entrada', { description: err?.message })\n requestKey.current = createIdempotencyKey('financial:invoice-item-stock')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <ModalTask\n open\n title={<span className=\"inline-flex items-center gap-2\"><PackagePlus className=\"h-4 w-4\" /> Dar entrada no estoque</span>}\n width=\"max-w-lg\"\n onClose={onClose}\n >\n <div className=\"fz-container min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <div className=\"rounded-lg border px-3 py-2.5\">\n <div className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">{item.description}</span>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">\n {item.quantity} × {formatCurrency(billedUnitCost, billCurrency)}\n </span>\n </div>\n {alreadyIn > 0 && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Já entrou: {alreadyIn.toLocaleString('pt-BR')}\n {(entered ?? []).some((e) => e.variantName)\n ? ` (${(entered ?? []).map((e) => `${e.quantity.toLocaleString('pt-BR')} ${e.variantName ?? ''}`.trim()).join(', ')})`\n : ''}\n </p>\n )}\n </div>\n\n {!linkedProductId && (\n <div className=\"space-y-1.5\">\n <div className=\"text-sm font-medium\">Produto</div>\n <SearchSelect\n value={product?.id}\n displayValue={product?.name}\n onChange={(id, option) => setProduct(id && option ? { id, name: option.label } : null)}\n onSearch={async (q) => (await provider.searchStockProducts?.(q) ?? []).map((r) => ({ id: r.id, label: r.name }))}\n minChars={0}\n placeholder=\"Buscar produto do catálogo...\"\n />\n <p className=\"text-xs text-muted-foreground\">A linha passa a apontar para este produto.</p>\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"text-sm font-medium\">Local</div>\n {locations === null\n ? <Skeleton className=\"h-9 w-full\" />\n : locations.length === 0\n ? <p className=\"text-xs text-muted-foreground\">Nenhum local de estoque cadastrado.</p>\n : (\n <ChoiceSelect\n aria-label=\"Local de estoque\"\n options={locations.map((l) => ({ value: l.id, label: l.name }))}\n value={locationId}\n onChange={setLocationId}\n placeholder=\"Selecione o local...\"\n />\n )}\n </div>\n\n {productId && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-baseline justify-between\">\n <div className=\"text-sm font-medium\">{single ? 'Quantidade recebida' : 'Quanto chegou de cada variação'}</div>\n {!single && total > 0 && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {total.toLocaleString('pt-BR')} no total · {item.quantity.toLocaleString('pt-BR')} na conta\n </span>\n )}\n </div>\n {variants === null\n ? <Skeleton className=\"h-9 w-full\" />\n : (\n <div className={single ? '' : 'grid grid-cols-2 gap-2 @md:grid-cols-3'}>\n {variants.map((v) => (\n <label key={v.id} className={single ? 'block' : 'flex items-center gap-2 rounded-lg border px-3 py-2'}>\n {!single && <span className=\"min-w-0 flex-1 truncate text-sm\">{v.name}</span>}\n <Input\n inputMode=\"decimal\"\n aria-label={single ? 'Quantidade recebida' : `Quantidade de ${v.name}`}\n value={quantities[v.id] ?? ''}\n onChange={(e) => setQuantities((q) => ({ ...q, [v.id]: e.target.value }))}\n placeholder=\"0\"\n wrapperClassName={single ? 'w-full' : 'w-16'}\n className={`h-9 tabular-nums ${single ? '' : 'text-right'}`}\n />\n </label>\n ))}\n </div>\n )}\n {single && variants !== null && (\n <p className=\"text-xs text-muted-foreground\">\n Este produto não tem variações. Para separar por tamanho ou cor, cadastre-as no produto (aba Variações).\n </p>\n )}\n </div>\n )}\n\n {productId && (\n <div className=\"space-y-1.5\">\n <div className=\"text-sm font-medium\">Custo por unidade</div>\n <CurrencyInput\n value={unitCost}\n onChange={(v) => { setCostTouched(true); setUnitCost(v) }}\n symbol={billCurrency.symbol} locale={billCurrency.locale} currencyCode={billCurrency.code}\n />\n <p className=\"text-xs text-muted-foreground\">\n {costTouched\n ? (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setCostTouched(false)}\n className=\"font-normal whitespace-normal text-primary underline decoration-dashed underline-offset-2 hover:opacity-80\"\n >\n Voltar ao custo calculado\n </Button>\n )\n : total > 0\n ? `${formatCurrency(item.totalAmount, billCurrency)} da linha ÷ ${total.toLocaleString('pt-BR')} recebidas.`\n : 'Calculado pelo valor da linha e pela quantidade recebida.'}\n {foreign && fx ? ` Em estoque: ${formatCurrency(unitCost * fx, resolveCurrency(currency, house))} cada.` : ''}\n </p>\n </div>\n )}\n\n {foreign && productId && (\n <p className=\"text-xs text-muted-foreground\">\n {fx === undefined\n ? 'Buscando o câmbio do dia…'\n : fx\n ? `Câmbio do dia: 1 ${invoiceCurrency} = ${fx.toLocaleString('pt-BR', { maximumFractionDigits: 4 })} ${house}. A conta é em ${invoiceCurrency} e o estoque é guardado em ${house}.`\n : `Sem câmbio ${invoiceCurrency} → ${house} disponível agora. A entrada tenta buscar de novo ao confirmar.`}\n </p>\n )}\n </div>\n\n <div className=\"flex shrink-0 items-center justify-end gap-2 border-t px-5 py-3\">\n {missing && <span className=\"mr-auto text-xs text-muted-foreground\">{missing}</span>}\n <Button variant=\"outline\" size=\"sm\" onClick={onClose} disabled={busy}>Voltar</Button>\n <Button size=\"sm\" onClick={submit} disabled={busy || !!missing}>\n <PackagePlus className=\"h-3.5 w-3.5\" />\n {busy ? 'Lançando…' : total > 0 ? `Dar entrada em ${total.toLocaleString('pt-BR')}` : 'Dar entrada'}\n </Button>\n </div>\n </ModalTask>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Button, INLINE_LINK_TONE, ModalTask } from '@fayz-ai/ui'\nimport { resolveCurrency } from '@fayz-ai/core'\nimport { useFinancialConfig, formatCurrency } from '../context'\n\nexport interface StockEntryDetail {\n variantName?: string\n quantity: number\n enteredOn?: string\n /** Cost in the currency the stock is kept in. */\n unitCost?: number\n currency?: string\n /** What was paid, when in another currency, and the rate used. */\n sourceUnitCost?: number\n sourceCurrency?: string\n fxRate?: number\n locationName?: string\n}\n\nconst day = (iso?: string) => {\n if (!iso) return ''\n const [y, m, d] = iso.slice(0, 10).split('-')\n return `${d}/${m}/${y}`\n}\nconst qty = (n: number) => n.toLocaleString('pt-BR')\nconst real = (name?: string) => (name && name !== 'Padrão' ? name : undefined)\n\n/**\n * \"Entrou no estoque: 27 (10 M, 9 G, 8 GG) · 13/10/2026\" — the line V1 shows\n * under a bill item. With `onOpen` it is a link to the receipts behind it.\n */\nexport function StockEntryNote({ entries, onOpen }: { entries?: StockEntryDetail[]; onOpen?: () => void }) {\n if (!entries || entries.length === 0) return null\n const total = entries.reduce((sum, e) => sum + e.quantity, 0)\n const named = entries.filter((e) => real(e.variantName))\n const first = entries.map((e) => e.enteredOn).filter(Boolean).sort()[0]\n const text = (\n <span className=\"truncate\">\n Entrou no estoque: {qty(total)}\n {named.length > 0 && ` (${named.map((e) => `${qty(e.quantity)} ${e.variantName}`).join(', ')})`}\n {first && ` · ${day(first)}`}\n </span>\n )\n const body = <><Package className=\"h-3 w-3 shrink-0\" aria-hidden />{text}</>\n if (!onOpen) return <span className=\"inline-flex max-w-full items-center gap-1 text-success\">{body}</span>\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onOpen() }}\n className={`font-normal whitespace-normal inline-flex max-w-full items-center gap-1 text-success hover:opacity-80 ${INLINE_LINK_TONE.dashed}`}\n >\n {body}\n </Button>\n )\n}\n\n/** The receipts behind one bill line: what entered, where, at what cost — and what was paid for it. */\nexport function StockEntryDetailsDialog({ title, entries, onClose }: {\n title: string\n entries: StockEntryDetail[]\n onClose: () => void\n}) {\n const { currency } = useFinancialConfig()\n const total = entries.reduce((sum, e) => sum + e.quantity, 0)\n const stockCode = entries.find((e) => e.currency)?.currency\n const stockCurrency = resolveCurrency(currency, stockCode)\n const stockValue = entries.reduce((sum, e) => sum + e.quantity * (e.unitCost ?? 0), 0)\n const paidCode = entries.find((e) => e.sourceCurrency)?.sourceCurrency\n const paidValue = entries.reduce((sum, e) => sum + e.quantity * (e.sourceUnitCost ?? 0), 0)\n const rate = entries.find((e) => e.fxRate)?.fxRate\n\n return (\n <ModalTask\n open\n title={<span className=\"inline-flex items-center gap-2\"><Package className=\"h-4 w-4\" /> Entrada no estoque</span>}\n width=\"max-w-lg\"\n onClose={onClose}\n >\n <div className=\"fz-container min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <p className=\"truncate text-sm font-medium\">{title}</p>\n <ul className=\"divide-y rounded-lg border\">\n {entries.map((e, i) => (\n <li key={i} className=\"flex items-center gap-3 px-3 py-2.5 text-sm\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">\n {qty(e.quantity)}{real(e.variantName) ? ` × ${e.variantName}` : ''}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {[e.locationName, day(e.enteredOn)].filter(Boolean).join(' · ')}\n </p>\n </div>\n <div className=\"shrink-0 text-right\">\n <p className=\"tabular-nums\">{formatCurrency(e.unitCost ?? 0, resolveCurrency(currency, e.currency))} cada</p>\n {e.sourceCurrency && e.sourceUnitCost != null && (\n <p className=\"text-xs tabular-nums text-muted-foreground\">\n pago {formatCurrency(e.sourceUnitCost, resolveCurrency(currency, e.sourceCurrency))}\n </p>\n )}\n </div>\n </li>\n ))}\n </ul>\n <dl className=\"space-y-1 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Total recebido</dt>\n <dd className=\"font-medium tabular-nums\">{qty(total)}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Valor em estoque</dt>\n <dd className=\"font-medium tabular-nums\">{formatCurrency(stockValue, stockCurrency)}</dd>\n </div>\n {paidCode && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Valor pago</dt>\n <dd className=\"tabular-nums\">{formatCurrency(paidValue, resolveCurrency(currency, paidCode))}</dd>\n </div>\n )}\n {paidCode && rate && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Câmbio usado</dt>\n <dd className=\"tabular-nums\">1 {paidCode} = {rate.toLocaleString('pt-BR', { maximumFractionDigits: 4 })} {stockCode}</dd>\n </div>\n )}\n </dl>\n </div>\n </ModalTask>\n )\n}\n","import React, { useEffect, useState, useRef } from 'react'\nimport { Paperclip, Pencil, DollarSign, MoreVertical, Ban, CreditCard, Building2, Package, PackagePlus, CircleDashed, CircleEllipsis, CircleCheckBig, CircleAlert, CalendarDays, ExternalLink, LayoutList, Layers, Undo2 } from 'lucide-react'\nimport {\n PersonLink,\n OrderDetailView, OrderDetailBlock, OrderDetailSkeleton,\n type OrderDetailItem, type OrderDetailTotalRow, type OrderDetailTone, PageActions, useUnitStore, WidgetSlot } from '@fayz-ai/admin'\nimport { useFinancialConfig, useFinancialStore, useFinancialProvider, formatCurrency, type ResolvedFinancialConfig } from '../context'\nimport { ITEM_ICONS } from '../lib/item-icons'\nimport { SubpageHeader, ModalTask, DatePicker, Textarea, toast, Checkbox } from '@fayz-ai/ui'\nimport { PaymentModal } from '../components/PaymentModal'\nimport { InstallmentSourceFields } from '../components/InstallmentSource'\nimport { InstallmentActionButton, InstallmentPayButton, InstallmentReceiptButton, InstallmentRow } from '../components/InstallmentRow'\nimport { useTranslation, useDataChanged, useUnitMode } from '@fayz-ai/core'\nimport { CurrencyScope, TagChip, useCurrency } from '@fayz-ai/admin'\nimport { T } from '@fayz-ai/financial/data/tables'\nimport { FINANCIAL_INVOICE_ZONES } from '../lib/routes'\nimport { Button } from '@fayz-ai/ui'\nimport { groupPaymentsByBill, reversiblePayments } from '@fayz-ai/financial/domain/movement'\nimport { describePayment, paymentHolderId } from '@fayz-ai/financial/domain/payment-method'\nimport { PaymentReceiptModal } from '../components/PaymentReceiptModal'\nimport type { Invoice, InvoiceItem, InvoiceAttachment } from '@fayz-ai/financial/domain/invoice'\nimport type { FinancialMovement, TransactionDirection } from '@fayz-ai/financial/domain/movement'\nimport type { BankAccount } from '@fayz-ai/financial/domain/account'\nimport { createIdempotencyKey } from '@fayz-ai/financial/data/idempotency'\nimport { rebalanceInstallments } from '../lib/installment-amounts'\nimport { CardVisual } from './cardChip'\nimport { InvoiceAttachmentsModal } from '../components/InvoiceAttachmentsModal'\nimport { CancelInvoiceDialog } from '../components/CancelInvoiceDialog'\nimport { ReceiveStockDialog } from '../components/ReceiveStockDialog'\nimport { StockEntryNote, StockEntryDetailsDialog, type StockEntryDetail } from '../components/StockEntryNote'\nimport { METHOD_ICONS } from '../components/PaymentIcons'\n\n/**\n * O desenho de cada espécie de LINHA.\n *\n * Os mesmos ícones que o seletor de tipo do formulário usa — quem escolheu\n * «Serviço» com a pastinha reconhece a pastinha na leitura. `other` é a gaveta\n * e leva o recibo; sem tipo, o genérico.\n */\n\n/** O desenho de cada espécie de forma de pagamento — a mesma família do diálogo. */\n\nconst STATUS_COLORS: Record<string, { bg: string; icon: React.ElementType; labelKey: string; tone: OrderDetailTone }> = {\n open: { bg: 'bg-info-soft text-info-soft-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusOpen', tone: 'info' },\n pending: { bg: 'bg-warning-soft text-warning-soft-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusPending', tone: 'warning' },\n partial: { bg: 'bg-warning-soft text-warning-soft-foreground', icon: CircleEllipsis, labelKey: 'financial.invoice.statusPartial', tone: 'warning' },\n paid: { bg: 'bg-success-soft text-success-soft-foreground', icon: CircleCheckBig, labelKey: 'financial.invoice.statusPaid', tone: 'success' },\n overdue: { bg: 'bg-destructive-soft text-destructive-soft-foreground', icon: CircleAlert, labelKey: 'financial.invoice.statusOverdue', tone: 'destructive' },\n draft: { bg: 'bg-muted text-muted-foreground', icon: CircleDashed, labelKey: 'financial.invoice.statusDraft', tone: 'muted' },\n cancelled: { bg: 'bg-muted text-muted-foreground', icon: Ban, labelKey: 'financial.invoice.statusCancelled', tone: 'muted' },\n}\n\n/**\n * O rótulo humano de um `itemKind`, ou nada.\n *\n * Devolver o valor cru era pior que devolver vazio: \"other\" ocupa a linha de\n * apoio dizendo ao operador que existe uma classificação — e não diz qual.\n */\nfunction itemKindLabel(kind: string | undefined, t: (k: string) => string): string | undefined {\n if (!kind || kind === 'other') return undefined\n const label = t(`financial.itemKind.${kind}`)\n return label.startsWith('financial.itemKind.') ? undefined : label\n}\n\nexport function InvoiceDetailView({ invoiceId, direction, onBack, onEdit, backLabel, embedded }: {\n invoiceId: string\n direction: TransactionDirection\n onBack: () => void\n /** Absent hides the edit action — an embedded view may have nowhere to send it. */\n /** `itemIndex` abre a edição com aquela linha já expandida (o lápis do item). */\n onEdit?: (itemIndex?: number) => void\n /** Label for the back link — defaults to the invoice's parent list (payables/receivables). */\n backLabel?: string\n /** Inside a modal task: the frame already carries title + back, so the\n * subpage header row is skipped. */\n embedded?: boolean\n}) {\n const t = useTranslation()\n const config = useFinancialConfig()\n // Back link target: where the user actually came from, else the parent list.\n const parentLabel = backLabel ?? (direction === 'debit' ? t('financial.nav.payables') : t('financial.nav.receivables'))\n\n const provider = useFinancialProvider()\n const paymentMethods = useFinancialStore((s) => s.paymentMethods)\n const paymentMethodTypes = useFinancialStore((s) => s.paymentMethodTypes)\n const bankAccounts = useFinancialStore((s) => s.bankAccounts)\n const fetchPaymentMethods = useFinancialStore((s) => s.fetchPaymentMethods)\n const fetchBankAccounts = useFinancialStore((s) => s.fetchBankAccounts)\n const reverseMovements = useFinancialStore((s) => s.reverseMovements)\n const [detailsLoaded, setDetailsLoaded] = useState(false)\n const [detailsLoading, setDetailsLoading] = useState(false)\n\n const [invoice, setInvoice] = useState<Invoice | null>(null)\n\n // O NOME da unidade do documento. O `unitId` sozinho não diz nada a quem lê;\n // o store do back office é quem sabe traduzir, e devolve vazio quando o\n // tenant não trabalha com unidades — aí o bloco não aparece.\n //\n // DEPOIS do `useState` de propósito: o seletor fecha sobre `invoice`, e um\n // `const` só existe a partir da linha em que é declarado. Acima daqui, ele\n // lança `Cannot access 'invoice' before initialization` no primeiro render e\n // a tela de detalhe não abre.\n // The unit tree loads even with unit mode off (the settings card counts it),\n // so the name alone does not say the tenant works with units.\n // The bill's own currency, not the house's: it keeps what it was written in.\n const currency = useCurrency(config.currency, invoice?.currency)\n const unitMode = useUnitMode()\n const unitName = useUnitStore((st) => (unitMode && invoice?.unitId ? st.byId[invoice.unitId]?.name : undefined))\n const [items, setItems] = useState<InvoiceItem[]>([])\n // Os recibos da conta. Do TÍTULO, não da parcela: um comprovante prova a\n // conta, não a terceira parcela dela — então toda parcela mostra o mesmo\n // clipe, que é o que a tela do V1 faz.\n const [attachments, setAttachments] = useState<InvoiceAttachment[]>([])\n // O visor. `null` fechado; um índice abre naquele anexo.\n const [movements, setMovements] = useState<FinancialMovement[]>([])\n const [payments, setPayments] = useState<FinancialMovement[]>([])\n // The accounts the payments moved through, by id. Its own lookup and not the\n // store's list: that one is active accounts only, and a bill paid from an\n // account closed since then would lose where it was paid.\n const [holders, setHolders] = useState<Map<string, BankAccount>>(new Map())\n const [loading, setLoading] = useState(true)\n // O detalhe lê quatro fontes de uma vez. Qualquer uma que caia derruba o\n // Promise.all inteiro — e sem isto aqui a tela ficava no esqueleto para\n // sempre, porque `setLoading(false)` vivia depois do await que rejeitou.\n const [error, setError] = useState<string | null>(null)\n // The payments an \"Estornar\" undoes. An installment settled in two payments\n // is reversed whole by default; undoing only the last one left it \"Parcial\".\n const [reversing, setReversing] = useState<FinancialMovement[] | null>(null)\n const [reverseKeep, setReverseKeep] = useState<Set<string>>(new Set())\n // O recibo de UM pagamento. A tira de texto dentro da parcela dizia tudo\n // numa linha truncada e não oferecia nenhuma ação — ver PaymentReceiptModal.\n // O RECIBO DA PARCELA. A parcela paga abria um acordeão com uma tira de\n // texto truncada e nenhuma ação; no V1 ela abre o diálogo de pagamento\n // direto. Duas formas de ver a mesma coisa é pior que a errada sozinha, então\n // o acordeão saiu. Ver PaymentReceiptModal.\n const [receiptBill, setReceiptBill] = useState<FinancialMovement | null>(null)\n const [reverseReason, setReverseReason] = useState('')\n const [payingMovement, setPayingMovement] = useState<FinancialMovement | null>(null)\n // Recibo no cronograma: fotografar o comprovante É registrar o pagamento — o\n // papel na mão prova que já saiu. A foto abre o mesmo diálogo de pagar com ela\n // dentro, e é dessa imagem que a leitura automática (forma, final do cartão,\n // valor) vai sair — ver TODO(FAY-1230) em ReceiptPicker.\n const [attachmentsOpen, setAttachmentsOpen] = useState(false)\n const [pendingReceipt, setPendingReceipt] = useState<string | undefined>()\n const [menuOpen, setMenuOpen] = useState(false)\n // `null` = closed; `''` = the header's Cancelar (every line); an id = that line's own Cancelar.\n const [cancelTarget, setCancelTarget] = useState<string | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n // POR ONDE A PARCELA VAI SAIR — respondido aqui, não só no formulário.\n //\n // Quem acompanha a conta vive NESTA tela: mandar editar a fatura inteira só\n // para dizer \"este vencimento sai pelo Pix do Itaú\" é abrir um documento para\n // mudar um campo que nem é do documento. Grava direto na parcela, que é de\n // quem o campo é, e o diálogo de pagar lê de lá.\n //\n // Otimista: a linha muda na hora e o banco confirma. Se o banco recusar, a\n // releitura devolve a verdade — é uma pré-seleção, não dinheiro.\n async function patchSource(mov: FinancialMovement, next: Record<string, string | null>) {\n const metadata = { ...(mov.metadata ?? {}), ...next }\n setMovements((prev) => prev.map((m) => (m.id === mov.id ? { ...m, metadata } : m)))\n try {\n await provider.updateInstallment?.(mov.id, { metadata })\n } catch {\n void loadData()\n }\n }\n\n /** O vencimento, pelo mesmo caminho otimista da pré-seleção. */\n async function patchDueDate(mov: FinancialMovement, dueDate: string) {\n if (!dueDate || dueDate === mov.dueDate) return\n setMovements((prev) => prev.map((m) => (m.id === mov.id ? { ...m, dueDate } : m)))\n try {\n await provider.updateInstallment?.(mov.id, { dueDate })\n } catch {\n void loadData()\n }\n }\n\n // Installment numbers whose amount was typed here; ids change when the\n // schedule is rewritten, numbers do not.\n const [pinnedAmounts, setPinnedAmounts] = useState<ReadonlySet<number>>(new Set())\n const [showCancelledRows, setShowCancelledRows] = useState(false)\n const [receiveTarget, setReceiveTarget] = useState<InvoiceItem | null>(null)\n const [stockDetailTarget, setStockDetailTarget] = useState<InvoiceItem | null>(null)\n const [stockDetails, setStockDetails] = useState<Map<string, StockEntryDetail[]>>(new Map())\n // \"27 (10 M, 9 G, 8 GG)\" when the receipts name sizes; just the count otherwise.\n const stockSummary = (itemId: string, total: number) => {\n const named = (stockDetails.get(itemId) ?? []).filter((d) => d.variantName && d.variantName !== 'Padrão')\n const count = total.toLocaleString('pt-BR')\n return named.length ? `${count} (${named.map((d) => `${d.quantity.toLocaleString('pt-BR')} ${d.variantName}`).join(', ')})` : count\n }\n const [stockVersion, setStockVersion] = useState(0)\n // Quantity that entered stock per bill line; null until known.\n const [stockByItem, setStockByItem] = useState<Map<string, number> | null>(null)\n useEffect(() => {\n let alive = true\n setStockByItem(null)\n if (direction !== 'debit' || !provider.getInvoiceStockEntries) return\n provider.getInvoiceStockEntries(invoiceId)\n .then((entries) => {\n if (!alive) return\n const byItem = new Map<string, number>()\n for (const e of entries) byItem.set(e.itemId, (byItem.get(e.itemId) ?? 0) + e.entered)\n setStockByItem(byItem)\n })\n .catch(() => { if (alive) setStockByItem(new Map()) })\n void provider.getInvoiceStockDetails?.(invoiceId).then((rows) => {\n if (!alive) return\n const byItem = new Map<string, StockEntryDetail[]>()\n for (const r of rows) byItem.set(r.itemId, [...(byItem.get(r.itemId) ?? []), r])\n setStockDetails(byItem)\n }).catch(() => {})\n return () => { alive = false }\n }, [provider, invoiceId, direction, stockVersion])\n // Rewriting the schedule is only allowed while every installment is untouched.\n const canChangeAmounts = !!provider.rescheduleInvoice && invoice?.status !== 'cancelled' && movements.length > 1\n && movements.every((m) => m.status !== 'paid' && m.status !== 'partial' && m.status !== 'cancelled' && !(m.paidAmount > 0))\n\n async function patchAmount(mov: FinancialMovement, value: number) {\n if (!invoice || !provider.rescheduleInvoice) return\n const index = movements.findIndex((m) => m.id === mov.id)\n const next = rebalanceInstallments({\n amounts: movements.map((m) => m.amount),\n index,\n value,\n total: invoice.totalAmount,\n pinned: movements.map((m) => pinnedAmounts.has(m.installmentNumber ?? 0)),\n })\n if (!next) return\n setPinnedAmounts((prev) => new Set(prev).add(mov.installmentNumber ?? 0))\n setMovements((prev) => prev.map((m, n) => ({ ...m, amount: next[n]! })))\n try {\n await provider.rescheduleInvoice(invoice.id, movements.map((m, n) => ({\n dueDate: m.dueDate,\n amount: next[n]!,\n metadata: (m.metadata ?? {}) as Record<string, unknown>,\n })))\n } catch (err: any) {\n toast.error('Não foi possível mudar o valor da parcela', { description: err?.message })\n }\n void loadData()\n }\n\n async function patchInvoiceDate(invoiceDate: string) {\n if (!invoice || !invoiceDate || invoiceDate === invoice.invoiceDate) return\n const antes = invoice\n setInvoice({ ...invoice, invoiceDate })\n try {\n await provider.updateInvoice(invoice.id, { invoiceDate })\n } catch (e: any) {\n setInvoice(antes)\n toast.error(e?.message ?? String(e))\n }\n }\n\n // `reqRef` desempata resposta velha: trocar de fatura no meio de uma leitura\n // lenta fazia a resposta anterior chegar depois e pintar a tela errada.\n const reqRef = useRef(0)\n\n async function loadData() {\n const req = ++reqRef.current\n setLoading(true)\n setError(null)\n try {\n const [inv, invItems, movResult, anexos] = await Promise.all([\n provider.getInvoiceById(invoiceId),\n provider.getInvoiceItems(invoiceId),\n // Scope to THIS invoice (not the tenant-wide first-50 page) so every\n // installment/payment loads regardless of how many movements exist.\n provider.getMovements({ direction, invoiceId, pageSize: 500 }),\n // Opcional no provider: um provider que não sabe de anexo devolve vazio\n // em vez de derrubar a tela inteira do detalhe.\n provider.getInvoiceAttachments?.(invoiceId).catch(() => []) ?? Promise.resolve([]),\n ])\n // Resposta velha não pinta: se o usuário já trocou de fatura, isto aqui\n // é o resultado da anterior.\n if (req !== reqRef.current) return\n setInvoice(inv)\n setItems(invItems)\n setAttachments(anexos)\n setMovements(\n movResult.data\n .filter((m) => m.invoiceId === invoiceId && m.movementKind === 'bill')\n .sort((a, b) => (a.installmentNumber ?? 0) - (b.installmentNumber ?? 0))\n )\n // Individual cash events (one row per payment) — listed under each installment.\n const pays = movResult.data\n .filter((m) => m.invoiceId === invoiceId && m.movementKind === 'payment')\n .sort((a, b) => (a.paymentDate ?? '').localeCompare(b.paymentDate ?? ''))\n setPayments(pays)\n // \"Pago como\" is on the row itself, not behind the expand: labels load\n // with the bill whenever it has a payment.\n if (pays.length > 0) void loadPaymentLabels(pays, req)\n } catch (e: any) {\n if (req !== reqRef.current) return\n setError(e?.message ?? String(e))\n } finally {\n // No `finally`, e não depois do `try`: o esqueleto tem de sair mesmo\n // quando a leitura falha. Era exatamente isto que faltava.\n if (req === reqRef.current) setLoading(false)\n }\n }\n\n useEffect(() => { void loadData() }, [invoiceId])\n\n // Quem pagou pode não ter sido esta tela.\n //\n // Baixar pelo modal daqui recarrega por callback (`onPaid`), e enquanto esse\n // era o único caminho bastava. O assistente é um segundo caminho: ele registra\n // o pagamento pela MESMA porta (`payMovement`), mas de fora — e o Cronograma\n // de Pagamento continuava mostrando \"pendente\" até alguém recarregar a página,\n // com o dinheiro já baixado no banco.\n //\n // `emitDataChanged` é o sinal que toda escrita do agente já dispara; faltava\n // alguém ouvindo. Escrita sem tabela atribuída alcança todo assinante, que é\n // exatamente o caso de uma RPC de plugin.\n useDataChanged({ table: T.movements }, () => { void loadData() }, [invoiceId, direction])\n\n // Close menu on click outside\n useEffect(() => {\n if (!menuOpen) return\n function handleClick(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false)\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n async function loadPaymentLabels(pays: FinancialMovement[], req: number) {\n const ids = [...new Set(pays.map(paymentHolderId).filter((id): id is string => Boolean(id)))]\n try {\n const [accounts] = await Promise.all([\n ids.length > 0 && provider.getAccountsByIds ? provider.getAccountsByIds(ids) : Promise.resolve([] as BankAccount[]),\n fetchPaymentMethods(),\n fetchBankAccounts(),\n ])\n if (req !== reqRef.current) return\n setHolders(new Map(accounts.map((a) => [a.id, a])))\n } catch {\n // Labels are a courtesy; the schedule stays usable without them.\n }\n }\n\n async function loadPaymentDetails() {\n if (detailsLoaded || detailsLoading) return\n setDetailsLoading(true)\n try {\n await Promise.all([fetchPaymentMethods(), fetchBankAccounts()])\n setDetailsLoaded(true)\n } catch {\n // The invoice remains usable while registry labels are temporarily unavailable.\n } finally {\n setDetailsLoading(false)\n }\n }\n\n // Payment method and account are part of the installment summary, not a\n // secret behind an expansion. Load their labels with the document.\n useEffect(() => { void loadPaymentDetails() }, [invoiceId])\n\n\n // O PLANO DE CONTAS TAMBÉM NO MODO LEITURA.\n //\n // A classificação aparece na linha do formulário desde que ela ganhou\n // `summary`; aqui, que é onde a conta é CONFERIDA, ela não aparecia — e\n // conferir classificação era justamente o que exigia reabrir a edição.\n // Só os nomes: esta tela não escolhe conta nenhuma.\n //\n // AQUI EM CIMA, e não junto de `detailItems`: abaixo desta linha começam\n // os returns de carregando / erro / não encontrada. Um hook depois deles é\n // contado numa pintura e não na seguinte, e o React derruba a tela — foi o\n // que aconteceu.\n const [chartNames, setChartNames] = React.useState<Map<string, string>>(new Map())\n React.useEffect(() => {\n let cancelled = false\n void provider.getChartOfAccounts()\n .then((rows) => { if (!cancelled) setChartNames(new Map(rows.map((r) => [r.id, r.name]))) })\n .catch(() => { /* sem plano de contas a linha simplesmente não o mostra */ })\n return () => { cancelled = true }\n }, [provider])\n\n if (loading) {\n // O mesmo esqueleto do pedido: duas colunas, blocos na larga e um na\n // estreita. Um esqueleto com outra silhueta faz a tela \"pular\" ao carregar.\n return <OrderDetailSkeleton parentLabel={embedded ? undefined : parentLabel} onBack={embedded ? undefined : onBack} />\n }\n\n // Falhar em LER não é a fatura não existir. Separar as duas telas é o que\n // permite oferecer \"tentar de novo\" — em \"não encontrada\" não haveria o que\n // tentar.\n if (error) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('financial.invoice.loadFailed')} onBack={onBack} parentLabel={parentLabel} />\n <div className=\"rounded-card border border-destructive/30 bg-destructive/5 px-4 py-3\">\n <p className=\"text-sm text-destructive\">{t('financial.invoice.loadFailedDesc')}</p>\n <p className=\"mt-1 text-xs text-destructive/80 break-words\">{error}</p>\n </div>\n <Button variant=\"outline\" onClick={() => void loadData()}>\n {t('financial.invoice.retry')}\n </Button>\n </div>\n )\n }\n\n if (!invoice) {\n return (\n <div className=\"space-y-6\">\n <SubpageHeader title={t('financial.invoice.notFound')} onBack={onBack} parentLabel={parentLabel} />\n <p className=\"text-sm text-muted-foreground\">{t('financial.invoice.notFoundDesc')}</p>\n </div>\n )\n }\n\n // Settlement history per installment, read from settles_movement_id.\n const settlements = groupPaymentsByBill(movements, payments)\n const accountsById = new Map(bankAccounts.map((a) => [a.id, a] as const))\n for (const [id, a] of holders) accountsById.set(id, a)\n const howCtx = { paymentMethods, paymentMethodTypes, accountsById, t }\n\n const statusConfig = STATUS_COLORS[invoice.status] ?? STATUS_COLORS.pending\n const StatusIcon = statusConfig.icon\n const totalPaid = movements.reduce((sum, m) => sum + m.paidAmount, 0)\n // A cancelled installment of a live invoice is history: listed among the ones\n // owed it reads as a schedule that does not add up to the invoice.\n const liveInstallments = movements.filter((m) => m.status !== 'cancelled')\n const splitCancelled = invoice.status !== 'cancelled' && liveInstallments.length > 0\n const scheduleRows = splitCancelled ? liveInstallments : movements\n const cancelledRows = splitCancelled ? movements.filter((m) => m.status === 'cancelled') : []\n const totalRemaining = invoice.totalAmount - totalPaid\n const counted = items.filter((it) => !it.cancelledAt)\n const subtotal = counted.reduce((sum, it) => sum + it.quantity * it.unitPrice, 0)\n const totalDiscount = counted.reduce((sum, it) => sum + it.discount, 0)\n const totalSurcharge = counted.reduce((sum, it) => sum + it.surcharge, 0)\n\n // O item na forma que o OrderDetailView fala. O `itemKind` vira a linha de\n // apoio sob o nome — a tabela antiga o mostrava como chip numa coluna que a\n // coluna estreita do layout de duas colunas não comporta.\n const liveItems = items.filter((it) => !it.cancelledAt)\n const detailItems: OrderDetailItem[] = items.map((it, i) => ({\n id: it.id ?? String(i),\n // Uma linha sem texto próprio herda o da fatura — melhor repetir o assunto\n // do que mostrar um campo vazio com um enum embaixo.\n name: it.description || invoice.itemsSummary || invoice.observations || t('financial.invoice.item'),\n // `itemKind` é vocabulário do banco, não do balcão: 'other' não diz nada a\n // ninguém e era o que sobrava quando a linha vinha sem nome. Só aparece\n // quando tem uma tradução de verdade.\n description: it.cancelledAt ? `Cancelado${it.cancelReason ? ` — ${it.cancelReason}` : ''}` : itemKindLabel(it.itemKind, t),\n struck: !!it.cancelledAt,\n // A classificação vai no campo dela, que o arquétipo desenha como pastilha\n // no meio da linha — o mesmo lugar que ela ocupa no formulário.\n account: it.accountId ? chartNames.get(it.accountId) : undefined,\n icon: ITEM_ICONS[it.itemKind ?? 'other'],\n imageUrl: it.imageUrl,\n note: stockDetails.has(it.id)\n ? <StockEntryNote entries={stockDetails.get(it.id)} onOpen={() => setStockDetailTarget(it)} />\n : undefined,\n // O LÁPIS DA LINHA. Aparece no hover (o arquétipo reserva o espaço, então\n // a coluna de valores não dança) e leva para a edição com ESTA linha\n // aberta — sem ele, conferir um item e querer corrigi-lo custava abrir a\n // edição e reencontrar ali o que o dedo já estava apontando.\n ...(invoice.status !== 'cancelled' && !it.cancelledAt\n ? { actions: [\n ...(onEdit && movements.every((m) => m.paidAmount <= 0)\n ? [{ id: 'edit', label: t('financial.invoiceForm.edit'), icon: Pencil, onSelect: () => onEdit(i) }]\n : []),\n // What already entered is stated; receiving (more) is always offered,\n // because goods rarely arrive the way the bill reads.\n ...(direction === 'debit' && stockByItem && stockByItem.has(it.id)\n ? [{ id: 'stock-status', icon: Package, disabled: true, onSelect: () => {},\n label: `No estoque: ${stockSummary(it.id, stockByItem.get(it.id)!)}` }]\n : []),\n ...(direction === 'debit' && stockByItem && provider.receiveInvoiceItemStock\n ? [{ id: 'stock', icon: PackagePlus, onSelect: () => setReceiveTarget(it),\n label: stockByItem.has(it.id) ? 'Dar entrada em mais' : 'Dar entrada no estoque' }]\n : []),\n { id: 'cancel', label: 'Cancelar', icon: Ban, intent: 'danger' as const, onSelect: () => setCancelTarget(it.id) },\n ] }\n : {}),\n quantity: it.quantity,\n unitPrice: formatCurrency(it.unitPrice, currency),\n total: formatCurrency(it.totalAmount, currency),\n }))\n // A bill with a total and no lines (a write that lost its lines) says so,\n // instead of an empty list under a total that seems to come from nowhere.\n if (detailItems.length === 0 && invoice.totalAmount > 0) {\n detailItems.push({\n id: 'no-lines',\n name: invoice.itemsSummary || invoice.observations || t('financial.invoice.item'),\n description: t('financial.invoice.noLines'),\n quantity: 1,\n unitPrice: formatCurrency(invoice.totalAmount, currency),\n total: formatCurrency(invoice.totalAmount, currency),\n })\n }\n\n const cancelled = invoice.status === 'cancelled'\n const totalRows: OrderDetailTotalRow[] = [\n ...(totalDiscount > 0 || totalSurcharge > 0\n ? [{ label: t('financial.invoice.subtotal'), value: formatCurrency(subtotal, currency), muted: true }]\n : []),\n ...(totalDiscount > 0\n ? [{ label: t('financial.invoice.discount'), value: `-${formatCurrency(totalDiscount, currency)}`, muted: true }]\n : []),\n ...(totalSurcharge > 0\n ? [{ label: t('financial.invoice.surcharge'), value: `+${formatCurrency(totalSurcharge, currency)}`, muted: true }]\n : []),\n { label: t('financial.invoice.total'), value: formatCurrency(invoice.totalAmount, currency), strong: true },\n { label: t('financial.invoice.columnPaid'), value: formatCurrency(totalPaid, currency) },\n ...(totalRemaining > 0\n ? [{ label: t('financial.invoice.balance'), value: formatCurrency(totalRemaining, currency) }]\n : []),\n ]\n\n const kindLabel = direction === 'debit'\n ? t('financial.invoice.accountsPayable')\n : t('financial.invoice.accountsReceivable')\n\n const actions = (\n <div className=\"flex items-center gap-2\">\n <WidgetSlot zone={FINANCIAL_INVOICE_ZONES.headerActions} invoiceId={invoice.id} direction={direction} cancelled={cancelled} />\n {/* Declared: the shell gives it a caret on desktop and the FAB on a phone. */}\n <PageActions\n actions={\n !cancelled\n ? [\n ...(onEdit && invoice.status !== 'paid' ? [{ id: 'edit', label: t('financial.invoice.edit'), icon: Pencil, intent: 'primary' as const, onSelect: () => onEdit() }] : []),\n // Also on a paid bill: what was paid becomes the counterparty's credit (V1).\n { id: 'cancel', label: 'Cancelar', icon: Ban, intent: 'danger' as const, onSelect: () => setCancelTarget('') },\n ]\n : []\n }\n />\n </div>\n )\n\n // Trilho estreito: o que pende da fatura (agendamento, observações). Data,\n // parcelas e pago moram na faixa de números do topo e no bloco de pagamento —\n // repetir os três aqui era a mesma coisa dita duas vezes na mesma tela.\n const sideBlocks = (\n <>\n {invoice.bookingStartsAt && (\n <OrderDetailBlock title={t('financial.invoice.booking')}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => config.onBookingClick?.(invoice.id)}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-magic hover:underline\"\n >\n <CalendarDays className=\"h-3.5 w-3.5 shrink-0\" />\n {new Date(invoice.bookingStartsAt).toLocaleDateString(undefined, { weekday: 'short', day: '2-digit', month: 'short' })}\n {' '}\n {new Date(invoice.bookingStartsAt).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}\n <ExternalLink className=\"h-2.5 w-2.5\" />\n </Button>\n </OrderDetailBlock>\n )}\n\n {invoice.observations && (\n <OrderDetailBlock title={t('financial.invoice.notes')}>\n <p className=\"text-sm text-muted-foreground\">{invoice.observations}</p>\n </OrderDetailBlock>\n )}\n\n {!!invoice.tags?.length && (\n <OrderDetailBlock title={t('financial.invoiceForm.tags')}>\n <div className=\"flex flex-wrap gap-1.5\">\n {invoice.tags.map((tag) => <TagChip key={tag} tag={tag} />)}\n </div>\n </OrderDetailBlock>\n )}\n </>\n )\n\n return (\n <>\n <OrderDetailView\n embedded={embedded}\n title={invoice.fiscalNumber ? `#${invoice.fiscalNumber}` : invoice.contactName ?? invoice.invoiceDate}\n badges={[{ label: t(statusConfig.labelKey), tone: statusConfig.tone }]}\n // No subtitle: the date is already one of the four stat tiles below,\n // and printed twice it read as two different dates.\n onBack={embedded ? undefined : onBack}\n backLabel={embedded ? undefined : parentLabel}\n // Procedência da conta no rodapé, igual à ficha de qualquer entidade:\n // quando a conta foi lançada e por quem. `invoice` já traz os carimbos.\n meta={invoice}\n actions={actions}\n // A mesma faixa de números do pedido e do orçamento: o total, quantas\n // linhas, em quantas vezes, de quando é. São os quatro fatos que se\n // olha antes de qualquer outra coisa numa fatura.\n stats={[\n { id: 'total', label: t('financial.invoice.total'), value: formatCurrency(invoice.totalAmount, currency), icon: DollarSign },\n { id: 'items', label: t('financial.invoice.items'), value: liveItems.length, icon: LayoutList },\n { id: 'installments', label: t('financial.invoice.installments'), value: `${invoice.totalInstallments}x`, icon: Layers },\n {\n id: 'date', label: t('financial.invoice.date'), icon: CalendarDays,\n value: invoice.status !== 'cancelled'\n ? <DatePicker value={invoice.invoiceDate} variant=\"inline\" format=\"numeric\" onChange={(v) => { void patchInvoiceDate(v) }} />\n : invoice.invoiceDate,\n },\n ]}\n // \"Cliente\" só serve para um lado do documento. Numa conta a pagar a\n // contraparte é o fornecedor, e chamá-la de cliente inverte quem deve a\n // quem na única linha da tela que nomeia a outra parte.\n customerLabel={direction === 'debit' ? t('financial.invoice.payTo') : t('financial.invoice.receiveFrom')}\n // \"Quem\" e \"onde\" respondem juntos: a mesma nota do mesmo fornecedor\n // entra em lojas diferentes, e sem a unidade a tela não diz de qual\n // caixa o dinheiro sai. Renderiza nada quando o tenant não usa unidades.\n unit={unitName ? { label: t('financial.invoice.unit'), value: unitName } : undefined}\n customer={{ name: invoice.contactName, email: null }}\n customerNode={\n invoice.contactName\n ? <PersonLink personId={invoice.contactId} name={invoice.contactName} size=\"sm\" />\n : <span className=\"text-sm text-muted-foreground\">—</span>\n }\n items={detailItems}\n itemActionsMenu\n itemsLabel={t('financial.invoice.items')}\n totals={totalRows}\n totalsLabel={t('financial.invoice.payment')}\n mainSections={\n <>\n {/* What another plugin knows about this bill (fiscal-br: what did not\n arrive of its note, and «Abater»). Right above the schedule it changes. */}\n <WidgetSlot zone={FINANCIAL_INVOICE_ZONES.notices} invoiceId={invoice.id} direction={direction} cancelled={cancelled}\n onChanged={() => { void loadData() }} />\n {/* O cronograma no MESMO bloco que os itens e o pagamento — antes o título\n ficava fora do cartão, e a seção lia como se fosse de outra tela. */}\n <OrderDetailBlock\n title={t('financial.invoice.paymentSchedule')}\n // The clip belongs to the invoice, so it shows once, on the title row.\n actions={attachments.length > 0 ? (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setAttachmentsOpen(true)}\n title={attachments.map((a) => a.fileName).join('\\n')}\n className=\"font-normal -my-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <Paperclip className=\"h-3.5 w-3.5\" aria-hidden />\n {attachments.length === 1 ? 'Ver o anexo' : `Ver os ${attachments.length} anexos`}\n </Button>\n ) : undefined}\n >\n <div className=\"-mx-4 -mb-4\">\n {movements.length === 0 ? (\n <div className=\"px-4 py-4 text-center text-sm text-muted-foreground\">{t('financial.invoice.noInstallments')}</div>\n ) : (\n <div className=\"divide-y border-t\">\n {[...scheduleRows, ...(showCancelledRows ? cancelledRows : [])].map((mov) => {\n const remaining = mov.amount - mov.paidAmount\n const isPaid = mov.status === 'paid'\n const isPartial = mov.status === 'partial'\n const hasPaidDetails = isPaid || isPartial\n\n // Cash events recorded against this installment (one per payment).\n const instPayments = settlements.byBillId.get(mov.id) ?? []\n const hows = instPayments.map((payment) => describePayment(payment, howCtx))\n const paymentSummary = [...new Set(hows\n .map((how) => [how.method, how.account?.name].filter(Boolean).join(' · '))\n .filter(Boolean))].join(' / ')\n // COMO foi pago cabe num ícone, no meio da linha.\n //\n // Era uma terceira linha de texto embaixo do valor — «Cartão de\n // crédito · Mercado Pago Vini [Brisah]» —, que é a frase inteira\n // para dizer o que a marca do cartão diz de relance. Aqui vai o\n // desenho: o cartãozinho quando o dinheiro saiu de um cartão (é\n // assim que quem tem quatro sabe qual foi), e o ícone da espécie\n // nos outros casos. O texto continua, no `title` e no bloco que\n // a linha abre — clicar continua sendo o caminho para o resto.\n const how = hows[0]\n const howCard = how?.account?.accountType === 'card_payable' ? how.account : undefined\n const HowIcon = METHOD_ICONS[how?.typeKind ?? ''] ?? (how ? CreditCard : null)\n\n // A pré-seleção da parcela — a mesma que o formulário grava e o\n // diálogo lê. Só faz sentido enquanto nada foi pago: depois do\n // primeiro centavo quem conta como o dinheiro andou é o\n // pagamento (`paymentSummary` ao lado), não uma intenção.\n const srcMeta = (mov.metadata ?? {}) as Record<string, unknown>\n const srcStr = (v: unknown) => (typeof v === 'string' && v ? v : undefined)\n const srcTypeId = srcStr(srcMeta.payMethodTypeId)\n const srcAccountId = srcStr(srcMeta.payAccountId)\n const editavel = !hasPaidDetails && invoice.status !== 'cancelled'\n const canChooseSource = editavel && Math.abs(mov.amount) >= 0.005\n\n const ativa = invoice.status !== 'cancelled'\n return (\n <InstallmentRow\n key={mov.id}\n number={mov.installmentNumber ?? 1}\n amount={formatCurrency(mov.amount, currency)}\n amountValue={mov.amount}\n onAmountChange={canChangeAmounts ? (v) => { void patchAmount(mov, v) } : undefined}\n status={mov.status}\n dueDate={mov.dueDate}\n onDueDateChange={editavel ? (v) => { void patchDueDate(mov, v) } : undefined}\n dueExtra={<>\n {mov.paidAmount > 0 && !isPaid && ` · ${t('financial.invoice.paidLabel')} ${formatCurrency(mov.paidAmount, currency)}`}\n {mov.paymentDate && ` · ${t('financial.invoice.paidOn')} ${mov.paymentDate}`}\n </>}\n onClick={hasPaidDetails ? () => setReceiptBill(mov) : undefined}\n source={canChooseSource ? (\n <InstallmentSourceFields\n direction={direction}\n value={{ payMethodTypeId: srcTypeId, payAccountId: srcAccountId }}\n onChange={(next) => {\n void patchSource(mov, {\n payMethodTypeId: next.payMethodTypeId ?? null,\n payAccountId: next.payAccountId ?? null,\n })\n }}\n />\n ) : undefined}\n actions={<>\n {paymentSummary && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { if (hasPaidDetails) setReceiptBill(mov) }}\n title={paymentSummary}\n aria-label={paymentSummary}\n className=\"font-normal inline-flex shrink-0 items-center rounded-md px-1 py-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {howCard\n ? <CardVisual lastFour={howCard.lastFour ?? undefined} color={howCard.color ?? undefined} brandId={howCard.cardBrandId ?? undefined} />\n : HowIcon ? <HowIcon className=\"h-4 w-4\" aria-hidden /> : null}\n </Button>\n )}\n <InstallmentReceiptButton\n title=\"Anexos\"\n // The receipt belongs to the bill: show it on the installments it paid,\n // or one upload reads as a copy on every open installment.\n attached={(isPaid || isPartial) && attachments.length > 0}\n count={isPaid || isPartial ? attachments.length : 0}\n onClick={() => setAttachmentsOpen(true)}\n />\n {!isPaid && !isPartial && ativa && (\n <InstallmentPayButton\n onClick={() => setPayingMovement(mov)}\n >\n {t(direction === 'credit' ? 'financial.invoice.receive' : 'financial.invoice.pay')} {remaining < mov.amount ? formatCurrency(remaining, currency) : ''}\n </InstallmentPayButton>\n )}\n {/* Reversing posts the counter-entry instead of deleting, so the books still balance. */}\n {isPaid && reversiblePayments(instPayments).length > 0 && ativa && (\n <InstallmentActionButton icon={Undo2} onClick={() => { setReverseKeep(new Set()); setReversing(reversiblePayments(instPayments)) }}>\n {t('financial.invoice.reverse')}\n </InstallmentActionButton>\n )}\n {isPartial && ativa && (\n <InstallmentPayButton variant=\"outline\" onClick={() => setPayingMovement(mov)}>\n {t(direction === 'credit' ? 'financial.invoice.receive' : 'financial.invoice.pay')} {formatCurrency(remaining, currency)}\n </InstallmentPayButton>\n )}\n </>}\n />\n )\n })}\n </div>\n )}\n {cancelledRows.length > 0 && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setShowCancelledRows((v) => !v)}\n className=\"font-normal whitespace-normal justify-start w-full border-t px-4 py-2 text-left text-xs text-muted-foreground transition-colors hover:bg-muted/30 hover:text-foreground\"\n >\n {showCancelledRows\n ? 'Ocultar parcelas canceladas'\n : cancelledRows.length === 1 ? 'Ver 1 parcela cancelada' : `Ver ${cancelledRows.length} parcelas canceladas`}\n </Button>\n )}\n {settlements.unattributed.length > 0 && (\n <div className=\"border-t bg-warning-soft/40 px-4 py-2.5\">\n <p className=\"text-[11px] font-medium text-foreground\">{t('financial.invoice.unlinkedPayments')}</p>\n <p className=\"mb-1 text-[10px] text-muted-foreground\">{t('financial.invoice.unlinkedPaymentsDesc')}</p>\n {settlements.unattributed.map((p) => (\n <div key={p.id} className=\"flex items-center gap-1.5 text-[11px] text-muted-foreground\">\n <span className=\"font-medium text-success\">{formatCurrency(p.paidAmount, currency)}</span>\n {p.paymentDate && <><span>·</span><span>{p.paymentDate}</span></>}\n </div>\n ))}\n </div>\n )}\n </div>\n </OrderDetailBlock>\n </>\n }\n extraSections={sideBlocks}\n />\n\n\n {attachmentsOpen && (\n <InvoiceAttachmentsModal\n invoiceId={invoice.id}\n onClose={() => setAttachmentsOpen(false)}\n onChanged={() => { void loadData() }}\n />\n )}\n\n {/* Estorno: um estorno exige MOTIVO. Sem ele o extrato mostra dinheiro\n saindo e ninguém sabe por quê, que é a pergunta que a conferência do\n mês faz primeiro. */}\n {/* ModalTask, não portal: dentro de um modal o portal para o body fica\n surdo (pointer-events do Dialog) — a tela \"travava no Estornar\". */}\n {receiptBill && (\n <PaymentReceiptModal\n payments={settlements.byBillId.get(receiptBill.id) ?? []}\n howCtx={howCtx}\n counterpartyName={invoice.contactName}\n isReceivable={invoice.direction === 'credit'}\n onReverse={invoice.status !== 'cancelled'\n ? (p) => { setReceiptBill(null); setReverseKeep(new Set()); setReversing([p]) }\n : undefined}\n onClose={() => setReceiptBill(null)}\n />\n )}\n {reversing && (() => {\n const chosen = reversing.filter((p) => !reverseKeep.has(p.id))\n const total = chosen.reduce((sum, p) => sum + (Number(p.amount) || 0), 0)\n const close = () => { setReversing(null); setReverseReason(''); setReverseKeep(new Set()) }\n return (\n <ModalTask\n open\n title={t('financial.invoice.reverseTitle')}\n hint={t('financial.invoice.reverseHint', { count: chosen.length, total: formatCurrency(total, currency) })}\n width=\"max-w-md\"\n onClose={close}\n >\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <div className=\"space-y-1.5\">\n <p className=\"text-[10px] font-medium uppercase text-muted-foreground\">{t('financial.invoice.reversePayments')}</p>\n <ul className=\"divide-y rounded-card border\">\n {reversing.map((p) => {\n const on = !reverseKeep.has(p.id)\n const account = p.bankAccountId ? accountsById.get(p.bankAccountId)?.name : undefined\n return (\n <li key={p.id}>\n <label className=\"flex min-h-11 cursor-pointer items-center gap-3 px-3 py-2 text-sm\">\n <Checkbox\n checked={on}\n disabled={reversing.length === 1}\n onChange={() => setReverseKeep((cur) => {\n const next = new Set(cur)\n if (next.has(p.id)) next.delete(p.id)\n else next.add(p.id)\n return next\n })}\n />\n <span className=\"flex-1 tabular-nums font-medium\">{formatCurrency(Number(p.amount) || 0, currency)}</span>\n <span className=\"text-xs text-muted-foreground\">{p.paymentDate ? p.paymentDate.slice(0, 10).split('-').reverse().join('/') : ''}{account ? ` · ${account}` : ''}</span>\n </label>\n </li>\n )\n })}\n </ul>\n <p className=\"text-[11px] leading-snug text-muted-foreground\">{t('financial.invoice.reverseExplain')}</p>\n </div>\n <div>\n <label className=\"block text-[10px] font-medium uppercase text-muted-foreground\">\n {t('financial.invoice.reverseReason')}\n </label>\n <Textarea\n rows={3}\n autoFocus\n value={reverseReason}\n onChange={(e) => setReverseReason(e.target.value)}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"flex shrink-0 justify-end gap-2 border-t px-5 py-3\">\n <Button variant=\"outline\" size=\"sm\" onClick={close}>\n {t('common.cancel')}\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!reverseReason.trim() || chosen.length === 0}\n onClick={async () => {\n try { await reverseMovements(chosen.map((p) => p.id), reverseReason.trim()) } catch { /* toast already said it */ }\n close(); loadData()\n }}\n >\n {t('financial.invoice.reverseConfirm', { total: formatCurrency(total, currency) })}\n </Button>\n </div>\n </ModalTask>\n )\n })()}\n\n {/* Payment Modal */}\n {payingMovement && (\n <CurrencyScope code={invoice?.currency}><PaymentModal\n movement={payingMovement}\n receiptUrl={pendingReceipt}\n onClose={() => { setPayingMovement(null); setPendingReceipt(undefined) }}\n onPaid={() => { setPayingMovement(null); setPendingReceipt(undefined); loadData() }}\n /></CurrencyScope>\n )}\n\n {stockDetailTarget && stockDetails.has(stockDetailTarget.id) && (\n <StockEntryDetailsDialog\n title={stockDetailTarget.description}\n entries={stockDetails.get(stockDetailTarget.id)!}\n onClose={() => setStockDetailTarget(null)}\n />\n )}\n\n {receiveTarget && (\n <ReceiveStockDialog\n item={receiveTarget}\n invoiceCurrency={invoice.currency}\n entered={stockDetails.get(receiveTarget.id)}\n onClose={() => setReceiveTarget(null)}\n onReceived={() => { setReceiveTarget(null); setStockVersion((v) => v + 1); void loadData() }}\n />\n )}\n\n {cancelTarget !== null && (\n <CurrencyScope code={invoice?.currency}><CancelInvoiceDialog\n invoiceId={invoice.id}\n counterpartyName={invoice.contactName}\n totalAmount={invoice.totalAmount}\n items={liveItems}\n preselectItemId={cancelTarget || undefined}\n onClose={() => setCancelTarget(null)}\n onCancelled={() => { setCancelTarget(null); setMenuOpen(false); void loadData() }}\n /></CurrencyScope>\n )}\n\n <style>{`\n @keyframes field-slide-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n </>\n )\n}\n","import { Building2 } from 'lucide-react'\nimport { ChoiceSelect } from '@fayz-ai/ui'\nimport { adminNavigateTo, usePermissionOptional, useUnitFilter } from '@fayz-ai/admin'\nimport { useActiveUnitId, useUnitMode, useTranslation } from '@fayz-ai/core'\n\nexport interface UnitChoice {\n id: string\n name: string\n}\n\n/**\n * The units a bill may be written to. Under unit mode the database only accepts\n * a write into the unit the session stands in (has_unit fences on the\n * x-fayz-unit header), so with an active unit that is the only choice.\n * Without unit mode the caller's own list (`fallback`) is used.\n */\nexport function useWritableUnits(fallback: UnitChoice[] = []): { unitMode: boolean; activeUnitId?: string; choices: UnitChoice[] } {\n const unitMode = useUnitMode()\n const activeUnitId = useActiveUnitId() ?? undefined\n const reachable = useUnitFilter().options\n const choices = !unitMode\n ? fallback\n : activeUnitId ? reachable.filter((u) => u.id === activeUnitId) : reachable\n return { unitMode, activeUnitId, choices }\n}\n\nexport function UnitField({ choices, value, onChange, label }: {\n choices: UnitChoice[]\n value: string\n onChange: (id: string) => void\n label?: string\n}) {\n const t = useTranslation()\n const can = usePermissionOptional()\n return (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{label ?? t('financial.invoiceForm.unit')}</label>\n <ChoiceSelect\n className=\"mt-1\"\n icon={Building2}\n aria-label={label ?? t('financial.invoiceForm.unit')}\n options={choices.map((c) => ({ value: c.id, label: c.name }))}\n value={value || undefined}\n onChange={(v) => onChange(v ?? '')}\n allLabel=\"Todas / sem unidade\"\n searchable\n searchPlaceholder={t('financial.invoiceForm.searchUnit')}\n manage={can('units', 'manage')\n ? { label: 'Gerenciar unidades', onSelect: () => adminNavigateTo('/settings/locations') }\n : undefined}\n />\n </div>\n )\n}\n","import * as React from 'react'\nimport { SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { createArchetypeLookup, type EntityLookup } from '@fayz-ai/admin'\nimport type { TransactionDirection } from '@fayz-ai/financial/domain/movement'\n\nconst KIND_LABELS = {\n supplier: 'Fornecedor',\n customer: 'Cliente',\n staff: 'Profissional',\n}\n\nexport function createFinancialCounterpartyLookup(direction: TransactionDirection): EntityLookup {\n const kinds = direction === 'debit'\n ? ['supplier', 'staff', 'customer']\n : ['customer', 'supplier', 'staff']\n\n return createArchetypeLookup({\n archetype: 'person',\n kind: kinds,\n createKinds: kinds,\n kindLabels: KIND_LABELS,\n })\n}\n\nexport interface FinancialCounterpartySearchSelectProps {\n lookup: EntityLookup\n value?: string\n displayValue?: string\n label?: string\n required?: boolean\n onChange: (id: string, option: SearchSelectOption | null) => void\n onCreate?: (query: string) => void\n onEdit?: (id: string) => void\n disabled?: boolean\n}\n\nexport function FinancialCounterpartySearchSelect({\n lookup,\n value,\n displayValue,\n label,\n required,\n onChange,\n onCreate,\n onEdit,\n disabled,\n}: FinancialCounterpartySearchSelectProps) {\n const search = React.useCallback(async (query: string) => {\n const results = await lookup.search(query)\n return results.map((result) => ({\n id: result.id,\n label: result.label,\n subtitle: result.subtitle,\n group: result.group,\n data: result,\n }))\n }, [lookup])\n\n return (\n <SearchSelect\n value={value}\n displayValue={displayValue}\n label={label}\n required={required}\n disabled={disabled}\n onChange={onChange}\n onSearch={search}\n minChars={2}\n minCharsLabel=\"Digite pelo menos 2 caracteres para buscar.\"\n noResultsLabel=\"Nenhum cadastro encontrado.\"\n searchingLabel=\"Buscando cadastros...\"\n loadOnOpen={false}\n groupLayout=\"columns\"\n createLabel=\"Cadastrar\"\n clearLabel=\"Limpar\"\n onCreate={onCreate}\n onEdit={onEdit}\n editLabel=\"Editar\"\n placeholder=\"Digite nome, telefone ou documento...\"\n />\n )\n}\n","// ---------------------------------------------------------------------------\n// QUAL LINHA A EDIÇÃO ABRE — um bilhete entre duas telas, não uma rota.\n//\n// O lápis de um item do detalhe leva para a edição com aquela linha aberta. A\n// posição precisava viajar junto, e a URL não serve: o shell monta o caminho\n// `/payables/<id>/edit` e valida o segmento do id, então qualquer coisa\n// pendurada nele — `:0`, `--0` — faz a rota deixar de casar e a tela cai no\n// painel do Financeiro. Medido nas duas grafias.\n//\n// Então a posição vai por fora, por `sessionStorage`: ela é efêmera (vale um\n// clique), não é endereço (ninguém compartilha \"a nota com o item 3 aberto\") e\n// é lida UMA vez — quem lê, apaga. Recarregar a página abre o formulário\n// normal, que é o comportamento certo para um bilhete que já foi entregue.\n// ---------------------------------------------------------------------------\n\nconst CHAVE = 'fayz:financial:focus-item'\n/**\n * Dez segundos — e NÃO \"apaga ao ler\".\n *\n * Apagar na leitura parecia certo e não funciona: em desenvolvimento o React\n * monta o componente duas vezes, a primeira montagem consumia o bilhete e a\n * segunda — que é a que fica na tela — já não o encontrava. A linha abria e\n * fechava no mesmo instante.\n *\n * Uma janela curta resolve as duas pontas: as duas montagens acontecem no mesmo\n * piscar, e recarregar a página um minuto depois abre o formulário normal, que\n * é o certo para um bilhete que já foi entregue.\n */\nconst VALIDADE_MS = 10_000\n\nexport function marcarItemParaAbrir(invoiceId: string, index: number): void {\n try { sessionStorage.setItem(CHAVE, `${Date.now()}:${index}:${invoiceId}`) } catch { /* sem sessionStorage, abre fechado */ }\n}\n\n/** A posição pedida para esta fatura, se o pedido ainda é desta navegação. */\nexport function consumirItemParaAbrir(invoiceId: string): number | undefined {\n try {\n const bruto = sessionStorage.getItem(CHAVE)\n if (!bruto) return undefined\n // O id vem por ÚLTIMO: ele é um UUID e não tem `:`, mas a data e a posição\n // são números — partir pelos dois primeiros separadores é o que sobrevive\n // a um id que um dia tenha outro formato.\n const [quando, posicao, ...resto] = bruto.split(':')\n if (resto.join(':') !== invoiceId) return undefined\n if (Date.now() - Number(quando) > VALIDADE_MS) return undefined\n const n = Number(posicao)\n return Number.isFinite(n) ? n : undefined\n } catch {\n return undefined\n }\n}\n","import React from 'react'\nimport type { EntityLookupMap } from '@fayz-ai/admin'\n\n// ---------------------------------------------------------------------------\n// UM CATÁLOGO VAZIO NÃO É UMA ESCOLHA.\n//\n// A linha de um documento pergunta o TIPO — Produto, Serviço, Outro — e cada\n// um dos dois primeiros abre uma busca sobre um catálogo. Num restaurante o\n// catálogo de serviço tem zero linhas: a recepção escolhe \"Serviço\", procura,\n// não acha nada, e não sabe se errou a busca ou se o cadastro não existe. O\n// mesmo vale ao contrário, no consultório que não vende produto nenhum.\n//\n// `EntityLookup.count()` existe exatamente para isto (ver o comentário dele em\n// admin/crud/archetype-lookup) e ninguém o chamava: contar UMA vez é o que\n// permite a tela tirar a escolha em vez de oferecer uma porta fechada.\n//\n// ── O que isto NÃO faz ────────────────────────────────────────────────────\n//\n// Não esconde o CADASTRO. Uma tela de cadastro vazia é onde se cria o primeiro\n// registro — sumir com ela é o que impediria a casa de mudar de ideia. Quem\n// decide que um ofício não tem Serviços é o preset da conta (`preset.hide`),\n// que é uma decisão de produto; isto aqui é só a consequência dela no\n// documento, e se corrige sozinha no dia em que a casa cadastrar o primeiro.\n//\n// ── Enquanto conta ────────────────────────────────────────────────────────\n//\n// Mostra tudo. Piscar a escolha para fora depois que a tela abriu é pior que\n// mostrá-la: quem já tinha a mão no tipo perde o alvo. `count()` é cacheado\n// por conta e por um minuto, então na prática só a primeira abertura espera.\n// Falha de contagem também mostra: não saber não é o mesmo que não ter.\n// ---------------------------------------------------------------------------\n\n/** Os tipos que este documento pode oferecer de fato — os de catálogo vazio saem. */\nexport function useStockedItemTypes<T extends { value: string }>(\n itemTypes: T[],\n entityLookups: EntityLookupMap,\n): T[] {\n // `null` = ainda não contei. Só um Set explícito tira alguém da lista.\n const [empty, setEmpty] = React.useState<Set<string> | null>(null)\n\n // As chaves que têm catálogo, como TEXTO: `entityLookups` costuma ser um\n // literal novo a cada render, e depender do objeto refaria a contagem a cada\n // pintura.\n const backed = itemTypes\n .filter((type) => entityLookups[type.value]?.count)\n .map((type) => type.value)\n .sort()\n .join(',')\n\n React.useEffect(() => {\n const kinds = backed ? backed.split(',') : []\n if (!kinds.length) { setEmpty(null); return }\n let cancelled = false\n void Promise.all(kinds.map(async (kind) => {\n try {\n return { kind, total: await entityLookups[kind]!.count!() }\n } catch {\n // Não saber não é o mesmo que não ter.\n return { kind, total: 1 }\n }\n })).then((rows) => {\n if (cancelled) return\n setEmpty(new Set(rows.filter((r) => r.total === 0).map((r) => r.kind)))\n })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [backed])\n\n return React.useMemo(\n () => (empty?.size ? itemTypes.filter((type) => !empty.has(type.value)) : itemTypes),\n [itemTypes, empty],\n )\n}\n","import React, { useRef } from 'react'\nimport { toast } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Fotografar ou anexar o recibo (FAY-1226).\n//\n// Nasceu dentro da folha de lançamento rápido, que era o outro jeito de criar\n// uma conta. A folha saiu — fazia com menos campos o que o cadastro de fatura já\n// faz —, mas ESTE passo não é redundante: quem paga no balcão tem o papel na mão\n// antes de ter o dado, e fotografar primeiro é a única ordem que funciona ali.\n//\n// Só o seletor, sem moldura: quem chama já tem onde pôr o gatilho, e o gatilho é\n// sempre o mesmo ícone na linha da parcela. Era um retângulo tracejado de largura\n// inteira dentro de cada parcela — três linhas de altura para um clique, numa\n// lista onde a parcela em si cabe em uma.\n//\n// A imagem vira data URL. O provider mock não tem bucket, e o valor viaja em\n// `metadata.receiptUrl` do movimento — é o que o feed de transações já lê para\n// mostrar o clipe e a prévia.\n// ---------------------------------------------------------------------------\n\n/**\n * Devolve o `input` escondido (que precisa estar montado em algum lugar da\n * árvore) e o `open` que o abre.\n */\nexport function useReceiptPicker(\n onPick: (dataUrl: string) => void,\n /** When given, a PDF is accepted too and handed over as a file (a bill, not a receipt). */\n onPickDocument?: (file: File) => void,\n): {\n open: () => void\n input: React.ReactElement\n} {\n const t = useTranslation()\n const ref = useRef<HTMLInputElement>(null)\n const input = (\n <input\n ref={ref}\n type=\"file\"\n accept={onPickDocument ? 'image/*,application/pdf' : 'image/*'}\n // `capture=environment` faz o celular oferecer a câmera direto — mas some\n // com o seletor de arquivos, e um PDF de boleto não sai da câmera.\n capture={onPickDocument ? undefined : 'environment'}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n // Zera o input para que escolher o MESMO arquivo de novo ainda dispare.\n e.target.value = ''\n if (!file) return\n if (onPickDocument && file.type === 'application/pdf') {\n onPickDocument(file)\n return\n }\n if (!file.type.startsWith('image/')) {\n toast.error(t('financial.quickTx.receiptInvalid'))\n return\n }\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result === 'string') onPick(reader.result)\n // TODO(FAY-1230): OCR por visão — preencher forma de pagamento, final\n // do cartão e valor a partir da imagem, que é o que tornaria este\n // caminho realmente curto.\n }\n reader.onerror = () => toast.error(t('financial.quickTx.receiptInvalid'))\n reader.readAsDataURL(file)\n }}\n />\n )\n return { open: () => ref.current?.click(), input }\n}\n","import React, { useState, useMemo, useRef, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, X, ChevronDown, Building2, MoreVertical, Ban, FileText } from 'lucide-react'\nimport { useFinancialConfig, useFinancialStore, useFinancialProvider, formatCurrency } from '../context'\nimport { SearchSelect, SegmentedControl, tourAnchor, Input, Textarea, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { DatePicker } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport {\n OrderFormView, OrderFormBlock, OrderFormItemsCard, OrderFormItemRow,\n OrderFormAddItemStep, OrderFormSkeleton, RecordMetaFooter,\n} from '@fayz-ai/admin'\nimport { useLimitGuard, invalidateLimit, usePermissionOptional, useLookupCreate, useUnitFilter, adminNavigateTo, WidgetSlot,\n withPriceTable, listPickablePriceTables, initialPriceTableId, quotePriceTable,\n type EntityLookup, type EntityLookupMap, type PriceTableOption } from '@fayz-ai/admin'\nimport { useSaveBar, toast } from '@fayz-ai/ui'\nimport { useTranslation, useUnitMode, useActiveUnitId } from '@fayz-ai/core'\nimport { CurrencyScope, TagsField, useCurrency } from '@fayz-ai/admin'\nimport { CHART_OF_ACCOUNTS_ROUTE, COST_CENTERS_ROUTE, FINANCIAL_INVOICE_ZONES } from '../lib/routes'\nimport { UnitField, useWritableUnits } from '../components/UnitField'\nimport type { TransactionDirection, CreateMovementInput, FinancialMovement } from '@fayz-ai/financial/domain/movement'\nimport type { InvoiceItem } from '@fayz-ai/financial/domain/invoice'\nimport type { GiftCard } from '@fayz-ai/financial/domain/gift-card'\nimport type { ChartOfAccountsNode, CostCenter } from '@fayz-ai/financial/domain/chart-of-accounts'\nimport { postableAccounts, accountLabel } from '@fayz-ai/financial/domain/chart-of-accounts'\nimport { consumePayableDraft } from './receipt-agent'\nimport { PayableDraftSurface } from './payable-agent'\nimport { useReceiptPicker } from '../components/ReceiptPicker'\nimport { PaymentModal } from '../components/PaymentModal'\nimport { InstallmentSourceFields } from '../components/InstallmentSource'\nimport { InstallmentPayButton, InstallmentReceiptButton, InstallmentRow } from '../components/InstallmentRow'\nimport { rebalanceInstallments } from '../lib/installment-amounts'\nimport { StockEntryNote, type StockEntryDetail } from '../components/StockEntryNote'\nimport { ITEM_ICONS } from '../lib/item-icons'\nimport { InvoiceAttachmentsModal } from '../components/InvoiceAttachmentsModal'\nimport { CancelInvoiceDialog } from '../components/CancelInvoiceDialog'\nimport {\n FinancialCounterpartySearchSelect,\n createFinancialCounterpartyLookup,\n} from '../components/FinancialCounterpartySearchSelect'\nimport { createIdempotencyKey } from '@fayz-ai/financial/data/idempotency'\nimport { CardVisual } from './cardChip'\nimport { consumirItemParaAbrir } from './focusItem'\nimport { useStockedItemTypes } from '../lib/useStockedItemTypes'\nimport { availableInvoiceItemTypes, scheduleCloses, splitInstallments, type CreateInvoiceItemInput } from '@fayz-ai/financial/domain/invoice'\nimport { round2 } from '@fayz-ai/financial/domain/money'\nimport { counterpartyAccountingPolicy, resolveCounterpartyAccountingPolicy, type CounterpartyAccountingPolicy } from '@fayz-ai/financial/domain/counterparty'\n\n// ---------------------------------------------------------------------------\n// Nova fatura — a MESMA anatomia do pedido, do detalhe da fatura e do\n// orçamento: itens na coluna larga, quem/quando/parcelas no trilho estreito.\n//\n// Antes esta tela abria com uma faixa de campos ocupando a largura toda, os\n// itens e as parcelas embaixo, e as observações soltas no rodapé. Era a única\n// das quatro telas do mesmo documento com essa silhueta.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Location / unit selector\n// ---------------------------------------------------------------------------\n\nexport interface LocationOption {\n id: string\n name: string\n isHQ?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// ID helper\n// ---------------------------------------------------------------------------\n\nlet formId = 1\nfunction fid(): string { return `f${formId++}` }\n\n/** Radix Select cannot hold an empty value; this stands for \"no table\". */\nconst NO_PRICE_TABLE = '__none__'\n\n// ---------------------------------------------------------------------------\n// Item da fatura. A LINHA em si (fechada/aberta, desconto, acréscimo) vem do\n// arquétipo compartilhado — era código copiado do orçamento, e as duas cópias\n// já divergiam.\n// ---------------------------------------------------------------------------\n\ninterface FormItem extends CreateInvoiceItemInput {\n _id: string\n}\n\n// ---------------------------------------------------------------------------\n// Installment form\n// ---------------------------------------------------------------------------\n\ninterface FormInstallment {\n _id: string\n amount: number\n dueDate: string\n /**\n * O comprovante desta parcela, e por onde ela foi paga.\n *\n * Recibo é propriedade da PARCELA, não da fatura: ele prova que um dinheiro\n * específico mudou de mão. Por isso não existe \"anexar recibo\" antes de haver\n * parcela — não há a que anexar —, e anexar um já quita a parcela, que é a\n * única razão de existir um recibo. Quitar exige dizer por onde saiu: sem\n * isso não há evento de caixa, só uma linha que se declara paga.\n */\n receiptUrl?: string\n /**\n * POR ONDE ESTA PARCELA SAI — respondido na própria linha, antes do diálogo.\n *\n * É a coluna **Forma** e a coluna **Conta** do V1. Quem lança a conta já tem\n * o boleto na mão e sabe de qual banco ele sai; perguntar isso só no momento\n * de pagar obriga a lembrar, uma parcela de cada vez. Gravado na `metadata`\n * da parcela, volta ao reabrir e chega ao `PaymentModal` pré-preenchido.\n */\n payMethodTypeId?: string\n payMethodId?: string\n payAccountId?: string\n}\n\n/**\n * A pré-seleção como ela mora no banco.\n *\n * `null` e não ausente quando vazia: a metadata é mesclada sobre a que já\n * estava lá, e uma chave ausente mantém o valor antigo — limpar a forma na tela\n * deixaria o diálogo abrindo com a forma de ontem.\n */\nfunction sourceMeta(inst: FormInstallment): Record<string, string | null> {\n return {\n payMethodTypeId: inst.payMethodTypeId || null,\n payMethodId: inst.payMethodId || null,\n payAccountId: inst.payAccountId || null,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Invoice form view\n// ---------------------------------------------------------------------------\n\n/** Busca por código OU nome — quem conhece o plano digita \"4.1\", quem não\n * conhece digita \"aluguel\". Sem consulta, devolve a lista inteira. */\nfunction filterByCodeOrName<T extends { code?: string | null; name: string }>(rows: T[], query: string): T[] {\n const q = query.trim().toLowerCase()\n if (!q) return rows\n return rows.filter((r) => `${r.code ?? ''} ${r.name}`.toLowerCase().includes(q))\n}\n\n/** A forma das linhas, para comparar o rascunho com o que o banco devolveu.\n * Só o que a gravação leva — id de rascunho e ordem de tela não contam. */\nfunction itemsKey(list: Array<{\n itemKind?: string; referenceId?: string; description?: string\n quantity?: number; unitPrice?: number; discount?: number; surcharge?: number\n accountId?: string; costCenterId?: string\n}>): string {\n return JSON.stringify(list.map((it) => [\n it.itemKind ?? '', it.referenceId ?? '', it.description ?? '',\n it.quantity ?? 0, it.unitPrice ?? 0, it.discount ?? 0, it.surcharge ?? 0,\n it.accountId ?? '', it.costCenterId ?? '',\n ]))\n}\n\nexport function InvoiceFormView({ direction, editId, onSaved, focusReceipt = false, fromCardId, embedded, onChanged }: {\n direction: TransactionDirection\n editId?: string\n onSaved?: (id?: string) => void\n /**\n * Dentro de um modal — a ficha do cliente abre o recebimento assim.\n *\n * Suprime a barra de página: publicá-la trocaria o título da CASCA atrás do\n * overlay. A SaveBar já se resolve sozinha (ela portala para o host do\n * modal), então salvar continua no mesmo lugar. Ver OrderFormView.\n */\n embedded?: boolean\n /** Entrou pelo caminho \"Enviar recibo\": abre o seletor de imagem sozinho. */\n focusReceipt?: boolean\n /** Entrou por \"Adicionar despesa\" num cartão: a parcela já nasce apontando para ele. */\n fromCardId?: string\n /**\n * Uma parcela foi liquidada daqui de dentro.\n *\n * Separado de `onSaved` porque os dois pedem coisas opostas: salvar NAVEGA\n * para a ficha, e pagar não pode tirar ninguém da tela no meio do recebimento.\n * Quem embute o formulário usa isto para reler — uma conta que acabou de ser\n * paga deixa de ser editável, e a casca precisa saber.\n */\n onChanged?: () => void\n}) {\n const t = useTranslation()\n const config = useFinancialConfig()\n const provider = useFinancialProvider()\n // Pictures of the catalog products on the lines, fetched as lines are picked.\n const [pictures, setPictures] = useState<Record<string, string>>({})\n const asked = useRef(new Set<string>())\n // Padrões na LEITURA, não só na montagem do config: este formulário também\n // abre embutido (a ficha do cliente num modal), e lá o config vem de uma\n // casca avulsa. `itemTypes` ausente derrubava a tela inteira num `.map` de\n // undefined — e o `as never` daquela casca impedia o tipo de avisar.\n const { itemTypes: itemTypesRaw = [], locations = [] } = config\n // A saved document keeps the currency it was written in; a new one is the house's.\n const [documentCurrency, setDocumentCurrency] = useState<string | undefined>()\n const [stockNotes, setStockNotes] = useState<Map<string, StockEntryDetail[]>>(new Map())\n const currency = useCurrency(config.currency, documentCurrency)\n // The currencies a new document may be written in: the house's first, then\n // any other this house keeps an account in. One only = nothing to choose.\n const houseCurrency = useCurrency(config.currency).code\n const [currencyChoices, setCurrencyChoices] = useState<string[]>([])\n useEffect(() => {\n let alive = true\n provider.listCurrencies?.().then((found) => {\n if (alive) setCurrencyChoices([...new Set([houseCurrency, ...found])])\n }).catch(() => {})\n return () => { alive = false }\n }, [provider, houseCurrency])\n // Unit mode off means one unit: the field has nothing to ask. On, it offers\n // only the units this person reaches — never the tenant's whole tree — and\n // hides again when that is a single one. `locations` stays the opt-in for\n // apps that pass their own list without unit mode.\n const { unitMode, activeUnitId, choices: unitChoices } = useWritableUnits(locations)\n const reachableUnits = useUnitFilter().options\n // Shown whenever the person reaches more than one unit, even when standing in\n // one: the bill then says which unit it lands in (or none).\n const showUnitField = unitMode ? reachableUnits.length > 1 : unitChoices.length > 1\n const [giftCardsEnabled, setGiftCardsEnabled] = useState(false)\n useEffect(() => {\n let cancelled = false\n if (direction !== 'credit' || !provider.giftCardsEnabled) {\n setGiftCardsEnabled(false)\n return\n }\n void provider.giftCardsEnabled()\n .then((enabled) => { if (!cancelled) setGiftCardsEnabled(enabled) })\n .catch(() => { if (!cancelled) setGiftCardsEnabled(false) })\n return () => { cancelled = true }\n }, [direction, provider])\n\n const giftCardLookup = useMemo<EntityLookup | null>(() => {\n if (!giftCardsEnabled || !provider.findGiftCardByCode) return null\n const asOption = (card: GiftCard) => ({\n id: card.id,\n label: `Gift Card ${card.code.replace(/(.{4})(?=.)/g, '$1 ')}`,\n subtitle: card.expiresAt\n ? `Emitido · válido até ${new Date(card.expiresAt).toLocaleDateString('pt-BR')}`\n : 'Emitido · sem validade',\n icon: 'Gift',\n price: card.faceValue,\n data: { price: card.faceValue, code: card.code, state: card.state },\n })\n // Exact code only, never a list: a printed code is a bearer title, and\n // browsing the cards would hand every code to whoever opens the dropdown.\n const resolve = async (raw: string) => {\n const card = await provider.findGiftCardByCode!(raw)\n if (!card) throw new Error(t('financial.giftCardLine.notFound'))\n if (card.state === 'revoked') throw new Error(t('financial.giftCardLine.revoked'))\n if (card.state === 'expired') throw new Error(t('financial.giftCardLine.expired'))\n if (card.state !== 'issued') throw new Error(t('financial.giftCardLine.alreadySold'))\n return asOption(card)\n }\n return {\n async search(query) {\n try { return [await resolve(query)] } catch { return [] }\n },\n async getById() { return null },\n byCode: {\n resolve,\n label: t('financial.giftCardLine.label'),\n placeholder: t('financial.giftCardLine.placeholder'),\n hint: t('financial.giftCardLine.hint'),\n display: ({ description }) => description.replace(/^Gift Card\\s+/, ''),\n },\n }\n }, [giftCardsEnabled, provider, t])\n\n // A receivable can be written in a price table (spine 215): picked after the\n // customer, it narrows the product/service search to the table and prices\n // each pick at the table price. Payables never offer one.\n const [priceTables, setPriceTables] = useState<PriceTableOption[]>([])\n const [priceTableId, setPriceTableId] = useState<string | undefined>()\n const [savedPriceTableId, setSavedPriceTableId] = useState<string | undefined>()\n useEffect(() => {\n if (direction !== 'credit') return\n let alive = true\n listPickablePriceTables().then((tables) => { if (alive) setPriceTables(tables) }).catch(() => {})\n return () => { alive = false }\n }, [direction])\n // A saved table that expired since stays on the document but no longer\n // filters the search: its offer would refuse every query.\n const pickedTable = priceTables.find((pt) => pt.id === priceTableId)\n\n const entityLookups = useMemo<EntityLookupMap>(() => {\n const base: EntityLookupMap = giftCardLookup\n ? { ...config.entityLookups, gift_card: giftCardLookup }\n : (config.entityLookups ?? {})\n if (!pickedTable) return base\n return {\n ...base,\n ...(base.product ? { product: withPriceTable(base.product, pickedTable.id, { kinds: ['good'] }) } : {}),\n ...(base.service ? { service: withPriceTable(base.service, pickedTable.id, { kinds: ['service'] }) } : {}),\n }\n }, [config.entityLookups, giftCardLookup, pickedTable])\n // Os três tipos padrão nascem rotulados em inglês no resolvedor de config, que\n // não tem `t`. Traduzir aqui — e SÓ quando existe chave — preserva o rótulo\n // que um app tenha escolhido para um tipo próprio.\n const translatedItemTypes = React.useMemo(\n () => itemTypesRaw.map((tp) => {\n const traduzido = t(`financial.itemType.${tp.value}`)\n return traduzido === `financial.itemType.${tp.value}` ? tp : { ...tp, label: traduzido }\n }),\n [itemTypesRaw, t])\n const offeredItemTypes = React.useMemo(\n () => availableInvoiceItemTypes(\n giftCardsEnabled && !translatedItemTypes.some((type) => type.value === 'gift_card')\n ? [...translatedItemTypes, { value: 'gift_card', label: t('financial.itemType.gift_card'), icon: 'Gift' }]\n : translatedItemTypes,\n Object.keys(entityLookups),\n t('financial.itemType.other'),\n direction,\n ),\n [translatedItemTypes, giftCardsEnabled, entityLookups, t, direction],\n )\n // Instalado não é o mesmo que TER: um restaurante recebe o catálogo de\n // serviço do pacote e não tem serviço nenhum. Ver useStockedItemTypes.\n const itemTypes = useStockedItemTypes(offeredItemTypes, entityLookups)\n\n // Whether any item type is backed by an entity lookup (product/service catalog).\n // When none are, item entry is manual-only: skip the type-select step and add\n // an \"Other\" line directly so the user can type the description right away.\n const hasItemLookups = itemTypes.some((tp) => entityLookups[tp.value])\n const defaultItemKind =\n itemTypes.find((tp) => tp.value === 'other')?.value ??\n itemTypes.find((tp) => !entityLookups[tp.value])?.value ??\n itemTypes[0]?.value ??\n 'other'\n const bankAccounts = useFinancialStore((s) => s.bankAccounts)\n const paymentMethodTypes = useFinancialStore((s) => s.paymentMethodTypes)\n const fetchBankAccounts = useFinancialStore((s) => s.fetchBankAccounts)\n const fetchPaymentMethods = useFinancialStore((s) => s.fetchPaymentMethods)\n const payMovement = useFinancialStore((s) => s.payMovement)\n const createInvoice = useFinancialStore((s) => s.createInvoice)\n const guardMovements = useLimitGuard('movements_month')\n const can = usePermissionOptional()\n const canManageFinancial = can('financial', 'manage')\n const isEdit = !!editId\n const [attachmentsOpen, setAttachmentsOpen] = useState(false)\n // How many files the saved invoice holds, so the installment clip can say so.\n const [attachmentCount, setAttachmentCount] = useState(0)\n const loadAttachmentCount = React.useCallback(() => {\n if (!editId || !provider.getInvoiceAttachments) return\n provider.getInvoiceAttachments(editId).then((list) => setAttachmentCount(list.length)).catch(() => {})\n }, [editId, provider])\n useEffect(() => { loadAttachmentCount() }, [loadAttachmentCount])\n // Formas de pagamento e contas, SEMPRE.\n //\n // Carregavam só no cadastro novo, com a justificativa de que apenas ele quita\n // parcela na hora. Mas o botão «Pagar» da linha aparece em qualquer parcela\n // não liquidada — inclusive numa fatura já gravada —, e sem os dois catálogos\n // os seletores de forma e de conta abrem VAZIOS: o Pagar fica desabilitado\n // para sempre, sem dizer por quê. É o caminho inteiro de receber da ficha do\n // cliente, que abre justamente em edição.\n useEffect(() => {\n void fetchBankAccounts()\n void fetchPaymentMethods()\n }, [])\n\n useEffect(() => {\n let cancelled = false\n void Promise.all([provider.getChartOfAccounts(), provider.getCostCenters()])\n .then(([accountRows, costCenterRows]) => {\n if (cancelled) return\n setAccounts(accountRows)\n setCostCenters(costCenterRows)\n })\n .catch(() => { /* the pickers just stay hidden */ })\n return () => { cancelled = true }\n }, [provider])\n\n // O CAMPO DE CONTATO PRECISA DE UMA FONTE, E QUASE NENHUM APP ENTREGA UMA.\n //\n // `config.contactLookup` é opcional e nasce indefinido: sem ele o campo\n // devolvia lista vazia para qualquer busca E ficava sem \"cadastrar\" — porque\n // quem oferece o criar é `lookup.create`. O resultado, no FiscalControl, era\n // um campo obrigatório de fornecedor que não achava ninguém e não deixava\n // cadastrar ninguém: a nota na mão e o lançamento parado.\n //\n // The counterparty can already exist under more than one business role. Keep\n // those result sets together and labelled instead of forcing a duplicate\n // supplier/customer record just because this invoice has one direction.\n const contactLookup = useMemo<EntityLookup>(\n () => createFinancialCounterpartyLookup(direction),\n [direction],\n )\n\n // Os ITENS COMO ESTÃO NO BANCO, reduzidos a uma chave. É o que responde\n // \"mexeram nas linhas?\" — a pergunta que decide se o total e o cronograma\n // precisam ser regravados, e se o rodapé de salvar tem o que salvar.\n const [savedItemsKey, setSavedItemsKey] = useState('')\n const [loaded, setLoaded] = useState(!editId)\n // Bumped when a widget changed the saved invoice (an abated line): read it again.\n const [reloadTick, setReloadTick] = useState(0)\n const [loading, setLoading] = useState(!!editId)\n const [contactName, setContactName] = useState('')\n const [contactId, setContactId] = useState<string | undefined>()\n const [counterpartyAccounting, setCounterpartyAccounting] = useState<CounterpartyAccountingPolicy>({\n allowedAccountIds: [],\n limitAccounts: false,\n addItemsAutomatically: false,\n })\n const accountingPolicyRequest = useRef(0)\n // A new bill is born in the unit the person stands in (or their only one).\n // In the initializer too, so the form's \"unchanged\" snapshot already holds it\n // (units hydrate synchronously from the cached snapshot); the effect covers a\n // cold cache.\n const defaultUnitId = (): string | undefined => {\n if (!unitMode) return undefined\n if (activeUnitId && reachableUnits.some((u) => u.id === activeUnitId)) return activeUnitId\n return reachableUnits.length === 1 ? reachableUnits[0]!.id : undefined\n }\n const [unitId, setUnitId] = useState(() => (isEdit ? undefined : defaultUnitId()) ?? locations[0]?.id ?? '')\n useEffect(() => {\n if (isEdit || unitId) return\n const next = defaultUnitId()\n if (next) setUnitId(next)\n }, [isEdit, unitMode, unitId, activeUnitId, reachableUnits])\n const [invoiceDate, setInvoiceDate] = useState(new Date().toISOString().slice(0, 10))\n // A competência COMO ESTÁ NO BANCO: só se manda de volta o que mudou. Um\n // título já emitido recusa a própria data de novo se alguém já pagou algo,\n // e reenviá-la sem necessidade transformaria um salvar de observação em erro.\n const [savedInvoiceDate, setSavedInvoiceDate] = useState('')\n // A contraparte COMO ESTÁ NO BANCO. O gatilho compara campo a campo: mandar\n // a mesma pessoa de volta não custa nada, mas mandar o que não mudou junto\n // com o que mudou é o que fazia todo salvar falhar. Ver a 110.\n const [savedContactId, setSavedContactId] = useState<string | undefined>()\n const [fiscalNumber, setFiscalNumber] = useState('')\n const [observations, setObservations] = useState('')\n const [tags, setTags] = useState<string[]>([])\n const [savedTags, setSavedTags] = useState('[]')\n const [items, setItems] = useState<FormItem[]>([])\n // Chart of accounts for the per-line account picker. Leaves only — the\n // parents are headings and a line cannot be posted to one.\n const [accounts, setAccounts] = useState<ChartOfAccountsNode[]>([])\n const postable = useMemo(() => postableAccounts(accounts), [accounts])\n const selectableAccounts = useMemo(() => {\n if (!counterpartyAccounting.limitAccounts) return postable\n const allowed = new Set(counterpartyAccounting.allowedAccountIds)\n return postable.filter((account) => allowed.has(account.id))\n }, [postable, counterpartyAccounting])\n // Centro de custo: a LISTA de contas já filtra por ele desde sempre, e o\n // formulário nunca teve onde preenchê-lo — o filtro nascia sem nada para\n // achar. O campo mora ao lado do plano de contas porque as duas perguntas\n // são a mesma linha: em que conta isto entra, e de quem é a despesa.\n const [costCenters, setCostCenters] = useState<CostCenter[]>([])\n const [expandedItemId, setExpandedItemId] = useState<string | null>(null)\n const [addingItem, setAddingItem] = useState(false)\n const [installments, setInstallments] = useState<FormInstallment[]>([])\n // Amounts typed by hand in this session, by draft `_id`: the next manual\n // change leaves them alone while another open installment can absorb it.\n const [pinnedAmounts, setPinnedAmounts] = useState<ReadonlySet<string>>(new Set())\n const [cancelled, setCancelled] = useState(false)\n const [savedTotal, setSavedTotal] = useState<number | null>(null)\n // As parcelas COMO ESTÃO NO BANCO. `installments` é o rascunho editável; estas\n // carregam o que já foi pago, que é o que decide se o cronograma ainda pode\n // ser refeito e qual linha ganha o botão de pagar.\n const [savedMovements, setSavedMovements] = useState<FinancialMovement[]>([])\n const [hasCancelledInstallments, setHasCancelledInstallments] = useState(false)\n const [payingMovement, setPayingMovement] = useState<FinancialMovement | null>(null)\n const [pendingReceipt, setPendingReceipt] = useState<string | undefined>()\n // \"Cadastrar\" no campo de contato abre o formulário do contato com o texto já\n // no nome — o tipo (cliente / fornecedor) é pergunta obrigatória lá, senão o\n // registro nasce fora do próprio filtro que o pediu e some do campo.\n const contactCreate = useLookupCreate(contactLookup, (created) => {\n setContactId(created.id)\n setContactName(created.label)\n setPendingContact(null)\n })\n // Qual parcela pediu a foto. O seletor de arquivo é um só na tela: guardar o\n // alvo é mais barato que montar um input escondido por linha.\n // Um fornecedor que o recibo nomeou e o cadastro ainda não tem.\n const [pendingContact, setPendingContact] = useState<string | null>(null)\n const [receiptTarget, setReceiptTarget] = useState<number | null>(null)\n // A bill's PDF (the boleto) is an attachment of the invoice, not a payment: it\n // waits here and is uploaded once the invoice exists.\n const [pendingDocs, setPendingDocs] = useState<File[]>([])\n const receiptPicker = useReceiptPicker((dataUrl) => {\n const i = receiptTarget\n setReceiptTarget(null)\n if (i == null) return\n // Fatura já existente: a parcela é um movimento no banco, e fotografar o\n // comprovante é o mesmo gesto de quitar — abre o diálogo de pagamento com a\n // imagem dentro, exatamente como no detalhe.\n if (isEdit) {\n const saved = savedMovements[i]\n if (!saved) return\n setPendingReceipt(dataUrl)\n setPayingMovement(saved)\n return\n }\n // Fatura ainda nascendo: a imagem viaja no rascunho e vira pagamento no\n // salvar (ver handleSave).\n setInstallments((prev) => prev.map((inst, idx) => idx === i ? { ...inst, receiptUrl: dataUrl } : inst))\n }, provider.addInvoiceAttachment ? (file) => {\n setReceiptTarget(null)\n setPendingDocs((prev) => [...prev, file])\n } : undefined)\n const [saving, setSaving] = useState(false)\n const [menuOpen, setMenuOpen] = useState(false)\n // The cancel dialog works on the saved lines (ids), not on the form's draft rows.\n const [cancelData, setCancelData] = useState<{ items: InvoiceItem[]; total: number; name?: string } | null>(null)\n const [cancelledLines, setCancelledLines] = useState<InvoiceItem[]>([])\n const menuRef = useRef<HTMLDivElement>(null)\n\n async function openCancelDialog() {\n if (!editId) return\n try {\n const [inv, lines] = await Promise.all([provider.getInvoiceById(editId), provider.getInvoiceItems(editId)])\n setCancelData({ items: lines.filter((l) => !l.cancelledAt), total: inv?.totalAmount ?? 0, name: inv?.contactName })\n } catch (err: any) {\n toast.error('Não foi possível abrir o cancelamento', { description: err?.message })\n }\n }\n\n // Close menu on click outside\n useEffect(() => {\n if (!menuOpen) return\n function handleClick(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false)\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n // When and by whom the bill was filed — the same footer every record has.\n const [recordMeta, setRecordMeta] = useState<Record<string, unknown> | null>(null)\n\n // Load existing invoice for edit mode\n useEffect(() => {\n if (!editId || (loaded && reloadTick === 0)) return\n setLoading(true)\n ;(async () => {\n const invoice = await provider.getInvoiceById(editId)\n if (!invoice) return\n setContactName(invoice.contactName ?? '')\n setContactId(invoice.contactId)\n setPriceTableId(invoice.priceTableId ?? undefined)\n setSavedPriceTableId(invoice.priceTableId ?? undefined)\n if (invoice.contactId) {\n try {\n const contact = await contactLookup.getById(invoice.contactId)\n const policy = counterpartyAccountingPolicy(contact?.data)\n const refs = [policy.defaultAccountId, ...policy.allowedAccountIds].filter(Boolean) as string[]\n const resolved = await provider.resolveChartAccountRefs?.(refs) ?? {}\n setCounterpartyAccounting(resolveCounterpartyAccountingPolicy(policy, resolved))\n } catch {\n // Existing invoices remain editable when contact metadata is unavailable.\n }\n }\n setUnitId(invoice.unitId ?? locations[0]?.id ?? '')\n setInvoiceDate(invoice.invoiceDate)\n setSavedInvoiceDate(invoice.invoiceDate)\n setSavedContactId(invoice.contactId)\n setCancelled(invoice.status === 'cancelled')\n setSavedTotal(invoice.totalAmount)\n setRecordMeta({ createdAt: invoice.createdAt, updatedAt: invoice.updatedAt, createdBy: invoice.createdBy })\n setDocumentCurrency(invoice.currency)\n // The supplier's document number, not the invoice's own sequence\n // (`fiscalNumber` on the read model is PAG-000001).\n setFiscalNumber(String((invoice.metadata as Record<string, unknown> | undefined)?.fiscalNumber ?? ''))\n setObservations(invoice.observations ?? '')\n setTags(invoice.tags ?? [])\n setSavedTags(JSON.stringify(invoice.tags ?? []))\n\n const allLines = await provider.getInvoiceItems(editId)\n // Cancelled lines stay visible (struck) but out of the editable rows: saving\n // them back would bring a cancelled line to life.\n const invoiceItems = allLines.filter((it) => !it.cancelledAt)\n setCancelledLines(allLines.filter((it) => !!it.cancelledAt))\n setSavedItemsKey(itemsKey(invoiceItems))\n // O LÁPIS DO DETALHE ABRE A LINHA CERTA.\n //\n // Sem isto, clicar no item errado de uma nota de 18 linhas levava para o\n // formulário inteiro fechado, e a pessoa tinha de reencontrar ali o que\n // acabara de apontar com o dedo.\n const idsCarregados: string[] = []\n setItems(invoiceItems.map((it) => {\n const _id = fid()\n idsCarregados.push(_id)\n return {\n _id,\n itemKind: it.itemKind,\n referenceId: it.referenceId,\n description: it.description,\n quantity: it.quantity,\n unitPrice: it.unitPrice,\n discount: it.discount,\n surcharge: it.surcharge,\n accountId: it.accountId,\n costCenterId: it.costCenterId,\n metadata: it.metadata,\n }\n }))\n // What each saved line already brought into stock, keyed by the draft id\n // the row is drawn with. Read on the side: a bill opens without it.\n void provider.getInvoiceStockDetails?.(editId).then((rows) => {\n const byDraft = new Map<string, StockEntryDetail[]>()\n for (const r of rows) {\n const at = invoiceItems.findIndex((it) => it.id === r.itemId)\n const draftId = idsCarregados[at]\n if (!draftId) continue\n byDraft.set(draftId, [...(byDraft.get(draftId) ?? []), { variantName: r.variantName, quantity: r.quantity, enteredOn: r.enteredOn }])\n }\n setStockNotes(byDraft)\n }).catch(() => {})\n const aAbrir = consumirItemParaAbrir(editId)\n if (aAbrir !== undefined && idsCarregados[aAbrir]) setExpandedItemId(idsCarregados[aAbrir]!)\n\n // POR `invoiceId`, que é o que liga o ramo do CRONOGRAMA no provider.\n //\n // Antes ia `{ direction }` e sem fatura: aí o provider cai no ramo geral,\n // que lê `plg_financial_movements` — onde só existe PAGAMENTO. As parcelas\n // moram em `plg_financial_invoice_installments`, nunca vinham, e o filtro\n // client-side procurava por bills que ninguém tinha buscado. A tela de\n // edição abria com o cronograma vazio (\"selecione a quantidade de\n // parcelas\") numa conta que já tinha parcela — e salvar dali recriaria o\n // cronograma do zero.\n //\n // E sem `direction` de propósito: aquele ramo espera o vocabulário\n // débito/crédito, então mandar 'payable' cairia em `receivable` e traria\n // a parcela errada. A fatura já identifica o lado.\n const movements = await provider.getMovements({ invoiceId: editId })\n const billMovements = movements.data\n .filter((m) => m.movementKind === 'bill')\n .sort((a, b) => (a.installmentNumber ?? 0) - (b.installmentNumber ?? 0))\n // A cancelled installment of a live invoice is history, not schedule.\n // Loaded as a draft line it made the sum overshoot the total, and the\n // form \"fixed\" that by halving the one installment still owed.\n const liveMovements = billMovements.filter((m) => m.status !== 'cancelled')\n const invoiceMovements = liveMovements.length > 0 ? liveMovements : billMovements\n setHasCancelledInstallments(liveMovements.length > 0 && liveMovements.length < billMovements.length)\n setSavedMovements(invoiceMovements)\n setInstallments(invoiceMovements.map((m) => {\n // Forma e conta escolhidas na linha moram na `metadata` da parcela — é\n // por isso que reabrir a conta devolve a escolha em vez de uma linha\n // em branco que a pessoa preenche de novo toda vez.\n const meta = (m.metadata ?? {}) as Record<string, unknown>\n const str = (v: unknown) => (typeof v === 'string' && v ? v : undefined)\n return {\n _id: fid(),\n amount: m.amount,\n dueDate: m.dueDate,\n payMethodTypeId: str(meta.payMethodTypeId),\n payMethodId: str(meta.payMethodId),\n payAccountId: str(meta.payAccountId),\n }\n }))\n\n setLoaded(true)\n setLoading(false)\n })()\n }, [editId, reloadTick])\n\n const totalAmount = items.reduce((sum, it) => {\n return sum + it.quantity * it.unitPrice - (it.discount ?? 0) + (it.surcharge ?? 0)\n }, 0)\n\n const itemsDirty = isEdit && loaded && itemsKey(items) !== savedItemsKey\n\n // O TOTAL QUE O CRONOGRAMA TEM DE FECHAR.\n //\n // Na criação é a soma dos itens. Numa fatura JÁ GRAVADA é a soma das parcelas\n // que o banco devolveu — e não a dos itens relidos, que pode diferir por um\n // centavo de arredondamento. O banco confere a soma contra o total gravado e\n // recusa a diferença, então dividir a partir dos itens faria \"trocar para 3x\"\n // falhar em faturas perfeitamente normais.\n // The invoice's own total wins over the installments' sum: a save that wrote\n // the lines but not the schedule left them apart, and only this re-aligns it.\n const scheduleTotal = isEdit && savedMovements.length > 0 && !itemsDirty\n ? savedTotal ?? Math.round(savedMovements.reduce((sum, m) => sum + m.amount, 0) * 100) / 100\n : totalAmount\n\n // Auto-generate 1x installment when first item is added\n const prevItemCount = useRef(items.length)\n useEffect(() => {\n if (items.length > 0 && prevItemCount.current === 0 && installments.length === 0 && !isEdit) {\n // First item added — generate 1x installment\n const total = items.reduce((sum, it) => sum + it.quantity * it.unitPrice - (it.discount ?? 0) + (it.surcharge ?? 0), 0)\n if (total > 0) {\n setInstallments([{ _id: fid(), amount: total, dueDate: invoiceDate }])\n }\n }\n prevItemCount.current = items.length\n }, [items.length])\n\n // Recalculate installment amounts when total changes.\n //\n // A CONDIÇÃO É A SOMA NÃO FECHAR, não \"as linhas mudaram\".\n //\n // Antes o gatilho era `itemsDirty`, e ele é um COMPARADOR COM O GRAVADO —\n // volta a ser falso quando o valor volta ao original. Apagar um dígito de\n // 128,95 redividia para 12,89; redigitar o dígito devolvia o item a 128,95,\n // `itemsDirty` voltava a falso, e a parcela ficava congelada no valor\n // intermediário. O salvar então batia na porta do banco com \"installments\n // sum to 12.89 but the invoice total is 128.95\" — que é o banco defendendo\n // exatamente o invariante que a tela tinha quebrado.\n //\n // A pergunta certa é a mesma que o banco faz: as parcelas somam o total? Se\n // somam, não há o que redividir — e é isso que preserva o cronograma\n // desigual de uma fatura já gravada, que era o que `itemsDirty` protegia.\n // Contra `scheduleTotal`, e não contra a soma dos itens: numa fatura gravada\n // o alvo é o total que o BANCO tem — os itens relidos podem diferir dele por\n // um centavo de arredondamento, e comparar com eles redividiria o cronograma\n // de toda fatura só por ela ter sido aberta.\n const somaParcelas = Math.round(installments.reduce((s, i) => s + i.amount, 0) * 100)\n useEffect(() => {\n if (installments.length === 0) return\n // A new document whose total fell to zero has nothing to schedule; the\n // 1x effect below rebuilds it once the total comes back.\n if (scheduleTotal <= 0) {\n if (!isEdit) setInstallments([])\n return\n }\n if (somaParcelas === Math.round(scheduleTotal * 100)) return\n const count = installments.length\n const perInstallment = Math.floor(scheduleTotal * 100 / count) / 100\n const remainder = Math.round((scheduleTotal - perInstallment * count) * 100) / 100\n setPinnedAmounts(new Set())\n setInstallments((prev) => prev.map((inst, i) => ({\n ...inst,\n amount: i === 0 ? perInstallment + remainder : perInstallment,\n })))\n }, [scheduleTotal, somaParcelas, installments.length, isEdit])\n\n useEffect(() => {\n const ids = items\n .filter((it) => it.itemKind === 'product' && it.referenceId && !asked.current.has(it.referenceId))\n .map((it) => it.referenceId!)\n if (ids.length === 0 || !provider.getProductPictures) return\n ids.forEach((id) => asked.current.add(id))\n provider.getProductPictures(ids).then((found) => setPictures((prev) => ({ ...prev, ...found }))).catch(() => {})\n }, [items, provider])\n\n function addItemOfKind(kind: string) {\n const newItem: FormItem = {\n _id: fid(),\n itemKind: kind,\n description: '',\n quantity: 1,\n unitPrice: 0,\n accountId: counterpartyAccounting.defaultAccountId,\n costCenterId: counterpartyAccounting.defaultCostCenterId,\n }\n setItems((current) => [...current, newItem])\n setExpandedItemId(newItem._id)\n setAddingItem(false)\n }\n\n // Entry point for the \"Add Item\" / \"Add your first item\" buttons. With\n // lookup-backed types we ask which type first; otherwise we add an \"Other\"\n // line straight away so the user types directly.\n function startAddItem() {\n if (!contactId) {\n toast.error(t('financial.invoiceForm.contactRequired'))\n return\n }\n if (hasItemLookups) setAddingItem(true)\n else addItemOfKind(defaultItemKind)\n }\n\n // Functional updates: a line can receive two patches before a re-render\n // (catalog pick, then the price of a product created in the modal), and a\n // stale `items` would drop the first one and leave the total behind.\n function updateItem(id: string, data: Partial<FormItem>) {\n setItems((current) => current.map((it) => it._id === id ? { ...it, ...data } : it))\n }\n\n // ---------------------------------------------------------------------------\n // O PACOTE ENTRA ABERTO, não como uma linha só.\n //\n // Escolher «Pacote Psicoterapia · 10 sessões» e gravar UMA linha com esse nome\n // esconde o que foi vendido: a nota não diz quais serviços o cliente comprou,\n // a receita não se divide por serviço e a comissão do profissional não tem de\n // onde sair. O que a casa presta são as sessões — é isso que a conta registra.\n //\n // Quem sabe desdobrar é o CATÁLOGO, não esta tela: `EntityLookup.expand`\n // devolve as linhas, já com o preço do pacote repartido entre elas. Um tipo\n // sem `expand` — serviço, produto, gift card — passa direto por aqui.\n //\n // `itemKind` da linha nova é o que o desdobramento pediu, mas só se esta tela\n // oferecer esse tipo: um app que não lista «Serviço» receberia uma linha com\n // um selo que o seletor dela não tem.\n async function applyItemPatch(item: FormItem, patch: Partial<FormItem>) {\n const expand = patch.referenceId ? entityLookups[item.itemKind]?.expand : undefined\n if (!expand) { updateItem(item._id, patch); return }\n let linhas: Awaited<ReturnType<NonNullable<typeof expand>>> = []\n try {\n linhas = await expand(patch.referenceId!)\n } catch (err) {\n console.error('[financial] failed to expand package', err)\n }\n // Pacote sem itens declarados segue sendo a linha escolhida: o nome do\n // pacote é tudo que se sabe dele.\n if (!linhas.length) { updateItem(item._id, patch); return }\n const oferecidos = new Set(itemTypes.map((tp) => tp.value))\n const novas: FormItem[] = linhas.map((linha) => ({\n _id: fid(),\n itemKind: linha.itemKind && oferecidos.has(linha.itemKind) ? linha.itemKind : item.itemKind,\n referenceId: linha.referenceId,\n description: linha.description,\n quantity: linha.quantity,\n unitPrice: linha.unitPrice,\n ...(linha.discount ? { discount: linha.discount } : {}),\n ...(linha.surcharge ? { surcharge: linha.surcharge } : {}),\n ...(linha.metadata ? { metadata: linha.metadata } : {}),\n accountId: item.accountId,\n costCenterId: item.costCenterId,\n }))\n setItems((current) => current.flatMap((it) => it._id === item._id ? novas : [it]))\n // Nenhuma linha aberta: o que havia para responder — qual pacote — já foi\n // respondido, e abrir a primeira das dez sugeriria que falta algo nela.\n setExpandedItemId(null)\n }\n\n // Changing the table re-prices the catalogue lines already on the document;\n // a line the new table does not offer keeps its price and is reported.\n async function changePriceTable(next: string | undefined) {\n setPriceTableId(next)\n const table = priceTables.find((pt) => pt.id === next)\n if (!table || !canEditItems) return\n const priced = items.filter((it) => it.referenceId && (it.itemKind === 'product' || it.itemKind === 'service'))\n if (priced.length === 0) return\n try {\n const quotes = await quotePriceTable(table.id, priced.map((it) => ({ productId: it.referenceId!, quantity: it.quantity })))\n const prices = new Map<string, number>()\n priced.forEach((it, i) => { const q = quotes[i]; if (q) prices.set(it._id, q.price) })\n setItems((current) => current.map((it) => prices.has(it._id) ? { ...it, unitPrice: prices.get(it._id)! } : it))\n if (prices.size > 0) toast.success(t('financial.invoiceForm.priceTableRepriced', { count: prices.size, table: table.name }))\n const missing = priced.length - prices.size\n if (missing > 0) toast.warning(t('financial.invoiceForm.priceTableMissing', { count: missing, table: table.name }))\n } catch (err) {\n toast.error(err instanceof Error ? err.message : String(err))\n }\n }\n\n function removeItem(id: string) {\n setItems((current) => current.filter((it) => it._id !== id))\n }\n\n // Uma parcela, sozinha, assim que houver total. À vista é o caso normal — a\n // esmagadora maioria das faturas — e exigir um clique em \"1x\" para chegar nele\n // é cobrar por um parcelamento que ninguém pediu. Quem parcela troca o número;\n // quem não parcela não precisa fazer nada. Só na criação: o cronograma de uma\n // fatura existente é dela.\n useEffect(() => {\n if (isEdit || totalAmount <= 0 || installments.length > 0) return\n generateInstallments(1)\n }, [isEdit, totalAmount, installments.length])\n\n // Veio de um CARTÃO: a parcela já nasce apontando para ele, e para a forma de\n // pagamento que corresponde. É o único campo que a origem realmente responde\n // — o resto (fornecedor, valor, categoria) continua vazio, porque o cartão\n // não sabe nada disso e campo errado custa mais que campo vazio.\n const fromCard = React.useMemo(\n () => (fromCardId ? bankAccounts.find((a) => a.id === fromCardId) : undefined),\n [fromCardId, bankAccounts])\n // Os últimos quatro DÍGITOS, e só dígitos: o número vem digitado à mão e\n // costuma trazer espaço, ponto ou hífen.\n const cardLast4 = (fromCard?.accountNumber ?? '').replace(/\\D/g, '').slice(-4)\n // Quem cadastrou o cartão antes de a tela mostrar os dígitos costuma tê-los\n // posto no PRÓPRIO nome (\"Itaú Empresas — final 0092\"). Repetir ali vira\n // \"final 0092 •••• 0092\", que é ruído. Se o nome já termina nos dígitos, o\n // nome basta.\n const nomeJaTemOsDigitos =\n !!cardLast4 && (fromCard?.name ?? '').replace(/\\D/g, '').endsWith(cardLast4)\n // A forma de pagamento que a despesa VAI usar — não a da parcela, que só\n // existe depois de haver um item. Quem abre a tela quer saber já que vai\n // lançar no crédito daquele cartão; esperar um item para dizer isso é dizer\n // tarde.\n const cardMethodName = React.useMemo(() => {\n const id = installments[0]?.payMethodTypeId\n const escolhida = id ? paymentMethodTypes.find((tp) => tp.id === id) : undefined\n return (escolhida ?? paymentMethodTypes.find((tp) => tp.transactionType === 'credit_card'))?.name\n }, [installments, paymentMethodTypes])\n\n const cardSeeded = useRef(false)\n useEffect(() => {\n if (isEdit || !fromCardId || cardSeeded.current) return\n if (installments.length === 0) return\n const credito = paymentMethodTypes.find((tp) => tp.transactionType === 'credit_card')\n setInstallments((prev) => prev.map((inst, i) => i === 0\n ? { ...inst, payAccountId: fromCardId, payMethodTypeId: credito?.id ?? inst.payMethodTypeId }\n : inst))\n cardSeeded.current = true\n }, [isEdit, fromCardId, installments.length, paymentMethodTypes])\n\n // Chegou pelo assistente: ele leu o recibo e guardou o que conseguiu ler.\n //\n // Semeia UMA vez, na montagem, e só o que o papel respondeu — fornecedor,\n // valor, data e a própria foto. Vencimento, categoria e conta de pagamento\n // ficam vazios de propósito: um recibo quase nunca diz, e campo errado custa\n // uma conferência inteira enquanto campo vazio custa um toque. O item nasce\n // como \"outro\" porque nenhum catálogo foi consultado — quem confere escolhe.\n const draftSeeded = useRef(false)\n useEffect(() => {\n if (isEdit || draftSeeded.current) return\n const draft = consumePayableDraft(direction)\n if (!draft) return\n draftSeeded.current = true\n\n if (draft.date) setInvoiceDate(draft.date)\n if (draft.fiscalNumber) setFiscalNumber(draft.fiscalNumber)\n // O resto do que estava no papel — itinerário, placa, quem assinou. É onde a\n // pessoa vai procurar o que o recibo dizia depois que a foto virar anexo.\n if (draft.notes) setObservations(draft.notes)\n\n // O fornecedor: primeiro procura, e só vira rascunho se não existir.\n // Semear o nome direto no campo não bastava — o seletor mostra o rótulo do\n // id escolhido, então um nome sem id aparecia como campo VAZIO, e o dado\n // que o recibo deu era o único que a tela não mostrava.\n // A receivable draft names the customer; a payable one, the supplier.\n const counterparty = draft.supplier ?? draft.customer\n if (counterparty) {\n setContactName(counterparty)\n void (async () => {\n const hit = (await contactLookup.search(counterparty).catch(() => []))\n ?.find((r) => r.label.trim().toLowerCase() === counterparty.trim().toLowerCase())\n if (hit) { setContactId(hit.id); setContactName(hit.label) }\n else setPendingContact(counterparty)\n })()\n }\n // AS LINHAS DO DOCUMENTO, todas. Uma linha só com o total dentro era o que\n // transformava um pedido de três produtos numa despesa anônima — e o frete,\n // somado a um produto, sumia dentro do preço dele.\n setItems(\n draft.items?.length\n ? [\n ...draft.items.map((line) => ({\n _id: fid(),\n itemKind: 'other' as const,\n description: line.description,\n quantity: line.quantity,\n unitPrice: line.unitPrice,\n })),\n ...(draft.shipping\n ? [{ _id: fid(), itemKind: 'other' as const, description: 'Frete', quantity: 1, unitPrice: draft.shipping }]\n : []),\n ]\n : [{\n _id: fid(),\n itemKind: 'other',\n description: draft.description ?? counterparty ?? '',\n quantity: 1,\n unitPrice: draft.amount - (draft.shipping ?? 0),\n }],\n )\n // A parcela é montada aqui e não deixada para o efeito que gera 1x: aquele\n // não sabe da foto, e uma parcela sem `receiptUrl` perderia o comprovante\n // que motivou a tela inteira.\n // A foto NÃO entra como comprovante da parcela.\n //\n // Anexar um recibo aqui quita a parcela, e quitar exige dizer por onde o\n // dinheiro saiu — então a tela abria com um erro vermelho pedindo forma de\n // pagamento e conta, campos que o papel não responde. A pessoa pediu para\n // ler um recibo e recebeu uma cobrança.\n //\n // O clipe da parcela continua ali para quem quiser anexar, no momento em que\n // souber como pagou. Ver `pendingReceipt` abaixo: a foto fica guardada, não\n // perdida.\n setInstallments([{ _id: fid(), amount: draft.amount, dueDate: draft.date ?? invoiceDate }])\n if (draft.receiptUrl) setPendingReceipt(draft.receiptUrl)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isEdit])\n\n // Entrou por \"Enviar recibo\": a câmera abre sozinha na primeira parcela, assim\n // que houver uma. É o caminho de quem já está com o papel na mão — pedir mais\n // um clique aqui desfaz a razão de o atalho existir.\n const receiptAutoOpened = useRef(false)\n useEffect(() => {\n if (!focusReceipt || isEdit || receiptAutoOpened.current) return\n if (installments.length === 0 || installments[0]?.receiptUrl) return\n receiptAutoOpened.current = true\n // Um tique depois de montar: alguns navegadores ignoram o clique\n // programático enquanto a tela ainda está entrando.\n const id = window.setTimeout(() => { setReceiptTarget(0); receiptPicker.open() }, 250)\n return () => window.clearTimeout(id)\n }, [focusReceipt, isEdit, installments.length])\n\n function generateInstallments(count: number) {\n if (count < 1 || scheduleTotal <= 0) return\n const amounts = splitInstallments(scheduleTotal, count)\n const base = new Date(invoiceDate)\n const inst: FormInstallment[] = []\n for (let i = 0; i < count; i++) {\n const due = new Date(base)\n // Paid at once, it is due on the invoice date; split, the first one\n // falls a month later. A one-off bill due next month also fell outside\n // the list's default window and looked lost.\n due.setMonth(due.getMonth() + (count === 1 ? 0 : i + 1))\n inst.push({\n _id: fid(),\n amount: amounts[i],\n dueDate: due.toISOString().slice(0, 10),\n })\n }\n setInstallments(inst)\n }\n\n // `stay` — salvar SEM sair. Quem paga uma parcela de uma conta que ainda não\n // existe precisa que ela exista primeiro, e não pode ser jogado para a lista\n // no meio do caminho. Devolve o id, que é o que o passo seguinte precisa.\n async function handleSave(opts?: { stay?: boolean }): Promise<string | null> {\n // Defense in depth: block creating a new invoice without the `create` action.\n if (!isEdit && !can('financial', 'create')) return null\n if (!contactId) { toast.error(t('financial.invoiceForm.contactRequired')); return null }\n if (items.length === 0) { toast.error(t('common.formIncomplete')); return null }\n // Recibo sem dizer por onde saiu é um pagamento que não bate com extrato\n // nenhum. Vale por parcela: cada uma que traz comprovante tem de dizer.\n if (!isEdit && installments.some((i) => i.receiptUrl && (!i.payMethodTypeId || !i.payAccountId))) {\n toast.error(t('financial.invoiceForm.paidNeedsMethod'))\n return null\n }\n // Plan quantity guard (client-side): an invoice writes one financial movement\n // per installment (min 1). Guard that many against the monthly cap before the\n // store call — the guard opens the global UpgradeModal when it would exceed.\n if (!isEdit && (await guardMovements(Math.max(1, installments.length))) === 'blocked') return null\n // JÁ CRIADA. Ver `createdId`: o modo do formulário não muda depois de\n // gravar, então sem esta porta o segundo salvar cria a conta de novo.\n if (!isEdit && createdId.current) {\n if (!opts?.stay) onSaved?.(createdId.current)\n return createdId.current\n }\n setSaving(true)\n let savedId: string | null = editId ?? null\n try {\n const movInputs: CreateMovementInput[] = installments.map((inst, i) => ({\n direction,\n movementKind: 'bill' as const,\n amount: inst.amount,\n dueDate: inst.dueDate,\n installmentNumber: i + 1,\n }))\n\n if (movInputs.length === 0) {\n movInputs.push({\n direction,\n movementKind: 'bill',\n amount: totalAmount,\n dueDate: invoiceDate,\n installmentNumber: 1,\n })\n }\n\n // O comprovante viaja com a SUA parcela: a nota é o acordo, a parcela é o\n // dinheiro que mudou de mão, e é dela que o recibo prova alguma coisa.\n // Forma e conta viajam junto, pelo mesmo motivo: são propriedade da\n // parcela, não da nota — cada vencimento pode sair de um banco.\n installments.forEach((inst, i) => {\n const extra = {\n ...(inst.receiptUrl ? { receiptUrl: inst.receiptUrl } : {}),\n ...sourceMeta(inst),\n }\n if (Object.keys(extra).length > 0 && movInputs[i]) {\n movInputs[i] = { ...movInputs[i]!, metadata: { ...(movInputs[i]!.metadata ?? {}), ...extra } }\n }\n })\n\n if (isEdit && editId) {\n // AS LINHAS PRIMEIRO, e com elas o total.\n //\n // O cronograma é conferido contra o total GRAVADO: mandar parcelas de\n // um total novo antes de gravá-lo faria o banco recusar a soma sem que\n // a tela soubesse dizer por quê. 099 abriu linhas e total enquanto nada\n // foi recebido; depois do primeiro centavo `canEditItems` é falso e\n // nada disto roda.\n if (canEditItems && provider.replaceInvoiceItems && itemsDirty) {\n await provider.replaceInvoiceItems(editId, items.map(({ _id, ...rest }) => rest))\n setSavedTotal(Math.round(totalAmount * 100) / 100)\n }\n // Uma conta emitida é imutável na IDENTIDADE (número, direção, emissão,\n // moeda); o resto tem licença enquanto nada foi recebido. Mandar de\n // volta o que não mudou — o total recomputado, que desvia do gravado\n // por arredondamento — fazia todo salvar falhar, então só vai o que\n // mudou de fato: o gatilho compara campo a campo.\n await provider.updateInvoice(editId, {\n unitId: unitId || undefined,\n fiscalNumber: fiscalNumber || undefined,\n observations,\n // Only when changed: an untouched bill must not write a column an older pool lacks.\n ...(JSON.stringify(tags) !== savedTags ? { tags } : {}),\n // 098 abriu a competência enquanto nada foi recebido.\n ...(invoiceDate !== savedInvoiceDate ? { invoiceDate } : {}),\n // 110 abriu a CONTRAPARTE, com o mesmo limite: quem digita seis\n // contas seguidas escolhe o fornecedor da linha de cima na quarta, e\n // até aqui a correção era cancelar a conta e lançar outra.\n ...(contactId !== savedContactId ? { contactId, contactName } : {}),\n ...(priceTableId !== savedPriceTableId ? { priceTableId: priceTableId ?? null } : {}),\n })\n // O CRONOGRAMA IA JUNTO NO RASCUNHO E FICAVA NELE.\n //\n // As parcelas são outra tabela, e o salvar só mandava o cabeçalho:\n // mudar o vencimento aqui, clicar em salvar e ver a data voltar ao que\n // era. Nenhum erro — o pedido nunca foi feito.\n //\n // Pareado por POSIÇÃO com `savedMovements`, que é a mesma ordem em que\n // o formulário as carregou. Só o que MUDOU e só o que ainda não foi\n // pago: a data de uma parcela liquidada já virou extrato, e reescrevê-la\n // faria o razão discordar do banco.\n //\n // Mudar a QUANTIDADE de parcelas não é mexer numa linha: 2x virando 3x\n // apaga uma e reescreve as outras, e (invoice_id, number) é UNIQUE — o\n // laço de updates abaixo passaria por um estado que o banco recusa. Aí\n // o cronograma inteiro vai de uma vez, pela porta que o faz numa\n // transação. Mexeu só no vencimento: o caminho barato continua.\n const shapeChanged = itemsDirty\n || installments.length !== savedMovements.length\n || installments.some((inst, i) => Math.round(inst.amount * 100) !== Math.round((savedMovements[i]?.amount ?? 0) * 100))\n if (canReschedule && provider.rescheduleInvoice && shapeChanged) {\n await provider.rescheduleInvoice(editId, installments.map((inst, i) => ({\n dueDate: inst.dueDate,\n amount: inst.amount,\n // A RPC SUBSTITUI a metadata quando ela vem. O que já estava lá —\n // o comprovante, acima de tudo — tem de ir junto, ou reparcelar\n // apagaria a prova de um pagamento.\n metadata: { ...(savedMovements[i]?.metadata ?? {}), ...sourceMeta(inst) },\n })))\n } else if (provider.updateInstallment) {\n await Promise.all(installments.map((inst, i) => {\n const saved = savedMovements[i]\n if (!saved || saved.status === 'paid') return null\n const meta = sourceMeta(inst)\n const savedMeta = (saved.metadata ?? {}) as Record<string, unknown>\n const sourceChanged = (Object.keys(meta) as Array<keyof typeof meta>)\n .some((k) => (savedMeta[k] ?? null) !== meta[k])\n if (inst.dueDate === saved.dueDate && !sourceChanged) return null\n return provider.updateInstallment!(saved.id, {\n ...(inst.dueDate !== saved.dueDate ? { dueDate: inst.dueDate } : {}),\n ...(sourceChanged ? { metadata: { ...savedMeta, ...meta } } : {}),\n })\n }).filter(Boolean) as Promise<void>[])\n }\n onSaved?.(editId)\n } else {\n const invoice = await createInvoice({\n direction,\n invoiceDate,\n contactId,\n contactName: contactName || undefined,\n unitId: unitId || undefined,\n currency: documentCurrency,\n ...(priceTableId ? { priceTableId } : {}),\n tags,\n fiscalNumber: fiscalNumber || undefined,\n observations: observations || undefined,\n items: items.map(({ _id, ...rest }) => rest),\n installments: movInputs,\n })\n invalidateLimit('movements_month')\n // Cada parcela com comprovante já nasce quitada — é o que um recibo\n // significa. Pelo MESMO caminho do pagamento manual (payMovement), não\n // por um atalho paralelo: o extrato, os saldos e os KPIs de caixa veem\n // exatamente o mesmo evento que veriam se alguém tivesse clicado pagar.\n const paidOnes = installments\n .map((inst, i) => ({ inst, number: i + 1 }))\n .filter(({ inst }) => inst.receiptUrl)\n if (paidOnes.length > 0) {\n const movements = await provider.getMovements({ direction, status: 'pending' })\n const bills = movements.data.filter((m) => m.invoiceId === invoice.id && m.movementKind === 'bill')\n for (const { inst, number } of paidOnes) {\n const bill = bills.find((m) => (m.installmentNumber ?? 1) === number)\n if (!bill) continue\n await payMovement({\n movementId: bill.id,\n amount: bill.amount,\n paymentDate: inst.dueDate,\n paymentMethodTypeId: inst.payMethodTypeId || undefined,\n bankAccountId: inst.payAccountId || undefined,\n idempotencyKey: `financial:invoice:${invoice.id}:installment:${bill.id}:receipt`,\n })\n }\n }\n if (pendingDocs.length > 0 && provider.addInvoiceAttachment) {\n const failed: string[] = []\n for (const file of pendingDocs) {\n await provider.addInvoiceAttachment(invoice.id, file).catch(() => { failed.push(file.name) })\n }\n setPendingDocs([])\n if (failed.length) toast.error(t('financial.invoiceForm.attachFailed'), { description: failed.join(', ') })\n }\n createdId.current = invoice.id\n if (!opts?.stay) onSaved?.(invoice.id)\n savedId = invoice.id\n }\n // O que está na tela virou o que está no banco: a barra de alterações não\n // salvas não tem mais o que oferecer.\n snapshot.current = JSON.stringify(fields)\n return savedId\n } catch (e) {\n // SALVAR FALHAVA EM SILÊNCIO.\n //\n // Havia `finally` e não havia `catch`: o erro subia, `onSaved` não\n // rodava, e a tela ficava exatamente como estava — com a barra de\n // \"alterações não salvas\" para sempre e nenhuma palavra sobre o porquê.\n // Quem tentava de novo tinha o mesmo nada de volta.\n toast.error((e as Error)?.message || t('common.saveFailed'))\n throw e\n } finally {\n setSaving(false)\n }\n }\n\n // ---------------------------------------------------------------------------\n // PAGAR UMA PARCELA QUE AINDA NÃO EXISTE.\n //\n // O botão de pagar só aparecia depois de salvar, porque ele precisa de um\n // MOVIMENTO no banco — e antes de salvar não há nenhum. Só que quem lança uma\n // conta já paga (o freelancer que acabou de receber, a compra no balcão)\n // lança e paga no mesmo minuto: mandá-lo salvar, achar a conta na lista,\n // abrir de novo e só então cobrar é pedir quatro passos para um fato só.\n //\n // Então o botão aparece desde o rascunho e faz o caminho inteiro: grava a\n // conta SEM sair da tela, encontra a parcela recém-criada e abre o mesmo\n // diálogo de pagamento do detalhe. Nada de atalho paralelo — é `payMovement`\n // no fim, como em qualquer outro lugar, e por isso extrato, saldo e KPI veem\n // o mesmo evento.\n //\n // Fechado o diálogo, a tela vai para a conta gravada: o rascunho já virou\n // registro, e continuar editando \"a nova\" seria editar uma cópia que não\n // existe mais.\n // ---------------------------------------------------------------------------\n const [payingNewId, setPayingNewId] = useState<string | null>(null)\n // A conta que este rascunho já virou.\n //\n // Depois de gravar, o formulário CONTINUA em modo de criação — `isEdit` vem\n // da rota, não do que acabou de acontecer. Sem esta marca, qualquer segundo\n // salvar (o botão da barra de alterações, uma nova tentativa de pagar) criava\n // OUTRA conta com os mesmos dados: foi assim que a mesma compra apareceu três\n // vezes na lista. Gravou uma vez, é uma só.\n const createdId = useRef<string | null>(null)\n\n async function pagarParcela(index: number) {\n // O QUE ESTÁ NA LINHA AGORA, não o que estava quando a tela carregou.\n //\n // Trocar a forma e clicar em pagar sem salvar abriria o diálogo com a forma\n // de antes — a tela mostrando uma coisa e o diálogo propondo outra. A\n // escolha do rascunho vence; o salvar a persiste no seu tempo.\n const comFonte = (mov: FinancialMovement): FinancialMovement => ({\n ...mov,\n metadata: { ...(mov.metadata ?? {}), ...sourceMeta(installments[index]!) },\n })\n const saved = savedMovements[index]\n if (saved) { setPayingMovement(comFonte(saved)); return }\n const id = await handleSave({ stay: true })\n if (!id) return\n // `invoiceId` é OBRIGATÓRIO aqui: as parcelas moram em\n // `plg_financial_invoice_installments`, e só a consulta que nomeia a fatura\n // lê de lá — `plg_financial_movements` não tem linha nenhuma até alguém\n // pagar. Sem ele a busca voltava vazia SEMPRE, e a conta ficava criada com\n // um \"não foi possível salvar\" na tela.\n const movements = await provider.getMovements({ direction, invoiceId: id })\n const bill = movements.data.find((m) => (\n m.movementKind === 'bill' && (m.installmentNumber ?? 1) === index + 1\n ))\n if (!bill) {\n // Gravou e não achou a parcela: a conta EXISTE. Ficar no rascunho é o que\n // produz a segunda cópia — vai para ela, e quem quiser pagar paga lá.\n onSaved?.(id)\n return\n }\n setPayingNewId(id)\n setPayingMovement(comFonte(bill))\n }\n\n const fields = {\n contactName,\n contactId,\n priceTableId,\n unitId,\n invoiceDate,\n fiscalNumber,\n observations,\n tags,\n items: items.map(({ _id, ...rest }) => rest),\n installments: installments.map(({ _id, ...rest }) => rest),\n }\n const snapshot = useRef<string | null>(null)\n useEffect(() => {\n if (loaded && snapshot.current === null) snapshot.current = JSON.stringify(fields)\n }, [loaded])\n const dirty = snapshot.current !== null && JSON.stringify(fields) !== snapshot.current\n useSaveBar({\n dirty,\n // Criar ou editar: a barra é o caminho de salvar, e sumir porque nada mudou\n // ainda deixa a tela sem botão. Ela some quando o formulário fecha.\n //\n // EMBUTIDO é o contrário: o modal já tem o próprio fechar, então a barra não\n // é o único caminho de saída — e «Alterações não salvas» sobre um formulário\n // que ninguém tocou é uma mentira que ensina a ignorar o aviso. Ali ela\n // aparece quando há o que salvar.\n alwaysVisible: !embedded,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onSaved?.(),\n saveLabel: t('financial.invoiceForm.save'),\n })\n\n // A migalha já diz de que lista viemos (\"← Mensalidades\"); repetir o nome da\n // lista como título escrevia \"Mensalidades / Mensalidades\".\n const title = isEdit ? t('financial.invoiceForm.editTitle') : t('financial.invoiceForm.newTitle')\n const subtitle = isEdit ? t('financial.invoiceForm.editing') : t('financial.invoiceForm.creating')\n\n // `() => onSaved()`, não `onSaved`: a migalha é um onClick, e o React entrega\n // o evento como primeiro argumento — `onSaved(PointerEvent)` caía no ramo do\n // id e mandava para `payables-detail:[object PointerEvent]`, rota que não\n // casa e desemboca no painel do Financeiro. Voltar é sair sem id.\n if (loading) return <OrderFormSkeleton parentLabel={embedded ? undefined : (direction === 'debit' ? t('financial.nav.payables') : t('financial.nav.receivables'))} onBack={embedded ? undefined : () => onSaved?.()} />\n\n const money = (v: number) => formatCurrency(v, currency)\n\n const actions = isEdit ? (\n <div className=\"flex items-center gap-2\">\n <WidgetSlot zone={FINANCIAL_INVOICE_ZONES.headerActions} invoiceId={editId} direction={direction} cancelled={cancelled} />\n <div className=\"relative\" ref={menuRef}>\n <Button variant=\"outline\" size=\"icon\" onClick={() => setMenuOpen(!menuOpen)} aria-label=\"More actions\">\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n {menuOpen && (\n <div className=\"fayz-glass-surface absolute right-0 top-full z-20 mt-1 w-44 rounded-lg border bg-popover py-1 shadow-md\" style={{ animation: 'field-slide-in 150ms ease-out' }}>\n <Button variant=\"bare\" size=\"bare\"\n onClick={() => { void openCancelDialog(); setMenuOpen(false) }}\n className=\"font-normal whitespace-normal justify-start flex w-full items-center gap-2 px-3 py-2 text-xs text-destructive transition-colors hover:bg-destructive/10\"\n >\n <Ban className=\"h-3.5 w-3.5\" /> Cancelar\n </Button>\n </div>\n )}\n </div>\n </div>\n ) : null\n\n // Nada pago ainda? O cronograma inteiro ainda pode ser refeito. Depois do\n // primeiro pagamento não: regenerar reescreveria parcelas que já têm dinheiro\n // em cima, e o histórico deixaria de bater com o extrato.\n const paidSoFar = savedMovements.reduce((sum, m) => sum + (m.paidAmount ?? 0), 0)\n const hasPayments = paidSoFar > 0\n\n // Uma conta que ninguém pagou ainda é um RASCUNHO com número: errar a data ou\n // o parcelamento no cadastro não pode custar cancelar o título e reemitir.\n // Numa fatura já gravada trocar o cronograma pede a porta do banco que faz o\n // apaga-e-reinsere numa transação (098) — sem ela, a edição continua só\n // mexendo no vencimento linha a linha.\n // The reschedule door rewrites installments by number and would write over a\n // cancelled one, so a schedule that carries one keeps its shape.\n const canReschedule = !hasPayments && !hasCancelledInstallments && (!isEdit || !!provider.rescheduleInvoice)\n\n // Os ITENS pela mesma regra (099): errar um dígito no cadastro não pode\n // custar cancelar a conta e lançar outra. Numa fatura já gravada precisa da\n // porta que troca as linhas e o total juntos — sem ela, editar aqui só\n // mudaria a tela.\n const canEditItems = !hasPayments && !hasCancelledInstallments && (!isEdit || !!provider.replaceInvoiceItems)\n\n // O cronograma: UMA linha por parcela, na coluna larga e logo abaixo dos itens\n // — a mesma anatomia do detalhe da fatura (número, valor, situação, vencimento,\n // e os gestos da linha encostados à direita). Criar, editar e ler uma fatura\n // passam a ser a mesma tela em três estágios, como já são pedido e orçamento.\n //\n // Ele morava no trilho estreito, e lá cada parcela virava um cartão de três\n // andares: a data ocupando uma linha inteira e, embaixo, um retângulo tracejado\n // só para dizer \"anexar recibo\". Numa fatura de 12x isso era uma coluna\n // altíssima para doze datas.\n // SEM AVISO ENQUANTO NADA FOI PAGO.\n //\n // A tarja existia para explicar o que estava travado; com 098 e 099 nada\n // está — valor, itens, data e parcelamento se corrigem. Uma tarja amarela em\n // toda abertura de uma conta perfeitamente editável é ruído, e ruído ensina a\n // ignorar tarjas amarelas. Depois do primeiro pagamento ela volta, porque aí\n // há de fato o que avisar.\n const scheduleSection = (\n // Tour anchor: the guided setup points here for the installment schedule.\n <div {...tourAnchor('financial.installments')}>\n <OrderFormBlock title={t('financial.invoice.paymentSchedule')}>\n <div className=\"space-y-3\">\n {hasPayments ? (\n <p className=\"text-xs text-muted-foreground\">{t('financial.invoiceForm.scheduleLocked')}</p>\n ) : hasCancelledInstallments ? (\n <p className=\"text-xs text-muted-foreground\">{t('financial.invoiceForm.scheduleHasCancelled')}</p>\n ) : !canReschedule ? null : (\n // Atalhos de parcelamento — 1x, 2x, 3x, 6x, 12x cobrem quase tudo.\n <div className=\"flex flex-wrap gap-1.5\">\n {[1, 2, 3, 6, 12].map((n) => (\n <Button variant=\"bare\" size=\"bare\"\n key={n}\n type=\"button\"\n onClick={() => generateInstallments(n)}\n disabled={totalAmount <= 0}\n className={`rounded-full px-2.5 py-1 text-[10px] font-medium transition-colors disabled:opacity-30 ${\n installments.length === n ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n >\n {n}x\n </Button>\n ))}\n </div>\n )}\n\n {/* A mesma frase do V1, e pelo mesmo motivo: sem ela a pessoa procura\n forma e conta no cabeçalho do bloco, onde elas não estão. */}\n {installments.length > 0 && (\n <p className=\"text-[11px] text-muted-foreground\">{t('financial.invoiceForm.scheduleSourceHint')}</p>\n )}\n\n {installments.length === 0 ? (\n <p className=\"py-4 text-center text-xs text-muted-foreground\">\n {totalAmount <= 0 ? t('financial.invoiceForm.addItemsFirst') : t('financial.invoiceForm.selectInstallments')}\n </p>\n ) : (\n <div className=\"divide-y rounded border\">\n {installments.map((inst, i) => {\n const patch = (next: Partial<FormInstallment>) => {\n const updated = [...installments]\n updated[i] = { ...inst, ...next }\n setInstallments(updated)\n }\n // Pareado por posição: as parcelas salvas foram carregadas nesta\n // ordem. Uma linha além do que existe no banco é parcela nova —\n // ainda sem movimento, e por isso sem botão de pagar.\n const saved = savedMovements[i]\n const isPaid = saved?.status === 'paid'\n const isPartial = saved?.status === 'partial'\n const lockedAmounts = installments.map((_, n) => {\n const st = savedMovements[n]?.status\n return st === 'paid' || st === 'partial' || st === 'cancelled'\n })\n const changeAmount = (value: number) => {\n const next = rebalanceInstallments({\n amounts: installments.map((x) => x.amount),\n index: i,\n value,\n total: scheduleTotal,\n locked: lockedAmounts,\n pinned: installments.map((x) => pinnedAmounts.has(x._id)),\n })\n if (next) {\n setPinnedAmounts((prev) => new Set(prev).add(inst._id))\n setInstallments(installments.map((x, n) => ({ ...x, amount: next[n]! })))\n return\n }\n // The only open installment: paying less now leaves the rest\n // owed, so the remainder becomes the next installment.\n const rest = Math.round((inst.amount - value) * 100) / 100\n if (installments.length !== 1 || value <= 0 || rest <= 0) return\n const due = new Date(`${inst.dueDate}T12:00:00`)\n due.setMonth(due.getMonth() + 1)\n setPinnedAmounts((prev) => new Set(prev).add(inst._id))\n setInstallments([\n { ...inst, amount: value },\n { _id: fid(), amount: rest, dueDate: due.toISOString().slice(0, 10) },\n ])\n }\n const canChangeAmount = canReschedule && !lockedAmounts[i]\n && (installments.length === 1 || installments.some((_, n) => n !== i && !lockedAmounts[n]))\n // Recibo é propriedade da PARCELA: no cadastro ele fica no rascunho\n // e quita ao salvar; na fatura existente ele abre o pagamento da\n // parcela salva. Numa parcela já paga não há o que provar.\n const canAttach = isEdit ? !!saved && !isPaid : true\n // Parcela zerada não tem por onde sair; parcela já liquidada tem,\n // e é história — nos dois casos a escolha vira texto, não campo.\n const semFonte = Math.abs(inst.amount) < 0.005 && !isPaid && !isPartial\n const fonteTravada = isPaid || isPartial\n const formaEscolhida = paymentMethodTypes.find((tp) => tp.id === inst.payMethodTypeId)\n const contaEscolhida = bankAccounts.find((a) => a.id === inst.payAccountId)\n return (\n <div key={inst._id}>\n <InstallmentRow\n number={i + 1}\n amount={money(inst.amount)}\n amountValue={inst.amount}\n onAmountChange={canChangeAmount ? changeAmount : undefined}\n status={saved?.status}\n dueDate={inst.dueDate}\n onDueDateChange={!hasPayments ? (v) => patch({ dueDate: v }) : undefined}\n source={semFonte ? (\n // A zero-value line (gift, 100% discount) has no method to ask for.\n <span className=\"text-xs text-muted-foreground\">—</span>\n ) : fonteTravada ? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {[formaEscolhida?.name, contaEscolhida?.name].filter(Boolean).join(' · ')}\n </span>\n ) : (\n <InstallmentSourceFields\n direction={direction}\n value={{ payMethodTypeId: inst.payMethodTypeId, payAccountId: inst.payAccountId }}\n onChange={(next) => patch(next)}\n />\n )}\n actions={<>\n {(canAttach || isEdit) && (\n <InstallmentReceiptButton\n attached={!!inst.receiptUrl || (isEdit && attachmentCount > 0)}\n count={isEdit ? attachmentCount : undefined}\n pending={!inst.receiptUrl && !!pendingReceipt}\n title={!inst.receiptUrl && pendingReceipt\n ? t('financial.receipt.attachRead')\n : t('financial.quickTx.receiptCapture')}\n onClick={() => {\n // A saved invoice keeps its files on the invoice — same modal as the detail view.\n if (isEdit && editId) { setAttachmentsOpen(true); return }\n // The assistant's photo is already in hand: attach it instead of asking for the same paper again.\n if (!inst.receiptUrl && pendingReceipt) {\n patch({ receiptUrl: pendingReceipt })\n setPendingReceipt(undefined)\n return\n }\n setReceiptTarget(i); receiptPicker.open()\n }}\n />\n )}\n {/* Shown without `saved` too: `pagarParcela` saves the invoice before charging. */}\n {!isPaid && (saved || (!isEdit && !!contactId && items.length > 0 && inst.amount > 0)) && (\n <InstallmentPayButton\n disabled={saving}\n onClick={() => { void pagarParcela(i) }}\n >\n {t(direction === 'credit' ? 'financial.invoice.receive' : 'financial.invoice.pay')}\n </InstallmentPayButton>\n )}\n </>}\n />\n\n {/* Anexou no cadastro: a parcela já nasce quitada, e quitar exige\n dizer por onde o dinheiro saiu. Estes dois campos só existem\n depois da foto — antes dela não há pagamento nenhum. */}\n {!isEdit && inst.receiptUrl && (\n <div className=\"flex flex-wrap items-center gap-2 border-t bg-muted/20 px-3 py-2\">\n <img\n src={inst.receiptUrl}\n alt={t('financial.quickTx.receipt')}\n className=\"h-8 w-8 shrink-0 rounded border object-cover\"\n />\n {/* Forma e conta saíram daqui: elas agora moram na LINHA,\n para toda parcela, não só para a que trouxe foto. Dois\n pares de seletores para a mesma pergunta eram duas\n respostas possíveis na mesma parcela. O que falta, se\n faltar, o salvar cobra (`paidNeedsMethod`). */}\n <span className=\"min-w-0 flex-1 truncate text-[10px] font-medium text-success\">\n {t('financial.invoiceForm.willBePaid')}\n </span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => patch({ receiptUrl: undefined, payMethodTypeId: undefined, payAccountId: undefined })}\n aria-label={t('financial.quickTx.receiptRemove')}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n {pendingDocs.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {pendingDocs.map((file, idx) => (\n <span key={`${file.name}-${idx}`} className=\"inline-flex max-w-full items-center gap-1.5 rounded-md border bg-muted/30 px-2 py-1 text-xs\">\n <FileText className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">· {t('financial.invoiceForm.attachOnSave')}</span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setPendingDocs((prev) => prev.filter((_, j) => j !== idx))}\n aria-label={t('financial.quickTx.receiptRemove')}\n className=\"font-normal flex h-5 w-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </span>\n ))}\n </div>\n )}\n </div>\n </OrderFormBlock>\n </div>\n )\n\n // The counterparty precedes items because it establishes their accounting context.\n const contactSection = (\n <div {...tourAnchor('financial.contact')}>\n <OrderFormBlock title={direction === 'debit' ? t('financial.invoiceForm.payTo') : t('financial.invoiceForm.receiveFrom')}>\n <FinancialCounterpartySearchSelect\n required\n // TRAVADO PELO DINHEIRO, não pela edição.\n //\n // `disabled={isEdit}` fechava o campo no instante em que a conta era\n // gravada, e a única correção para o fornecedor errado era cancelar a\n // conta e lançar outra — um documento cancelado no histórico para\n // consertar um clique. A trava de verdade é a do banco (110): depois\n // do primeiro centavo recebido a contraparte é história, e aí sim o\n // campo fecha.\n disabled={isEdit && hasPayments}\n lookup={contactLookup}\n value={contactId ?? ''}\n displayValue={contactName}\n onChange={(id, opt) => {\n setContactId(id || undefined)\n setContactName(opt?.label ?? '')\n setPendingContact(null)\n if (id && priceTables.length > 0) {\n // The option carries the lookup result; the person row is its `data`.\n const result = (opt?.data ?? {}) as { data?: { price_table_id?: string | null } }\n const next = initialPriceTableId(priceTables, result.data?.price_table_id)\n if (next !== priceTableId) void changePriceTable(next)\n }\n const request = ++accountingPolicyRequest.current\n if (!id) {\n setCounterpartyAccounting({ allowedAccountIds: [], limitAccounts: false, addItemsAutomatically: false })\n return\n }\n const policy = counterpartyAccountingPolicy(opt?.data)\n setCounterpartyAccounting({ allowedAccountIds: [], limitAccounts: policy.limitAccounts, addItemsAutomatically: policy.addItemsAutomatically })\n const refs = [policy.defaultAccountId, ...policy.allowedAccountIds].filter(Boolean) as string[]\n void (async () => {\n let resolvedRefs: Record<string, string> = {}\n try { resolvedRefs = await provider.resolveChartAccountRefs?.(refs) ?? {} } catch { /* direct UUIDs remain valid */ }\n if (request !== accountingPolicyRequest.current) return\n const resolved = resolveCounterpartyAccountingPolicy(policy, resolvedRefs)\n setCounterpartyAccounting(resolved)\n if (resolved.defaultAccountId) {\n setItems((current) => current.map((item) => item.accountId\n ? item\n : { ...item, accountId: resolved.defaultAccountId }))\n }\n if (resolved.defaultCostCenterId) {\n setItems((current) => current.map((item) => item.costCenterId\n ? item\n : { ...item, costCenterId: resolved.defaultCostCenterId }))\n }\n })()\n }}\n // Cadastrar o fornecedor aqui mesmo: quem chega com a nota na mão\n // descobre que ele não existe no meio do lançamento, e sair para\n // cadastrá-lo custa o documento inteiro.\n onCreate={contactCreate.onCreate}\n onEdit={contactCreate.onEdit}\n />\n {/* O recibo nomeou alguém que ainda não está cadastrado.\n Em vez de descartar o nome — o único dado que a tela perderia — ele\n fica à vista como rascunho, e o botão abre o MESMO cadastro que\n digitar o nome e clicar em adicionar abriria: o tipo e os campos que\n faltam são perguntados lá, não aqui. */}\n {pendingContact && !contactId && contactCreate.onCreate && (\n <div className=\"mt-2 flex flex-wrap items-center gap-2 rounded-lg border border-dashed border-border bg-muted/30 px-2.5 py-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n <span className=\"text-muted-foreground\">{t('financial.receipt.fromReceipt')}: </span>\n <span className=\"font-medium text-foreground\">{pendingContact}</span>\n </span>\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 shrink-0\"\n onClick={() => contactCreate.onCreate!(pendingContact)}>\n {t('financial.receipt.finishContact')}\n </Button>\n </div>\n )}\n {contactCreate.modal}\n </OrderFormBlock>\n </div>\n )\n\n // After the customer, because the customer usually answers it (their own table).\n const priceTableSection = direction === 'credit' && priceTables.length > 0 ? (\n <OrderFormBlock title={t('financial.invoiceForm.priceTable')}>\n <Select\n value={priceTableId ?? NO_PRICE_TABLE}\n onValueChange={(v: string) => { void changePriceTable(v === NO_PRICE_TABLE ? undefined : v) }}\n disabled={!canEditItems}\n >\n <SelectTrigger aria-label={t('financial.invoiceForm.priceTable')} data-testid=\"invoice-price-table\">\n <SelectValue placeholder={t('financial.invoiceForm.priceTableNone')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_PRICE_TABLE}>{t('financial.invoiceForm.priceTableNone')}</SelectItem>\n {priceTables.map((pt) => <SelectItem key={pt.id} value={pt.id}>{pt.name}</SelectItem>)}\n </SelectContent>\n </Select>\n {pickedTable && <p className=\"mt-1.5 text-xs text-muted-foreground\">{t('financial.invoiceForm.priceTableHint')}</p>}\n </OrderFormBlock>\n ) : null\n\n // The narrow rail holds supporting details, not item prerequisites.\n const sideSections = (\n <>\n <OrderFormBlock title={t('financial.invoice.details')}>\n <div className=\"space-y-3\">\n {showUnitField && <UnitField choices={unitChoices} value={unitId} onChange={setUnitId} />}\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.invoiceForm.date')}</label>\n {/* A competência de um título sem recebimento ainda se corrige; depois\n do primeiro centavo ela é extrato, e vira texto. */}\n {isEdit && hasPayments\n ? <p className=\"mt-1 px-1 py-2 text-sm\">{new Date(`${invoiceDate}T00:00:00`).toLocaleDateString()}</p>\n : <DatePicker value={invoiceDate} onChange={setInvoiceDate} className=\"mt-1\" />}\n </div>\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">{t('financial.invoiceForm.fiscalNumber')}</label>\n <Input\n type=\"text\"\n value={fiscalNumber}\n onChange={(e) => setFiscalNumber(e.target.value)}\n placeholder={t('financial.invoiceForm.fiscalNumber')}\n className=\"mt-1\"\n />\n </div>\n </div>\n </OrderFormBlock>\n\n <OrderFormBlock title={t('financial.invoiceForm.observations')}>\n <Textarea\n value={observations}\n onChange={(e) => setObservations(e.target.value)}\n placeholder={t('financial.invoiceForm.additionalNotes')}\n rows={2}\n className=\"resize-none\"\n />\n </OrderFormBlock>\n\n <OrderFormBlock title={t('financial.invoiceForm.tags')}>\n <TagsField value={tags} onChange={setTags} table=\"plg_financial_invoices\" />\n </OrderFormBlock>\n </>\n )\n\n return (\n <>\n {/* Enquanto ESTE rascunho está na tela, ele é a conta a pagar em curso —\n o assistente completa e salva por aqui em vez de escrever uma segunda\n conta por fora. Só no cadastro NOVO de uma despesa: editar uma fatura\n existente não é um rascunho, e a pessoa não pediu ajuda para isso. */}\n {!isEdit && direction === 'debit' && (\n <PayableDraftSurface\n config={config}\n draft={{\n describe: () => ({\n supplier: contactName || undefined,\n supplierResolved: !!contactId,\n description: items.map((i) => i.description).filter(Boolean).join(', ') || undefined,\n total: totalAmount,\n dueDate: installments[0]?.dueDate,\n itemCount: items.length,\n }),\n setSupplier: (name, id) => {\n setContactName(name)\n setContactId(id)\n setPendingContact(id ? null : name)\n },\n setDueDate: (iso) => setInstallments((prev) =>\n prev.map((inst, i) => (i === 0 ? { ...inst, dueDate: iso } : inst))),\n submit: async () => { await handleSave() },\n }}\n />\n )}\n {/* De qual cartão saiu — cor, últimos dígitos e a forma de pagamento.\n Quem tem quatro cartões reconhece o seu pela cor e pelo final, não\n pelo nome que digitou meses atrás; dizer isso aqui é o que evita a\n despesa conciliada contra o cartão errado no fim do mês. */}\n {fromCard && (\n <div className=\"mb-4 flex items-center gap-3 rounded-card border bg-card px-4 py-3\">\n {/* O mesmo cartãozinho da lista e do diálogo de pagamento: cor,\n bandeira e os quatro últimos. Um retângulo só de cor não diz qual\n cartão é numa carteira com quatro. Ver views/cardChip. */}\n <span aria-hidden className=\"shrink-0\">\n <CardVisual\n lastFour={cardLast4 || undefined}\n color={fromCard.color ?? undefined}\n brandId={fromCard.cardBrandId ?? undefined}\n />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">\n {fromCard.name}\n {cardLast4 && !nomeJaTemOsDigitos && (\n <span className=\"ml-2 tabular-nums text-muted-foreground\">•••• {cardLast4}</span>\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {cardMethodName\n ? `${t('financial.cards.expenseOnCard')} · ${cardMethodName}`\n : t('financial.cards.expenseOnCard')}\n </p>\n </div>\n </div>\n )}\n\n <OrderFormView\n embedded={embedded}\n title={title}\n subtitle={subtitle}\n parentLabel={embedded ? undefined : (direction === 'debit' ? t('financial.nav.payables') : t('financial.nav.receivables'))}\n onBack={embedded ? undefined : () => onSaved?.()}\n actions={actions}\n banner={isEdit ? (\n <>\n {hasPayments && (\n <p className=\"rounded-card border border-warning/40 bg-warning-soft px-4 py-2.5 text-xs text-warning-soft-foreground\">\n {t('financial.invoiceForm.issuedLocked')}\n </p>\n )}\n <WidgetSlot zone={FINANCIAL_INVOICE_ZONES.notices} invoiceId={editId} direction={direction} cancelled={cancelled}\n onChanged={() => setReloadTick((n) => n + 1)} />\n </>\n ) : undefined}\n sideSections={sideSections}\n >\n {contactSection}\n {priceTableSection}\n <OrderFormItemsCard\n data-tour=\"financial.items\"\n label={t('financial.invoiceForm.items')}\n addLabel={t('financial.invoiceForm.addItem')}\n headerExtra={!isEdit && currencyChoices.length > 1 ? (\n <SegmentedControl\n size=\"md\"\n aria-label={t('financial.invoiceForm.currency')}\n options={currencyChoices}\n value={currency.code}\n onChange={setDocumentCurrency}\n />\n ) : undefined}\n onAdd={canEditItems ? startAddItem : undefined}\n addDisabled={!contactId}\n addDisabledHint={t('financial.invoiceForm.selectContactFirst')}\n count={items.length}\n countLabel={t('financial.invoiceForm.itemCount', { count: items.length, plural: items.length !== 1 ? 's' : '' })}\n totalLabel={t('financial.invoiceForm.total')}\n total={money(totalAmount)}\n emptyLabel={contactId ? t('financial.invoiceForm.noItems') : t('financial.invoiceForm.selectContactFirst')}\n emptyActionLabel={t('financial.invoiceForm.addFirstItem')}\n header={addingItem && (\n <OrderFormAddItemStep\n itemTypes={itemTypes}\n onSelect={addItemOfKind}\n onCancel={() => setAddingItem(false)}\n label={t('financial.invoiceForm.selectItemType')}\n cancelLabel={t('financial.invoiceForm.cancel')}\n />\n )}\n >\n {items.map((item, i) => (\n <OrderFormItemRow\n key={item._id}\n index={i}\n itemKind={item.itemKind}\n description={item.description}\n quantity={item.quantity}\n unitPrice={item.unitPrice}\n discount={item.discount}\n surcharge={item.surcharge}\n referenceId={item.referenceId}\n icon={ITEM_ICONS[item.itemKind] ?? ITEM_ICONS.other}\n imageUrl={item.itemKind === 'product' && item.referenceId ? pictures[item.referenceId] : undefined}\n note={stockNotes.has(item._id) ? <StockEntryNote entries={stockNotes.get(item._id)} /> : undefined}\n itemTypes={itemTypes}\n currency={currency}\n formatMoney={money}\n expanded={expandedItemId === item._id}\n readOnly={!canEditItems}\n onToggle={() => setExpandedItemId(expandedItemId === item._id ? null : item._id)}\n onChange={(patch) => { void applyItemPatch(item, patch as Partial<FormItem>) }}\n onRemove={() => { removeItem(item._id); if (expandedItemId === item._id) setExpandedItemId(null) }}\n extraFieldGroups={[\n ...(postable.length > 0 ? [{\n id: 'account',\n label: t('financial.invoiceForm.account'),\n filled: !!item.accountId,\n // O plano de contas na linha fechada: classificar deixa de\n // ser trabalho invisível. Ver OrderFormExtraFieldGroup.summary.\n summary: postable.find((a) => a.id === item.accountId)?.name,\n onClear: () => updateItem(item._id, { accountId: undefined } as Partial<FormItem>),\n field: (\n // Busca, não <select>: um plano de contas real tem dezenas\n // ou centenas de folhas, e a lista nativa obriga a rolar\n // atrás de um código que a pessoa já sabe de cor.\n <SearchSelect\n label={t('financial.invoiceForm.account')}\n value={item.accountId}\n displayValue={postable.find((a) => a.id === item.accountId)?.name}\n placeholder={t('financial.invoiceForm.accountNone')}\n minChars={0}\n noResultsLabel={t('financial.invoiceForm.accountNone')}\n onSearch={(q) => filterByCodeOrName(selectableAccounts, q).map((a) => ({\n id: a.id, label: accountLabel(a), subtitle: a.accountType ?? undefined,\n }))}\n onChange={(id) => updateItem(item._id, { accountId: id || undefined } as Partial<FormItem>)}\n onManage={canManageFinancial ? () => adminNavigateTo(CHART_OF_ACCOUNTS_ROUTE) : undefined}\n manageLabel={t('financial.invoiceForm.manageChart')}\n clearLabel={t('financial.invoiceForm.clear')}\n />\n ),\n }] : []),\n ...(costCenters.length > 0 ? [{\n id: 'costCenter',\n label: t('financial.invoiceForm.costCenter'),\n filled: !!item.costCenterId,\n onClear: () => updateItem(item._id, { costCenterId: undefined } as Partial<FormItem>),\n field: (\n <SearchSelect\n label={t('financial.invoiceForm.costCenter')}\n value={item.costCenterId}\n displayValue={costCenters.find((c) => c.id === item.costCenterId)?.name}\n placeholder={t('financial.invoiceForm.costCenterNone')}\n minChars={0}\n noResultsLabel={t('financial.invoiceForm.costCenterNone')}\n onSearch={(q) => filterByCodeOrName(costCenters, q).map((c) => ({\n id: c.id, label: c.code ? `${c.code} - ${c.name}` : c.name,\n }))}\n onChange={(id) => updateItem(item._id, { costCenterId: id || undefined } as Partial<FormItem>)}\n onManage={canManageFinancial ? () => adminNavigateTo(COST_CENTERS_ROUTE) : undefined}\n manageLabel={t('financial.invoiceForm.manageCostCenters')}\n clearLabel={t('financial.invoiceForm.clear')}\n />\n ),\n }] : []),\n ]}\n entityLookups={entityLookups}\n // Linha que vai se desdobrar (um pacote) pergunta SÓ qual: a\n // quantidade, o preço, o desconto e a classificação vêm dos\n // serviços que nascerem dela, e perguntá-los aqui é perguntar\n // cinco vezes sobre uma linha que vai sumir.\n pickOnly={Boolean(entityLookups[item.itemKind]?.expand) && !item.referenceId}\n showTypeSelector={hasItemLookups}\n allowSurcharge\n labels={{\n item: t('financial.invoiceForm.item'),\n description: t('financial.invoiceForm.description'),\n descriptionPlaceholder: t('financial.invoiceForm.itemDescription'),\n noDescription: t('financial.invoiceForm.noDescription'),\n qty: t('financial.invoiceForm.qty'),\n unitPrice: t('financial.invoiceForm.unitPrice'),\n discount: t('financial.invoiceForm.discount'),\n surcharge: t('financial.invoiceForm.surcharge'),\n adjustments: t('financial.invoiceForm.discountSurcharge'),\n removeAdjustments: t('financial.invoiceForm.removeAdjustments'),\n done: t('financial.invoiceForm.done'),\n edit: t('financial.invoiceForm.edit'),\n }}\n />\n ))}\n {cancelledLines.map((line) => (\n <div key={line.id} className=\"flex items-center gap-3 border-t py-2 pl-4 pr-11 text-muted-foreground\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm line-through\">{line.description}</p>\n <p className=\"truncate text-xs\">Cancelado{line.cancelReason ? ` — ${line.cancelReason}` : ''}</p>\n </div>\n <span className=\"shrink-0 text-xs tabular-nums line-through\">{line.quantity} × {money(line.unitPrice)}</span>\n <span className=\"w-24 shrink-0 text-right text-sm tabular-nums line-through\">{money(line.totalAmount)}</span>\n </div>\n ))}\n </OrderFormItemsCard>\n\n {scheduleSection}\n\n {isEdit && recordMeta && <RecordMetaFooter item={recordMeta} />}\n </OrderFormView>\n\n {receiptPicker.input}\n {attachmentsOpen && editId && (\n <InvoiceAttachmentsModal invoiceId={editId} onClose={() => setAttachmentsOpen(false)} onChanged={loadAttachmentCount} />\n )}\n\n {/* Pagar uma parcela sem sair da edição — o mesmo modal do detalhe, e o\n mesmo caminho quando a foto do comprovante é que abriu o diálogo. */}\n {payingMovement && (\n <CurrencyScope code={documentCurrency}><PaymentModal\n movement={payingMovement}\n receiptUrl={pendingReceipt}\n onClose={() => {\n setPayingMovement(null)\n setPendingReceipt(undefined)\n // Gravou para poder cobrar: o rascunho já é registro, e a tela vai\n // para ele — mesmo se o pagamento foi abandonado no diálogo.\n if (payingNewId) { const id = payingNewId; setPayingNewId(null); onSaved?.(id) }\n }}\n onPaid={() => {\n setPayingMovement(null)\n setPendingReceipt(undefined)\n if (payingNewId) { const id = payingNewId; setPayingNewId(null); onSaved?.(id); return }\n // Recarrega as parcelas: o que acabou de ser pago muda a situação da\n // linha E tranca o reparcelamento.\n void (async () => {\n if (!editId) return\n const movements = await provider.getMovements({ direction })\n setSavedMovements(\n movements.data\n .filter((m) => m.invoiceId === editId && m.movementKind === 'bill')\n .sort((a, b) => (a.installmentNumber ?? 0) - (b.installmentNumber ?? 0)),\n )\n onChanged?.()\n })()\n }}\n /></CurrencyScope>\n )}\n\n {cancelData && editId && (\n <CancelInvoiceDialog\n invoiceId={editId}\n counterpartyName={cancelData.name}\n totalAmount={cancelData.total}\n items={cancelData.items}\n onClose={() => setCancelData(null)}\n onCancelled={() => { setCancelData(null); onSaved?.() }}\n />\n )}\n\n <style>{`\n @keyframes field-slide-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n </>\n )\n}\n"]}
|