@fayz-ai/financial 0.1.6 → 0.1.8

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/supabase.ts"],"names":["lineTotal","page","pageSize","data","count","error"],"mappings":"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","file":"chunk-RI4IUJS4.js","sourcesContent":["import type { SupabaseClient } from '@supabase/supabase-js'\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { BankAccount, BankAccountType, BankCatalogEntry, CreateBankAccountInput } from '../domain/account'\nimport type { CardReceivable, CardTransaction } from '../domain/card'\nimport { sessionCashFlow, type CashSession, type CashSessionReview, type CashSessionSummary, type CloseCashSessionInput, type OpenCashSessionInput } from '../domain/cash-session'\nimport type { ChartOfAccountsNode, CostCenter } from '../domain/chart-of-accounts'\nimport type { ClientAccount, ClientAccountInvoice } from '../domain/client-account'\nimport type { CnabContext, CnabPayeeRecord, RecordCnabBatchInput, SaveCnabPayeeInput, SaveCompanyInput } from '../domain/cnab240'\nimport { ensureReferenceRates } from './fx-auto'\nimport {\n hasCriteriaValue,\n type CommissionApproveResult, type CommissionCatalogs, type CommissionEntry, type CommissionFunction, type CommissionGeneration,\n type CommissionGenerationResult, type CommissionPayRunResult, type CommissionQuery, type CommissionRule, type CommissionRuleInput,\n type GenerateCommissionsInput,\n} from '../domain/commission'\nimport type { GiftCard, GiftCardQuery, IssueGiftCardsInput } from '../domain/gift-card'\nimport type { GoalMonth, SaveGoalInput } from '../domain/goal'\nimport {\n cancellationReason, invoiceTotal, itemsDescription, lineTotal, summarizeInvoiceLines,\n type CancelInvoiceInput, type CreateInvoiceInput, type CreateInvoiceItemInput, type Invoice, type InvoiceAttachment,\n type InvoiceItem, type InvoiceQuery, type CancellationReason, type InvoiceStockEntry, type CancelInvoiceItemsInput,\n type CancelInvoiceItemsResult, type InstallmentChargeInput,\n} from '../domain/invoice'\nimport { round2 } from '../domain/money'\nimport {\n fromLedgerDirection, ledgerMethod, openAmount, paymentFee, toLedgerDirection,\n type FinancialMovement, type MovementQuery, type PayMovementInput,\n} from '../domain/movement'\nimport type { NotaFiscal, CreateNotaFiscalInput, NotaFiscalQuery } from '../domain/nota-fiscal'\nimport type { PaymentMethod, PaymentMethodType } from '../domain/payment-method'\nimport type { DateRange, PaginatedResult } from '../domain/query'\nimport {\n candidateScore, candidateTolerance, pageTotals, statementLegOf, statementLinesPage, transferForStatementLine,\n type ImportedStatementLine, type ReconcileLine, type ReconciliationCandidate, type ReconciliationTargetQuery,\n type ReconciliationTargetResult,\n} from '../domain/reconciliation'\nimport type { RecurringBill, RecurringBillDirection, SaveRecurringBillInput } from '../domain/recurring-bill'\nimport type { AgingRow, DreQuery, DreRow, FinancialPeriod, FinancialSummary, MarginRow, TrialBalanceRow } from '../domain/report'\nimport { buildStatement, emptyStatement, ledgerBalance, type StatementQuery, type StatementResult } from '../domain/statement'\nimport { matchStatementLines, scorePair, NAME_AMOUNT_TOLERANCE, type MovementContext } from '../domain/statement-match'\nimport { transferLegs, type CreateTransferInput, type TransferResult } from '../domain/transfer'\nimport { createIdempotencyKey } from './idempotency'\nimport type { FinancialDataProvider } from './provider'\nimport { runReconcileAsBill, runReconcileLink, type ReconcileCapableProvider } from './reconcile'\nimport { T } from './tables'\n\n/** Open Finance codes of investment movements and their yields. */\nconst INVESTMENT_CODES = ['INVESTMENTS', 'AUTOMATICINVESTMENT', 'PROCEEDSINTERESTSANDDIVIDENDS', 'MUTUALFUNDS', 'FIXEDINCOME']\n\n/**\n * The tenant an invoice's lines must carry: the invoice's own. The header is\n * written by an RPC that takes the tenant from the session, while the client's\n * idea of the active tenant can lag behind a workspace switch — and a line\n * stamped with another tenant is refused by RLS, leaving a bill with a total\n * and no lines.\n */\nfunction invoiceLinesPayload(\n items: Array<{ description?: string; quantity: number; unitPrice: number; discount?: number; metadata?: Record<string, unknown>; itemKind?: string; referenceId?: string }>,\n lineTotal: (i: any) => number,\n) {\n return items.map((item, i) => ({\n name: item.description,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: i,\n metadata: { ...item.metadata, itemKind: item.itemKind, referenceId: item.referenceId },\n }))\n}\n\nasync function invoiceTenantId(pub: any, invoiceId: string): Promise<string> {\n const { data, error } = await pub.from('plg_financial_invoices').select('tenant_id').eq('id', invoiceId).maybeSingle()\n if (error) throw error\n const tenant = (data as { tenant_id?: string } | null)?.tenant_id ?? getActiveTenantId()\n if (!tenant) throw new Error('Não foi possível identificar a conta desta fatura')\n return tenant\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction camelToSnake(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('_')) continue\n result[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)] = value\n }\n return result\n}\n\n// `core` and `pub` are the same client; the two names say whose table a call reads.\nfunction getClients(): { core: SupabaseClient; pub: SupabaseClient } {\n const supabase = getSupabaseClientOptional() as SupabaseClient | null\n if (!supabase) throw new Error('Supabase not initialized')\n return { core: supabase, pub: supabase }\n}\n\n/**\n * Anexa, nas linhas JA conciliadas, o nome de quem esta do outro lado.\n *\n * Em LOTE, e nao por linha: uma pagina tem 50 linhas e o V1 resolve as\n * contrapartes de uma vez so — cinquenta idas ao banco para pintar um rotulo\n * e o tipo de coisa que faz a tela parecer lenta sem nenhuma delas ser lenta.\n */\nasync function anexaContraparte(rows: ImportedStatementLine[]): Promise<void> {\n const ids = [...new Set(rows.map((r) => r.matchedMovementId).filter(Boolean))] as string[]\n if (ids.length === 0) return\n const { core, pub } = getClients()\n const { data: movs } = await pub.from(T.movements)\n .select('id, invoice_id, financial_invoice_id, notes')\n .in('id', ids)\n const porMovimento = new Map<string, string>()\n const faturaPorMovimento = new Map<string, string>()\n const faturas = new Map<string, string[]>()\n for (const m of (movs ?? []) as any[]) {\n const faturaId = m.financial_invoice_id ?? m.invoice_id\n if (faturaId) {\n faturaPorMovimento.set(m.id, faturaId)\n const lista = faturas.get(faturaId) ?? []\n lista.push(m.id)\n faturas.set(faturaId, lista)\n } else if (m.notes) {\n porMovimento.set(m.id, m.notes)\n }\n }\n if (faturas.size > 0) {\n const { data: orders } = await core.from('orders')\n .select('id, metadata')\n .in('id', [...faturas.keys()])\n for (const o of (orders ?? []) as any[]) {\n const nome = (o.metadata as any)?.contactName\n if (!nome) continue\n for (const movId of faturas.get(o.id) ?? []) porMovimento.set(movId, nome)\n }\n }\n for (const linha of rows) {\n if (linha.matchedMovementId) {\n linha.matchedCounterpartyName = porMovimento.get(linha.matchedMovementId)\n linha.matchedInvoiceId = faturaPorMovimento.get(linha.matchedMovementId)\n }\n }\n}\n\nfunction toStatementLine(row: Record<string, any>): ImportedStatementLine {\n return {\n id: row.id,\n tenantId: row.tenant_id ?? undefined,\n unitId: row.unit_id ?? undefined,\n bankAccountId: row.bank_account_id ?? undefined,\n externalId: row.external_id,\n externalSource: row.external_source,\n date: row.posted_on,\n effectiveAt: row.effective_at ?? undefined,\n direction: row.direction,\n amount: Number(row.amount) || 0,\n balanceAfter: row.balance_after == null ? undefined : Number(row.balance_after),\n description: row.description ?? '',\n counterpartyName: row.counterparty_name ?? undefined,\n counterpartyDocument: row.counterparty_document ?? undefined,\n document: row.document ?? undefined,\n code: row.code ?? undefined,\n category: row.category ?? undefined,\n transactionType: row.transaction_type ?? undefined,\n rawPayload: row.raw_payload ?? undefined,\n providerDeleted: row.provider_deleted ?? false,\n reconciledAt: row.reconciled_at ?? undefined,\n matchedMovementId: row.matched_movement_id ?? undefined,\n createdAt: row.created_at ?? undefined,\n updatedAt: row.updated_at ?? undefined,\n }\n}\n\nfunction mapRecurringBill(row: any, counterpartyName?: string | null): RecurringBill {\n const items = Array.isArray(row.items) ? row.items.map((item: any) => ({\n itemKind: item.itemKind ?? item.item_kind ?? (item.product_id ? 'product' : 'other'),\n referenceId: item.referenceId ?? item.reference_id ?? item.product_id ?? undefined,\n description: item.description ?? '',\n quantity: Number(item.quantity) || 1,\n unitPrice: Number(item.unitPrice ?? item.unit_price) || 0,\n discount: Number(item.discount) || 0,\n surcharge: Number(item.surcharge ?? item.addition) || 0,\n accountId: item.accountId ?? item.account_id ?? item.chart_account_id ?? undefined,\n costCenterId: item.costCenterId ?? item.cost_center_id ?? undefined,\n })) : []\n return {\n id: row.id,\n direction: row.direction,\n description: row.description,\n counterpartyPersonId: row.counterparty_person_id,\n counterpartyName,\n amount: Number(row.amount) || 0,\n items,\n unitId: row.unit_id,\n chartAccountId: row.chart_account_id,\n costCenterId: row.cost_center_id,\n frequency: row.frequency,\n dueDay: Number(row.due_day) || 1,\n startsOn: row.starts_on,\n endsOn: row.ends_on,\n isActive: Boolean(row.is_active),\n notes: row.notes,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/**\n * Contas cujas LINHAS batem com o plano de contas / centro de custo pedidos.\n *\n * Lê a coluna (plg_financial_invoice_items), não o metadata: a classificação\n * saiu do JSONB quando a conta deixou de ser uma order. Quem tem dado antigo\n * no metadata cai no segundo braço.\n */\n/**\n * The OR groups of the invoice-line list, as ONE PostgREST `or` value.\n *\n * PostgREST keeps only one `or=` parameter per request, silently, so every\n * group must be ANDed inside a single one: `or=(and(or(A,B),or(C,D)))`. One\n * group stays flat (`A,B`), which is what the list sent before groups nested.\n */\nexport function invoiceLineOrFilter(groups: string[][]): string | undefined {\n const active = groups.filter((g) => g.length > 0)\n if (active.length === 0) return undefined\n if (active.length === 1) return active[0]!.join(',')\n return `and(${active.map((g) => `or(${g.join(',')})`).join(',')})`\n}\n\nasync function findInvoiceIdsByLineAccounting(\n core: any,\n pub: any,\n filters: { accountId?: string; costCenterId?: string },\n): Promise<string[] | undefined> {\n if (!filters.accountId && !filters.costCenterId) return undefined\n\n let sideQ = pub.from(T.invoiceItems).select('item_id')\n if (filters.accountId) sideQ = sideQ.eq('chart_account_id', filters.accountId)\n if (filters.costCenterId) sideQ = sideQ.eq('cost_center_id', filters.costCenterId)\n const { data: sideRows } = await sideQ\n const itemIds = (sideRows ?? []).map((r: any) => r.item_id).filter(Boolean)\n\n let legacyQ = core.from('items').select('id')\n if (filters.accountId) legacyQ = legacyQ.filter('metadata->>accountId', 'eq', filters.accountId)\n if (filters.costCenterId) legacyQ = legacyQ.filter('metadata->>costCenterId', 'eq', filters.costCenterId)\n const { data: legacyRows } = await legacyQ\n for (const r of (legacyRows ?? []) as any[]) if (r.id) itemIds.push(r.id)\n\n if (itemIds.length === 0) return []\n const { data: items } = await core.from('items').select('invoice_id').in('id', Array.from(new Set(itemIds)))\n const ids = (items ?? []).map((r: any) => r.invoice_id).filter((v: any) => typeof v === 'string' && v)\n return Array.from(new Set(ids))\n}\n\n/** Card/MDR fee percent for a configured payment method (0 when none / not a fee method). */\n/**\n * A contabilidade da linha em COLUNA, além do metadata.\n *\n * O metadata continua sendo escrito e continua sendo a fonte de leitura — nada\n * que existe hoje muda de lugar. O que este espelho acrescenta é o que um JSONB\n * não dá: FK para o plano de contas e para o centro de custo, índice, e um join\n * que um DRE consegue somar. `v_financial_invoice_lines` já espera esta tabela.\n *\n * Falhar aqui NÃO derruba o lançamento: a conta já está salva e legível pelo\n * metadata. Um pool sem a tabela (ou sem grant) perde o espelho, não o dinheiro.\n */\nasync function writeLineAccounting(\n pub: any,\n tenantId: string | null | undefined,\n insertedItems: Array<{ id: string; sort_order: number | null }> | null,\n inputItems: Array<{ accountId?: string; costCenterId?: string }>,\n): Promise<void> {\n if (!tenantId || !insertedItems?.length) return\n const rows = insertedItems\n .map((row) => {\n const src = inputItems[row.sort_order ?? -1]\n if (!src || (!src.accountId && !src.costCenterId)) return null\n return {\n item_id: row.id,\n parent_kind: 'invoice',\n tenant_id: tenantId,\n chart_account_id: src.accountId ?? null,\n cost_center_id: src.costCenterId ?? null,\n }\n })\n .filter(Boolean)\n if (rows.length === 0) return\n const { error } = await pub.from(T.invoiceItems).upsert(rows, { onConflict: 'item_id' })\n if (error) console.warn('[financial] line accounting mirror skipped:', error.message)\n}\n\n/**\n * Uma PARCELA no formato de movimento que as telas leem.\n *\n * `v_financial_installment_balances` fala installment_id / number / paid e\n * payable|receivable; a tela fala id / installmentNumber / paidAmount e\n * debit|credit. Um snakeToCamel comum acertava por coincidência de nome e\n * errava em todo o resto — e foi assim que um `id` inexistente virou 42703 na\n * hora de pagar.\n */\nfunction shiftIsoDate(value: string, days: number): string {\n const d = new Date(`${value}T00:00:00Z`)\n d.setUTCDate(d.getUTCDate() + days)\n return d.toISOString().slice(0, 10)\n}\n\n/** 0..1 — 70% amount closeness, 30% date closeness (within 30 days). */\nfunction matchScore(line: { amount: number; date: string }, m: FinancialMovement): number {\n const amount = Number(line.amount) || 0\n const amtDiff = Math.abs((Number(m.amount) || 0) - amount)\n const amtScore = amount > 0 ? Math.max(0, 1 - amtDiff / amount) : 0\n const refDate = m.dueDate ?? m.paymentDate\n const days = line.date && refDate\n ? Math.abs((new Date(line.date).getTime() - new Date(refDate).getTime()) / 86400000)\n : 30\n return round2(0.7 * amtScore + 0.3 * Math.max(0, 1 - days / 30))\n}\n\nfunction billRowToMovement(r: any): FinancialMovement {\n return {\n id: r.installment_id,\n invoiceId: r.invoice_id,\n direction: fromLedgerDirection(r.direction),\n movementKind: 'bill',\n amount: Number(r.amount) || 0,\n paidAmount: Number(r.paid) || 0,\n status: r.status,\n dueDate: r.due_date,\n installmentNumber: r.number,\n unitId: r.unit_id ?? undefined,\n metadata: r.metadata ?? undefined,\n tenantId: r.tenant_id,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n } as unknown as FinancialMovement\n}\n\n/**\n * Uma PARCELA no formato que a lista lê.\n *\n * `id` é a parcela porque é ela que a linha representa; `invoiceId` é o título\n * que o clique abre. Ver a migration 049 do plugin: por título a mesma tela\n * levava 7,5 s e somava parcelas de outros dias.\n */\n// The balance views predate the currency column and do not carry it, so the\n// documents on screen are asked for theirs in one read.\nasync function attachCurrency(pub: any, invoices: Invoice[]): Promise<void> {\n const ids = [...new Set(invoices.map((inv) => inv.invoiceId ?? inv.id).filter(Boolean))]\n if (ids.length === 0) return\n // Never the reason a bill fails to open: without it the house's currency is used.\n try {\n const { data, error } = await pub.from('plg_financial_invoices').select('id, currency').in('id', ids)\n if (error || !Array.isArray(data)) return\n const byId = new Map<string, string>(data.map((r: any) => [r.id, r.currency]))\n for (const inv of invoices) inv.currency = byId.get(inv.invoiceId ?? inv.id) ?? inv.currency\n } catch { /* keep the house's */ }\n}\n\n// A read of its own: on a pool that has not taken 130 yet the column is\n// missing, and that must not cost the bill its currency.\nasync function attachTags(pub: any, invoice: Invoice): Promise<void> {\n try {\n const { data, error } = await pub.from('plg_financial_invoices').select('tags').eq('id', invoice.id).maybeSingle()\n if (!error && Array.isArray(data?.tags)) invoice.tags = data.tags\n } catch { /* no tags */ }\n}\n\nfunction rowToInvoiceLine(r: any): Invoice {\n return {\n id: r.installment_id,\n invoiceId: r.invoice_id,\n direction: fromLedgerDirection(r.direction),\n invoiceDate: (r.competence_date ?? r.issue_date ?? '').slice(0, 10),\n dueDate: (r.due_date ?? '').slice(0, 10) || undefined,\n fiscalNumber: r.number ?? undefined,\n totalAmount: Number(r.amount) || 0,\n paidAmount: Number(r.paid) || 0,\n status: r.status === 'pending' ? 'open' : r.status,\n installmentNumber: Number(r.installment_number) || 1,\n totalInstallments: Number(r.installment_count) || 1,\n contactId: r.counterparty_person_id ?? undefined,\n contactName: r.counterparty_name ?? r.metadata?.contactName,\n observations: r.notes ?? undefined,\n itemsSummary: r.description ?? r.metadata?.itemsSummary,\n unitId: r.unit_id ?? undefined,\n metadata: r.metadata ?? undefined,\n tenantId: r.tenant_id,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n createdBy: r.created_by ?? undefined,\n } as Invoice\n}\n\n/** Uma linha de v_financial_invoice_balances no formato que as telas leem. */\nfunction rowToInvoice(r: any): Invoice {\n return {\n id: r.id,\n // O tipo do plugin fala débito/crédito; o banco fala pagar/receber.\n direction: fromLedgerDirection(r.direction),\n invoiceDate: (r.competence_date ?? r.issue_date ?? '').slice(0, 10),\n dueDate: (r.due_date ?? '').slice(0, 10) || undefined,\n fiscalNumber: r.number ?? undefined,\n totalAmount: Number(r.total) || 0,\n paidAmount: Number(r.paid) || 0,\n status: r.status,\n totalInstallments: Number(r.installment_count) || 1,\n contactId: r.counterparty_person_id ?? undefined,\n contactName: r.counterparty_name ?? r.metadata?.contactName,\n observations: r.notes ?? undefined,\n itemsSummary: r.description ?? r.metadata?.itemsSummary,\n unitId: r.unit_id ?? undefined,\n metadata: r.metadata ?? undefined,\n tenantId: r.tenant_id,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n createdBy: r.created_by ?? undefined,\n } as Invoice\n}\n\nasync function getMethodFeePct(pub: any, paymentMethodId?: string): Promise<number> {\n if (!paymentMethodId) return 0\n const { data, error } = await pub.from(T.paymentMethods).select('discount_value').eq('id', paymentMethodId).single()\n if (error) throw error\n return Number(data?.discount_value) || 0\n}\n\n/** Generate a correlation id; falls back when crypto.randomUUID is unavailable. */\nfunction genId(): string {\n try {\n if (typeof crypto !== 'undefined' && (crypto as any).randomUUID) return (crypto as any).randomUUID()\n } catch { /* noop */ }\n return 'tr-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 10)\n}\n\nexport function createSupabaseFinancialProvider(): FinancialDataProvider {\n // --- Conciliação: as peças que o executor compartilhado precisa ---\n //\n // A regra de conciliar mora em `lib/reconcile`, fora dos dois providers: ela\n // é a mesma aqui e no mock, e escrevê-la duas vezes é como um dos dois passa\n // a mentir. Aqui ficam só as três coisas que são DESTE provider: ler a\n // linha, marcar a linha, e emprestar as primitivas.\n\n async function readStatementLine(id: string): Promise<ReconcileLine> {\n const { pub } = getClients()\n const { data } = await pub.from(T.statementLines).select('*').eq('id', id).single()\n if (!data) throw new Error('Linha do extrato não encontrada')\n return {\n id: data.id,\n amount: Number(data.amount) || 0,\n // `posted_on` é a coluna; `date` é o nome que o domínio usa.\n date: data.posted_on,\n direction: data.direction,\n description: data.description ?? undefined,\n bankAccountId: data.bank_account_id ?? undefined,\n externalSource: data.external_source,\n }\n }\n\n // Open bills live in installments, not in plg_financial_movements (that table\n // only gets a row once someone pays) — so a search over movements alone can\n // never offer the open payable the line is settling.\n async function searchBillTargets(\n line: ReconcileLine,\n query: ReconciliationTargetQuery,\n ): Promise<ReconciliationTargetResult> {\n const { pub } = getClients()\n const pageSize = query.pageSize ?? 50\n const page = query.page ?? 1\n let qb = pub.from('v_financial_invoice_lines_due')\n .select('installment_id,invoice_id,direction,number,due_date,description,counterparty_name,installment_number,installment_count,amount,paid,status')\n .eq('direction', line.direction === 'debit' ? 'payable' : 'receivable')\n const status = query.status ?? 'all'\n qb = status === 'open'\n ? qb.in('status', ['pending', 'partial', 'overdue'])\n : status === 'paid'\n ? qb.eq('status', 'paid')\n : qb.neq('status', 'cancelled')\n if (query.dueFrom) qb = qb.gte('due_date', query.dueFrom)\n if (query.dueTo) qb = qb.lte('due_date', query.dueTo)\n if (query.amountMin != null) qb = qb.gte('amount', query.amountMin)\n if (query.amountMax != null) qb = qb.lte('amount', query.amountMax)\n const termo = query.search?.trim().replace(/[,()*%]/g, ' ').replace(/\\s+/g, ' ')\n if (termo) {\n qb = qb.or(['description', 'number', 'counterparty_name'].map((c) => `${c}.ilike.%${termo}%`).join(','))\n }\n // One extra row tells whether a next page exists without a count(*).\n const { data, error } = await qb\n .order('due_date', { ascending: true })\n .range((page - 1) * pageSize, page * pageSize)\n if (error) throw error\n const rows = (data ?? []) as any[]\n const hasMore = rows.length > pageSize\n const visiveis = rows.slice(0, pageSize)\n\n // A paid bill is linked through its PAYMENT (the money that moved), and one\n // the bank already proved is not offered again.\n const pagas = visiveis.filter((r) => r.status === 'paid').map((r) => r.installment_id)\n const pagamentoDe = new Map<string, any>()\n if (pagas.length) {\n const { data: allocs } = await pub.from(T.allocations)\n .select('installment_id,payment_movement_id').in('installment_id', pagas)\n const ids = [...new Set(((allocs ?? []) as any[]).map((a) => a.payment_movement_id).filter(Boolean))]\n const { data: pays } = ids.length\n ? await pub.from(T.movements).select('*').in('id', ids)\n .neq('status', 'cancelled').is('reversed_by_id', null)\n : { data: [] }\n const byId = new Map(((pays ?? []) as any[]).map((p) => [p.id, p]))\n for (const a of (allocs ?? []) as any[]) {\n const p = byId.get(a.payment_movement_id)\n if (p) pagamentoDe.set(a.installment_id, p)\n }\n }\n\n const candidates: ReconciliationCandidate[] = []\n for (const r of visiveis) {\n const invoice = {\n id: r.invoice_id,\n contactName: r.counterparty_name ?? undefined,\n fiscalNumber: r.number ?? undefined,\n } as Invoice\n let movement: FinancialMovement\n if (r.status === 'paid') {\n const p = pagamentoDe.get(r.installment_id)\n if (!p || p.reconciled_at) continue\n movement = {\n ...(snakeToCamel(p) as unknown as FinancialMovement),\n invoiceId: r.invoice_id,\n settlesMovementId: r.installment_id,\n dueDate: r.due_date,\n notes: p.notes ?? r.description ?? undefined,\n }\n } else {\n movement = {\n id: r.installment_id,\n invoiceId: r.invoice_id,\n direction: line.direction,\n movementKind: 'bill',\n amount: Number(r.amount) || 0,\n paidAmount: Number(r.paid) || 0,\n status: r.status,\n dueDate: r.due_date,\n installmentNumber: r.installment_number ?? undefined,\n notes: r.description ?? undefined,\n } as unknown as FinancialMovement\n }\n // Name + amount + date, like the card's suggestion; a row only the filter\n // vouches for still shows, ranked below.\n const pareado = scorePair(\n { amount: line.amount, date: line.date, direction: line.direction, description: line.description ?? '' },\n movement,\n { contactName: r.counterparty_name ?? undefined },\n )\n candidates.push({\n movement, invoice, score: pareado > 0 ? pareado : round2(0.6 * matchScore(line, movement)),\n installmentCount: r.installment_count ?? undefined,\n })\n }\n candidates.sort((a, b) => b.score - a.score)\n return { data: candidates, hasMore }\n }\n\n /** O carimbo cru: a linha foi conciliada, e contra quem. Sem orquestração. */\n async function markReconciled(statementLineId: string, matchedMovementId?: string): Promise<void> {\n const { pub } = getClients()\n const now = new Date().toISOString()\n await pub.from(T.statementLines).update({\n reconciled_at: now,\n matched_movement_id: matchedMovementId ?? null,\n }).eq('id', statementLineId)\n if (matchedMovementId) {\n // O movimento nativo passa a estar provado pelo extrato.\n await pub.from(T.movements).update({ reconciled_at: now }).eq('id', matchedMovementId)\n }\n }\n\n // `reconcileMovement` do facade é o carimbo, nunca o método público: o\n // público reentraria em si mesmo e a conta seria quitada duas vezes.\n function reconcileFacade(): ReconcileCapableProvider {\n return {\n createInvoice: (input) => provider.createInvoice(input),\n getMovements: (query) => provider.getMovements(query as never),\n payMovement: (input) => provider.payMovement(input as never),\n reconcileMovement: ({ bankMovementId, matchedMovementId }) =>\n markReconciled(bankMovementId, matchedMovementId),\n addInstallmentCharge: (input) => provider.addInstallmentCharge!(input),\n }\n }\n\n const provider: FinancialDataProvider = {\n // --- Contas (plg_financial_invoices) ---\n // A conta NÃO é uma order: `orders_kind_guard` aposentou invoice_payable e\n // invoice_receivable, e o motivo está no HINT do próprio erro — ADR 0004,\n // \"orders is the Venda; money lives in the financial plugin\". Uma conta a\n // pagar não tem cliente, nem item vendido, nem entrega; era uma venda com o\n // sinal trocado. A leitura vem de v_financial_invoice_balances, que já traz\n // saldo e situação derivados das parcelas — e, ao contrário de\n // v_invoice_balances, não exige que a conta tenha nascido de uma venda.\n async getInvoices(query: InvoiceQuery): Promise<PaginatedResult<Invoice>> {\n const { core, pub } = getClients()\n // PARCELAS, não títulos — ver a migration 049 do plugin.\n //\n // A tela do V1 sempre listou parcelas, e as três queixas que a forma por\n // título produzia têm a mesma raiz: uma compra em 4× é uma linha aqui e\n // quatro lá. O estado (\"parcial\" onde o V1 escreve \"Pago\"), o recorte de\n // um dia (um título tem uma data, quatro parcelas têm quatro) e o preço\n // (7,5 s contra 0,15 s, porque a parcela filtra por um índice que já\n // existe).\n // As colunas que a LISTA desenha, e não `*`.\n //\n // Medido: 50 linhas com `*` são 70 KB, e `metadata` sozinho é 511 bytes\n // por linha — 36% do payload, para um campo que esta tela não lê. A\n // consulta levava 0,2 s no banco e 1,3 s no relógio da pessoa; a\n // diferença é rede, e rede se paga em bytes.\n const COLUNAS = [\n 'installment_id', 'invoice_id', 'tenant_id', 'unit_id', 'direction',\n 'number', 'competence_date', 'due_date', 'description',\n 'counterparty_person_id', 'counterparty_name',\n 'installment_number', 'installment_count',\n 'amount', 'paid', 'status', 'created_at', 'updated_at',\n ].join(',')\n let qb = pub.from('v_financial_invoice_lines_due').select(COLUNAS, { count: 'exact' })\n\n if (query.direction) qb = qb.eq('direction', toLedgerDirection(query.direction))\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n // A tela chama de `open` o que o banco chama de `pending`.\n qb = qb.in('status', statuses.map((st) => (st === 'open' ? 'pending' : st)))\n } else {\n // CANCELADA NÃO É FILA.\n //\n // Uma conta a pagar é uma FILA do que ainda tem de acontecer, e a\n // cancelada já não tem. Ela ficava na lista com o selo \"Cancelado\" e o\n // efeito prático era o pior possível: quem clica em excluir e vê a\n // linha continuar ali conclui que a exclusão falhou — e tenta de novo,\n // ou cria a linha certa ao lado da que achou que sumiu.\n //\n // Continua alcançável: quem pede o estado `cancelled` no filtro recebe\n // exatamente ele. O que muda é só o PADRÃO, que é o que a tela abre.\n qb = qb.neq('status', 'cancelled')\n }\n const scoped = await findInvoiceIdsByLineAccounting(core, pub, {\n accountId: query.accountId,\n costCenterId: query.costCenterId,\n })\n if (scoped) {\n if (scoped.length === 0) return { data: [], total: 0 }\n qb = qb.in('invoice_id', scoped)\n }\n if (query.contactId) qb = qb.eq('counterparty_person_id', query.contactId)\n // O NÚMERO DA NOTA É UM CAMPO SÓ DELE no recorte do V1, e por bom motivo:\n // procurar \"1234\" na busca livre traz toda conta cujo valor, descrição ou\n // observação contenha 1234. Aqui a pergunta é a coluna.\n if (query.fiscalNumber) qb = qb.ilike('number', `%${query.fiscalNumber}%`)\n // A conta de pagamento sai do MESMO lateral que soma as baixas (114), e\n // por isso é um `cs` sobre um array e não uma lista de ids montada aqui:\n // numa conta com anos de movimento essa lista chegaria antes da primeira\n // linha e não caberia na URL.\n if (query.bankAccountId) qb = qb.contains('payment_account_ids', [query.bankAccountId])\n // A contraparte entra na busca: a tela lista \"quem\" na coluna da\n // descrição, e procurar o fornecedor pelo nome não achava nada — o V1\n // tem um campo \"Pagar/Receber de\" só para isso, e aqui ele cabe no\n // campo que já existe em vez de virar mais um controle na barra.\n // ── UNIDADE e BUSCA disputam o MESMO parâmetro ────────────────────────\n //\n // UNIDADE NULA É DA CASA INTEIRA, não de nenhuma. O `eq` puro escondia\n // toda conta sem unidade — e elas existem aos montes: a recorrência\n // consolidada herda a unidade da régua, que numa casa de um endereço só\n // é nula. O sintoma foi exato: a previsão aparecia (a leitura dela já\n // tratava o nulo) e sumia ao virar conta. É a mesma leitura da RLS:\n // `unit_id IS NULL OR has_unit(...)`.\n //\n // Só que o PostgREST aceita UM `or` por consulta — dois viram dois\n // parâmetros `or=` na URL e ele fica com um deles, EM SILÊNCIO. Com\n // unidade e busca ao mesmo tempo, uma das duas simplesmente não valeria.\n //\n // Então as duas saem num `or` só, distribuído: (A ou B) e (C ou D) é\n // (A e C) ou (A e D) ou (B e C) ou (B e D). Feio de ler, e é a única\n // forma de as duas condições valerem de fato.\n const unidades = query.unitId ? ['unit_id.is.null', `unit_id.eq.${query.unitId}`] : []\n const buscas = query.search\n ? ['description', 'notes', 'number', 'counterparty_name'].map((col) => `${col}.ilike.%${query.search}%`)\n : []\n // Overdue before the window is the third OR group (see `includeOverdue`):\n // in the window, OR due earlier and still unpaid. The upper bound stays a\n // plain filter, so nothing due after the window comes back.\n const desde = query.dateRange?.from.slice(0, 10)\n const vencidas = desde && query.includeOverdue\n ? [`due_date.gte.${desde}`, `and(due_date.lt.${desde},status.in.(overdue,partial))`]\n : []\n const grupoOr = invoiceLineOrFilter([unidades, buscas, vencidas])\n if (grupoOr) qb = qb.or(grupoOr)\n // Por VENCIMENTO, como o V1 — e direto na coluna da parcela, que é\n // indexada (`tenant_id, due_date`). Sem vetor, sem janela, sem recuo.\n if (query.dateRange) {\n if (!vencidas.length) qb = qb.gte('due_date', desde)\n qb = qb.lte('due_date', query.dateRange.to.slice(0, 10))\n }\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1)\n // Crescente: uma lista de contas a pagar é uma FILA, e a primeira da fila\n // é a que vence antes. Decrescente põe o mais distante no topo.\n // `recent` is the dashboard's question (\"what was entered lately\"), not\n // the queue's: newest first, installments of one bill in due order.\n qb = query.sort === 'recent'\n ? qb.order('created_at', { ascending: false }).order('due_date', { ascending: true })\n : qb.order('due_date', { ascending: true })\n const { data, count, error } = await qb\n // Surface it: a swallowed error rendered as \"no invoices\" with no report.\n if (error) throw error\n const linhas = (data ?? []).map(rowToInvoiceLine)\n\n // O clipe, numa segunda pergunta.\n //\n // A contagem já morou dentro da view, num LATERAL sobre `documents`, e\n // levou a consulta da tela de 0,2 s para 3,8 s: `documents` é\n // security_invoker e a RLS dela roda uma vez por avaliação do laço.\n //\n // Aqui as cinquenta linhas já estão na mão, e \"quais destes títulos têm\n // anexo\" é UMA consulta pelo índice `documents_subject`. Se ela falhar, a\n // lista aparece sem clipe — nunca deixa de aparecer.\n const titulos = [...new Set(linhas.map((l: Invoice) => l.invoiceId).filter(Boolean))] as string[]\n if (titulos.length) {\n // A descrição do título pode ser uma nota de importação. A lista do V1\n // mostra o que está sendo comprado/vendido, então buscamos as linhas\n // reais apenas para os títulos desta página e deixamos a descrição como\n // fallback quando o documento não tem itens.\n const { data: itemRows } = await pub.from('v_financial_invoice_lines')\n .select('invoice_id,name,description,quantity')\n .in('invoice_id', titulos)\n const itemSummaries = summarizeInvoiceLines((itemRows ?? []) as any[])\n for (const line of linhas) {\n line.itemsSummary = itemSummaries.get(line.invoiceId ?? line.id) ?? line.itemsSummary\n }\n\n // The list is installment-grained, so its payment method must come from\n // that installment's allocation. Resolve only the visible page and keep\n // the newest active settlement when a bill was paid in parts.\n const installmentIds = linhas.map((line: Invoice) => line.id)\n const { data: allocations } = await pub.from(T.allocations)\n .select('installment_id,payment_movement_id,created_at')\n .in('installment_id', installmentIds)\n .order('created_at', { ascending: false })\n const movementIds = [...new Set(((allocations ?? []) as any[]).map((row) => row.payment_movement_id).filter(Boolean))]\n if (movementIds.length > 0) {\n const { data: paymentRows } = await pub.from(T.movements)\n .select('id,payment_method_id,payment_method_type_id,bank_account_id,card_installments,status,reversed_by_id')\n .in('id', movementIds)\n const paymentById = new Map(((paymentRows ?? []) as any[]).map((row) => [row.id, row]))\n const latestByInstallment = new Map<string, any>()\n for (const allocation of (allocations ?? []) as any[]) {\n if (latestByInstallment.has(allocation.installment_id)) continue\n const payment = paymentById.get(allocation.payment_movement_id)\n if (!payment || payment.status === 'cancelled' || payment.reversed_by_id) continue\n latestByInstallment.set(allocation.installment_id, payment)\n }\n for (const line of linhas) {\n const payment = latestByInstallment.get(line.id)\n if (!payment) continue\n line.paymentMethodId = payment.payment_method_id ?? undefined\n line.paymentMethodTypeId = payment.payment_method_type_id ?? undefined\n line.paymentAccountId = payment.bank_account_id ?? undefined\n line.paymentCardInstallments = Number(payment.card_installments) || undefined\n }\n }\n\n const { data: docs } = await pub.from('documents')\n .select('subject_id')\n .eq('subject_type', 'financial_invoice')\n .eq('is_active', true)\n .in('subject_id', titulos)\n const porTitulo = new Map<string, number>()\n for (const d of (docs ?? []) as any[]) {\n porTitulo.set(d.subject_id, (porTitulo.get(d.subject_id) ?? 0) + 1)\n }\n for (const l of linhas) {\n l.attachmentCount = porTitulo.get(l.invoiceId ?? l.id) ?? 0\n }\n }\n\n await attachCurrency(pub, linhas)\n return { data: linhas, total: count ?? 0 }\n },\n\n async getInvoiceById(id: string): Promise<Invoice | null> {\n const { pub } = getClients()\n const { data, error } = await pub.from('v_financial_invoice_balances').select('*').eq('id', id).maybeSingle()\n if (error) throw error\n if (!data) return null\n const invoice = rowToInvoice(data)\n await Promise.all([attachCurrency(pub, [invoice]), attachTags(pub, invoice)])\n return invoice\n },\n\n async getInvoiceItems(invoiceId: string): Promise<InvoiceItem[]> {\n const { pub } = getClients()\n // `v_financial_invoice_lines`, e NÃO `items.invoice_id`.\n //\n // O CHECK `items_one_parent` exige que o item tenha exatamente UM pai —\n // `order_id` XOR `invoice_id` XOR … — e o item que nasce numa venda tem\n // `order_id`. Perguntar por `invoice_id` devolve zero linha para tudo que\n // veio pelo pedido, que é todo o porte do V1 e toda conta levantada a\n // partir de uma venda. A tela abria dizendo \"0 itens\" numa conta que tem\n // dezessete.\n //\n // A view é a resposta porque ela é o UNION dos dois caminhos — foi\n // exatamente para isso que a migration 032 do plugin a escreveu, depois\n // de o DRE dar zero pela mesma razão. Ela também já traz a classificação\n // (`chart_account_id`, `cost_center_id`), então a consulta lateral em\n // `plg_financial_invoice_items` deixa de ser necessária.\n const { data, error } = await pub.from('v_financial_invoice_lines')\n .select('*').eq('invoice_id', invoiceId)\n if (error) throw error\n const rows = (data ?? []) as any[]\n\n // The picture of each line's product, in one read. A line with no\n // product, or a product with no picture, keeps the icon of its kind.\n // The view names the column `item_metadata`; a catalog pick made on this\n // screen lives there, not in `product_id`.\n const metaOf = (r: any) => (r.item_metadata ?? r.metadata ?? {}) as Record<string, any>\n const productOf = (r: any): string | undefined =>\n r.product_id ?? (metaOf(r).itemKind === 'product' ? metaOf(r).referenceId : undefined)\n const productIds = [...new Set(rows.map(productOf).filter(Boolean))] as string[]\n const pictures = new Map<string, string>()\n if (productIds.length > 0) {\n try {\n const found = await pub.from('products').select('id, image_url').in('id', productIds)\n for (const p of (Array.isArray(found.data) ? found.data : []) as any[]) {\n if (p.image_url) pictures.set(p.id, p.image_url)\n }\n } catch { /* icons it is */ }\n }\n\n return rows.map((r) => {\n const i = snakeToCamel(r) as any\n const meta = metaOf(r)\n const pictured = productOf(r)\n return {\n imageUrl: pictured ? pictures.get(pictured) : undefined,\n // A line that names a product IS a product line, whatever it was\n // typed as: linking it later (stock entry) must change its icon too.\n id: i.itemId, invoiceId,\n itemKind: meta.itemKind && meta.itemKind !== 'other' ? meta.itemKind : (i.productId ? 'product' : 'other'),\n // `name` OU `description`: quem levanta a conta pelo SQL\n // (`financial_create_payable`, o borderô de comissões) escreve o\n // texto em `description` e deixa `name` nulo. Lendo só `name`, a\n // linha chegava vazia na tela e sobrava o `itemKind` cru no lugar\n // dela — era o \"other\" que aparecia na fatura de comissão.\n description: i.name ?? i.description ?? '', quantity: i.quantity ?? 1,\n unitPrice: i.unitPrice ?? 0, totalAmount: i.total ?? 0,\n discount: i.discount ?? 0, surcharge: 0,\n // `product_id` quando a linha veio de uma porta que o preenche (a\n // RPC da agenda); do metadata quando veio DESTA tela, que é onde a\n // escolha de catálogo é gravada. Lendo só a coluna, reabrir uma\n // fatura apagava o item escolhido de toda linha e deixava o texto\n // solto — e salvar de novo confirmava a perda.\n referenceId: i.productId ?? meta.referenceId,\n accountId: i.chartAccountId,\n costCenterId: i.costCenterId,\n // De onde a linha veio — o pacote que a gerou, por exemplo. Sem\n // devolvê-lo, editar a fatura desfazia o vínculo em silêncio.\n metadata: r.item_metadata ?? r.metadata ?? undefined,\n cancelledAt: i.itemCancelledAt ?? undefined,\n cancelReason: i.itemCancelReason ?? undefined,\n createdAt: i.createdAt,\n } as InvoiceItem\n })\n },\n\n async getInvoiceAttachments(invoiceId: string): Promise<InvoiceAttachment[]> {\n const { pub } = getClients()\n // `documents` com `subject_type = 'financial_invoice'` — ver a migration\n // 053 do spine. O anexo é do TÍTULO: um recibo comprova a conta, não a\n // terceira parcela dela.\n const { data, error } = await pub.from('documents')\n .select('id, file_name, file_size, mime_type, file_url, storage_bucket, storage_path, storage_provider, created_at')\n .eq('subject_type', 'financial_invoice')\n .eq('subject_id', invoiceId)\n .eq('is_active', true)\n .order('created_at')\n if (error) throw error\n const linhas = (data ?? []) as any[]\n\n // URL ASSINADA, e não a que está gravada.\n //\n // O bucket `attachments` é PRIVADO, e o `file_url` guardado aponta para a\n // rota `/object/public/…` — que num bucket privado não existe e responde\n // 400 \"Bucket not found\". Os bytes estão lá (1.176 objetos, 143 MB); o\n // que não existe é o caminho público para eles.\n //\n // Um link assinado é gerado na leitura e expira. É o certo para\n // comprovante: um endereço permanente e adivinhável para o boleto de um\n // cliente é o boleto de todo cliente.\n const assinadas = new Map<string, string>()\n const porBucket = new Map<string, string[]>()\n for (const r of linhas) {\n if (!r.storage_bucket || !r.storage_path) continue\n const lista = porBucket.get(r.storage_bucket) ?? []\n lista.push(r.storage_path)\n porBucket.set(r.storage_bucket, lista)\n }\n for (const [bucket, caminhos] of porBucket) {\n try {\n const { data: urls } = await pub.storage.from(bucket).createSignedUrls(caminhos, 60 * 30)\n for (const u of urls ?? []) {\n if (u.path && u.signedUrl) assinadas.set(u.path, u.signedUrl)\n }\n } catch {\n // Sem assinatura o anexo aparece como pendente, que é honesto: o\n // registro existe e o arquivo não abre daqui.\n }\n }\n\n return linhas.map((r) => {\n const url = assinadas.get(r.storage_path) ?? undefined\n return {\n id: r.id,\n fileName: r.file_name ?? 'Anexo',\n fileSize: r.file_size ?? undefined,\n mimeType: r.mime_type ?? undefined,\n url,\n // Pendente é o que NÃO ABRE: os bytes ainda no V1, ou a assinatura\n // que não veio. O `file_url` gravado não conta — ele responde 400.\n pending: !url,\n createdAt: r.created_at,\n }\n })\n },\n\n async addInvoiceAttachment(invoiceId: string, file: File): Promise<void> {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n if (!tenantId) throw new Error('Conta sem empresa ativa')\n // The bucket policy only accepts paths under the tenant's own folder.\n const safe = file.name.replace(/[^\\w.\\-]+/g, '_')\n const path = `${tenantId}/financial_invoice/${invoiceId}/${Date.now()}_${safe}`\n const { error: upErr } = await pub.storage.from('attachments').upload(path, file, { contentType: file.type || undefined })\n if (upErr) throw upErr\n const { error } = await pub.from('documents').insert({\n tenant_id: tenantId,\n kind: 'attachment',\n status: 'active',\n subject_type: 'financial_invoice',\n subject_id: invoiceId,\n file_name: file.name,\n file_size: file.size,\n mime_type: file.type || null,\n storage_provider: 'supabase',\n storage_bucket: 'attachments',\n storage_path: path,\n })\n if (error) {\n await pub.storage.from('attachments').remove([path]).catch(() => {})\n throw error\n }\n },\n\n async createInvoice(input: CreateInvoiceInput): Promise<Invoice> {\n const { core, pub } = getClients()\n const tenantId = getActiveTenantId()\n const totalAmount = invoiceTotal(input.items)\n const itemsSummary = itemsDescription(input.items)\n\n // As parcelas têm que somar o total — o RPC recusa se não somarem, e é\n // melhor que recuse: uma conta cujas parcelas não fecham é a origem da\n // divergência que a conciliação passa o mês inteiro procurando.\n const installments = (input.installments.length > 0 ? input.installments : [\n { amount: totalAmount, dueDate: input.invoiceDate ?? new Date().toISOString().slice(0, 10) },\n ]).map((inst: any, n: number) => ({\n number: inst.installmentNumber ?? n + 1,\n due_date: inst.dueDate,\n amount: round2(inst.amount),\n ...(inst.metadata ? { metadata: inst.metadata } : {}),\n }))\n\n const { data: res, error } = await pub.rpc('financial_create_invoice', {\n p_direction: toLedgerDirection(input.direction),\n p_total: totalAmount,\n p_counterparty_person_id: input.contactId ?? null,\n p_order_id: null,\n p_unit_id: input.unitId ?? null,\n p_installments: installments,\n p_competence_date: input.invoiceDate ?? null,\n p_description: itemsSummary || null,\n p_notes: input.observations ?? null,\n p_metadata: {\n contactName: input.contactName,\n ...(input.fiscalNumber ? { fiscalNumber: input.fiscalNumber } : {}),\n ...(input.currency ? { currency: input.currency } : {}),\n },\n p_idempotency_key: genId(),\n })\n if (error) throw error\n const invoiceId: string = (res as any).invoice_id\n\n if (input.tags?.length) {\n await pub.from('plg_financial_invoices').update({ tags: input.tags }).eq('id', invoiceId)\n }\n\n if (input.items.length > 0) {\n // The server writes the lines with the bill's tenant and unit (financial 135).\n const { data: lines, error: linesErr } = await pub.rpc('financial_set_invoice_lines', {\n p_invoice_id: invoiceId,\n p_lines: invoiceLinesPayload(input.items, lineTotal),\n })\n if (linesErr) {\n // A bill whose lines were refused must not stay behind with only a total.\n await pub.rpc('financial_cancel_invoice', { p_invoice_id: invoiceId, p_reason: 'Itens recusados ao criar a conta' })\n throw new Error(`Os itens da conta não foram gravados: ${linesErr.message}`)\n }\n await writeLineAccounting(pub, await invoiceTenantId(pub, invoiceId), lines as Array<{ id: string; sort_order: number | null }>, input.items)\n }\n\n return (await provider.getInvoiceById(invoiceId))!\n },\n\n // A EDIÇÃO SALVAVA UMA COISA SÓ.\n //\n // Este método recebia o cabeçalho inteiro — data, contato, unidade, número\n // fiscal, total — e gravava `notes`. Todo o resto caía no chão sem erro\n // nenhum: o formulário fechava, a tela recarregava, e o campo voltava como\n // estava. Um salvar que não salva e não reclama é pior que um que falha.\n //\n // O mapa é o mesmo que a LEITURA usa (ver `rowToInvoice`), e por isso\n // `competence_date` e não `issue_date`: a leitura prefere a competência, e\n // gravar na outra coluna faria a tela mostrar o valor antigo depois de\n // salvar o novo.\n async updateInvoice(id: string, partial: Partial<Invoice>): Promise<Invoice> {\n const { pub } = getClients()\n const row: any = {}\n if (partial.observations !== undefined) row.notes = partial.observations\n if (partial.tags !== undefined) row.tags = partial.tags\n if (partial.invoiceDate !== undefined) row.competence_date = partial.invoiceDate\n if (partial.contactId !== undefined) row.counterparty_person_id = partial.contactId ?? null\n if (partial.unitId !== undefined) row.unit_id = partial.unitId ?? null\n if (partial.totalAmount !== undefined) row.total = partial.totalAmount\n // `number` is the invoice's own sequence (PAG-000001); the supplier's\n // document number lives in metadata, where creation writes it. Writing\n // it to `number` trips the issued-invoice immutability trigger.\n if (partial.contactName !== undefined || 'fiscalNumber' in partial) {\n const { data: cur } = await pub.from('plg_financial_invoices').select('metadata').eq('id', id).maybeSingle()\n row.metadata = {\n ...((cur?.metadata as Record<string, unknown>) ?? {}),\n ...(partial.contactName !== undefined ? { contactName: partial.contactName } : {}),\n ...('fiscalNumber' in partial ? { fiscalNumber: partial.fiscalNumber ?? null } : {}),\n }\n }\n if (Object.keys(row).length > 0) {\n const { error } = await pub.from('plg_financial_invoices').update(row).eq('id', id)\n if (error) throw error\n }\n return (await provider.getInvoiceById(id))!\n },\n\n // Escreve na TABELA, não na leitura.\n //\n // `T.bills` é `v_financial_installment_balances` — a view que soma o pago e\n // devolve a parcela já com saldo. Ela não tem `id` (a chave dela se chama\n // `installment_id`) e não é atualizável, então um UPDATE ali volta 400 com\n // \"column ... does not exist\". A parcela mora em\n // `plg_financial_invoice_installments`, e é lá que a data muda.\n async updateInstallment(id: string, data: { dueDate?: string; amount?: number; metadata?: Record<string, unknown> }): Promise<void> {\n const { pub } = getClients()\n const row: any = {}\n if (data.dueDate !== undefined) row.due_date = data.dueDate\n if (data.amount !== undefined) row.amount = data.amount\n // Já vem MESCLADA pelo chamador: um UPDATE de coluna jsonb substitui, e\n // mandar só o pedaço novo apagaria o comprovante da parcela.\n if (data.metadata !== undefined) row.metadata = data.metadata\n if (Object.keys(row).length === 0) return\n const { error } = await pub.from('plg_financial_invoice_installments').update(row).eq('id', id)\n if (error) throw error\n },\n\n // SUBSTITUI as linhas, e o total vai junto.\n //\n // Casar linha a linha pediria um id estável que o formulário não carrega —\n // ele trabalha com `_id` de rascunho —, e uma fatura tem unidades de\n // linhas, não milhares. Apagar e reinserir é o que o cadastro já faz, pelo\n // mesmo caminho e com a mesma contabilidade de linha.\n //\n // O TOTAL ENTRA NA MESMA OPERAÇÃO. Ele é a soma das linhas: gravar as\n // linhas sem ele deixaria a conta somando um valor na tela e cobrando\n // outro no cronograma — e o `financial_reschedule_invoice`, que compara a\n // soma das parcelas com o total GRAVADO, recusaria o cronograma novo sem\n // dizer por quê. 099 abriu os dois enquanto nada foi recebido.\n //\n // O espelho contábil (`plg_financial_invoice_items`) some sozinho: a chave\n // dele é `item_id ON DELETE CASCADE`.\n async replaceInvoiceItems(invoiceId: string, items: CreateInvoiceItemInput[]): Promise<void> {\n const { core, pub } = getClients()\n const tenantId = await invoiceTenantId(pub, invoiceId)\n const totalAmount = invoiceTotal(items)\n\n // O total PRIMEIRO: o gatilho de linha pergunta se a fatura recebeu algo,\n // não o que ela vale, então a ordem não o incomoda — e assim uma falha na\n // gravação do total não deixa a fatura sem as linhas antigas nem com as\n // novas.\n const { error: totalErr } = await pub.from('plg_financial_invoices')\n .update({ total: totalAmount, description: itemsDescription(items) || null })\n .eq('id', invoiceId)\n if (totalErr) throw totalErr\n\n // Delete and insert in ONE server transaction (financial 135): a refused\n // write leaves the old lines exactly where they were.\n const { data: inserted, error: insErr } = await pub.rpc('financial_set_invoice_lines', {\n p_invoice_id: invoiceId,\n p_lines: invoiceLinesPayload(items, lineTotal),\n p_replace: true,\n })\n if (insErr) throw insErr\n\n await writeLineAccounting(pub, tenantId, inserted as Array<{ id: string; sort_order: number | null }>, items)\n },\n\n // UMA chamada, não um laço de updates.\n //\n // Ir de 3x para 2x apaga uma linha e reescreve as outras duas, e\n // (invoice_id, number) é UNIQUE e não deferrable: qualquer ordem de\n // updates do cliente passa por um estado que o banco recusa. A RPC faz o\n // apaga-e-reinsere numa transação, confere se a soma bate com o total do\n // título e recusa o que já recebeu alguma coisa.\n async rescheduleInvoice(invoiceId: string, installments: Array<{ dueDate: string; amount: number; metadata?: Record<string, unknown> }>): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_reschedule_invoice', {\n p_invoice_id: invoiceId,\n p_installments: installments.map((inst, i) => ({\n number: i + 1,\n due_date: inst.dueDate,\n amount: inst.amount,\n // 111 faz `metadata = coalesce(v_meta, metadata)`: o que vai aqui\n // SUBSTITUI a metadata da parcela, então o chamador manda o conjunto\n // inteiro, não o delta.\n ...(inst.metadata ? { metadata: inst.metadata } : {}),\n })),\n p_idempotency_key: createIdempotencyKey('financial:invoice-reschedule'),\n })\n if (error) throw error\n },\n\n async cancelInvoice(input: CancelInvoiceInput): Promise<void> {\n const { pub } = getClients()\n const reason = cancellationReason(input)\n // Cancelar é RPC: derruba as parcelas em aberto e escreve a auditoria.\n const { error } = await pub.rpc('financial_cancel_invoice', {\n p_invoice_id: input.invoiceId,\n p_reason: reason,\n p_idempotency_key: input.idempotencyKey ?? createIdempotencyKey('financial:invoice-cancel'),\n })\n if (error) throw error\n },\n\n async listCancellationReasons(): Promise<CancellationReason[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_cancellation_reasons')\n if (error) throw error\n return ((data ?? []) as any[]).map((r) => ({ id: r.id, name: r.name }))\n },\n\n async getInvoiceStockEntries(invoiceId: string): Promise<InvoiceStockEntry[]> {\n const { pub } = getClients()\n const toEntry = (r: any): InvoiceStockEntry => ({\n itemId: r.item_id, productId: r.product_id, locationId: r.location_id,\n entered: Number(r.entered ?? 0), available: Number(r.available ?? 0), enteredOn: r.entered_on,\n })\n const { data, error } = await pub.rpc('financial_invoice_stock_entries', { p_invoice_id: invoiceId })\n if (error) throw error\n const guessed = ((data ?? []) as any[]).map(toEntry)\n // Receipts tied to the line itself (126). A pool without it answers with\n // an error, and the guessed ones are still the whole truth there.\n const linked = await pub.rpc('financial_invoice_stock_links', { p_invoice_id: invoiceId })\n const direct = linked.error || !Array.isArray(linked.data) ? [] : (linked.data as any[]).map(toEntry)\n const seen = new Set(direct.map((e) => e.itemId))\n return [...direct, ...guessed.filter((e) => !seen.has(e.itemId))]\n },\n\n async listStockLocations(): Promise<Array<{ id: string; name: string }>> {\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_inventory_stock_locations').select('id, name').eq('is_active', true).order('name')\n if (error) return []\n return ((data ?? []) as any[]).map((r) => ({ id: r.id, name: r.name }))\n },\n\n async listCurrencies(): Promise<string[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_financial_accounts')\n .select('currency').eq('tenant_id', getActiveTenantId()).eq('is_active', true)\n .not('kind', 'in', '(system,person)')\n if (error) return []\n return [...new Set(((Array.isArray(data) ? data : []) as any[]).map((r) => String(r.currency ?? '').toUpperCase()).filter(Boolean))]\n },\n\n async getProductPictures(ids: string[]): Promise<Record<string, string>> {\n if (ids.length === 0) return {}\n const { pub } = getClients()\n const { data, error } = await pub.from('products').select('id, image_url').in('id', ids)\n if (error) return {}\n const out: Record<string, string> = {}\n for (const p of (Array.isArray(data) ? data : []) as any[]) if (p.image_url) out[p.id] = p.image_url\n return out\n },\n\n async searchStockProducts(query: string): Promise<Array<{ id: string; name: string }>> {\n const { pub } = getClients()\n let qb = pub.from('products').select('id, name').eq('kind', 'good').eq('is_active', true).order('name').limit(20)\n const q = query.trim()\n if (q) qb = qb.ilike('name', `%${q.replace(/[%_]/g, ' ')}%`)\n const { data, error } = await qb\n if (error) return []\n return ((data ?? []) as any[]).map((r) => ({ id: r.id, name: r.name }))\n },\n\n async getFxRate(from: string, to: string): Promise<number | null> {\n const { pub } = getClients()\n if (from === to) return 1\n const read = async (): Promise<number | null> => {\n const { data, error } = await pub.from('plg_financial_fx_rates')\n .select('base_currency, quote_currency, rate, rate_date')\n .or(`and(base_currency.eq.${from},quote_currency.eq.${to}),and(base_currency.eq.${to},quote_currency.eq.${from})`)\n .order('rate_date', { ascending: false }).limit(1)\n const row = !error && Array.isArray(data) ? data[0] : null\n if (!row || !(Number(row.rate) > 0)) return null\n return row.base_currency === from ? Number(row.rate) : 1 / Number(row.rate)\n }\n const known = await read()\n if (known !== null) return known\n const tenantId = getActiveTenantId()\n if (tenantId && await ensureReferenceRates(pub, tenantId, to, [from])) return read()\n return null\n },\n\n async listProductVariants(productId: string): Promise<Array<{ id: string; name: string; isDefault: boolean }>> {\n const { pub } = getClients()\n const { data, error } = await pub.from('product_variants').select('id, name, is_default')\n .eq('product_id', productId).eq('is_active', true).order('sort_order').order('created_at')\n if (error) return []\n return ((data ?? []) as any[]).map((r) => ({ id: r.id, name: r.name, isDefault: !!r.is_default }))\n },\n\n async getInvoiceStockDetails(invoiceId: string) {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_invoice_stock_link_details', { p_invoice_id: invoiceId })\n if (error || !Array.isArray(data)) return []\n return (data as any[]).map((r) => ({\n itemId: r.item_id, variantId: r.variant_id ?? undefined, variantName: r.variant_name ?? undefined,\n quantity: Number(r.quantity) || 0, unitCost: Number(r.unit_cost) || 0, currency: String(r.currency ?? ''),\n sourceUnitCost: r.source_unit_cost == null ? undefined : Number(r.source_unit_cost),\n sourceCurrency: r.source_currency ?? undefined, fxRate: r.fx_rate == null ? undefined : Number(r.fx_rate),\n locationName: r.location_name ?? undefined, enteredOn: r.entered_on ?? undefined,\n }))\n },\n\n async receiveInvoiceItemStock(input): Promise<void> {\n const { pub } = getClients()\n const call = () => pub.rpc('financial_invoice_item_receive_stock_lines', {\n p_item_id: input.itemId,\n p_location_id: input.locationId,\n p_lines: input.entries.map((e) => ({ variant_id: e.variantId ?? null, quantity: e.quantity })),\n p_product_id: input.productId ?? null,\n p_unit_cost: input.unitCost ?? null,\n p_fx_rate: input.fxRate ?? null,\n p_idempotency_key: input.idempotencyKey ?? null,\n })\n let { error } = await call()\n // The bill is in another currency and no rate is on file: fetch the\n // day's reference rate and try once more, instead of asking for it.\n const pair = /de ([A-Z]{3}) para ([A-Z]{3})/.exec(String(error?.message ?? ''))\n const tenantId = getActiveTenantId()\n if (pair && tenantId && await ensureReferenceRates(pub, tenantId, pair[2]!, [pair[1]!])) {\n ;({ error } = await call())\n }\n if (error) throw error\n },\n\n async cancelInvoiceItems(input: CancelInvoiceItemsInput): Promise<CancelInvoiceItemsResult> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_cancel_invoice_items', {\n p_invoice_id: input.invoiceId,\n p_item_ids: input.itemIds.length ? input.itemIds : null,\n p_reason_id: input.reasonId,\n p_detail: input.detail?.trim() || null,\n p_stock: input.stock.map((s) => ({ item_id: s.itemId, destination: s.destination, note: s.note?.trim() || null })),\n p_idempotency_key: input.idempotencyKey ?? createIdempotencyKey('financial:invoice-cancel-items'),\n })\n if (error) throw error\n const r = (data ?? {}) as any\n return { whole: !!r.whole, amount: Number(r.amount ?? 0), creditAmount: Number(r.credit_amount ?? 0) }\n },\n\n async addInstallmentCharge(input: InstallmentChargeInput): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_add_installment_charge', {\n p_installment_id: input.installmentId,\n p_kind: input.kind,\n p_amount: input.amount,\n p_chart_account_id: input.accountId ?? null,\n p_description: input.description?.trim() || null,\n p_idempotency_key: input.idempotencyKey ?? createIdempotencyKey('financial:installment-charge'),\n })\n if (error) throw error\n },\n\n async getSupplierCredit(personId: string): Promise<number> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_supplier_credit', { p_person_id: personId })\n if (error) throw error\n return Number(data ?? 0)\n },\n\n // --- Movements (public.financial_movements) ---\n async getMovements(query: MovementQuery): Promise<PaginatedResult<FinancialMovement>> {\n const { core, pub } = getClients()\n // O CRONOGRAMA de uma conta são as PARCELAS, e parcela não é movimento:\n // financial_create_invoice grava plg_financial_invoice_installments, e\n // plg_financial_movements só recebe linha quando alguém PAGA.\n //\n // As duas fontes falam línguas diferentes, e é por isso que a leitura da\n // parcela tem o seu próprio caminho em vez de um snakeToCamel comum:\n // `v_financial_installment_balances` diz installment_id/number/paid e\n // payable|receivable, enquanto a tela fala id/installmentNumber/paidAmount\n // e debit|credit.\n const wantsSchedule = !!query.invoiceId && !query.bankAccountId && !query.cashSessionId\n\n if (wantsSchedule) {\n let sq = pub.from(T.bills).select('*', { count: 'exact' })\n .eq('invoice_id', query.invoiceId)\n if (query.direction) sq = sq.eq('direction', toLedgerDirection(query.direction))\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n sq = sq.in('status', statuses)\n }\n if (query.dateRange) sq = sq.gte('due_date', query.dateRange.from).lte('due_date', query.dateRange.to)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n const { data, count, error } = await sq\n .range((page - 1) * pageSize, page * pageSize - 1)\n .order('due_date')\n if (error) throw error\n const bills = (data ?? []).map(billRowToMovement)\n\n // E OS PAGAMENTOS DA MESMA FATURA. Este ramo devolvia SÓ as parcelas e\n // retornava antes de ler `plg_financial_movements` — então a tela de\n // detalhe, que separa os dois por `movementKind`, ficava com zero\n // pagamento para sempre: a parcela paga dizia \"nenhum detalhe adicional\n // registrado\" e não havia o que estornar, porque o pagamento que a\n // própria tela acabara de registrar nunca voltava.\n //\n // O elo é `financial_invoice_id` (canônico); `invoice_id` é o legado que\n // aponta para `orders` e é nulo em toda fatura do modelo novo.\n const { data: payRows } = await pub.from(T.movements).select('*')\n .or(`financial_invoice_id.eq.${query.invoiceId},invoice_id.eq.${query.invoiceId}`)\n .eq('movement_kind', 'payment')\n .order('payment_date')\n const payments = (payRows ?? []).map((r: any) => ({\n ...(snakeToCamel(r) as unknown as FinancialMovement),\n invoiceId: r.financial_invoice_id ?? r.invoice_id,\n }))\n\n return { data: [...bills, ...payments], total: count ?? 0 }\n }\n\n let qb = pub.from(T.movements).select('*', { count: 'exact' })\n if (query.direction) qb = qb.eq('direction', query.direction)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in('status', statuses)\n }\n if (query.bankAccountId) qb = qb.eq('bank_account_id', query.bankAccountId)\n if (query.cashSessionId) qb = qb.eq('cash_session_id', query.cashSessionId)\n // DOIS `invoice_id` COM SENTIDOS DIFERENTES. O legado aponta para\n // `orders`; o canônico é `financial_invoice_id` → plg_financial_invoices.\n // Filtrar só pelo legado devolvia ZERO pagamento para toda fatura do\n // modelo novo — e era por isso que a parcela paga dizia \"nenhum detalhe\n // adicional registrado\" e não havia como estornar: a tela nunca via o\n // pagamento que ela mesma acabara de registrar.\n if (query.invoiceId) {\n qb = qb.or(`financial_invoice_id.eq.${query.invoiceId},invoice_id.eq.${query.invoiceId}`)\n }\n if (query.dateRange) qb = qb.gte('due_date', query.dateRange.from).lte('due_date', query.dateRange.to)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('due_date')\n const { data, count } = await qb\n return {\n // `invoiceId` carrega o canônico quando existe: quem lê a tela compara\n // com o id da fatura que abriu, e esse é o do modelo novo.\n data: (data ?? []).map((r: any) => ({\n ...(snakeToCamel(r) as unknown as FinancialMovement),\n invoiceId: r.financial_invoice_id ?? r.invoice_id,\n })),\n total: count ?? 0,\n }\n },\n\n /**\n * Receber — pela RPC, que é o único lugar onde receber dinheiro acontece.\n *\n * Antes isto escrevia à mão: inseria um movimento de pagamento, atualizava o\n * cache do bill, e recalculava o status da fatura. Três escritas no ESPELHO\n * `plg_financial_movements`, que parou de ser escrito na Fase 2 (financial\n * 040) e hoje tem 7 linhas, a última de agosto. Tudo o mais já lia\n * `v_financial_installment_balances`, a parcela com o seu saldo — só este caminho continuava\n * do outro lado.\n *\n * Duas coisas que a mão fazia e a RPC faz melhor: ela valida a sessão de\n * caixa aberta para dinheiro, exige conta para os métodos que precisam de\n * uma, e tem chave de idempotência — um duplo clique deixa de virar dois\n * recebimentos.\n *\n * E uma que a mão fazia e NÃO devia: escrevia `orders.status` como\n * 'paid'/'partial'/'invoiced'. O status do pedido é do produto que o abriu —\n * uma comanda paga estaria com um status que o fluxo do salão não conhece, e\n * o quadro a perderia. Quem registra o dinheiro não renomeia a venda.\n *\n * `movementId` É o id da parcela: o modal recebe a linha de `T.bills`, que é\n * `v_financial_installment_balances`, e ali a chave chama `installment_id`.\n */\n /**\n * Estorna um pagamento. A RPC existia desde a base e NENHUMA camada de\n * TypeScript a expunha — o dinheiro entrava pela tela e só saía pelo SQL.\n *\n * Estornar NÃO apaga: lança a contrapartida e aponta `reversed_by_id`, então\n * o extrato mostra os dois lados e o balancete continua fechando. Um livro\n * onde um lançamento some não prova nada.\n */\n /**\n * A conta do cliente. `v_financial_invoice_balances` já traz total/pago/saldo\n * por fatura, então os indicadores são uma soma — não uma segunda contagem\n * que poderia divergir da lista logo abaixo dela.\n */\n async searchSellableServices(term: string) {\n const { pub } = getClients()\n let q = pub.from('products').select('id, name, price')\n .eq('kind', 'service').not('is_active', 'is', false).order('name').limit(20)\n if (term.trim()) q = q.ilike('name', `%${term.trim()}%`)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map((p: any) => ({ id: p.id, name: p.name, price: Number(p.price ?? 0) }))\n },\n\n async prepayServices(personId: string, lines: Array<{ serviceId: string; name: string; quantity: number; unitPrice: number }>) {\n const { pub } = getClients()\n // A venda antecipada nasce no PRONTUÁRIO, porque o que ela cria é um\n // serviço a executar — e execução é de lá. Onde o plugin não está\n // instalado a função não existe, e o botão nem aparece.\n const { data, error } = await pub.rpc('clinical_prepay_services', {\n p_party: personId,\n p_lines: lines.map((l) => ({\n service_id: l.serviceId, name: l.name, quantity: l.quantity, unit_price: l.unitPrice,\n })),\n })\n if (error) throw error\n const r = (data ?? {}) as { ok?: boolean; reason?: string; order_id?: string; total?: number }\n return { ok: r.ok === true, reason: r.reason, orderId: r.order_id, total: r.total }\n },\n\n async getClientAccount(personId: string): Promise<ClientAccount> {\n const { pub } = getClients()\n const { data, error } = await pub.from('v_financial_invoice_balances')\n .select('id, number, order_id, competence_date, total, paid, balance, status, description')\n .eq('counterparty_person_id', personId)\n .eq('direction', 'receivable')\n .is('cancelled_at', null)\n .order('competence_date', { ascending: false })\n if (error) throw error\n const rows = (data ?? []) as any[]\n const invoices: ClientAccountInvoice[] = rows.map((r) => ({\n id: r.id, number: r.number, orderId: r.order_id, competenceDate: r.competence_date,\n total: Number(r.total) || 0, paid: Number(r.paid) || 0, balance: Number(r.balance) || 0,\n status: r.status, description: r.description,\n }))\n // O QUE FOI CONTRATADO E AINDA NÃO SAIU.\n //\n // Quem sabe disso é o prontuário (`v_clinical_to_execute`), porque a\n // execução é dele. Lê-se defensivamente: onde o plugin clínico não está\n // instalado a vista não existe, e a conta fica SEM o cartão — que é a\n // resposta certa para quem não tem execução para acompanhar, e não um\n // zero afirmando que nada está pendente.\n let paidToExecute: number | undefined\n let openToExecute: number | undefined\n try {\n const { data: exec } = await pub\n .from('v_clinical_to_execute')\n .select('paid_to_execute, open_to_execute')\n .eq('party_id', personId)\n .maybeSingle()\n if (exec) {\n paidToExecute = Number((exec as any).paid_to_execute) || 0\n openToExecute = Number((exec as any).open_to_execute) || 0\n }\n } catch { /* sem prontuário instalado: o cartão não aparece */ }\n\n return {\n personId,\n contracted: invoices.reduce((a, i) => a + i.total, 0),\n paid: invoices.reduce((a, i) => a + i.paid, 0),\n open: invoices.reduce((a, i) => a + i.balance, 0),\n paidToExecute,\n openToExecute,\n invoices,\n }\n },\n\n /**\n * A previsão de recebimento de cartão. `v_financial_card_receivables` já\n * reparte o bruto pelas parcelas, aplica a taxa da bandeira/faixa e data\n * cada liquidação — a tela só ordena e soma.\n */\n async getCardReceivables(): Promise<CardReceivable[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from('v_financial_card_receivables')\n .select('movement_id, account_name, card_brand, card_installments, installment_k, payment_date, gross, fee_rate, fee, net, settlement_date, missing_fee_config')\n .order('settlement_date')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n movementId: r.movement_id, accountName: r.account_name, cardBrand: r.card_brand,\n cardInstallments: r.card_installments, installmentK: r.installment_k,\n paymentDate: r.payment_date, gross: Number(r.gross) || 0,\n feeRate: r.fee_rate == null ? null : Number(r.fee_rate),\n fee: Number(r.fee) || 0, net: Number(r.net) || 0,\n settlementDate: r.settlement_date, missingFeeConfig: !!r.missing_fee_config,\n }))\n },\n\n async reverseMovement(movementId: string, reason: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_reverse_movement', {\n p_movement_id: movementId,\n p_reason: reason,\n p_idempotency_key: null,\n })\n if (error) throw error\n },\n\n async payMovement(input: PayMovementInput): Promise<FinancialMovement> {\n const { pub } = getClients()\n\n // A parcela ANTES, por dois motivos: a direção decide se há taxa (só\n // entrada tem MDR), e é dela que sai o retorno no fim.\n const { data: before } = await pub.from(T.bills).select('*').eq('installment_id', input.movementId).maybeSingle()\n if (!before) throw new Error('Parcela não encontrada')\n\n // O código do método (cash, pix, credit_card…), que é o que a RPC valida.\n // O modal escolhe um TIPO por id; `transaction_type` é o código dele.\n let method: string | null = null\n if (input.paymentMethodTypeId) {\n const { data: type } = await pub.from(T.paymentMethodTypes)\n .select('transaction_type').eq('id', input.paymentMethodTypeId).maybeSingle()\n method = (type?.transaction_type as string | undefined) ?? null\n }\n\n // A RPC faz `coalesce(p_fee_amount, 0)` — ela NÃO deriva o MDR. Quem sabe\n // a taxa é o catálogo de métodos, e ela tem de vir daqui ou todo cartão\n // seria registrado pelo bruto, em silêncio.\n const feePct = before.direction === 'receivable' ? await getMethodFeePct(pub, input.paymentMethodId) : 0\n const fee = paymentFee(input.amount, feePct, before.direction)\n\n const { error } = await pub.rpc('financial_receive_payment', {\n p_installment_id: input.movementId,\n p_amount: input.amount,\n p_account_id: input.bankAccountId ?? null,\n p_method: ledgerMethod(method),\n p_cash_session_id: input.cashSessionId ?? null,\n p_card_brand: input.cardBrand ?? null,\n p_card_installments: input.cardInstallments ?? null,\n p_payment_date: input.paymentDate,\n p_fee_amount: fee || null,\n p_notes: input.notes ?? null,\n p_idempotency_key: input.idempotencyKey ?? createIdempotencyKey('financial:payment'),\n p_metadata: input.metadata ?? {},\n })\n if (error) throw error\n\n // A parcela como ela ficou. O chamador recarrega a lista de qualquer\n // forma; isto é para quem usa o retorno.\n try {\n const { data: after } = await pub.from(T.bills).select('*').eq('installment_id', input.movementId).maybeSingle()\n return billRowToMovement(after ?? before)\n } catch {\n // The write already succeeded; stale display data is not a rejected payment.\n return billRowToMovement(before)\n }\n },\n\n async cancelMovement(id: string): Promise<void> {\n const { core, pub } = getClients()\n await pub.from(T.movements).update({ status: 'cancelled' }).eq('id', id)\n },\n\n // --- Transfers (between accounts) ---\n async createTransfer(input: CreateTransferInput): Promise<TransferResult> {\n const { pub } = getClients()\n const transferId = genId()\n const legs = transferLegs(input, transferId)\n const tenantId = getActiveTenantId()\n const rowsToInsert = legs.map((leg) => ({\n tenant_id: tenantId,\n movement_kind: 'transfer' as const,\n direction: leg.direction,\n bank_account_id: leg.bankAccountId,\n amount: input.amount,\n paid_amount: input.amount,\n fee_amount: 0,\n status: 'paid' as const,\n due_date: input.date,\n payment_date: input.date,\n notes: input.notes ?? null,\n metadata: leg.metadata,\n }))\n let { data, error } = await pub.from(T.movements).insert(rowsToInsert).select('id, direction')\n // Graceful fallback if the fee_amount migration hasn't been applied yet.\n if (error && /fee_amount/i.test(error.message ?? '')) {\n const stripped = rowsToInsert.map(({ fee_amount, ...rest }) => rest)\n ;({ data, error } = await pub.from(T.movements).insert(stripped).select('id, direction'))\n }\n if (error) throw error\n const rows = (data ?? []) as Array<{ id: string; direction: string }>\n const debitMovementId = rows.find((r) => r.direction === 'debit')?.id ?? ''\n const creditMovementId = rows.find((r) => r.direction === 'credit')?.id ?? ''\n return { transferId, debitMovementId, creditMovementId }\n },\n\n // --- Bank Accounts ---\n /**\n * As contas onde um recebimento pode CAIR — da mesma tabela que a RPC valida.\n *\n * `plg_financial_bank_accounts` e `plg_financial_accounts` são duas tabelas,\n * com dois vocabulários: `account_type` ('bank_account', 'cash_register')\n * contra `kind` ('bank', 'cash_physical', 'card_receivable_credit'…). Os ids\n * coincidem onde as duas têm a linha — mas as contas de recebível de cartão\n * existem SÓ na segunda, e era ela que a RPC conferia.\n *\n * O efeito: o seletor do modal, lendo a primeira, nunca conseguia oferecer\n * uma conta de cartão, e `financial_receive_payment` recusava com \"method\n * credit_card must settle in a card_receivable_credit account\". Cartão não\n * estava quebrado para um tenant — estava quebrado para todos.\n *\n * `accountType` carrega o `kind` canônico porque é ele que o filtro de\n * `allowed_account_types` compara. Um vocabulário, não dois.\n */\n async getBankAccounts(): Promise<BankAccount[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_financial_accounts')\n .select('*').eq('is_active', true).order('name')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n ...(snakeToCamel(r) as unknown as BankAccount),\n accountType: r.kind,\n }))\n },\n\n async getAccountsByIds(ids: string[]): Promise<BankAccount[]> {\n if (ids.length === 0) return []\n const { pub } = getClients()\n const { data, error } = await pub.from('plg_financial_accounts').select('*').in('id', ids)\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n ...(snakeToCamel(r) as unknown as BankAccount),\n accountType: r.kind,\n }))\n },\n\n // Só a conta INTEGRADA, como no V1. A view já faz o `openfinance_configured`\n // — uma conta sem origem ativa nunca vai trazer uma linha, e oferecê-la é\n // convidar a pessoa a concluir que a tela está quebrada.\n async getStatementAccounts(): Promise<BankAccount[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.statementAccounts)\n .select('*')\n .order('kind')\n .order('name')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n ...(snakeToCamel(r) as unknown as BankAccount),\n accountType: r.kind,\n }))\n },\n\n async searchFinancialAccounts(query: string, limit = 20): Promise<BankAccount[]> {\n const term = query.trim()\n if (term.length < 2) return []\n const { pub } = getClients()\n const groups: BankAccountType[][] = [\n ['person'],\n ['bank', 'unit'],\n ['cash_physical', 'cash_session'],\n ['card_receivable_credit', 'card_receivable_debit', 'card_payable'],\n ['unidentified', 'system'],\n ]\n const perGroup = Math.min(Math.max(Math.ceil(limit / groups.length), 4), 12)\n const answers = await Promise.all(groups.map(async (kinds) => {\n const { data, error } = await pub.from('plg_financial_accounts')\n .select('*')\n .eq('is_active', true)\n .in('kind', kinds)\n .ilike('name', `%${term}%`)\n .order('name')\n .limit(perGroup)\n if (error) throw error\n return (data ?? []).map((row: any) => ({\n ...(snakeToCamel(row) as unknown as BankAccount),\n accountType: row.kind,\n }))\n }))\n\n // Fill the result round-robin so a large people table cannot consume the\n // whole limit before bank, cash, card, or unit matches are represented.\n const out: BankAccount[] = []\n for (let index = 0; out.length < limit && answers.some((rows) => index < rows.length); index += 1) {\n for (const rows of answers) {\n if (rows[index]) out.push(rows[index]!)\n if (out.length === limit) break\n }\n }\n return out\n },\n\n /**\n * Writes where getBankAccounts READS.\n *\n * It used to insert into `plg_financial_bank_accounts` while the reader\n * came from `plg_financial_accounts` — so an account created through the UI\n * was never seen again by any screen or RPC. The caixa screen's own empty\n * state says \"crie uma conta do tipo Caixa primeiro\", and following that\n * instruction landed the row in a table nothing reads.\n *\n * `accountType` carries the canonical `kind` (see getBankAccounts), so it is\n * written to `kind`; `account_type` keeps the descriptive value the older\n * rows carry.\n */\n async createBankAccount(input: CreateBankAccountInput): Promise<BankAccount> {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n const row = camelToSnake(input as any)\n const kind = row.account_type\n delete row.account_type\n delete row.initial_balance\n const { data, error } = await pub.from('plg_financial_accounts').insert({\n ...row, tenant_id: tenantId, kind, account_type: kind, is_active: true,\n }).select().single()\n if (error) throw error\n return { ...(snakeToCamel(data!) as unknown as BankAccount), accountType: (data as any).kind }\n },\n\n async updateBankAccount(id: string, partial: Partial<BankAccount>): Promise<BankAccount> {\n const { core, pub } = getClients()\n const row = camelToSnake(partial as any)\n delete row.id; delete row.tenant_id\n // same canonical mapping as create/read\n if (row.account_type) { row.kind = row.account_type }\n const { data, error } = await pub.from('plg_financial_accounts').update(row).eq('id', id).select().single()\n if (error) throw error\n return { ...(snakeToCamel(data!) as unknown as BankAccount), accountType: (data as any).kind }\n },\n\n // --- Cash Sessions ---\n /**\n * Sessions carrying what the caixa SHOULD hold right now.\n *\n * The close screen used to compare the counted cash against the OPENING\n * balance, so every cash sale of the shift read as a surplus. The expected\n * value comes from the same view the close RPC reads, so the operator\n * confirms the number the system is about to record.\n */\n async getCashSessions(bankAccountId?: string): Promise<CashSession[]> {\n const { pub } = getClients()\n let qb = pub.from(T.cashRegisterSessions).select('*')\n if (bankAccountId) qb = qb.eq('bank_account_id', bankAccountId)\n const { data, error } = await qb.order('opened_at', { ascending: false })\n if (error) throw error\n const rows: CashSession[] = (data ?? []).map((r: any) => snakeToCamel(r) as unknown as CashSession)\n if (!rows.length) return rows\n const { data: exp } = await pub.from('v_financial_cash_session_expected')\n .select('session_id, expected_cash, received_by_method, payment_count')\n .in('session_id', rows.map((r) => r.id))\n const by = new Map<string, any>(((exp ?? []) as any[]).map((e) => [e.session_id, e]))\n return rows.map((r) => {\n const e = by.get(r.id)\n return e ? { ...r, expectedCash: Number(e.expected_cash ?? 0),\n receivedByMethod: e.received_by_method ?? {},\n paymentCount: e.payment_count ?? 0 } : r\n })\n },\n\n async getOpenSession(bankAccountId: string): Promise<CashSession | null> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from(T.cashRegisterSessions).select('*').eq('bank_account_id', bankAccountId).eq('status', 'open').single()\n if (error) throw error\n return data ? snakeToCamel(data) as unknown as CashSession : null\n },\n\n // Verbo, não INSERT. A escrita direta parecia funcionar e não abria caixa\n // nenhum: `financial_cash_session_open` cria uma CONTA dedicada para a\n // caixinha, funda-a com um movimento a partir do cofre, exige\n // `financial.cash_session`, recusa a segunda sessão aberta do mesmo\n // operador na mesma unidade, valida que o cofre é `cash_physical` e audita.\n // A linha inserida à mão não tinha conta — e sem conta nenhum movimento\n // pode pertencer a ela, então o fechamento contava zero.\n async openCashSession(input: OpenCashSessionInput): Promise<CashSession> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_cash_session_open', {\n p_cofre_account_id: input.bankAccountId,\n p_opening_amount: input.openingBalance,\n p_idempotency_key: null,\n })\n if (error) throw error\n const sessionId = (data as any)?.session_id as string | undefined\n if (!sessionId) throw new Error('financial_cash_session_open não devolveu sessão')\n const { data: row, error: readError } = await pub\n .from(T.cashRegisterSessions).select('*').eq('id', sessionId).single()\n if (readError) throw readError\n return snakeToCamel(row) as unknown as CashSession\n },\n\n // O fechamento é uma CONFERÊNCIA, e o UPDATE à mão não conferia nada: a RPC\n // calcula o esperado (saldo da conta da caixinha para dinheiro, soma dos\n // pagamentos em cartão da sessão), compara com o contado, devolve o\n // dinheiro contado ao cofre e lança a diferença como quebra de caixa —\n // falta ou sobra — em conta de sistema própria. Depois audita.\n //\n // A RPC fecha a sessão aberta DE QUEM CHAMA, e por isso não recebe id:\n // fecha-se o próprio caixa. `sessionId` continua na entrada pelo contrato\n // do provider e é conferido aqui, para o erro sair como \"não é o seu\n // caixa\" em vez de fechar silenciosamente o caixa errado.\n async closeCashSession(input: CloseCashSessionInput): Promise<CashSession> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_cash_session_close', {\n p_counted_cash: input.closingBalance,\n p_counted_card: (input as any).countedCard ?? 0,\n p_idempotency_key: null,\n p_notes: input.notes ?? null,\n })\n if (error) throw error\n const closedId = (data as any)?.session_id as string | undefined\n if (closedId && input.sessionId && closedId !== input.sessionId) {\n throw new Error('o caixa fechado não é o que a tela pediu — recarregue a lista')\n }\n const { data: row, error: readError } = await pub\n .from(T.cashRegisterSessions).select('*').eq('id', closedId ?? input.sessionId).single()\n if (readError) throw readError\n return snakeToCamel(row) as unknown as CashSession\n },\n\n async getCashSessionSummary(sessionId: string): Promise<CashSessionSummary> {\n const { core, pub } = getClients()\n const session = (await pub.from(T.cashRegisterSessions).select('*').eq('id', sessionId).single()).data\n const { data: movs } = await pub.from(T.movements).select('direction, paid_amount').eq('cash_session_id', sessionId).eq('status', 'paid')\n const flow = sessionCashFlow(((movs ?? []) as Array<{ direction: 'debit' | 'credit'; paid_amount: number }>)\n .map((m) => ({ direction: m.direction, paidAmount: m.paid_amount })))\n return { session: snakeToCamel(session!) as unknown as CashSession, ...flow }\n },\n\n // --- Payment Methods ---\n async getPaymentMethods(): Promise<PaymentMethod[]> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from(T.paymentMethods).select('*').eq('is_active', true).order('name')\n if (error) throw error\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as PaymentMethod)\n },\n\n async getPaymentMethodTypes(): Promise<PaymentMethodType[]> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from(T.paymentMethodTypes).select('*').eq('is_active', true).order('name')\n if (error) throw error\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as PaymentMethodType)\n },\n\n // --- Chart of Accounts ---\n async getChartOfAccounts(): Promise<ChartOfAccountsNode[]> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from(T.chartOfAccounts).select('*').eq('is_active', true).order('code')\n if (error) throw error\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as ChartOfAccountsNode)\n },\n\n async resolveChartAccountRefs(refs: string[]): Promise<Record<string, string>> {\n const unique = [...new Set(refs.map((ref) => String(ref).trim()).filter(Boolean))]\n if (unique.length === 0) return {}\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_resolve_chart_account_refs', { p_refs: unique })\n if (error) throw error\n return Object.fromEntries((data ?? []).map((row: any) => [String(row.source_ref), String(row.chart_account_id)]))\n },\n\n async getCostCenters(): Promise<CostCenter[]> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from(T.costCenters).select('*').eq('is_active', true).order('code')\n if (error) throw error\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as CostCenter)\n },\n\n // --- Card Transactions ---\n async getCardTransactions(dateRange?: DateRange): Promise<CardTransaction[]> {\n const { core, pub } = getClients()\n return [] // TODO: implement when card_transactions table exists\n },\n\n // --- Statements (ERP extract: opening balance + realized cash + per-row net/fee) ---\n async getStatement(query: StatementQuery): Promise<StatementResult> {\n const { core, pub } = getClients()\n const today = new Date().toISOString().slice(0, 10)\n // The extract = actual cash events. A cash event is any non-cancelled movement with\n // a payment_date: payment movements, transfers, and legacy in-place-paid bills (which\n // still carry a payment_date until the split migration backfills them). Once a payment\n // movement exists for a bill, payMovement clears the bill's payment_date, so a single\n // cash amount is represented by exactly one row — no double counting, no migration needed.\n\n // No bankAccountId means consolidated: all realized cash, including movements tied to no account.\n const { data: acctRows } = await pub.from('plg_financial_accounts').select('id, name, is_active')\n const allAccounts = (acctRows ?? []) as any[]\n const consolidated = !query.bankAccountId\n const scopeAccounts = consolidated\n ? allAccounts.filter((a) => a.is_active)\n : allAccounts.filter((a) => a.id === query.bankAccountId)\n const accountIds = scopeAccounts.map((a) => a.id)\n const accountNameById = new Map<string, string>(allAccounts.map((a) => [a.id, a.name]))\n if (!consolidated && accountIds.length === 0) return emptyStatement(query.bankAccountId)\n // Consolidated => no account filter (catches NULL-account movements too).\n const scopeFilter = (qb: any) => consolidated ? qb : qb.in('bank_account_id', accountIds)\n const toMovement = (r: Record<string, unknown>) => snakeToCamel(r) as unknown as FinancialMovement\n\n // Opening balances are ledger movements since migration 011, so the prior net is the opening balance.\n const { data: priorRows } = await scopeFilter(pub.from(T.cashMovements)\n .select('*')\n .neq('status', 'cancelled')\n .lt('payment_date', query.dateRange.from))\n const openingBalance = ledgerBalance(0, (priorRows ?? []).map(toMovement))\n\n const { data: movs } = await scopeFilter(pub.from(T.cashMovements)\n .select('*')\n .neq('status', 'cancelled')\n .gte('payment_date', query.dateRange.from).lte('payment_date', query.dateRange.to)\n .order('payment_date').order('created_at'))\n\n const invoiceIds = [...new Set((movs ?? []).map((r: any) => r.invoice_id).filter(Boolean))]\n const invoiceById = new Map<string, Invoice>()\n if (invoiceIds.length) {\n const { data: orders } = await core.from('orders').select('id, party_id, reference_number, metadata').in('id', invoiceIds)\n for (const o of (orders ?? []) as any[]) {\n invoiceById.set(o.id, { id: o.id, contactId: o.party_id, contactName: (o.metadata as any)?.contactName, fiscalNumber: o.reference_number } as Invoice)\n }\n }\n\n const statement = buildStatement({\n openingBalance,\n movements: (movs ?? []).map(toMovement),\n consolidated,\n accountNameOf: (id) => accountNameById.get(id),\n invoiceOf: (movement) => (movement.invoiceId ? invoiceById.get(movement.invoiceId) : undefined),\n })\n const entries = statement.entries\n\n // A matched bank line links to the ledger entry it was reconciled with.\n const matchedIds = [...new Set(entries.map((e) => e.movement.matchedMovementId).filter(Boolean))] as string[]\n if (matchedIds.length) {\n const { data: matched } = await pub.from(T.movements).select('id, invoice_id, notes').in('id', matchedIds)\n const matchedById = new Map<string, any>((matched ?? []).map((m: any) => [m.id, m]))\n const matchedInvoiceIds = [...new Set((matched ?? []).map((m: any) => m.invoice_id).filter(Boolean))] as string[]\n const invById = new Map<string, any>()\n if (matchedInvoiceIds.length) {\n const { data: orders } = await core.from('orders').select('id, reference_number, metadata').in('id', matchedInvoiceIds)\n for (const o of (orders ?? []) as any[]) invById.set(o.id, o)\n }\n for (const e of entries) {\n const mid = e.movement.matchedMovementId\n const mm = mid ? matchedById.get(mid) : undefined\n if (!mm) continue\n const inv = mm.invoice_id ? invById.get(mm.invoice_id) : undefined\n e.reconciledWith = {\n movementId: mm.id,\n description: mm.notes ?? undefined,\n invoiceId: mm.invoice_id ?? undefined,\n fiscalNumber: inv?.reference_number ?? undefined,\n contactName: (inv?.metadata as any)?.contactName ?? undefined,\n }\n }\n }\n\n const { data: todayRows } = await scopeFilter(pub.from(T.cashMovements)\n .select('*')\n .neq('status', 'cancelled')\n .lte('payment_date', today))\n\n return {\n ...statement,\n accountId: query.bankAccountId,\n accountCurrentBalance: ledgerBalance(0, (todayRows ?? []).map(toMovement)),\n }\n },\n\n async getDre(query: DreQuery): Promise<DreRow[]> {\n const { pub } = getClients()\n const columns = 'unit_id,competence_month,direction,account_id,account_code,account_name,account_type,account_parent_id,statement_code,statement_name,unclassified,line_count,amount,discount'\n const rpcResult = await pub.rpc('financial_dre', {\n p_from: `${query.year}-01-01`,\n p_to: `${query.year}-12-31`,\n p_unit_id: query.unitId ?? null,\n })\n if (!rpcResult.error) return (rpcResult.data ?? []).map((row: any) => ({\n unitId: row.unit_id ?? undefined,\n competenceMonth: row.competence_month ?? undefined,\n accountId: row.account_id ?? undefined,\n accountCode: row.account_code ?? undefined,\n accountName: row.account_name ?? undefined,\n accountType: row.account_type,\n parentAccountId: row.account_parent_id ?? undefined,\n statementCode: row.statement_code ?? undefined,\n statementName: row.statement_name ?? undefined,\n unclassified: Boolean(row.unclassified),\n lineCount: Number(row.line_count) || 0,\n amount: Number(row.amount) || 0,\n discount: Number(row.discount) || 0,\n }))\n if (rpcResult.error.code !== 'PGRST202' && rpcResult.error.code !== '42883') throw rpcResult.error\n // One pass over the read model. Running structure and movements as two\n // concurrent selects made Postgres execute the expensive fact branch\n // twice; Pertinho do Céu hit the statement timeout before either won.\n const { data, error } = await pub.from('plg_financial_rep_dre')\n .select(columns)\n .or(`competence_month.is.null,and(competence_month.gte.${query.year}-01-01,competence_month.lte.${query.year}-12-31)`)\n .order('account_code', { ascending: true })\n .order('competence_month', { ascending: true })\n if (error) throw error\n return (data ?? [])\n .filter((row: any) => !row.competence_month || !query.unitId || row.unit_id === query.unitId)\n .map((row: any) => ({\n unitId: row.unit_id ?? undefined,\n competenceMonth: row.competence_month ?? undefined,\n accountId: row.account_id ?? undefined,\n accountCode: row.account_code ?? undefined,\n accountName: row.account_name ?? undefined,\n accountType: row.direction === 'receivable' ? 'revenue' : row.direction === 'payable' ? 'expense' : row.account_type,\n parentAccountId: row.account_parent_id ?? undefined,\n statementCode: row.statement_code ?? undefined,\n statementName: row.statement_name ?? undefined,\n unclassified: Boolean(row.unclassified),\n lineCount: Number(row.line_count) || 0,\n amount: Number(row.amount) || 0,\n discount: Number(row.discount) || 0,\n }))\n },\n\n // --- Summary ---\n // --- Fechamento e prova do livro (006) ---\n async getPeriods(): Promise<FinancialPeriod[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.periods).select('*').order('competence_month', { ascending: false })\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n id: r.id, competenceMonth: r.competence_month, status: r.status,\n closedAt: r.closed_at, reopenReason: r.reopen_reason,\n }))\n },\n\n async closePeriod(month: string, notes?: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_period_close', { p_month: month, p_notes: notes ?? null })\n if (error) throw error\n },\n\n async reopenPeriod(month: string, reason: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_period_reopen', { p_month: month, p_reason: reason })\n if (error) throw error\n },\n\n async getTrialBalance(competenceMonth?: string): Promise<TrialBalanceRow[]> {\n const { pub } = getClients()\n let qb = pub.from(T.trialBalance).select('*')\n if (competenceMonth) qb = qb.eq('competence_month', competenceMonth)\n const { data, error } = await qb.order('account_code')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n accountId: r.account_id, accountCode: r.account_code, accountName: r.account_name,\n competenceMonth: r.competence_month,\n totalDebit: Number(r.total_debit) || 0,\n totalCredit: Number(r.total_credit) || 0,\n balance: Number(r.balance) || 0,\n }))\n },\n\n // --- Cobrança (016) e margem (015) ---\n async getAging(): Promise<AgingRow[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.aging).select('*')\n .eq('direction', 'receivable').order('due_date')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n installmentId: r.installment_id, invoiceNumber: r.invoice_number,\n counterpartyName: r.counterparty_name, dueDate: r.due_date,\n balance: Number(r.balance) || 0, daysOverdue: Number(r.days_overdue) || 0,\n bucket: r.bucket,\n }))\n },\n\n async getMarginByMonth(): Promise<MarginRow[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.marginByMonth).select('*')\n .order('competence_month', { ascending: false })\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n competenceMonth: r.competence_month,\n revenue: Number(r.revenue) || 0,\n cogs: Number(r.cogs) || 0,\n commission: Number(r.commission) || 0,\n margin: Number(r.margin) || 0,\n marginPercent: Number(r.margin_percent) || 0,\n }))\n },\n\n // --- Contas recorrentes (014) ---\n async getRecurringBills(direction: RecurringBillDirection): Promise<RecurringBill[]> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.recurringBills).select('*')\n .eq('direction', direction).order('is_active', { ascending: false }).order('description')\n if (error) throw error\n const rows = data ?? []\n const personIds = [...new Set(rows.map((row: any) => row.counterparty_person_id).filter(Boolean))]\n const names = new Map<string, string>()\n if (personIds.length > 0) {\n const { data: people, error: peopleError } = await pub.from('people').select('id,name').in('id', personIds)\n if (peopleError) throw peopleError\n for (const person of people ?? []) names.set(person.id, person.name)\n }\n return rows.map((row: any) => mapRecurringBill(row, names.get(row.counterparty_person_id) ?? null))\n },\n\n // ------------------------------------------------------------------\n // O PREVISTO, ao lado do LANÇADO.\n //\n // A ocorrência provisionada não é conta: não tem fatura, não entra no\n // razão e não cobra ninguém. Mas ela é o que faz o mês aparecer inteiro na\n // lista — o V1 injeta essas linhas ao lado das contas de verdade, e é\n // olhando as duas juntas que alguém decide o que vira dívida.\n //\n // Linha VIRTUAL, com `id` prefixado: ela não pode colidir com o id de uma\n // parcela nem ser aberta como fatura, porque não há fatura.\n // ------------------------------------------------------------------\n async getProvisionedOccurrences(query: InvoiceQuery): Promise<Invoice[]> {\n const { pub } = getClients()\n const direcao = query.direction === 'debit' ? 'payable' : 'receivable'\n let qb = pub.from(T.recurringOccurrences)\n .select(`id, seq, due_date, competence_date, amount, unit_id, recurring_bill_id,\n ${T.recurringBills}!inner(id, description, notes, direction, counterparty_person_id,\n chart_account_id, cost_center_id, is_active)`)\n .eq('status', 'provisioned')\n .eq(`${T.recurringBills}.direction`, direcao)\n .eq(`${T.recurringBills}.is_active`, true)\n // O RECORTE DA LISTA VALE AQUI TAMBÉM.\n //\n // A previsão não tem fatura, mas tem régua — e a régua é que sabe a quem\n // se paga, em que conta do plano e em que centro de custo. Sem repetir o\n // recorte, filtrar por \"Pagar a: Hamilton\" devolvia as contas dele e o\n // previsto do mês inteiro de todo mundo, o que se lê na tela como \"o\n // filtro não funcionou\".\n if (query.contactId) qb = qb.eq(`${T.recurringBills}.counterparty_person_id`, query.contactId)\n if (query.accountId) qb = qb.eq(`${T.recurringBills}.chart_account_id`, query.accountId)\n if (query.costCenterId) qb = qb.eq(`${T.recurringBills}.cost_center_id`, query.costCenterId)\n // Unidade NULA é da casa inteira, não de nenhuma.\n //\n // Um `eq` puro escondia toda régua cadastrada sem unidade — que é a\n // maioria das recorrências de uma casa de um endereço só. Mesma leitura\n // que a RLS faz em todo lugar: sem unidade, vale para todas.\n if (query.unitId) qb = qb.or(`unit_id.is.null,unit_id.eq.${query.unitId}`)\n if (query.dateRange) {\n qb = qb.gte('due_date', query.dateRange.from.slice(0, 10))\n .lte('due_date', query.dateRange.to.slice(0, 10))\n }\n const { data, error } = await qb.order('due_date', { ascending: true }).limit(200)\n if (error) throw error\n const linhas = data ?? []\n\n // O nome da contraparte numa segunda pergunta, como a lista de contas já\n // faz: a view não o carrega e uma consulta por linha seria uma por mês.\n const pessoaIds = [...new Set(linhas\n .map((row: any) => row[T.recurringBills]?.counterparty_person_id)\n .filter(Boolean))]\n const nomes = new Map<string, string>()\n if (pessoaIds.length > 0) {\n const { data: people } = await pub.from('people').select('id,name').in('id', pessoaIds)\n for (const person of people ?? []) nomes.set(person.id, person.name)\n }\n\n // A BUSCA LIVRE, depois dos nomes: ela casa com a descrição, a observação\n // e QUEM — e o nome não está na régua, chega na pergunta acima. Em\n // memória porque o teto já é de 200 linhas; o recorte caro é o de cima.\n const termo = query.search?.trim().toLocaleLowerCase('pt-BR')\n\n return linhas.filter((row: any) => {\n if (!termo) return true\n const regua = row[T.recurringBills] ?? {}\n const nome = regua.counterparty_person_id ? nomes.get(regua.counterparty_person_id) : ''\n return [regua.description, regua.notes, nome]\n .some((campo) => (campo ?? '').toLocaleLowerCase('pt-BR').includes(termo))\n }).map((row: any) => {\n const regua = row[T.recurringBills] ?? {}\n return {\n id: `occ:${row.id}`,\n direction: query.direction ?? 'debit',\n invoiceDate: row.competence_date ?? row.due_date,\n dueDate: row.due_date,\n totalAmount: Number(row.amount) || 0,\n paidAmount: 0,\n status: 'provisioned' as const,\n totalInstallments: 1,\n installmentNumber: row.seq ?? 1,\n contactId: regua.counterparty_person_id ?? undefined,\n contactName: regua.counterparty_person_id ? nomes.get(regua.counterparty_person_id) : undefined,\n unitId: row.unit_id ?? undefined,\n itemsSummary: regua.description ?? undefined,\n isProvisionedOccurrence: true,\n occurrenceId: row.id,\n recurringBillId: row.recurring_bill_id,\n tenantId: '',\n createdAt: row.due_date,\n updatedAt: row.due_date,\n } as Invoice\n })\n },\n\n async consolidateOccurrence(occurrenceId: string): Promise<string | null> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_consolidate_occurrence', {\n p_occurrence_id: occurrenceId,\n })\n if (error) throw new Error(error.message)\n return (data as { invoice_id?: string } | null)?.invoice_id ?? null\n },\n\n async saveRecurringBill(input: SaveRecurringBillInput): Promise<RecurringBill> {\n const { pub } = getClients()\n const row = {\n direction: input.direction,\n description: input.description.trim(),\n counterparty_person_id: input.counterpartyPersonId,\n amount: round2(input.amount),\n items: input.items,\n unit_id: input.unitId || null,\n chart_account_id: input.chartAccountId || null,\n cost_center_id: input.costCenterId || null,\n frequency: input.frequency,\n due_day: input.dueDay,\n starts_on: input.startsOn,\n ends_on: input.endsOn || null,\n is_active: input.isActive ?? true,\n notes: input.notes?.trim() || null,\n }\n const request = input.id\n ? pub.from(T.recurringBills).update(row).eq('id', input.id)\n : pub.from(T.recurringBills).insert({ ...row, tenant_id: getActiveTenantId() })\n const { data, error } = await request.select('*').single()\n if (error) throw error\n return mapRecurringBill(data)\n },\n\n /**\n * Provisiona os vencimentos futuros de uma régua.\n *\n * Chamado logo depois de salvar: sem isto a recorrência cadastrada hoje não\n * aparece como previsto em lugar nenhum — ela só existiria no dia em que\n * alguém rodasse a rotina, já como dívida.\n */\n async provisionRecurringBill(billId: string): Promise<number> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_recurring_provision', { p_bill_id: billId })\n if (error) throw new Error(error.message)\n return (data as { provisioned?: number } | null)?.provisioned ?? 0\n },\n\n async updateRecurringBill(id, patch): Promise<void> {\n const { pub } = getClients()\n const row: Record<string, unknown> = {}\n if (patch.isActive !== undefined) row.is_active = patch.isActive\n if (patch.endsOn !== undefined) row.ends_on = patch.endsOn\n const { error } = await pub.from(T.recurringBills).update(row).eq('id', id)\n if (error) throw error\n },\n\n async runRecurring(through?: string): Promise<{ created: number; total: number }> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_recurring_run', { p_through: through ?? null })\n if (error) throw error\n return { created: Number((data as any)?.created) || 0, total: Number((data as any)?.total) || 0 }\n },\n\n // --- Commissions (009) ---\n async getCommissions(query: CommissionQuery): Promise<CommissionEntry[]> {\n const { pub } = getClients()\n let qb = pub.from(T.commissions).select('*')\n if (query.periodStart) qb = qb.gte('competence_date', query.periodStart)\n if (query.periodEnd) qb = qb.lte('competence_date', query.periodEnd)\n if (query.personId) qb = qb.eq('person_id', query.personId)\n if (query.status) qb = qb.eq('status', query.status)\n const { data, error } = await qb.order('competence_date', { ascending: false })\n // Erro é erro: um `const { data }` sem checagem transforma 400 em \"não há\n // comissão\", que é a resposta mais cara possível numa tela de dinheiro.\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n id: r.id,\n personId: r.person_id,\n personName: r.person_name,\n itemId: r.item_id,\n itemName: r.item_name,\n orderId: r.order_id,\n invoiceId: r.invoice_id,\n invoiceNumber: r.invoice_number,\n competenceDate: r.competence_date,\n ruleName: r.rule_name,\n functionName: r.function_name,\n baseAmount: Number(r.base_amount) || 0,\n rate: Number(r.rate) || 0,\n amount: Number(r.amount) || 0,\n share: Number(r.share) || 1,\n role: r.role,\n status: r.status,\n }))\n },\n\n async generateCommissions(input: GenerateCommissionsInput): Promise<CommissionGenerationResult> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_commission_generate', {\n p_period_start: input.periodStart,\n p_period_end: input.periodEnd,\n p_unit_id: input.unitId ?? null,\n })\n if (error) throw error\n return {\n generationId: (data as any)?.generation_id,\n entries: Number((data as any)?.entries) || 0,\n total: Number((data as any)?.total) || 0,\n }\n },\n\n\n // ── As regras de comissão: a política que Configurações edita ────────────\n //\n // Numa consulta só, com critérios e funções aninhados, como o V1 faz. O\n // funil da tela simula qual regra venceria para uma combinação, e para isso\n // precisa de TODAS as regras inteiras em memória — buscar função por regra\n // seria N+1 a cada troca de filtro.\n async getCommissionRules(): Promise<CommissionRule[]> {\n const { pub } = getClients()\n const { data, error } = await pub\n .from(T.commissionRules)\n .select(`*, ${T.commissionRuleCriteria}(*), ${T.commissionFunctions}(*)`)\n .order('priority', { ascending: false })\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n id: r.id,\n name: r.name,\n description: r.description,\n priority: Number(r.priority) || 0,\n isDefault: !!r.is_default,\n isActive: !!r.is_active,\n unitId: r.unit_id,\n valueType: r.value_type ?? 'percentage',\n value: Number(r.value) || 0,\n criteria: (r[T.commissionRuleCriteria] ?? []).map((c: any) => ({\n id: c.id,\n criteriaType: c.criteria_type,\n criteriaValue: c.criteria_value ?? {},\n })),\n functions: (r[T.commissionFunctions] ?? [])\n .slice()\n .sort((a: any, b: any) => (a.display_order ?? 0) - (b.display_order ?? 0))\n .map((f: any) => ({\n id: f.id,\n ruleId: f.rule_id,\n functionName: f.function_name,\n accountType: f.account_type,\n personId: f.person_id,\n valueType: f.value_type,\n // numeric(14,4) chega como string no PostgREST; `Number` aqui evita\n // o \"R$ NaN\" que já apareceu nos cartões por somar string.\n valueAmount: Number(f.value_amount) || 0,\n calculationBase: f.calculation_base,\n tierMode: f.tier_mode,\n minGuaranteed: f.min_guaranteed == null ? null : Number(f.min_guaranteed),\n tiers: Array.isArray(f.tiers) ? f.tiers : [],\n isVariable: !!f.is_variable,\n displayOrder: f.display_order ?? 0,\n isActive: !!f.is_active,\n })),\n }))\n },\n\n async saveCommissionRule(input: CommissionRuleInput): Promise<string> {\n const { pub } = getClients()\n const row: Record<string, unknown> = {\n name: input.name,\n description: input.description ?? null,\n priority: input.priority,\n is_default: input.isDefault ?? false,\n is_active: input.isActive ?? true,\n unit_id: input.unitId ?? null,\n }\n\n let ruleId = input.id\n if (ruleId) {\n const { error } = await pub.from(T.commissionRules).update(row).eq('id', ruleId)\n if (error) throw error\n } else {\n // `tenant_id` explícito: a política de INSERT exige\n // `tenant_id = app.current_tenant_id()`, a coluna não tem default, e sem\n // ele o INSERT volta como \"new row violates row-level security policy\" —\n // que se lê como falta de permissão quando é só uma coluna faltando.\n const { data, error } = await pub\n .from(T.commissionRules)\n .insert({ ...row, tenant_id: getActiveTenantId() })\n .select('id').single()\n if (error) throw error\n ruleId = (data as any).id\n }\n\n // Os critérios são SUBSTITUÍDOS, não mesclados: desmarcar o último serviço\n // de uma regra tem de apagar o critério, e um upsert deixaria a linha\n // velha lá — a regra continuaria restringindo por um serviço que sumiu da\n // tela. `UNIQUE (rule_id, criteria_type)` também não perdoa merge.\n if (input.criteria) {\n const { error: delErr } = await pub\n .from(T.commissionRuleCriteria).delete().eq('rule_id', ruleId)\n if (delErr) throw delErr\n // Critério vazio não é critério: gravá-lo tornaria a regra mais\n // \"específica\" sem restringir nada, e a especificidade é o que ordena.\n const rows = input.criteria\n .filter((c) => hasCriteriaValue(c.criteriaValue))\n .map((c) => ({ tenant_id: getActiveTenantId(), rule_id: ruleId, criteria_type: c.criteriaType, criteria_value: c.criteriaValue }))\n if (rows.length) {\n const { error } = await pub.from(T.commissionRuleCriteria).insert(rows)\n if (error) throw error\n }\n }\n return ruleId as string\n },\n\n async saveCommissionFunctions(ruleId: string, functions: CommissionFunction[]): Promise<void> {\n const { pub } = getClients()\n const { error: delErr } = await pub\n .from(T.commissionFunctions).delete().eq('rule_id', ruleId)\n if (delErr) throw delErr\n if (!functions.length) return\n const rows = functions.map((f, i) => ({\n tenant_id: getActiveTenantId(),\n rule_id: ruleId,\n function_name: f.functionName,\n account_type: f.accountType,\n person_id: f.personId ?? null,\n value_type: f.valueType,\n value_amount: f.valueAmount,\n calculation_base: f.calculationBase,\n tier_mode: f.tierMode,\n // O piso só existe na faixa que o usa; guardá-lo nas outras deixaria um\n // número invisível na tela e ativo no cálculo se a faixa mudasse.\n min_guaranteed: f.tierMode === 'guaranteed_min' ? (f.minGuaranteed ?? 0) : null,\n tiers: f.tierMode === 'marginal' || f.tierMode === 'retroactive' ? f.tiers : [],\n is_variable: f.isVariable,\n display_order: i,\n is_active: f.isActive,\n }))\n const { error } = await pub.from(T.commissionFunctions).insert(rows)\n if (error) throw error\n },\n\n async deleteCommissionRule(id: string): Promise<void> {\n const { pub } = getClients()\n // Critérios e funções caem por FK ON DELETE CASCADE (008).\n const { error } = await pub.from(T.commissionRules).delete().eq('id', id)\n if (error) throw error\n },\n\n async duplicateCommissionRule(id: string): Promise<string> {\n const { pub } = getClients()\n const { data, error } = await pub\n .from(T.commissionRules)\n .select(`*, ${T.commissionRuleCriteria}(*), ${T.commissionFunctions}(*)`)\n .eq('id', id).single()\n if (error) throw error\n const src: any = data\n\n // A cópia NUNCA é a padrão: duas padrões e a casa passa a ter duas\n // respostas para \"o que vale quando nada casa\".\n const { data: created, error: insErr } = await pub.from(T.commissionRules).insert({\n tenant_id: getActiveTenantId(),\n name: `${src.name} (cópia)`,\n description: src.description,\n priority: src.priority,\n is_default: false,\n is_active: false,\n unit_id: src.unit_id,\n value_type: src.value_type,\n value: src.value,\n }).select('id').single()\n if (insErr) throw insErr\n const newId = (created as any).id\n\n const crit = (src[T.commissionRuleCriteria] ?? []).map((c: any) => ({\n tenant_id: getActiveTenantId(), rule_id: newId,\n criteria_type: c.criteria_type, criteria_value: c.criteria_value,\n }))\n if (crit.length) {\n const { error: e } = await pub.from(T.commissionRuleCriteria).insert(crit)\n if (e) throw e\n }\n const fns = (src[T.commissionFunctions] ?? []).map((f: any) => ({\n tenant_id: getActiveTenantId(), rule_id: newId,\n function_name: f.function_name, account_type: f.account_type,\n person_id: f.person_id, value_type: f.value_type, value_amount: f.value_amount,\n calculation_base: f.calculation_base, tier_mode: f.tier_mode,\n min_guaranteed: f.min_guaranteed, tiers: f.tiers,\n is_variable: f.is_variable, display_order: f.display_order, is_active: f.is_active,\n }))\n if (fns.length) {\n const { error: e } = await pub.from(T.commissionFunctions).insert(fns)\n if (e) throw e\n }\n return newId\n },\n\n async getCommissionCatalogs(): Promise<CommissionCatalogs> {\n const { pub } = getClients()\n // Quatro consultas em paralelo, uma vez, na abertura da tela: o funil\n // resolve em memória e não pode ir à rede a cada troca de filtro.\n const [svc, cat, ppl, unt] = await Promise.all([\n pub.from('products').select('id,name,category_id').eq('is_active', true).order('name'),\n pub.from('categories').select('id,name').eq('is_active', true).order('name'),\n // `kind = 'staff'` é quem executa; a lista de critério não é a agenda de\n // clientes, e oferecer os dois juntos é como se escolhe o errado.\n pub.from('people').select('id,name').eq('kind', 'staff').eq('is_active', true).order('name'),\n pub.from('v_units').select('id,name').eq('is_active', true).order('name'),\n ])\n return {\n services: (svc.data ?? []).map((r: any) => ({ id: r.id, name: r.name, categoryId: r.category_id })),\n categories: (cat.data ?? []).map((r: any) => ({ id: r.id, name: r.name })),\n professionals: (ppl.data ?? []).map((r: any) => ({ id: r.id, name: r.name })),\n units: (unt.data ?? []).map((r: any) => ({ id: r.id, name: r.name })),\n }\n },\n\n // ── O caminho do apurado até o dinheiro sair ────────────────────────────\n //\n // São TRÊS passos e três decisões, e o V2 só tinha o primeiro ligado:\n // apurar (gera os lançamentos), aprovar (autoriza), e o borderô (levanta\n // uma conta a pagar por pessoa). \"Apurar não é autorizar\" está no próprio\n // comentário da 012 — quem confere pode não ser quem manda pagar.\n async getCommissionGenerations(): Promise<CommissionGeneration[]> {\n const { pub } = getClients()\n const { data, error } = await pub\n .from(T.commissionGenerations)\n .select('*')\n .order('created_at', { ascending: false })\n .limit(20)\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n id: r.id,\n periodStart: r.period_start,\n periodEnd: r.period_end,\n status: r.status,\n // `total_amount` e `entry_count`, conferidos no schema — não `total`\n // nem `entries`, que era o palpite pelo nome do campo do resultado.\n total: Number(r.total_amount) || 0,\n entries: Number(r.entry_count) || 0,\n }))\n },\n\n async approveCommissions(generationId: string): Promise<CommissionApproveResult> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_commission_approve', {\n p_generation_id: generationId,\n })\n if (error) throw error\n return {\n generationId: (data as any)?.generation_id ?? generationId,\n approved: Number((data as any)?.approved) || 0,\n }\n },\n\n async payRunCommissions(generationId: string, dueDate?: string): Promise<CommissionPayRunResult> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_commission_pay_run', {\n p_generation_id: generationId,\n p_due_date: dueDate ?? null,\n })\n if (error) throw error\n return {\n generationId: (data as any)?.generation_id ?? generationId,\n payables: Number((data as any)?.payables) || 0,\n total: Number((data as any)?.total) || 0,\n dueDate: (data as any)?.due_date,\n }\n },\n\n // ── Metas: três degraus por mês, e o realizado vem do livro ─────────────\n // ── Conferência de caixa ────────────────────────────────────────────────\n async getCashSessionReviews(): Promise<CashSessionReview[]> {\n const { pub } = getClients()\n const { data, error } = await pub\n .from('v_financial_cash_session_review')\n .select('*')\n .order('closed_at', { ascending: false })\n .limit(200)\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n sessionId: r.session_id,\n unitId: r.unit_id,\n openedAt: r.opened_at,\n closedAt: r.closed_at,\n openedByName: r.opened_by_name,\n closedByName: r.closed_by_name,\n closedByUserId: r.closed_by_user_id,\n openingBalance: Number(r.opening_balance) || 0,\n closingBalance: Number(r.closing_balance) || 0,\n difference: Number(r.difference) || 0,\n reviewStatus: r.review_status,\n reviewedAt: r.reviewed_at,\n reviewerName: r.reviewer_name,\n reviewNotes: r.review_notes,\n }))\n },\n\n async reviewCashSession(sessionId: string, verdict: 'approved' | 'rejected', notes?: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_cash_session_review', {\n p_session_id: sessionId, p_verdict: verdict, p_notes: notes ?? null,\n })\n if (error) throw error\n },\n\n async getGoalYear(unitId: string, year: number): Promise<GoalMonth[]> {\n const { pub } = getClients()\n const { data, error } = await pub\n .from('v_financial_goal_year')\n .select('*')\n .eq('unit_id', unitId)\n .eq('year', year)\n .order('month')\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n goalId: r.goal_id,\n unitId: r.unit_id,\n year: Number(r.year),\n month: Number(r.month),\n targetAmount: Number(r.target_amount) || 0,\n superAmount: Number(r.super_amount) || 0,\n hyperAmount: Number(r.hyper_amount) || 0,\n achievedAmount: Number(r.achieved_amount) || 0,\n targetPercent: Number(r.target_percent) || 0,\n superPercent: Number(r.super_percent) || 0,\n hyperPercent: Number(r.hyper_percent) || 0,\n notes: r.notes,\n }))\n },\n\n async saveGoal(input: SaveGoalInput): Promise<void> {\n const { pub } = getClients()\n const row = {\n tenant_id: getActiveTenantId(),\n unit_id: input.unitId,\n year: input.year,\n month: input.month,\n target_amount: input.targetAmount,\n super_amount: input.superAmount,\n hyper_amount: input.hyperAmount,\n notes: input.notes ?? null,\n }\n // `upsert` pela chave do mês: a tela edita o mês, não um registro que a\n // pessoa precise saber que existe. Cadastrar de novo o mesmo mês é\n // corrigir a meta, não criar uma segunda.\n const { error } = await pub\n .from('plg_financial_goals')\n .upsert(row, { onConflict: 'tenant_id,unit_id,year,month' })\n if (error) throw error\n },\n\n async deleteGoal(id: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.from('plg_financial_goals').delete().eq('id', id)\n if (error) throw error\n },\n\n // --- Vales-presente (027) ---\n // O cartão mora na loja; o Financeiro entra por RPC própria, que filtra por\n // tenant e permissão. Ler a tabela direto daqui daria de brinde a loja\n // inteira a quem só tem financial.read.\n\n async giftCardsEnabled(): Promise<boolean> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_gift_cards_enabled')\n if (error) throw error\n return data === true\n },\n\n async getGiftCards(query?: GiftCardQuery): Promise<GiftCard[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_gift_cards', {\n p_search: query?.search?.trim() || null,\n p_state: query?.state ?? null,\n p_min: query?.minValue ?? null,\n p_max: query?.maxValue ?? null,\n p_from: query?.issuedFrom || null,\n p_to: query?.issuedTo || null,\n p_limit: 500,\n })\n if (error) throw error\n return (data ?? []).map((r: any) => ({\n id: r.id,\n code: r.code,\n faceValue: Number(r.face_value) || 0,\n // NULL atravessa como NULL: é \"nunca ativado\", e virar 0 aqui apagaria\n // a única diferença que esta tela existe para mostrar.\n balance: r.balance == null ? null : Number(r.balance),\n state: r.state,\n currency: r.currency,\n issuedAt: r.issued_at,\n expiresAt: r.expires_at,\n activatedAt: r.activated_at,\n note: r.note,\n customerEmail: r.customer_email,\n }))\n },\n\n async findGiftCardByCode(raw: string): Promise<GiftCard | null> {\n const code = raw.replace(/[\\s.-]/g, '').toUpperCase()\n if (!code) return null\n const { pub } = getClients()\n let { data, error } = await pub.rpc('financial_gift_card_by_code', { p_code: code })\n // Until migration 118 is applied: the substring RPC, capped so a partial\n // code pulls as few other cards as possible.\n if (error?.code === 'PGRST202') {\n ({ data, error } = await pub.rpc('financial_gift_cards', { p_search: code, p_limit: 5 }))\n }\n if (error) throw error\n const row = (data ?? []).find((r: any) => String(r.code).toUpperCase() === code)\n if (!row) return null\n return {\n id: row.id,\n code: row.code,\n faceValue: Number(row.face_value) || 0,\n balance: row.balance == null ? null : Number(row.balance),\n state: row.state,\n currency: row.currency,\n issuedAt: row.issued_at,\n expiresAt: row.expires_at,\n activatedAt: row.activated_at,\n note: row.note,\n customerEmail: row.customer_email,\n }\n },\n\n async issueGiftCards(input: IssueGiftCardsInput): Promise<string[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('financial_issue_gift_cards', {\n p_quantity: input.quantity,\n p_amount: input.unitAmount,\n p_expires_at: input.expiresAt || null,\n p_note: input.note || null,\n })\n if (error) throw error\n return (data ?? []).map((r: any) => r.code)\n },\n\n async activateGiftCard(id: string): Promise<void> {\n const { pub } = getClients()\n const { error } = await pub.rpc('financial_activate_gift_card', { p_id: id })\n if (error) throw error\n },\n\n async getSummary(dateRange?: DateRange): Promise<FinancialSummary> {\n const { pub } = getClients()\n // NINE NUMBERS, ONE ROW.\n //\n // This used to `select('direction, movement_kind, amount, …')` off\n // plg_financial_movements with no filter and no limit, then reduce in\n // JavaScript. It worked at a few thousand rows; Espaço Facial has\n // 276.360, and the card turned into a 500 — query time, response size\n // and browser memory all at once, on a phone.\n //\n // Every one of the nine is an AGGREGATE, so none of them needs the rows.\n // `financial_summary` (migration 077) is that same arithmetic in SQL,\n // SECURITY INVOKER so the unit fence still applies, and it returns one\n // row. See the migration for how each expression maps to the `.reduce()`\n // it replaced.\n const n = (v: unknown) => Number(v) || 0\n const args = { p_from: dateRange?.from ?? null, p_to: dateRange?.to ?? null }\n // One row per currency, each with its rate to the house's (125). A pool\n // that has not taken 125 yet still answers the single-row door below.\n let split = await pub.rpc('financial_summary_by_currency', args)\n if (!split.error && Array.isArray(split.data)) {\n // A currency in use with no rate on file: fetch the day's reference\n // rate once and read again, so nobody has to type it.\n const missing = (split.data as any[]).filter((r) => r.fx_rate === null || r.fx_rate === undefined)\n if (missing.length > 0) {\n const house = String(missing[0].house_currency)\n const tenantId = getActiveTenantId()\n if (tenantId && await ensureReferenceRates(pub, tenantId, house, missing.map((r) => String(r.currency)))) {\n const again = await pub.rpc('financial_summary_by_currency', args)\n if (!again.error && Array.isArray(again.data)) split = again\n }\n }\n const total = { totalBalance: 0, totalReceivable: 0, totalPayable: 0, monthlyInflow: 0, monthlyOutflow: 0,\n overdueReceivableCount: 0, overdueReceivableAmount: 0, overduePayableCount: 0, overduePayableAmount: 0 }\n const excluded: NonNullable<FinancialSummary['excluded']> = []\n for (const r of split.data as any[]) {\n total.overdueReceivableCount += n(r.overdue_receivable_count)\n total.overduePayableCount += n(r.overdue_payable_count)\n if (r.fx_rate === null || r.fx_rate === undefined) {\n const left = { currency: String(r.currency), balance: n(r.total_balance), receivable: n(r.total_receivable),\n payable: n(r.total_payable), inflow: n(r.monthly_inflow), outflow: n(r.monthly_outflow) }\n if (left.balance || left.receivable || left.payable || left.inflow || left.outflow) excluded.push(left)\n continue\n }\n const rate = n(r.fx_rate)\n total.totalBalance += n(r.total_balance) * rate\n total.totalReceivable += n(r.total_receivable) * rate\n total.totalPayable += n(r.total_payable) * rate\n total.monthlyInflow += n(r.monthly_inflow) * rate\n total.monthlyOutflow += n(r.monthly_outflow) * rate\n total.overdueReceivableAmount += n(r.overdue_receivable_amount) * rate\n total.overduePayableAmount += n(r.overdue_payable_amount) * rate\n }\n const cents = (v: number) => Math.round(v * 100) / 100\n return {\n totalBalance: cents(total.totalBalance), totalReceivable: cents(total.totalReceivable), totalPayable: cents(total.totalPayable),\n monthlyInflow: cents(total.monthlyInflow), monthlyOutflow: cents(total.monthlyOutflow),\n overdueReceivableCount: total.overdueReceivableCount, overdueReceivableAmount: cents(total.overdueReceivableAmount),\n overduePayableCount: total.overduePayableCount, overduePayableAmount: cents(total.overduePayableAmount),\n ...(excluded.length ? { excluded } : {}),\n }\n }\n const { data, error } = await pub.rpc('financial_summary', args)\n if (error) throw error\n const row = (Array.isArray(data) ? data[0] : data) ?? {}\n return {\n totalBalance: n(row.total_balance),\n totalReceivable: n(row.total_receivable),\n totalPayable: n(row.total_payable),\n monthlyInflow: n(row.monthly_inflow),\n monthlyOutflow: n(row.monthly_outflow),\n overdueReceivableCount: n(row.overdue_receivable_count),\n overdueReceivableAmount: n(row.overdue_receivable_amount),\n overduePayableCount: n(row.overdue_payable_count),\n overduePayableAmount: n(row.overdue_payable_amount),\n }\n },\n\n // --- Conciliação Bancária ---\n //\n // A linha do extrato mora em `plg_financial_bank_statement_lines` e NÃO em\n // `plg_financial_movements`. A migration 112 conta a história inteira; o\n // resumo é que uma linha recém-chegada não tem as duas pernas que\n // `plg_financial_movements_legs_check` exige, porque ainda não se sabe\n // contra o quê ela lança — e era por isso que todo INSERT do import antigo\n // era recusado pelo banco enquanto os testes do mock passavam.\n async importBankTransactions(input) {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n const rows = input.lines.map((line) => ({\n tenant_id: tenantId,\n bank_account_id: line.bankAccountId ?? input.bankAccountId ?? null,\n external_id: line.externalId,\n external_source: line.externalSource,\n posted_on: line.date,\n effective_at: line.effectiveAt ?? null,\n direction: line.direction,\n amount: Math.abs(line.amount),\n balance_after: line.balanceAfter ?? null,\n description: line.description,\n counterparty_name: line.counterpartyName ?? null,\n counterparty_document: line.counterpartyDocument ?? null,\n document: line.document ?? null,\n code: line.code ?? null,\n category: line.category ?? null,\n transaction_type: line.transactionType ?? null,\n raw_payload: line.rawPayload ?? null,\n }))\n if (rows.length === 0) return { imported: 0, duplicates: 0 }\n // `ignoreDuplicates` sobre a identidade externa: reimportar o mesmo\n // período é o caso NORMAL de «Sincronizar agora», não um erro. Sem isto\n // a segunda sincronização do mês estoura no meio e deixa metade dentro.\n const { data, error } = await pub.from(T.statementLines)\n .upsert(rows, { onConflict: 'tenant_id,external_source,external_id', ignoreDuplicates: true })\n .select('id')\n if (error) throw error\n const imported = (data ?? []).length\n return { imported, duplicates: rows.length - imported }\n },\n\n // A lista da tela. Ela mostra o extrato INTEIRO do período — pendente e\n // conciliado — porque conferir o que se conciliou ontem é parte do\n // trabalho, e uma tela que só mostra pendência esconde o próprio resultado.\n async getStatementLines(query) {\n const { pub } = getClients()\n const { page, pageSize } = statementLinesPage(query)\n const from = (page - 1) * pageSize\n let qb = pub.from(T.statementLines).select('*', { count: 'exact' })\n .eq('provider_deleted', false)\n if (query?.bankAccountId) qb = qb.eq('bank_account_id', query.bankAccountId)\n if (query?.dateRange) qb = qb.gte('posted_on', query.dateRange.from).lte('posted_on', query.dateRange.to)\n if (query?.direction) qb = qb.eq('direction', query.direction)\n if (query?.status === 'reconciled') qb = qb.not('reconciled_at', 'is', null)\n else if (query?.status === 'pending') qb = qb.is('reconciled_at', null)\n const term = (query?.search ?? '').trim()\n if (term) {\n // Vírgula e parêntese partem a lista do `or` do PostgREST ao meio, e o\n // que sobra vira um filtro que casa com nada, em silêncio.\n const safe = term.replace(/[,()*%]/g, ' ')\n qb = qb.or([\n `description.ilike.%${safe}%`,\n `counterparty_name.ilike.%${safe}%`,\n `counterparty_document.ilike.%${safe}%`,\n `document.ilike.%${safe}%`,\n `code.ilike.%${safe}%`,\n `category.ilike.%${safe}%`,\n `transaction_type.ilike.%${safe}%`,\n `external_id.ilike.%${safe}%`,\n ].join(','))\n }\n // Sweeps to and from the investment account are money the business never\n // spent or earned; most days they are half of an itaú statement.\n if (query?.hideInvestments) qb = qb.or(`code.is.null,code.not.in.(${INVESTMENT_CODES.join(',')})`)\n const { data, error, count } = await qb\n .order('posted_on', { ascending: false })\n .order('id', { ascending: false })\n .range(from, from + pageSize - 1)\n if (error) throw error\n const rows = (data ?? []).map(toStatementLine)\n await anexaContraparte(rows)\n return { rows, total: count ?? 0, page, pageSize, ...pageTotals(rows) }\n },\n\n async getUnreconciled(query) {\n const { pub } = getClients()\n let qb = pub.from(T.statementLines).select('*')\n .is('reconciled_at', null)\n .eq('provider_deleted', false)\n if (query?.bankAccountId) qb = qb.eq('bank_account_id', query.bankAccountId)\n if (query?.dateRange) qb = qb.gte('posted_on', query.dateRange.from).lte('posted_on', query.dateRange.to)\n const { data, error } = await qb.order('posted_on', { ascending: false })\n if (error) throw error\n return (data ?? []).map(toStatementLine)\n },\n\n async suggestReconciliation(statementLineId) {\n const { core, pub } = getClients()\n const { data: line } = await pub.from(T.statementLines).select('*').eq('id', statementLineId).single()\n if (!line) return []\n const amount = Number(line.amount) || 0\n const lineDate = line.posted_on\n // Candidatos: movimento nativo, mesma direção, ainda não conciliado,\n // valor dentro de ±2%.\n const tol = candidateTolerance(amount)\n const { data, error } = await pub.from(T.movements).select('*')\n .is('external_source', null)\n .is('reconciled_at', null)\n .eq('direction', line.direction)\n .gte('amount', round2(amount - tol))\n .lte('amount', round2(amount + tol))\n .limit(25)\n if (error) throw error\n const candidates = ((data ?? []) as any[]).map((r): ReconciliationCandidate => {\n const movement = snakeToCamel(r) as unknown as FinancialMovement\n return { movement, score: candidateScore({ amount, date: lineDate }, movement) }\n }).sort((a, b) => b.score - a.score)\n // Nome da contraparte, para a linha do candidato dizer de quem ela é.\n const invoiceIds = [...new Set(candidates.map((c) => c.movement.invoiceId).filter(Boolean))] as string[]\n if (invoiceIds.length) {\n const { data: orders } = await core.from('orders').select('id, reference_number, metadata').in('id', invoiceIds)\n const byId = new Map<string, any>((orders ?? []).map((o: any) => [o.id, o]))\n for (const c of candidates) {\n const o = c.movement.invoiceId ? byId.get(c.movement.invoiceId) : undefined\n if (o) c.invoice = { id: o.id, contactName: (o.metadata as any)?.contactName, fiscalNumber: o.reference_number } as Invoice\n }\n }\n // Open bills in the same band — the payable the line most likely settles.\n const linha = { id: line.id, amount, date: lineDate, direction: line.direction, externalSource: line.external_source } as ReconcileLine\n const abertas = await searchBillTargets(linha, {\n status: 'open', amountMin: round2(amount - tol), amountMax: round2(amount + tol), pageSize: 25,\n }).catch(() => ({ data: [] as ReconciliationCandidate[], hasMore: false }))\n return [...candidates, ...abertas.data].sort((a, b) => b.score - a.score)\n },\n\n async searchReconciliationTargets(statementLineId, query) {\n return searchBillTargets(await readStatementLine(statementLineId), query)\n },\n\n // ------------------------------------------------------------------\n // A SUGESTÃO QUE CHEGA SOZINHA, para a página inteira.\n //\n // DUAS perguntas ao banco para cinquenta linhas, e não duas por linha:\n //\n // 1. os lançamentos nativos em aberto cujo valor cabe em ALGUMA das\n // faixas de ±2% da página (um `or` só, com uma faixa por valor\n // distinto — o PostgREST aceita um `or` por consulta);\n // 2. o nome de quem, para os documentos desses lançamentos.\n //\n // O cruzamento é em memória (ver match-statement.ts): valor, nome e data,\n // e nenhum lançamento oferecido a duas linhas.\n // ------------------------------------------------------------------\n async syncStatements(input) {\n const { pub } = getClients()\n const { data, error } = await pub.functions.invoke('financial-statement-sync', {\n body: { accountId: input?.bankAccountId, tenantId: getActiveTenantId() ?? null },\n })\n if (error) {\n let body: any = null\n try { body = await (error as any)?.context?.json?.() } catch { /* generic below */ }\n throw new Error(body?.error || error.message || 'Não foi possível buscar o extrato do banco.')\n }\n const results = (data?.results ?? []) as Array<{ error?: string | null }>\n return {\n imported: Number(data?.imported ?? 0),\n failed: Number(data?.failed ?? 0),\n errors: results.map((r) => r.error).filter((e): e is string => Boolean(e)),\n }\n },\n\n async suggestReconciliationBatch(lines) {\n const { core, pub } = getClients()\n const abertas = lines.filter((line) => !line.reconciledAt && (Number(line.amount) || 0) > 0)\n if (abertas.length === 0) return {}\n\n // Uma faixa por VALOR distinto: cinquenta linhas de extrato costumam ter\n // bem menos que cinquenta valores diferentes, e uma faixa global de\n // R$ 60 a R$ 10.000 traria o mês inteiro para escolher três.\n // ±10%, not ±2%: a known supplier may come with interest or a discount.\n // scorePair still refuses anything past ±2% without the name.\n const faixas = [...new Set(abertas.map((line) => round2(line.amount)))].map((valor) => {\n const tol = Math.max(0.01, round2(valor * NAME_AMOUNT_TOLERANCE))\n return `and(amount.gte.${round2(valor - tol)},amount.lte.${round2(valor + tol)})`\n })\n const direcoes = [...new Set(abertas.map((line) => line.direction))]\n\n const { data, error } = await pub.from(T.movements).select('*')\n .is('external_source', null)\n .is('reconciled_at', null)\n .in('direction', direcoes)\n .or(faixas.join(','))\n .limit(500)\n if (error) throw error\n const movimentos = ((data ?? []) as any[]).map((r) => snakeToCamel(r) as unknown as FinancialMovement)\n\n // Open bills live in installments, not movements — without this read the\n // card never suggested the payable the line is actually paying.\n const datas = abertas.map((line) => line.date).filter(Boolean).sort()\n const contexto = new Map<string, MovementContext>()\n if (datas.length) {\n const { data: billRows } = await pub.from('v_financial_invoice_lines_due')\n .select('installment_id,invoice_id,direction,number,due_date,description,counterparty_name,installment_number,amount,paid,status')\n .in('direction', direcoes.map((d) => (d === 'debit' ? 'payable' : 'receivable')))\n .in('status', ['pending', 'partial', 'overdue'])\n .gte('due_date', shiftIsoDate(datas[0], -30))\n .lte('due_date', shiftIsoDate(datas[datas.length - 1], 30))\n .or(faixas.join(','))\n .limit(500)\n for (const r of (billRows ?? []) as any[]) {\n movimentos.push({\n id: r.installment_id,\n invoiceId: r.invoice_id,\n direction: r.direction === 'payable' ? 'debit' : 'credit',\n movementKind: 'bill',\n amount: Number(r.amount) || 0,\n paidAmount: Number(r.paid) || 0,\n status: r.status,\n dueDate: r.due_date,\n installmentNumber: r.installment_number ?? undefined,\n notes: r.description ?? undefined,\n } as unknown as FinancialMovement)\n contexto.set(r.installment_id, {\n contactName: r.counterparty_name ?? undefined,\n invoice: { id: r.invoice_id, contactName: r.counterparty_name ?? undefined, fiscalNumber: r.number ?? undefined } as Invoice,\n })\n }\n }\n if (movimentos.length === 0) return {}\n\n // O NOME É O SINAL QUE DESEMPATA, então ele vem ANTES de pontuar — era\n // isto que a versão de uma linha fazia depois, e por isso o nome não\n // valia nada na nota.\n const invoiceIds = [...new Set(movimentos.filter((m) => !contexto.has(m.id)).map((m) => m.invoiceId).filter(Boolean))] as string[]\n if (invoiceIds.length > 0) {\n const { data: orders } = await core.from('orders')\n .select('id, reference_number, metadata').in('id', invoiceIds)\n const byId = new Map<string, any>((orders ?? []).map((o: any) => [o.id, o]))\n for (const movimento of movimentos) {\n const order = movimento.invoiceId ? byId.get(movimento.invoiceId) : undefined\n if (!order) continue\n const contactName = (order.metadata as any)?.contactName as string | undefined\n contexto.set(movimento.id, {\n contactName,\n invoice: { id: order.id, contactName, fiscalNumber: order.reference_number } as Invoice,\n })\n }\n }\n\n return matchStatementLines(abertas, movimentos, contexto)\n },\n\n async reconcileMovement(input) {\n // `settle` QUITA a conta alvo antes de amarrar — é o `link` do V1. Sem\n // `mode`, a linha só é marcada: é o `link_paid`, para a conta que já foi\n // paga na mão. A diferença é dinheiro: tratar uma conta paga como aberta\n // cria um segundo pagamento e o mês fecha com o dobro.\n if (input.mode === 'settle' && input.matchedMovementId) {\n const line = await readStatementLine(input.bankMovementId)\n // The target is an INSTALLMENT: payMovement settles by installment id.\n const { data: alvo } = await getClients().pub.from(T.bills)\n .select('amount, paid').eq('installment_id', input.matchedMovementId).maybeSingle()\n if (!alvo) throw new Error('Lançamento não encontrado')\n await runReconcileLink(\n reconcileFacade(),\n line,\n {\n movementId: input.matchedMovementId,\n mode: 'settle',\n openAmount: round2((Number(alvo.amount) || 0) - (Number(alvo.paid) || 0)),\n },\n { payment: input.payment, adjustments: input.adjustments, partial: input.partial },\n )\n return\n }\n await markReconciled(input.bankMovementId, input.matchedMovementId)\n },\n\n // «Marcar como transferência». A conta do extrato é sempre uma das pontas.\n // SAÍDA no extrato = o dinheiro deixou aquela conta, logo ela é a ORIGEM;\n // entrada é o inverso. Mesma convenção do V1 e da sangria de caixa —\n // inverter faz o saldo consolidado andar duas vezes no sentido errado.\n async reconcileAsTransfer(input) {\n const line = await readStatementLine(input.bankMovementId)\n const transfer = await provider.createTransfer(transferForStatementLine(line, input))\n await provider.reconcileMovement!({ bankMovementId: input.bankMovementId, matchedMovementId: statementLegOf(line, transfer) })\n return transfer\n },\n\n // «Lançar como conta». A conta nasce classificada, é quitada contra a conta\n // do extrato, e a linha passa a ser a prova dela. É o caminho que faz o\n // extrato BATER: sem ele, uma linha sem contrapartida fica marcada como\n // conciliada e o dinheiro continua fora do livro.\n async reconcileAsBill(input) {\n const line = await readStatementLine(input.bankMovementId)\n const { invoiceId } = await runReconcileAsBill(reconcileFacade(), line, input)\n const invoice = await provider.getInvoiceById(invoiceId)\n if (!invoice) throw new Error('A conta não foi criada')\n return invoice\n },\n\n async unreconcileMovement(statementLineId) {\n const { pub } = getClients()\n const { data: line } = await pub.from(T.statementLines).select('matched_movement_id').eq('id', statementLineId).single()\n await pub.from(T.statementLines).update({ reconciled_at: null, matched_movement_id: null }).eq('id', statementLineId)\n if (line?.matched_movement_id) {\n await pub.from(T.movements).update({ reconciled_at: null }).eq('id', line.matched_movement_id)\n }\n },\n\n // --- Notas fiscais (NF-e / NFC-e / NFS-e) ---\n async getNotas(query: NotaFiscalQuery): Promise<PaginatedResult<NotaFiscal>> {\n const { pub } = getClients()\n let qb = pub.from(T.notas).select('*', { count: 'exact' })\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in('status', statuses)\n }\n if (query.model) qb = qb.eq('model', query.model)\n if (query.orderId) qb = qb.eq('order_id', query.orderId)\n if (query.search) qb = qb.or(`number.ilike.%${query.search}%,contact_name.ilike.%${query.search}%`)\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1).order('created_at', { ascending: false })\n const { data, count } = await qb\n return { data: (data ?? []).map((r: any) => snakeToCamel(r) as unknown as NotaFiscal), total: count ?? 0 }\n },\n\n async getNotaById(id: string): Promise<NotaFiscal | null> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.notas).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? (snakeToCamel(data) as unknown as NotaFiscal) : null\n },\n\n async createNota(input: CreateNotaFiscalInput): Promise<NotaFiscal> {\n const { pub } = getClients()\n const row = {\n tenant_id: getActiveTenantId(),\n model: input.model ?? 'nfe',\n status: 'draft',\n series: input.series ?? null,\n order_id: input.orderId ?? null,\n contact_id: input.contactId ?? null,\n contact_name: input.contactName ?? null,\n total_amount: input.totalAmount,\n observations: input.observations ?? null,\n }\n const { data, error } = await pub.from(T.notas).insert(row).select().single()\n if (error) throw error\n return snakeToCamel(data) as unknown as NotaFiscal\n },\n\n async updateNota(id: string, patch: Partial<NotaFiscal>): Promise<NotaFiscal> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.notas).update(camelToSnake(patch as Record<string, unknown>)).eq('id', id).select().single()\n if (error) throw error\n return snakeToCamel(data) as unknown as NotaFiscal\n },\n\n // Emission seam: no SEFAZ integration yet, so assign a número/série locally\n // and mark it issued. An external emissor replaces this body (or overrides\n // issueNota on a wrapping provider) without any UI change.\n async issueNota(id: string): Promise<NotaFiscal> {\n const { pub } = getClients()\n const { data: current } = await pub.from(T.notas).select('series').eq('id', id).single()\n const { count } = await pub.from(T.notas).select('id', { count: 'exact', head: true }).eq('status', 'issued')\n const patch = {\n status: 'issued',\n number: String((count ?? 0) + 1).padStart(6, '0'),\n series: current?.series ?? '1',\n issued_at: new Date().toISOString(),\n emissor: 'manual',\n }\n const { data, error } = await pub.from(T.notas).update(patch).eq('id', id).select().single()\n if (error) throw error\n return snakeToCamel(data) as unknown as NotaFiscal\n },\n\n async cancelNota(id: string, reason?: string): Promise<NotaFiscal> {\n const { pub } = getClients()\n const { data, error } = await pub.from(T.notas)\n .update({ status: 'cancelled', error_message: reason ?? null })\n .eq('id', id).select().single()\n if (error) throw error\n return snakeToCamel(data) as unknown as NotaFiscal\n },\n\n // --- Remessa CNAB 240 (080) ---\n\n /**\n * The Bacen registry, by COMPE code or by name.\n *\n * A bank is the country's, not the tenant's, so `public.banks` is global and\n * read-only. A pool where migration 167 has not run yet answers with an\n * empty list, and the caller falls back to the static catalogue — a missing\n * table costs a longer list, never the screen.\n */\n async searchBanks(query: string, limit = 12): Promise<BankCatalogEntry[]> {\n const term = query.trim()\n const { pub } = getClients()\n let qb = pub.from('banks').select('ispb,compe,name,legal_name,brand_color,logo_url')\n .eq('is_active', true)\n if (term) {\n const digits = term.replace(/\\D/g, '')\n qb = digits.length >= 2 && digits.length <= 3\n ? qb.like('compe', `${digits}%`)\n : qb.or(`name.ilike.%${term}%,legal_name.ilike.%${term}%`)\n }\n const { data, error } = await qb.order('compe', { nullsFirst: false }).limit(limit)\n if (error) return []\n return (data ?? []).map((row: any) => ({\n ispb: row.ispb,\n compe: row.compe ?? undefined,\n name: row.name,\n legalName: row.legal_name ?? undefined,\n brandColor: row.brand_color ?? undefined,\n logoUrl: row.logo_url ?? undefined,\n }))\n },\n\n /**\n * Who gets paid, who pays, and which file number is next.\n *\n * The payee's document lives on `people`, the account on `payee_accounts`\n * and the address on `addresses` — three tables because each answers a\n * different question, and the CNPJ of the paying company is a fourth. The\n * wizard asks once and gets all of it, so step 3 can show a form with the\n * blanks already filled instead of a sentence saying data is missing.\n */\n async getCnabContext({ contactIds, bankAccountId, unitId }): Promise<CnabContext> {\n const { pub } = getClients()\n const ids = [...new Set(contactIds.filter(Boolean))]\n\n const [peopleRes, accountsRes, addressRes, companyRes, unitRes, seqRes] = await Promise.all([\n ids.length\n ? pub.from('people').select('id,name,document_number').in('id', ids)\n : Promise.resolve({ data: [], error: null } as any),\n ids.length\n ? pub.from(T.payeeAccounts).select('*').eq('owner_type', 'person').in('owner_id', ids)\n .order('is_default', { ascending: false }).order('created_at')\n : Promise.resolve({ data: [], error: null } as any),\n ids.length\n ? pub.from('addresses').select('*').eq('owner_type', 'person').in('owner_id', ids)\n : Promise.resolve({ data: [], error: null } as any),\n // As empresas do tenant. São unidades de linhas, então vêm todas e a\n // escolha é feita aqui — a da unidade da conta, senão a sem unidade,\n // senão a única que existe.\n pub.from('company_legal_entities').select('id,unit_id,kind,legal_name,trade_name,document_number')\n .eq('is_active', true).limit(20),\n // O nome da unidade é o que a tela escreve enquanto não há empresa\n // cadastrada — melhor que um campo em branco pedindo razão social.\n unitId\n ? pub.from(T.unitCompanies).select('unit_id,unit_name').eq('unit_id', unitId).maybeSingle()\n : Promise.resolve({ data: null, error: null } as any),\n pub.from(T.cnabBatches).select('sequence_number').eq('bank_account_id', bankAccountId)\n .order('sequence_number', { ascending: false }).limit(1).maybeSingle(),\n ])\n\n if (peopleRes.error) throw peopleRes.error\n if (accountsRes.error) throw accountsRes.error\n\n // First row wins: the query already put the default one in front.\n const accountOf = new Map<string, any>()\n for (const row of (accountsRes.data ?? []) as any[]) {\n if (!accountOf.has(row.owner_id)) accountOf.set(row.owner_id, row)\n }\n const addressOf = new Map<string, any>()\n for (const row of (addressRes.data ?? []) as any[]) {\n if (!addressOf.has(row.owner_id)) addressOf.set(row.owner_id, row)\n }\n\n const payees: CnabPayeeRecord[] = ((peopleRes.data ?? []) as any[]).map((person) => {\n const account = accountOf.get(person.id)\n const address = addressOf.get(person.id)\n return {\n contactId: person.id,\n name: person.name ?? '',\n document: person.document_number ?? '',\n payeeAccountId: account?.id,\n bankCode: account?.bank_code ?? '',\n bankName: account?.bank_name ?? '',\n agencyNumber: account?.agency_number ?? '',\n agencyDigit: account?.agency_digit ?? '',\n accountNumber: account?.account_number ?? '',\n accountDigit: account?.account_digit ?? '',\n accountType: account?.account_type ?? '',\n pixKey: account?.pix_key ?? '',\n pixKeyType: account?.pix_key_type ?? '',\n street: address?.street ?? '',\n number: address?.number ?? '',\n complement: address?.complement ?? '',\n district: address?.district ?? '',\n city: address?.city ?? '',\n state: address?.state ?? '',\n postalCode: address?.postal_code ?? '',\n }\n })\n\n // A da unidade manda; a sem unidade vale para o tenant inteiro; na dúvida,\n // a primeira — um tenant com várias empresas e nenhuma na unidade da conta\n // é um cadastro por terminar, não uma escolha a adivinhar.\n const companies = (companyRes.data ?? []) as any[]\n const companyRow =\n companies.find((row) => unitId && row.unit_id === unitId)\n ?? companies.find((row) => !row.unit_id)\n ?? companies[0]\n\n const unitName = (unitRes.data as any)?.unit_name ?? ''\n const company = {\n id: companyRow?.id ?? undefined,\n unitId,\n name: companyRow?.trade_name || companyRow?.legal_name || unitName,\n document: companyRow?.document_number || '',\n }\n\n return {\n company,\n nextSequence: Number((seqRes.data as any)?.sequence_number ?? 0) + 1,\n payees,\n }\n },\n\n /**\n * A empresa pagadora, cadastrada de dentro da remessa.\n *\n * `company_legal_entities` nasceu sem tela: nenhuma superfície do SDK\n * escreve nela, e o resultado é um pool com treze unidades e zero empresas.\n * Como o CNPJ é obrigatório no cabeçalho do CNAB, é aqui que a pessoa o\n * digita — e gravá-lo é o que faz a PRÓXIMA remessa já vir preenchida.\n *\n * `unit_id` na linha é o que recorta a empresa por unidade. O elo inverso\n * (`app.units.company_legal_entity_id`) fica para quem tiver a RPC: o schema\n * `app` não é alcançável por aqui, e a leitura já resolve pelos dois lados.\n */\n async saveCompany(input: SaveCompanyInput): Promise<{ id: string }> {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n const digits = (input.document || '').replace(/\\D/g, '')\n const name = input.name.trim()\n if (!name) throw new Error('A empresa precisa de um nome.')\n if (digits.length !== 11 && digits.length !== 14) {\n throw new Error('CNPJ com 14 dígitos ou CPF com 11 — o cabeçalho do CNAB não aceita outro.')\n }\n\n // O trigger `trg_company_legal_entities_normalize` tira a pontuação, e o\n // CHECK casa `kind` com o tamanho do documento: 14 é empresa, 11 é pessoa.\n const row = {\n kind: digits.length === 14 ? 'company' : 'individual',\n legal_name: name,\n trade_name: name,\n document_number: digits,\n }\n\n if (input.id) {\n const { error } = await pub.from('company_legal_entities').update(row).eq('id', input.id)\n if (error) throw error\n return { id: input.id }\n }\n\n const { data, error } = await pub.from('company_legal_entities')\n .insert({ ...row, tenant_id: tenantId, unit_id: input.unitId ?? null, is_active: true })\n .select('id').single()\n if (error) throw error\n return { id: (data as any).id }\n },\n\n /**\n * What the wizard collected goes back to the cadastro, not to the file only.\n * Otherwise the same CPF is typed again on the next remittance, and the two\n * typings disagree.\n */\n async saveCnabPayees(payees: SaveCnabPayeeInput[]): Promise<void> {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n const text = (v?: string) => {\n const s = (v ?? '').trim()\n return s === '' ? null : s\n }\n\n for (const payee of payees) {\n if (text(payee.document)) {\n const { error } = await pub.from('people').update({ document_number: text(payee.document) }).eq('id', payee.contactId)\n if (error) throw error\n }\n\n const row = {\n bank_code: text(payee.bankCode),\n bank_name: text(payee.bankName),\n agency_number: text(payee.agencyNumber),\n agency_digit: text(payee.agencyDigit),\n account_number: text(payee.accountNumber),\n account_digit: text(payee.accountDigit),\n account_type: text(payee.accountType),\n pix_key: text(payee.pixKey),\n pix_key_type: text(payee.pixKeyType),\n }\n // The 149 CHECK: a row with neither an account nor a PIX key is a form\n // opened by mistake, not a record.\n if (!row.account_number && !row.pix_key) continue\n\n // Look the row up instead of trusting the id the screen is holding.\n // A first attempt that inserted the account and then died filing the\n // batch leaves the screen with no id and the payee with a default row,\n // and the retry used to hit `payee_accounts_one_default_uidx`. Writing\n // a remittance twice has to be allowed: the file already downloaded.\n let targetId = payee.payeeAccountId\n if (!targetId) {\n const { data: existing } = await pub.from(T.payeeAccounts)\n .select('id').eq('owner_type', 'person').eq('owner_id', payee.contactId)\n .order('is_default', { ascending: false }).order('created_at')\n .limit(1).maybeSingle()\n targetId = (existing as any)?.id\n }\n\n // RLS answers a refused UPDATE with zero rows, not an error: count them.\n const { data: written, error } = targetId\n ? await pub.from(T.payeeAccounts).update(row).eq('id', targetId).select('id')\n : await pub.from(T.payeeAccounts).insert({\n ...row,\n tenant_id: tenantId,\n owner_type: 'person',\n owner_id: payee.contactId,\n label: 'Principal',\n is_default: true,\n }).select('id')\n if (error) throw error\n if (!written?.length) throw new Error('payee account was not saved (no financial edit permission?)')\n }\n },\n\n /**\n * The file that already left for the bank. `sequence_number` is the bank's\n * count, not the file's — two remittances carrying the same one is a\n * rejected remittance, so it is written with the batch and never derived\n * again.\n */\n async recordCnabBatch(input: RecordCnabBatchInput): Promise<{ id: string }> {\n const { pub } = getClients()\n const tenantId = getActiveTenantId()\n\n const { data, error } = await pub.from(T.cnabBatches).insert({\n tenant_id: tenantId,\n unit_id: input.unitId ?? null,\n bank_account_id: input.bankAccountId,\n layout: input.layout,\n sequence_number: input.sequenceNumber,\n total_amount: input.totalAmount,\n items_count: input.items.length,\n file_name: input.fileName,\n // The file's home is `public.documents` through `document_id`; until the\n // upload path exists it rides in metadata, which keeps a generated\n // remittance downloadable instead of gone.\n metadata: { file_content: input.fileContent },\n }).select('id').single()\n if (error) throw error\n\n const batchId = (data as any).id as string\n if (input.items.length) {\n // A tela tem a PARCELA na mão; `movement_id` aponta para o razão. O\n // porte deixou as duas com o mesmo id na maioria das linhas, não em\n // todas — e uma parcela sem movimento gêmeo derrubaria o arquivamento\n // de um arquivo que o banco JÁ recebeu. Então pergunta-se antes, e o\n // elo que não existir fica nulo em vez de estourar (115).\n const ids = [...new Set(input.items.map((item) => item.movementId))]\n const { data: movementRows } = await pub.from(T.movements).select('id').in('id', ids)\n const isMovement = new Set(((movementRows ?? []) as any[]).map((row) => row.id))\n\n const { error: itemsError } = await pub.from(T.cnabItems).insert(\n input.items.map((item) => ({\n tenant_id: tenantId,\n batch_id: batchId,\n installment_id: item.movementId,\n movement_id: isMovement.has(item.movementId) ? item.movementId : null,\n payment_form: item.paymentForm,\n payment_date: item.paymentDate,\n amount: item.amount,\n })),\n )\n if (itemsError) throw itemsError\n }\n return { id: batchId }\n },\n }\n\n return provider\n}\n"]}