@fayz-ai/plugin-tables 0.10.2 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/ComandaSettingsView-ZB5RK7TP.js +176 -0
  2. package/dist/ComandaSettingsView-ZB5RK7TP.js.map +1 -0
  3. package/dist/TablesPage-VVDNK3GN.js +1145 -0
  4. package/dist/TablesPage-VVDNK3GN.js.map +1 -0
  5. package/dist/chunk-XHRPH676.js +12 -0
  6. package/dist/chunk-XHRPH676.js.map +1 -0
  7. package/dist/context.d.ts +10 -0
  8. package/dist/context.d.ts.map +1 -1
  9. package/dist/data/core-supabase.d.ts +32 -0
  10. package/dist/data/core-supabase.d.ts.map +1 -0
  11. package/dist/data/mock.d.ts.map +1 -1
  12. package/dist/data/registries.d.ts.map +1 -1
  13. package/dist/data/types.d.ts +39 -1
  14. package/dist/data/types.d.ts.map +1 -1
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1234 -21
  18. package/dist/index.js.map +1 -1
  19. package/dist/locales/en.d.ts.map +1 -1
  20. package/dist/locales/pt-BR.d.ts.map +1 -1
  21. package/dist/migrations/index.d.ts +7 -0
  22. package/dist/migrations/index.d.ts.map +1 -0
  23. package/dist/store.d.ts +40 -1
  24. package/dist/store.d.ts.map +1 -1
  25. package/dist/types.d.ts +138 -0
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/views/ComandaActions.d.ts +63 -0
  28. package/dist/views/ComandaActions.d.ts.map +1 -0
  29. package/dist/views/ComandaSettingsView.d.ts +3 -0
  30. package/dist/views/ComandaSettingsView.d.ts.map +1 -0
  31. package/dist/views/FloorPlanView.d.ts.map +1 -1
  32. package/dist/views/TableRailPage.d.ts +3 -0
  33. package/dist/views/TableRailPage.d.ts.map +1 -0
  34. package/package.json +4 -4
  35. package/dist/TablesPage-GKTE4SD2.js +0 -274
  36. package/dist/TablesPage-GKTE4SD2.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/platform.ts","../src/index.ts"],"names":["table"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantTable, TableSession, Zone,\n CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,\n TableQuery, TablesSummary, TableShape,\n} from '../types'\nimport type { TablesDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 0\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst TENANT = 'mock-tenant'\nconst NOW = new Date().toISOString()\n\nfunction makeTable(\n id: string,\n number: number,\n seats: number,\n zone: string,\n zoneName: string,\n shape: TableShape,\n gridCol: number,\n gridRow: number,\n): RestaurantTable {\n return {\n id,\n name: `Table ${number}`,\n number,\n seats,\n status: 'available',\n zone,\n zoneName,\n shape,\n gridCol,\n gridRow,\n isActive: true,\n tenantId: TENANT,\n createdAt: NOW,\n updatedAt: NOW,\n }\n}\n\nfunction seedZones(): Zone[] {\n return [\n { id: nextId('zone'), name: 'Indoor', color: '#3b82f6', sortOrder: 0, isActive: true, tenantId: TENANT, createdAt: NOW },\n { id: nextId('zone'), name: 'Outdoor', color: '#22c55e', sortOrder: 1, isActive: true, tenantId: TENANT, createdAt: NOW },\n { id: nextId('zone'), name: 'Bar', color: '#f59e0b', sortOrder: 2, isActive: true, tenantId: TENANT, createdAt: NOW },\n ]\n}\n\nfunction seedTables(zones: Zone[]): RestaurantTable[] {\n const [indoor, outdoor, bar] = zones\n\n const tables: RestaurantTable[] = []\n\n // Indoor zone — tables 1-8, 4x2 grid, alternating 4/6 seats, square/rectangle\n for (let i = 0; i < 8; i++) {\n const num = i + 1\n tables.push(makeTable(\n nextId('table'),\n num,\n i % 2 === 0 ? 4 : 6,\n indoor.id,\n indoor.name,\n i % 2 === 0 ? 'square' : 'rectangle',\n (i % 4),\n Math.floor(i / 4),\n ))\n }\n\n // Outdoor zone — tables 9-10, round, 4 seats\n tables.push(makeTable(nextId('table'), 9, 4, outdoor.id, outdoor.name, 'round', 0, 0))\n tables.push(makeTable(nextId('table'), 10, 4, outdoor.id, outdoor.name, 'round', 1, 0))\n\n // Bar zone — tables 11-12, bar shape, 2 seats\n tables.push(makeTable(nextId('table'), 11, 2, bar.id, bar.name, 'bar', 0, 0))\n tables.push(makeTable(nextId('table'), 12, 2, bar.id, bar.name, 'bar', 1, 0))\n\n return tables\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockTablesProvider(): TablesDataProvider {\n const zones = seedZones()\n const tables = seedTables(zones)\n const sessions: TableSession[] = []\n\n // ------- helpers -------\n\n function findTable(id: string) {\n return tables.find(t => t.id === id) ?? null\n }\n\n function matchesQuery(table: RestaurantTable, query?: TableQuery): boolean {\n if (!query) return true\n if (query.zone && table.zone !== query.zone) return false\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(table.status)) return false\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n if (\n !table.name.toLowerCase().includes(s) &&\n !String(table.number).includes(s) &&\n !(table.zoneName ?? '').toLowerCase().includes(s)\n ) return false\n }\n return true\n }\n\n // ------- provider -------\n\n return {\n // ---- Tables ----\n\n async getTables(query?: TableQuery) {\n return tables.filter(t => matchesQuery(t, query))\n },\n\n async getTableById(id: string) {\n return findTable(id)\n },\n\n async createTable(input: CreateTableInput) {\n const zone = zones.find(z => z.id === input.zone)\n const table: RestaurantTable = {\n id: nextId('table'),\n name: input.name,\n number: input.number,\n seats: input.seats,\n status: 'available',\n zone: input.zone,\n zoneName: zone?.name,\n shape: input.shape ?? 'square',\n gridCol: input.gridCol ?? 0,\n gridRow: input.gridRow ?? 0,\n isActive: true,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n tables.push(table)\n return table\n },\n\n async updateTable(id: string, data: Partial<RestaurantTable>) {\n const table = findTable(id)\n if (!table) throw new Error(`Table ${id} not found`)\n Object.assign(table, data, { updatedAt: new Date().toISOString() })\n return table\n },\n\n async deleteTable(id: string) {\n const idx = tables.findIndex(t => t.id === id)\n if (idx !== -1) tables.splice(idx, 1)\n },\n\n async updateTableStatus(input: UpdateTableStatusInput) {\n const table = findTable(input.tableId)\n if (!table) throw new Error(`Table ${input.tableId} not found`)\n table.status = input.status\n table.updatedAt = new Date().toISOString()\n return table\n },\n\n async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>) {\n for (const pos of positions) {\n const table = findTable(pos.id)\n if (table) {\n table.gridCol = pos.gridCol\n table.gridRow = pos.gridRow\n table.updatedAt = new Date().toISOString()\n }\n }\n },\n\n // ---- Sessions ----\n\n async seatGuests(input: SeatGuestsInput) {\n const table = findTable(input.tableId)\n if (!table) throw new Error(`Table ${input.tableId} not found`)\n\n const session: TableSession = {\n id: nextId('session'),\n tableId: input.tableId,\n tableName: table.name,\n guests: input.guests,\n waiterId: input.waiterId,\n waiterName: input.waiterId ? `Waiter ${input.waiterId}` : undefined,\n seatedAt: new Date().toISOString(),\n status: 'active',\n notes: input.notes,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n }\n sessions.push(session)\n\n // Denormalize onto table\n table.status = 'occupied'\n table.currentSessionId = session.id\n table.currentGuests = input.guests\n table.currentWaiterName = session.waiterName\n table.currentElapsedMinutes = 0\n table.currentTotal = 0\n table.updatedAt = new Date().toISOString()\n\n return session\n },\n\n async closeSession(sessionId: string) {\n const session = sessions.find(s => s.id === sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n\n session.status = 'closed'\n session.closedAt = new Date().toISOString()\n\n // Update table → cleaning\n const table = findTable(session.tableId)\n if (table) {\n table.status = 'cleaning'\n table.currentSessionId = undefined\n table.currentOrderId = undefined\n table.currentGuests = undefined\n table.currentWaiterName = undefined\n table.currentElapsedMinutes = undefined\n table.currentTotal = undefined\n table.updatedAt = new Date().toISOString()\n }\n\n return session\n },\n\n async getActiveSessions() {\n return sessions.filter(s => s.status === 'active')\n },\n\n async getSessionHistory(tableId?: string) {\n const closed = sessions.filter(s => s.status === 'closed')\n if (tableId) return closed.filter(s => s.tableId === tableId)\n return closed\n },\n\n // ---- Zones ----\n\n async getZones() {\n return [...zones]\n },\n\n async createZone(data: Partial<Zone>) {\n const zone: Zone = {\n id: nextId('zone'),\n name: data.name ?? 'New Zone',\n color: data.color,\n sortOrder: data.sortOrder ?? zones.length,\n isActive: data.isActive ?? true,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n }\n zones.push(zone)\n return zone\n },\n\n async updateZone(id: string, data: Partial<Zone>) {\n const zone = zones.find(z => z.id === id)\n if (!zone) throw new Error(`Zone ${id} not found`)\n Object.assign(zone, data)\n return zone\n },\n\n async deleteZone(id: string) {\n const idx = zones.findIndex(z => z.id === id)\n if (idx !== -1) zones.splice(idx, 1)\n },\n\n // ---- Summary ----\n\n async getSummary(): Promise<TablesSummary> {\n const available = tables.filter(t => t.status === 'available').length\n const occupied = tables.filter(t => t.status === 'occupied').length\n const reserved = tables.filter(t => t.status === 'reserved').length\n const cleaning = tables.filter(t => t.status === 'cleaning').length\n\n const totalSeats = tables.reduce((sum, t) => sum + t.seats, 0)\n const occupiedSeats = tables\n .filter(t => t.status === 'occupied')\n .reduce((sum, t) => sum + (t.currentGuests ?? t.seats), 0)\n\n const closedSessions = sessions.filter(s => s.status === 'closed' && s.closedAt)\n let averageSessionMinutes = 0\n if (closedSessions.length > 0) {\n const totalMinutes = closedSessions.reduce((sum, s) => {\n const seated = new Date(s.seatedAt).getTime()\n const closed = new Date(s.closedAt!).getTime()\n return sum + (closed - seated) / 60_000\n }, 0)\n averageSessionMinutes = Math.round(totalMinutes / closedSessions.length)\n }\n\n return {\n totalTables: tables.length,\n availableCount: available,\n occupiedCount: occupied,\n reservedCount: reserved,\n cleaningCount: cleaning,\n totalSeats,\n occupiedSeats,\n averageSessionMinutes,\n }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { toast } from 'sonner'\nimport type { TablesDataProvider } from './data/types'\nimport type {\n RestaurantTable, TableSession, Zone,\n CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,\n TableQuery, TablesSummary,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface TablesUIState {\n // Data cache\n tables: RestaurantTable[]\n tablesLoading: boolean\n\n zones: Zone[]\n zonesLoading: boolean\n\n activeSessions: TableSession[]\n sessionsLoading: boolean\n\n sessionHistory: TableSession[]\n historyLoading: boolean\n\n summary: TablesSummary | null\n summaryLoading: boolean\n\n selectedTableId: string | null\n\n // Actions\n fetchTables(query?: TableQuery): Promise<void>\n fetchZones(): Promise<void>\n fetchActiveSessions(): Promise<void>\n fetchSessionHistory(tableId?: string): Promise<void>\n fetchSummary(): Promise<void>\n selectTable(id: string | null): void\n seatGuests(input: SeatGuestsInput): Promise<TableSession>\n closeSession(sessionId: string): Promise<void>\n updateTableStatus(input: UpdateTableStatusInput): Promise<void>\n createTable(input: CreateTableInput): Promise<RestaurantTable>\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createTablesStore(provider: TablesDataProvider): StoreApi<TablesUIState> {\n return createStore<TablesUIState>((set, get) => ({\n tables: [],\n tablesLoading: false,\n\n zones: [],\n zonesLoading: false,\n\n activeSessions: [],\n sessionsLoading: false,\n\n sessionHistory: [],\n historyLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedTableId: null,\n\n async fetchTables(query) {\n return dedup('tables:tables:' + JSON.stringify(query), async () => {\n set({ tablesLoading: true })\n const tables = await provider.getTables(query)\n set({ tables, tablesLoading: false })\n })\n },\n\n async fetchZones() {\n return dedup('tables:zones', async () => {\n set({ zonesLoading: true })\n const zones = await provider.getZones()\n set({ zones, zonesLoading: false })\n })\n },\n\n async fetchActiveSessions() {\n return dedup('tables:activeSessions', async () => {\n set({ sessionsLoading: true })\n const activeSessions = await provider.getActiveSessions()\n set({ activeSessions, sessionsLoading: false })\n })\n },\n\n async fetchSessionHistory(tableId) {\n return dedup('tables:history:' + (tableId ?? ''), async () => {\n set({ historyLoading: true })\n const sessionHistory = await provider.getSessionHistory(tableId)\n set({ sessionHistory, historyLoading: false })\n })\n },\n\n async fetchSummary() {\n return dedup('tables:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n })\n },\n\n selectTable(id) {\n set({ selectedTableId: id })\n },\n\n async seatGuests(input) {\n try {\n const session = await provider.seatGuests(input)\n const [tables, activeSessions, summary] = await Promise.all([\n provider.getTables(),\n provider.getActiveSessions(),\n provider.getSummary(),\n ])\n set({ tables, activeSessions, summary })\n toast.success('Guests seated')\n return session\n } catch (err: any) {\n toast.error('Failed to seat guests', { description: err?.message })\n throw err\n }\n },\n\n async closeSession(sessionId) {\n try {\n await provider.closeSession(sessionId)\n const [tables, activeSessions, summary] = await Promise.all([\n provider.getTables(),\n provider.getActiveSessions(),\n provider.getSummary(),\n ])\n set({ tables, activeSessions, summary })\n toast.success('Session closed')\n } catch (err: any) {\n toast.error('Failed to close session', { description: err?.message })\n throw err\n }\n },\n\n async updateTableStatus(input) {\n try {\n await provider.updateTableStatus(input)\n const [tables, summary] = await Promise.all([\n provider.getTables(),\n provider.getSummary(),\n ])\n set({ tables, summary })\n toast.success('Table status updated')\n } catch (err: any) {\n toast.error('Failed to update table status', { description: err?.message })\n throw err\n }\n },\n\n async createTable(input) {\n try {\n const table = await provider.createTable(input)\n const [tables, summary] = await Promise.all([\n provider.getTables(),\n provider.getSummary(),\n ])\n set({ tables, summary })\n toast.success('Table created')\n return table\n } catch (err: any) {\n toast.error('Failed to create table', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst zoneEntity: EntityDef = {\n name: 'Zone',\n namePlural: 'Zones',\n icon: 'MapPin',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'text', showInTable: true },\n { key: 'sortOrder', label: 'Order', type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'restaurant_zones', tenantScoped: true },\n}\n\nexport const tablesRegistries: PluginRegistryDef[] = [\n {\n id: 'zones',\n entity: zoneEntity,\n icon: 'MapPin',\n description: 'Floor plan zones (indoor, outdoor, bar, etc.)',\n display: 'table',\n seedData: [\n { id: 'z-indoor', name: 'Indoor', color: '#3b82f6', sortOrder: 0, isActive: true },\n { id: 'z-outdoor', name: 'Outdoor', color: '#22c55e', sortOrder: 1, isActive: true },\n { id: 'z-bar', name: 'Bar', color: '#f59e0b', sortOrder: 2, isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'tables.title': 'Tables',\n 'tables.nav.floorPlan': 'Floor Plan',\n 'tables.nav.zones': 'Zones',\n 'tables.nav.history': 'Session History',\n 'tables.floorPlan.title': 'Floor Plan',\n 'tables.floorPlan.subtitle': 'Manage table layout and seating',\n 'tables.floorPlan.available': 'Available',\n 'tables.floorPlan.occupied': 'Occupied',\n 'tables.floorPlan.reserved': 'Reserved',\n 'tables.floorPlan.cleaning': 'Cleaning',\n 'tables.floorPlan.seats': 'seats',\n 'tables.floorPlan.noTables': 'No tables configured',\n 'tables.floorPlan.noTablesDesc': 'Add your first table to get started',\n 'tables.floorPlan.addTable': 'Add Table',\n 'tables.floorPlan.occupiedOf': '{occupied} occupied, {available} available of {total} tables',\n 'tables.floorPlan.selectTable': 'Select a table',\n 'tables.floorPlan.selectTableDesc': 'Click on any table to see details and actions',\n 'tables.floorPlan.min': 'min',\n 'tables.floorPlan.zone': 'Zone',\n 'tables.floorPlan.order': 'Order',\n 'tables.floorPlan.checkIn': 'Check In',\n 'tables.detail.currentSession': 'Current Session',\n 'tables.detail.guests': 'Guests',\n 'tables.detail.waiter': 'Waiter',\n 'tables.detail.elapsed': 'Elapsed',\n 'tables.detail.total': 'Running Total',\n 'tables.detail.viewOrder': 'View Order',\n 'tables.detail.seatGuests': 'Seat Guests',\n 'tables.detail.closeTable': 'Close Table',\n 'tables.detail.markClean': 'Mark Ready',\n 'tables.detail.cancel': 'Cancel',\n 'tables.seat.title': 'Seat Guests',\n 'tables.seat.guestCount': 'Number of guests',\n 'tables.seat.waiter': 'Waiter',\n 'tables.seat.notes': 'Notes',\n 'tables.seat.confirm': 'Seat',\n 'tables.history.title': 'Session History',\n 'tables.history.table': 'Table',\n 'tables.history.guests': 'Guests',\n 'tables.history.waiter': 'Waiter',\n 'tables.history.duration': 'Duration',\n 'tables.history.noSessions': 'No session history yet',\n 'tables.settings.title': 'Tables Settings',\n}\n","export const ptBR: Record<string, string> = {\n 'tables.title': 'Mesas',\n 'tables.nav.floorPlan': 'Mapa de Mesas',\n 'tables.nav.zones': 'Áreas',\n 'tables.nav.history': 'Histórico',\n 'tables.floorPlan.title': 'Mapa de Mesas',\n 'tables.floorPlan.subtitle': 'Gerencie o layout e a ocupação das mesas',\n 'tables.floorPlan.available': 'Disponível',\n 'tables.floorPlan.occupied': 'Ocupada',\n 'tables.floorPlan.reserved': 'Reservada',\n 'tables.floorPlan.cleaning': 'Limpeza',\n 'tables.floorPlan.seats': 'lugares',\n 'tables.floorPlan.noTables': 'Nenhuma mesa configurada',\n 'tables.floorPlan.noTablesDesc': 'Adicione a primeira mesa para começar',\n 'tables.floorPlan.addTable': 'Adicionar Mesa',\n 'tables.floorPlan.occupiedOf': '{occupied} ocupadas, {available} disponíveis de {total} mesas',\n 'tables.floorPlan.selectTable': 'Selecione uma mesa',\n 'tables.floorPlan.selectTableDesc': 'Clique em uma mesa para ver detalhes e ações',\n 'tables.floorPlan.min': 'min',\n 'tables.floorPlan.zone': 'Área',\n 'tables.floorPlan.order': 'Pedido',\n 'tables.floorPlan.checkIn': 'Check-in',\n 'tables.detail.currentSession': 'Sessão Atual',\n 'tables.detail.guests': 'Pessoas',\n 'tables.detail.waiter': 'Garçom',\n 'tables.detail.elapsed': 'Tempo',\n 'tables.detail.total': 'Total Parcial',\n 'tables.detail.viewOrder': 'Ver Pedido',\n 'tables.detail.seatGuests': 'Sentar Clientes',\n 'tables.detail.closeTable': 'Fechar Mesa',\n 'tables.detail.markClean': 'Marcar Pronta',\n 'tables.detail.cancel': 'Cancelar',\n 'tables.seat.title': 'Sentar Clientes',\n 'tables.seat.guestCount': 'Número de pessoas',\n 'tables.seat.waiter': 'Garçom',\n 'tables.seat.notes': 'Observações',\n 'tables.seat.confirm': 'Sentar',\n 'tables.history.title': 'Histórico de Sessões',\n 'tables.history.table': 'Mesa',\n 'tables.history.guests': 'Pessoas',\n 'tables.history.waiter': 'Garçom',\n 'tables.history.duration': 'Duração',\n 'tables.history.noSessions': 'Nenhum histórico de sessões',\n 'tables.settings.title': 'Configurações de Mesas',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const tablesLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateTableInput,\n RestaurantTable,\n SeatGuestsInput,\n TableQuery,\n TableSession,\n TablesSummary,\n TableStatus,\n UpdateTableStatusInput,\n Zone,\n} from '../types'\nimport type { TablesDataProvider } from './types'\n\nexport interface FayzTablesProviderOptions extends FayzClientOptions {\n projectId?: string\n tableName?: string\n schema?: string\n runtime?: boolean\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * restaurant_tables table. When omitted, scoping is left to runtime/RLS.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface RestaurantTableRow {\n id: string\n tenant_id?: string | null\n name?: string | null\n number?: number | null\n seats?: number | null\n status?: TableStatus | null\n zone?: string | null\n zone_name?: string | null\n shape?: RestaurantTable['shape'] | null\n grid_col?: number | null\n grid_row?: number | null\n is_active?: boolean | null\n current_session_id?: string | null\n current_order_id?: string | null\n current_guests?: number | null\n current_waiter_name?: string | null\n current_elapsed_minutes?: number | null\n current_total?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nconst DEFAULT_TABLE_NAME = 'restaurant_tables'\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction rowToTable(row: RestaurantTableRow): RestaurantTable {\n const number = row.number ?? 0\n const zone = row.zone ?? 'indoor'\n return {\n id: row.id,\n name: row.name ?? `Table ${number}`,\n number,\n seats: row.seats ?? 4,\n status: row.status ?? 'available',\n zone,\n zoneName: row.zone_name ?? zone,\n shape: row.shape ?? 'square',\n gridCol: row.grid_col ?? 0,\n gridRow: row.grid_row ?? 0,\n isActive: row.is_active ?? true,\n currentSessionId: row.current_session_id ?? undefined,\n currentOrderId: row.current_order_id ?? undefined,\n currentGuests: row.current_guests ?? undefined,\n currentWaiterName: row.current_waiter_name ?? undefined,\n currentElapsedMinutes: row.current_elapsed_minutes ?? undefined,\n currentTotal: row.current_total ?? undefined,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction tableCreatePayload(input: CreateTableInput): Record<string, unknown> {\n return {\n name: input.name,\n number: input.number,\n seats: input.seats,\n zone: input.zone,\n shape: input.shape ?? 'square',\n grid_col: input.gridCol ?? 0,\n grid_row: input.gridRow ?? 0,\n status: 'available',\n is_active: true,\n }\n}\n\nfunction tableUpdatePayload(data: Partial<RestaurantTable>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.name !== undefined) payload.name = data.name\n if (data.number !== undefined) payload.number = data.number\n if (data.seats !== undefined) payload.seats = data.seats\n if (data.status !== undefined) payload.status = data.status\n if (data.zone !== undefined) payload.zone = data.zone\n if (data.zoneName !== undefined) payload.zone_name = data.zoneName\n if (data.shape !== undefined) payload.shape = data.shape\n if (data.gridCol !== undefined) payload.grid_col = data.gridCol\n if (data.gridRow !== undefined) payload.grid_row = data.gridRow\n if (data.isActive !== undefined) payload.is_active = data.isActive\n if (data.currentSessionId !== undefined) payload.current_session_id = data.currentSessionId\n if (data.currentOrderId !== undefined) payload.current_order_id = data.currentOrderId\n if (data.currentGuests !== undefined) payload.current_guests = data.currentGuests\n if (data.currentWaiterName !== undefined) payload.current_waiter_name = data.currentWaiterName\n if (data.currentElapsedMinutes !== undefined) payload.current_elapsed_minutes = data.currentElapsedMinutes\n if (data.currentTotal !== undefined) payload.current_total = data.currentTotal\n if (data.metadata !== undefined) payload.metadata = data.metadata\n return payload\n}\n\nfunction filtersFromQuery(query?: TableQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = [{ column: 'is_active', operator: 'eq', value: true }]\n if (!query) return filters\n if (query.zone) filters.push({ column: 'zone', operator: 'eq', value: query.zone })\n if (query.status && !Array.isArray(query.status)) {\n filters.push({ column: 'status', operator: 'eq', value: query.status })\n }\n return filters\n}\n\nfunction matchesClientQuery(table: RestaurantTable, query?: TableQuery): boolean {\n if (!query) return true\n if (Array.isArray(query.status) && !query.status.includes(table.status)) return false\n if (query.search) {\n const search = query.search.toLowerCase()\n return table.name.toLowerCase().includes(search)\n || String(table.number).includes(search)\n || (table.zoneName?.toLowerCase().includes(search) ?? false)\n }\n return true\n}\n\nfunction summarize(tables: RestaurantTable[]): TablesSummary {\n const availableCount = tables.filter((table) => table.status === 'available').length\n const occupiedCount = tables.filter((table) => table.status === 'occupied').length\n const reservedCount = tables.filter((table) => table.status === 'reserved').length\n const cleaningCount = tables.filter((table) => table.status === 'cleaning').length\n const totalSeats = tables.reduce((sum, table) => sum + table.seats, 0)\n const occupiedSeats = tables\n .filter((table) => table.status === 'occupied')\n .reduce((sum, table) => sum + (table.currentGuests ?? table.seats), 0)\n\n return {\n totalTables: tables.length,\n availableCount,\n occupiedCount,\n reservedCount,\n cleaningCount,\n totalSeats,\n occupiedSeats,\n averageSessionMinutes: 0,\n }\n}\n\nexport function createFayzTablesProvider(options: FayzTablesProviderOptions = {}): TablesDataProvider {\n const client = createFayzClient(options)\n const table = options.tableName ?? DEFAULT_TABLE_NAME\n const baseOptions = {\n projectId: options.projectId,\n table,\n schema: options.schema,\n runtime: options.runtime,\n }\n\n function resolveTenant(): string | undefined {\n const value = typeof options.tenantId === 'function' ? options.tenantId() : options.tenantId\n return value ?? undefined\n }\n\n function withTenant(filters: FayzTableFilter[]): FayzTableFilter[] {\n const tenantId = resolveTenant()\n return tenantId ? [{ column: 'tenant_id', operator: 'eq', value: tenantId }, ...filters] : filters\n }\n\n async function listTables(query?: TableQuery): Promise<RestaurantTable[]> {\n const response = await client.data.listRows<RestaurantTableRow>({\n ...baseOptions,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'number',\n sortDirection: 'asc',\n limit: 500,\n })\n return response.rows.map(rowToTable).filter((item) => matchesClientQuery(item, query))\n }\n\n async function getById(id: string): Promise<RestaurantTable | null> {\n const response = await client.data.listRows<RestaurantTableRow>({\n ...baseOptions,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return response.rows[0] ? rowToTable(response.rows[0]) : null\n }\n\n return {\n async getTables(query?: TableQuery) {\n return listTables(query)\n },\n\n async getTableById(id: string) {\n return getById(id)\n },\n\n async createTable(input: CreateTableInput) {\n const tenantId = resolveTenant()\n const row = await client.data.createRow<RestaurantTableRow>({\n ...baseOptions,\n row: tenantId ? { ...tableCreatePayload(input), tenant_id: tenantId } : tableCreatePayload(input),\n })\n return rowToTable(row)\n },\n\n async updateTable(id: string, data: Partial<RestaurantTable>) {\n const row = await client.data.updateRow<RestaurantTableRow>({\n ...baseOptions,\n primaryKeys: { id },\n row: tableUpdatePayload(data),\n })\n return rowToTable(row)\n },\n\n async deleteTable(id: string) {\n await client.data.deleteRows({ ...baseOptions, rows: [{ id }] })\n },\n\n async updateTableStatus(input: UpdateTableStatusInput) {\n return this.updateTable(input.tableId, { status: input.status })\n },\n\n async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>) {\n await Promise.all(positions.map((position) => this.updateTable(position.id, {\n gridCol: position.gridCol,\n gridRow: position.gridRow,\n })))\n },\n\n async seatGuests(input: SeatGuestsInput) {\n const table = await this.updateTable(input.tableId, {\n status: 'occupied',\n currentGuests: input.guests,\n currentWaiterName: input.waiterId ? `Waiter ${input.waiterId}` : undefined,\n currentElapsedMinutes: 0,\n currentTotal: 0,\n })\n const session: TableSession = {\n id: table.currentSessionId ?? `runtime-session-${table.id}`,\n tableId: table.id,\n tableName: table.name,\n guests: input.guests,\n waiterId: input.waiterId,\n waiterName: table.currentWaiterName,\n seatedAt: nowIso(),\n status: 'active',\n notes: input.notes,\n tenantId: table.tenantId,\n createdAt: nowIso(),\n }\n return session\n },\n\n async closeSession(sessionId: string) {\n const tables = await listTables()\n const table = tables.find((item) => item.currentSessionId === sessionId)\n if (table) await this.updateTable(table.id, {\n status: 'cleaning',\n currentSessionId: undefined,\n currentOrderId: undefined,\n currentGuests: undefined,\n currentWaiterName: undefined,\n currentElapsedMinutes: undefined,\n currentTotal: undefined,\n })\n return {\n id: sessionId,\n tableId: table?.id ?? '',\n tableName: table?.name,\n guests: table?.currentGuests ?? 0,\n seatedAt: nowIso(),\n closedAt: nowIso(),\n status: 'closed',\n tenantId: table?.tenantId ?? 'runtime-tenant',\n createdAt: nowIso(),\n }\n },\n\n async getActiveSessions() {\n const tables = await listTables({ status: 'occupied' })\n return tables.map((table) => ({\n id: table.currentSessionId ?? `runtime-session-${table.id}`,\n tableId: table.id,\n tableName: table.name,\n guests: table.currentGuests ?? table.seats,\n waiterName: table.currentWaiterName,\n seatedAt: nowIso(),\n status: 'active' as const,\n tenantId: table.tenantId,\n createdAt: nowIso(),\n }))\n },\n\n async getSessionHistory() {\n return []\n },\n\n async getZones() {\n const tables = await listTables()\n const zones = new Map<string, Zone>()\n for (const table of tables) {\n if (zones.has(table.zone)) continue\n zones.set(table.zone, {\n id: table.zone,\n name: table.zoneName ?? table.zone,\n sortOrder: zones.size,\n isActive: true,\n tenantId: table.tenantId,\n createdAt: table.createdAt,\n })\n }\n return [...zones.values()]\n },\n\n async createZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async updateZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async deleteZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async getSummary() {\n return summarize(await listTables())\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { TablesDataProvider } from './data/types'\nimport type { TableSession } from './types'\nimport { createMockTablesProvider } from './data/mock'\nimport { createTablesStore } from './store'\nimport { tablesRegistries } from './data/registries'\nimport { tablesLocales } from './locales'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\nconst TablesPage = React.lazy(() => import('./views/TablesPage').then((m) => ({ default: m.TablesPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface TablesPluginLabels {\n pageTitle: string\n floorPlan: string\n zones: string\n sessionHistory: string\n}\n\nconst DEFAULT_LABELS: TablesPluginLabels = {\n pageTitle: 'Tables',\n floorPlan: 'Floor Plan',\n zones: 'Zones',\n sessionHistory: 'Session History',\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface TablesPluginOptions {\n modules?: {\n reservations?: boolean\n sessionHistory?: boolean\n }\n labels?: Partial<TablesPluginLabels>\n defaultZones?: Array<{ name: string; color?: string }>\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: TablesDataProvider\n onTableSeated?: (session: TableSession) => Promise<string | undefined>\n onTableClosed?: (session: TableSession) => Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: TablesPluginOptions) {\n return {\n modules: {\n reservations: options?.modules?.reservations === true,\n sessionHistory: options?.modules?.sessionHistory !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n defaultZones: options?.defaultZones ?? [\n { name: 'Indoor', color: '#3b82f6' },\n { name: 'Outdoor', color: '#22c55e' },\n { name: 'Bar', color: '#f59e0b' },\n ],\n onTableSeated: options?.onTableSeated,\n onTableClosed: options?.onTableClosed,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createTablesPlugin(options?: TablesPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockTablesProvider()\n const store = createTablesStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(TablesPage, { config, provider, store, registries: tablesRegistries })\n )\n\n return {\n id: 'tables',\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'MapPin',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 4,\n label: config.labels.pageTitle,\n route: '/tables',\n icon: 'MapPin',\n permission: { feature: 'tables', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/tables',\n component: PageComponent,\n permission: { feature: 'tables', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'tables.availability',\n name: 'getTableAvailability',\n description: 'Returns which tables are available, occupied, reserved, or being cleaned.',\n icon: 'MapPin',\n mode: 'read' as const,\n category: 'Tables',\n parameters: {\n type: 'object' as const,\n properties: {\n zone: { type: 'string' as const, description: 'Filter by zone name' },\n status: { type: 'string' as const, enum: ['available', 'occupied', 'reserved', 'cleaning'] },\n },\n },\n suggestions: [\n { label: 'Which tables are available right now?' },\n { label: 'How many tables are occupied?' },\n ],\n },\n {\n id: 'tables.seat-guests',\n name: 'seatGuests',\n description: 'Seats guests at a specific table.',\n icon: 'UserPlus',\n mode: 'persist' as const,\n category: 'Tables',\n parameters: {\n type: 'object' as const,\n properties: {\n tableNumber: { type: 'number' as const, description: 'Table number' },\n guests: { type: 'number' as const, description: 'Number of guests' },\n },\n required: ['tableNumber', 'guests'],\n },\n permission: { feature: 'tables', action: 'edit' as const },\n },\n ],\n registries: tablesRegistries,\n settings: [\n {\n id: 'tables',\n label: config.labels.pageTitle,\n icon: 'MapPin',\n component: (() => {\n const TablesSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Tables Settings',\n registries: tablesRegistries,\n routeBase: '/settings/tables',\n })\n TablesSettingsTab.displayName = 'TablesSettingsTab'\n return TablesSettingsTab\n })(),\n order: 21,\n permission: { feature: 'tables', action: 'read' as const },\n },\n ],\n locales: tablesLocales,\n }\n}\n\nexport type { TablesDataProvider } from './data/types'\nexport { createFayzTablesProvider } from './data/platform'\nexport type { FayzTablesProviderOptions } from './data/platform'\nexport type { ResolvedTablesConfig } from './context'\n"]}
1
+ {"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/platform.ts","../src/data/core-supabase.ts","../src/index.ts"],"names":["table","rowToTable"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantTable, TableSession, Zone,\n CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,\n TableQuery, TablesSummary, TableShape,\n TableOrder, TableOrderLine, TableMenuItem, TableMenuCategory, AddTableOrderLineInput,\n} from '../types'\nimport type { TablesDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 0\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst TENANT = 'mock-tenant'\nconst NOW = new Date().toISOString()\n\nfunction makeTable(\n id: string,\n number: number,\n seats: number,\n zone: string,\n zoneName: string,\n shape: TableShape,\n gridCol: number,\n gridRow: number,\n): RestaurantTable {\n return {\n id,\n name: `Table ${number}`,\n number,\n seats,\n status: 'available',\n zone,\n zoneName,\n shape,\n gridCol,\n gridRow,\n isActive: true,\n tenantId: TENANT,\n createdAt: NOW,\n updatedAt: NOW,\n }\n}\n\nfunction seedZones(): Zone[] {\n return [\n { id: nextId('zone'), name: 'Indoor', color: '#3b82f6', sortOrder: 0, isActive: true, tenantId: TENANT, createdAt: NOW },\n { id: nextId('zone'), name: 'Outdoor', color: '#22c55e', sortOrder: 1, isActive: true, tenantId: TENANT, createdAt: NOW },\n { id: nextId('zone'), name: 'Bar', color: '#f59e0b', sortOrder: 2, isActive: true, tenantId: TENANT, createdAt: NOW },\n ]\n}\n\nfunction seedTables(zones: Zone[]): RestaurantTable[] {\n const [indoor, outdoor, bar] = zones\n\n const tables: RestaurantTable[] = []\n\n // Indoor zone — tables 1-8, 4x2 grid, alternating 4/6 seats, square/rectangle\n for (let i = 0; i < 8; i++) {\n const num = i + 1\n tables.push(makeTable(\n nextId('table'),\n num,\n i % 2 === 0 ? 4 : 6,\n indoor.id,\n indoor.name,\n i % 2 === 0 ? 'square' : 'rectangle',\n (i % 4),\n Math.floor(i / 4),\n ))\n }\n\n // Outdoor zone — tables 9-10, round, 4 seats\n tables.push(makeTable(nextId('table'), 9, 4, outdoor.id, outdoor.name, 'round', 0, 0))\n tables.push(makeTable(nextId('table'), 10, 4, outdoor.id, outdoor.name, 'round', 1, 0))\n\n // Bar zone — tables 11-12, bar shape, 2 seats\n tables.push(makeTable(nextId('table'), 11, 2, bar.id, bar.name, 'bar', 0, 0))\n tables.push(makeTable(nextId('table'), 12, 2, bar.id, bar.name, 'bar', 1, 0))\n\n return tables\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nconst MENU_CATEGORIES: TableMenuCategory[] = [\n { id: 'c-mains', name: 'Pratos' },\n { id: 'c-starters', name: 'Entradas' },\n { id: 'c-drinks', name: 'Bebidas' },\n { id: 'c-desserts', name: 'Sobremesas' },\n]\n\nconst MENU: TableMenuItem[] = [\n { id: 'm-1', name: 'Picanha na chapa', price: 129.9, categoryId: 'c-mains', categoryName: 'Pratos' },\n { id: 'm-2', name: 'Moqueca de peixe', price: 98.0, categoryId: 'c-mains', categoryName: 'Pratos' },\n { id: 'm-3', name: 'Bolinho de bacalhau', price: 42.0, categoryId: 'c-starters', categoryName: 'Entradas' },\n { id: 'm-4', name: 'Pão de alho', price: 18.0, categoryId: 'c-starters', categoryName: 'Entradas' },\n { id: 'm-5', name: 'Chopp 300ml', price: 14.0, categoryId: 'c-drinks', categoryName: 'Bebidas' },\n { id: 'm-6', name: 'Suco de laranja', price: 12.0, categoryId: 'c-drinks', categoryName: 'Bebidas' },\n { id: 'm-7', name: 'Pudim', price: 22.0, categoryId: 'c-desserts', categoryName: 'Sobremesas' },\n]\n\nexport function createMockTablesProvider(): TablesDataProvider {\n const zones = seedZones()\n const tables = seedTables(zones)\n const sessions: TableSession[] = []\n /** The comanda's lines, by session id — the mock's stand-in for `items`. */\n const linesBySession = new Map<string, TableOrderLine[]>()\n\n // ------- helpers -------\n\n function findTable(id: string) {\n return tables.find(t => t.id === id) ?? null\n }\n\n function linesOf(sessionId: string): TableOrderLine[] {\n let lines = linesBySession.get(sessionId)\n if (!lines) { lines = []; linesBySession.set(sessionId, lines) }\n return lines\n }\n\n /** Same rule as the pool: the comanda's total is the sum of its lines, and\n * the mesa card reads it from the table row. */\n function recalc(sessionId: string): void {\n const total = linesOf(sessionId).reduce((sum, l) => sum + l.total, 0)\n const session = sessions.find(s => s.id === sessionId)\n const table = session ? findTable(session.tableId) : null\n if (table) table.currentTotal = total\n }\n\n function matchesQuery(table: RestaurantTable, query?: TableQuery): boolean {\n if (!query) return true\n if (query.zone && table.zone !== query.zone) return false\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(table.status)) return false\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n if (\n !table.name.toLowerCase().includes(s) &&\n !String(table.number).includes(s) &&\n !(table.zoneName ?? '').toLowerCase().includes(s)\n ) return false\n }\n return true\n }\n\n // ------- provider -------\n\n return {\n // ---- Tables ----\n\n async getTables(query?: TableQuery) {\n return tables.filter(t => matchesQuery(t, query))\n },\n\n async getTableById(id: string) {\n return findTable(id)\n },\n\n async createTable(input: CreateTableInput) {\n const zone = zones.find(z => z.id === input.zone)\n const table: RestaurantTable = {\n id: nextId('table'),\n name: input.name,\n number: input.number,\n seats: input.seats,\n status: 'available',\n zone: input.zone,\n zoneName: zone?.name,\n shape: input.shape ?? 'square',\n gridCol: input.gridCol ?? 0,\n gridRow: input.gridRow ?? 0,\n isActive: true,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n tables.push(table)\n return table\n },\n\n async updateTable(id: string, data: Partial<RestaurantTable>) {\n const table = findTable(id)\n if (!table) throw new Error(`Table ${id} not found`)\n Object.assign(table, data, { updatedAt: new Date().toISOString() })\n return table\n },\n\n async deleteTable(id: string) {\n const idx = tables.findIndex(t => t.id === id)\n if (idx !== -1) tables.splice(idx, 1)\n },\n\n async updateTableStatus(input: UpdateTableStatusInput) {\n const table = findTable(input.tableId)\n if (!table) throw new Error(`Table ${input.tableId} not found`)\n table.status = input.status\n table.updatedAt = new Date().toISOString()\n return table\n },\n\n async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>) {\n for (const pos of positions) {\n const table = findTable(pos.id)\n if (table) {\n table.gridCol = pos.gridCol\n table.gridRow = pos.gridRow\n table.updatedAt = new Date().toISOString()\n }\n }\n },\n\n // ---- Sessions ----\n\n async seatGuests(input: SeatGuestsInput) {\n const table = findTable(input.tableId)\n if (!table) throw new Error(`Table ${input.tableId} not found`)\n\n const session: TableSession = {\n id: nextId('session'),\n tableId: input.tableId,\n tableName: table.name,\n guests: input.guests,\n waiterId: input.waiterId,\n waiterName: input.waiterId ? `Waiter ${input.waiterId}` : undefined,\n seatedAt: new Date().toISOString(),\n status: 'active',\n notes: input.notes,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n }\n sessions.push(session)\n\n // Denormalize onto table\n table.status = 'occupied'\n table.currentSessionId = session.id\n table.currentOrderId = session.id\n table.currentOrderReference = `#${session.id}`\n table.currentGuests = input.guests\n table.currentWaiterName = session.waiterName\n table.currentElapsedMinutes = 0\n table.currentTotal = 0\n table.updatedAt = new Date().toISOString()\n\n return session\n },\n\n async closeSession(sessionId: string) {\n const session = sessions.find(s => s.id === sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n\n session.status = 'closed'\n session.closedAt = new Date().toISOString()\n linesBySession.delete(session.id)\n\n // Update table → cleaning\n const table = findTable(session.tableId)\n if (table) {\n table.status = 'cleaning'\n table.currentSessionId = undefined\n table.currentOrderId = undefined\n table.currentGuests = undefined\n table.currentWaiterName = undefined\n table.currentElapsedMinutes = undefined\n table.currentTotal = undefined\n table.updatedAt = new Date().toISOString()\n }\n\n return session\n },\n\n async getActiveSessions() {\n return sessions.filter(s => s.status === 'active')\n },\n\n async getSessionHistory(tableId?: string) {\n const closed = sessions.filter(s => s.status === 'closed')\n if (tableId) return closed.filter(s => s.tableId === tableId)\n return closed\n },\n\n // ---- Zones ----\n\n async getZones() {\n return [...zones]\n },\n\n async createZone(data: Partial<Zone>) {\n const zone: Zone = {\n id: nextId('zone'),\n name: data.name ?? 'New Zone',\n color: data.color,\n sortOrder: data.sortOrder ?? zones.length,\n isActive: data.isActive ?? true,\n tenantId: TENANT,\n createdAt: new Date().toISOString(),\n }\n zones.push(zone)\n return zone\n },\n\n async updateZone(id: string, data: Partial<Zone>) {\n const zone = zones.find(z => z.id === id)\n if (!zone) throw new Error(`Zone ${id} not found`)\n Object.assign(zone, data)\n return zone\n },\n\n async deleteZone(id: string) {\n const idx = zones.findIndex(z => z.id === id)\n if (idx !== -1) zones.splice(idx, 1)\n },\n\n // ---- The comanda ----\n\n async getTableOrder(tableId: string): Promise<TableOrder | null> {\n const session = sessions.find(s => s.tableId === tableId && s.status === 'active')\n if (!session) return null\n const lines = linesOf(session.id)\n const subtotal = lines.reduce((sum, l) => sum + l.total, 0)\n return {\n id: session.id,\n reference: `#${session.id}`,\n status: 'new',\n guests: session.guests,\n seatedAt: session.seatedAt,\n notes: session.notes,\n waiterId: session.waiterId,\n waiterName: session.waiterName,\n lines,\n // O provider de demonstração não divide conta: participante é o eixo\n // que só faz sentido com dado real atrás, e uma lista falsa de \"Pessoa\n // 1, Pessoa 2\" ensinaria a tela errada a quem está avaliando o produto.\n participants: [],\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n paid: 0,\n due: subtotal,\n currency: 'BRL',\n }\n },\n\n async getMenuCategories(): Promise<TableMenuCategory[]> {\n return MENU_CATEGORIES\n },\n\n async getMenuItems(search?: string, categoryId?: string): Promise<TableMenuItem[]> {\n const term = search?.toLowerCase()\n return MENU.filter(m => (\n (!term || m.name.toLowerCase().includes(term)) &&\n (!categoryId || m.categoryId === categoryId)\n ))\n },\n\n async addOrderLine(sessionId: string, input: AddTableOrderLineInput) {\n linesOf(sessionId).push({\n id: nextId('line'),\n productId: input.productId,\n name: input.name,\n quantity: input.quantity,\n unitPrice: input.unitPrice,\n discount: 0,\n total: input.unitPrice * input.quantity,\n notes: input.notes,\n })\n recalc(sessionId)\n },\n\n async setOrderLineQuantity(lineId: string, quantity: number) {\n for (const [sessionId, lines] of linesBySession) {\n const idx = lines.findIndex(l => l.id === lineId)\n if (idx === -1) continue\n if (quantity <= 0) lines.splice(idx, 1)\n else {\n lines[idx].quantity = quantity\n lines[idx].total = lines[idx].unitPrice * quantity\n }\n recalc(sessionId)\n return\n }\n },\n\n async removeOrderLine(lineId: string) {\n for (const [sessionId, lines] of linesBySession) {\n const idx = lines.findIndex(l => l.id === lineId)\n if (idx === -1) continue\n lines.splice(idx, 1)\n recalc(sessionId)\n return\n }\n },\n\n async updateSessionGuests(sessionId: string, guests: number) {\n const session = sessions.find(s => s.id === sessionId)\n if (!session) return\n session.guests = guests\n const table = findTable(session.tableId)\n if (table) table.currentGuests = guests\n },\n\n // ---- Summary ----\n\n async getSummary(): Promise<TablesSummary> {\n const available = tables.filter(t => t.status === 'available').length\n const occupied = tables.filter(t => t.status === 'occupied').length\n const reserved = tables.filter(t => t.status === 'reserved').length\n const cleaning = tables.filter(t => t.status === 'cleaning').length\n\n const totalSeats = tables.reduce((sum, t) => sum + t.seats, 0)\n const occupiedSeats = tables\n .filter(t => t.status === 'occupied')\n .reduce((sum, t) => sum + (t.currentGuests ?? t.seats), 0)\n\n const closedSessions = sessions.filter(s => s.status === 'closed' && s.closedAt)\n let averageSessionMinutes = 0\n if (closedSessions.length > 0) {\n const totalMinutes = closedSessions.reduce((sum, s) => {\n const seated = new Date(s.seatedAt).getTime()\n const closed = new Date(s.closedAt!).getTime()\n return sum + (closed - seated) / 60_000\n }, 0)\n averageSessionMinutes = Math.round(totalMinutes / closedSessions.length)\n }\n\n return {\n totalTables: tables.length,\n availableCount: available,\n occupiedCount: occupied,\n reservedCount: reserved,\n cleaningCount: cleaning,\n totalSeats,\n occupiedSeats,\n averageSessionMinutes,\n }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { toast } from 'sonner'\nimport type { TablesDataProvider } from './data/types'\nimport type {\n RestaurantTable, TableSession, Zone,\n CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,\n TableQuery, TablesSummary,\n TableOrder, TableMenuCategory, AddTableOrderLineInput,\n ComandaSettings, CancelReason, OrderTransfer,\n DiscountLineInput, CancelLineInput, TransferInput,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface TablesUIState {\n // Data cache\n tables: RestaurantTable[]\n tablesLoading: boolean\n\n zones: Zone[]\n zonesLoading: boolean\n\n activeSessions: TableSession[]\n sessionsLoading: boolean\n\n sessionHistory: TableSession[]\n historyLoading: boolean\n\n summary: TablesSummary | null\n summaryLoading: boolean\n\n selectedTableId: string | null\n\n /** The open comanda of the SELECTED mesa. Null when it has none, or when the\n * provider cannot read one. */\n openOrder: TableOrder | null\n openOrderLoading: boolean\n /** The provider answers 'no comanda reader here'. The panel says so once\n * instead of showing an empty comanda that looks like a lost order. */\n comandaSupported: boolean\n\n /** The chips over the item picker. The ITEMS are not here: they are the\n * picker's own list, read straight from the provider. */\n menuCategories: TableMenuCategory[]\n\n /** Qual participante está selecionado na barra da comanda. Null = a MESA,\n * que é o padrão: a maioria das mesas não divide a conta, e obrigar a\n * escolher uma pessoa antes de lançar uma cerveja seria um passo por item. */\n activeGuestId: string | null\n\n /** A política da casa. Null enquanto não foi lida. */\n settings: ComandaSettings | null\n cancelReasons: CancelReason[]\n transfers: OrderTransfer[]\n\n // Actions\n fetchTables(query?: TableQuery): Promise<void>\n fetchZones(): Promise<void>\n fetchActiveSessions(): Promise<void>\n fetchSessionHistory(tableId?: string): Promise<void>\n fetchSummary(): Promise<void>\n selectTable(id: string | null): void\n refreshAfterWrite(): Promise<void>\n fetchOpenOrder(tableId: string): Promise<void>\n fetchMenuCategories(): Promise<void>\n addOrderLine(input: AddTableOrderLineInput): Promise<void>\n setOrderLineQuantity(lineId: string, quantity: number): Promise<void>\n selectGuest(guestId: string | null): void\n fetchSettings(): Promise<void>\n saveSettings(patch: Partial<ComandaSettings>): Promise<void>\n addGuest(label?: string): Promise<void>\n removeGuest(guestId: string): Promise<void>\n setGuestServiceCharge(guestId: string, percent: number | null): Promise<void>\n setOrderServiceCharge(percent: number | null): Promise<void>\n discountLines(input: DiscountLineInput): Promise<void>\n fetchCancelReasons(): Promise<void>\n addCancelReason(label: string): Promise<void>\n updateCancelReason(id: string, patch: Partial<CancelReason>): Promise<void>\n deleteCancelReason(id: string): Promise<void>\n cancelLines(input: CancelLineInput): Promise<void>\n transfer(input: TransferInput): Promise<void>\n fetchTransfers(): Promise<void>\n setSessionGuests(guests: number): Promise<void>\n seatGuests(input: SeatGuestsInput): Promise<TableSession>\n closeSession(sessionId: string): Promise<void>\n updateTableStatus(input: UpdateTableStatusInput): Promise<void>\n createTable(input: CreateTableInput): Promise<RestaurantTable>\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createTablesStore(provider: TablesDataProvider): StoreApi<TablesUIState> {\n return createStore<TablesUIState>((set, get) => ({\n tables: [],\n tablesLoading: false,\n\n zones: [],\n zonesLoading: false,\n\n activeSessions: [],\n sessionsLoading: false,\n\n sessionHistory: [],\n historyLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedTableId: null,\n\n openOrder: null,\n openOrderLoading: false,\n activeGuestId: null,\n settings: null,\n cancelReasons: [],\n transfers: [],\n comandaSupported: typeof provider.getTableOrder === 'function',\n\n menuCategories: [],\n\n async fetchTables(query) {\n return dedup('tables:tables:' + JSON.stringify(query), async () => {\n set({ tablesLoading: true })\n const tables = await provider.getTables(query)\n set({ tables, tablesLoading: false })\n })\n },\n\n async fetchZones() {\n return dedup('tables:zones', async () => {\n set({ zonesLoading: true })\n const zones = await provider.getZones()\n set({ zones, zonesLoading: false })\n })\n },\n\n async fetchActiveSessions() {\n return dedup('tables:activeSessions', async () => {\n set({ sessionsLoading: true })\n const activeSessions = await provider.getActiveSessions()\n set({ activeSessions, sessionsLoading: false })\n })\n },\n\n async fetchSessionHistory(tableId) {\n return dedup('tables:history:' + (tableId ?? ''), async () => {\n set({ historyLoading: true })\n const sessionHistory = await provider.getSessionHistory(tableId)\n set({ sessionHistory, historyLoading: false })\n })\n },\n\n async fetchSummary() {\n return dedup('tables:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n })\n },\n\n /** After a write. Deliberately not `fetchTables`: that one dedups, and a\n * refresh that joins an in-flight read shows the state before the write. */\n async refreshAfterWrite() {\n const tableId = get().selectedTableId\n const [tables, summary] = await Promise.all([\n provider.getTables(),\n provider.getSummary(),\n ])\n set({ tables, summary })\n if (tableId) await get().fetchOpenOrder(tableId)\n },\n\n selectTable(id) {\n // O participante selecionado é de UMA comanda. Mantê-lo ao trocar de mesa\n // faria o próximo item cair na conta de alguém que está em outra mesa.\n set({ selectedTableId: id, openOrder: null, activeGuestId: null, transfers: [] })\n if (id) void get().fetchOpenOrder(id)\n },\n\n async fetchOpenOrder(tableId) {\n if (!provider.getTableOrder) return\n set({ openOrderLoading: true })\n try {\n const openOrder = await provider.getTableOrder(tableId)\n // The mesa may have changed under a slow read — a waiter clicking down\n // the salão must not land on the previous mesa's comanda.\n if (get().selectedTableId !== tableId) return\n set({ openOrder })\n } catch (err: any) {\n set({ openOrder: null })\n toast.error('Não foi possível ler a comanda', { description: err?.message })\n } finally {\n set({ openOrderLoading: false })\n }\n },\n\n async fetchMenuCategories() {\n if (!provider.getMenuCategories) return\n return dedup('tables:menuCategories', async () => {\n try {\n set({ menuCategories: await provider.getMenuCategories!() })\n } catch {\n // The chips are a convenience; the picker still searches by name.\n set({ menuCategories: [] })\n }\n })\n },\n\n async addOrderLine(input) {\n const order = get().openOrder\n if (!order || !provider.addOrderLine) return\n try {\n await provider.addOrderLine(order.id, input)\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível lançar o item', { description: err?.message })\n throw err\n }\n },\n\n async setOrderLineQuantity(lineId, quantity) {\n if (!provider.setOrderLineQuantity) return\n try {\n await provider.setOrderLineQuantity(lineId, quantity)\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível alterar o item', { description: err?.message })\n }\n },\n\n selectGuest(guestId) {\n set({ activeGuestId: guestId })\n },\n\n async fetchSettings() {\n if (!provider.getSettings) return\n try {\n set({ settings: await provider.getSettings() })\n } catch {\n // A política é enfeite comparada à comanda: um erro aqui não pode\n // derrubar a tela que o salão está usando.\n set({ settings: null })\n }\n },\n\n async saveSettings(patch) {\n if (!provider.saveSettings) return\n try {\n await provider.saveSettings(patch)\n await get().fetchSettings()\n // A taxa da casa muda o total de TODA comanda aberta, e a que está na\n // tela é a que a pessoa vai conferir primeiro.\n await get().refreshAfterWrite()\n toast.success('Configurações salvas')\n } catch (err: any) {\n toast.error('Não foi possível salvar', { description: err?.message })\n }\n },\n\n async addGuest(label) {\n const order = get().openOrder\n if (!order || !provider.addGuest) return\n try {\n const guest = await provider.addGuest(order.id, label)\n // Já entra selecionado: quem acrescenta um participante é porque vai\n // lançar algo para ele em seguida.\n set({ activeGuestId: guest.id })\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível acrescentar o participante', { description: err?.message })\n }\n },\n\n async removeGuest(guestId) {\n if (!provider.removeGuest) return\n try {\n await provider.removeGuest(guestId)\n if (get().activeGuestId === guestId) set({ activeGuestId: null })\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível remover o participante', { description: err?.message })\n }\n },\n\n async setGuestServiceCharge(guestId, percent) {\n if (!provider.setGuestServiceCharge) return\n try {\n await provider.setGuestServiceCharge(guestId, percent)\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível mudar a taxa', { description: err?.message })\n }\n },\n\n async setOrderServiceCharge(percent) {\n const order = get().openOrder\n if (!order || !provider.setOrderServiceCharge) return\n try {\n await provider.setOrderServiceCharge(order.id, percent)\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível mudar a taxa', { description: err?.message })\n }\n },\n\n async discountLines(input) {\n const order = get().openOrder\n if (!order || !provider.discountLines) return\n try {\n await provider.discountLines(order.id, input)\n await get().refreshAfterWrite()\n toast.success('Desconto aplicado')\n } catch (err: any) {\n toast.error('Não foi possível aplicar o desconto', { description: err?.message })\n }\n },\n\n async fetchCancelReasons() {\n if (!provider.getCancelReasons) return\n try {\n set({ cancelReasons: await provider.getCancelReasons() })\n } catch {\n set({ cancelReasons: [] })\n }\n },\n\n async addCancelReason(label) {\n if (!provider.addCancelReason) return\n try {\n await provider.addCancelReason(label)\n await get().fetchCancelReasons()\n } catch (err: any) {\n toast.error('Não foi possível criar o motivo', { description: err?.message })\n }\n },\n\n async updateCancelReason(id, patch) {\n if (!provider.updateCancelReason) return\n try {\n await provider.updateCancelReason(id, patch)\n await get().fetchCancelReasons()\n } catch (err: any) {\n toast.error('Não foi possível alterar o motivo', { description: err?.message })\n }\n },\n\n async deleteCancelReason(id) {\n if (!provider.deleteCancelReason) return\n try {\n await provider.deleteCancelReason(id)\n await get().fetchCancelReasons()\n } catch (err: any) {\n toast.error('Não foi possível excluir o motivo', { description: err?.message })\n }\n },\n\n async cancelLines(input) {\n const order = get().openOrder\n if (!order || !provider.cancelLines) return\n try {\n await provider.cancelLines(order.id, input)\n await get().refreshAfterWrite()\n toast.success(input.lineIds.length === 1 ? 'Item cancelado' : `${input.lineIds.length} itens cancelados`)\n } catch (err: any) {\n toast.error('Não foi possível cancelar', { description: err?.message })\n }\n },\n\n async transfer(input) {\n const order = get().openOrder\n if (!order || !provider.transfer) return\n try {\n await provider.transfer(order.id, input)\n await get().refreshAfterWrite()\n await get().fetchTransfers()\n toast.success('Transferência feita')\n } catch (err: any) {\n toast.error('Não foi possível transferir', { description: err?.message })\n }\n },\n\n async fetchTransfers() {\n const order = get().openOrder\n if (!order || !provider.getTransfers) { set({ transfers: [] }); return }\n try {\n set({ transfers: await provider.getTransfers(order.id) })\n } catch {\n set({ transfers: [] })\n }\n },\n\n async setSessionGuests(guests) {\n const order = get().openOrder\n if (!order || !provider.updateSessionGuests) return\n try {\n await provider.updateSessionGuests(order.id, guests)\n await get().refreshAfterWrite()\n } catch (err: any) {\n toast.error('Não foi possível mudar o número de pessoas', { description: err?.message })\n }\n },\n\n async seatGuests(input) {\n try {\n const session = await provider.seatGuests(input)\n const [tables, activeSessions, summary] = await Promise.all([\n provider.getTables(),\n provider.getActiveSessions(),\n provider.getSummary(),\n ])\n set({ tables, activeSessions, summary })\n const tableId = get().selectedTableId\n if (tableId) await get().fetchOpenOrder(tableId)\n toast.success('Mesa aberta')\n return session\n } catch (err: any) {\n toast.error('Não foi possível abrir a mesa', { description: err?.message })\n throw err\n }\n },\n\n async closeSession(sessionId) {\n try {\n await provider.closeSession(sessionId)\n const [tables, activeSessions, summary] = await Promise.all([\n provider.getTables(),\n provider.getActiveSessions(),\n provider.getSummary(),\n ])\n set({ tables, activeSessions, summary, openOrder: null })\n toast.success('Conta fechada')\n } catch (err: any) {\n toast.error('Não foi possível fechar a conta', { description: err?.message })\n throw err\n }\n },\n\n async updateTableStatus(input) {\n try {\n await provider.updateTableStatus(input)\n const [tables, summary] = await Promise.all([\n provider.getTables(),\n provider.getSummary(),\n ])\n set({ tables, summary })\n toast.success('Mesa atualizada')\n } catch (err: any) {\n toast.error('Não foi possível atualizar a mesa', { description: err?.message })\n throw err\n }\n },\n\n async createTable(input) {\n try {\n const table = await provider.createTable(input)\n const [tables, summary] = await Promise.all([\n provider.getTables(),\n provider.getSummary(),\n ])\n set({ tables, summary })\n toast.success('Mesa criada')\n return table\n } catch (err: any) {\n toast.error('Não foi possível criar a mesa', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// The settings-side CRUD of the floor plan. Same two tables the provider reads\n// (see ./core-supabase.ts) — a mesa cadastrada here is the mesa the salão shows,\n// not a second list that has to agree with it.\n\nconst zoneEntity: EntityDef = {\n name: 'Zone',\n namePlural: 'Zones',\n icon: 'MapPin',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'color', showInTable: true },\n { key: 'sortOrder', label: 'Order', type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'plg_tables_zones', tenantScoped: true },\n}\n\nconst tableEntity: EntityDef = {\n name: 'Table',\n namePlural: 'Tables',\n icon: 'Utensils',\n displayField: 'name',\n defaultSort: 'number',\n fields: [\n { key: 'number', label: 'Number', type: 'number', required: true, showInTable: true },\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'seats', label: 'Seats', type: 'number', showInTable: true, defaultValue: 2 },\n // The zone is a real FK, so it is picked from the zones registry rather\n // than typed: the salão a mesa belongs to has to be one that exists, and\n // `v_tables` joins on this id to group the floor plan.\n {\n key: 'zoneId', label: 'Zone', type: 'relation',\n relation: { table: 'plg_tables_zones', labelField: 'name' },\n showInTable: true,\n },\n {\n key: 'shape', label: 'Shape', type: 'select', showInTable: true, defaultValue: 'square',\n options: [\n { value: 'square', label: 'Square' },\n { value: 'round', label: 'Round' },\n { value: 'rectangle', label: 'Rectangle' },\n { value: 'bar', label: 'Bar' },\n ],\n },\n // `occupied` is deliberately absent: a mesa is occupied when a comanda is\n // open on it, which `v_tables` derives. Offering it here would let someone\n // type a state the floor plan then contradicts.\n {\n key: 'status', label: 'Status', type: 'select', showInTable: true, defaultValue: 'available',\n options: [\n { value: 'available', label: 'Available' },\n { value: 'reserved', label: 'Reserved' },\n { value: 'cleaning', label: 'Cleaning' },\n ],\n },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'plg_tables_tables', tenantScoped: true },\n}\n\n// The zone OWNS its mesas, and the foreign key already says so — declaring it\n// here is what turns \"zone_id\" into a tab on the zone's detail page.\nzoneEntity.relatedLists = [\n { entity: tableEntity, foreignKey: 'zoneId', label: 'Tables', icon: 'Utensils' },\n]\n\nexport const tablesRegistries: PluginRegistryDef[] = [\n {\n id: 'zones',\n entity: zoneEntity,\n icon: 'MapPin',\n description: 'Floor plan zones (indoor, outdoor, bar, etc.)',\n display: 'table',\n // No seed ids: the primary key is a uuid the database generates, and the\n // hand-written 'z-indoor' this used to carry could never be inserted.\n seedData: [\n { name: 'Indoor', color: '#3b82f6', sortOrder: 0, isActive: true },\n { name: 'Outdoor', color: '#22c55e', sortOrder: 1, isActive: true },\n { name: 'Bar', color: '#f59e0b', sortOrder: 2, isActive: true },\n ],\n },\n {\n id: 'tables',\n entity: tableEntity,\n icon: 'Utensils',\n description: 'The mesas themselves — number, seats and which zone they sit in.',\n display: 'table',\n },\n]\n","export const en: Record<string, string> = {\n 'tables.title': 'Tables',\n 'tables.nav.floorPlan': 'Floor Plan',\n 'tables.nav.zones': 'Zones',\n 'tables.nav.history': 'Session History',\n 'tables.floorPlan.title': 'Floor Plan',\n 'tables.floorPlan.manage': 'Manage tables and zones',\n 'tables.floorPlan.subtitle': 'Manage table layout and seating',\n 'tables.floorPlan.available': 'Available',\n 'tables.floorPlan.occupied': 'Occupied',\n 'tables.floorPlan.reserved': 'Reserved',\n 'tables.floorPlan.cleaning': 'Cleaning',\n 'tables.floorPlan.seats': 'seats',\n 'tables.floorPlan.noTables': 'No tables configured',\n 'tables.floorPlan.noTablesDesc': 'Add your first table to get started',\n 'tables.floorPlan.addTable': 'Add Table',\n 'tables.floorPlan.occupiedOf': '{occupied} occupied, {available} available of {total} tables',\n 'tables.floorPlan.selectTable': 'Select a table',\n 'tables.floorPlan.selectTableDesc': 'Click on any table to see details and actions',\n 'tables.floorPlan.min': 'min',\n 'tables.floorPlan.zone': 'Zone',\n 'tables.floorPlan.order': 'Order',\n 'tables.floorPlan.checkIn': 'Check In',\n 'tables.detail.currentSession': 'Current Session',\n 'tables.detail.guests': 'Guests',\n 'tables.detail.waiter': 'Waiter',\n 'tables.detail.elapsed': 'Elapsed',\n 'tables.detail.total': 'Running Total',\n 'tables.detail.viewOrder': 'View Order',\n 'tables.detail.seatGuests': 'Seat Guests',\n 'tables.detail.closeTable': 'Close Table',\n 'tables.detail.markClean': 'Mark Ready',\n 'tables.detail.cancel': 'Cancel',\n 'tables.seat.title': 'Seat Guests',\n 'tables.seat.guestCount': 'Number of guests',\n 'tables.seat.waiter': 'Waiter',\n 'tables.seat.notes': 'Notes',\n 'tables.seat.confirm': 'Seat',\n 'tables.history.title': 'Session History',\n 'tables.history.table': 'Table',\n 'tables.history.guests': 'Guests',\n 'tables.history.waiter': 'Waiter',\n 'tables.history.duration': 'Duration',\n 'tables.history.noSessions': 'No session history yet',\n 'tables.settings.title': 'Tables Settings',\n\n // -- The table's panel (right rail) ----------------------------------------\n 'tables.panel.ticket': 'Ticket',\n 'tables.panel.ticketLoading': 'Reading the ticket…',\n 'tables.panel.ticketEmpty': 'Empty ticket',\n 'tables.panel.ticketEmptyDesc': 'Nothing has been rung up for this table yet.',\n 'tables.panel.noReader': 'This install does not read tickets from the floor plan — open the order under Orders.',\n 'tables.panel.addItem': 'Add item',\n 'tables.panel.searchMenu': 'Search the menu',\n 'tables.panel.menuEmpty': 'Nothing by that name on the menu.',\n 'tables.panel.each': 'each',\n 'tables.panel.addOne': 'Add {item}',\n 'tables.panel.removeOne': 'Remove one {item}',\n 'tables.panel.removeItem': 'Remove {item}',\n 'tables.panel.howManyGuests': 'How many guests',\n 'tables.panel.guestsAtTable': 'Guests at the table',\n 'tables.panel.oneLess': 'One guest fewer',\n 'tables.panel.oneMore': 'One guest more',\n 'tables.panel.overCapacity': 'This table seats {seats}, for {guests} guests.',\n 'tables.panel.tableNote': 'Table note',\n 'tables.panel.cleaningDesc': 'The table is out of service for cleaning. Mark it ready to free it up.',\n 'tables.panel.subtotal': 'Subtotal',\n 'tables.panel.service': 'Service {percent}%',\n 'tables.panel.serviceMixed': 'Service (mixed rates)',\n 'tables.panel.cancelledTotal': 'Cancelled',\n 'tables.panel.paid': 'Paid',\n 'tables.panel.due': 'Balance due',\n 'tables.panel.discount': 'Discount',\n 'tables.panel.total': 'Total',\n 'tables.panel.perPerson': 'Per person ({guests})',\n 'tables.panel.openTable': 'Open table',\n 'tables.panel.cancelReservation': 'Cancel reservation',\n 'tables.panel.seat': 'Seat',\n 'tables.panel.closeBill': 'Close bill',\n 'tables.panel.backToTicket': 'Back to the ticket',\n 'tables.panel.closingEmpty': 'This ticket has nothing on it.',\n 'tables.panel.closingSummary': '{count} items · {total}',\n 'tables.panel.closingSummaryOne': '1 item · {total}',\n 'tables.panel.closingPerPerson': '{amount} per person',\n 'tables.panel.confirmClose': 'Confirm close',\n 'tables.panel.guestOne': 'guest',\n 'tables.panel.guestMany': 'guests',\n 'tables.panel.pickerTitle': 'Pick items',\n 'tables.panel.allCategories': 'All',\n 'tables.panel.columnItem': 'Item',\n 'tables.panel.columnCategory': 'Category',\n 'tables.panel.columnPrice': 'Price',\n}\n","export const ptBR: Record<string, string> = {\n 'tables.title': 'Mesas',\n 'tables.nav.floorPlan': 'Mapa de Mesas',\n 'tables.nav.zones': 'Áreas',\n 'tables.nav.history': 'Histórico',\n 'tables.floorPlan.title': 'Mapa de Mesas',\n 'tables.floorPlan.manage': 'Cadastrar mesas e salões',\n 'tables.floorPlan.subtitle': 'Gerencie o layout e a ocupação das mesas',\n 'tables.floorPlan.available': 'Disponível',\n 'tables.floorPlan.occupied': 'Ocupada',\n 'tables.floorPlan.reserved': 'Reservada',\n 'tables.floorPlan.cleaning': 'Limpeza',\n 'tables.floorPlan.seats': 'lugares',\n 'tables.floorPlan.noTables': 'Nenhuma mesa configurada',\n 'tables.floorPlan.noTablesDesc': 'Adicione a primeira mesa para começar',\n 'tables.floorPlan.addTable': 'Adicionar Mesa',\n 'tables.floorPlan.occupiedOf': '{occupied} ocupadas, {available} disponíveis de {total} mesas',\n 'tables.floorPlan.selectTable': 'Selecione uma mesa',\n 'tables.floorPlan.selectTableDesc': 'Clique em uma mesa para ver detalhes e ações',\n 'tables.floorPlan.min': 'min',\n 'tables.floorPlan.zone': 'Área',\n 'tables.floorPlan.order': 'Pedido',\n 'tables.floorPlan.checkIn': 'Check-in',\n 'tables.detail.currentSession': 'Sessão Atual',\n 'tables.detail.guests': 'Pessoas',\n 'tables.detail.waiter': 'Garçom',\n 'tables.detail.elapsed': 'Tempo',\n 'tables.detail.total': 'Total Parcial',\n 'tables.detail.viewOrder': 'Ver Pedido',\n 'tables.detail.seatGuests': 'Sentar Clientes',\n 'tables.detail.closeTable': 'Fechar Mesa',\n 'tables.detail.markClean': 'Marcar Pronta',\n 'tables.detail.cancel': 'Cancelar',\n 'tables.seat.title': 'Sentar Clientes',\n 'tables.seat.guestCount': 'Número de pessoas',\n 'tables.seat.waiter': 'Garçom',\n 'tables.seat.notes': 'Observações',\n 'tables.seat.confirm': 'Sentar',\n 'tables.history.title': 'Histórico de Sessões',\n 'tables.history.table': 'Mesa',\n 'tables.history.guests': 'Pessoas',\n 'tables.history.waiter': 'Garçom',\n 'tables.history.duration': 'Duração',\n 'tables.history.noSessions': 'Nenhum histórico de sessões',\n 'tables.settings.title': 'Configurações de Mesas',\n\n // -- The mesa's panel (right rail) -----------------------------------------\n 'tables.panel.ticket': 'Comanda',\n 'tables.panel.ticketLoading': 'Lendo a comanda…',\n 'tables.panel.ticketEmpty': 'Comanda vazia',\n 'tables.panel.ticketEmptyDesc': 'Nada foi lançado ainda para esta mesa.',\n 'tables.panel.noReader': 'Esta instalação não lê comandas pelo mapa de mesas — abra o pedido em Pedidos.',\n 'tables.panel.addItem': 'Lançar item',\n 'tables.panel.searchMenu': 'Buscar no cardápio',\n 'tables.panel.menuEmpty': 'Nada com esse nome no cardápio.',\n 'tables.panel.each': 'cada',\n 'tables.panel.addOne': 'Adicionar {item}',\n 'tables.panel.removeOne': 'Tirar um {item}',\n 'tables.panel.removeItem': 'Remover {item}',\n 'tables.panel.howManyGuests': 'Quantas pessoas',\n 'tables.panel.guestsAtTable': 'Pessoas na mesa',\n 'tables.panel.oneLess': 'Menos uma pessoa',\n 'tables.panel.oneMore': 'Mais uma pessoa',\n 'tables.panel.overCapacity': 'Esta mesa tem {seats} lugares para {guests} pessoas.',\n 'tables.panel.tableNote': 'Observação da mesa',\n 'tables.panel.cleaningDesc': 'A mesa saiu de serviço e está em limpeza. Marque como pronta para liberá-la.',\n 'tables.panel.subtotal': 'Subtotal',\n 'tables.panel.service': 'Serviço {percent}%',\n 'tables.panel.serviceMixed': 'Serviço (taxas diferentes)',\n 'tables.panel.cancelledTotal': 'Cancelado',\n 'tables.panel.paid': 'Já pago',\n 'tables.panel.due': 'Saldo devedor',\n 'tables.panel.discount': 'Desconto',\n 'tables.panel.total': 'Total',\n 'tables.panel.perPerson': 'Por pessoa ({guests})',\n 'tables.panel.openTable': 'Abrir mesa',\n 'tables.panel.cancelReservation': 'Cancelar reserva',\n 'tables.panel.seat': 'Sentar',\n 'tables.panel.closeBill': 'Fechar conta',\n 'tables.panel.backToTicket': 'Voltar à comanda',\n 'tables.panel.closingEmpty': 'Esta comanda não tem nenhum item lançado.',\n 'tables.panel.closingSummary': '{count} itens · {total}',\n 'tables.panel.closingSummaryOne': '1 item · {total}',\n 'tables.panel.closingPerPerson': '{amount} por pessoa',\n 'tables.panel.confirmClose': 'Confirmar fechamento',\n 'tables.panel.guestOne': 'pessoa',\n 'tables.panel.guestMany': 'pessoas',\n 'tables.panel.pickerTitle': 'Selecionar itens',\n 'tables.panel.allCategories': 'Tudo',\n 'tables.panel.columnItem': 'Item',\n 'tables.panel.columnCategory': 'Categoria',\n 'tables.panel.columnPrice': 'Preço',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const tablesLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateTableInput,\n RestaurantTable,\n SeatGuestsInput,\n TableQuery,\n TableSession,\n TablesSummary,\n TableStatus,\n UpdateTableStatusInput,\n Zone,\n} from '../types'\nimport type { TablesDataProvider } from './types'\n\nexport interface FayzTablesProviderOptions extends FayzClientOptions {\n projectId?: string\n tableName?: string\n schema?: string\n runtime?: boolean\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * restaurant_tables table. When omitted, scoping is left to runtime/RLS.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface RestaurantTableRow {\n id: string\n tenant_id?: string | null\n name?: string | null\n number?: number | null\n seats?: number | null\n status?: TableStatus | null\n zone?: string | null\n zone_name?: string | null\n shape?: RestaurantTable['shape'] | null\n grid_col?: number | null\n grid_row?: number | null\n is_active?: boolean | null\n current_session_id?: string | null\n current_order_id?: string | null\n current_guests?: number | null\n current_waiter_name?: string | null\n current_elapsed_minutes?: number | null\n current_total?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nconst DEFAULT_TABLE_NAME = 'restaurant_tables'\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction rowToTable(row: RestaurantTableRow): RestaurantTable {\n const number = row.number ?? 0\n const zone = row.zone ?? 'indoor'\n return {\n id: row.id,\n name: row.name ?? `Table ${number}`,\n number,\n seats: row.seats ?? 4,\n status: row.status ?? 'available',\n zone,\n zoneName: row.zone_name ?? zone,\n shape: row.shape ?? 'square',\n gridCol: row.grid_col ?? 0,\n gridRow: row.grid_row ?? 0,\n isActive: row.is_active ?? true,\n currentSessionId: row.current_session_id ?? undefined,\n currentOrderId: row.current_order_id ?? undefined,\n currentGuests: row.current_guests ?? undefined,\n currentWaiterName: row.current_waiter_name ?? undefined,\n currentElapsedMinutes: row.current_elapsed_minutes ?? undefined,\n currentTotal: row.current_total ?? undefined,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n }\n}\n\nfunction tableCreatePayload(input: CreateTableInput): Record<string, unknown> {\n return {\n name: input.name,\n number: input.number,\n seats: input.seats,\n zone: input.zone,\n shape: input.shape ?? 'square',\n grid_col: input.gridCol ?? 0,\n grid_row: input.gridRow ?? 0,\n status: 'available',\n is_active: true,\n }\n}\n\nfunction tableUpdatePayload(data: Partial<RestaurantTable>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.name !== undefined) payload.name = data.name\n if (data.number !== undefined) payload.number = data.number\n if (data.seats !== undefined) payload.seats = data.seats\n if (data.status !== undefined) payload.status = data.status\n if (data.zone !== undefined) payload.zone = data.zone\n if (data.zoneName !== undefined) payload.zone_name = data.zoneName\n if (data.shape !== undefined) payload.shape = data.shape\n if (data.gridCol !== undefined) payload.grid_col = data.gridCol\n if (data.gridRow !== undefined) payload.grid_row = data.gridRow\n if (data.isActive !== undefined) payload.is_active = data.isActive\n if (data.currentSessionId !== undefined) payload.current_session_id = data.currentSessionId\n if (data.currentOrderId !== undefined) payload.current_order_id = data.currentOrderId\n if (data.currentGuests !== undefined) payload.current_guests = data.currentGuests\n if (data.currentWaiterName !== undefined) payload.current_waiter_name = data.currentWaiterName\n if (data.currentElapsedMinutes !== undefined) payload.current_elapsed_minutes = data.currentElapsedMinutes\n if (data.currentTotal !== undefined) payload.current_total = data.currentTotal\n if (data.metadata !== undefined) payload.metadata = data.metadata\n return payload\n}\n\nfunction filtersFromQuery(query?: TableQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = [{ column: 'is_active', operator: 'eq', value: true }]\n if (!query) return filters\n if (query.zone) filters.push({ column: 'zone', operator: 'eq', value: query.zone })\n if (query.status && !Array.isArray(query.status)) {\n filters.push({ column: 'status', operator: 'eq', value: query.status })\n }\n return filters\n}\n\nfunction matchesClientQuery(table: RestaurantTable, query?: TableQuery): boolean {\n if (!query) return true\n if (Array.isArray(query.status) && !query.status.includes(table.status)) return false\n if (query.search) {\n const search = query.search.toLowerCase()\n return table.name.toLowerCase().includes(search)\n || String(table.number).includes(search)\n || (table.zoneName?.toLowerCase().includes(search) ?? false)\n }\n return true\n}\n\nfunction summarize(tables: RestaurantTable[]): TablesSummary {\n const availableCount = tables.filter((table) => table.status === 'available').length\n const occupiedCount = tables.filter((table) => table.status === 'occupied').length\n const reservedCount = tables.filter((table) => table.status === 'reserved').length\n const cleaningCount = tables.filter((table) => table.status === 'cleaning').length\n const totalSeats = tables.reduce((sum, table) => sum + table.seats, 0)\n const occupiedSeats = tables\n .filter((table) => table.status === 'occupied')\n .reduce((sum, table) => sum + (table.currentGuests ?? table.seats), 0)\n\n return {\n totalTables: tables.length,\n availableCount,\n occupiedCount,\n reservedCount,\n cleaningCount,\n totalSeats,\n occupiedSeats,\n averageSessionMinutes: 0,\n }\n}\n\nexport function createFayzTablesProvider(options: FayzTablesProviderOptions = {}): TablesDataProvider {\n const client = createFayzClient(options)\n const table = options.tableName ?? DEFAULT_TABLE_NAME\n const baseOptions = {\n projectId: options.projectId,\n table,\n schema: options.schema,\n runtime: options.runtime,\n }\n\n function resolveTenant(): string | undefined {\n const value = typeof options.tenantId === 'function' ? options.tenantId() : options.tenantId\n return value ?? undefined\n }\n\n function withTenant(filters: FayzTableFilter[]): FayzTableFilter[] {\n const tenantId = resolveTenant()\n return tenantId ? [{ column: 'tenant_id', operator: 'eq', value: tenantId }, ...filters] : filters\n }\n\n async function listTables(query?: TableQuery): Promise<RestaurantTable[]> {\n const response = await client.data.listRows<RestaurantTableRow>({\n ...baseOptions,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'number',\n sortDirection: 'asc',\n limit: 500,\n })\n return response.rows.map(rowToTable).filter((item) => matchesClientQuery(item, query))\n }\n\n async function getById(id: string): Promise<RestaurantTable | null> {\n const response = await client.data.listRows<RestaurantTableRow>({\n ...baseOptions,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return response.rows[0] ? rowToTable(response.rows[0]) : null\n }\n\n return {\n async getTables(query?: TableQuery) {\n return listTables(query)\n },\n\n async getTableById(id: string) {\n return getById(id)\n },\n\n async createTable(input: CreateTableInput) {\n const tenantId = resolveTenant()\n const row = await client.data.createRow<RestaurantTableRow>({\n ...baseOptions,\n row: tenantId ? { ...tableCreatePayload(input), tenant_id: tenantId } : tableCreatePayload(input),\n })\n return rowToTable(row)\n },\n\n async updateTable(id: string, data: Partial<RestaurantTable>) {\n const row = await client.data.updateRow<RestaurantTableRow>({\n ...baseOptions,\n primaryKeys: { id },\n row: tableUpdatePayload(data),\n })\n return rowToTable(row)\n },\n\n async deleteTable(id: string) {\n await client.data.deleteRows({ ...baseOptions, rows: [{ id }] })\n },\n\n async updateTableStatus(input: UpdateTableStatusInput) {\n return this.updateTable(input.tableId, { status: input.status })\n },\n\n async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>) {\n await Promise.all(positions.map((position) => this.updateTable(position.id, {\n gridCol: position.gridCol,\n gridRow: position.gridRow,\n })))\n },\n\n async seatGuests(input: SeatGuestsInput) {\n const table = await this.updateTable(input.tableId, {\n status: 'occupied',\n currentGuests: input.guests,\n currentWaiterName: input.waiterId ? `Waiter ${input.waiterId}` : undefined,\n currentElapsedMinutes: 0,\n currentTotal: 0,\n })\n const session: TableSession = {\n id: table.currentSessionId ?? `runtime-session-${table.id}`,\n tableId: table.id,\n tableName: table.name,\n guests: input.guests,\n waiterId: input.waiterId,\n waiterName: table.currentWaiterName,\n seatedAt: nowIso(),\n status: 'active',\n notes: input.notes,\n tenantId: table.tenantId,\n createdAt: nowIso(),\n }\n return session\n },\n\n async closeSession(sessionId: string) {\n const tables = await listTables()\n const table = tables.find((item) => item.currentSessionId === sessionId)\n if (table) await this.updateTable(table.id, {\n status: 'cleaning',\n currentSessionId: undefined,\n currentOrderId: undefined,\n currentGuests: undefined,\n currentWaiterName: undefined,\n currentElapsedMinutes: undefined,\n currentTotal: undefined,\n })\n return {\n id: sessionId,\n tableId: table?.id ?? '',\n tableName: table?.name,\n guests: table?.currentGuests ?? 0,\n seatedAt: nowIso(),\n closedAt: nowIso(),\n status: 'closed',\n tenantId: table?.tenantId ?? 'runtime-tenant',\n createdAt: nowIso(),\n }\n },\n\n async getActiveSessions() {\n const tables = await listTables({ status: 'occupied' })\n return tables.map((table) => ({\n id: table.currentSessionId ?? `runtime-session-${table.id}`,\n tableId: table.id,\n tableName: table.name,\n guests: table.currentGuests ?? table.seats,\n waiterName: table.currentWaiterName,\n seatedAt: nowIso(),\n status: 'active' as const,\n tenantId: table.tenantId,\n createdAt: nowIso(),\n }))\n },\n\n async getSessionHistory() {\n return []\n },\n\n async getZones() {\n const tables = await listTables()\n const zones = new Map<string, Zone>()\n for (const table of tables) {\n if (zones.has(table.zone)) continue\n zones.set(table.zone, {\n id: table.zone,\n name: table.zoneName ?? table.zone,\n sortOrder: zones.size,\n isActive: true,\n tenantId: table.tenantId,\n createdAt: table.createdAt,\n })\n }\n return [...zones.values()]\n },\n\n async createZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async updateZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async deleteZone() {\n throw new Error('Restaurant zone writes require a dedicated Fayz table/broker contract.')\n },\n\n async getSummary() {\n return summarize(await listTables())\n },\n }\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { TablesDataProvider } from './types'\nimport type {\n RestaurantTable, TableSession, Zone, TableStatus, TableShape,\n CreateTableInput, SeatGuestsInput, UpdateTableStatusInput,\n TableQuery, TablesSummary,\n TableOrder, TableOrderLine, TableMenuItem, TableMenuCategory, AddTableOrderLineInput,\n ComandaSettings, ComandaGuest, CancelReason, OrderTransfer,\n DiscountLineInput, CancelLineInput, TransferInput,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// The floor plan, over the tables plugin's own schema.\n//\n// public.plg_tables_zones the salões\n// public.plg_tables_tables the mesas\n// public.plg_tables_order_extensions which comanda is open on which mesa\n// public.v_tables the two joined, with occupancy derived\n//\n// Two earlier attempts are worth remembering, because both look right:\n// `public.restaurant_tables` was never created in any pool, and\n// `orders.location_id` is a FK to `app.units` — the BRANCH, so pointing a mesa\n// at it would file a comanda under a filial.\n//\n// OCCUPANCY IS NOT STORED. A mesa is occupied when a comanda is open on it, and\n// `v_tables` derives exactly that. Only `reserved` and `cleaning` are written,\n// because those are decisions nobody can infer. That is why the floor plan and\n// the orders list cannot drift apart: there is one fact, read twice.\n// ---------------------------------------------------------------------------\n\nconst ZONES = 'plg_tables_zones'\nconst TABLES = 'plg_tables_tables'\nconst ORDER_EXT = 'plg_tables_order_extensions'\nconst VIEW = 'v_tables'\n\n/** The archetype's ONE line table. A comanda's items are rows here. */\nconst LINES = 'items'\n/** What can be rung up. The core catalogue, not the menu plugin's view: a floor\n * plan should not stop working because `plg_menu_items` is not installed. */\nconst CATALOG = 'products'\n/**\n * How the CARDÁPIO groups those products — \"Principais\", \"Sobremesas\".\n *\n * Not `public.categories`. A category is what a product IS for the catalogue\n * (\"Tacos\"); a section is where it sits on the menu you hand someone, and the\n * waiter is reading the menu. They disagree in the seeded data already: Taco al\n * pastor is category Tacos and section Principais, and the picker was showing\n * the word the Cardápio screen never says.\n *\n * Optional, still: a house with no menu plugin has no sections, and both\n * readers below fall back to the core categories rather than going empty.\n */\nconst SETTINGS = 'plg_tables_settings'\nconst GUESTS = 'plg_tables_order_guests'\nconst ITEM_GUESTS = 'plg_tables_item_guests'\nconst CANCEL_REASONS = 'plg_tables_cancel_reasons'\nconst TRANSFERS = 'plg_tables_order_transfers'\nconst GUESTS_VIEW = 'v_comanda_guests'\n/** Quanto já entrou. A MESMA vista que o quadro de pedidos lê — duas leituras\n * do mesmo fato, nunca duas contas. */\nconst BALANCES = 'v_invoice_balances'\nconst SECTIONS = 'plg_menu_sections'\n/** section ↔ product. `item_id` IS the product id — `plg_menu_items` is keyed\n * on `product_id`, so the menu adds no id of its own. */\nconst PLACEMENTS = 'plg_menu_placements'\n\n/** The comanda a seating opens. Same species the board and the KDS read. */\nconst SEATING_KIND = 'dine_in'\n\nexport interface CoreTablesWriteOptions {\n /** The active org, stamped on insert. RLS checks it again on the way in. */\n tenantId: () => string | undefined | null\n /**\n * How a comanda opened here gets its number.\n *\n * Without it the order goes in with `reference_number` null — nothing in the\n * pool numbers one — and every screen falls back to the short id. That is\n * survivable but it is why the orders board shows a uuid beside comandas the\n * floor plan opened and a real number beside the ones the balcão did.\n *\n * The sequence kind is the APP's, not this plugin's: a restaurant numbers\n * comandas on the same counter as its other orders, and only the app knows\n * which counter that is.\n */\n reference?: {\n sequenceKind: string\n /** Permission the sequence RPC checks. Defaults to `orders.create`. */\n permission?: string\n /** Prepended to the padded number, e.g. `PED-`. */\n prefix?: string\n /** Zero-padding width. Defaults to 6. */\n pad?: number\n }\n}\n\nexport interface CoreTablesProviderOptions {\n /** Present makes the provider writable; without it every mutation refuses. */\n writes?: CoreTablesWriteOptions\n}\n\nconst READ_ONLY = 'This provider reads the floor plan; pass `writes` to let the app that owns it change tables.'\n\nexport function createCoreTablesProvider(options?: CoreTablesProviderOptions): TablesDataProvider {\n const db = () => {\n const client = getSupabaseClientOptional() as any\n if (!client) throw new Error('Supabase client is not configured')\n return client\n }\n\n function requireWrites(): CoreTablesWriteOptions {\n if (!options?.writes) throw new Error(READ_ONLY)\n return options.writes\n }\n\n /** The comanda's number, or undefined when the app did not say how to get\n * one. Never throws: a mesa that cannot be numbered still has to open. */\n async function nextReference(): Promise<string | undefined> {\n const spec = options?.writes?.reference\n if (!spec) return undefined\n try {\n const { data, error } = await db().rpc('next_sequence_authorized', {\n p_kind: spec.sequenceKind,\n p_permission: spec.permission ?? 'orders.create',\n })\n if (error) throw new Error(error.message)\n return `${spec.prefix ?? ''}${String(data).padStart(spec.pad ?? 6, '0')}`\n } catch (err: any) {\n // Loud rather than silent: an unnumbered comanda means the tenant has no\n // sequence grant, and inventing a number off the wall clock would collide\n // with the counter the rest of the app shares.\n console.warn('[tables] next_sequence_authorized unavailable:', err?.message)\n return undefined\n }\n }\n\n function tenant(): string {\n const id = requireWrites().tenantId()\n if (!id) throw new Error('No active organization: the floor plan cannot be changed without one')\n return id\n }\n\n function shortRef(orderId?: string | null): string | undefined {\n return orderId ? `#${String(orderId).slice(0, 8)}` : undefined\n }\n\n function num(value: unknown): number {\n return Number(value) || 0\n }\n\n function rowToLine(r: Record<string, any>): TableOrderLine {\n const meta = (r.metadata ?? {}) as Record<string, unknown>\n return {\n id: r.id,\n productId: r.product_id ?? undefined,\n name: r.name ?? '',\n quantity: num(r.quantity),\n unitPrice: num(r.unit_price),\n discount: num(r.discount),\n total: num(r.total),\n notes: typeof meta.kitchenNotes === 'string' ? meta.kitchenNotes : undefined,\n guestId: r.guest_id ?? undefined,\n cancelledAt: r.cancelled_at ?? undefined,\n cancelReason: r.cancel_reason ?? undefined,\n }\n }\n\n function rowToGuest(r: Record<string, any>): ComandaGuest {\n return {\n id: r.id,\n seatNo: Number(r.seat_no) || 0,\n label: r.label ?? undefined,\n ownServiceChargePercent: r.own_service_charge_percent == null\n ? undefined : num(r.own_service_charge_percent),\n serviceChargePercent: num(r.service_charge_percent),\n subtotal: num(r.subtotal),\n serviceCharge: num(r.service_charge),\n cancelledTotal: num(r.cancelled_total),\n itemCount: Number(r.item_count) || 0,\n }\n }\n\n /** The comanda's totals ARE the sum of its lines, and nothing in the pool\n * keeps them so: `items` has no trigger writing back to `orders`. Every\n * write to a line ends here, or the floor plan shows a stale total. */\n async function recalc(orderId: string): Promise<void> {\n // A soma mora no BANCO (`public.comanda_recalc`), não aqui.\n //\n // Antes ela era esta função: somava as linhas e escrevia `subtotal` e\n // `total`, e a TAXA DE SERVIÇO ficava de fora — ela era uma constante do\n // app desenhada só no rodapé do painel. A fatura levantada no fechamento\n // não a via, e a conta que o cliente lia no rodapé não era a conta que o\n // restaurante recebia. Era o V1-044 (o Resumo Financeiro que não fecha)\n // reproduzido de novo, uma casa decimal por vez.\n //\n // Agora a função do banco sabe das três quedas da taxa (participante →\n // mesa → casa) e exclui o item cancelado. Uma conta, um lugar.\n const { error } = await db().rpc('comanda_recalc', { p_order_id: orderId })\n if (error) throw new Error(error.message)\n }\n\n function rowToTable(r: Record<string, any>): RestaurantTable {\n const elapsed = r.seated_at\n ? Math.max(0, Math.round((Date.now() - new Date(r.seated_at).getTime()) / 60000))\n : undefined\n return {\n id: r.id,\n name: r.name,\n number: Number(r.number) || 0,\n seats: Number(r.seats) || 0,\n status: (r.status ?? 'available') as TableStatus,\n zone: r.zone_id ?? '',\n zoneName: r.zone_name ?? undefined,\n shape: (r.shape ?? 'square') as TableShape,\n gridCol: Number(r.grid_col) || 0,\n gridRow: Number(r.grid_row) || 0,\n isActive: r.is_active !== false,\n // The session IS the comanda, so the two ids are deliberately the same:\n // closing one closes the other, and there is no third row to disagree.\n currentSessionId: r.current_order_id ?? undefined,\n currentOrderId: r.current_order_id ?? undefined,\n // A comanda opened by `seatGuests` has no reference_number — nothing in\n // the pool numbers one — so the short id stands in. It is still shorter\n // than the uuid the panel used to print in full.\n currentOrderReference: r.current_order_reference ?? shortRef(r.current_order_id),\n currentGuests: r.current_guests ?? undefined,\n currentElapsedMinutes: r.current_order_id ? elapsed : undefined,\n currentTotal: r.current_order_id ? Number(r.current_total) || 0 : undefined,\n tenantId: r.tenant_id,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n }\n }\n\n async function loadTables(query?: TableQuery): Promise<RestaurantTable[]> {\n let q = db().from(VIEW).select('*').order('number')\n if (query?.zone) q = q.eq('zone_id', query.zone)\n if (query?.search) q = q.ilike('name', `%${query.search}%`)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n let tables = (data ?? []).map(rowToTable)\n if (query?.status) {\n const wanted = Array.isArray(query.status) ? query.status : [query.status]\n tables = tables.filter((t: RestaurantTable) => wanted.includes(t.status))\n }\n return tables\n }\n\n async function tableById(id: string): Promise<RestaurantTable> {\n const { data, error } = await db().from(VIEW).select('*').eq('id', id).maybeSingle()\n if (error) throw new Error(error.message)\n if (!data) throw new Error('Table not found')\n return rowToTable(data)\n }\n\n /** The open comanda rows, joined to the mesa they sit on. */\n async function openSeatings(tableId?: string): Promise<any[]> {\n let q = db().from(ORDER_EXT)\n .select('order_id, table_id, guests, seated_at, tenant_id, orders!inner(id, status, notes, assignee_id)')\n .not('orders.status', 'in', '(\"completed\",\"cancelled\")')\n if (tableId) q = q.eq('table_id', tableId)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n return data ?? []\n }\n\n function rowToSession(r: any, tableName?: string): TableSession {\n const order = Array.isArray(r.orders) ? r.orders[0] : r.orders\n const closed = order && ['completed', 'cancelled'].includes(order.status)\n return {\n id: r.order_id,\n tableId: r.table_id,\n tableName,\n orderId: r.order_id,\n guests: r.guests ?? 0,\n waiterId: order?.assignee_id ?? undefined,\n seatedAt: r.seated_at,\n status: closed ? 'closed' : 'active',\n notes: order?.notes ?? undefined,\n tenantId: r.tenant_id,\n createdAt: r.seated_at,\n }\n }\n\n return {\n getTables: (query?: TableQuery) => loadTables(query),\n\n async getTableById(id: string): Promise<RestaurantTable | null> {\n const { data, error } = await db().from(VIEW).select('*').eq('id', id).maybeSingle()\n if (error) throw new Error(error.message)\n return data ? rowToTable(data) : null\n },\n\n async createTable(input: CreateTableInput): Promise<RestaurantTable> {\n const tenantId = tenant()\n const { data, error } = await db().from(TABLES).insert({\n tenant_id: tenantId,\n zone_id: input.zone || null,\n name: input.name,\n number: input.number,\n seats: input.seats,\n shape: input.shape ?? 'square',\n grid_col: input.gridCol ?? 0,\n grid_row: input.gridRow ?? 0,\n }).select('id').single()\n if (error) throw new Error(error.message)\n return tableById(data.id)\n },\n\n async updateTable(id: string, data: Partial<RestaurantTable>): Promise<RestaurantTable> {\n requireWrites()\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.number !== undefined) patch.number = data.number\n if (data.seats !== undefined) patch.seats = data.seats\n if (data.shape !== undefined) patch.shape = data.shape\n if (data.zone !== undefined) patch.zone_id = data.zone || null\n if (data.gridCol !== undefined) patch.grid_col = data.gridCol\n if (data.gridRow !== undefined) patch.grid_row = data.gridRow\n if (data.isActive !== undefined) patch.is_active = data.isActive\n // `occupied` is never written — it is the open comanda. Asking for it is\n // asking to seat someone, which is what seatGuests is for.\n if (data.status !== undefined && data.status !== 'occupied') patch.status = data.status\n if (Object.keys(patch).length) {\n const { error } = await db().from(TABLES).update(patch).eq('id', id)\n if (error) throw new Error(error.message)\n }\n return tableById(id)\n },\n\n async deleteTable(id: string): Promise<void> {\n requireWrites()\n const { error } = await db().from(TABLES).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async updateTableStatus(input: UpdateTableStatusInput): Promise<RestaurantTable> {\n requireWrites()\n if (input.status === 'occupied') {\n throw new Error('Uma mesa fica ocupada ao abrir a comanda — use \"sentar\" em vez de marcar o estado.')\n }\n const { error } = await db().from(TABLES).update({ status: input.status }).eq('id', input.tableId)\n if (error) throw new Error(error.message)\n return tableById(input.tableId)\n },\n\n async updateTablePositions(positions: Array<{ id: string; gridCol: number; gridRow: number }>): Promise<void> {\n requireWrites()\n for (const p of positions) {\n const { error } = await db().from(TABLES)\n .update({ grid_col: p.gridCol, grid_row: p.gridRow }).eq('id', p.id)\n if (error) throw new Error(error.message)\n }\n },\n\n async seatGuests(input: SeatGuestsInput): Promise<TableSession> {\n const tenantId = tenant()\n const table = await tableById(input.tableId)\n if (table.status === 'occupied') throw new Error(`${table.name} já tem uma comanda aberta`)\n\n // Seating IS opening the comanda. party_id is left out so the archetype's\n // `walkin_party` fills it — a mesa with no named customer is exactly that.\n const reference = await nextReference()\n const { data: order, error } = await db().from('orders').insert({\n tenant_id: tenantId,\n kind: SEATING_KIND,\n status: 'new',\n channel: 'dine_in',\n ...(reference ? { reference_number: reference } : {}),\n ...(input.waiterId ? { assignee_id: input.waiterId } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n subtotal: 0, total: 0, currency: 'BRL',\n }).select('id, status, notes, assignee_id').single()\n if (error) throw new Error(error.message)\n\n const { data: ext, error: extError } = await db().from(ORDER_EXT).insert({\n order_id: order.id,\n tenant_id: tenantId,\n table_id: input.tableId,\n guests: input.guests,\n }).select('order_id, table_id, guests, seated_at, tenant_id').single()\n if (extError) {\n // The comanda without its mesa is a comanda nobody can find. Undo it.\n await db().from('orders').delete().eq('id', order.id)\n throw new Error(extError.message)\n }\n return rowToSession({ ...ext, orders: order }, table.name)\n },\n\n async closeSession(sessionId: string): Promise<TableSession> {\n requireWrites()\n // The session id IS the order id: closing the mesa completes the comanda,\n // and the mesa frees itself because occupancy is derived from it.\n const { data: order, error } = await db().from('orders')\n .update({ status: 'completed' }).eq('id', sessionId)\n .select('id, status, notes, assignee_id').single()\n if (error) throw new Error(error.message)\n const { data: ext } = await db().from(ORDER_EXT)\n .select('order_id, table_id, guests, seated_at, tenant_id').eq('order_id', sessionId).maybeSingle()\n return rowToSession({ ...(ext ?? { order_id: sessionId }), orders: order })\n },\n\n async getActiveSessions(): Promise<TableSession[]> {\n const [rows, tables] = await Promise.all([openSeatings(), loadTables()])\n const names = new Map(tables.map((t) => [t.id, t.name]))\n return rows.map((r) => rowToSession(r, names.get(r.table_id)))\n },\n\n async getSessionHistory(tableId?: string): Promise<TableSession[]> {\n let q = db().from(ORDER_EXT)\n .select('order_id, table_id, guests, seated_at, tenant_id, orders(id, status, notes, assignee_id)')\n .order('seated_at', { ascending: false })\n .limit(200)\n if (tableId) q = q.eq('table_id', tableId)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n const names = new Map((await loadTables()).map((t) => [t.id, t.name]))\n return (data ?? []).map((r: any) => rowToSession(r, names.get(r.table_id)))\n },\n\n async getZones(): Promise<Zone[]> {\n const { data, error } = await db().from(ZONES).select('*').order('sort_order')\n if (error) throw new Error(error.message)\n return (data ?? []).map((z: any) => ({\n id: z.id, name: z.name, color: z.color ?? undefined,\n sortOrder: z.sort_order ?? 0, isActive: z.is_active !== false,\n tenantId: z.tenant_id, createdAt: z.created_at,\n }))\n },\n\n async createZone(data: Partial<Zone>): Promise<Zone> {\n const tenantId = tenant()\n const { data: row, error } = await db().from(ZONES).insert({\n tenant_id: tenantId,\n name: data.name ?? 'Salão',\n color: data.color ?? null,\n sort_order: data.sortOrder ?? 0,\n }).select('*').single()\n if (error) throw new Error(error.message)\n return {\n id: row.id, name: row.name, color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0, isActive: true,\n tenantId: row.tenant_id, createdAt: row.created_at,\n }\n },\n\n async updateZone(id: string, data: Partial<Zone>): Promise<Zone> {\n requireWrites()\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.color !== undefined) patch.color = data.color\n if (data.sortOrder !== undefined) patch.sort_order = data.sortOrder\n if (data.isActive !== undefined) patch.is_active = data.isActive\n const { data: row, error } = await db().from(ZONES)\n .update(patch).eq('id', id).select('*').single()\n if (error) throw new Error(error.message)\n return {\n id: row.id, name: row.name, color: row.color ?? undefined,\n sortOrder: row.sort_order ?? 0, isActive: row.is_active !== false,\n tenantId: row.tenant_id, createdAt: row.created_at,\n }\n },\n\n async deleteZone(id: string): Promise<void> {\n requireWrites()\n const { error } = await db().from(ZONES).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // -- The comanda ---------------------------------------------------------\n\n async getTableOrder(tableId: string): Promise<TableOrder | null> {\n const { data, error } = await db().from(ORDER_EXT)\n .select('order_id, guests, seated_at, service_charge_percent, orders!inner(id, reference_number, status, notes, assignee_id, party_id, subtotal, discount, tax, total, currency)')\n .eq('table_id', tableId)\n .not('orders.status', 'in', '(\"completed\",\"cancelled\")')\n .order('seated_at', { ascending: false })\n .limit(1)\n if (error) throw new Error(error.message)\n const row = (data ?? [])[0]\n if (!row) return null\n const order = Array.isArray(row.orders) ? row.orders[0] : row.orders\n\n const [\n { data: lines, error: linesError },\n { data: people },\n { data: guestRows },\n { data: itemGuests },\n { data: balance },\n ] = await Promise.all([\n // `cancelled_at` e `cancel_reason` entram no select: a linha cancelada\n // CONTINUA na comanda, riscada. Filtrá-la aqui esconderia justamente o\n // que o gerente abre a comanda para ver.\n db().from(LINES)\n .select('id, product_id, name, quantity, unit_price, discount, total, sort_order, metadata, cancelled_at, cancel_reason')\n .eq('order_id', order.id).order('sort_order'),\n order.assignee_id || order.party_id\n ? db().from('people').select('id, name')\n .in('id', [order.assignee_id, order.party_id].filter(Boolean))\n : Promise.resolve({ data: [] }),\n db().from(GUESTS_VIEW).select('*').eq('order_id', order.id).order('seat_no'),\n db().from(ITEM_GUESTS).select('item_id, guest_id'),\n db().from(BALANCES).select('paid, balance').eq('invoice_id', order.id).maybeSingle(),\n ])\n if (linesError) throw new Error(linesError.message)\n const nameById = new Map<string, string>((people ?? []).map((p: any) => [p.id, p.name]))\n const guestOfItem = new Map<string, string>(\n ((itemGuests ?? []) as any[]).map((r) => [r.item_id, r.guest_id]),\n )\n\n return {\n id: order.id,\n reference: order.reference_number ?? shortRef(order.id),\n status: order.status,\n guests: row.guests ?? 0,\n seatedAt: row.seated_at,\n notes: order.notes ?? undefined,\n waiterId: order.assignee_id ?? undefined,\n waiterName: order.assignee_id ? nameById.get(order.assignee_id) : undefined,\n partyName: order.party_id ? nameById.get(order.party_id) : undefined,\n lines: (lines ?? []).map((l: any) =>\n rowToLine({ ...l, guest_id: guestOfItem.get(l.id) ?? null })),\n participants: ((guestRows ?? []) as any[]).map(rowToGuest),\n serviceChargePercent: row.service_charge_percent == null\n ? undefined : num(row.service_charge_percent),\n subtotal: num(order.subtotal),\n discount: num(order.discount),\n tax: num(order.tax),\n total: num(order.total),\n // Sem fatura levantada ainda, nada foi pago e tudo é devido. É a\n // resposta certa e não um buraco: a comanda aberta é, por definição,\n // dinheiro a receber.\n paid: num((balance as any)?.paid),\n due: balance ? num((balance as any).balance) : num(order.total),\n currency: order.currency ?? 'BRL',\n }\n },\n\n async getMenuCategories(): Promise<TableMenuCategory[]> {\n const sections = await db().from(SECTIONS)\n .select('id, name, sort_order').eq('is_active', true).order('sort_order')\n // The menu's own order, which is the order they are printed in — not\n // alphabetical, because \"Sobremesas\" does not come before \"Principais\"\n // on any menu anyone has read.\n if (!sections.error && (sections.data ?? []).length > 0) {\n return (sections.data ?? []).map((r: any) => ({ id: r.id, name: r.name }))\n }\n const { data, error } = await db().from('categories').select('id, name').order('name')\n if (error) throw new Error(error.message)\n return (data ?? []).map((c: any) => ({ id: c.id, name: c.name }))\n },\n\n async getMenuItems(search?: string, categoryId?: string): Promise<TableMenuItem[]> {\n // A chip was clicked and the menu has sections: the section decides WHICH\n // products, so it is resolved to a list of ids before the catalogue is\n // read. `is_active` on the placement, not on the section — an item pulled\n // from the menu today should stop being offered today.\n let sectionFilter: string[] | null = null\n if (categoryId) {\n const placed = await db().from(PLACEMENTS)\n .select('item_id').eq('section_id', categoryId).eq('is_active', true)\n if (!placed.error) {\n const placedIds = (placed.data ?? []).map((r: any) => r.item_id as string)\n if (placedIds.length === 0) return []\n sectionFilter = placedIds\n }\n }\n\n let q = db().from(CATALOG)\n .select('id, name, price, category_id, image_url')\n .eq('is_active', true)\n .order('name')\n .limit(60)\n if (search) q = q.ilike('name', `%${search}%`)\n if (sectionFilter) q = q.in('id', sectionFilter)\n // No sections in this pool, so the chip was a core category after all.\n else if (categoryId) q = q.eq('category_id', categoryId)\n const { data, error } = await q\n if (error) throw new Error(error.message)\n const rows = data ?? []\n if (rows.length === 0) return []\n\n // Which section each one sits in. Read separately rather than embedded:\n // the FK's name is what PostgREST needs for an embed, and it differs\n // between pools — the same reason the categories below are a second read.\n const ids = rows.map((r: any) => r.id)\n const placements = await db().from(PLACEMENTS)\n .select('item_id, section_id').in('item_id', ids).eq('is_active', true)\n const sectionByProduct = new Map<string, string>()\n if (!placements.error && (placements.data ?? []).length > 0) {\n const sectionIds = [...new Set((placements.data ?? []).map((r: any) => r.section_id).filter(Boolean))]\n const { data: sections } = await db().from(SECTIONS).select('id, name').in('id', sectionIds)\n const nameById = new Map<string, string>((sections ?? []).map((r: any) => [r.id, r.name]))\n for (const row of placements.data ?? []) {\n const name = nameById.get(row.section_id)\n if (name) sectionByProduct.set(row.item_id, name)\n }\n }\n\n const categoryIds = [...new Set(rows.map((r: any) => r.category_id).filter(Boolean))]\n const { data: categories } = categoryIds.length\n ? await db().from('categories').select('id, name').in('id', categoryIds)\n : { data: [] as any[] }\n const categoryById = new Map<string, string>((categories ?? []).map((c: any) => [c.id, c.name]))\n\n return rows.map((r: any) => ({\n id: r.id,\n name: r.name,\n price: num(r.price),\n categoryId: r.category_id ?? undefined,\n // The section wins where there is one: it is the word the Cardápio\n // screen shows, and the two lists have to say the same thing.\n categoryName: sectionByProduct.get(r.id)\n ?? (r.category_id ? categoryById.get(r.category_id) : undefined),\n imageUrl: r.image_url ?? undefined,\n }))\n },\n\n async addOrderLine(orderId: string, input: AddTableOrderLineInput): Promise<void> {\n const tenantId = tenant()\n const { count } = await db().from(LINES)\n .select('id', { count: 'exact', head: true }).eq('order_id', orderId)\n const { data, error } = await db().from(LINES).insert({\n tenant_id: tenantId,\n order_id: orderId,\n product_id: input.productId ?? null,\n name: input.name,\n quantity: input.quantity,\n unit_price: input.unitPrice,\n discount: 0,\n total: input.unitPrice * input.quantity,\n sort_order: count ?? 0,\n metadata: input.notes ? { kitchenNotes: input.notes } : {},\n }).select('id').single()\n if (error) throw new Error(error.message)\n // O dono da linha, quando há um. Sem isso o item lançado com \"Pessoa 2\"\n // selecionada cairia na conta da mesa, e a divisão da conta seria uma\n // tela bonita que não divide nada.\n if (input.guestId && data?.id) {\n const { error: linkError } = await db().from(ITEM_GUESTS).insert({\n item_id: data.id, guest_id: input.guestId, tenant_id: tenantId,\n })\n if (linkError) throw new Error(linkError.message)\n }\n await recalc(orderId)\n },\n\n async setOrderLineQuantity(lineId: string, quantity: number): Promise<void> {\n requireWrites()\n const { data: line, error } = await db().from(LINES)\n .select('id, order_id, unit_price, discount').eq('id', lineId).maybeSingle()\n if (error) throw new Error(error.message)\n if (!line) throw new Error('Item não encontrado na comanda')\n if (quantity <= 0) {\n const { error: delError } = await db().from(LINES).delete().eq('id', lineId)\n if (delError) throw new Error(delError.message)\n } else {\n const { error: upError } = await db().from(LINES).update({\n quantity,\n total: num(line.unit_price) * quantity - num(line.discount),\n }).eq('id', lineId)\n if (upError) throw new Error(upError.message)\n }\n await recalc(line.order_id)\n },\n\n async removeOrderLine(lineId: string): Promise<void> {\n requireWrites()\n const { data: line, error } = await db().from(LINES)\n .select('order_id').eq('id', lineId).maybeSingle()\n if (error) throw new Error(error.message)\n if (!line) return\n const { error: delError } = await db().from(LINES).delete().eq('id', lineId)\n if (delError) throw new Error(delError.message)\n await recalc(line.order_id)\n },\n\n // -- A política da casa ---------------------------------------------------\n\n async getSettings(): Promise<ComandaSettings> {\n const { data, error } = await db().from(SETTINGS)\n .select('service_charge_percent, cancel_requires_pin, operational_day_start')\n .maybeSingle()\n if (error) throw new Error(error.message)\n // Sem linha ainda é uma resposta, não um erro: a casa que nunca abriu as\n // Configurações não cobra taxa e não exige PIN.\n return {\n serviceChargePercent: num(data?.service_charge_percent),\n cancelRequiresPin: data?.cancel_requires_pin === true,\n operationalDayStart: data?.operational_day_start ?? '06:00',\n }\n },\n\n async saveSettings(patch: Partial<ComandaSettings>): Promise<void> {\n const tenantId = tenant()\n const row: Record<string, unknown> = { tenant_id: tenantId }\n if (patch.serviceChargePercent != null) row.service_charge_percent = patch.serviceChargePercent\n if (patch.cancelRequiresPin != null) row.cancel_requires_pin = patch.cancelRequiresPin\n if (patch.operationalDayStart != null) row.operational_day_start = patch.operationalDayStart\n const { error } = await db().from(SETTINGS).upsert(row, { onConflict: 'tenant_id' })\n if (error) throw new Error(error.message)\n },\n\n // -- Participantes --------------------------------------------------------\n\n async addGuest(orderId: string, label?: string): Promise<ComandaGuest> {\n const tenantId = tenant()\n // O próximo assento livre, não `count + 1`: remover a Pessoa 2 e criar\n // outra daria duas Pessoa 3, e o número do assento é como o garçom fala\n // com a mesa.\n const { data: taken } = await db().from(GUESTS)\n .select('seat_no').eq('order_id', orderId).order('seat_no')\n const used = new Set<number>(((taken ?? []) as any[]).map((r) => Number(r.seat_no)))\n let seat = 1\n while (used.has(seat)) seat += 1\n\n const { data, error } = await db().from(GUESTS).insert({\n tenant_id: tenantId, order_id: orderId, seat_no: seat, label: label ?? null,\n }).select('id, seat_no, label').single()\n if (error) throw new Error(error.message)\n return {\n id: data.id,\n seatNo: Number(data.seat_no),\n label: data.label ?? undefined,\n serviceChargePercent: 0,\n subtotal: 0, serviceCharge: 0, cancelledTotal: 0, itemCount: 0,\n }\n },\n\n async removeGuest(guestId: string): Promise<void> {\n requireWrites()\n // As linhas dele voltam para a MESA, não somem com ele: a comida foi\n // consumida de qualquer jeito, e o `on delete cascade` do vínculo é o que\n // faz isso — apaga o vínculo, preserva o item.\n const { data: guest } = await db().from(GUESTS).select('order_id').eq('id', guestId).maybeSingle()\n const { error } = await db().from(GUESTS).delete().eq('id', guestId)\n if (error) throw new Error(error.message)\n if (guest?.order_id) await recalc(guest.order_id)\n },\n\n async setGuestServiceCharge(guestId: string, percent: number | null): Promise<void> {\n requireWrites()\n const { data: guest } = await db().from(GUESTS).select('order_id').eq('id', guestId).maybeSingle()\n const { error } = await db().from(GUESTS)\n .update({ service_charge_percent: percent }).eq('id', guestId)\n if (error) throw new Error(error.message)\n if (guest?.order_id) await recalc(guest.order_id)\n },\n\n async setOrderServiceCharge(orderId: string, percent: number | null): Promise<void> {\n requireWrites()\n const { error } = await db().from(ORDER_EXT)\n .update({ service_charge_percent: percent }).eq('order_id', orderId)\n if (error) throw new Error(error.message)\n await recalc(orderId)\n },\n\n // -- Desconto -------------------------------------------------------------\n\n async discountLines(orderId: string, input: DiscountLineInput): Promise<void> {\n requireWrites()\n if (input.lineIds.length === 0) return\n const { data: lines, error } = await db().from(LINES)\n .select('id, quantity, unit_price').in('id', input.lineIds)\n if (error) throw new Error(error.message)\n\n for (const line of (lines ?? []) as any[]) {\n const gross = num(line.unit_price) * num(line.quantity)\n const raw = input.mode === 'percent' ? gross * (input.value / 100) : input.value\n // O desconto não pode passar do próprio item: um valor fixo de R$ 50\n // marcado em três itens de R$ 20 daria três linhas negativas, e a\n // comanda passaria a dever dinheiro ao cliente.\n const discount = Math.min(Math.max(raw, 0), gross)\n const { error: upError } = await db().from(LINES)\n .update({ discount, total: gross - discount }).eq('id', line.id)\n if (upError) throw new Error(upError.message)\n }\n await recalc(orderId)\n },\n\n // -- Cancelamento ---------------------------------------------------------\n\n async getCancelReasons(): Promise<CancelReason[]> {\n const { data, error } = await db().from(CANCEL_REASONS)\n .select('id, label, is_active, sort_order').order('sort_order')\n if (error) throw new Error(error.message)\n return ((data ?? []) as any[]).map((r) => ({\n id: r.id, label: r.label, isActive: r.is_active !== false, sortOrder: Number(r.sort_order) || 0,\n }))\n },\n\n async addCancelReason(label: string): Promise<CancelReason> {\n const tenantId = tenant()\n const { count } = await db().from(CANCEL_REASONS).select('id', { count: 'exact', head: true })\n const { data, error } = await db().from(CANCEL_REASONS)\n .insert({ tenant_id: tenantId, label, sort_order: count ?? 0 })\n .select('id, label, is_active, sort_order').single()\n if (error) throw new Error(error.message)\n return { id: data.id, label: data.label, isActive: data.is_active !== false, sortOrder: Number(data.sort_order) || 0 }\n },\n\n async updateCancelReason(id: string, patch: Partial<CancelReason>): Promise<void> {\n requireWrites()\n const row: Record<string, unknown> = {}\n if (patch.label != null) row.label = patch.label\n if (patch.isActive != null) row.is_active = patch.isActive\n if (patch.sortOrder != null) row.sort_order = patch.sortOrder\n const { error } = await db().from(CANCEL_REASONS).update(row).eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async deleteCancelReason(id: string): Promise<void> {\n requireWrites()\n const { error } = await db().from(CANCEL_REASONS).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async cancelLines(orderId: string, input: CancelLineInput): Promise<void> {\n requireWrites()\n if (input.lineIds.length === 0) return\n // Marca, não apaga. Apagar seria mais simples e apagaria junto o único\n // relatório do V1 que presta — \"Top Itens Cancelados\", com nome e\n // dinheiro do que a cozinha mais devolveu.\n const { error } = await db().from(LINES)\n .update({ cancelled_at: new Date().toISOString(), cancel_reason: input.reason })\n .in('id', input.lineIds)\n if (error) throw new Error(error.message)\n await recalc(orderId)\n },\n\n // -- Transferência --------------------------------------------------------\n\n async transfer(orderId: string, input: TransferInput): Promise<void> {\n const tenantId = tenant()\n const audit: Record<string, unknown> = {\n tenant_id: tenantId, order_id: orderId, kind: input.kind,\n note: input.note ?? null, item_ids: input.lineIds ?? [],\n }\n\n if (input.kind === 'table') {\n if (!input.toTableId) throw new Error('Escolha a mesa de destino')\n const { data: current } = await db().from(ORDER_EXT)\n .select('table_id').eq('order_id', orderId).maybeSingle()\n // A mesa de destino tem de estar livre: uma comanda por mesa é o que\n // faz `v_tables` derivar a ocupação em vez de guardá-la, e duas\n // comandas na mesma mesa quebram essa derivação — é como o V1 chegou a\n // 13 mesas ocupadas sem ninguém sentado.\n const { data: busy } = await db().from(ORDER_EXT)\n .select('order_id, orders!inner(status)')\n .eq('table_id', input.toTableId)\n .not('orders.status', 'in', '(\"completed\",\"cancelled\")')\n .limit(1)\n if ((busy ?? []).length > 0) throw new Error('A mesa de destino já tem comanda aberta')\n\n const { error } = await db().from(ORDER_EXT)\n .update({ table_id: input.toTableId }).eq('order_id', orderId)\n if (error) throw new Error(error.message)\n audit.from_table_id = current?.table_id ?? null\n audit.to_table_id = input.toTableId\n } else if (input.kind === 'guest') {\n if (!input.guestId || !input.toOrderId) throw new Error('Escolha o participante e a comanda de destino')\n const { error } = await db().from(GUESTS)\n .update({ order_id: input.toOrderId }).eq('id', input.guestId)\n if (error) throw new Error(error.message)\n // As linhas dele vão junto: o vínculo item↔participante não mudou, mas\n // `items.order_id` ainda aponta para a comanda de origem, e uma linha\n // cuja conta é outra comanda soma nas duas.\n const { data: moved } = await db().from(ITEM_GUESTS)\n .select('item_id').eq('guest_id', input.guestId)\n const ids = ((moved ?? []) as any[]).map((r) => r.item_id)\n if (ids.length > 0) {\n const { error: itemError } = await db().from(LINES)\n .update({ order_id: input.toOrderId }).in('id', ids)\n if (itemError) throw new Error(itemError.message)\n }\n audit.guest_id = input.guestId\n audit.target_order_id = input.toOrderId\n audit.item_ids = ids\n await recalc(input.toOrderId)\n } else {\n if (!input.lineIds || input.lineIds.length === 0) throw new Error('Escolha os itens')\n // `toGuestId` nulo devolve as linhas à mesa — é o caminho de volta, e\n // sem ele um item posto na pessoa errada não teria saída.\n const { error: delError } = await db().from(ITEM_GUESTS).delete().in('item_id', input.lineIds)\n if (delError) throw new Error(delError.message)\n if (input.toGuestId) {\n const { error: insError } = await db().from(ITEM_GUESTS).insert(\n input.lineIds.map((id) => ({ item_id: id, guest_id: input.toGuestId, tenant_id: tenantId })),\n )\n if (insError) throw new Error(insError.message)\n }\n audit.guest_id = input.toGuestId ?? null\n }\n\n const { error: auditError } = await db().from(TRANSFERS).insert(audit)\n if (auditError) throw new Error(auditError.message)\n await recalc(orderId)\n },\n\n async getTransfers(orderId: string): Promise<OrderTransfer[]> {\n const { data, error } = await db().from(TRANSFERS)\n .select('id, kind, from_table_id, to_table_id, guest_id, item_ids, note, created_at')\n .eq('order_id', orderId).order('created_at', { ascending: false })\n if (error) throw new Error(error.message)\n const rows = (data ?? []) as any[]\n const tableIds = Array.from(new Set(\n rows.flatMap((r) => [r.from_table_id, r.to_table_id]).filter(Boolean),\n ))\n const { data: tables } = tableIds.length\n ? await db().from(TABLES).select('id, number').in('id', tableIds)\n : { data: [] as any[] }\n const numberById = new Map<string, number>(((tables ?? []) as any[]).map((t) => [t.id, t.number]))\n const named = (id: string | null) =>\n id && numberById.has(id) ? `Mesa ${numberById.get(id)}` : undefined\n\n return rows.map((r) => ({\n id: r.id,\n kind: r.kind,\n fromTableName: named(r.from_table_id),\n toTableName: named(r.to_table_id),\n itemCount: (r.item_ids ?? []).length,\n note: r.note ?? undefined,\n createdAt: r.created_at,\n }))\n },\n\n async updateSessionGuests(orderId: string, guests: number): Promise<void> {\n requireWrites()\n const { error } = await db().from(ORDER_EXT)\n .update({ guests }).eq('order_id', orderId)\n if (error) throw new Error(error.message)\n },\n\n async getSummary(): Promise<TablesSummary> {\n const tables = await loadTables()\n const count = (status: TableStatus) => tables.filter((t) => t.status === status).length\n const elapsed = tables.map((t) => t.currentElapsedMinutes).filter((m): m is number => typeof m === 'number')\n return {\n totalTables: tables.length,\n availableCount: count('available'),\n occupiedCount: count('occupied'),\n reservedCount: count('reserved'),\n cleaningCount: count('cleaning'),\n totalSeats: tables.reduce((sum, t) => sum + t.seats, 0),\n occupiedSeats: tables.filter((t) => t.status === 'occupied').reduce((sum, t) => sum + t.seats, 0),\n averageSessionMinutes: elapsed.length ? Math.round(elapsed.reduce((a, b) => a + b, 0) / elapsed.length) : 0,\n }\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { TablesDataProvider } from './data/types'\nimport type { TableSession } from './types'\nimport { createMockTablesProvider } from './data/mock'\nimport { createTablesStore } from './store'\nimport { tablesRegistries } from './data/registries'\nimport { tablesLocales } from './locales'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { TablesContextProvider } from './context'\nimport { registerComponent } from '@fayz-ai/core'\n\nconst TablesPage = React.lazy(() => import('./views/TablesPage').then((m) => ({ default: m.TablesPage })))\nconst ComandaSettingsView = React.lazy(() =>\n import('./views/ComandaSettingsView').then((m) => ({ default: m.ComandaSettingsView })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface TablesPluginLabels {\n pageTitle: string\n floorPlan: string\n zones: string\n sessionHistory: string\n}\n\nconst DEFAULT_LABELS: TablesPluginLabels = {\n pageTitle: 'Tables',\n floorPlan: 'Floor Plan',\n zones: 'Zones',\n sessionHistory: 'Session History',\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface TablesPluginOptions {\n modules?: {\n reservations?: boolean\n sessionHistory?: boolean\n }\n labels?: Partial<TablesPluginLabels>\n defaultZones?: Array<{ name: string; color?: string }>\n /** Taxa de serviço shown on the mesa's panel, in percent. 0 draws no line. */\n serviceChargePercent?: number\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: TablesDataProvider\n onTableSeated?: (session: TableSession) => Promise<string | undefined>\n onTableClosed?: (session: TableSession) => Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: TablesPluginOptions) {\n return {\n modules: {\n reservations: options?.modules?.reservations === true,\n sessionHistory: options?.modules?.sessionHistory !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n defaultZones: options?.defaultZones ?? [\n { name: 'Indoor', color: '#3b82f6' },\n { name: 'Outdoor', color: '#22c55e' },\n { name: 'Bar', color: '#f59e0b' },\n ],\n serviceChargePercent: options?.serviceChargePercent ?? 0,\n onTableSeated: options?.onTableSeated,\n onTableClosed: options?.onTableClosed,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/** Onde a planta se anuncia para outras telas. Ver `registerComponent` abaixo. */\nexport const FLOOR_PLAN_COMPONENT_ID = 'tables.floor-plan'\n\nexport function createTablesPlugin(options?: TablesPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockTablesProvider()\n const store = createTablesStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(TablesPage, { config, provider, store, registries: tablesRegistries })\n )\n\n // A planta, oferecida a quem quiser desenhá-la fora desta rota.\n //\n // No V1 a tela de Pedidos é DUAS colunas: o salão à esquerda e a lista de\n // pedidos à direita, e o alternador Grade · Planta baixa mora ali. Quem\n // trabalha durante o serviço pergunta \"o que está acontecendo agora?\" por\n // LUGAR tanto quanto por estado, e mandar essa pessoa para outra rota é\n // perder o pedido que ela estava lendo.\n //\n // Pelo registro de componentes e não por import: `plugin-orders` não pode\n // depender deste plugin — uma casa pode ter comanda de balcão sem ter salão\n // nenhum — e quem não montar as mesas simplesmente não vê a aba.\n registerComponent(FLOOR_PLAN_COMPONENT_ID, PageComponent)\n\n // A aba de Configurações é montada pela shell, fora da rota deste plugin — e\n // portanto fora do provider que a página instala. Sem esta casca o painel\n // chama `useTablesStore` e explode com \"used outside TablesPage\".\n const ContextBoundary: React.FC<{ children?: React.ReactNode }> = ({ children }) =>\n React.createElement(TablesContextProvider, { config, provider, store }, children)\n ContextBoundary.displayName = 'TablesContextBoundary'\n\n return {\n id: 'tables',\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'MapPin',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 4,\n label: config.labels.pageTitle,\n route: '/tables',\n icon: 'MapPin',\n permission: { feature: 'tables', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/tables',\n component: PageComponent,\n permission: { feature: 'tables', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'tables.availability',\n name: 'getTableAvailability',\n description: 'Returns which tables are available, occupied, reserved, or being cleaned.',\n icon: 'MapPin',\n mode: 'read' as const,\n category: 'Tables',\n parameters: {\n type: 'object' as const,\n properties: {\n zone: { type: 'string' as const, description: 'Filter by zone name' },\n status: { type: 'string' as const, enum: ['available', 'occupied', 'reserved', 'cleaning'] },\n },\n },\n suggestions: [\n { label: 'Which tables are available right now?' },\n { label: 'How many tables are occupied?' },\n ],\n },\n {\n id: 'tables.seat-guests',\n name: 'seatGuests',\n description: 'Seats guests at a specific table.',\n icon: 'UserPlus',\n mode: 'persist' as const,\n category: 'Tables',\n parameters: {\n type: 'object' as const,\n properties: {\n tableNumber: { type: 'number' as const, description: 'Table number' },\n guests: { type: 'number' as const, description: 'Number of guests' },\n },\n required: ['tableNumber', 'guests'],\n },\n permission: { feature: 'tables', action: 'edit' as const },\n },\n ],\n registries: tablesRegistries,\n settings: [\n {\n id: 'tables',\n label: config.labels.pageTitle,\n icon: 'MapPin',\n component: (() => {\n const TablesSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Tables Settings',\n registries: tablesRegistries,\n routeBase: '/settings/tables',\n })\n TablesSettingsTab.displayName = 'TablesSettingsTab'\n return TablesSettingsTab\n })(),\n order: 21,\n permission: { feature: 'tables', action: 'read' as const },\n },\n // Duas abas, e cada uma responde uma pergunta diferente: a de cima é o\n // CADASTRO do salão (praças, mesas — trabalho de implantação), esta é a\n // POLÍTICA da comanda (taxa, cancelamento, dia operacional — decisões do\n // dono). Juntá-las daria uma tela em que quem vem mudar a taxa passa\n // primeiro pelas mesas.\n {\n id: 'comanda',\n label: 'Comanda',\n icon: 'Receipt',\n component: (() => {\n const ComandaSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(ContextBoundary, null,\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(ComandaSettingsView)))\n ComandaSettingsTab.displayName = 'ComandaSettingsTab'\n return ComandaSettingsTab\n })(),\n order: 22,\n // A política é do dono, não do garçom: quem só atende mesa não decide a\n // taxa da casa nem apaga motivo de cancelamento.\n permission: { feature: 'tables', action: 'edit' as const },\n },\n ],\n locales: tablesLocales,\n }\n}\n\nexport type { TablesDataProvider } from './data/types'\nexport { createFayzTablesProvider } from './data/platform'\n// The pool-direct floor plan: mesas are `public.locations` of kind 'table'\n// and a session is the open dine_in comanda sitting on one.\nexport { createCoreTablesProvider } from './data/core-supabase'\nexport type { CoreTablesProviderOptions, CoreTablesWriteOptions } from './data/core-supabase'\nexport type { FayzTablesProviderOptions } from './data/platform'\nexport type { ResolvedTablesConfig } from './context'\nexport type {\n TableOrder, TableOrderLine, TableMenuItem, AddTableOrderLineInput,\n} from './types'\n"]}