@fayz-ai/plugin-orders 0.14.3 → 0.15.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.
Files changed (36) hide show
  1. package/README.md +1 -0
  2. package/dist/{OrderDetailRoute-LTPDQXQU.js → OrderDetailRoute-QGZIMEQ3.js} +9 -7
  3. package/dist/OrderDetailRoute-QGZIMEQ3.js.map +1 -0
  4. package/dist/{OrdersPage-5326V62H.js → OrdersPage-3KNCFC7K.js} +3 -3
  5. package/dist/OrdersPage-3KNCFC7K.js.map +1 -0
  6. package/dist/context.d.ts +9 -6
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/index.d.ts +20 -45
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +61 -1425
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/list-query.d.ts +1 -1
  13. package/dist/lib/list-query.d.ts.map +1 -1
  14. package/dist/settings/DeliverySettings.d.ts.map +1 -1
  15. package/dist/settings/v1-settings.d.ts +2 -0
  16. package/dist/settings/v1-settings.d.ts.map +1 -0
  17. package/dist/views/OrderReceivableActions.d.ts.map +1 -1
  18. package/dist/views/OrdersPage.d.ts +2 -2
  19. package/dist/views/OrdersPage.d.ts.map +1 -1
  20. package/package.json +8 -9
  21. package/dist/OrderDetailRoute-LTPDQXQU.js.map +0 -1
  22. package/dist/OrdersPage-5326V62H.js.map +0 -1
  23. package/dist/data/core-supabase.d.ts +0 -26
  24. package/dist/data/core-supabase.d.ts.map +0 -1
  25. package/dist/data/mock.d.ts +0 -3
  26. package/dist/data/mock.d.ts.map +0 -1
  27. package/dist/data/platform.d.ts +0 -19
  28. package/dist/data/platform.d.ts.map +0 -1
  29. package/dist/data/types.d.ts +0 -17
  30. package/dist/data/types.d.ts.map +0 -1
  31. package/dist/integrations/index.d.ts +0 -8
  32. package/dist/integrations/index.d.ts.map +0 -1
  33. package/dist/store.d.ts +0 -33
  34. package/dist/store.d.ts.map +0 -1
  35. package/dist/types.d.ts +0 -145
  36. package/dist/types.d.ts.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/core-supabase.ts","../src/types.ts","../src/store.ts","../src/data/registries.ts","../src/migrations/index.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","// AUTO-GENERATED from 001_an_order_arrives_from_a_marketplace.sql, 002_delivered_in_each_kinds_words.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_001_AN_ORDER_ARRIVES_FROM_A_MARKETPLACE = `-- ============================================================================\n-- 001 — an order arrives from a marketplace\n--\n-- The V2 sink of ADR 0003: the ONE door through which the integration service\n-- hands a canonical delivery order to this product, and the two beside it to\n-- apply a later status and to read the current one. No rule lives in the\n-- service; what an order IS here is decided here, in one transaction.\n--\n-- There is no person behind these calls — the actor is the service, acting\n-- for the tenant it names, which is why \\`p_tenant\\` is explicit and no\n-- \\`app.has_permission\\` is asked (the same reasoning as service_authorize_for).\n-- The functions are therefore closed to every signed-in user and opened only\n-- to the service's own role, \\`fayz_integration\\`, when that role exists on the\n-- cluster. Creating the role is an operator step; the grant below is guarded.\n--\n-- The order shape is @fayz-ai/contracts' CanonicalOrder v1: money in\n-- centavos, items with options, totals that close. Everything that this\n-- product has no column for travels in orders.metadata.external, so nothing\n-- the marketplace said is lost.\n-- ============================================================================\n\nCREATE OR REPLACE FUNCTION public.orders_ingest_external(\n p_tenant uuid,\n p_unit uuid,\n p_order jsonb,\n p_status text\n) RETURNS uuid\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_provider text := p_order ->> 'provider';\n v_external text := p_order ->> 'externalId';\n v_ref text;\n v_kind text;\n v_channel text;\n v_order uuid;\n v_item jsonb;\n v_n integer := 0;\n v_qty numeric;\n v_unit numeric;\n v_total numeric;\n v_sub numeric;\n v_disc numeric;\n v_ship numeric;\nBEGIN\n IF p_tenant IS NULL THEN\n RAISE EXCEPTION 'orders_ingest_external: tenant is required' USING ERRCODE = '22023';\n END IF;\n IF v_provider IS NULL OR v_external IS NULL THEN\n RAISE EXCEPTION 'orders_ingest_external: order needs provider and externalId' USING ERRCODE = '22023';\n END IF;\n IF p_unit IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM app.units u WHERE u.id = p_unit AND u.tenant_id = p_tenant) THEN\n RAISE EXCEPTION 'orders_ingest_external: unit % is not of tenant %', p_unit, p_tenant USING ERRCODE = '22023';\n END IF;\n\n -- Once per (provider, externalId) within the tenant: a replay returns the\n -- order it already made. The key lives in metadata, as order_create's does.\n v_ref := v_provider || ':' || v_external;\n SELECT o.id INTO v_order FROM public.orders o\n WHERE o.tenant_id = p_tenant AND o.metadata ->> 'externalRef' = v_ref\n LIMIT 1;\n IF v_order IS NOT NULL THEN\n RETURN v_order;\n END IF;\n\n -- The contract's kinds are this product's kinds; the channel is where the\n -- order came in, in this product's vocabulary.\n v_kind := CASE p_order ->> 'kind'\n WHEN 'delivery' THEN 'delivery'\n WHEN 'takeout' THEN 'takeout'\n WHEN 'dine_in' THEN 'dine_in'\n ELSE 'delivery' END;\n v_channel := CASE v_kind WHEN 'delivery' THEN 'delivery' WHEN 'dine_in' THEN 'dine_in' ELSE 'balcao' END;\n\n IF p_status IS NULL OR NOT EXISTS (\n SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND p_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_ingest_external: % is not a status of kind %', p_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n v_sub := round(coalesce((p_order -> 'totals' ->> 'subtotal')::numeric, 0) / 100, 2);\n v_disc := round(coalesce((p_order -> 'totals' ->> 'discount')::numeric, 0) / 100, 2);\n v_ship := round(coalesce((p_order -> 'totals' ->> 'deliveryFee')::numeric, 0) / 100, 2);\n\n INSERT INTO public.orders (tenant_id, unit_id, kind, channel, status, reference_number,\n subtotal, discount, shipping, total, currency, notes, metadata)\n VALUES (p_tenant, p_unit, v_kind, v_channel, p_status,\n nullif(p_order ->> 'displayId', ''),\n v_sub, v_disc, v_ship,\n round(coalesce((p_order -> 'totals' ->> 'total')::numeric, 0) / 100, 2),\n coalesce(p_order -> 'totals' ->> 'currency', 'BRL'),\n nullif(p_order ->> 'notes', ''),\n jsonb_build_object(\n 'externalRef', v_ref,\n 'idempotencyKey', v_ref,\n 'external', jsonb_build_object(\n 'provider', v_provider,\n 'externalId', v_external,\n 'displayId', p_order -> 'displayId',\n 'merchantRef', p_order -> 'merchantRef',\n 'placedAt', p_order -> 'placedAt',\n 'timing', p_order -> 'timing',\n 'customer', p_order -> 'customer',\n 'payment', p_order -> 'payment',\n 'fulfillment', p_order -> 'fulfillment',\n 'totals', p_order -> 'totals',\n 'lastStatusAt', NULL)))\n RETURNING id INTO v_order;\n\n FOR v_item IN SELECT * FROM jsonb_array_elements(coalesce(p_order -> 'items', '[]'::jsonb)) LOOP\n v_n := v_n + 1;\n v_qty := coalesce((v_item ->> 'quantity')::numeric, 1);\n v_unit := round(coalesce((v_item ->> 'unitPrice')::numeric, 0) / 100, 2);\n v_total := round(coalesce((v_item ->> 'total')::numeric, 0) / 100, 2);\n INSERT INTO public.items (tenant_id, unit_id, order_id, name, description, quantity,\n unit_price, discount, total, sort_order, metadata)\n VALUES (p_tenant, p_unit, v_order,\n coalesce(nullif(btrim(coalesce(v_item ->> 'name', '')), ''), 'Item'),\n nullif(v_item ->> 'notes', ''),\n v_qty, v_unit, 0, v_total, v_n - 1,\n jsonb_build_object(\n 'externalId', v_item -> 'externalId',\n 'externalCode', v_item -> 'externalCode',\n 'unit', v_item -> 'unit',\n 'options', coalesce(v_item -> 'options', '[]'::jsonb)));\n END LOOP;\n\n RETURN v_order;\nEND $$;\n\nCOMMENT ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) IS\n 'The integration service hands a canonical marketplace order to this product, once per (provider, externalId). Actor: the service, for the named tenant.';\n\n-- A later status for an order the service ingested. Monotonic on the\n-- service side already; here the only rules are \"this order is yours\" and\n-- \"that status exists for its kind\".\nCREATE OR REPLACE FUNCTION public.orders_apply_external_status(\n p_tenant uuid,\n p_order uuid,\n p_status text,\n p_occurred_at timestamptz\n) RETURNS void\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_kind text;\nBEGIN\n SELECT o.kind INTO v_kind FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'orders_apply_external_status: order % is not an external order of tenant %', p_order, p_tenant\n USING ERRCODE = '22023';\n END IF;\n IF NOT EXISTS (SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND p_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_apply_external_status: % is not a status of kind %', p_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n UPDATE public.orders\n SET status = p_status,\n completed_at = CASE WHEN p_status IN ('completed', 'delivered') THEN coalesce(p_occurred_at, now()) ELSE completed_at END,\n metadata = jsonb_set(metadata, '{external,lastStatusAt}', to_jsonb(coalesce(p_occurred_at, now())), true),\n updated_at = now()\n WHERE id = p_order;\nEND $$;\n\nCOMMENT ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) IS\n 'A later status from the marketplace for an order the service ingested. Actor: the service, for the named tenant.';\n\nCREATE OR REPLACE FUNCTION public.orders_external_status(p_tenant uuid, p_order uuid)\nRETURNS jsonb\nLANGUAGE sql STABLE SECURITY DEFINER\nSET search_path TO ''\nAS $$\n SELECT jsonb_build_object('status', o.status, 'updatedAt', o.updated_at)\n FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n$$;\n\nCOMMENT ON FUNCTION public.orders_external_status(uuid, uuid) IS\n 'What this product thinks an external order is now. Actor: the service, for the named tenant.';\n\n-- Closed to people, open to the service. The pools grant EXECUTE to\n-- \\`authenticated\\` on every new public function by default; a definer function\n-- that takes the tenant as a parameter must not be reachable by a session.\nREVOKE ALL ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) FROM PUBLIC, anon, authenticated;\nREVOKE ALL ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) FROM PUBLIC, anon, authenticated;\nREVOKE ALL ON FUNCTION public.orders_external_status(uuid, uuid) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) TO service_role;\nGRANT EXECUTE ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) TO service_role;\nGRANT EXECUTE ON FUNCTION public.orders_external_status(uuid, uuid) TO service_role;\n\nDO $$\nBEGIN\n IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fayz_integration') THEN\n GRANT USAGE ON SCHEMA public TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_external_status(uuid, uuid) TO fayz_integration;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_002_DELIVERED_IN_EACH_KINDS_WORDS = `-- ============================================================================\n-- 002 — \"delivered\" in each kind's words\n--\n-- The contract says \\`delivered\\` for the moment the food reached the customer,\n-- whatever the kind. This product says it three ways: a delivery is\n-- \\`delivered\\`, a takeout is \\`picked_up\\`, a dine-in is \\`served\\`. The two doors\n-- of 001 took the contract's word and refused it for a takeout; they now\n-- translate before validating, so the sink stays thirty lines and knows\n-- nothing about kinds.\n-- ============================================================================\n\nCREATE OR REPLACE FUNCTION public.orders_status_for_kind(p_kind text, p_status text)\nRETURNS text\nLANGUAGE sql IMMUTABLE\nSET search_path TO ''\nAS $$\n SELECT CASE\n WHEN p_status = 'delivered' AND p_kind = 'takeout' THEN 'picked_up'\n WHEN p_status = 'delivered' AND p_kind = 'dine_in' THEN 'served'\n ELSE p_status\n END;\n$$;\n\nCOMMENT ON FUNCTION public.orders_status_for_kind(text, text) IS\n 'The canonical delivered in this kind''s words: delivered, picked_up or served.';\n\nCREATE OR REPLACE FUNCTION public.orders_apply_external_status(\n p_tenant uuid,\n p_order uuid,\n p_status text,\n p_occurred_at timestamptz\n) RETURNS void\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_kind text;\n v_status text;\nBEGIN\n SELECT o.kind INTO v_kind FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'orders_apply_external_status: order % is not an external order of tenant %', p_order, p_tenant\n USING ERRCODE = '22023';\n END IF;\n v_status := public.orders_status_for_kind(v_kind, p_status);\n IF NOT EXISTS (SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND v_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_apply_external_status: % is not a status of kind %', v_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n UPDATE public.orders\n SET status = v_status,\n completed_at = CASE WHEN v_status IN ('completed', 'delivered', 'picked_up', 'served')\n THEN coalesce(p_occurred_at, now()) ELSE completed_at END,\n metadata = jsonb_set(metadata, '{external,lastStatusAt}', to_jsonb(coalesce(p_occurred_at, now())), true),\n updated_at = now()\n WHERE id = p_order;\nEND $$;\n\n-- The status door reads the kind's word back as the contract's.\nCREATE OR REPLACE FUNCTION public.orders_external_status(p_tenant uuid, p_order uuid)\nRETURNS jsonb\nLANGUAGE sql STABLE SECURITY DEFINER\nSET search_path TO ''\nAS $$\n SELECT jsonb_build_object(\n 'status', CASE o.status WHEN 'picked_up' THEN 'delivered' WHEN 'served' THEN 'delivered' ELSE o.status END,\n 'updatedAt', o.updated_at)\n FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n$$;\n\nREVOKE ALL ON FUNCTION public.orders_status_for_kind(text, text) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.orders_status_for_kind(text, text) TO authenticated, service_role;\nDO $$\nBEGIN\n IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fayz_integration') THEN\n GRANT EXECUTE ON FUNCTION public.orders_status_for_kind(text, text) TO fayz_integration;\n END IF;\nEND $$;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"001_an_order_arrives_from_a_marketplace\", sql: MIGRATION_001_AN_ORDER_ARRIVES_FROM_A_MARKETPLACE },\n { id: \"002_delivered_in_each_kinds_words\", sql: MIGRATION_002_DELIVERED_IN_EACH_KINDS_WORDS },\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 { MIGRATIONS } from './migrations'\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 // What installing this provisions, byte-for-byte the files under\n // src/migrations (embed barrel). The spine holds the orders tables; this\n // list holds the doors the plugin adds on top of them.\n migrations: MIGRATIONS.map((m) => ({\n id: `orders-${m.id}`,\n version: '1.0.0',\n sql: m.sql,\n description: m.id,\n })),\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"]}
1
+ {"version":3,"sources":["../src/data/registries.ts","../src/migrations/index.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/settings/v1-settings.ts","../src/index.ts"],"names":["store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS","value","React","tl"],"mappings":";;;;;;;;;;;;;;;AAGA,IAAM,iBAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,cAAA;AAAA,EACN,UAAA,EAAY,eAAA;AAAA,EACZ,IAAA,EAAM,OAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC9E,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,MAAA,EAAQ,aAAa,IAAA,EAAK;AAAA,IAC9D,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA;AAAK,GAC7F;AAAA,EACA,IAAA,EAAM,EAAE,KAAA,EAAO,eAAA,EAAiB,cAAc,IAAA;AAChD,CAAA;AAEO,IAAM,gBAAA,GAAwC;AAAA,EACnD;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,MAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU;AAAA,MACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,WAAW,IAAA,EAAM,iBAAA,EAAO,UAAU,IAAA,EAAK;AAAA,MAC9D,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,WAAW,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAChE,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,SAAS,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAC5D,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAM,WAAA,EAAM,UAAU,IAAA;AAAK;AAChE;AAEJ,CAAA;;;AC3BO,IAAM,iDAAA,GAAoD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4M1D,IAAM,2CAAA,GAA8C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"index.js","sourcesContent":["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","// AUTO-GENERATED from 001_an_order_arrives_from_a_marketplace.sql, 002_delivered_in_each_kinds_words.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_001_AN_ORDER_ARRIVES_FROM_A_MARKETPLACE = `-- ============================================================================\n-- 001 — an order arrives from a marketplace\n--\n-- The V2 sink of ADR 0003: the ONE door through which the integration service\n-- hands a canonical delivery order to this product, and the two beside it to\n-- apply a later status and to read the current one. No rule lives in the\n-- service; what an order IS here is decided here, in one transaction.\n--\n-- There is no person behind these calls — the actor is the service, acting\n-- for the tenant it names, which is why \\`p_tenant\\` is explicit and no\n-- \\`app.has_permission\\` is asked (the same reasoning as service_authorize_for).\n-- The functions are therefore closed to every signed-in user and opened only\n-- to the service's own role, \\`fayz_integration\\`, when that role exists on the\n-- cluster. Creating the role is an operator step; the grant below is guarded.\n--\n-- The order shape is @fayz-ai/contracts' CanonicalOrder v1: money in\n-- centavos, items with options, totals that close. Everything that this\n-- product has no column for travels in orders.metadata.external, so nothing\n-- the marketplace said is lost.\n-- ============================================================================\n\nCREATE OR REPLACE FUNCTION public.orders_ingest_external(\n p_tenant uuid,\n p_unit uuid,\n p_order jsonb,\n p_status text\n) RETURNS uuid\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_provider text := p_order ->> 'provider';\n v_external text := p_order ->> 'externalId';\n v_ref text;\n v_kind text;\n v_channel text;\n v_order uuid;\n v_item jsonb;\n v_n integer := 0;\n v_qty numeric;\n v_unit numeric;\n v_total numeric;\n v_sub numeric;\n v_disc numeric;\n v_ship numeric;\nBEGIN\n IF p_tenant IS NULL THEN\n RAISE EXCEPTION 'orders_ingest_external: tenant is required' USING ERRCODE = '22023';\n END IF;\n IF v_provider IS NULL OR v_external IS NULL THEN\n RAISE EXCEPTION 'orders_ingest_external: order needs provider and externalId' USING ERRCODE = '22023';\n END IF;\n IF p_unit IS NOT NULL AND NOT EXISTS (\n SELECT 1 FROM app.units u WHERE u.id = p_unit AND u.tenant_id = p_tenant) THEN\n RAISE EXCEPTION 'orders_ingest_external: unit % is not of tenant %', p_unit, p_tenant USING ERRCODE = '22023';\n END IF;\n\n -- Once per (provider, externalId) within the tenant: a replay returns the\n -- order it already made. The key lives in metadata, as order_create's does.\n v_ref := v_provider || ':' || v_external;\n SELECT o.id INTO v_order FROM public.orders o\n WHERE o.tenant_id = p_tenant AND o.metadata ->> 'externalRef' = v_ref\n LIMIT 1;\n IF v_order IS NOT NULL THEN\n RETURN v_order;\n END IF;\n\n -- The contract's kinds are this product's kinds; the channel is where the\n -- order came in, in this product's vocabulary.\n v_kind := CASE p_order ->> 'kind'\n WHEN 'delivery' THEN 'delivery'\n WHEN 'takeout' THEN 'takeout'\n WHEN 'dine_in' THEN 'dine_in'\n ELSE 'delivery' END;\n v_channel := CASE v_kind WHEN 'delivery' THEN 'delivery' WHEN 'dine_in' THEN 'dine_in' ELSE 'balcao' END;\n\n IF p_status IS NULL OR NOT EXISTS (\n SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND p_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_ingest_external: % is not a status of kind %', p_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n v_sub := round(coalesce((p_order -> 'totals' ->> 'subtotal')::numeric, 0) / 100, 2);\n v_disc := round(coalesce((p_order -> 'totals' ->> 'discount')::numeric, 0) / 100, 2);\n v_ship := round(coalesce((p_order -> 'totals' ->> 'deliveryFee')::numeric, 0) / 100, 2);\n\n INSERT INTO public.orders (tenant_id, unit_id, kind, channel, status, reference_number,\n subtotal, discount, shipping, total, currency, notes, metadata)\n VALUES (p_tenant, p_unit, v_kind, v_channel, p_status,\n nullif(p_order ->> 'displayId', ''),\n v_sub, v_disc, v_ship,\n round(coalesce((p_order -> 'totals' ->> 'total')::numeric, 0) / 100, 2),\n coalesce(p_order -> 'totals' ->> 'currency', 'BRL'),\n nullif(p_order ->> 'notes', ''),\n jsonb_build_object(\n 'externalRef', v_ref,\n 'idempotencyKey', v_ref,\n 'external', jsonb_build_object(\n 'provider', v_provider,\n 'externalId', v_external,\n 'displayId', p_order -> 'displayId',\n 'merchantRef', p_order -> 'merchantRef',\n 'placedAt', p_order -> 'placedAt',\n 'timing', p_order -> 'timing',\n 'customer', p_order -> 'customer',\n 'payment', p_order -> 'payment',\n 'fulfillment', p_order -> 'fulfillment',\n 'totals', p_order -> 'totals',\n 'lastStatusAt', NULL)))\n RETURNING id INTO v_order;\n\n FOR v_item IN SELECT * FROM jsonb_array_elements(coalesce(p_order -> 'items', '[]'::jsonb)) LOOP\n v_n := v_n + 1;\n v_qty := coalesce((v_item ->> 'quantity')::numeric, 1);\n v_unit := round(coalesce((v_item ->> 'unitPrice')::numeric, 0) / 100, 2);\n v_total := round(coalesce((v_item ->> 'total')::numeric, 0) / 100, 2);\n INSERT INTO public.items (tenant_id, unit_id, order_id, name, description, quantity,\n unit_price, discount, total, sort_order, metadata)\n VALUES (p_tenant, p_unit, v_order,\n coalesce(nullif(btrim(coalesce(v_item ->> 'name', '')), ''), 'Item'),\n nullif(v_item ->> 'notes', ''),\n v_qty, v_unit, 0, v_total, v_n - 1,\n jsonb_build_object(\n 'externalId', v_item -> 'externalId',\n 'externalCode', v_item -> 'externalCode',\n 'unit', v_item -> 'unit',\n 'options', coalesce(v_item -> 'options', '[]'::jsonb)));\n END LOOP;\n\n RETURN v_order;\nEND $$;\n\nCOMMENT ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) IS\n 'The integration service hands a canonical marketplace order to this product, once per (provider, externalId). Actor: the service, for the named tenant.';\n\n-- A later status for an order the service ingested. Monotonic on the\n-- service side already; here the only rules are \"this order is yours\" and\n-- \"that status exists for its kind\".\nCREATE OR REPLACE FUNCTION public.orders_apply_external_status(\n p_tenant uuid,\n p_order uuid,\n p_status text,\n p_occurred_at timestamptz\n) RETURNS void\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_kind text;\nBEGIN\n SELECT o.kind INTO v_kind FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'orders_apply_external_status: order % is not an external order of tenant %', p_order, p_tenant\n USING ERRCODE = '22023';\n END IF;\n IF NOT EXISTS (SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND p_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_apply_external_status: % is not a status of kind %', p_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n UPDATE public.orders\n SET status = p_status,\n completed_at = CASE WHEN p_status IN ('completed', 'delivered') THEN coalesce(p_occurred_at, now()) ELSE completed_at END,\n metadata = jsonb_set(metadata, '{external,lastStatusAt}', to_jsonb(coalesce(p_occurred_at, now())), true),\n updated_at = now()\n WHERE id = p_order;\nEND $$;\n\nCOMMENT ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) IS\n 'A later status from the marketplace for an order the service ingested. Actor: the service, for the named tenant.';\n\nCREATE OR REPLACE FUNCTION public.orders_external_status(p_tenant uuid, p_order uuid)\nRETURNS jsonb\nLANGUAGE sql STABLE SECURITY DEFINER\nSET search_path TO ''\nAS $$\n SELECT jsonb_build_object('status', o.status, 'updatedAt', o.updated_at)\n FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n$$;\n\nCOMMENT ON FUNCTION public.orders_external_status(uuid, uuid) IS\n 'What this product thinks an external order is now. Actor: the service, for the named tenant.';\n\n-- Closed to people, open to the service. The pools grant EXECUTE to\n-- \\`authenticated\\` on every new public function by default; a definer function\n-- that takes the tenant as a parameter must not be reachable by a session.\nREVOKE ALL ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) FROM PUBLIC, anon, authenticated;\nREVOKE ALL ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) FROM PUBLIC, anon, authenticated;\nREVOKE ALL ON FUNCTION public.orders_external_status(uuid, uuid) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) TO service_role;\nGRANT EXECUTE ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) TO service_role;\nGRANT EXECUTE ON FUNCTION public.orders_external_status(uuid, uuid) TO service_role;\n\nDO $$\nBEGIN\n IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fayz_integration') THEN\n GRANT USAGE ON SCHEMA public TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_ingest_external(uuid, uuid, jsonb, text) TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_apply_external_status(uuid, uuid, text, timestamptz) TO fayz_integration;\n GRANT EXECUTE ON FUNCTION public.orders_external_status(uuid, uuid) TO fayz_integration;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_002_DELIVERED_IN_EACH_KINDS_WORDS = `-- ============================================================================\n-- 002 — \"delivered\" in each kind's words\n--\n-- The contract says \\`delivered\\` for the moment the food reached the customer,\n-- whatever the kind. This product says it three ways: a delivery is\n-- \\`delivered\\`, a takeout is \\`picked_up\\`, a dine-in is \\`served\\`. The two doors\n-- of 001 took the contract's word and refused it for a takeout; they now\n-- translate before validating, so the sink stays thirty lines and knows\n-- nothing about kinds.\n-- ============================================================================\n\nCREATE OR REPLACE FUNCTION public.orders_status_for_kind(p_kind text, p_status text)\nRETURNS text\nLANGUAGE sql IMMUTABLE\nSET search_path TO ''\nAS $$\n SELECT CASE\n WHEN p_status = 'delivered' AND p_kind = 'takeout' THEN 'picked_up'\n WHEN p_status = 'delivered' AND p_kind = 'dine_in' THEN 'served'\n ELSE p_status\n END;\n$$;\n\nCOMMENT ON FUNCTION public.orders_status_for_kind(text, text) IS\n 'The canonical delivered in this kind''s words: delivered, picked_up or served.';\n\nCREATE OR REPLACE FUNCTION public.orders_apply_external_status(\n p_tenant uuid,\n p_order uuid,\n p_status text,\n p_occurred_at timestamptz\n) RETURNS void\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_kind text;\n v_status text;\nBEGIN\n SELECT o.kind INTO v_kind FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n IF v_kind IS NULL THEN\n RAISE EXCEPTION 'orders_apply_external_status: order % is not an external order of tenant %', p_order, p_tenant\n USING ERRCODE = '22023';\n END IF;\n v_status := public.orders_status_for_kind(v_kind, p_status);\n IF NOT EXISTS (SELECT 1 FROM public.order_kinds k WHERE k.kind = v_kind AND v_status = ANY (k.statuses)) THEN\n RAISE EXCEPTION 'orders_apply_external_status: % is not a status of kind %', v_status, v_kind USING ERRCODE = '22023';\n END IF;\n\n UPDATE public.orders\n SET status = v_status,\n completed_at = CASE WHEN v_status IN ('completed', 'delivered', 'picked_up', 'served')\n THEN coalesce(p_occurred_at, now()) ELSE completed_at END,\n metadata = jsonb_set(metadata, '{external,lastStatusAt}', to_jsonb(coalesce(p_occurred_at, now())), true),\n updated_at = now()\n WHERE id = p_order;\nEND $$;\n\n-- The status door reads the kind's word back as the contract's.\nCREATE OR REPLACE FUNCTION public.orders_external_status(p_tenant uuid, p_order uuid)\nRETURNS jsonb\nLANGUAGE sql STABLE SECURITY DEFINER\nSET search_path TO ''\nAS $$\n SELECT jsonb_build_object(\n 'status', CASE o.status WHEN 'picked_up' THEN 'delivered' WHEN 'served' THEN 'delivered' ELSE o.status END,\n 'updatedAt', o.updated_at)\n FROM public.orders o\n WHERE o.id = p_order AND o.tenant_id = p_tenant AND o.metadata ? 'externalRef';\n$$;\n\nREVOKE ALL ON FUNCTION public.orders_status_for_kind(text, text) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.orders_status_for_kind(text, text) TO authenticated, service_role;\nDO $$\nBEGIN\n IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fayz_integration') THEN\n GRANT EXECUTE ON FUNCTION public.orders_status_for_kind(text, text) TO fayz_integration;\n END IF;\nEND $$;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"001_an_order_arrives_from_a_marketplace\", sql: MIGRATION_001_AN_ORDER_ARRIVES_FROM_A_MARKETPLACE },\n { id: \"002_delivered_in_each_kinds_words\", sql: MIGRATION_002_DELIVERED_IN_EACH_KINDS_WORDS },\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// The delivery policy rows save (typed keys, spine 041) but no order or checkout\n// reads them yet — each row carries the \"Em breve\" mark (SETTINGS-AUDIT.md).\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, pending }: {\n pending?: boolean\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 pending={pending}\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 pending\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 pending\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 pending\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 pending\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 pending\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 pending\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 { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const ordersV1SettingsTabs = [\n defineSettingsTab({\n id: 'orders-scale',\n label: tl('Scale & sale by weight', 'Balança e venda por peso'),\n icon: 'Scale',\n section: 'operations',\n requiresFacet: 'scale',\n pending: true,\n defaults: { 'scale.auto_launch': false, 'scale.min_weight_g': 10, 'scale.label_enabled': false, 'scale.label_prefix': '2', 'scale.label_code_length': 4, 'scale.label_value_kind': 'price' },\n sections: [\n { title: tl('Weighing', 'Pesagem'), fields: [\n { key: 'scale.auto_launch', type: 'boolean', scope: 'unit', label: tl('Launch on its own once the weight settles', 'Lançar sozinho quando o peso estabilizar') },\n { key: 'scale.min_weight_g', type: 'number', scope: 'unit', min: 1, max: 5000, label: tl('Minimum weight (g)', 'Peso mínimo (g)') },\n ] },\n { title: tl('Scale labels', 'Etiqueta da balança'), fields: [\n { key: 'scale.label_enabled', type: 'boolean', scope: 'unit', label: tl('Read scale labels at the POS', 'Ler etiqueta de balança no PDV') },\n { key: 'scale.label_prefix', type: 'string', scope: 'unit', label: tl('Barcode prefix', 'Prefixo do código') },\n { key: 'scale.label_code_length', type: 'number', scope: 'unit', min: 4, max: 6, label: tl('Product code digits', 'Dígitos do código do produto') },\n { key: 'scale.label_value_kind', type: 'select', scope: 'unit', label: tl('The label carries', 'A etiqueta traz'), options: [\n { value: 'price', label: tl('Price', 'Preço') }, { value: 'weight', label: tl('Weight', 'Peso') },\n ] },\n ] },\n ],\n }),\n]\n","import React from 'react'\nimport { tl } from '@fayz-ai/core'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nimport type { RestaurantOrder } from '@fayz-ai/orders/domain/order'\nimport { createSupabaseOrdersProvider } from '@fayz-ai/orders/data/supabase'\nimport { createOrdersStore } from '@fayz-ai/orders/store'\nimport { ordersRegistries } from './data/registries'\nimport { MIGRATIONS } from './migrations'\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 { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\nimport { ordersV1SettingsTabs } from './settings/v1-settings'\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\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n moduleName: tl('Orders & POS', 'Pedidos e PDV'),\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\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 /** The full order page for an id. Unset = the rail offers no \"Ver pedido completo\". */\n orderRoute?: (orderId: string) => string\n /** The edit screen for an id. Unset hides \"Editar pedido\". */\n editRoute?: (orderId: string) => string\n /** Whether this order may still be edited. Defaults to the archetype's `orderIsEditable` (open and new). */\n canEditOrder?: (order: { status?: string }) => boolean\n}\n\nfunction resolveConfig(options?: OrdersPluginOptions): ResolvedOrdersConfig {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels },\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\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 ?? createSupabaseOrdersProvider()\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 // The tenant's config arrives after load; the merge is shallow, per block, like the app's own call.\n rebuild: (tenantConfig) =>\n createOrdersPlugin({ ...options, ...(tenantConfig as OrdersPluginOptions) }),\n defaultAgentRole: 'operations',\n name: config.labels.moduleName,\n icon: 'Coins',\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 // What installing this provisions, byte-for-byte the files under\n // src/migrations (embed barrel). The spine holds the orders tables; this\n // list holds the doors the plugin adds on top of them.\n migrations: MIGRATIONS.map((m) => ({\n id: `orders-${m.id}`,\n version: '1.0.0',\n sql: m.sql,\n description: m.id,\n })),\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 // No client-side guard yet: creation goes through the AI tool; 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: 'Coins',\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 facets: [\n { id: 'scale', label: 'Balança', description: 'Venda por peso com balança e etiqueta.' },\n { id: 'delivery', label: 'Delivery e iFood', description: 'Entrega própria e pedidos do iFood e outros marketplaces.', defaultEnabled: true },\n ],\n settings: [\n ...ordersV1SettingsTabs,\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 ...(config.modules.delivery\n ? [{\n id: 'orders-delivery',\n label: 'Delivery',\n icon: 'Bike',\n // Delivery is sold apart: its settings appear once the account turns it on.\n requiresFacet: 'delivery',\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 // The delivery fee is the owner's decision, like the service charge in 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 iFood pickup orders.\n connectors: [\n ifoodConnectorDef,\n nineNineFoodConnectorDef,\n keetaConnectorDef,\n uberEatsConnectorDef,\n rappiConnectorDef,\n aiqfomeConnectorDef,\n ],\n }\n}\n\nexport type { OrderSourceOption, OrdersPluginLabels, ResolvedOrdersConfig } from './context'\n\nexport { ifoodConnectorDef, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS } from './integrations/ifood/connectorDef'\nexport {\n nineNineFoodConnectorDef, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS,\n} from './integrations/99food/connectorDef'\nexport { keetaConnectorDef, KEETA_CONNECTOR_ID, KEETA_SETTINGS } from './integrations/keeta/connectorDef'\nexport { uberEatsConnectorDef, UBER_EATS_CONNECTOR_ID, UBER_EATS_SETTINGS } from './integrations/ubereats/connectorDef'\nexport { rappiConnectorDef, RAPPI_CONNECTOR_ID, RAPPI_SETTINGS } from './integrations/rappi/connectorDef'\nexport { aiqfomeConnectorDef, AIQFOME_CONNECTOR_ID, AIQFOME_SETTINGS } from './integrations/aiqfome/connectorDef'\nexport { marketplacePermissions, AUTO_ACCEPT_SETTING, PREP_TIME_SETTING } from './integrations/shared'\n\n// Published names apps already import from this package; the definitions live in @fayz-ai/orders.\nexport {\n ADVANCE_VERB, DEFAULT_STATUS_CONFIGS, KANBAN_COLUMNS, STATUS_FLOW,\n getNextStatus, getPreviousStatus, mapToKanbanColumn,\n} from '@fayz-ai/orders/domain/order'\nexport type {\n CreateOrderInput, CreateOrderItemInput, DeliveryStatus, DineInStatus, KanbanColumn, OrderKind, OrderQuery,\n OrderStatus, OrderStatusConfig, OrdersSummary, PaginatedResult, RestaurantOrder, RestaurantOrderItem,\n TakeoutStatus, UpdateOrderStatusInput,\n} from '@fayz-ai/orders/domain/order'\nexport type { OrdersDataProvider } from '@fayz-ai/orders/data/provider'\nexport { createFayzOrdersProvider, type FayzOrdersProviderOptions } from '@fayz-ai/orders/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 {\n createSupabaseOrdersProvider as createCoreOrdersProvider,\n type SupabaseOrdersProviderOptions as CoreOrdersProviderOptions,\n type SupabaseOrdersWriteOptions as CoreOrdersWriteOptions,\n} from '@fayz-ai/orders/data/supabase'\nexport { createMockOrdersProvider } from '@fayz-ai/orders/data/mock'\nexport { ORDER_DETAIL_COMPONENT_ID } from './lib/detail-slot'\nexport type { OrderDetailSlotProps } from './lib/detail-slot'\n"]}