@fayz-ai/plugin-orders 0.12.28 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/mock.ts","../src/data/core-supabase.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/integrations/ubereats/connectorDef.tsx","../src/integrations/rappi/connectorDef.tsx","../src/integrations/aiqfome/connectorDef.tsx","../src/views/OrderReceivableActions.tsx","../src/settings/useDeliverySettings.ts","../src/settings/DeliverySettings.tsx","../src/data/platform.ts","../src/index.ts"],"names":["message","store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS","React","getSupabaseClientOptional","toast","value","jsx","jsxs","Fragment","ACTIVE_STATUSES","adminNavigateTo"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n // Replaying the current status is a no-op at the data boundary. The\n // store uses it to retry an idempotent downstream synchronization\n // without emitting the lifecycle event a second time.\n if (targetIdx < 0 || (targetIdx !== currentIdx && targetIdx !== currentIdx + 1)) {\n const next = getNextStatus(order.kind, order.status)\n throw new Error(\n `Invalid status transition: ${order.status} → ${input.status}. ` +\n (next ? `Expected next status: ${next}` : 'Order is already in a terminal state.')\n )\n }\n }\n\n order.status = input.status\n order.updatedAt = new Date().toISOString()\n\n if (input.status === 'completed') {\n order.completedAt = order.updatedAt\n }\n\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrder\n // ------------------------------------------------------------------\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n const { id: _id, items: _items, tenantId: _t, createdAt: _c, ...safe } = data\n Object.assign(order, safe)\n order.updatedAt = new Date().toISOString()\n return order\n },\n\n // ------------------------------------------------------------------\n // cancelOrder\n // ------------------------------------------------------------------\n async cancelOrder(id: string, reason?: string): Promise<void> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n order.status = 'cancelled'\n order.updatedAt = new Date().toISOString()\n if (reason) {\n order.notes = order.notes ? `${order.notes}\\nCancelled: ${reason}` : `Cancelled: ${reason}`\n }\n },\n\n // ------------------------------------------------------------------\n // addOrderItem\n // ------------------------------------------------------------------\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n const order = findOrder(orderId)\n if (!order) throw new Error(`Order not found: ${orderId}`)\n\n const newItem: RestaurantOrderItem = {\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: order.items.length,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }\n\n order.items.push(newItem)\n recomputeTotals(order)\n order.updatedAt = new Date().toISOString()\n return newItem\n },\n\n // ------------------------------------------------------------------\n // removeOrderItem\n // ------------------------------------------------------------------\n async removeOrderItem(itemId: string): Promise<void> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n found.order.items.splice(found.index, 1)\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n },\n\n // ------------------------------------------------------------------\n // updateOrderItem\n // ------------------------------------------------------------------\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n const { id: _id, orderId: _oid, createdAt: _c, ...safe } = data\n Object.assign(found.item, safe)\n\n // Recompute item total if quantity or price changed\n found.item.total = found.item.quantity * found.item.unitPrice - found.item.discount\n\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n return found.item\n },\n\n // ------------------------------------------------------------------\n // getSummary\n // ------------------------------------------------------------------\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const today = toDateStr(new Date())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n\n const inRange = orders.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n\n const completed = inRange.filter(o => o.status !== 'cancelled')\n const revenue = completed.reduce((sum, o) => sum + o.total, 0)\n\n const activeStatuses = new Set(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n const active = orders.filter(o => activeStatuses.has(o.status))\n\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n\n for (const o of inRange) {\n ordersByKind[o.kind] = (ordersByKind[o.kind] || 0) + 1\n ordersByStatus[o.status] = (ordersByStatus[o.status] || 0) + 1\n }\n\n // Top items\n const itemMap = new Map<string, { name: string; quantity: number; revenue: number }>()\n for (const o of completed) {\n for (const item of o.items) {\n const existing = itemMap.get(item.name)\n if (existing) {\n existing.quantity += item.quantity\n existing.revenue += item.total\n } else {\n itemMap.set(item.name, { name: item.name, quantity: item.quantity, revenue: item.total })\n }\n }\n }\n const topItems = Array.from(itemMap.values())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, 5)\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: completed.length > 0 ? revenue / completed.length : 0,\n activeOrderCount: active.length,\n ordersByKind,\n ordersByStatus,\n topItems,\n }\n },\n }\n\n return provider\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { OrdersDataProvider } from './types'\nimport type {\n RestaurantOrder, RestaurantOrderItem, OrderQuery, PaginatedResult, OrdersSummary,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// A provider over the CORE archetype (#336).\n//\n// The salon has orders — 135 of them on cluster-salon-br-01 — and no screen\n// that shows them. beauty-saas mounts agenda, financial, CRM, inventory and\n// five others, and never plugin-orders, and its own code says `from('orders')`\n// exactly zero times. So the commercial line exists in the database and is\n// unreachable from the product; the visible consequence in the same pool is\n// that 367 of 370 completed appointments have no Venda and no Título, and\n// nobody can SEE it because there is no list that would show 3 where 370 were\n// expected.\n//\n// This provider reads `public.v_orders` — the core's read model, with the\n// delivery state already derived (spine 184) — and joins the payment state from\n// `v_order_payment_status` (financial 039).\n//\n// Writing is OPT-IN, through `writes`. Without it every mutation still refuses:\n// an app that only needs to see its orders should not have to accept a provider\n// that can create them. With it, the app declares itself the owner of the flow\n// — which is what a restaurant is for dine-in, takeout and delivery.\n// ---------------------------------------------------------------------------\n\nconst READ_ONLY = 'This provider reads the core order archetype; pass `writes` to let the app that owns the flow create and edit them.'\n\nexport interface CoreOrdersWriteOptions {\n /**\n * The active org. RLS checks it again on the way in — this is so the row\n * starts correct rather than being corrected by a refusal.\n */\n tenantId: () => string | undefined | null\n /** The active unit, for an app that scopes by one. */\n unitId?: () => string | undefined | null\n /**\n * Which sales channel a kind arrives on. `public.orders.channel` accepts only\n * balcao · shop · dine_in · delivery, so `takeout` — a kind with no channel of\n * its own — has to say which one it counts as.\n */\n channelFor?: (kind: string) => string | undefined\n}\n\nexport interface CoreOrdersProviderOptions {\n /** Restrict the list to these species. Omitted means all four. */\n kinds?: string[]\n /** Restrict the list to one channel (balcao · shop · dine_in · delivery). */\n channel?: string\n /** Present makes the provider writable. See CoreOrdersWriteOptions. */\n writes?: CoreOrdersWriteOptions\n}\n\n// The restaurant's three kinds against the channel vocabulary the archetype\n// already constrains. Takeout is the counter: the customer collects it there.\nconst DEFAULT_CHANNELS: Record<string, string> = {\n dine_in: 'dine_in',\n delivery: 'delivery',\n takeout: 'balcao',\n}\n\nexport function createCoreOrdersProvider(options?: CoreOrdersProviderOptions): OrdersDataProvider {\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 const writes = options?.writes\n\n function requireWrites(): CoreOrdersWriteOptions {\n if (!writes) throw new Error(READ_ONLY)\n return writes\n }\n\n async function load(query?: OrderQuery, only?: { id?: string }): Promise<PaginatedResult<RestaurantOrder>> {\n const client = db()\n let q = client\n .from('v_orders')\n .select('id, tenant_id, unit_id, kind, channel, status, reference_number, party_id, assignee_id, subtotal, discount, tax, total, currency, notes, created_at, updated_at, completed_at, fulfillment_status, metadata', { count: 'exact' })\n .order('created_at', { ascending: false })\n\n if (only?.id) q = q.eq('id', only.id)\n if (options?.kinds?.length) q = q.in('kind', options.kinds)\n if (options?.channel) q = q.eq('channel', options.channel)\n if (query?.kind) {\n q = Array.isArray(query.kind) ? q.in('kind', query.kind) : q.eq('kind', query.kind)\n }\n if (query?.status) {\n q = Array.isArray(query.status) ? q.in('status', query.status) : q.eq('status', query.status)\n }\n if (query?.tableId) q = q.eq('metadata->>tableId', query.tableId)\n if (query?.assigneeId) q = q.eq('assignee_id', query.assigneeId)\n if (query?.dateRange) {\n q = q.gte('created_at', query.dateRange.from).lte('created_at', query.dateRange.to)\n }\n const pageSize = query?.pageSize ?? 100\n const from = ((query?.page ?? 1) - 1) * pageSize\n q = q.range(from, from + pageSize - 1)\n\n const { data, error, count } = await q\n if (error) throw new Error(error.message)\n const rows = (data ?? []) as Record<string, any>[]\n const ids = rows.map((r) => r.id)\n\n // Two joins the salon's screen exists for: who the person is, and whether\n // this Venda produced a Título. The second is the point — it is what turns\n // a 99.2% gap from an audit finding into something the owner notices.\n // The third is the restaurant's: which table the comanda is open on.\n const [{ data: people }, { data: payments }, { data: items }] = await Promise.all([\n ids.length\n ? client.from('people').select('id, name').in('id', [...new Set(rows.flatMap((r) => [r.party_id, r.assignee_id]).filter(Boolean))])\n : Promise.resolve({ data: [] }),\n ids.length\n ? client.from('v_order_payment_status').select('order_id, status, total_amount, paid_amount').in('order_id', ids)\n : Promise.resolve({ data: [] }),\n ids.length\n ? client.from('items').select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at').in('order_id', ids).order('sort_order')\n : Promise.resolve({ data: [] }),\n ])\n\n const nameById = new Map<string, string>((people ?? []).map((p: any) => [p.id as string, p.name as string]))\n const payById = new Map<string, any>((payments ?? []).map((p: any) => [p.order_id as string, p]))\n const itemsByOrder = new Map<string, RestaurantOrderItem[]>()\n for (const item of (items ?? []) as any[]) {\n const list = itemsByOrder.get(item.order_id) ?? []\n list.push(toItem(item))\n itemsByOrder.set(item.order_id, list)\n }\n\n return {\n data: rows.map((r) => {\n const pay = payById.get(r.id)\n const meta = (r.metadata ?? {}) as Record<string, unknown>\n return {\n id: r.id,\n referenceNumber: r.reference_number ?? String(r.id).slice(0, 8),\n kind: r.kind,\n status: r.status,\n partyId: r.party_id ?? undefined,\n partyName: r.party_id ? nameById.get(r.party_id) : undefined,\n assigneeId: r.assignee_id ?? undefined,\n assigneeName: r.assignee_id ? nameById.get(r.assignee_id) : undefined,\n subtotal: Number(r.subtotal) || 0,\n discount: Number(r.discount) || 0,\n tax: Number(r.tax) || 0,\n total: Number(r.total) || 0,\n currency: r.currency ?? 'BRL',\n notes: r.notes ?? undefined,\n tags: [],\n // `source` is the archetype's channel where it has one; the salon's\n // counter sale has none, and 'balcao' is what that means.\n source: r.channel ?? 'balcao',\n // NOT location_id: that column is a FK to `app.units`, i.e. the\n // BRANCH this order belongs to. A mesa has no table of its own yet,\n // so its id rides in metadata until the floor plan gets one.\n tableId: typeof meta.tableId === 'string' ? meta.tableId : undefined,\n estimatedMinutes: typeof meta.estimatedMinutes === 'number' ? meta.estimatedMinutes : undefined,\n items: itemsByOrder.get(r.id) ?? [],\n metadata: {\n ...meta,\n channel: r.channel ?? null,\n fulfillmentStatus: r.fulfillment_status ?? null,\n paymentStatus: pay?.status ?? 'none',\n invoicedAmount: Number(pay?.total_amount) || 0,\n paidAmount: Number(pay?.paid_amount) || 0,\n },\n tenantId: r.tenant_id,\n unitId: r.unit_id ?? undefined,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n completedAt: r.completed_at ?? undefined,\n } as RestaurantOrder\n }),\n total: count ?? rows.length,\n }\n }\n\n function toItem(row: Record<string, any>): RestaurantOrderItem {\n const meta = (row.metadata ?? {}) as Record<string, unknown>\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? undefined,\n name: row.name ?? '',\n description: row.description ?? undefined,\n quantity: Number(row.quantity) || 0,\n unitPrice: Number(row.unit_price) || 0,\n discount: Number(row.discount) || 0,\n total: Number(row.total) || 0,\n sortOrder: row.sort_order ?? 0,\n modifiers: typeof meta.modifiers === 'string' ? meta.modifiers : undefined,\n kitchenNotes: typeof meta.kitchenNotes === 'string' ? meta.kitchenNotes : undefined,\n metadata: meta,\n createdAt: row.created_at,\n }\n }\n\n function lineTotal(item: { quantity: number; unitPrice: number; discount?: number }): number {\n return item.quantity * item.unitPrice - (item.discount ?? 0)\n }\n\n async function loadOne(id: string): Promise<RestaurantOrder | null> {\n const page = await load(undefined, { id })\n return page.data[0] ?? null\n }\n\n /**\n * Push the order's money back in line with its lines.\n *\n * The archetype stores subtotal/total on the order and the lines in `items`,\n * and nothing in the database keeps the two in step — an item added without\n * this leaves a comanda whose total is yesterday's.\n */\n async function recalc(orderId: string): Promise<void> {\n const client = db()\n const { data, error } = await client.from('items').select('total').eq('order_id', orderId)\n if (error) throw new Error(error.message)\n const subtotal = (data ?? []).reduce((sum: number, r: any) => sum + (Number(r.total) || 0), 0)\n const { error: upErr } = await client\n .from('orders')\n .update({ subtotal, total: subtotal })\n .eq('id', orderId)\n if (upErr) throw new Error(upErr.message)\n }\n\n async function orderIdOfItem(itemId: string): Promise<string> {\n const client = db()\n const { data, error } = await client.from('items').select('order_id').eq('id', itemId).single()\n if (error) throw new Error(error.message)\n return data.order_id as string\n }\n\n return {\n getOrders: (query: OrderQuery) => load(query),\n getOrderById: loadOne,\n\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const w = requireWrites()\n const client = db()\n const tenantId = w.tenantId()\n if (!tenantId) throw new Error('No active organization: an order cannot be opened without one')\n\n const channel = (w.channelFor ?? ((k: string) => DEFAULT_CHANNELS[k]))(input.kind)\n const subtotal = input.items.reduce(\n (sum, i) => sum + lineTotal({ quantity: i.quantity, unitPrice: i.unitPrice, discount: i.discount }),\n 0,\n )\n\n const { data: order, error } = await client\n .from('orders')\n .insert({\n tenant_id: tenantId,\n unit_id: w.unitId?.() ?? null,\n kind: input.kind,\n status: 'new',\n ...(channel ? { channel } : {}),\n // party_id is left out on purpose: `trg_orders_require_party` fills it\n // with `public.walkin_party(tenant_id)`, which is exactly what a table\n // with no named customer is.\n ...(input.partyId ? { party_id: input.partyId } : {}),\n ...(input.assigneeId ? { assignee_id: input.assigneeId } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n subtotal,\n total: subtotal,\n currency: 'BRL',\n metadata: {\n ...(input.tableId ? { tableId: input.tableId } : {}),\n ...(input.estimatedMinutes ? { estimatedMinutes: input.estimatedMinutes } : {}),\n },\n })\n .select('id')\n .single()\n if (error) throw new Error(error.message)\n\n if (input.items.length) {\n const { error: itemsErr } = await client.from('items').insert(\n input.items.map((item, index) => ({\n order_id: order.id,\n // tenant_id and parent_kind are inherited from the parent by\n // `trg_items_inherit`; setting them here would only duplicate it.\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: index,\n metadata: {\n ...(item.modifiers ? { modifiers: item.modifiers } : {}),\n ...(item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}),\n },\n })),\n )\n if (itemsErr) throw new Error(itemsErr.message)\n }\n\n const created = await loadOne(order.id)\n if (!created) throw new Error('The order was created but is not readable — check the orders.read permission')\n return created\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n requireWrites()\n const client = db()\n // completed_at is stamped by `trg_orders_kind_guard`, and the same trigger\n // refuses a status the kind never declared — so an invalid drag on the\n // board comes back as a refusal instead of a wrong row.\n const { error } = await client.from('orders').update({ status: input.status }).eq('id', input.orderId)\n if (error) throw new Error(error.message)\n const order = await loadOne(input.orderId)\n if (!order) throw new Error('Order not found after the status change')\n return order\n },\n\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n requireWrites()\n const client = db()\n const patch: Record<string, unknown> = {}\n if (data.status !== undefined) patch.status = data.status\n if (data.notes !== undefined) patch.notes = data.notes\n if (data.partyId !== undefined) patch.party_id = data.partyId\n if (data.assigneeId !== undefined) patch.assignee_id = data.assigneeId\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.tax !== undefined) patch.tax = data.tax\n if (Object.keys(patch).length) {\n const { error } = await client.from('orders').update(patch).eq('id', id)\n if (error) throw new Error(error.message)\n }\n const order = await loadOne(id)\n if (!order) throw new Error('Order not found after the update')\n return order\n },\n\n async cancelOrder(id: string, reason?: string): Promise<void> {\n requireWrites()\n const client = db()\n const { error } = await client\n .from('orders')\n .update({ status: 'cancelled', ...(reason ? { notes: reason } : {}) })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n requireWrites()\n const client = db()\n const { count } = await client\n .from('items')\n .select('id', { count: 'exact', head: true })\n .eq('order_id', orderId)\n const { data, error } = await client\n .from('items')\n .insert({\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: count ?? 0,\n metadata: {\n ...(item.modifiers ? { modifiers: item.modifiers } : {}),\n ...(item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}),\n },\n })\n .select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at')\n .single()\n if (error) throw new Error(error.message)\n await recalc(orderId)\n return toItem(data)\n },\n\n async removeOrderItem(itemId: string): Promise<void> {\n requireWrites()\n const client = db()\n const orderId = await orderIdOfItem(itemId)\n const { error } = await client.from('items').delete().eq('id', itemId)\n if (error) throw new Error(error.message)\n await recalc(orderId)\n },\n\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n requireWrites()\n const client = db()\n const orderId = await orderIdOfItem(itemId)\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.quantity !== undefined) patch.quantity = data.quantity\n if (data.unitPrice !== undefined) patch.unit_price = data.unitPrice\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.quantity !== undefined || data.unitPrice !== undefined || data.discount !== undefined) {\n const { data: current, error: readErr } = await client\n .from('items').select('quantity, unit_price, discount').eq('id', itemId).single()\n if (readErr) throw new Error(readErr.message)\n patch.total = lineTotal({\n quantity: Number(data.quantity ?? current.quantity) || 0,\n unitPrice: Number(data.unitPrice ?? current.unit_price) || 0,\n discount: Number(data.discount ?? current.discount) || 0,\n })\n }\n const { data: row, error } = await client\n .from('items').update(patch).eq('id', itemId)\n .select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at')\n .single()\n if (error) throw new Error(error.message)\n await recalc(orderId)\n return toItem(row)\n },\n\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const page = await load({ pageSize: 500, ...(dateRange ? { dateRange } : {}) } as OrderQuery)\n const live = page.data.filter((o) => o.status !== 'cancelled')\n const today = new Date().toISOString().slice(0, 10)\n const todays = live.filter((o) => o.createdAt.slice(0, 10) === today)\n const revenue = todays.reduce((sum, o) => sum + o.total, 0)\n const byKind: Record<string, number> = {}\n const byStatus: Record<string, number> = {}\n for (const o of live) {\n byKind[o.kind as string] = (byKind[o.kind as string] ?? 0) + 1\n byStatus[o.status as string] = (byStatus[o.status as string] ?? 0) + 1\n }\n return {\n todayOrderCount: todays.length,\n todayRevenue: revenue,\n averageTicket: todays.length ? revenue / todays.length : 0,\n activeOrderCount: live.filter((o) => o.status !== 'completed').length,\n ordersByKind: byKind as OrdersSummary['ordersByKind'],\n ordersByStatus: byStatus,\n topItems: [],\n }\n },\n }\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { emitDomainEvent } from '@fayz-ai/core'\nimport { toast } from 'sonner'\nimport type { OrdersDataProvider } from './data/types'\nimport type {\n RestaurantOrder, OrdersSummary,\n OrderQuery, CreateOrderInput, CreateOrderItemInput,\n UpdateOrderStatusInput,\n} from './types'\nimport { getNextStatus } from './types'\n\n/**\n * What the service board shows.\n *\n * It stopped at `ready`, and the board draws a `Saiu` column — so the moment a\n * comanda was served, picked up or dispatched it left the query and vanished\n * off the screen mid-service. The column it should have moved INTO was the one\n * the query excluded, which is the worst possible pairing: the order looks\n * cancelled at exactly the point where someone is still waiting for it.\n *\n * `completed` and `cancelled` are the two that end it. Everything before them\n * is work in progress and stays on the board; the list view is where a finished\n * order is looked up afterwards.\n */\nconst ACTIVE_STATUSES = [\n 'new', 'confirmed', 'preparing', 'ready',\n // The `Saiu` column: one word per kind for the same moment.\n 'served', 'picked_up', 'dispatched', 'delivered',\n] as const\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface OrdersUIState {\n // Data cache\n orders: RestaurantOrder[]\n ordersTotal: number\n ordersLoading: boolean\n orderQuery: OrderQuery\n\n activeOrders: RestaurantOrder[]\n activeOrdersLoading: boolean\n\n summary: OrdersSummary | null\n summaryLoading: boolean\n\n selectedOrderId: string | null\n\n // Actions\n fetchOrders(query: OrderQuery): Promise<void>\n fetchActiveOrders(): Promise<void>\n fetchSummary(dateRange?: { from: string; to: string }): Promise<void>\n selectOrder(id: string | null): void\n createOrder(input: CreateOrderInput): Promise<RestaurantOrder>\n advanceOrderStatus(orderId: string): Promise<void>\n updateOrderStatus(input: UpdateOrderStatusInput): Promise<void>\n cancelOrder(id: string, reason?: string): Promise<void>\n addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<void>\n removeOrderItem(itemId: string): Promise<void>\n}\n\nexport interface OrdersLifecycleHooks {\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n}\n\nfunction emitOrderLifecycleEvent(\n key: 'orders.order_completed' | 'orders.order_cancelled',\n order: RestaurantOrder,\n): void {\n emitDomainEvent(key, {\n order_id: order.id,\n reference_number: order.referenceNumber,\n total: order.total,\n item_count: order.items.length,\n source: order.source,\n }, {\n tenantId: order.tenantId,\n subject: { type: 'order', id: order.id },\n })\n}\n\nasync function runLifecycleHook(\n label: 'completed' | 'cancelled',\n order: RestaurantOrder,\n hook?: (order: RestaurantOrder) => Promise<void>,\n): Promise<void> {\n if (!hook) return\n try {\n await hook(order)\n } catch (error) {\n const message = errorMessage(error)\n throw new Error(`Order was ${label}, but downstream synchronization is pending: ${message}`)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(\n provider: OrdersDataProvider,\n hooks: OrdersLifecycleHooks = {},\n): StoreApi<OrdersUIState> {\n return createStore<OrdersUIState>((set, get) => ({\n orders: [],\n ordersTotal: 0,\n ordersLoading: false,\n orderQuery: {},\n\n activeOrders: [],\n activeOrdersLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedOrderId: null,\n\n async fetchOrders(query) {\n return dedup('orders:list:' + JSON.stringify(query), async () => {\n set({ ordersLoading: true, orderQuery: query })\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total, ordersLoading: false })\n })\n },\n\n async fetchActiveOrders() {\n return dedup('orders:active', async () => {\n set({ activeOrdersLoading: true })\n const result = await provider.getOrders({ status: [...ACTIVE_STATUSES] })\n set({ activeOrders: result.data, activeOrdersLoading: false })\n })\n },\n\n async fetchSummary(dateRange) {\n return dedup('orders:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary(dateRange)\n set({ summary, summaryLoading: false })\n })\n },\n\n selectOrder(id) {\n set({ selectedOrderId: id })\n },\n\n async createOrder(input) {\n try {\n const order = await provider.createOrder(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Pedido criado')\n return order\n } catch (err: any) {\n toast.error('Não foi possível criar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async advanceOrderStatus(orderId) {\n try {\n const { orders, activeOrders } = get()\n const order = orders.find(o => o.id === orderId) ?? activeOrders.find(o => o.id === orderId)\n if (!order) throw new Error('Order not found')\n\n const nextStatus = getNextStatus(order.kind, order.status)\n if (!nextStatus) throw new Error('No next status available')\n\n const updated = await provider.updateOrderStatus({ orderId, status: nextStatus })\n if (updated.status === 'completed') {\n emitOrderLifecycleEvent('orders.order_completed', updated)\n await runLifecycleHook('completed', updated, hooks.onOrderCompleted)\n }\n\n // A MESMA lista de `fetchActiveOrders`, e não uma cópia à mão.\n //\n // Aqui havia quatro estados escritos de novo — `new`, `confirmed`,\n // `preparing`, `ready` — sem `served`, `picked_up`, `dispatched` nem\n // `delivered`. O quadro era carregado com oito e RECARREGADO com\n // quatro, então bastava avançar um pedido qualquer para que TODOS os\n // que já tinham saído da cozinha sumissem da tela junto: quem clicava\n // em \"Servir\" via o cartão desaparecer, e com ele os que já estavam em\n // Servido. O pedido não tinha ido a lugar nenhum — a segunda consulta é\n // que não perguntava por ele.\n //\n // Uma constante, um significado. `ACTIVE_STATUSES` já diz o que \"ativo\"\n // quer dizer, e o comentário em cima dela explica por quê.\n const activeResult = await provider.getOrders({ status: [...ACTIVE_STATUSES] })\n set({ activeOrders: activeResult.data })\n toast.success('Pedido avançado')\n } catch (err: any) {\n toast.error('Não foi possível avançar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n const before = await provider.getOrderById(input.orderId)\n const updated = await provider.updateOrderStatus(input)\n if (updated.status === 'completed') {\n if (before?.status !== 'completed') emitOrderLifecycleEvent('orders.order_completed', updated)\n // Replaying `completed` deliberately retries the downstream hook. The\n // inventory boundary is idempotent, while an event is emitted only on\n // the actual transition.\n await runLifecycleHook('completed', updated, hooks.onOrderCompleted)\n }\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Status atualizado')\n } catch (err: any) {\n toast.error('Não foi possível atualizar o status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n const before = await provider.getOrderById(id)\n await provider.cancelOrder(id, reason)\n const cancelled = await provider.getOrderById(id)\n const order = cancelled ?? (before ? { ...before, status: 'cancelled' as const } : null)\n if (order) {\n if (before?.status !== 'cancelled') emitOrderLifecycleEvent('orders.order_cancelled', order)\n // A repeated cancellation is a safe retry for an idempotent reversal.\n await runLifecycleHook('cancelled', order, hooks.onOrderCancelled)\n }\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Pedido cancelado')\n } catch (err: any) {\n toast.error('Não foi possível cancelar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async addOrderItem(orderId, item) {\n try {\n await provider.addOrderItem(orderId, item)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item adicionado')\n } catch (err: any) {\n toast.error('Não foi possível adicionar o item', { description: err?.message })\n throw err\n }\n },\n\n async removeOrderItem(itemId) {\n try {\n await provider.removeOrderItem(itemId)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item removido')\n } catch (err: any) {\n toast.error('Não foi possível remover o item', { 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 orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.detail.addItem': 'Add item',\n 'orders.detail.searchMenu': 'Search the menu…',\n 'orders.detail.cancel': 'Cancel order',\n 'orders.detail.cancelConfirm': 'Cancel {reference}? This cannot be undone.',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.list.column.order': 'Order',\n 'orders.list.column.customer': 'Customer',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Status',\n 'orders.list.searchPlaceholder': 'Search by number, customer or table…',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Save draft',\n 'orders.advance.new': 'Send',\n 'orders.advance.confirmed': 'Confirm',\n 'orders.advance.preparing': 'Start prep',\n 'orders.advance.ready': 'Mark ready',\n 'orders.advance.served': 'Serve',\n 'orders.advance.picked_up': 'Hand over',\n 'orders.advance.dispatched': 'Dispatch',\n 'orders.advance.delivered': 'Confirm delivery',\n 'orders.advance.completed': 'Complete',\n 'orders.advance.cancelled': 'Cancel',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.open': 'Open',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.served': 'Served',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.delivery.settings': 'Delivery settings',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.detail.addItem': 'Lançar item',\n 'orders.detail.searchMenu': 'Buscar no cardápio…',\n 'orders.detail.cancel': 'Cancelar pedido',\n 'orders.detail.cancelConfirm': 'Cancelar {reference}? Não dá para desfazer.',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.list.column.order': 'Pedido',\n 'orders.list.column.customer': 'Cliente',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Estado',\n 'orders.list.searchPlaceholder': 'Buscar por número, cliente ou mesa…',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Salvar rascunho',\n 'orders.advance.new': 'Enviar',\n 'orders.advance.confirmed': 'Confirmar',\n 'orders.advance.preparing': 'Preparar',\n 'orders.advance.ready': 'Marcar pronto',\n 'orders.advance.served': 'Servir',\n 'orders.advance.picked_up': 'Entregar',\n 'orders.advance.dispatched': 'Despachar',\n 'orders.advance.delivered': 'Confirmar entrega',\n 'orders.advance.completed': 'Concluir',\n 'orders.advance.cancelled': 'Cancelar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.open': 'Aberta',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.served': 'Servido',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.delivery.settings': 'Configurar entrega',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core'\n\n// The provider name is a parameter because the sentence a tenant judges names it.\nexport function marketplacePermissions(provider: string): ConnectorPermission[] {\n return [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read', 'write'],\n reason:\n `Trazer para cá cada pedido feito no ${provider} — itens, observações, forma de pagamento e o total — ` +\n `e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'menu_item',\n actions: ['read'],\n reason: `Descobrir qual item do seu cardápio corresponde ao que foi vendido no ${provider}. Nenhum item é alterado.`,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: `Registrar quem pediu, com o nome, o telefone e o endereço que o ${provider} envia junto do pedido.`,\n sensitive: true,\n },\n ]\n}\n\nexport const AUTO_ACCEPT_SETTING: ConnectorSetting = {\n key: 'autoAccept',\n label: 'Confirmar o pedido automaticamente',\n description: 'Ligado, o pedido já entra confirmado. Desligado, ele espera alguém aceitar na tela de Pedidos.',\n type: 'toggle',\n defaultValue: false,\n}\n\nexport const PREP_TIME_SETTING: ConnectorSetting = {\n key: 'prepTimeMinutes',\n label: 'Tempo de preparo',\n description: 'Quantos minutos são informados ao aplicativo quando o pedido é confirmado.',\n type: 'text',\n // 5–120: outside that the providers refuse, and the first order is a bad place to find out.\n pattern: '[5-9]|[1-9]\\\\d|1[01]\\\\d|120',\n patternHint: 'De 5 a 120 minutos.',\n placeholder: '30',\n defaultValue: '30',\n}\n\n/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */\nexport function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return named.length > 0 ? named.join(', ') : undefined\n}\n","// One button: the client pair is the platform's, the restaurant authorizes at\n// iFood. iFood's return leg is a userCode and not a redirect — see\n// ../DELIVERY-MARKETPLACES.md for what the platform still owes it.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const IFOOD_CONNECTOR_ID = 'ifood'\n\nconst ORDER_TYPE_LABELS: Record<string, string> = {\n DELIVERY: 'Entrega',\n TAKEOUT: 'Retirada',\n INDOOR: 'Consumo no local',\n}\n\nexport const IFOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'orderTypes',\n label: 'Quais pedidos trazer',\n description: 'iFood entrega, deixa retirar e atende no salão; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: ORDER_TYPE_LABELS.DELIVERY },\n { value: 'TAKEOUT', label: ORDER_TYPE_LABELS.TAKEOUT },\n { value: 'INDOOR', label: ORDER_TYPE_LABELS.INDOOR },\n ],\n // Required to OPERATE, not to connect: nothing selected reads as \"conectado, falta configurar\".\n requiredToOperate: true,\n defaultValue: ['DELIVERY', 'TAKEOUT'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `merchantId` is a settings key and not a field: the distributed token covers\n// every store the merchant authorized, so which one is DISCOVERED after the\n// grant rather than typed before it.\nconst store = createConnectionStore(IFOOD_CONNECTOR_ID, {\n settings: IFOOD_SETTINGS,\n settingsKeys: ['merchantId'],\n})\n\nexport const ifoodConnectorDef: ConnectorDefinition = {\n id: IFOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'iFood',\n description: 'Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/',\n // A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.\n rateLimit: { perSecond: 1 },\n permissions: marketplacePermissions('iFood'),\n // No form. The client pair is OURS, held by the platform, and the restaurant\n // authorizes on iFood's own screen — it never sees a credential of ours.\n fields: [],\n settings: IFOOD_SETTINGS,\n howItSyncs: [\n 'A ligação com o iFood é lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no iFood.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o iFood — o cliente acompanha pelo aplicativo dele.',\n ],\n ...connectionStatus(\n IFOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),\n plane: 'sync',\n ...settingsStatus(IFOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(IFOOD_CONNECTOR_ID),\n // Runs on the way back, to say the account is linked. No values: the grant is\n // the platform's and there is nothing configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, like Keeta — but 99Food's reference is behind partner access, so\n// that its open platform brokers merchant authorization the same way is an\n// assumption, not a reading. See ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const NINETY_NINE_FOOD_CONNECTOR_ID = '99food'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: '99Food entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\nconst store = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {\n settings: NINETY_NINE_FOOD_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const nineNineFoodConnectorDef: ConnectorDefinition = {\n id: NINETY_NINE_FOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: '99Food',\n description: 'Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Declared as the same open-platform shape Keeta turned out to be — see the\n // header for what that assumption rests on.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer-food.99app.com/',\n // No rateLimit: whether we poll at all is part of what is unverified.\n permissions: marketplacePermissions('99Food'),\n fields: [],\n settings: NINETY_NINE_FOOD_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no 99Food entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no 99Food.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o 99Food.',\n ],\n ...connectionStatus(\n NINETY_NINE_FOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button: appId/appSecret are the platform's and the merchant self-authorizes\n// on Keeta's page. Keeta pushes orders, and there is no connector webhook ingress\n// yet — see ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const KEETA_CONNECTOR_ID = 'keeta'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const KEETA_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'Keeta entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `shopId` comes back with the grant — it is what an inbound push matches a\n// tenant on, and it is discovered, never typed.\nconst store = createConnectionStore(KEETA_CONNECTOR_ID, {\n settings: KEETA_SETTINGS,\n settingsKeys: ['shopId'],\n})\n\nexport const keetaConnectorDef: ConnectorDefinition = {\n id: KEETA_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Keeta',\n description: 'Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Keeta's own words: the credentials are software-level and the merchant\n // self-authorizes, which is the redirect flow this declares.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Keeta dials us, iFood does not.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://api-docs.mykeeta.com/apis/standard/docs/intro',\n // No rateLimit: a budget describes what we spend, and nothing here polls Keeta.\n permissions: marketplacePermissions('Keeta'),\n fields: [],\n settings: KEETA_SETTINGS,\n howItSyncs: [\n 'O Keeta avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Se o aviso não chegar de primeira, o Keeta tenta de novo — e um pedido já trazido não entra duas vezes.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Keeta.',\n ],\n ...connectionStatus(\n KEETA_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(KEETA_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, and this one is Uber's own documented flow rather than an\n// assumption: the merchant is sent to Uber's login, authorizes the scope\n// `eats.pos_provisioning`, and comes back with an authorization code. The pair\n// behind it is ours — the restaurant never sees it. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const UBER_EATS_CONNECTOR_ID = 'ubereats'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const UBER_EATS_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Uber Eats entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is Uber's own store id, read from `GET /stores` with the grant and\n// then provisioned with `POST /pos_data`. Discovered, never typed — Uber's docs\n// say in so many words that the external id \"can be arbitrary and should not be\n// used as a sole matchpoint\".\nconst store = createConnectionStore(UBER_EATS_CONNECTOR_ID, {\n settings: UBER_EATS_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const uberEatsConnectorDef: ConnectorDefinition = {\n id: UBER_EATS_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Uber Eats',\n description:\n 'Traga para a cozinha cada pedido feito no Uber Eats, e avise o Uber Eats quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Two grants, one merchant-facing: `client_credentials` for the day-to-day\n // calls and `authorization_code` for the store activation. It is the second\n // that this button opens.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Uber Eats pushes, like Keeta.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.uber.com/docs/eats/introduction',\n // No rateLimit: a budget describes what we spend, and nothing here polls Uber.\n permissions: marketplacePermissions('Uber Eats'),\n fields: [],\n settings: UBER_EATS_SETTINGS,\n howItSyncs: [\n 'O Uber Eats avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Uber Eats.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Uber Eats.',\n ],\n ...connectionStatus(\n UBER_EATS_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(UBER_EATS_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(UBER_EATS_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// The one on this shelf with no consent screen to open, and it is Rappi's\n// protocol that decides it: the `client_id`/`client_secret` pair is issued in\n// Rappi's onboarding to WHOEVER INTEGRATES — one pair for the whole fleet, not\n// one per restaurant — and exchanged at `token/login/integrations` for a bearer\n// token. Nothing is redirected, so there is nothing to broker.\n//\n// That makes it the PlugBank shape, not the Cielo one: `api-key` with no\n// `fields`, because the credential is ours and lives in the platform. The\n// restaurant fills in nothing — asking it to paste our pair would be the defect\n// the house rule exists to prevent, and asking it to paste a pair of its own\n// would send every restaurant to register an application Rappi issues to\n// integrators anyway.\n//\n// Declaring `oauth` would be the other lie: a Conectar that opens a screen Rappi\n// does not have. ../DELIVERY-MARKETPLACES.md keeps the evidence.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const RAPPI_CONNECTOR_ID = 'rappi'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const RAPPI_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Rappi entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is read from Rappi with our token, never typed: the pair is issued\n// per integration and one integration carries every store Rappi linked to it.\nconst store = createConnectionStore(RAPPI_CONNECTOR_ID, {\n settings: RAPPI_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const rappiConnectorDef: ConnectorDefinition = {\n id: RAPPI_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Rappi',\n description: 'Traga para a cozinha cada pedido feito no Rappi, e avise o Rappi quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://dev-portal.rappi.com/pt/',\n // No `providerInstall`: there is no panel where the restaurant fetches a key,\n // because there is no key for the restaurant to fetch.\n //\n // No rateLimit: Rappi's own standard is a request every 45 seconds, and that\n // budget belongs with the job that spends it — which is not written yet.\n permissions: marketplacePermissions('Rappi'),\n // Nothing to fill in: the pair is registered in Fayz, and the connect step\n // says exactly that instead of drawing an empty grid.\n fields: [],\n settings: RAPPI_SETTINGS,\n howItSyncs: [\n 'De tempos em tempos, os pedidos novos do Rappi entram na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Rappi.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Rappi.',\n ],\n ...connectionStatus(\n RAPPI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(RAPPI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // No `testConnection`, for PlugBank's reason: the credential is not in this\n // app, so there is nothing this side can validate — and ConnectorDetail\n // renders the button only when the verb exists.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, through Magalu ID — the aiqfome V2 standard. The lojista\n// authorizes the application STORE BY STORE, which is the same grant shape the\n// other marketplaces use and not a second kind of thing: one authorization, one\n// connection, one store. The pair behind it is ours. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const AIQFOME_CONNECTOR_ID = 'aiqfome'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const AIQFOME_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O aiqfome entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` comes back with the grant: the authorization is per store, so the\n// grant already names which one. Discovered, never typed.\nconst store = createConnectionStore(AIQFOME_CONNECTOR_ID, {\n settings: AIQFOME_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const aiqfomeConnectorDef: ConnectorDefinition = {\n id: AIQFOME_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'aiqfome',\n description: 'Traga para a cozinha cada pedido feito no aiqfome, e avise o aiqfome quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Magalu ID: authorization code, `access_token` + `refresh_token`, and the\n // consent lives on the seller's own panel.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.aiqfome.com/docs/api/versions',\n // No rateLimit: how often the orders are read is part of what is unverified.\n permissions: marketplacePermissions('aiqfome'),\n fields: [],\n settings: AIQFOME_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no aiqfome entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no aiqfome.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o aiqfome.',\n ],\n ...connectionStatus(\n AIQFOME_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(AIQFOME_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(AIQFOME_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","import * as React from 'react'\nimport { adminNavigateTo, usePermissionOptional, type OrderReceivable } from '@fayz-ai/admin'\nimport { getSupabaseClientOptional, usePluginRuntimeOptional, describeError } from '@fayz-ai/core'\nimport { ReceivePaymentModal } from '@fayz-ai/plugin-financial'\nimport { Button, toast } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// \"Registrar recebimento\" na tela de um pedido.\n//\n// POR QUE ISTO EXISTE. O bloco \"Contas a receber\" ja era compartilhado e ja era\n// lido em todo produto que tem pedidos — mas ninguem preenchia o seam\n// `receivableActions`. Na pratica: a tela sabia dizer que o pedido nao tinha\n// conta a receber, e nao oferecia nenhuma forma de receber por ele.\n//\n// UM VERBO, NAO DOIS. A loja (plugin-shop) tem so \"Registrar recebimento\"\n// porque la o recebivel nasce no CHECKOUT. Aqui o pedido pode nunca ter sido\n// faturado — e a resposta NAO e um segundo botao \"Faturar\" com toast proprio.\n// Faturar e o primeiro passo do MESMO ato, e quem pergunta metodo, conta e data\n// e o modal do Financeiro, que ja existe e ja sabe fazer isso.\n//\n// Entao o clique e sempre o mesmo: se falta a fatura, levanta-se a fatura em\n// silencio e abre-se o modal na parcela que ela criou. O operador ve uma tela\n// so — a do Financeiro —, e nao um fluxo paralelo inventado aqui.\n//\n// A ESCRITA E A MESMA DOS OUTROS CAMINHOS. `fn_invoice_from_order` e a ponte que\n// o checkout da loja usa, alinhada com a da comanda na migration 004: o pedido\n// conserva o proprio `reference_number`, a parcela nasce com `unit_id`, e\n// `p_status` so e aplicado quando a especie o declara. O recebimento e\n// `financial_receive_payment`, dentro do modal. Nada aqui inventa uma segunda\n// forma de faturar nem uma segunda forma de receber.\n// ---------------------------------------------------------------------------\n\n/** A parcela como `ReceivePaymentModal` a quer — `v_financial_bills` expoe `installment_id AS id`. */\nfunction toModalInstallment(bill: Record<string, unknown>) {\n return {\n id: bill.id,\n amount: Number(bill.amount ?? 0),\n paidAmount: Number(bill.paid_amount ?? 0),\n installmentNumber: bill.installment_number ?? 1,\n direction: bill.direction ?? 'credit',\n dueDate: bill.due_date,\n invoiceId: bill.financial_invoice_id ?? bill.invoice_id,\n } as never\n}\n\n/** A primeira parcela que ainda tem saldo. */\nfunction firstOpenBill(receivable: OrderReceivable | null) {\n return receivable?.bills.find(\n (b) => Number((b as { paid_amount?: number }).paid_amount ?? 0) < Number(b.amount),\n )\n}\n\nexport interface OrderReceivableActionsProps {\n orderId: string\n /** O total do pedido — nao ha o que receber de um pedido que nao vale nada. */\n orderTotal: number\n receivable: OrderReceivable | null\n /** `force` porque faturar e receber precisam enxergar a propria escrita. */\n reload: (force?: boolean) => Promise<void>\n}\n\nexport function OrderReceivableActions({ orderId, orderTotal, receivable, reload }: OrderReceivableActionsProps) {\n const [busy, setBusy] = React.useState(false)\n const [paying, setPaying] = React.useState<unknown>(null)\n const can = usePermissionOptional()\n\n // \"Abrir no Financeiro\" precisa de uma ROTA existir, nao do id do plugin: um\n // app pode montar so as CONFIGURACOES do financeiro (createFinancialSettings-\n // Plugin declara o mesmo id e nao tem `/financial`), e o link levaria a uma\n // porta pintada na parede. Mesma checagem que a loja faz.\n const runtime = usePluginRuntimeOptional()\n const hasFinancialRoute = (runtime?.activePlugins ?? []).some(\n (p) => (p as { routes?: { path?: string }[] }).routes?.some((r) => r.path === '/financial'),\n )\n\n // O wrapper publico `fn_invoice_from_order` exige `financial.create` de QUEM\n // CHAMA — quem dispensa e o `_internal`, e ele nao e chamavel do navegador.\n // Sem este gate o botao existiria para um garcom e devolveria 42501 no clique.\n const canInvoice = can('financial', 'create')\n\n const balance = receivable ? Number(receivable.balance.balance ?? 0) : 0\n const cancelled = receivable?.balance.status === 'cancelled'\n const openBill = firstOpenBill(receivable)\n\n // Sem recebivel, o botao vale se a pessoa pode faturar E se ha o que faturar;\n // com recebivel, vale enquanto sobrar saldo.\n //\n // O guarda do total nao e teorico: um pedido novo, sem item, aceitou ser\n // faturado por R$ 0,00 e devolveu uma parcela que ja nascia quitada — fatura\n // de zero real no livro, e um erro para o operador logo depois. Faturar exige\n // ter valor, e essa e a checagem mais barata que existe.\n const canReceive = receivable\n ? balance > 0 && !cancelled && Boolean(openBill)\n : canInvoice && Number(orderTotal) > 0\n\n /**\n * Um clique, um modal. A fatura, quando falta, e levantada aqui e o modal\n * abre na parcela dela — o operador nao ve dois passos porque nao sao dois\n * atos.\n */\n async function registrarRecebimento() {\n if (receivable) {\n const bill = firstOpenBill(receivable)\n if (bill) setPaying(toModalInstallment(bill as unknown as Record<string, unknown>))\n return\n }\n\n const db = getSupabaseClientOptional() as unknown as {\n rpc: (fn: string, args: Record<string, unknown>) => Promise<{ error?: { message?: string } | null }>\n from: (t: string) => any\n } | null\n if (!db) return\n\n setBusy(true)\n try {\n const { error } = await db.rpc('fn_invoice_from_order', { p_order_id: orderId })\n if (error) throw new Error(error.message ?? 'Falha ao faturar o pedido')\n\n // A parcela recem-criada vem da MESMA view que o bloco le, e nao do\n // retorno da RPC: o modal precisa de `installment_id`, que e o que\n // `v_financial_bills` expoe, e ler daqui mantem os dois lados na mesma\n // fonte. `reload(true)` sozinho nao serve — ele atualiza o bloco depois,\n // e o modal precisa da parcela agora.\n const { data } = await db\n .from('v_financial_bills')\n .select('*')\n .eq('invoice_id', orderId)\n .order('installment_number', { ascending: true })\n const bill = (data ?? []).find(\n (b: { paid_amount?: number; amount?: number }) => Number(b.paid_amount ?? 0) < Number(b.amount ?? 0),\n )\n await reload(true)\n if (bill) setPaying(toModalInstallment(bill))\n else toast.error('Pedido faturado, mas nenhuma parcela em aberto foi encontrada')\n } catch (err: unknown) {\n toast.error(describeError(err, 'Falha ao faturar o pedido'))\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <>\n {canReceive && (\n <Button onClick={() => void registrarRecebimento()} disabled={busy} data-testid=\"order-register-receipt\">\n {busy ? 'Abrindo…' : 'Registrar recebimento'}\n </Button>\n )}\n\n {hasFinancialRoute && (\n <button\n type=\"button\"\n onClick={() => adminNavigateTo('/financial')}\n className=\"rounded-md border px-3 py-1.5 text-sm font-medium transition hover:bg-muted\"\n >\n Abrir no Financeiro\n </button>\n )}\n\n {/* SEM gate de rota, e a distincao importa: o modal traz o proprio provider\n e store, entao o que ele precisa sao as TABELAS do financeiro, nao o\n plugin montado. Gatear aqui transformaria o botao num clique morto. */}\n {paying != null && (\n <ReceivePaymentModal\n installment={paying as never}\n onClose={() => setPaying(null)}\n onPaid={() => {\n setPaying(null)\n void reload(true)\n }}\n />\n )}\n </>\n )\n}\n","import React from 'react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// useDeliverySettings — a política de entrega da casa, lida e salva\n// ---------------------------------------------------------------------------\n// Mesma forma do `useStoreSettings` do plugin-shop, e pela mesma razão: cada\n// linha é UMA decisão com significado imediato (\"entrego em 45 min\"), então\n// salva sozinha, com debounce, e a tela diz \"salvando…\" em vez de pedir que\n// alguém lembre no que tocou.\n//\n// Onde mora: `tenants.settings`, pelas RPCs do spine (`tenant_settings` para\n// ler tudo de uma vez, `tenant_setting_set` para gravar chave a chave). A\n// função recusa chave não registrada — ver a migration 041 — e cobra\n// `settings.manage`, então o garçom não muda a taxa.\n\nconst DEBOUNCE_MS = 400\nconst PREFIX = 'delivery.'\n\nexport interface DeliverySettings {\n enabled?: boolean\n fee?: number\n freeOver?: number | null\n minOrder?: number\n etaMinutes?: number\n radiusKm?: number\n}\n\n/** Chave no banco ⇄ campo na tela. Uma tabela, para os dois sentidos. */\nconst KEYS: Record<keyof DeliverySettings, string> = {\n enabled: 'delivery.enabled',\n fee: 'delivery.fee',\n freeOver: 'delivery.free_over',\n minOrder: 'delivery.min_order',\n etaMinutes: 'delivery.eta_minutes',\n radiusKm: 'delivery.radius_km',\n}\n\nexport interface DeliverySettingsHandle {\n value: DeliverySettings\n set: (patch: DeliverySettings) => void\n loading: boolean\n saving: boolean\n /** A gravação foi recusada. O valor otimista continua na tela. */\n error: string | null\n /** A LEITURA falhou: o que está na tela são padrões, não as escolhas da casa. */\n loadError: string | null\n /** Sem backend montado (mock/standalone): a tela diz isso em vez de fingir. */\n supported: boolean\n}\n\nfunction message(e: unknown): string {\n if (e instanceof Error) return e.message\n if (typeof e === 'object' && e && 'message' in e) return String((e as { message: unknown }).message)\n return String(e)\n}\n\nexport function useDeliverySettings(defaults: DeliverySettings = {}): DeliverySettingsHandle {\n const client = React.useMemo(() => getSupabaseClientOptional() as any, [])\n const supported = !!client\n\n const [stored, setStored] = React.useState<DeliverySettings>({})\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!client) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void client\n .rpc('tenant_settings')\n .then(({ data, error: e }: { data: Record<string, unknown> | null; error: unknown }) => {\n if (cancelled) return\n if (e) { setLoadError(message(e)); return }\n const flat = (data ?? {}) as Record<string, unknown>\n const next: DeliverySettings = {}\n for (const [field, key] of Object.entries(KEYS)) {\n // Só o que a casa DECIDIU. Uma chave ausente continua indefinida, e é\n // o `defaults` da tela que responde por ela — gravar o padrão de volta\n // transformaria \"não decidi\" em \"escolhi isto\".\n if (key in flat && flat[key] !== null) (next as any)[field] = flat[key]\n else if (key in flat && flat[key] === null) (next as any)[field] = null\n }\n setStored(next)\n })\n .catch((e: unknown) => { if (!cancelled) setLoadError(message(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [client])\n\n // O patch acumula durante a janela do debounce: três cliques viram uma\n // rodada de gravações, não três corridas para ver quem grava por último.\n const pendingRef = React.useRef<DeliverySettings>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback((patch: DeliverySettings) => {\n setStored((current) => ({ ...current, ...patch }))\n if (!client) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void Promise.all(\n Object.entries(payload).map(([field, value]) =>\n client.rpc('tenant_setting_set', { p_key: KEYS[field as keyof DeliverySettings], p_value: value ?? null })\n .then(({ error: e }: { error: unknown }) => { if (e) throw e }),\n ),\n )\n .catch((e: unknown) => setError(message(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n }, [client])\n\n const value = React.useMemo(() => ({ ...defaults, ...stored }), [defaults, stored])\n\n return { value, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport {\n SettingsGroup, ToggleRow, TextRow,\n useConnectors, ConnectorRow, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\nimport { useDeliverySettings, type DeliverySettings as DeliveryValues } from './useDeliverySettings'\n\n/**\n * Entrega — o que a casa cobra para levar, e quem traz o pedido.\n *\n * Duas coisas na tela, e a distinção é o assunto (a mesma do \"Pagamentos\" da\n * loja, e por isso a mesma forma):\n *\n * • A POLÍTICA é da casa e muda com a estação: taxa, mínimo, tempo, raio.\n * Mora em `tenants.settings` (migration 041) e salva sozinha.\n *\n * • QUEM TRAZ O PEDIDO é uma conexão. iFood, 99Food, Keeta, Uber Eats já são\n * conectores declarados por este plugin; a tela FILTRA o hub por\n * `category === 'marketplace'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * Entrega própria é legítima sem conector nenhum — a moto é do restaurante —\n * então nada aqui exige uma conexão para a política valer.\n */\nconst MARKETPLACE_CATEGORIES = ['marketplace']\n\n/** Aceita \"12,90\" e \"12.90\"; devolve `null` para vazio. */\nfunction parseAmount(text: string): number | null {\n const clean = text.replace(/\\s/g, '').replace(',', '.')\n if (!clean) return null\n const n = Number(clean)\n return Number.isFinite(n) && n >= 0 ? n : NaN\n}\n\nfunction amountText(value: number | null | undefined): string {\n if (value === null || value === undefined) return ''\n return String(value).replace('.', ',')\n}\n\n/** Uma linha de dinheiro/número: texto local no input, número no banco. */\nfunction AmountRow({ label, description, hint, value, onCommit }: {\n label: string\n description?: string\n hint?: string\n value: number | null | undefined\n onCommit: (next: number | null) => void\n}) {\n const [text, setText] = React.useState(() => amountText(value))\n const [invalid, setInvalid] = React.useState(false)\n // O valor do servidor ganha quando muda por fora (carregou, ou outra aba).\n React.useEffect(() => { setText(amountText(value)) }, [value])\n\n return (\n <TextRow\n label={label}\n description={description}\n value={text}\n onChange={(next) => { setText(next); setInvalid(false) }}\n // Só no blur/Enter: salvar por tecla gravaria '1' e '19' no caminho para\n // '19,90', e cada um deles é uma taxa que a casa cobrou de verdade.\n onBlurCommit={() => {\n const parsed = parseAmount(text)\n if (Number.isNaN(parsed)) { setInvalid(true); return }\n setInvalid(false)\n onCommit(parsed)\n }}\n hint={invalid ? 'Use um número, como 9,90.' : hint}\n invalid={invalid}\n placeholder=\"0,00\"\n />\n )\n}\n\nexport function DeliverySettings() {\n const settings = useDeliverySettings({ enabled: true, fee: 0, minOrder: 0, etaMinutes: 45, radiusKm: 0 })\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'orders', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback((connector: UnifiedConnector) => {\n // Mesma regra do hub: a gaveta do assistente é dona da jornada quando está\n // montada, e a folha é o fallback para o fluxo nunca ficar sem saída.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n }, [panelAvailable])\n\n const marketplaces = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && MARKETPLACE_CATEGORIES.includes(c.category)),\n [connectors],\n )\n\n const patch = (next: DeliveryValues) => set(next)\n\n if (!settings.supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda a configuração de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n Não há backend montado aqui, então nada abaixo seria salvo — e por isso não é mostrado.\n </p>\n </div>\n )\n }\n\n if (settings.loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {settings.loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar a configuração de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria o que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{settings.loadError}</p>\n </div>\n )}\n\n <SettingsGroup\n title=\"Entrega\"\n description=\"Vale para o pedido que sai da casa. O quadro de despacho continua existindo com a entrega desligada — o histórico não some.\"\n >\n <ToggleRow\n label=\"A casa entrega\"\n description=\"Desligado, nenhum canal novo nasce como entrega.\"\n checked={value.enabled !== false}\n onChange={(checked) => patch({ enabled: checked })}\n />\n <AmountRow\n label=\"Taxa de entrega\"\n description=\"Cobrada por pedido, na moeda da casa.\"\n hint=\"Zero = entrega sem taxa.\"\n value={value.fee}\n onCommit={(next) => patch({ fee: next ?? 0 })}\n />\n <AmountRow\n label=\"Frete grátis acima de\"\n description=\"Acima deste valor de pedido a taxa é zerada.\"\n hint=\"Vazio = a taxa vale sempre.\"\n value={value.freeOver}\n onCommit={(next) => patch({ freeOver: next })}\n />\n <AmountRow\n label=\"Pedido mínimo\"\n description=\"Abaixo disso a casa não entrega.\"\n hint=\"Zero = sem mínimo.\"\n value={value.minOrder}\n onCommit={(next) => patch({ minOrder: next ?? 0 })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Até onde, e em quanto tempo\"\n description=\"O que o cliente ouve quando pergunta — e o que o despacho promete.\"\n >\n <AmountRow\n label=\"Tempo estimado (min)\"\n description=\"Da confirmação até a porta.\"\n value={value.etaMinutes}\n onCommit={(next) => patch({ etaMinutes: next === null ? 0 : Math.round(next) })}\n />\n <AmountRow\n label=\"Raio de entrega (km)\"\n description=\"Distância máxima a partir da casa.\"\n hint=\"Zero = sem limite declarado.\"\n value={value.radiusKm}\n onCommit={(next) => patch({ radiusKm: next ?? 0 })}\n />\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem traz o pedido</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Marketplaces conectados entram no quadro sozinhos, cada pedido marcado com a origem.\n A credencial vai para o cofre, nunca para o banco da casa.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n {marketplaces.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum marketplace disponível para este app ainda. A entrega própria funciona sem nenhum.\n </p>\n ) : (\n <ul className=\"divide-y\">\n {marketplaces.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {settings.error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {settings.error}\n </span>\n ) : settings.saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n categories={MARKETPLACE_CATEGORIES}\n onSelect={(connector) => { setAdding(false); openJourney(connector) }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateOrderInput,\n CreateOrderItemInput,\n OrderKind,\n OrderQuery,\n OrdersSummary,\n OrderStatus,\n PaginatedResult,\n RestaurantOrder,\n RestaurantOrderItem,\n UpdateOrderStatusInput,\n} from '../types'\nimport type { OrdersDataProvider } from './types'\n\nexport interface FayzOrdersProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n ordersTable?: string\n orderItemsTable?: string\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * canonical orders and items tables. When omitted, scoping is left to\n * the runtime/RLS context.\n */\n tenantId?: string | (() => string | undefined | null)\n /** Active unit id stamped on new orders and their items when available. */\n unitId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: string | null\n party_id?: string | null\n party_name?: string | null\n assignee_id?: string | null\n assignee_name?: string | null\n location_id?: string | null\n subtotal?: number | string | null\n discount?: number | string | null\n tax?: number | string | null\n total?: number | string | null\n currency?: string | null\n notes?: string | null\n tags?: string[] | null\n source?: string | null\n table_id?: string | null\n table_name?: string | null\n estimated_minutes?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n completed_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n order_id?: string | null\n product_id?: string | null\n name?: string | null\n description?: string | null\n quantity?: number | string | null\n unit_price?: number | string | null\n discount?: number | string | null\n total?: number | string | null\n sort_order?: number | null\n modifiers?: string | null\n kitchen_notes?: string | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n}\n\nconst DEFAULT_ORDERS_TABLE = 'orders'\nconst DEFAULT_ORDER_ITEMS_TABLE = 'items'\nconst ORDERS_METADATA_KEY = 'fayzOrders'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\nconst RESTAURANT_STATUSES = new Set<OrderStatus>([\n 'new',\n 'confirmed',\n 'preparing',\n 'ready',\n 'served',\n 'picked_up',\n 'dispatched',\n 'delivered',\n 'completed',\n 'cancelled',\n])\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction dateKey(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction referenceNumber(): string {\n return `ORD-${Date.now().toString().slice(-6)}`\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nfunction canonicalStatus(status: OrderStatus): 'draft' | 'confirmed' | 'completed' | 'cancelled' {\n if (status === 'new') return 'draft'\n if (status === 'completed' || status === 'cancelled') return status\n return 'confirmed'\n}\n\nfunction restaurantStatus(rowStatus: string | null | undefined, metadata: Record<string, unknown>): OrderStatus {\n // Terminal base states are authoritative even if a legacy/external writer\n // changed the spine without updating the restaurant metadata atomically.\n if (rowStatus === 'completed' || rowStatus === 'cancelled') return rowStatus\n const stored = metadata.restaurantStatus\n if (typeof stored === 'string' && RESTAURANT_STATUSES.has(stored as OrderStatus)) return stored as OrderStatus\n if (rowStatus === 'draft') return 'new'\n if (typeof rowStatus === 'string' && RESTAURANT_STATUSES.has(rowStatus as OrderStatus)) return rowStatus as OrderStatus\n return 'confirmed'\n}\n\nfunction ordersMetadata(metadata: Record<string, unknown> | null | undefined): Record<string, unknown> {\n return objectValue(metadata?.[ORDERS_METADATA_KEY])\n}\n\nfunction mergeOrdersMetadata(\n metadata: Record<string, unknown> | null | undefined,\n patch: Record<string, unknown>,\n): Record<string, unknown> {\n const base = { ...(metadata ?? {}) }\n const current = ordersMetadata(base)\n const definedPatch = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n )\n const next = { ...current, ...definedPatch }\n return { ...base, [ORDERS_METADATA_KEY]: next }\n}\n\nfunction itemToRow(\n item: CreateOrderItemInput,\n orderId: string,\n sortOrder: number,\n tenantId?: string,\n unitId?: string,\n): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\n order_id: orderId,\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n metadata: mergeOrdersMetadata(undefined, {\n modifiers: item.modifiers ?? null,\n kitchenNotes: item.kitchenNotes ?? null,\n }),\n }\n}\n\nfunction rowToItem(row: OrderItemRow): RestaurantOrderItem {\n const quantity = numberValue(row.quantity)\n const unitPrice = numberValue(row.unit_price)\n const discount = numberValue(row.discount)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n orderId: row.order_id ?? '',\n productId: row.product_id ?? undefined,\n name: row.name ?? 'Item',\n description: row.description ?? undefined,\n quantity,\n unitPrice,\n discount,\n total: numberValue(row.total) || quantity * unitPrice - discount,\n sortOrder: row.sort_order ?? 0,\n modifiers: row.modifiers ?? (typeof restaurant.modifiers === 'string' ? restaurant.modifiers : undefined),\n kitchenNotes: row.kitchen_notes ?? (typeof restaurant.kitchenNotes === 'string' ? restaurant.kitchenNotes : undefined),\n metadata: row.metadata ?? {},\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrder(row: OrderRow, items: RestaurantOrderItem[] = []): RestaurantOrder {\n const subtotal = numberValue(row.subtotal) || items.reduce((sum, item) => sum + item.total, 0)\n const discount = numberValue(row.discount)\n const tax = numberValue(row.tax)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: restaurantStatus(row.status, restaurant),\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? (typeof restaurant.partyName === 'string' ? restaurant.partyName : undefined),\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? (typeof restaurant.assigneeName === 'string' ? restaurant.assigneeName : undefined),\n locationId: row.location_id ?? undefined,\n subtotal,\n discount,\n tax,\n total: numberValue(row.total) || subtotal - discount + tax,\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: row.tags ?? [],\n source: row.source ?? (typeof restaurant.source === 'string' ? restaurant.source : 'pos'),\n tableId: row.table_id ?? (typeof restaurant.tableId === 'string' ? restaurant.tableId : undefined),\n tableName: row.table_name ?? (typeof restaurant.tableName === 'string' ? restaurant.tableName : undefined),\n estimatedMinutes: row.estimated_minutes\n ?? (typeof restaurant.estimatedMinutes === 'number' ? restaurant.estimatedMinutes : undefined),\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n unitId: row.unit_id ?? undefined,\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction orderPayload(input: CreateOrderInput): Record<string, unknown> {\n const subtotal = input.items.reduce((sum, item) => sum + item.quantity * item.unitPrice - (item.discount ?? 0), 0)\n return {\n reference_number: referenceNumber(),\n kind: input.kind,\n status: 'draft',\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n metadata: mergeOrdersMetadata(undefined, {\n source: input.source ?? 'pos',\n tableId: input.tableId ?? null,\n estimatedMinutes: input.estimatedMinutes ?? null,\n restaurantStatus: 'new',\n }),\n }\n}\n\nfunction updatePayload(\n data: Partial<RestaurantOrder>,\n existingMetadata?: Record<string, unknown>,\n): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.referenceNumber !== undefined) payload.reference_number = data.referenceNumber\n if (data.kind !== undefined) payload.kind = data.kind\n if (data.status !== undefined) payload.status = canonicalStatus(data.status)\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.locationId !== undefined) payload.location_id = data.locationId\n if (data.subtotal !== undefined) payload.subtotal = data.subtotal\n if (data.discount !== undefined) payload.discount = data.discount\n if (data.tax !== undefined) payload.tax = data.tax\n if (data.total !== undefined) payload.total = data.total\n if (data.currency !== undefined) payload.currency = data.currency\n if (data.notes !== undefined) payload.notes = data.notes\n if (data.tags !== undefined) payload.tags = data.tags\n const metadataBase = data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata\n const metadataPatch = {\n partyName: data.partyName,\n assigneeName: data.assigneeName,\n source: data.source,\n tableId: data.tableId,\n tableName: data.tableName,\n estimatedMinutes: data.estimatedMinutes,\n restaurantStatus: data.status,\n }\n if (data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)) {\n payload.metadata = mergeOrdersMetadata(metadataBase, metadataPatch)\n }\n if (data.completedAt !== undefined) payload.completed_at = data.completedAt\n return payload\n}\n\nfunction filtersFromQuery(query: OrderQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = []\n if (query.kind && !Array.isArray(query.kind)) filters.push({ column: 'kind', operator: 'eq', value: query.kind })\n if (query.assigneeId) filters.push({ column: 'assignee_id', operator: 'eq', value: query.assigneeId })\n return filters\n}\n\nfunction matchesClientQuery(order: RestaurantOrder, query: OrderQuery): boolean {\n if (Array.isArray(query.kind) && !query.kind.includes(order.kind)) return false\n if (Array.isArray(query.status) && !query.status.includes(order.status)) return false\n if (query.status && !Array.isArray(query.status) && order.status !== query.status) return false\n if (query.source && order.source !== query.source) return false\n if (query.tableId && order.tableId !== query.tableId) return false\n if (query.assigneeId && order.assigneeId !== query.assigneeId) return false\n if (query.dateRange) {\n const created = dateKey(order.createdAt)\n if (created < query.dateRange.from || created > query.dateRange.to) return false\n }\n if (query.search) {\n const search = query.search.toLowerCase()\n return order.referenceNumber.toLowerCase().includes(search)\n || (order.partyName?.toLowerCase().includes(search) ?? false)\n || (order.tableName?.toLowerCase().includes(search) ?? false)\n || order.items.some((item) => item.name.toLowerCase().includes(search))\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 20\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nfunction summarize(orders: RestaurantOrder[], dateRange?: { from: string; to: string }): OrdersSummary {\n const today = dateKey(nowIso())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n const inRange = orders.filter((order) => {\n const created = dateKey(order.createdAt)\n return created >= from && created <= to\n })\n const billable = inRange.filter((order) => order.status !== 'cancelled')\n const revenue = billable.reduce((sum, order) => sum + order.total, 0)\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n const top = new Map<string, { name: string; quantity: number; revenue: number }>()\n\n for (const order of inRange) {\n ordersByKind[order.kind] = (ordersByKind[order.kind] ?? 0) + 1\n ordersByStatus[order.status] = (ordersByStatus[order.status] ?? 0) + 1\n if (order.status === 'cancelled') continue\n for (const item of order.items) {\n const current = top.get(item.name) ?? { name: item.name, quantity: 0, revenue: 0 }\n current.quantity += item.quantity\n current.revenue += item.total\n top.set(item.name, current)\n }\n }\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: billable.length > 0 ? revenue / billable.length : 0,\n activeOrderCount: orders.filter((order) => ACTIVE_STATUSES.has(order.status)).length,\n ordersByKind,\n ordersByStatus,\n topItems: [...top.values()].sort((a, b) => b.quantity - a.quantity).slice(0, 5),\n }\n}\n\nexport function createFayzOrdersProvider(options: FayzOrdersProviderOptions = {}): OrdersDataProvider {\n const client = createFayzClient(options)\n const ordersTable = options.ordersTable ?? DEFAULT_ORDERS_TABLE\n const orderItemsTable = options.orderItemsTable ?? DEFAULT_ORDER_ITEMS_TABLE\n const tableOptions = { projectId: options.projectId, schema: options.schema, runtime: options.runtime }\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 resolveUnit(): string | undefined {\n const value = typeof options.unitId === 'function' ? options.unitId() : options.unitId\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 listItemRows(orderIds: string[]): Promise<OrderItemRow[]> {\n if (orderIds.length === 0) return []\n const rows: OrderItemRow[] = []\n await Promise.all(orderIds.map(async (orderId) => {\n const response = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'order_id', operator: 'eq', value: orderId }],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 200,\n })\n rows.push(...response.rows)\n }))\n return rows\n }\n\n async function hydrate(rows: OrderRow[]): Promise<RestaurantOrder[]> {\n const itemRows = await listItemRows(rows.map((row) => row.id))\n const byOrder = new Map<string, RestaurantOrderItem[]>()\n for (const itemRow of itemRows) {\n const item = rowToItem(itemRow)\n const list = byOrder.get(item.orderId) ?? []\n list.push(item)\n byOrder.set(item.orderId, list)\n }\n return rows.map((row) => rowToOrder(row, byOrder.get(row.id) ?? []))\n }\n\n async function listOrders(query: OrderQuery = {}): Promise<RestaurantOrder[]> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'created_at',\n sortDirection: 'desc',\n limit: 500,\n })\n return (await hydrate(response.rows)).filter((order) => matchesClientQuery(order, query))\n }\n\n async function getById(id: string): Promise<RestaurantOrder | null> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return (await hydrate(response.rows))[0] ?? null\n }\n\n return {\n async getOrders(query) {\n const orders = await listOrders(query)\n return paginate(orders, query.page, query.pageSize)\n },\n\n async getOrderById(id) {\n return getById(id)\n },\n\n async createOrder(input) {\n const tenantId = resolveTenant()\n const unitId = resolveUnit()\n const orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: {\n ...orderPayload(input),\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n },\n })\n await Promise.all(input.items.map((item, index) => client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderRow.id, index, tenantId, unitId),\n })))\n return (await getById(orderRow.id)) ?? rowToOrder(orderRow)\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput) {\n const completedAt = input.status === 'completed' ? nowIso() : undefined\n return this.updateOrder(input.orderId, { status: input.status, completedAt })\n },\n\n async updateOrder(id, data) {\n const existing = await getById(id)\n const row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data, existing?.metadata),\n })\n return (await getById(row.id)) ?? rowToOrder(row)\n },\n\n async cancelOrder(id, reason) {\n const order = await getById(id)\n await this.updateOrder(id, {\n status: 'cancelled',\n notes: reason ? `${order?.notes ? `${order.notes}\\n` : ''}Cancelled: ${reason}` : order?.notes,\n })\n },\n\n async addOrderItem(orderId, item) {\n const order = await getById(orderId)\n const row = await client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderId, order?.items.length ?? 0, order?.tenantId, order?.unitId ?? resolveUnit()),\n })\n const created = rowToItem(row)\n const items = [...(order?.items ?? []), created]\n await this.updateOrder(orderId, {\n subtotal: items.reduce((sum, orderItem) => sum + orderItem.total, 0),\n total: items.reduce((sum, orderItem) => sum + orderItem.total, 0) - (order?.discount ?? 0) + (order?.tax ?? 0),\n })\n return created\n },\n\n async removeOrderItem(itemId) {\n const orders = await listOrders()\n const order = orders.find((item) => item.items.some((orderItem) => orderItem.id === itemId))\n await client.data.deleteRows({ ...tableOptions, table: orderItemsTable, rows: [{ id: itemId }] })\n if (order) {\n const items = order.items.filter((item) => item.id !== itemId)\n const subtotal = items.reduce((sum, item) => sum + item.total, 0)\n await this.updateOrder(order.id, { subtotal, total: subtotal - order.discount + order.tax })\n }\n },\n\n async updateOrderItem(itemId, data) {\n const existingResult = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'id', operator: 'eq', value: itemId }],\n limit: 1,\n })\n const existingMetadata = existingResult.rows[0]?.metadata ?? undefined\n const metadataPatch = {\n modifiers: data.modifiers,\n kitchenNotes: data.kitchenNotes,\n }\n const row = await client.data.updateRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n primaryKeys: { id: itemId },\n row: {\n product_id: data.productId,\n name: data.name,\n description: data.description,\n quantity: data.quantity,\n unit_price: data.unitPrice,\n discount: data.discount,\n total: data.total,\n sort_order: data.sortOrder,\n metadata: data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)\n ? mergeOrdersMetadata(\n data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata,\n metadataPatch,\n )\n : undefined,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport { PageActions, adminNavigateTo, orderIsEditable } from '@fayz-ai/admin'\nimport { Pencil } from 'lucide-react'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createMockOrdersProvider } from './data/mock'\nimport { createCoreOrdersProvider } from './data/core-supabase'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { uberEatsConnectorDef } from './integrations/ubereats/connectorDef'\nimport { rappiConnectorDef } from './integrations/rappi/connectorDef'\nimport { aiqfomeConnectorDef } from './integrations/aiqfome/connectorDef'\nimport { OrderDetailPage, PluginSettingsPanel, type OrderReceivable } from '@fayz-ai/admin'\nimport { OrderReceivableActions } from './views/OrderReceivableActions'\nimport { DeliverySettings } from './settings/DeliverySettings'\nimport type { ResolvedOrdersConfig } from './context'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n /**\n * Which vocabulary the orders screen speaks (#336). `restaurant` is the\n * during-service board plus a list; `commercial` is the salon/clinic reading\n * of the same archetype — Documento · Cliente · Profissional · Total ·\n * Estado · Título — where the last column is whether the Venda produced a\n * Título at all.\n */\n variant?: 'restaurant' | 'commercial'\n /**\n * Offer the floor-plan tab when a floor plan is registered. Default true.\n *\n * `false` for an app whose salão lives on its own operator surface — see\n * `floorView` in ./context.\n */\n floorView?: boolean\n /**\n * Offer the QUADRO tab — the during-service board. Default true.\n *\n * `false` for a house whose /orders is not a service to run: o ERP genérico\n * fatura assinatura e contrato, e o quadro de comanda ali é uma operação de\n * restaurante que nunca acontece. Com as três abas de operação desligadas\n * (quadro, salão, delivery) a tela sobra na LISTA, que é o que um pedido\n * comercial é: um documento, não um serviço em andamento.\n */\n boardView?: boolean\n /**\n * Give the delivery board its own route (e.g. `/delivery`), so the app can\n * put it in the rail instead of behind a tab. Unset = no such route.\n */\n deliveryRoute?: string\n /**\n * `inspect` makes the detail panel read-only — see `detailRail` in ./context.\n * Default `operate`.\n */\n detailRail?: 'operate' | 'inspect'\n /**\n * Where \"create order\" goes, and whether the list offers it at all.\n *\n * This plugin shipped a board and no way to put anything on it — its own\n * `declaredLimits` note says order creation \"flows only through the\n * store/AI-tool with no dedicated UI create handler\". The restaurant app\n * worked around that with a rail entry called \"Nova comanda\", which put the\n * act of opening an order in the navigation instead of on the screen that\n * lists them, two clicks from the board it belongs to.\n *\n * The screen still belongs to the host — a comanda asks for a table and a\n * service mode, an e-commerce order asks for a customer and an address, and\n * neither belongs in this plugin. What belongs here is the BUTTON, in the\n * place every other list in the product keeps it.\n *\n * Unset means no button, which stays right for a variant whose orders arrive\n * from a storefront rather than from someone standing at a counter.\n */\n createRoute?: string\n /**\n * Where this product keeps the full order page, given an id (e.g.\n * `(id) => `/orders/${id}``). The rail's \"Ver pedido completo\" appears only\n * when a host supplies one — a product with no dedicated page should not grow\n * a link to nowhere.\n */\n orderRoute?: (orderId: string) => string\n /**\n * Where this product keeps the EDIT screen, given an id.\n *\n * Unset hides the \"Editar pedido\" button — which is the right answer for a\n * product whose orders arrive already closed, and the previous answer for\n * every product, since the route existed nowhere.\n */\n editRoute?: (orderId: string) => string\n /**\n * Whether THIS order may still be edited.\n *\n * The archetype's own answer (`orderIsEditable`: only `open` and `new`) is\n * the default, and it is deliberately conservative. The rule is the product's\n * because the products genuinely disagree: a shop draft stops being editable\n * the moment it is paid or shipped, while a comanda keeps taking items until\n * the table asks for the bill.\n */\n canEditOrder?: (order: { status?: string }) => boolean\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: OrdersPluginOptions) {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n onOrderCancelled: options?.onOrderCancelled,\n createRoute: options?.createRoute,\n editRoute: options?.editRoute,\n canEditOrder: options?.canEditOrder,\n orderRoute: options?.orderRoute,\n floorView: options?.floorView !== false,\n boardView: options?.boardView !== false,\n deliveryRoute: options?.deliveryRoute,\n detailRail: options?.detailRail ?? 'operate',\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // A commercial mount reads the CORE archetype by default: an app that has\n // orders in the database and no provider of its own (beauty-saas, #336) gets\n // a real list rather than mock rows.\n const provider = options?.dataProvider\n ?? (options?.variant === 'commercial' ? createCoreOrdersProvider() : createMockOrdersProvider())\n const store = createOrdersStore(provider, {\n onOrderCompleted: config.onOrderCompleted,\n onOrderCancelled: config.onOrderCancelled,\n })\n\n const screen = (extra?: Partial<ResolvedOrdersConfig>): React.FC<any> => () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, {\n config: extra ? { ...config, ...extra } : config,\n provider, store, registries: ordersRegistries,\n variant: options?.variant ?? 'restaurant',\n })\n )\n\n const PageComponent = screen()\n // The same screen, pinned to the delivery board — a rail destination rather\n // than a tab. Only mounted when the app asked for the route.\n const DeliveryRoute = screen({ pinnedView: 'delivery' })\n\n // `:id` arrives as a prop — AdminShell spreads the matched route params into\n // the component. The page itself is the shared one from @fayz-ai/admin: an\n // order is an archetype, and so is the screen that reads one.\n const OrderDetailRoute: React.FC<any> = ({ id }: { id?: string }) =>\n id\n ? React.createElement(OrderDetailPage, {\n orderId: id,\n backTo: '/orders',\n // The header had no verbs at all — not just no \"Editar\". The page\n // always had the slot; nobody was filling it.\n actions: (order: { id: string; status?: string }) => {\n const edit = options?.editRoute\n if (!edit) return null\n const allowed = options?.canEditOrder ?? orderIsEditable\n if (!allowed(order)) return null\n return React.createElement(PageActions, {\n actions: [{\n id: 'edit',\n testId: 'order-edit',\n label: 'Editar pedido',\n icon: Pencil,\n intent: 'primary' as const,\n onSelect: () => adminNavigateTo(edit(order.id)),\n }],\n })\n },\n // Os verbos do dinheiro. O seam existia desde a primeira passada do\n // archetype e nunca foi preenchido fora da loja — entao a tela sabia\n // dizer \"sem conta a receber\" e nao oferecia como criar uma. Ver\n // ./views/OrderReceivableActions.\n receivableActions: (\n order: { id: string; total?: number },\n ctx: { receivable: OrderReceivable | null; reload: (force?: boolean) => Promise<void> },\n ) => React.createElement(OrderReceivableActions, {\n orderId: order.id,\n orderTotal: order.total ?? 0,\n receivable: ctx.receivable,\n reload: ctx.reload,\n }),\n })\n : null\n\n return {\n id: 'orders',\n // Como esta conta refaz o módulo com as opções DELA. Ver PluginRebuild:\n // a fábrica roda no carregamento do aplicativo, muito antes de a\n // configuração da conta existir, e sem isto `app.tenant_plugins.config`\n // não tinha como chegar aqui. A fusão é RASA e por bloco — a conta troca\n // `modules` inteiro ou não o troca —, que é o mesmo contrato que a chamada\n // do aplicativo já tem.\n rebuild: (tenantConfig) =>\n createOrdersPlugin({ ...options, ...(tenantConfig as OrdersPluginOptions) }),\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: ['menu'],\n events: [\n {\n name: 'orders.order_completed',\n title: 'Order completed',\n trigger: 'When an order reaches the completed status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n {\n name: 'orders.order_cancelled',\n title: 'Order cancelled',\n trigger: 'When an order reaches the cancelled status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n ],\n // Orders/month quota. NOTE: order creation currently flows only through the\n // store/AI-tool (createOrder) with no dedicated UI create handler, so no\n // client-side guard is wired yet — the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'ClipboardList',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ...(options?.deliveryRoute\n ? [{\n path: options.deliveryRoute,\n component: DeliveryRoute,\n permission: { feature: 'orders', action: 'read' as const },\n }]\n : []),\n {\n // The page the rail's \"Ver pedido completo\" points at. It used to exist\n // only in plugin-shop, so the restaurant's link opened a blank screen —\n // the route was never mounted, not the data missing.\n path: '/orders/:id',\n component: OrderDetailRoute,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'How many orders today?' },\n { label: \"What's the average ticket today?\" },\n { label: \"What's the most ordered item?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'What orders are being prepared right now?' },\n { label: 'Any delivery orders waiting?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n ],\n registries: ordersRegistries,\n settings: [\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n // Entrega — política da casa (taxa, mínimo, tempo, raio) e os\n // marketplaces que trazem o pedido. Só existe onde o delivery existe: um\n // app sem `modules.delivery` não ganha uma tela para configurar um\n // serviço que não presta.\n ...(config.modules.delivery\n ? [{\n id: 'orders-delivery',\n label: 'Delivery',\n icon: 'Bike',\n component: (() => {\n const DeliverySettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(DeliverySettings))\n DeliverySettingsTab.displayName = 'DeliverySettingsTab'\n return DeliverySettingsTab\n })(),\n order: 23,\n // Quanto a casa cobra para entregar é decisão do dono, não de quem\n // despacha: mesma régua da taxa de serviço em plugin-tables.\n permission: { feature: 'orders', action: 'edit' as const },\n }]\n : []),\n ],\n locales: ordersLocales,\n // Offered regardless of `modules.delivery` — a takeout-only house still takes\n // iFood retirada orders. Control plane only: src/integrations/DELIVERY-MARKETPLACES.md.\n connectors: [\n ifoodConnectorDef,\n nineNineFoodConnectorDef,\n keetaConnectorDef,\n uberEatsConnectorDef,\n rappiConnectorDef,\n aiqfomeConnectorDef,\n ],\n }\n}\n\nexport * from './integrations'\n\n// The plugin's own vocabulary. Without this the `dataProvider` seam is\n// unimplementable from outside the package: `OrdersDataProvider` is exported\n// but every type in its signature was not, so an app could name the interface\n// and never satisfy it. plugin-menu has always exported its types; this is\n// plugin-orders catching up.\nexport * from './types'\n\nexport type { OrdersDataProvider } from './data/types'\nexport type { RestaurantOrder, RestaurantOrderItem } from './types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\n// The pool-direct provider: reads v_orders under RLS instead of proxying\n// through the platform's data API. `writes` makes it the flow's owner.\nexport { createCoreOrdersProvider } from './data/core-supabase'\nexport type { CoreOrdersProviderOptions, CoreOrdersWriteOptions } from './data/core-supabase'\nexport type { ResolvedOrdersConfig } from './context'\n"]}
1
+ {"version":3,"sources":["../src/data/core-supabase.ts","../src/types.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/integrations/ubereats/connectorDef.tsx","../src/integrations/rappi/connectorDef.tsx","../src/integrations/aiqfome/connectorDef.tsx","../src/settings/useDeliverySettings.ts","../src/settings/DeliverySettings.tsx","../src/data/platform.ts","../src/data/mock.ts","../src/index.ts"],"names":["ids","message","store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS","getSupabaseClientOptional","value","React","ACTIVE_STATUSES"],"mappings":"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","file":"index.js","sourcesContent":["import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { OrdersDataProvider } from './types'\nimport type {\n RestaurantOrder, RestaurantOrderItem, OrderQuery, PaginatedResult, OrdersSummary,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// A provider over the CORE archetype (#336).\n//\n// The salon has orders — 135 of them on cluster-salon-br-01 — and no screen\n// that shows them. beauty-saas mounts agenda, financial, CRM, inventory and\n// five others, and never plugin-orders, and its own code says `from('orders')`\n// exactly zero times. So the commercial line exists in the database and is\n// unreachable from the product; the visible consequence in the same pool is\n// that 367 of 370 completed appointments have no Venda and no Título, and\n// nobody can SEE it because there is no list that would show 3 where 370 were\n// expected.\n//\n// This provider reads `public.v_orders` — the core's read model, with the\n// delivery state already derived (spine 184) — and joins the payment state from\n// `v_order_payment_status` (financial 039).\n//\n// Writing is OPT-IN, through `writes`. Without it every mutation still refuses:\n// an app that only needs to see its orders should not have to accept a provider\n// that can create them. With it, the app declares itself the owner of the flow\n// — which is what a restaurant is for dine-in, takeout and delivery.\n// ---------------------------------------------------------------------------\n\nconst READ_ONLY = 'This provider reads the core order archetype; pass `writes` to let the app that owns the flow create and edit them.'\n\nexport interface CoreOrdersWriteOptions {\n /**\n * The active org. RLS checks it again on the way in — this is so the row\n * starts correct rather than being corrected by a refusal.\n */\n tenantId: () => string | undefined | null\n /** The active unit, for an app that scopes by one. */\n unitId?: () => string | undefined | null\n /**\n * Which sales channel a kind arrives on. `public.orders.channel` accepts only\n * balcao · shop · dine_in · delivery, so `takeout` — a kind with no channel of\n * its own — has to say which one it counts as.\n */\n channelFor?: (kind: string) => string | undefined\n}\n\nexport interface CoreOrdersProviderOptions {\n /** Restrict the list to these species. Omitted means all four. */\n kinds?: string[]\n /** Restrict the list to one channel (balcao · shop · dine_in · delivery). */\n channel?: string\n /** Present makes the provider writable. See CoreOrdersWriteOptions. */\n writes?: CoreOrdersWriteOptions\n}\n\n// The restaurant's three kinds against the channel vocabulary the archetype\n// already constrains. Takeout is the counter: the customer collects it there.\nconst DEFAULT_CHANNELS: Record<string, string> = {\n dine_in: 'dine_in',\n delivery: 'delivery',\n takeout: 'balcao',\n}\n\n/** PostgREST reads `,` `(` `)` as syntax inside `or=`; a search term is never that. */\nfunction searchTerm(raw?: string): string {\n return (raw ?? '').replace(/[,()%*\\\\\"]/g, ' ').trim()\n}\n\nexport function createCoreOrdersProvider(options?: CoreOrdersProviderOptions): OrdersDataProvider {\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 const writes = options?.writes\n\n function requireWrites(): CoreOrdersWriteOptions {\n if (!writes) throw new Error(READ_ONLY)\n return writes\n }\n\n async function load(query?: OrderQuery, only?: { id?: string }): Promise<PaginatedResult<RestaurantOrder>> {\n const client = db()\n let q = client\n .from('v_orders')\n .select('id, tenant_id, unit_id, kind, channel, status, reference_number, party_id, assignee_id, subtotal, discount, tax, total, currency, notes, created_at, updated_at, completed_at, fulfillment_status, metadata', { count: 'exact' })\n .order('created_at', { ascending: false })\n\n if (only?.id) q = q.eq('id', only.id)\n if (options?.kinds?.length) q = q.in('kind', options.kinds)\n if (options?.channel) q = q.eq('channel', options.channel)\n if (query?.kind) {\n q = Array.isArray(query.kind) ? q.in('kind', query.kind) : q.eq('kind', query.kind)\n }\n if (query?.status) {\n q = Array.isArray(query.status) ? q.in('status', query.status) : q.eq('status', query.status)\n }\n if (query?.channel) q = q.eq('channel', query.channel)\n if (query?.excludeKinds?.length) q = q.not('kind', 'in', `(${query.excludeKinds.join(',')})`)\n if (query?.fulfillmentStatus) q = q.eq('fulfillment_status', query.fulfillmentStatus)\n if (query?.tableId) q = q.eq('metadata->>tableId', query.tableId)\n if (query?.assigneeId) q = q.eq('assignee_id', query.assigneeId)\n if (query?.dateRange) {\n q = q.gte('created_at', query.dateRange.from).lte('created_at', query.dateRange.to)\n }\n const term = searchTerm(query?.search)\n if (term) {\n // The customer's name is not on v_orders, so it is resolved to ids first.\n const { data: named } = await client.from('people').select('id').ilike('name', `%${term}%`).limit(50)\n const ids = (named ?? []).map((p: any) => p.id as string)\n q = q.or([\n `reference_number.ilike.%${term}%`,\n ...(ids.length ? [`party_id.in.(${ids.join(',')})`] : []),\n ].join(','))\n }\n const pageSize = query?.pageSize ?? 100\n const from = ((query?.page ?? 1) - 1) * pageSize\n q = q.range(from, from + pageSize - 1)\n\n const { data, error, count } = await q\n if (error) throw new Error(error.message)\n const rows = (data ?? []) as Record<string, any>[]\n const ids = rows.map((r) => r.id)\n\n // Two joins the salon's screen exists for: who the person is, and whether\n // this Venda produced a Título. The second is the point — it is what turns\n // a 99.2% gap from an audit finding into something the owner notices.\n // The third is the restaurant's: which table the comanda is open on.\n const withItems = query?.withItems !== false\n const [{ data: people }, { data: payments }, { data: items }, { data: shipments }] = await Promise.all([\n ids.length\n ? client.from('people').select('id, name').in('id', [...new Set(rows.flatMap((r) => [r.party_id, r.assignee_id]).filter(Boolean))])\n : Promise.resolve({ data: [] }),\n ids.length\n ? client.from('v_order_payment_status').select('order_id, status, total_amount, paid_amount').in('order_id', ids)\n : Promise.resolve({ data: [] }),\n ids.length && withItems\n ? client.from('items').select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at').in('order_id', ids).order('sort_order')\n : Promise.resolve({ data: [] }),\n ids.length\n ? client.from('fulfillments').select('order_id, status').in('order_id', ids).in('kind', ['shipment', 'pickup'])\n : Promise.resolve({ data: [] }),\n ])\n const shipmentsByOrder = new Map<string, string[]>()\n for (const s of (shipments ?? []) as any[]) {\n shipmentsByOrder.set(s.order_id, [...(shipmentsByOrder.get(s.order_id) ?? []), s.status as string])\n }\n\n const nameById = new Map<string, string>((people ?? []).map((p: any) => [p.id as string, p.name as string]))\n const payById = new Map<string, any>((payments ?? []).map((p: any) => [p.order_id as string, p]))\n const itemsByOrder = new Map<string, RestaurantOrderItem[]>()\n for (const item of (items ?? []) as any[]) {\n const list = itemsByOrder.get(item.order_id) ?? []\n list.push(toItem(item))\n itemsByOrder.set(item.order_id, list)\n }\n\n return {\n data: rows.map((r) => {\n const pay = payById.get(r.id)\n const meta = (r.metadata ?? {}) as Record<string, unknown>\n return {\n id: r.id,\n referenceNumber: r.reference_number ?? String(r.id).slice(0, 8),\n kind: r.kind,\n status: r.status,\n partyId: r.party_id ?? undefined,\n partyName: r.party_id ? nameById.get(r.party_id) : undefined,\n assigneeId: r.assignee_id ?? undefined,\n assigneeName: r.assignee_id ? nameById.get(r.assignee_id) : undefined,\n subtotal: Number(r.subtotal) || 0,\n discount: Number(r.discount) || 0,\n tax: Number(r.tax) || 0,\n total: Number(r.total) || 0,\n currency: r.currency ?? 'BRL',\n notes: r.notes ?? undefined,\n tags: [],\n // `source` is the archetype's channel where it has one; the salon's\n // counter sale has none, and 'balcao' is what that means.\n source: r.channel ?? 'balcao',\n // NOT location_id: that column is a FK to `app.units`, i.e. the\n // BRANCH this order belongs to. A mesa has no table of its own yet,\n // so its id rides in metadata until the floor plan gets one.\n tableId: typeof meta.tableId === 'string' ? meta.tableId : undefined,\n estimatedMinutes: typeof meta.estimatedMinutes === 'number' ? meta.estimatedMinutes : undefined,\n items: itemsByOrder.get(r.id) ?? [],\n metadata: {\n ...meta,\n channel: r.channel ?? null,\n fulfillmentStatus: r.fulfillment_status ?? null,\n paymentStatus: pay?.status ?? 'none',\n invoicedAmount: Number(pay?.total_amount) || 0,\n paidAmount: Number(pay?.paid_amount) || 0,\n shipmentStatuses: shipmentsByOrder.get(r.id) ?? [],\n },\n tenantId: r.tenant_id,\n unitId: r.unit_id ?? undefined,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n completedAt: r.completed_at ?? undefined,\n } as RestaurantOrder\n }),\n total: count ?? rows.length,\n }\n }\n\n function toItem(row: Record<string, any>): RestaurantOrderItem {\n const meta = (row.metadata ?? {}) as Record<string, unknown>\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? undefined,\n name: row.name ?? '',\n description: row.description ?? undefined,\n quantity: Number(row.quantity) || 0,\n unitPrice: Number(row.unit_price) || 0,\n discount: Number(row.discount) || 0,\n total: Number(row.total) || 0,\n sortOrder: row.sort_order ?? 0,\n modifiers: typeof meta.modifiers === 'string' ? meta.modifiers : undefined,\n kitchenNotes: typeof meta.kitchenNotes === 'string' ? meta.kitchenNotes : undefined,\n metadata: meta,\n createdAt: row.created_at,\n }\n }\n\n function lineTotal(item: { quantity: number; unitPrice: number; discount?: number }): number {\n return item.quantity * item.unitPrice - (item.discount ?? 0)\n }\n\n async function loadOne(id: string): Promise<RestaurantOrder | null> {\n const page = await load(undefined, { id })\n return page.data[0] ?? null\n }\n\n /**\n * Push the order's money back in line with its lines.\n *\n * The archetype stores subtotal/total on the order and the lines in `items`,\n * and nothing in the database keeps the two in step — an item added without\n * this leaves a comanda whose total is yesterday's.\n */\n async function recalc(orderId: string): Promise<void> {\n const client = db()\n const { data, error } = await client.from('items').select('total').eq('order_id', orderId)\n if (error) throw new Error(error.message)\n const subtotal = (data ?? []).reduce((sum: number, r: any) => sum + (Number(r.total) || 0), 0)\n const { error: upErr } = await client\n .from('orders')\n .update({ subtotal, total: subtotal })\n .eq('id', orderId)\n if (upErr) throw new Error(upErr.message)\n }\n\n async function orderIdOfItem(itemId: string): Promise<string> {\n const client = db()\n const { data, error } = await client.from('items').select('order_id').eq('id', itemId).single()\n if (error) throw new Error(error.message)\n return data.order_id as string\n }\n\n return {\n getOrders: (query: OrderQuery) => load(query),\n getOrderById: loadOne,\n\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const w = requireWrites()\n const client = db()\n const tenantId = w.tenantId()\n if (!tenantId) throw new Error('No active organization: an order cannot be opened without one')\n\n const channel = (w.channelFor ?? ((k: string) => DEFAULT_CHANNELS[k]))(input.kind)\n const subtotal = input.items.reduce(\n (sum, i) => sum + lineTotal({ quantity: i.quantity, unitPrice: i.unitPrice, discount: i.discount }),\n 0,\n )\n\n const { data: order, error } = await client\n .from('orders')\n .insert({\n tenant_id: tenantId,\n unit_id: w.unitId?.() ?? null,\n kind: input.kind,\n status: 'new',\n ...(channel ? { channel } : {}),\n // party_id is left out on purpose: `trg_orders_require_party` fills it\n // with `public.walkin_party(tenant_id)`, which is exactly what a table\n // with no named customer is.\n ...(input.partyId ? { party_id: input.partyId } : {}),\n ...(input.assigneeId ? { assignee_id: input.assigneeId } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n subtotal,\n total: subtotal,\n currency: 'BRL',\n metadata: {\n ...(input.tableId ? { tableId: input.tableId } : {}),\n ...(input.estimatedMinutes ? { estimatedMinutes: input.estimatedMinutes } : {}),\n },\n })\n .select('id')\n .single()\n if (error) throw new Error(error.message)\n\n if (input.items.length) {\n const { error: itemsErr } = await client.from('items').insert(\n input.items.map((item, index) => ({\n order_id: order.id,\n // tenant_id and parent_kind are inherited from the parent by\n // `trg_items_inherit`; setting them here would only duplicate it.\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: index,\n metadata: {\n ...(item.modifiers ? { modifiers: item.modifiers } : {}),\n ...(item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}),\n },\n })),\n )\n if (itemsErr) throw new Error(itemsErr.message)\n }\n\n const created = await loadOne(order.id)\n if (!created) throw new Error('The order was created but is not readable — check the orders.read permission')\n return created\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n requireWrites()\n const client = db()\n // completed_at is stamped by `trg_orders_kind_guard`, and the same trigger\n // refuses a status the kind never declared — so an invalid drag on the\n // board comes back as a refusal instead of a wrong row.\n const { error } = await client.from('orders').update({ status: input.status }).eq('id', input.orderId)\n if (error) throw new Error(error.message)\n const order = await loadOne(input.orderId)\n if (!order) throw new Error('Order not found after the status change')\n return order\n },\n\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n requireWrites()\n const client = db()\n const patch: Record<string, unknown> = {}\n if (data.status !== undefined) patch.status = data.status\n if (data.notes !== undefined) patch.notes = data.notes\n if (data.partyId !== undefined) patch.party_id = data.partyId\n if (data.assigneeId !== undefined) patch.assignee_id = data.assigneeId\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.tax !== undefined) patch.tax = data.tax\n if (Object.keys(patch).length) {\n const { error } = await client.from('orders').update(patch).eq('id', id)\n if (error) throw new Error(error.message)\n }\n const order = await loadOne(id)\n if (!order) throw new Error('Order not found after the update')\n return order\n },\n\n async cancelOrder(id: string, reason?: string): Promise<void> {\n requireWrites()\n const client = db()\n const { error } = await client\n .from('orders')\n .update({ status: 'cancelled', ...(reason ? { notes: reason } : {}) })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n requireWrites()\n const client = db()\n const { count } = await client\n .from('items')\n .select('id', { count: 'exact', head: true })\n .eq('order_id', orderId)\n const { data, error } = await client\n .from('items')\n .insert({\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: count ?? 0,\n metadata: {\n ...(item.modifiers ? { modifiers: item.modifiers } : {}),\n ...(item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}),\n },\n })\n .select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at')\n .single()\n if (error) throw new Error(error.message)\n await recalc(orderId)\n return toItem(data)\n },\n\n async removeOrderItem(itemId: string): Promise<void> {\n requireWrites()\n const client = db()\n const orderId = await orderIdOfItem(itemId)\n const { error } = await client.from('items').delete().eq('id', itemId)\n if (error) throw new Error(error.message)\n await recalc(orderId)\n },\n\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n requireWrites()\n const client = db()\n const orderId = await orderIdOfItem(itemId)\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.quantity !== undefined) patch.quantity = data.quantity\n if (data.unitPrice !== undefined) patch.unit_price = data.unitPrice\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.quantity !== undefined || data.unitPrice !== undefined || data.discount !== undefined) {\n const { data: current, error: readErr } = await client\n .from('items').select('quantity, unit_price, discount').eq('id', itemId).single()\n if (readErr) throw new Error(readErr.message)\n patch.total = lineTotal({\n quantity: Number(data.quantity ?? current.quantity) || 0,\n unitPrice: Number(data.unitPrice ?? current.unit_price) || 0,\n discount: Number(data.discount ?? current.discount) || 0,\n })\n }\n const { data: row, error } = await client\n .from('items').update(patch).eq('id', itemId)\n .select('id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at')\n .single()\n if (error) throw new Error(error.message)\n await recalc(orderId)\n return toItem(row)\n },\n\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const page = await load({ pageSize: 500, ...(dateRange ? { dateRange } : {}) } as OrderQuery)\n const live = page.data.filter((o) => o.status !== 'cancelled')\n const today = new Date().toISOString().slice(0, 10)\n const todays = live.filter((o) => o.createdAt.slice(0, 10) === today)\n const revenue = todays.reduce((sum, o) => sum + o.total, 0)\n const byKind: Record<string, number> = {}\n const byStatus: Record<string, number> = {}\n for (const o of live) {\n byKind[o.kind as string] = (byKind[o.kind as string] ?? 0) + 1\n byStatus[o.status as string] = (byStatus[o.status as string] ?? 0) + 1\n }\n return {\n todayOrderCount: todays.length,\n todayRevenue: revenue,\n averageTicket: todays.length ? revenue / todays.length : 0,\n activeOrderCount: live.filter((o) => o.status !== 'completed').length,\n ordersByKind: byKind as OrdersSummary['ordersByKind'],\n ordersByStatus: byStatus,\n topItems: [],\n }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Orders Plugin — Pure TypeScript types\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\nexport type OrderKind = 'dine_in' | 'takeout' | 'delivery'\n\nexport type DineInStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'served' | 'completed' | 'cancelled'\nexport type TakeoutStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'picked_up' | 'completed' | 'cancelled'\nexport type DeliveryStatus = 'draft' | 'new' | 'confirmed' | 'preparing' | 'ready' | 'dispatched' | 'delivered' | 'completed' | 'cancelled'\nexport type OrderStatus = DineInStatus | TakeoutStatus | DeliveryStatus\n\n/** Unified columns for the kanban board */\nexport type KanbanColumn = 'new' | 'confirmed' | 'preparing' | 'ready' | 'out' | 'completed' | 'cancelled'\n\n// ============================================================\n// STATUS FLOW\n// ============================================================\n\n// `draft` opens each flow because the app can already produce one: \"Ou salve\n// como rascunho — a cozinha só vê depois de enviada\". It was missing here, so\n// `getNextStatus` returned null for a rascunho and every screen that offers to\n// advance an order offered a draft nothing at all — the one state where the\n// next step (\"mandar para a cozinha\") is least ambiguous.\n//\n// Safe against the database: `public.order_kinds` lists `draft` among the valid\n// statuses of all three kinds, and their transitions are `* → *`.\nexport const STATUS_FLOW: Record<OrderKind, OrderStatus[]> = {\n dine_in: ['draft', 'new', 'confirmed', 'preparing', 'ready', 'served', 'completed'],\n takeout: ['draft', 'new', 'confirmed', 'preparing', 'ready', 'picked_up', 'completed'],\n delivery: ['draft', 'new', 'confirmed', 'preparing', 'ready', 'dispatched', 'delivered', 'completed'],\n}\n\n/**\n * The one moment each kind names differently: the food has left the kitchen.\n * A salão serves it, a counter has it picked up, a courier dispatches it, a\n * customer receives it — one step in four vocabularies.\n */\nconst OUT_STATUSES: OrderStatus[] = ['served', 'picked_up', 'dispatched', 'delivered']\n\nexport function getNextStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null {\n const flow = STATUS_FLOW[kind]\n let idx = flow.indexOf(current)\n // A kind can be handed a SIBLING's word for that moment, because the status\n // is derived and the deriving does not always know the kind: resto-saas reads\n // `dispatched` off a timestamp for every kind, so a dine_in comanda arrives\n // here calling itself dispatched while its own flow says `served`. Without\n // this it had no next step at all — the comanda reached Saiu and could never\n // be finished, from the board or the panel.\n if (idx === -1 && OUT_STATUSES.includes(current)) {\n idx = flow.findIndex((status) => OUT_STATUSES.includes(status))\n }\n return idx >= 0 && idx < flow.length - 1 ? flow[idx + 1] : null\n}\n\n/**\n * O VERBO de cada passo — o que o botão FAZ, não o estado a que chega.\n *\n * \"Avançar\" é a palavra do desenvolvedor: descreve o movimento no diagrama, e\n * não o ato. Quem está no salão numa sexta cheia não avança um pedido, ele\n * confirma, prepara, serve ou despacha — e a diferença aparece justamente no\n * cartão, que é onde a decisão é tomada sem abrir nada.\n *\n * Chaveado pelo estado ALVO, porque é o alvo que nomeia o ato: `getNextStatus`\n * já sabe qual é, inclusive no passo que cada espécie chama de um jeito (o\n * salão serve, o balcão entrega, o motoboy despacha — um passo, quatro\n * vocabulários; ver OUT_STATUSES acima).\n *\n * `draft → new` é \"Enviar\" e não \"Novo\": o rascunho existe porque \"a cozinha só\n * vê depois de enviada\", e enviar é literalmente o que o botão faz.\n */\nexport const ADVANCE_VERB: Record<OrderStatus, string> = {\n draft: 'Salvar rascunho',\n new: 'Enviar',\n confirmed: 'Confirmar',\n preparing: 'Preparar',\n ready: 'Marcar pronto',\n served: 'Servir',\n picked_up: 'Entregar',\n dispatched: 'Despachar',\n delivered: 'Confirmar entrega',\n completed: 'Concluir',\n cancelled: 'Cancelar',\n}\n\nexport function getPreviousStatus(kind: OrderKind, current: OrderStatus): OrderStatus | null {\n const flow = STATUS_FLOW[kind]\n const idx = flow.indexOf(current)\n return idx > 0 ? flow[idx - 1] : null\n}\n\nexport function mapToKanbanColumn(status: OrderStatus): KanbanColumn {\n if (['served', 'picked_up', 'dispatched', 'delivered'].includes(status)) return 'out'\n if (['new', 'confirmed', 'preparing', 'ready', 'completed', 'cancelled'].includes(status)) {\n return status as KanbanColumn\n }\n return 'new'\n}\n\nexport const KANBAN_COLUMNS: KanbanColumn[] = ['new', 'confirmed', 'preparing', 'ready', 'out', 'completed']\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** Restaurant order — public.orders + public.orders extension */\nexport interface RestaurantOrder {\n id: string\n referenceNumber: string\n kind: OrderKind\n status: OrderStatus\n partyId?: string\n partyName?: string\n assigneeId?: string\n assigneeName?: string\n locationId?: string\n subtotal: number\n discount: number\n tax: number\n total: number\n currency: string\n notes?: string\n tags: string[]\n // Extension fields\n source: string\n tableId?: string\n tableName?: string\n estimatedMinutes?: number\n items: RestaurantOrderItem[]\n metadata?: Record<string, unknown>\n tenantId: string\n unitId?: string\n createdAt: string\n updatedAt: string\n completedAt?: string\n}\n\nexport interface RestaurantOrderItem {\n id: string\n orderId: string\n productId?: string\n name: string\n description?: string\n quantity: number\n unitPrice: number\n discount: number\n total: number\n sortOrder: number\n modifiers?: string\n kitchenNotes?: string\n metadata?: Record<string, unknown>\n createdAt: string\n}\n\n// ============================================================\n// INPUT TYPES\n// ============================================================\n\nexport interface CreateOrderInput {\n kind: OrderKind\n source?: string\n tableId?: string\n partyId?: string\n assigneeId?: string\n notes?: string\n estimatedMinutes?: number\n items: CreateOrderItemInput[]\n}\n\nexport interface CreateOrderItemInput {\n productId?: string\n name: string\n quantity: number\n unitPrice: number\n discount?: number\n modifiers?: string\n kitchenNotes?: string\n}\n\nexport interface UpdateOrderStatusInput {\n orderId: string\n status: OrderStatus\n}\n\n// ============================================================\n// QUERY TYPES\n// ============================================================\n\nexport interface OrderQuery {\n // Wider than OrderKind/OrderStatus: the list reads every sale of the account\n // (sale, course, appointment…), not only the restaurant's three kinds.\n kind?: OrderKind | OrderKind[] | (string & {}) | string[]\n status?: OrderStatus | OrderStatus[] | (string & {}) | string[]\n source?: string\n /** Sales channel as `orders.channel` holds it (balcao · shop · delivery…). */\n channel?: string\n /** unfulfilled · partially_fulfilled · fulfilled */\n fulfillmentStatus?: string\n /** Kinds left out — the sales list drops `purchase`, which shares the table. */\n excludeKinds?: string[]\n /** `false` skips the lines — a list row does not draw them. Default true. */\n withItems?: boolean\n tableId?: string\n assigneeId?: string\n dateRange?: { from: string; to: string }\n search?: string\n page?: number\n pageSize?: number\n}\n\nexport interface PaginatedResult<T> {\n data: T[]\n total: number\n}\n\n// ============================================================\n// AGGREGATION\n// ============================================================\n\nexport interface OrdersSummary {\n todayOrderCount: number\n todayRevenue: number\n averageTicket: number\n activeOrderCount: number\n ordersByKind: Record<OrderKind, number>\n ordersByStatus: Record<string, number>\n topItems: Array<{ name: string; quantity: number; revenue: number }>\n}\n\n// ============================================================\n// STATUS CONFIG\n// ============================================================\n\nexport interface OrderStatusConfig {\n value: string\n label: string\n color: string\n icon?: string\n}\n\nexport const DEFAULT_STATUS_CONFIGS: OrderStatusConfig[] = [\n { value: 'new', label: 'New', color: '#6366f1', icon: 'PlusCircle' },\n { value: 'confirmed', label: 'Confirmed', color: '#3b82f6', icon: 'CheckCircle' },\n { value: 'preparing', label: 'Preparing', color: '#f59e0b', icon: 'ChefHat' },\n { value: 'ready', label: 'Ready', color: '#10b981', icon: 'Bell' },\n { value: 'served', label: 'Served', color: '#06b6d4', icon: 'Utensils' },\n { value: 'picked_up', label: 'Picked Up', color: '#06b6d4', icon: 'ShoppingBag' },\n { value: 'dispatched', label: 'Dispatched', color: '#8b5cf6', icon: 'Truck' },\n { value: 'delivered', label: 'Delivered', color: '#06b6d4', icon: 'PackageCheck' },\n { value: 'completed', label: 'Completed', color: '#22c55e', icon: 'CircleCheck' },\n { value: 'cancelled', label: 'Cancelled', color: '#ef4444', icon: 'XCircle' },\n]\n","import { errorMessage } from '@fayz-ai/core'\nimport { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { emitDomainEvent } from '@fayz-ai/core'\nimport { toast } from 'sonner'\nimport type { OrdersDataProvider } from './data/types'\nimport type {\n RestaurantOrder, OrdersSummary,\n OrderQuery, CreateOrderInput, CreateOrderItemInput,\n UpdateOrderStatusInput,\n} from './types'\nimport { getNextStatus } from './types'\n\n/**\n * What the service board shows.\n *\n * It stopped at `ready`, and the board draws a `Saiu` column — so the moment a\n * comanda was served, picked up or dispatched it left the query and vanished\n * off the screen mid-service. The column it should have moved INTO was the one\n * the query excluded, which is the worst possible pairing: the order looks\n * cancelled at exactly the point where someone is still waiting for it.\n *\n * `completed` and `cancelled` are the two that end it. Everything before them\n * is work in progress and stays on the board; the list view is where a finished\n * order is looked up afterwards.\n */\nconst ACTIVE_STATUSES = [\n 'new', 'confirmed', 'preparing', 'ready',\n // The `Saiu` column: one word per kind for the same moment.\n 'served', 'picked_up', 'dispatched', 'delivered',\n] as const\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface OrdersUIState {\n // Data cache\n orders: RestaurantOrder[]\n ordersTotal: number\n ordersLoading: boolean\n orderQuery: OrderQuery\n\n activeOrders: RestaurantOrder[]\n activeOrdersLoading: boolean\n\n summary: OrdersSummary | null\n summaryLoading: boolean\n\n selectedOrderId: string | null\n\n // Actions\n fetchOrders(query: OrderQuery): Promise<void>\n fetchActiveOrders(): Promise<void>\n fetchSummary(dateRange?: { from: string; to: string }): Promise<void>\n selectOrder(id: string | null): void\n createOrder(input: CreateOrderInput): Promise<RestaurantOrder>\n advanceOrderStatus(orderId: string): Promise<void>\n updateOrderStatus(input: UpdateOrderStatusInput): Promise<void>\n cancelOrder(id: string, reason?: string): Promise<void>\n addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<void>\n removeOrderItem(itemId: string): Promise<void>\n}\n\nexport interface OrdersLifecycleHooks {\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n}\n\nfunction emitOrderLifecycleEvent(\n key: 'orders.order_completed' | 'orders.order_cancelled',\n order: RestaurantOrder,\n): void {\n emitDomainEvent(key, {\n order_id: order.id,\n reference_number: order.referenceNumber,\n total: order.total,\n item_count: order.items.length,\n source: order.source,\n }, {\n tenantId: order.tenantId,\n subject: { type: 'order', id: order.id },\n })\n}\n\nasync function runLifecycleHook(\n label: 'completed' | 'cancelled',\n order: RestaurantOrder,\n hook?: (order: RestaurantOrder) => Promise<void>,\n): Promise<void> {\n if (!hook) return\n try {\n await hook(order)\n } catch (error) {\n const message = errorMessage(error)\n throw new Error(`Order was ${label}, but downstream synchronization is pending: ${message}`)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(\n provider: OrdersDataProvider,\n hooks: OrdersLifecycleHooks = {},\n): StoreApi<OrdersUIState> {\n return createStore<OrdersUIState>((set, get) => ({\n orders: [],\n ordersTotal: 0,\n ordersLoading: false,\n orderQuery: {},\n\n activeOrders: [],\n activeOrdersLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedOrderId: null,\n\n async fetchOrders(query) {\n return dedup('orders:list:' + JSON.stringify(query), async () => {\n set({ ordersLoading: true, orderQuery: query })\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total, ordersLoading: false })\n })\n },\n\n async fetchActiveOrders() {\n return dedup('orders:active', async () => {\n set({ activeOrdersLoading: true })\n const result = await provider.getOrders({ status: [...ACTIVE_STATUSES] })\n set({ activeOrders: result.data, activeOrdersLoading: false })\n })\n },\n\n async fetchSummary(dateRange) {\n return dedup('orders:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary(dateRange)\n set({ summary, summaryLoading: false })\n })\n },\n\n selectOrder(id) {\n set({ selectedOrderId: id })\n },\n\n async createOrder(input) {\n try {\n const order = await provider.createOrder(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Pedido criado')\n return order\n } catch (err: any) {\n toast.error('Não foi possível criar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async advanceOrderStatus(orderId) {\n try {\n const { orders, activeOrders } = get()\n const order = orders.find(o => o.id === orderId) ?? activeOrders.find(o => o.id === orderId)\n if (!order) throw new Error('Order not found')\n\n const nextStatus = getNextStatus(order.kind, order.status)\n if (!nextStatus) throw new Error('No next status available')\n\n const updated = await provider.updateOrderStatus({ orderId, status: nextStatus })\n if (updated.status === 'completed') {\n emitOrderLifecycleEvent('orders.order_completed', updated)\n await runLifecycleHook('completed', updated, hooks.onOrderCompleted)\n }\n\n // A MESMA lista de `fetchActiveOrders`, e não uma cópia à mão.\n //\n // Aqui havia quatro estados escritos de novo — `new`, `confirmed`,\n // `preparing`, `ready` — sem `served`, `picked_up`, `dispatched` nem\n // `delivered`. O quadro era carregado com oito e RECARREGADO com\n // quatro, então bastava avançar um pedido qualquer para que TODOS os\n // que já tinham saído da cozinha sumissem da tela junto: quem clicava\n // em \"Servir\" via o cartão desaparecer, e com ele os que já estavam em\n // Servido. O pedido não tinha ido a lugar nenhum — a segunda consulta é\n // que não perguntava por ele.\n //\n // Uma constante, um significado. `ACTIVE_STATUSES` já diz o que \"ativo\"\n // quer dizer, e o comentário em cima dela explica por quê.\n const activeResult = await provider.getOrders({ status: [...ACTIVE_STATUSES] })\n set({ activeOrders: activeResult.data })\n toast.success('Pedido avançado')\n } catch (err: any) {\n toast.error('Não foi possível avançar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n const before = await provider.getOrderById(input.orderId)\n const updated = await provider.updateOrderStatus(input)\n if (updated.status === 'completed') {\n if (before?.status !== 'completed') emitOrderLifecycleEvent('orders.order_completed', updated)\n // Replaying `completed` deliberately retries the downstream hook. The\n // inventory boundary is idempotent, while an event is emitted only on\n // the actual transition.\n await runLifecycleHook('completed', updated, hooks.onOrderCompleted)\n }\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Status atualizado')\n } catch (err: any) {\n toast.error('Não foi possível atualizar o status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n const before = await provider.getOrderById(id)\n await provider.cancelOrder(id, reason)\n const cancelled = await provider.getOrderById(id)\n const order = cancelled ?? (before ? { ...before, status: 'cancelled' as const } : null)\n if (order) {\n if (before?.status !== 'cancelled') emitOrderLifecycleEvent('orders.order_cancelled', order)\n // A repeated cancellation is a safe retry for an idempotent reversal.\n await runLifecycleHook('cancelled', order, hooks.onOrderCancelled)\n }\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Pedido cancelado')\n } catch (err: any) {\n toast.error('Não foi possível cancelar o pedido', { description: err?.message })\n throw err\n }\n },\n\n async addOrderItem(orderId, item) {\n try {\n await provider.addOrderItem(orderId, item)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item adicionado')\n } catch (err: any) {\n toast.error('Não foi possível adicionar o item', { description: err?.message })\n throw err\n }\n },\n\n async removeOrderItem(itemId) {\n try {\n await provider.removeOrderItem(itemId)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item removido')\n } catch (err: any) {\n toast.error('Não foi possível remover o item', { 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 orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.detail.addItem': 'Add item',\n 'orders.detail.searchMenu': 'Search the menu…',\n 'orders.detail.cancel': 'Cancel order',\n 'orders.detail.cancelConfirm': 'Cancel {reference}? This cannot be undone.',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.list.column.order': 'Order',\n 'orders.list.column.customer': 'Customer',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Status',\n 'orders.list.searchPlaceholder': 'Search by number, customer or table…',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Save draft',\n 'orders.advance.new': 'Send',\n 'orders.advance.confirmed': 'Confirm',\n 'orders.advance.preparing': 'Start prep',\n 'orders.advance.ready': 'Mark ready',\n 'orders.advance.served': 'Serve',\n 'orders.advance.picked_up': 'Hand over',\n 'orders.advance.dispatched': 'Dispatch',\n 'orders.advance.delivered': 'Confirm delivery',\n 'orders.advance.completed': 'Complete',\n 'orders.advance.cancelled': 'Cancel',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.open': 'Open',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.served': 'Served',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.delivery.settings': 'Delivery settings',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.detail.addItem': 'Lançar item',\n 'orders.detail.searchMenu': 'Buscar no cardápio…',\n 'orders.detail.cancel': 'Cancelar pedido',\n 'orders.detail.cancelConfirm': 'Cancelar {reference}? Não dá para desfazer.',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.list.column.order': 'Pedido',\n 'orders.list.column.customer': 'Cliente',\n 'orders.list.column.total': 'Total',\n 'orders.list.column.status': 'Estado',\n 'orders.list.searchPlaceholder': 'Buscar por número, cliente ou mesa…',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n // O verbo de cada passo, chaveado pelo estado ALVO. E o que o botao do\n // cartao diz: quem esta no salao nao \"avanca\" um pedido, ele confirma,\n // prepara, serve ou despacha.\n 'orders.advance.draft': 'Salvar rascunho',\n 'orders.advance.new': 'Enviar',\n 'orders.advance.confirmed': 'Confirmar',\n 'orders.advance.preparing': 'Preparar',\n 'orders.advance.ready': 'Marcar pronto',\n 'orders.advance.served': 'Servir',\n 'orders.advance.picked_up': 'Entregar',\n 'orders.advance.dispatched': 'Despachar',\n 'orders.advance.delivered': 'Confirmar entrega',\n 'orders.advance.completed': 'Concluir',\n 'orders.advance.cancelled': 'Cancelar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.open': 'Aberta',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.served': 'Servido',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.delivery.settings': 'Configurar entrega',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core'\n\n// The provider name is a parameter because the sentence a tenant judges names it.\nexport function marketplacePermissions(provider: string): ConnectorPermission[] {\n return [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read', 'write'],\n reason:\n `Trazer para cá cada pedido feito no ${provider} — itens, observações, forma de pagamento e o total — ` +\n `e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'menu_item',\n actions: ['read'],\n reason: `Descobrir qual item do seu cardápio corresponde ao que foi vendido no ${provider}. Nenhum item é alterado.`,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: `Registrar quem pediu, com o nome, o telefone e o endereço que o ${provider} envia junto do pedido.`,\n sensitive: true,\n },\n ]\n}\n\nexport const AUTO_ACCEPT_SETTING: ConnectorSetting = {\n key: 'autoAccept',\n label: 'Confirmar o pedido automaticamente',\n description: 'Ligado, o pedido já entra confirmado. Desligado, ele espera alguém aceitar na tela de Pedidos.',\n type: 'toggle',\n defaultValue: false,\n}\n\nexport const PREP_TIME_SETTING: ConnectorSetting = {\n key: 'prepTimeMinutes',\n label: 'Tempo de preparo',\n description: 'Quantos minutos são informados ao aplicativo quando o pedido é confirmado.',\n type: 'text',\n // 5–120: outside that the providers refuse, and the first order is a bad place to find out.\n pattern: '[5-9]|[1-9]\\\\d|1[01]\\\\d|120',\n patternHint: 'De 5 a 120 minutos.',\n placeholder: '30',\n defaultValue: '30',\n}\n\n/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */\nexport function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return named.length > 0 ? named.join(', ') : undefined\n}\n","// One button: the client pair is the platform's, the restaurant authorizes at\n// iFood. iFood's return leg is a userCode and not a redirect — see\n// ../DELIVERY-MARKETPLACES.md for what the platform still owes it.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const IFOOD_CONNECTOR_ID = 'ifood'\n\nconst ORDER_TYPE_LABELS: Record<string, string> = {\n DELIVERY: 'Entrega',\n TAKEOUT: 'Retirada',\n INDOOR: 'Consumo no local',\n}\n\nexport const IFOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'orderTypes',\n label: 'Quais pedidos trazer',\n description: 'iFood entrega, deixa retirar e atende no salão; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: ORDER_TYPE_LABELS.DELIVERY },\n { value: 'TAKEOUT', label: ORDER_TYPE_LABELS.TAKEOUT },\n { value: 'INDOOR', label: ORDER_TYPE_LABELS.INDOOR },\n ],\n // Required to OPERATE, not to connect: nothing selected reads as \"conectado, falta configurar\".\n requiredToOperate: true,\n defaultValue: ['DELIVERY', 'TAKEOUT'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `merchantId` is a settings key and not a field: the distributed token covers\n// every store the merchant authorized, so which one is DISCOVERED after the\n// grant rather than typed before it.\nconst store = createConnectionStore(IFOOD_CONNECTOR_ID, {\n settings: IFOOD_SETTINGS,\n settingsKeys: ['merchantId'],\n})\n\nexport const ifoodConnectorDef: ConnectorDefinition = {\n id: IFOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'iFood',\n description: 'Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/',\n // A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.\n rateLimit: { perSecond: 1 },\n permissions: marketplacePermissions('iFood'),\n // No form. The client pair is OURS, held by the platform, and the restaurant\n // authorizes on iFood's own screen — it never sees a credential of ours.\n fields: [],\n settings: IFOOD_SETTINGS,\n howItSyncs: [\n 'A ligação com o iFood é lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no iFood.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o iFood — o cliente acompanha pelo aplicativo dele.',\n ],\n ...connectionStatus(\n IFOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),\n plane: 'sync',\n ...settingsStatus(IFOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(IFOOD_CONNECTOR_ID),\n // Runs on the way back, to say the account is linked. No values: the grant is\n // the platform's and there is nothing configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, like Keeta — but 99Food's reference is behind partner access, so\n// that its open platform brokers merchant authorization the same way is an\n// assumption, not a reading. See ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const NINETY_NINE_FOOD_CONNECTOR_ID = '99food'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: '99Food entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\nconst store = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {\n settings: NINETY_NINE_FOOD_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const nineNineFoodConnectorDef: ConnectorDefinition = {\n id: NINETY_NINE_FOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: '99Food',\n description: 'Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Declared as the same open-platform shape Keeta turned out to be — see the\n // header for what that assumption rests on.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer-food.99app.com/',\n // No rateLimit: whether we poll at all is part of what is unverified.\n permissions: marketplacePermissions('99Food'),\n fields: [],\n settings: NINETY_NINE_FOOD_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no 99Food entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no 99Food.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o 99Food.',\n ],\n ...connectionStatus(\n NINETY_NINE_FOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button: appId/appSecret are the platform's and the merchant self-authorizes\n// on Keeta's page. Keeta pushes orders, and there is no connector webhook ingress\n// yet — see ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const KEETA_CONNECTOR_ID = 'keeta'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const KEETA_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'Keeta entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `shopId` comes back with the grant — it is what an inbound push matches a\n// tenant on, and it is discovered, never typed.\nconst store = createConnectionStore(KEETA_CONNECTOR_ID, {\n settings: KEETA_SETTINGS,\n settingsKeys: ['shopId'],\n})\n\nexport const keetaConnectorDef: ConnectorDefinition = {\n id: KEETA_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Keeta',\n description: 'Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Keeta's own words: the credentials are software-level and the merchant\n // self-authorizes, which is the redirect flow this declares.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Keeta dials us, iFood does not.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://api-docs.mykeeta.com/apis/standard/docs/intro',\n // No rateLimit: a budget describes what we spend, and nothing here polls Keeta.\n permissions: marketplacePermissions('Keeta'),\n fields: [],\n settings: KEETA_SETTINGS,\n howItSyncs: [\n 'O Keeta avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Se o aviso não chegar de primeira, o Keeta tenta de novo — e um pedido já trazido não entra duas vezes.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Keeta.',\n ],\n ...connectionStatus(\n KEETA_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(KEETA_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, and this one is Uber's own documented flow rather than an\n// assumption: the merchant is sent to Uber's login, authorizes the scope\n// `eats.pos_provisioning`, and comes back with an authorization code. The pair\n// behind it is ours — the restaurant never sees it. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const UBER_EATS_CONNECTOR_ID = 'ubereats'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const UBER_EATS_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Uber Eats entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is Uber's own store id, read from `GET /stores` with the grant and\n// then provisioned with `POST /pos_data`. Discovered, never typed — Uber's docs\n// say in so many words that the external id \"can be arbitrary and should not be\n// used as a sole matchpoint\".\nconst store = createConnectionStore(UBER_EATS_CONNECTOR_ID, {\n settings: UBER_EATS_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const uberEatsConnectorDef: ConnectorDefinition = {\n id: UBER_EATS_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Uber Eats',\n description:\n 'Traga para a cozinha cada pedido feito no Uber Eats, e avise o Uber Eats quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Two grants, one merchant-facing: `client_credentials` for the day-to-day\n // calls and `authorization_code` for the store activation. It is the second\n // that this button opens.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Uber Eats pushes, like Keeta.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.uber.com/docs/eats/introduction',\n // No rateLimit: a budget describes what we spend, and nothing here polls Uber.\n permissions: marketplacePermissions('Uber Eats'),\n fields: [],\n settings: UBER_EATS_SETTINGS,\n howItSyncs: [\n 'O Uber Eats avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Uber Eats.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Uber Eats.',\n ],\n ...connectionStatus(\n UBER_EATS_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(UBER_EATS_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(UBER_EATS_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// The one on this shelf with no consent screen to open, and it is Rappi's\n// protocol that decides it: the `client_id`/`client_secret` pair is issued in\n// Rappi's onboarding to WHOEVER INTEGRATES — one pair for the whole fleet, not\n// one per restaurant — and exchanged at `token/login/integrations` for a bearer\n// token. Nothing is redirected, so there is nothing to broker.\n//\n// That makes it the PlugBank shape, not the Cielo one: `api-key` with no\n// `fields`, because the credential is ours and lives in the platform. The\n// restaurant fills in nothing — asking it to paste our pair would be the defect\n// the house rule exists to prevent, and asking it to paste a pair of its own\n// would send every restaurant to register an application Rappi issues to\n// integrators anyway.\n//\n// Declaring `oauth` would be the other lie: a Conectar that opens a screen Rappi\n// does not have. ../DELIVERY-MARKETPLACES.md keeps the evidence.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const RAPPI_CONNECTOR_ID = 'rappi'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const RAPPI_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O Rappi entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` is read from Rappi with our token, never typed: the pair is issued\n// per integration and one integration carries every store Rappi linked to it.\nconst store = createConnectionStore(RAPPI_CONNECTOR_ID, {\n settings: RAPPI_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const rappiConnectorDef: ConnectorDefinition = {\n id: RAPPI_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Rappi',\n description: 'Traga para a cozinha cada pedido feito no Rappi, e avise o Rappi quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'api-key',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://dev-portal.rappi.com/pt/',\n // No `providerInstall`: there is no panel where the restaurant fetches a key,\n // because there is no key for the restaurant to fetch.\n //\n // No rateLimit: Rappi's own standard is a request every 45 seconds, and that\n // budget belongs with the job that spends it — which is not written yet.\n permissions: marketplacePermissions('Rappi'),\n // Nothing to fill in: the pair is registered in Fayz, and the connect step\n // says exactly that instead of drawing an empty grid.\n fields: [],\n settings: RAPPI_SETTINGS,\n howItSyncs: [\n 'De tempos em tempos, os pedidos novos do Rappi entram na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no Rappi.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Rappi.',\n ],\n ...connectionStatus(\n RAPPI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(RAPPI_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n // No `testConnection`, for PlugBank's reason: the credential is not in this\n // app, so there is nothing this side can validate — and ConnectorDetail\n // renders the button only when the verb exists.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, through Magalu ID — the aiqfome V2 standard. The lojista\n// authorizes the application STORE BY STORE, which is the same grant shape the\n// other marketplaces use and not a second kind of thing: one authorization, one\n// connection, one store. The pair behind it is ours. See\n// ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const AIQFOME_CONNECTOR_ID = 'aiqfome'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const AIQFOME_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'O aiqfome entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `storeId` comes back with the grant: the authorization is per store, so the\n// grant already names which one. Discovered, never typed.\nconst store = createConnectionStore(AIQFOME_CONNECTOR_ID, {\n settings: AIQFOME_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const aiqfomeConnectorDef: ConnectorDefinition = {\n id: AIQFOME_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'aiqfome',\n description: 'Traga para a cozinha cada pedido feito no aiqfome, e avise o aiqfome quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Magalu ID: authorization code, `access_token` + `refresh_token`, and the\n // consent lives on the seller's own panel.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.aiqfome.com/docs/api/versions',\n // No rateLimit: how often the orders are read is part of what is unverified.\n permissions: marketplacePermissions('aiqfome'),\n fields: [],\n settings: AIQFOME_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no aiqfome entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no aiqfome.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o aiqfome.',\n ],\n ...connectionStatus(\n AIQFOME_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(AIQFOME_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(AIQFOME_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","import React from 'react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// useDeliverySettings — a política de entrega da casa, lida e salva\n// ---------------------------------------------------------------------------\n// Mesma forma do `useStoreSettings` do plugin-shop, e pela mesma razão: cada\n// linha é UMA decisão com significado imediato (\"entrego em 45 min\"), então\n// salva sozinha, com debounce, e a tela diz \"salvando…\" em vez de pedir que\n// alguém lembre no que tocou.\n//\n// Onde mora: `tenants.settings`, pelas RPCs do spine (`tenant_settings` para\n// ler tudo de uma vez, `tenant_setting_set` para gravar chave a chave). A\n// função recusa chave não registrada — ver a migration 041 — e cobra\n// `settings.manage`, então o garçom não muda a taxa.\n\nconst DEBOUNCE_MS = 400\nconst PREFIX = 'delivery.'\n\nexport interface DeliverySettings {\n enabled?: boolean\n fee?: number\n freeOver?: number | null\n minOrder?: number\n etaMinutes?: number\n radiusKm?: number\n}\n\n/** Chave no banco ⇄ campo na tela. Uma tabela, para os dois sentidos. */\nconst KEYS: Record<keyof DeliverySettings, string> = {\n enabled: 'delivery.enabled',\n fee: 'delivery.fee',\n freeOver: 'delivery.free_over',\n minOrder: 'delivery.min_order',\n etaMinutes: 'delivery.eta_minutes',\n radiusKm: 'delivery.radius_km',\n}\n\nexport interface DeliverySettingsHandle {\n value: DeliverySettings\n set: (patch: DeliverySettings) => void\n loading: boolean\n saving: boolean\n /** A gravação foi recusada. O valor otimista continua na tela. */\n error: string | null\n /** A LEITURA falhou: o que está na tela são padrões, não as escolhas da casa. */\n loadError: string | null\n /** Sem backend montado (mock/standalone): a tela diz isso em vez de fingir. */\n supported: boolean\n}\n\nfunction message(e: unknown): string {\n if (e instanceof Error) return e.message\n if (typeof e === 'object' && e && 'message' in e) return String((e as { message: unknown }).message)\n return String(e)\n}\n\nexport function useDeliverySettings(defaults: DeliverySettings = {}): DeliverySettingsHandle {\n const client = React.useMemo(() => getSupabaseClientOptional() as any, [])\n const supported = !!client\n\n const [stored, setStored] = React.useState<DeliverySettings>({})\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!client) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void client\n .rpc('tenant_settings')\n .then(({ data, error: e }: { data: Record<string, unknown> | null; error: unknown }) => {\n if (cancelled) return\n if (e) { setLoadError(message(e)); return }\n const flat = (data ?? {}) as Record<string, unknown>\n const next: DeliverySettings = {}\n for (const [field, key] of Object.entries(KEYS)) {\n // Só o que a casa DECIDIU. Uma chave ausente continua indefinida, e é\n // o `defaults` da tela que responde por ela — gravar o padrão de volta\n // transformaria \"não decidi\" em \"escolhi isto\".\n if (key in flat && flat[key] !== null) (next as any)[field] = flat[key]\n else if (key in flat && flat[key] === null) (next as any)[field] = null\n }\n setStored(next)\n })\n .catch((e: unknown) => { if (!cancelled) setLoadError(message(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [client])\n\n // O patch acumula durante a janela do debounce: três cliques viram uma\n // rodada de gravações, não três corridas para ver quem grava por último.\n const pendingRef = React.useRef<DeliverySettings>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback((patch: DeliverySettings) => {\n setStored((current) => ({ ...current, ...patch }))\n if (!client) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void Promise.all(\n Object.entries(payload).map(([field, value]) =>\n client.rpc('tenant_setting_set', { p_key: KEYS[field as keyof DeliverySettings], p_value: value ?? null })\n .then(({ error: e }: { error: unknown }) => { if (e) throw e }),\n ),\n )\n .catch((e: unknown) => setError(message(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n }, [client])\n\n const value = React.useMemo(() => ({ ...defaults, ...stored }), [defaults, stored])\n\n return { value, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport {\n SettingsGroup, ToggleRow, TextRow,\n useConnectors, ConnectorRow, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\nimport { useDeliverySettings, type DeliverySettings as DeliveryValues } from './useDeliverySettings'\n\n/**\n * Entrega — o que a casa cobra para levar, e quem traz o pedido.\n *\n * Duas coisas na tela, e a distinção é o assunto (a mesma do \"Pagamentos\" da\n * loja, e por isso a mesma forma):\n *\n * • A POLÍTICA é da casa e muda com a estação: taxa, mínimo, tempo, raio.\n * Mora em `tenants.settings` (migration 041) e salva sozinha.\n *\n * • QUEM TRAZ O PEDIDO é uma conexão. iFood, 99Food, Keeta, Uber Eats já são\n * conectores declarados por este plugin; a tela FILTRA o hub por\n * `category === 'marketplace'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * Entrega própria é legítima sem conector nenhum — a moto é do restaurante —\n * então nada aqui exige uma conexão para a política valer.\n */\nconst MARKETPLACE_CATEGORIES = ['marketplace']\n\n/** Aceita \"12,90\" e \"12.90\"; devolve `null` para vazio. */\nfunction parseAmount(text: string): number | null {\n const clean = text.replace(/\\s/g, '').replace(',', '.')\n if (!clean) return null\n const n = Number(clean)\n return Number.isFinite(n) && n >= 0 ? n : NaN\n}\n\nfunction amountText(value: number | null | undefined): string {\n if (value === null || value === undefined) return ''\n return String(value).replace('.', ',')\n}\n\n/** Uma linha de dinheiro/número: texto local no input, número no banco. */\nfunction AmountRow({ label, description, hint, value, onCommit }: {\n label: string\n description?: string\n hint?: string\n value: number | null | undefined\n onCommit: (next: number | null) => void\n}) {\n const [text, setText] = React.useState(() => amountText(value))\n const [invalid, setInvalid] = React.useState(false)\n // O valor do servidor ganha quando muda por fora (carregou, ou outra aba).\n React.useEffect(() => { setText(amountText(value)) }, [value])\n\n return (\n <TextRow\n label={label}\n description={description}\n value={text}\n onChange={(next) => { setText(next); setInvalid(false) }}\n // Só no blur/Enter: salvar por tecla gravaria '1' e '19' no caminho para\n // '19,90', e cada um deles é uma taxa que a casa cobrou de verdade.\n onBlurCommit={() => {\n const parsed = parseAmount(text)\n if (Number.isNaN(parsed)) { setInvalid(true); return }\n setInvalid(false)\n onCommit(parsed)\n }}\n hint={invalid ? 'Use um número, como 9,90.' : hint}\n invalid={invalid}\n placeholder=\"0,00\"\n />\n )\n}\n\nexport function DeliverySettings() {\n const settings = useDeliverySettings({ enabled: true, fee: 0, minOrder: 0, etaMinutes: 45, radiusKm: 0 })\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'orders', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback((connector: UnifiedConnector) => {\n // Mesma regra do hub: a gaveta do assistente é dona da jornada quando está\n // montada, e a folha é o fallback para o fluxo nunca ficar sem saída.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n }, [panelAvailable])\n\n const marketplaces = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && MARKETPLACE_CATEGORIES.includes(c.category)),\n [connectors],\n )\n\n const patch = (next: DeliveryValues) => set(next)\n\n if (!settings.supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda a configuração de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n Não há backend montado aqui, então nada abaixo seria salvo — e por isso não é mostrado.\n </p>\n </div>\n )\n }\n\n if (settings.loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {settings.loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar a configuração de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria o que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{settings.loadError}</p>\n </div>\n )}\n\n <SettingsGroup\n title=\"Entrega\"\n description=\"Vale para o pedido que sai da casa. O quadro de despacho continua existindo com a entrega desligada — o histórico não some.\"\n >\n <ToggleRow\n label=\"A casa entrega\"\n description=\"Desligado, nenhum canal novo nasce como entrega.\"\n checked={value.enabled !== false}\n onChange={(checked) => patch({ enabled: checked })}\n />\n <AmountRow\n label=\"Taxa de entrega\"\n description=\"Cobrada por pedido, na moeda da casa.\"\n hint=\"Zero = entrega sem taxa.\"\n value={value.fee}\n onCommit={(next) => patch({ fee: next ?? 0 })}\n />\n <AmountRow\n label=\"Frete grátis acima de\"\n description=\"Acima deste valor de pedido a taxa é zerada.\"\n hint=\"Vazio = a taxa vale sempre.\"\n value={value.freeOver}\n onCommit={(next) => patch({ freeOver: next })}\n />\n <AmountRow\n label=\"Pedido mínimo\"\n description=\"Abaixo disso a casa não entrega.\"\n hint=\"Zero = sem mínimo.\"\n value={value.minOrder}\n onCommit={(next) => patch({ minOrder: next ?? 0 })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Até onde, e em quanto tempo\"\n description=\"O que o cliente ouve quando pergunta — e o que o despacho promete.\"\n >\n <AmountRow\n label=\"Tempo estimado (min)\"\n description=\"Da confirmação até a porta.\"\n value={value.etaMinutes}\n onCommit={(next) => patch({ etaMinutes: next === null ? 0 : Math.round(next) })}\n />\n <AmountRow\n label=\"Raio de entrega (km)\"\n description=\"Distância máxima a partir da casa.\"\n hint=\"Zero = sem limite declarado.\"\n value={value.radiusKm}\n onCommit={(next) => patch({ radiusKm: next ?? 0 })}\n />\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem traz o pedido</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Marketplaces conectados entram no quadro sozinhos, cada pedido marcado com a origem.\n A credencial vai para o cofre, nunca para o banco da casa.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n {marketplaces.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum marketplace disponível para este app ainda. A entrega própria funciona sem nenhum.\n </p>\n ) : (\n <ul className=\"divide-y\">\n {marketplaces.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {settings.error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {settings.error}\n </span>\n ) : settings.saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n categories={MARKETPLACE_CATEGORIES}\n onSelect={(connector) => { setAdding(false); openJourney(connector) }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateOrderInput,\n CreateOrderItemInput,\n OrderKind,\n OrderQuery,\n OrdersSummary,\n OrderStatus,\n PaginatedResult,\n RestaurantOrder,\n RestaurantOrderItem,\n UpdateOrderStatusInput,\n} from '../types'\nimport type { OrdersDataProvider } from './types'\n\nexport interface FayzOrdersProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n ordersTable?: string\n orderItemsTable?: string\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * canonical orders and items tables. When omitted, scoping is left to\n * the runtime/RLS context.\n */\n tenantId?: string | (() => string | undefined | null)\n /** Active unit id stamped on new orders and their items when available. */\n unitId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: string | null\n party_id?: string | null\n party_name?: string | null\n assignee_id?: string | null\n assignee_name?: string | null\n location_id?: string | null\n subtotal?: number | string | null\n discount?: number | string | null\n tax?: number | string | null\n total?: number | string | null\n currency?: string | null\n notes?: string | null\n tags?: string[] | null\n source?: string | null\n table_id?: string | null\n table_name?: string | null\n estimated_minutes?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n completed_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n order_id?: string | null\n product_id?: string | null\n name?: string | null\n description?: string | null\n quantity?: number | string | null\n unit_price?: number | string | null\n discount?: number | string | null\n total?: number | string | null\n sort_order?: number | null\n modifiers?: string | null\n kitchen_notes?: string | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n}\n\nconst DEFAULT_ORDERS_TABLE = 'orders'\nconst DEFAULT_ORDER_ITEMS_TABLE = 'items'\nconst ORDERS_METADATA_KEY = 'fayzOrders'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\nconst RESTAURANT_STATUSES = new Set<OrderStatus>([\n 'new',\n 'confirmed',\n 'preparing',\n 'ready',\n 'served',\n 'picked_up',\n 'dispatched',\n 'delivered',\n 'completed',\n 'cancelled',\n])\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction dateKey(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction referenceNumber(): string {\n return `ORD-${Date.now().toString().slice(-6)}`\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nfunction canonicalStatus(status: OrderStatus): 'draft' | 'confirmed' | 'completed' | 'cancelled' {\n if (status === 'new') return 'draft'\n if (status === 'completed' || status === 'cancelled') return status\n return 'confirmed'\n}\n\nfunction restaurantStatus(rowStatus: string | null | undefined, metadata: Record<string, unknown>): OrderStatus {\n // Terminal base states are authoritative even if a legacy/external writer\n // changed the spine without updating the restaurant metadata atomically.\n if (rowStatus === 'completed' || rowStatus === 'cancelled') return rowStatus\n const stored = metadata.restaurantStatus\n if (typeof stored === 'string' && RESTAURANT_STATUSES.has(stored as OrderStatus)) return stored as OrderStatus\n if (rowStatus === 'draft') return 'new'\n if (typeof rowStatus === 'string' && RESTAURANT_STATUSES.has(rowStatus as OrderStatus)) return rowStatus as OrderStatus\n return 'confirmed'\n}\n\nfunction ordersMetadata(metadata: Record<string, unknown> | null | undefined): Record<string, unknown> {\n return objectValue(metadata?.[ORDERS_METADATA_KEY])\n}\n\nfunction mergeOrdersMetadata(\n metadata: Record<string, unknown> | null | undefined,\n patch: Record<string, unknown>,\n): Record<string, unknown> {\n const base = { ...(metadata ?? {}) }\n const current = ordersMetadata(base)\n const definedPatch = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n )\n const next = { ...current, ...definedPatch }\n return { ...base, [ORDERS_METADATA_KEY]: next }\n}\n\nfunction itemToRow(\n item: CreateOrderItemInput,\n orderId: string,\n sortOrder: number,\n tenantId?: string,\n unitId?: string,\n): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\n order_id: orderId,\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n metadata: mergeOrdersMetadata(undefined, {\n modifiers: item.modifiers ?? null,\n kitchenNotes: item.kitchenNotes ?? null,\n }),\n }\n}\n\nfunction rowToItem(row: OrderItemRow): RestaurantOrderItem {\n const quantity = numberValue(row.quantity)\n const unitPrice = numberValue(row.unit_price)\n const discount = numberValue(row.discount)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n orderId: row.order_id ?? '',\n productId: row.product_id ?? undefined,\n name: row.name ?? 'Item',\n description: row.description ?? undefined,\n quantity,\n unitPrice,\n discount,\n total: numberValue(row.total) || quantity * unitPrice - discount,\n sortOrder: row.sort_order ?? 0,\n modifiers: row.modifiers ?? (typeof restaurant.modifiers === 'string' ? restaurant.modifiers : undefined),\n kitchenNotes: row.kitchen_notes ?? (typeof restaurant.kitchenNotes === 'string' ? restaurant.kitchenNotes : undefined),\n metadata: row.metadata ?? {},\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrder(row: OrderRow, items: RestaurantOrderItem[] = []): RestaurantOrder {\n const subtotal = numberValue(row.subtotal) || items.reduce((sum, item) => sum + item.total, 0)\n const discount = numberValue(row.discount)\n const tax = numberValue(row.tax)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: restaurantStatus(row.status, restaurant),\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? (typeof restaurant.partyName === 'string' ? restaurant.partyName : undefined),\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? (typeof restaurant.assigneeName === 'string' ? restaurant.assigneeName : undefined),\n locationId: row.location_id ?? undefined,\n subtotal,\n discount,\n tax,\n total: numberValue(row.total) || subtotal - discount + tax,\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: row.tags ?? [],\n source: row.source ?? (typeof restaurant.source === 'string' ? restaurant.source : 'pos'),\n tableId: row.table_id ?? (typeof restaurant.tableId === 'string' ? restaurant.tableId : undefined),\n tableName: row.table_name ?? (typeof restaurant.tableName === 'string' ? restaurant.tableName : undefined),\n estimatedMinutes: row.estimated_minutes\n ?? (typeof restaurant.estimatedMinutes === 'number' ? restaurant.estimatedMinutes : undefined),\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n unitId: row.unit_id ?? undefined,\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction orderPayload(input: CreateOrderInput): Record<string, unknown> {\n const subtotal = input.items.reduce((sum, item) => sum + item.quantity * item.unitPrice - (item.discount ?? 0), 0)\n return {\n reference_number: referenceNumber(),\n kind: input.kind,\n status: 'draft',\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n metadata: mergeOrdersMetadata(undefined, {\n source: input.source ?? 'pos',\n tableId: input.tableId ?? null,\n estimatedMinutes: input.estimatedMinutes ?? null,\n restaurantStatus: 'new',\n }),\n }\n}\n\nfunction updatePayload(\n data: Partial<RestaurantOrder>,\n existingMetadata?: Record<string, unknown>,\n): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.referenceNumber !== undefined) payload.reference_number = data.referenceNumber\n if (data.kind !== undefined) payload.kind = data.kind\n if (data.status !== undefined) payload.status = canonicalStatus(data.status)\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.locationId !== undefined) payload.location_id = data.locationId\n if (data.subtotal !== undefined) payload.subtotal = data.subtotal\n if (data.discount !== undefined) payload.discount = data.discount\n if (data.tax !== undefined) payload.tax = data.tax\n if (data.total !== undefined) payload.total = data.total\n if (data.currency !== undefined) payload.currency = data.currency\n if (data.notes !== undefined) payload.notes = data.notes\n if (data.tags !== undefined) payload.tags = data.tags\n const metadataBase = data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata\n const metadataPatch = {\n partyName: data.partyName,\n assigneeName: data.assigneeName,\n source: data.source,\n tableId: data.tableId,\n tableName: data.tableName,\n estimatedMinutes: data.estimatedMinutes,\n restaurantStatus: data.status,\n }\n if (data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)) {\n payload.metadata = mergeOrdersMetadata(metadataBase, metadataPatch)\n }\n if (data.completedAt !== undefined) payload.completed_at = data.completedAt\n return payload\n}\n\nfunction filtersFromQuery(query: OrderQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = []\n if (query.kind && !Array.isArray(query.kind)) filters.push({ column: 'kind', operator: 'eq', value: query.kind })\n if (query.assigneeId) filters.push({ column: 'assignee_id', operator: 'eq', value: query.assigneeId })\n return filters\n}\n\nfunction matchesClientQuery(order: RestaurantOrder, query: OrderQuery): boolean {\n if (Array.isArray(query.kind) && !query.kind.includes(order.kind)) return false\n if (Array.isArray(query.status) && !query.status.includes(order.status)) return false\n if (query.status && !Array.isArray(query.status) && order.status !== query.status) return false\n if (query.source && order.source !== query.source) return false\n if (query.tableId && order.tableId !== query.tableId) return false\n if (query.assigneeId && order.assigneeId !== query.assigneeId) return false\n if (query.dateRange) {\n const created = dateKey(order.createdAt)\n if (created < query.dateRange.from || created > query.dateRange.to) return false\n }\n if (query.search) {\n const search = query.search.toLowerCase()\n return order.referenceNumber.toLowerCase().includes(search)\n || (order.partyName?.toLowerCase().includes(search) ?? false)\n || (order.tableName?.toLowerCase().includes(search) ?? false)\n || order.items.some((item) => item.name.toLowerCase().includes(search))\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 20\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nfunction summarize(orders: RestaurantOrder[], dateRange?: { from: string; to: string }): OrdersSummary {\n const today = dateKey(nowIso())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n const inRange = orders.filter((order) => {\n const created = dateKey(order.createdAt)\n return created >= from && created <= to\n })\n const billable = inRange.filter((order) => order.status !== 'cancelled')\n const revenue = billable.reduce((sum, order) => sum + order.total, 0)\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n const top = new Map<string, { name: string; quantity: number; revenue: number }>()\n\n for (const order of inRange) {\n ordersByKind[order.kind] = (ordersByKind[order.kind] ?? 0) + 1\n ordersByStatus[order.status] = (ordersByStatus[order.status] ?? 0) + 1\n if (order.status === 'cancelled') continue\n for (const item of order.items) {\n const current = top.get(item.name) ?? { name: item.name, quantity: 0, revenue: 0 }\n current.quantity += item.quantity\n current.revenue += item.total\n top.set(item.name, current)\n }\n }\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: billable.length > 0 ? revenue / billable.length : 0,\n activeOrderCount: orders.filter((order) => ACTIVE_STATUSES.has(order.status)).length,\n ordersByKind,\n ordersByStatus,\n topItems: [...top.values()].sort((a, b) => b.quantity - a.quantity).slice(0, 5),\n }\n}\n\nexport function createFayzOrdersProvider(options: FayzOrdersProviderOptions = {}): OrdersDataProvider {\n const client = createFayzClient(options)\n const ordersTable = options.ordersTable ?? DEFAULT_ORDERS_TABLE\n const orderItemsTable = options.orderItemsTable ?? DEFAULT_ORDER_ITEMS_TABLE\n const tableOptions = { projectId: options.projectId, schema: options.schema, runtime: options.runtime }\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 resolveUnit(): string | undefined {\n const value = typeof options.unitId === 'function' ? options.unitId() : options.unitId\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 listItemRows(orderIds: string[]): Promise<OrderItemRow[]> {\n if (orderIds.length === 0) return []\n const rows: OrderItemRow[] = []\n await Promise.all(orderIds.map(async (orderId) => {\n const response = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'order_id', operator: 'eq', value: orderId }],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 200,\n })\n rows.push(...response.rows)\n }))\n return rows\n }\n\n async function hydrate(rows: OrderRow[]): Promise<RestaurantOrder[]> {\n const itemRows = await listItemRows(rows.map((row) => row.id))\n const byOrder = new Map<string, RestaurantOrderItem[]>()\n for (const itemRow of itemRows) {\n const item = rowToItem(itemRow)\n const list = byOrder.get(item.orderId) ?? []\n list.push(item)\n byOrder.set(item.orderId, list)\n }\n return rows.map((row) => rowToOrder(row, byOrder.get(row.id) ?? []))\n }\n\n async function listOrders(query: OrderQuery = {}): Promise<RestaurantOrder[]> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'created_at',\n sortDirection: 'desc',\n limit: 500,\n })\n return (await hydrate(response.rows)).filter((order) => matchesClientQuery(order, query))\n }\n\n async function getById(id: string): Promise<RestaurantOrder | null> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return (await hydrate(response.rows))[0] ?? null\n }\n\n return {\n async getOrders(query) {\n const orders = await listOrders(query)\n return paginate(orders, query.page, query.pageSize)\n },\n\n async getOrderById(id) {\n return getById(id)\n },\n\n async createOrder(input) {\n const tenantId = resolveTenant()\n const unitId = resolveUnit()\n const orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: {\n ...orderPayload(input),\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n },\n })\n await Promise.all(input.items.map((item, index) => client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderRow.id, index, tenantId, unitId),\n })))\n return (await getById(orderRow.id)) ?? rowToOrder(orderRow)\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput) {\n const completedAt = input.status === 'completed' ? nowIso() : undefined\n return this.updateOrder(input.orderId, { status: input.status, completedAt })\n },\n\n async updateOrder(id, data) {\n const existing = await getById(id)\n const row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data, existing?.metadata),\n })\n return (await getById(row.id)) ?? rowToOrder(row)\n },\n\n async cancelOrder(id, reason) {\n const order = await getById(id)\n await this.updateOrder(id, {\n status: 'cancelled',\n notes: reason ? `${order?.notes ? `${order.notes}\\n` : ''}Cancelled: ${reason}` : order?.notes,\n })\n },\n\n async addOrderItem(orderId, item) {\n const order = await getById(orderId)\n const row = await client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderId, order?.items.length ?? 0, order?.tenantId, order?.unitId ?? resolveUnit()),\n })\n const created = rowToItem(row)\n const items = [...(order?.items ?? []), created]\n await this.updateOrder(orderId, {\n subtotal: items.reduce((sum, orderItem) => sum + orderItem.total, 0),\n total: items.reduce((sum, orderItem) => sum + orderItem.total, 0) - (order?.discount ?? 0) + (order?.tax ?? 0),\n })\n return created\n },\n\n async removeOrderItem(itemId) {\n const orders = await listOrders()\n const order = orders.find((item) => item.items.some((orderItem) => orderItem.id === itemId))\n await client.data.deleteRows({ ...tableOptions, table: orderItemsTable, rows: [{ id: itemId }] })\n if (order) {\n const items = order.items.filter((item) => item.id !== itemId)\n const subtotal = items.reduce((sum, item) => sum + item.total, 0)\n await this.updateOrder(order.id, { subtotal, total: subtotal - order.discount + order.tax })\n }\n },\n\n async updateOrderItem(itemId, data) {\n const existingResult = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'id', operator: 'eq', value: itemId }],\n limit: 1,\n })\n const existingMetadata = existingResult.rows[0]?.metadata ?? undefined\n const metadataPatch = {\n modifiers: data.modifiers,\n kitchenNotes: data.kitchenNotes,\n }\n const row = await client.data.updateRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n primaryKeys: { id: itemId },\n row: {\n product_id: data.productId,\n name: data.name,\n description: data.description,\n quantity: data.quantity,\n unit_price: data.unitPrice,\n discount: data.discount,\n total: data.total,\n sort_order: data.sortOrder,\n metadata: data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)\n ? mergeOrdersMetadata(\n data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata,\n metadataPatch,\n )\n : undefined,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n // Replaying the current status is a no-op at the data boundary. The\n // store uses it to retry an idempotent downstream synchronization\n // without emitting the lifecycle event a second time.\n if (targetIdx < 0 || (targetIdx !== currentIdx && targetIdx !== currentIdx + 1)) {\n const next = getNextStatus(order.kind, order.status)\n throw new Error(\n `Invalid status transition: ${order.status} → ${input.status}. ` +\n (next ? `Expected next status: ${next}` : 'Order is already in a terminal state.')\n )\n }\n }\n\n order.status = input.status\n order.updatedAt = new Date().toISOString()\n\n if (input.status === 'completed') {\n order.completedAt = order.updatedAt\n }\n\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrder\n // ------------------------------------------------------------------\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n const { id: _id, items: _items, tenantId: _t, createdAt: _c, ...safe } = data\n Object.assign(order, safe)\n order.updatedAt = new Date().toISOString()\n return order\n },\n\n // ------------------------------------------------------------------\n // cancelOrder\n // ------------------------------------------------------------------\n async cancelOrder(id: string, reason?: string): Promise<void> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n order.status = 'cancelled'\n order.updatedAt = new Date().toISOString()\n if (reason) {\n order.notes = order.notes ? `${order.notes}\\nCancelled: ${reason}` : `Cancelled: ${reason}`\n }\n },\n\n // ------------------------------------------------------------------\n // addOrderItem\n // ------------------------------------------------------------------\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n const order = findOrder(orderId)\n if (!order) throw new Error(`Order not found: ${orderId}`)\n\n const newItem: RestaurantOrderItem = {\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: order.items.length,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }\n\n order.items.push(newItem)\n recomputeTotals(order)\n order.updatedAt = new Date().toISOString()\n return newItem\n },\n\n // ------------------------------------------------------------------\n // removeOrderItem\n // ------------------------------------------------------------------\n async removeOrderItem(itemId: string): Promise<void> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n found.order.items.splice(found.index, 1)\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n },\n\n // ------------------------------------------------------------------\n // updateOrderItem\n // ------------------------------------------------------------------\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n const { id: _id, orderId: _oid, createdAt: _c, ...safe } = data\n Object.assign(found.item, safe)\n\n // Recompute item total if quantity or price changed\n found.item.total = found.item.quantity * found.item.unitPrice - found.item.discount\n\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n return found.item\n },\n\n // ------------------------------------------------------------------\n // getSummary\n // ------------------------------------------------------------------\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const today = toDateStr(new Date())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n\n const inRange = orders.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n\n const completed = inRange.filter(o => o.status !== 'cancelled')\n const revenue = completed.reduce((sum, o) => sum + o.total, 0)\n\n const activeStatuses = new Set(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n const active = orders.filter(o => activeStatuses.has(o.status))\n\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n\n for (const o of inRange) {\n ordersByKind[o.kind] = (ordersByKind[o.kind] || 0) + 1\n ordersByStatus[o.status] = (ordersByStatus[o.status] || 0) + 1\n }\n\n // Top items\n const itemMap = new Map<string, { name: string; quantity: number; revenue: number }>()\n for (const o of completed) {\n for (const item of o.items) {\n const existing = itemMap.get(item.name)\n if (existing) {\n existing.quantity += item.quantity\n existing.revenue += item.total\n } else {\n itemMap.set(item.name, { name: item.name, quantity: item.quantity, revenue: item.total })\n }\n }\n }\n const topItems = Array.from(itemMap.values())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, 5)\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: completed.length > 0 ? revenue / completed.length : 0,\n activeOrderCount: active.length,\n ordersByKind,\n ordersByStatus,\n topItems,\n }\n },\n }\n\n return provider\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createCoreOrdersProvider } from './data/core-supabase'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { uberEatsConnectorDef } from './integrations/ubereats/connectorDef'\nimport { rappiConnectorDef } from './integrations/rappi/connectorDef'\nimport { aiqfomeConnectorDef } from './integrations/aiqfome/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { DeliverySettings } from './settings/DeliverySettings'\nimport type { ResolvedOrdersConfig } from './context'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\nconst OrderDetailRoute = React.lazy(() => import('./views/OrderDetailRoute').then((m) => ({ default: m.OrderDetailRoute })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n onOrderCancelled?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n /** @deprecated One screen serves every account now; the value is ignored. */\n variant?: 'restaurant' | 'commercial'\n /**\n * Where \"create order\" goes, and whether the list offers it at all.\n *\n * This plugin shipped a board and no way to put anything on it — its own\n * `declaredLimits` note says order creation \"flows only through the\n * store/AI-tool with no dedicated UI create handler\". The restaurant app\n * worked around that with a rail entry called \"Nova comanda\", which put the\n * act of opening an order in the navigation instead of on the screen that\n * lists them, two clicks from the board it belongs to.\n *\n * The screen still belongs to the host — a comanda asks for a table and a\n * service mode, an e-commerce order asks for a customer and an address, and\n * neither belongs in this plugin. What belongs here is the BUTTON, in the\n * place every other list in the product keeps it.\n *\n * Unset means no button, which stays right for a variant whose orders arrive\n * from a storefront rather than from someone standing at a counter.\n */\n createRoute?: string\n /**\n * Where this product keeps the full order page, given an id (e.g.\n * `(id) => `/orders/${id}``). The rail's \"Ver pedido completo\" appears only\n * when a host supplies one — a product with no dedicated page should not grow\n * a link to nowhere.\n */\n orderRoute?: (orderId: string) => string\n /**\n * Where this product keeps the EDIT screen, given an id.\n *\n * Unset hides the \"Editar pedido\" button — which is the right answer for a\n * product whose orders arrive already closed, and the previous answer for\n * every product, since the route existed nowhere.\n */\n editRoute?: (orderId: string) => string\n /**\n * Whether THIS order may still be edited.\n *\n * The archetype's own answer (`orderIsEditable`: only `open` and `new`) is\n * the default, and it is deliberately conservative. The rule is the product's\n * because the products genuinely disagree: a shop draft stops being editable\n * the moment it is paid or shipped, while a comanda keeps taking items until\n * the table asks for the bill.\n */\n canEditOrder?: (order: { status?: string }) => boolean\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: OrdersPluginOptions) {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n onOrderCancelled: options?.onOrderCancelled,\n createRoute: options?.createRoute,\n editRoute: options?.editRoute,\n canEditOrder: options?.canEditOrder,\n orderRoute: options?.orderRoute,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Reads the account's real orders unless the app brings its own provider.\n // Read-only by default: status changes go through `@fayz-ai/core/orders`.\n const provider = options?.dataProvider ?? createCoreOrdersProvider()\n const store = createOrdersStore(provider, {\n onOrderCompleted: config.onOrderCompleted,\n onOrderCancelled: config.onOrderCancelled,\n })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries }))\n\n // `:id` arrives as a prop — AdminShell spreads the matched route params.\n const DetailComponent: React.FC<any> = ({ id }: { id?: string }) =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrderDetailRoute, {\n id,\n options: { editRoute: options?.editRoute, canEditOrder: options?.canEditOrder },\n }))\n\n return {\n id: 'orders',\n // Como esta conta refaz o módulo com as opções DELA. Ver PluginRebuild:\n // a fábrica roda no carregamento do aplicativo, muito antes de a\n // configuração da conta existir, e sem isto `app.tenant_plugins.config`\n // não tinha como chegar aqui. A fusão é RASA e por bloco — a conta troca\n // `modules` inteiro ou não o troca —, que é o mesmo contrato que a chamada\n // do aplicativo já tem.\n rebuild: (tenantConfig) =>\n createOrdersPlugin({ ...options, ...(tenantConfig as OrdersPluginOptions) }),\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n // No `menu`: a sale is not a restaurant's, and a dependency lights up by\n // drag — every account with Orders would grow a Cardápio line.\n dependencies: [],\n events: [\n {\n name: 'orders.order_completed',\n title: 'Order completed',\n trigger: 'When an order reaches the completed status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n {\n name: 'orders.order_cancelled',\n title: 'Order cancelled',\n trigger: 'When an order reaches the cancelled status.',\n payloadSchema: {\n type: 'object',\n properties: {\n order_id: { type: 'string' },\n reference_number: { type: 'string' },\n total: { type: 'number' },\n item_count: { type: 'number' },\n source: { type: 'string' },\n },\n required: ['order_id', 'reference_number', 'total', 'item_count', 'source'],\n },\n },\n ],\n // Orders/month quota. NOTE: order creation currently flows only through the\n // store/AI-tool (createOrder) with no dedicated UI create handler, so no\n // client-side guard is wired yet — the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'ClipboardList',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n {\n path: '/orders/:id',\n component: DetailComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'How many orders today?' },\n { label: \"What's the average ticket today?\" },\n { label: \"What's the most ordered item?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'What orders are being prepared right now?' },\n { label: 'Any delivery orders waiting?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n ],\n registries: ordersRegistries,\n settings: [\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n // Entrega — política da casa (taxa, mínimo, tempo, raio) e os\n // marketplaces que trazem o pedido. Só existe onde o delivery existe: um\n // app sem `modules.delivery` não ganha uma tela para configurar um\n // serviço que não presta.\n ...(config.modules.delivery\n ? [{\n id: 'orders-delivery',\n label: 'Delivery',\n icon: 'Bike',\n component: (() => {\n const DeliverySettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(DeliverySettings))\n DeliverySettingsTab.displayName = 'DeliverySettingsTab'\n return DeliverySettingsTab\n })(),\n order: 23,\n // Quanto a casa cobra para entregar é decisão do dono, não de quem\n // despacha: mesma régua da taxa de serviço em plugin-tables.\n permission: { feature: 'orders', action: 'edit' as const },\n }]\n : []),\n ],\n locales: ordersLocales,\n // Offered regardless of `modules.delivery` — a takeout-only house still takes\n // iFood retirada orders. Control plane only: src/integrations/DELIVERY-MARKETPLACES.md.\n connectors: [\n ifoodConnectorDef,\n nineNineFoodConnectorDef,\n keetaConnectorDef,\n uberEatsConnectorDef,\n rappiConnectorDef,\n aiqfomeConnectorDef,\n ],\n }\n}\n\nexport * from './integrations'\n\n// The plugin's own vocabulary. Without this the `dataProvider` seam is\n// unimplementable from outside the package: `OrdersDataProvider` is exported\n// but every type in its signature was not, so an app could name the interface\n// and never satisfy it. plugin-menu has always exported its types; this is\n// plugin-orders catching up.\nexport * from './types'\n\nexport type { OrdersDataProvider } from './data/types'\nexport type { RestaurantOrder, RestaurantOrderItem } from './types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\n// The pool-direct provider: reads v_orders under RLS instead of proxying\n// through the platform's data API. `writes` makes it the flow's owner.\nexport { createCoreOrdersProvider } from './data/core-supabase'\nexport type { CoreOrdersProviderOptions, CoreOrdersWriteOptions } from './data/core-supabase'\nexport type { ResolvedOrdersConfig } from './context'\nexport { createMockOrdersProvider } from './data/mock'\nexport { ORDER_DETAIL_COMPONENT_ID } from './lib/detail-slot'\nexport type { OrderDetailSlotProps } from './lib/detail-slot'\n"]}