@fayz-ai/plugin-orders 0.10.0 → 0.11.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.
@@ -36,7 +36,7 @@ function OrderCard({
36
36
  return /* @__PURE__ */ jsxs(
37
37
  "div",
38
38
  {
39
- className: "rounded-lg border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer",
39
+ className: "rounded-card border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer",
40
40
  onClick: onSelect,
41
41
  children: [
42
42
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
@@ -151,5 +151,5 @@ function OrdersPage({ config, provider, store, registries }) {
151
151
  }
152
152
 
153
153
  export { OrdersPage };
154
- //# sourceMappingURL=OrdersPage-YTSYE573.js.map
155
- //# sourceMappingURL=OrdersPage-YTSYE573.js.map
154
+ //# sourceMappingURL=OrdersPage-KNG54KEB.js.map
155
+ //# sourceMappingURL=OrdersPage-KNG54KEB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.tsx","../src/views/OrderKanbanView.tsx","../src/views/OrdersPage.tsx"],"names":["jsx"],"mappings":"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","file":"OrdersPage-YTSYE573.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig, type EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { OrdersUIState } from './store'\nimport type { RestaurantOrder } from './types'\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface OrdersModules {\n delivery: boolean\n takeout: boolean\n}\n\nexport type OrdersCurrency = CurrencyConfig\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n pageSubtitle: string\n orderSingular: string\n orderPlural: string\n}\n\nexport interface ResolvedOrdersConfig {\n modules: OrdersModules\n labels: OrdersPluginLabels\n currency: OrdersCurrency\n orderSources: OrderSourceOption[]\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n}\n\nconst ctx = createPluginContext<ResolvedOrdersConfig, OrdersDataProvider, OrdersUIState>('OrdersPage')\n\nexport const OrdersContextProvider = ctx.ContextProvider\nexport const useOrdersConfig = ctx.useConfig\nexport const useOrdersProvider = ctx.useProvider\nexport const useOrdersStore = ctx.useStore\n\nexport { formatCurrency }\n","import React, { useEffect, useMemo } from 'react'\nimport { ChevronRight, Clock, Loader2, ClipboardList } from 'lucide-react'\nimport { useOrdersConfig, useOrdersStore, formatCurrency } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n KANBAN_COLUMNS,\n mapToKanbanColumn,\n getNextStatus,\n type KanbanColumn,\n type RestaurantOrder,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Column config\n// ---------------------------------------------------------------------------\n\nconst COLUMN_CONFIG: Record<KanbanColumn, { color: string }> = {\n new: { color: 'bg-violet-500' },\n confirmed: { color: 'bg-blue-500' },\n preparing: { color: 'bg-amber-500' },\n ready: { color: 'bg-emerald-500' },\n out: { color: 'bg-cyan-500' },\n completed: { color: 'bg-gray-400' },\n cancelled: { color: 'bg-red-500' },\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction timeAgo(dateStr: string): string {\n const diff = Math.floor((Date.now() - new Date(dateStr).getTime()) / 60000)\n if (diff < 1) return 'just now'\n if (diff === 1) return '1min'\n return `${diff}min`\n}\n\n// ---------------------------------------------------------------------------\n// Order Card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onAdvance,\n onSelect,\n currency,\n}: {\n order: RestaurantOrder\n onAdvance?: () => void\n onSelect: () => void\n currency: { code: string; locale: string; symbol: string }\n}) {\n const t = useTranslation()\n const sourceLabel = t(`orders.source.${order.source}`) !== `orders.source.${order.source}`\n ? t(`orders.source.${order.source}`)\n : order.source\n\n return (\n <div\n className=\"rounded-lg border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer\"\n onClick={onSelect}\n >\n {/* Header: order number + source badge */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-bold\">{order.referenceNumber}</span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium\">\n {sourceLabel}\n </span>\n </div>\n\n {/* Customer + table */}\n {order.partyName && (\n <p className=\"text-sm font-medium truncate\">{order.partyName}</p>\n )}\n {order.tableName && (\n <p className=\"text-xs text-muted-foreground\">{order.tableName}</p>\n )}\n\n {/* Items */}\n {order.items.length > 0 && (\n <div className=\"mt-2 space-y-0.5\">\n {order.items.map((item) => (\n <p key={item.id} className=\"text-xs text-muted-foreground truncate\">\n {item.quantity}x {item.name}\n </p>\n ))}\n </div>\n )}\n\n {/* Total + time */}\n <div className=\"flex items-center justify-between mt-3 pt-2 border-t\">\n <span className=\"text-sm font-bold\">\n {formatCurrency(order.total, currency)}\n </span>\n <span className=\"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeAgo(order.createdAt)}\n </span>\n </div>\n\n {/* Advance button */}\n {onAdvance && (\n <button\n type=\"button\"\n className=\"mt-2 flex w-full items-center justify-center gap-1 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n onAdvance()\n }}\n >\n {t('orders.kanban.advance')}\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Skeleton column (loading state)\n// ---------------------------------------------------------------------------\n\nfunction SkeletonColumn() {\n return (\n <div className=\"flex-shrink-0 w-72\">\n <div className=\"h-9 rounded-lg bg-muted animate-pulse mb-3\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-32 rounded-lg bg-muted/60 animate-pulse\" />\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// OrderKanbanView\n// ---------------------------------------------------------------------------\n\nexport function OrderKanbanView() {\n const t = useTranslation()\n const config = useOrdersConfig()\n\n const activeOrders = useOrdersStore((s) => s.activeOrders)\n const activeOrdersLoading = useOrdersStore((s) => s.activeOrdersLoading)\n const fetchActiveOrders = useOrdersStore((s) => s.fetchActiveOrders)\n const advanceOrderStatus = useOrdersStore((s) => s.advanceOrderStatus)\n const selectOrder = useOrdersStore((s) => s.selectOrder)\n\n useEffect(() => {\n fetchActiveOrders()\n }, [fetchActiveOrders])\n\n // Group orders by kanban column\n const grouped = useMemo(() => {\n const map: Record<KanbanColumn, RestaurantOrder[]> = {\n new: [],\n confirmed: [],\n preparing: [],\n ready: [],\n out: [],\n completed: [],\n cancelled: [],\n }\n for (const order of activeOrders) {\n const col = mapToKanbanColumn(order.status)\n map[col].push(order)\n }\n return map\n }, [activeOrders])\n\n // Loading state\n if (activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => (\n <SkeletonColumn key={col} />\n ))}\n </div>\n )\n }\n\n // Empty state\n if (!activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center h-64 text-center\">\n <ClipboardList className=\"h-12 w-12 text-muted-foreground/40 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">\n {t('orders.kanban.noOrders')}\n </p>\n <p className=\"text-xs text-muted-foreground/70 mt-1\">\n {t('orders.kanban.noOrdersDesc')}\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => {\n const columnOrders = grouped[col]\n const colConfig = COLUMN_CONFIG[col]\n const label = t(`orders.kanban.column.${col}`)\n const hasNext = (order: RestaurantOrder) =>\n getNextStatus(order.kind, order.status) !== null\n\n return (\n <div key={col} className=\"flex-shrink-0 w-72\">\n {/* Column header */}\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg mb-3\">\n <span className={`h-2.5 w-2.5 rounded-full ${colConfig.color}`} />\n <span className=\"text-sm font-semibold\">{label}</span>\n <span className=\"ml-auto inline-flex items-center justify-center rounded-full bg-muted px-2 py-0.5 text-xs font-medium\">\n {columnOrders.length}\n </span>\n </div>\n\n {/* Cards */}\n <div className=\"space-y-3 max-h-[calc(100vh-16rem)] overflow-y-auto pr-1\">\n {columnOrders.map((order) => (\n <OrderCard\n key={order.id}\n order={order}\n currency={config.currency}\n onSelect={() => selectOrder(order.id)}\n onAdvance={hasNext(order) ? () => advanceOrderStatus(order.id) : undefined}\n />\n ))}\n {columnOrders.length === 0 && (\n <div className=\"text-center py-8 text-sm text-muted-foreground rounded-lg border border-dashed\">\n {t('orders.kanban.noOrders')}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { OrdersContextProvider, type ResolvedOrdersConfig } from '../context'\nimport { OrderKanbanView } from './OrderKanbanView'\nimport type { OrdersDataProvider } from '../data/types'\nimport type { OrdersUIState } from '../store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nexport function OrdersPage({ config, provider, store, registries }: {\n config: ResolvedOrdersConfig\n provider: OrdersDataProvider\n store: StoreApi<OrdersUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <OrdersContextProvider config={config} provider={provider} store={store}>\n <OrderKanbanView />\n </OrdersContextProvider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/context.tsx","../src/views/OrderKanbanView.tsx","../src/views/OrdersPage.tsx"],"names":["jsx"],"mappings":";;;;;;;AAuCA,IAAM,GAAA,GAAM,oBAA6E,YAAY,CAAA;AAE9F,IAAM,wBAAwB,GAAA,CAAI,eAAA;AAClC,IAAM,kBAAkB,GAAA,CAAI,SAAA;AACF,GAAA,CAAI;AAC9B,IAAM,iBAAiB,GAAA,CAAI,QAAA;AC5BlC,IAAM,aAAA,GAAyD;AAAA,EAC7D,GAAA,EAAK,EAAE,KAAA,EAAO,eAAA,EAAgB;AAAA,EAC9B,SAAA,EAAW,EAAE,KAAA,EAAO,aAAA,EAAc;AAAA,EAClC,SAAA,EAAW,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,EACnC,KAAA,EAAO,EAAE,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACjC,GAAA,EAAK,EAAE,KAAA,EAAO,aAAA,EAAc;AAAA,EAC5B,SAAA,EAAW,EAAE,KAAA,EAAO,aAAA,EAAc;AAAA,EAClC,SAAA,EAAW,EAAE,KAAA,EAAO,YAAA;AACtB,CAAA;AAMA,SAAS,QAAQ,OAAA,EAAyB;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ,IAAK,GAAK,CAAA;AAC1E,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,UAAA;AACrB,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,MAAA;AACvB,EAAA,OAAO,GAAG,IAAI,CAAA,GAAA,CAAA;AAChB;AAMA,SAAS,SAAA,CAAU;AAAA,EACjB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,cAAc,CAAA,CAAE,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,EAAE,CAAA,KAAM,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,KACpF,CAAA,CAAE,CAAA,cAAA,EAAiB,MAAM,MAAM,CAAA,CAAE,IACjC,KAAA,CAAM,MAAA;AAEV,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,kFAAA;AAAA,MACV,OAAA,EAAS,QAAA;AAAA,MAGT,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,KAAA,CAAM,eAAA,EAAgB,CAAA;AAAA,0BAC3D,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0FAAA,EACb,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QAGC,MAAM,SAAA,oBACL,GAAA,CAAC,OAAE,SAAA,EAAU,8BAAA,EAAgC,gBAAM,SAAA,EAAU,CAAA;AAAA,QAE9D,MAAM,SAAA,oBACL,GAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,gBAAM,SAAA,EAAU,CAAA;AAAA,QAI/D,MAAM,KAAA,CAAM,MAAA,GAAS,CAAA,oBACpB,GAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,IAAA,qBAChB,IAAA,CAAC,GAAA,EAAA,EAAgB,WAAU,wCAAA,EACxB,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,QAAA;AAAA,UAAS,IAAA;AAAA,UAAG,IAAA,CAAK;AAAA,SAAA,EAAA,EADjB,IAAA,CAAK,EAEb,CACD,CAAA,EACH,CAAA;AAAA,wBAIF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EACb,yBAAe,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA,EACvC,CAAA;AAAA,0BACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,YAC1B,OAAA,CAAQ,MAAM,SAAS;AAAA,WAAA,EAC1B;AAAA,SAAA,EACF,CAAA;AAAA,QAGC,SAAA,oBACC,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,wKAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,SAAA,EAAU;AAAA,YACZ,CAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,uBAAuB,CAAA;AAAA,8BAC1B,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAAA;AACpC;AAAA;AAAA,GAEJ;AAEJ;AAMA,SAAS,cAAA,GAAiB;AACxB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EAA6C,CAAA;AAAA,wBAC3D,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACd,GAAA,CAAC,KAAA,EAAA,EAAY,WAAU,2CAAA,EAAA,EAAb,CAAyD,CACpE,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACzD,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,mBAAmB,CAAA;AACvE,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACnE,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AACrE,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAEvD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAGtB,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC5B,IAAA,MAAM,GAAA,GAA+C;AAAA,MACnD,KAAK,EAAC;AAAA,MACN,WAAW,EAAC;AAAA,MACZ,WAAW,EAAC;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,KAAK,EAAC;AAAA,MACN,WAAW,EAAC;AAAA,MACZ,WAAW;AAAC,KACd;AACA,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAC1C,MAAA,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,IAAI,mBAAA,IAAuB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACpD,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,qBACnB,GAAA,CAAC,cAAA,EAAA,EAAA,EAAoB,GAAK,CAC3B,CAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,CAAC,mBAAA,IAAuB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACrD,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,yCAAA,EAA0C,CAAA;AAAA,0BAClE,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EACV,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,0BACC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EACV,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EACjC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,mCACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,IAAA,MAAM,YAAA,GAAe,QAAQ,GAAG,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,cAAc,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KACf,aAAA,CAAc,MAAM,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,KAAM,IAAA;AAE9C,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EAEvB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mDAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,yBAAA,EAA4B,SAAA,CAAU,KAAK,CAAA,CAAA,EAAI,CAAA;AAAA,wBAChE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC/C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uGAAA,EACb,uBAAa,MAAA,EAChB;AAAA,OAAA,EACF,CAAA;AAAA,sBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EACZ,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,qBACjB,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEC,KAAA;AAAA,YACA,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,QAAA,EAAU,MAAM,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA;AAAA,YACpC,SAAA,EAAW,QAAQ,KAAK,CAAA,GAAI,MAAM,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,WAAA;AAAA,UAJ5D,KAAA,CAAM;AAAA,SAMd,CAAA;AAAA,QACA,YAAA,CAAa,WAAW,CAAA,oBACvB,GAAA,CAAC,SAAI,SAAA,EAAU,gFAAA,EACZ,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B;AAAA,OAAA,EAEJ;AAAA,KAAA,EAAA,EA1BQ,GA2BV,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACvOO,SAAS,WAAW,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,YAAW,EAK9D;AACD,EAAA,uBACEA,IAAC,qBAAA,EAAA,EAAsB,MAAA,EAAgB,UAAoB,KAAA,EACzD,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,EACnB,CAAA;AAEJ","file":"OrdersPage-KNG54KEB.js","sourcesContent":["import { createPluginContext, formatCurrency, type CurrencyConfig, type EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { OrdersUIState } from './store'\nimport type { RestaurantOrder } from './types'\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface OrdersModules {\n delivery: boolean\n takeout: boolean\n}\n\nexport type OrdersCurrency = CurrencyConfig\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n pageSubtitle: string\n orderSingular: string\n orderPlural: string\n}\n\nexport interface ResolvedOrdersConfig {\n modules: OrdersModules\n labels: OrdersPluginLabels\n currency: OrdersCurrency\n orderSources: OrderSourceOption[]\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n}\n\nconst ctx = createPluginContext<ResolvedOrdersConfig, OrdersDataProvider, OrdersUIState>('OrdersPage')\n\nexport const OrdersContextProvider = ctx.ContextProvider\nexport const useOrdersConfig = ctx.useConfig\nexport const useOrdersProvider = ctx.useProvider\nexport const useOrdersStore = ctx.useStore\n\nexport { formatCurrency }\n","import React, { useEffect, useMemo } from 'react'\nimport { ChevronRight, Clock, Loader2, ClipboardList } from 'lucide-react'\nimport { useOrdersConfig, useOrdersStore, formatCurrency } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport {\n KANBAN_COLUMNS,\n mapToKanbanColumn,\n getNextStatus,\n type KanbanColumn,\n type RestaurantOrder,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Column config\n// ---------------------------------------------------------------------------\n\nconst COLUMN_CONFIG: Record<KanbanColumn, { color: string }> = {\n new: { color: 'bg-violet-500' },\n confirmed: { color: 'bg-blue-500' },\n preparing: { color: 'bg-amber-500' },\n ready: { color: 'bg-emerald-500' },\n out: { color: 'bg-cyan-500' },\n completed: { color: 'bg-gray-400' },\n cancelled: { color: 'bg-red-500' },\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction timeAgo(dateStr: string): string {\n const diff = Math.floor((Date.now() - new Date(dateStr).getTime()) / 60000)\n if (diff < 1) return 'just now'\n if (diff === 1) return '1min'\n return `${diff}min`\n}\n\n// ---------------------------------------------------------------------------\n// Order Card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onAdvance,\n onSelect,\n currency,\n}: {\n order: RestaurantOrder\n onAdvance?: () => void\n onSelect: () => void\n currency: { code: string; locale: string; symbol: string }\n}) {\n const t = useTranslation()\n const sourceLabel = t(`orders.source.${order.source}`) !== `orders.source.${order.source}`\n ? t(`orders.source.${order.source}`)\n : order.source\n\n return (\n <div\n className=\"rounded-card border bg-card p-3 hover:shadow-md transition-shadow cursor-pointer\"\n onClick={onSelect}\n >\n {/* Header: order number + source badge */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-bold\">{order.referenceNumber}</span>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium\">\n {sourceLabel}\n </span>\n </div>\n\n {/* Customer + table */}\n {order.partyName && (\n <p className=\"text-sm font-medium truncate\">{order.partyName}</p>\n )}\n {order.tableName && (\n <p className=\"text-xs text-muted-foreground\">{order.tableName}</p>\n )}\n\n {/* Items */}\n {order.items.length > 0 && (\n <div className=\"mt-2 space-y-0.5\">\n {order.items.map((item) => (\n <p key={item.id} className=\"text-xs text-muted-foreground truncate\">\n {item.quantity}x {item.name}\n </p>\n ))}\n </div>\n )}\n\n {/* Total + time */}\n <div className=\"flex items-center justify-between mt-3 pt-2 border-t\">\n <span className=\"text-sm font-bold\">\n {formatCurrency(order.total, currency)}\n </span>\n <span className=\"inline-flex items-center gap-0.5 text-[10px] text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {timeAgo(order.createdAt)}\n </span>\n </div>\n\n {/* Advance button */}\n {onAdvance && (\n <button\n type=\"button\"\n className=\"mt-2 flex w-full items-center justify-center gap-1 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n onAdvance()\n }}\n >\n {t('orders.kanban.advance')}\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Skeleton column (loading state)\n// ---------------------------------------------------------------------------\n\nfunction SkeletonColumn() {\n return (\n <div className=\"flex-shrink-0 w-72\">\n <div className=\"h-9 rounded-lg bg-muted animate-pulse mb-3\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-32 rounded-lg bg-muted/60 animate-pulse\" />\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// OrderKanbanView\n// ---------------------------------------------------------------------------\n\nexport function OrderKanbanView() {\n const t = useTranslation()\n const config = useOrdersConfig()\n\n const activeOrders = useOrdersStore((s) => s.activeOrders)\n const activeOrdersLoading = useOrdersStore((s) => s.activeOrdersLoading)\n const fetchActiveOrders = useOrdersStore((s) => s.fetchActiveOrders)\n const advanceOrderStatus = useOrdersStore((s) => s.advanceOrderStatus)\n const selectOrder = useOrdersStore((s) => s.selectOrder)\n\n useEffect(() => {\n fetchActiveOrders()\n }, [fetchActiveOrders])\n\n // Group orders by kanban column\n const grouped = useMemo(() => {\n const map: Record<KanbanColumn, RestaurantOrder[]> = {\n new: [],\n confirmed: [],\n preparing: [],\n ready: [],\n out: [],\n completed: [],\n cancelled: [],\n }\n for (const order of activeOrders) {\n const col = mapToKanbanColumn(order.status)\n map[col].push(order)\n }\n return map\n }, [activeOrders])\n\n // Loading state\n if (activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => (\n <SkeletonColumn key={col} />\n ))}\n </div>\n )\n }\n\n // Empty state\n if (!activeOrdersLoading && activeOrders.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center h-64 text-center\">\n <ClipboardList className=\"h-12 w-12 text-muted-foreground/40 mb-3\" />\n <p className=\"text-sm font-medium text-muted-foreground\">\n {t('orders.kanban.noOrders')}\n </p>\n <p className=\"text-xs text-muted-foreground/70 mt-1\">\n {t('orders.kanban.noOrdersDesc')}\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex gap-4 overflow-x-auto pb-4\">\n {KANBAN_COLUMNS.map((col) => {\n const columnOrders = grouped[col]\n const colConfig = COLUMN_CONFIG[col]\n const label = t(`orders.kanban.column.${col}`)\n const hasNext = (order: RestaurantOrder) =>\n getNextStatus(order.kind, order.status) !== null\n\n return (\n <div key={col} className=\"flex-shrink-0 w-72\">\n {/* Column header */}\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg mb-3\">\n <span className={`h-2.5 w-2.5 rounded-full ${colConfig.color}`} />\n <span className=\"text-sm font-semibold\">{label}</span>\n <span className=\"ml-auto inline-flex items-center justify-center rounded-full bg-muted px-2 py-0.5 text-xs font-medium\">\n {columnOrders.length}\n </span>\n </div>\n\n {/* Cards */}\n <div className=\"space-y-3 max-h-[calc(100vh-16rem)] overflow-y-auto pr-1\">\n {columnOrders.map((order) => (\n <OrderCard\n key={order.id}\n order={order}\n currency={config.currency}\n onSelect={() => selectOrder(order.id)}\n onAdvance={hasNext(order) ? () => advanceOrderStatus(order.id) : undefined}\n />\n ))}\n {columnOrders.length === 0 && (\n <div className=\"text-center py-8 text-sm text-muted-foreground rounded-lg border border-dashed\">\n {t('orders.kanban.noOrders')}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { OrdersContextProvider, type ResolvedOrdersConfig } from '../context'\nimport { OrderKanbanView } from './OrderKanbanView'\nimport type { OrdersDataProvider } from '../data/types'\nimport type { OrdersUIState } from '../store'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\n\nexport function OrdersPage({ config, provider, store, registries }: {\n config: ResolvedOrdersConfig\n provider: OrdersDataProvider\n store: StoreApi<OrdersUIState>\n registries?: PluginRegistryDef[]\n}) {\n return (\n <OrdersContextProvider config={config} provider={provider} store={store}>\n <OrderKanbanView />\n </OrdersContextProvider>\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAgB9C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAeD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAWD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACjC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,cAAc,CAAC,EAAE,YAAY,CAAA;IAC7B,WAAW,CAAC,EAAE,YAAY,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACnC;AAyBD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAgIhF;AAED,cAAc,gBAAgB,CAAA;AAE9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAmB9C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAeD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAWD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACjC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,cAAc,CAAC,EAAE,YAAY,CAAA;IAC7B,WAAW,CAAC,EAAE,YAAY,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACnC;AAyBD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAuIhF;AAED,cAAc,gBAAgB,CAAA;AAE9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -931,6 +931,203 @@ var keetaConnectorDef = {
931
931
  disconnect: () => store3.disconnect(),
932
932
  disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
933
933
  };
934
+ var UBER_EATS_CONNECTOR_ID = "ubereats";
935
+ var SERVICE_MODE_LABELS3 = { DELIVERY: "Entrega", PICKUP: "Retirada" };
936
+ var UBER_EATS_SETTINGS = [
937
+ {
938
+ key: "serviceModes",
939
+ label: "Quais pedidos trazer",
940
+ description: "O Uber Eats entrega e deixa retirar; estes s\xE3o os que viram pedido aqui.",
941
+ type: "multi-select",
942
+ options: [
943
+ { value: "DELIVERY", label: SERVICE_MODE_LABELS3.DELIVERY },
944
+ { value: "PICKUP", label: SERVICE_MODE_LABELS3.PICKUP }
945
+ ],
946
+ requiredToOperate: true,
947
+ defaultValue: ["DELIVERY"]
948
+ },
949
+ AUTO_ACCEPT_SETTING,
950
+ PREP_TIME_SETTING
951
+ ];
952
+ var store4 = createConnectionStore(UBER_EATS_CONNECTOR_ID, {
953
+ settings: UBER_EATS_SETTINGS,
954
+ settingsKeys: ["storeId"]
955
+ });
956
+ var uberEatsConnectorDef = {
957
+ id: UBER_EATS_CONNECTOR_ID,
958
+ hostPluginId: "orders",
959
+ name: "Uber Eats",
960
+ description: "Traga para a cozinha cada pedido feito no Uber Eats, e avise o Uber Eats quando ele for confirmado e sair.",
961
+ icon: "Bike",
962
+ category: "marketplace",
963
+ // Two grants, one merchant-facing: `client_credentials` for the day-to-day
964
+ // calls and `authorization_code` for the store activation. It is the second
965
+ // that this button opens.
966
+ authKind: "oauth",
967
+ // `inbound` is about the data, not who dials: Uber Eats pushes, like Keeta.
968
+ direction: "inbound",
969
+ planes: ["sync"],
970
+ docsUrl: "https://developer.uber.com/docs/eats/introduction",
971
+ // No rateLimit: a budget describes what we spend, and nothing here polls Uber.
972
+ permissions: marketplacePermissions("Uber Eats"),
973
+ fields: [],
974
+ settings: UBER_EATS_SETTINGS,
975
+ howItSyncs: [
976
+ "O Uber Eats avisa assim que um pedido \xE9 feito, e ele entra na tela de Pedidos.",
977
+ "Um pedido j\xE1 trazido n\xE3o entra duas vezes: ele guarda o n\xFAmero que tem no Uber Eats.",
978
+ "Confirmar, despachar ou cancelar aqui \xE9 o que avisa o Uber Eats."
979
+ ],
980
+ ...connectionStatus(
981
+ UBER_EATS_CONNECTOR_ID,
982
+ (connection) => ({
983
+ connected: !!connection?.active,
984
+ detail: serviceModesDetail(SERVICE_MODE_LABELS3, connection?.settings?.serviceModes),
985
+ plane: "sync",
986
+ ...settingsStatus(UBER_EATS_SETTINGS, connection)
987
+ }),
988
+ { store: () => store4 }
989
+ ),
990
+ ...connectionSettings(store4),
991
+ ...connectionRuns(store4),
992
+ startOAuth: fayzConnectorOAuth(UBER_EATS_CONNECTOR_ID),
993
+ saveConnection: async () => {
994
+ await store4.save({ active: true });
995
+ },
996
+ disconnect: () => store4.disconnect(),
997
+ disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
998
+ };
999
+ var RAPPI_CONNECTOR_ID = "rappi";
1000
+ var SERVICE_MODE_LABELS4 = { DELIVERY: "Entrega", PICKUP: "Retirada" };
1001
+ var RAPPI_SETTINGS = [
1002
+ {
1003
+ key: "serviceModes",
1004
+ label: "Quais pedidos trazer",
1005
+ description: "O Rappi entrega e deixa retirar; estes s\xE3o os que viram pedido aqui.",
1006
+ type: "multi-select",
1007
+ options: [
1008
+ { value: "DELIVERY", label: SERVICE_MODE_LABELS4.DELIVERY },
1009
+ { value: "PICKUP", label: SERVICE_MODE_LABELS4.PICKUP }
1010
+ ],
1011
+ requiredToOperate: true,
1012
+ defaultValue: ["DELIVERY"]
1013
+ },
1014
+ AUTO_ACCEPT_SETTING,
1015
+ PREP_TIME_SETTING
1016
+ ];
1017
+ var store5 = createConnectionStore(RAPPI_CONNECTOR_ID, {
1018
+ settings: RAPPI_SETTINGS,
1019
+ settingsKeys: ["storeId"]
1020
+ });
1021
+ var rappiConnectorDef = {
1022
+ id: RAPPI_CONNECTOR_ID,
1023
+ hostPluginId: "orders",
1024
+ name: "Rappi",
1025
+ description: "Traga para a cozinha cada pedido feito no Rappi, e avise o Rappi quando ele for confirmado e sair.",
1026
+ icon: "Bike",
1027
+ category: "marketplace",
1028
+ authKind: "api-key",
1029
+ direction: "inbound",
1030
+ planes: ["sync"],
1031
+ docsUrl: "https://dev-portal.rappi.com/pt/",
1032
+ // No `providerInstall`: there is no panel where the restaurant fetches a key,
1033
+ // because there is no key for the restaurant to fetch.
1034
+ //
1035
+ // No rateLimit: Rappi's own standard is a request every 45 seconds, and that
1036
+ // budget belongs with the job that spends it — which is not written yet.
1037
+ permissions: marketplacePermissions("Rappi"),
1038
+ // Nothing to fill in: the pair is registered in Fayz, and the connect step
1039
+ // says exactly that instead of drawing an empty grid.
1040
+ fields: [],
1041
+ settings: RAPPI_SETTINGS,
1042
+ howItSyncs: [
1043
+ "De tempos em tempos, os pedidos novos do Rappi entram na tela de Pedidos.",
1044
+ "Um pedido j\xE1 trazido n\xE3o entra duas vezes: ele guarda o n\xFAmero que tem no Rappi.",
1045
+ "Confirmar, despachar ou cancelar aqui \xE9 o que avisa o Rappi."
1046
+ ],
1047
+ ...connectionStatus(
1048
+ RAPPI_CONNECTOR_ID,
1049
+ (connection) => ({
1050
+ connected: !!connection?.active,
1051
+ detail: serviceModesDetail(SERVICE_MODE_LABELS4, connection?.settings?.serviceModes),
1052
+ plane: "sync",
1053
+ ...settingsStatus(RAPPI_SETTINGS, connection)
1054
+ }),
1055
+ { store: () => store5 }
1056
+ ),
1057
+ ...connectionSettings(store5),
1058
+ ...connectionRuns(store5),
1059
+ // No `testConnection`, for PlugBank's reason: the credential is not in this
1060
+ // app, so there is nothing this side can validate — and ConnectorDetail
1061
+ // renders the button only when the verb exists.
1062
+ saveConnection: async () => {
1063
+ await store5.save({ active: true });
1064
+ },
1065
+ disconnect: () => store5.disconnect(),
1066
+ disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
1067
+ };
1068
+ var AIQFOME_CONNECTOR_ID = "aiqfome";
1069
+ var SERVICE_MODE_LABELS5 = { DELIVERY: "Entrega", PICKUP: "Retirada" };
1070
+ var AIQFOME_SETTINGS = [
1071
+ {
1072
+ key: "serviceModes",
1073
+ label: "Quais pedidos trazer",
1074
+ description: "O aiqfome entrega e deixa retirar; estes s\xE3o os que viram pedido aqui.",
1075
+ type: "multi-select",
1076
+ options: [
1077
+ { value: "DELIVERY", label: SERVICE_MODE_LABELS5.DELIVERY },
1078
+ { value: "PICKUP", label: SERVICE_MODE_LABELS5.PICKUP }
1079
+ ],
1080
+ requiredToOperate: true,
1081
+ defaultValue: ["DELIVERY"]
1082
+ },
1083
+ AUTO_ACCEPT_SETTING,
1084
+ PREP_TIME_SETTING
1085
+ ];
1086
+ var store6 = createConnectionStore(AIQFOME_CONNECTOR_ID, {
1087
+ settings: AIQFOME_SETTINGS,
1088
+ settingsKeys: ["storeId"]
1089
+ });
1090
+ var aiqfomeConnectorDef = {
1091
+ id: AIQFOME_CONNECTOR_ID,
1092
+ hostPluginId: "orders",
1093
+ name: "aiqfome",
1094
+ description: "Traga para a cozinha cada pedido feito no aiqfome, e avise o aiqfome quando ele for confirmado e sair.",
1095
+ icon: "Bike",
1096
+ category: "marketplace",
1097
+ // Magalu ID: authorization code, `access_token` + `refresh_token`, and the
1098
+ // consent lives on the seller's own panel.
1099
+ authKind: "oauth",
1100
+ direction: "inbound",
1101
+ planes: ["sync"],
1102
+ docsUrl: "https://developer.aiqfome.com/docs/api/versions",
1103
+ // No rateLimit: how often the orders are read is part of what is unverified.
1104
+ permissions: marketplacePermissions("aiqfome"),
1105
+ fields: [],
1106
+ settings: AIQFOME_SETTINGS,
1107
+ howItSyncs: [
1108
+ "Cada pedido novo no aiqfome entra na tela de Pedidos.",
1109
+ "Um pedido j\xE1 trazido n\xE3o entra duas vezes: ele guarda o n\xFAmero que tem no aiqfome.",
1110
+ "Confirmar, despachar ou cancelar aqui \xE9 o que avisa o aiqfome."
1111
+ ],
1112
+ ...connectionStatus(
1113
+ AIQFOME_CONNECTOR_ID,
1114
+ (connection) => ({
1115
+ connected: !!connection?.active,
1116
+ detail: serviceModesDetail(SERVICE_MODE_LABELS5, connection?.settings?.serviceModes),
1117
+ plane: "sync",
1118
+ ...settingsStatus(AIQFOME_SETTINGS, connection)
1119
+ }),
1120
+ { store: () => store6 }
1121
+ ),
1122
+ ...connectionSettings(store6),
1123
+ ...connectionRuns(store6),
1124
+ startOAuth: fayzConnectorOAuth(AIQFOME_CONNECTOR_ID),
1125
+ saveConnection: async () => {
1126
+ await store6.save({ active: true });
1127
+ },
1128
+ disconnect: () => store6.disconnect(),
1129
+ disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
1130
+ };
934
1131
  var DEFAULT_ORDERS_TABLE = "orders";
935
1132
  var DEFAULT_ORDER_ITEMS_TABLE = "order_items";
936
1133
  var ACTIVE_STATUSES = /* @__PURE__ */ new Set(["new", "confirmed", "preparing", "ready", "served", "dispatched"]);
@@ -1280,7 +1477,7 @@ function createFayzOrdersProvider(options = {}) {
1280
1477
  }
1281
1478
 
1282
1479
  // src/index.ts
1283
- var OrdersPage = React.lazy(() => import('./OrdersPage-YTSYE573.js').then((m) => ({ default: m.OrdersPage })));
1480
+ var OrdersPage = React.lazy(() => import('./OrdersPage-KNG54KEB.js').then((m) => ({ default: m.OrdersPage })));
1284
1481
  var DEFAULT_LABELS = {
1285
1482
  pageTitle: "Orders",
1286
1483
  kanban: "Orders",
@@ -1309,14 +1506,15 @@ function resolveConfig(options) {
1309
1506
  function createOrdersPlugin(options) {
1310
1507
  const config = resolveConfig(options);
1311
1508
  const provider = options?.dataProvider ?? createMockOrdersProvider();
1312
- const store4 = createOrdersStore(provider);
1509
+ const store7 = createOrdersStore(provider);
1313
1510
  const PageComponent = () => React.createElement(
1314
1511
  React.Suspense,
1315
1512
  { fallback: null },
1316
- React.createElement(OrdersPage, { config, provider, store: store4, registries: ordersRegistries })
1513
+ React.createElement(OrdersPage, { config, provider, store: store7, registries: ordersRegistries })
1317
1514
  );
1318
1515
  return {
1319
1516
  id: "orders",
1517
+ defaultAgentRole: "operations",
1320
1518
  name: config.labels.pageTitle,
1321
1519
  icon: "ClipboardList",
1322
1520
  version: "1.0.0",
@@ -1416,7 +1614,6 @@ function createOrdersPlugin(options) {
1416
1614
  component: (() => {
1417
1615
  const OrdersSettingsTab = () => React.createElement(PluginSettingsPanel, {
1418
1616
  title: "Orders Settings",
1419
- subtitle: "Order sources and preferences",
1420
1617
  registries: ordersRegistries,
1421
1618
  routeBase: "/settings/orders"
1422
1619
  });
@@ -1430,10 +1627,17 @@ function createOrdersPlugin(options) {
1430
1627
  locales: ordersLocales,
1431
1628
  // Offered regardless of `modules.delivery` — a takeout-only house still takes
1432
1629
  // iFood retirada orders. Control plane only: src/integrations/DELIVERY-MARKETPLACES.md.
1433
- connectors: [ifoodConnectorDef, nineNineFoodConnectorDef, keetaConnectorDef]
1630
+ connectors: [
1631
+ ifoodConnectorDef,
1632
+ nineNineFoodConnectorDef,
1633
+ keetaConnectorDef,
1634
+ uberEatsConnectorDef,
1635
+ rappiConnectorDef,
1636
+ aiqfomeConnectorDef
1637
+ ]
1434
1638
  };
1435
1639
  }
1436
1640
 
1437
- export { AUTO_ACCEPT_SETTING, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS, KEETA_CONNECTOR_ID, KEETA_SETTINGS, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS, PREP_TIME_SETTING, createFayzOrdersProvider, createOrdersPlugin, ifoodConnectorDef, keetaConnectorDef, marketplacePermissions, nineNineFoodConnectorDef };
1641
+ export { AIQFOME_CONNECTOR_ID, AIQFOME_SETTINGS, AUTO_ACCEPT_SETTING, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS, KEETA_CONNECTOR_ID, KEETA_SETTINGS, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS, PREP_TIME_SETTING, RAPPI_CONNECTOR_ID, RAPPI_SETTINGS, UBER_EATS_CONNECTOR_ID, UBER_EATS_SETTINGS, aiqfomeConnectorDef, createFayzOrdersProvider, createOrdersPlugin, ifoodConnectorDef, keetaConnectorDef, marketplacePermissions, nineNineFoodConnectorDef, rappiConnectorDef, uberEatsConnectorDef };
1438
1642
  //# sourceMappingURL=index.js.map
1439
1643
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/data/platform.ts","../src/index.ts"],"names":["store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n if (targetIdx < 0 || 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 { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\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// 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\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(provider: OrdersDataProvider): 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({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\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('Order created')\n return order\n } catch (err: any) {\n toast.error('Failed to create order', { 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 await provider.updateOrderStatus({ orderId, status: nextStatus })\n\n // Refresh active orders\n const activeResult = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: activeResult.data })\n toast.success(`Order advanced to ${nextStatus.replace('_', ' ')}`)\n } catch (err: any) {\n toast.error('Failed to advance order', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n await provider.updateOrderStatus(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('Order status updated')\n } catch (err: any) {\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n await provider.cancelOrder(id, reason)\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('Order cancelled')\n } catch (err: any) {\n toast.error('Failed to cancel order', { 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 added')\n } catch (err: any) {\n toast.error('Failed to add 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 removed')\n } catch (err: any) {\n toast.error('Failed to remove item', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\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 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\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.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.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\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 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\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.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","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 * orders table. When omitted, scoping is left to the runtime/RLS context.\n * Only the orders table carries `tenant_id`; order_items scope via their\n * parent order, so this never touches the order-items table.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: OrderStatus | 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 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 = 'order_items'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\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 itemToRow(item: CreateOrderItemInput, orderId: string, sortOrder: number): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\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,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n modifiers: item.modifiers ?? null,\n kitchen_notes: item.kitchenNotes ?? null,\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 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 ?? undefined,\n kitchenNotes: row.kitchen_notes ?? 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 return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: row.status ?? 'new',\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? undefined,\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? 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 ?? 'pos',\n tableId: row.table_id ?? undefined,\n tableName: row.table_name ?? undefined,\n estimatedMinutes: row.estimated_minutes ?? undefined,\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n 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: 'new',\n source: input.source ?? 'pos',\n table_id: input.tableId ?? null,\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n estimated_minutes: input.estimatedMinutes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n }\n}\n\nfunction updatePayload(data: Partial<RestaurantOrder>): 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 = data.status\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.partyName !== undefined) payload.party_name = data.partyName\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.assigneeName !== undefined) payload.assignee_name = data.assigneeName\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 if (data.source !== undefined) payload.source = data.source\n if (data.tableId !== undefined) payload.table_id = data.tableId\n if (data.tableName !== undefined) payload.table_name = data.tableName\n if (data.estimatedMinutes !== undefined) payload.estimated_minutes = data.estimatedMinutes\n if (data.metadata !== undefined) payload.metadata = data.metadata\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.status && !Array.isArray(query.status)) filters.push({ column: 'status', operator: 'eq', value: query.status })\n if (query.source) filters.push({ column: 'source', operator: 'eq', value: query.source })\n if (query.tableId) filters.push({ column: 'table_id', operator: 'eq', value: query.tableId })\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.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 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 orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: tenantId ? { ...orderPayload(input), tenant_id: tenantId } : orderPayload(input),\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),\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 row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data),\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),\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 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 modifiers: data.modifiers,\n kitchen_notes: data.kitchenNotes,\n metadata: data.metadata,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createMockOrdersProvider } from './data/mock'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\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 }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockOrdersProvider()\n const store = createOrdersStore(provider)\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\n return {\n id: 'orders',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: ['menu'],\n // 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 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 subtitle: 'Order sources and preferences',\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 ],\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: [ifoodConnectorDef, nineNineFoodConnectorDef, keetaConnectorDef],\n }\n}\n\nexport * from './integrations'\n\nexport type { OrdersDataProvider } from './data/types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\nexport type { ResolvedOrdersConfig } from './context'\n"]}
1
+ {"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/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/data/platform.ts","../src/index.ts"],"names":["store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n if (targetIdx < 0 || 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 { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\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// 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\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(provider: OrdersDataProvider): 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({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\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('Order created')\n return order\n } catch (err: any) {\n toast.error('Failed to create order', { 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 await provider.updateOrderStatus({ orderId, status: nextStatus })\n\n // Refresh active orders\n const activeResult = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: activeResult.data })\n toast.success(`Order advanced to ${nextStatus.replace('_', ' ')}`)\n } catch (err: any) {\n toast.error('Failed to advance order', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n await provider.updateOrderStatus(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('Order status updated')\n } catch (err: any) {\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n await provider.cancelOrder(id, reason)\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('Order cancelled')\n } catch (err: any) {\n toast.error('Failed to cancel order', { 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 added')\n } catch (err: any) {\n toast.error('Failed to add 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 removed')\n } catch (err: any) {\n toast.error('Failed to remove item', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\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 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\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.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.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\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 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\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.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 { 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 * orders table. When omitted, scoping is left to the runtime/RLS context.\n * Only the orders table carries `tenant_id`; order_items scope via their\n * parent order, so this never touches the order-items table.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: OrderStatus | 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 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 = 'order_items'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\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 itemToRow(item: CreateOrderItemInput, orderId: string, sortOrder: number): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\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,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n modifiers: item.modifiers ?? null,\n kitchen_notes: item.kitchenNotes ?? null,\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 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 ?? undefined,\n kitchenNotes: row.kitchen_notes ?? 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 return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: row.status ?? 'new',\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? undefined,\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? 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 ?? 'pos',\n tableId: row.table_id ?? undefined,\n tableName: row.table_name ?? undefined,\n estimatedMinutes: row.estimated_minutes ?? undefined,\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n 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: 'new',\n source: input.source ?? 'pos',\n table_id: input.tableId ?? null,\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n estimated_minutes: input.estimatedMinutes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n }\n}\n\nfunction updatePayload(data: Partial<RestaurantOrder>): 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 = data.status\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.partyName !== undefined) payload.party_name = data.partyName\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.assigneeName !== undefined) payload.assignee_name = data.assigneeName\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 if (data.source !== undefined) payload.source = data.source\n if (data.tableId !== undefined) payload.table_id = data.tableId\n if (data.tableName !== undefined) payload.table_name = data.tableName\n if (data.estimatedMinutes !== undefined) payload.estimated_minutes = data.estimatedMinutes\n if (data.metadata !== undefined) payload.metadata = data.metadata\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.status && !Array.isArray(query.status)) filters.push({ column: 'status', operator: 'eq', value: query.status })\n if (query.source) filters.push({ column: 'source', operator: 'eq', value: query.source })\n if (query.tableId) filters.push({ column: 'table_id', operator: 'eq', value: query.tableId })\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.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 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 orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: tenantId ? { ...orderPayload(input), tenant_id: tenantId } : orderPayload(input),\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),\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 row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data),\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),\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 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 modifiers: data.modifiers,\n kitchen_notes: data.kitchenNotes,\n metadata: data.metadata,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createMockOrdersProvider } from './data/mock'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { uberEatsConnectorDef } from './integrations/ubereats/connectorDef'\nimport { rappiConnectorDef } from './integrations/rappi/connectorDef'\nimport { aiqfomeConnectorDef } from './integrations/aiqfome/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\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 }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockOrdersProvider()\n const store = createOrdersStore(provider)\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\n return {\n id: 'orders',\n defaultAgentRole: 'operations',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: ['menu'],\n // 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 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 ],\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\nexport type { OrdersDataProvider } from './data/types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\nexport type { ResolvedOrdersConfig } from './context'\n"]}
@@ -0,0 +1,5 @@
1
+ import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
2
+ export declare const AIQFOME_CONNECTOR_ID = "aiqfome";
3
+ export declare const AIQFOME_SETTINGS: ConnectorSetting[];
4
+ export declare const aiqfomeConnectorDef: ConnectorDefinition;
5
+ //# sourceMappingURL=connectorDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/aiqfome/connectorDef.tsx"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAI7C,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,EAe9C,CAAA;AASD,eAAO,MAAM,mBAAmB,EAAE,mBAwCjC,CAAA"}
@@ -1,5 +1,8 @@
1
1
  export { ifoodConnectorDef, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS } from './ifood/connectorDef';
2
2
  export { nineNineFoodConnectorDef, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS, } from './99food/connectorDef';
3
3
  export { keetaConnectorDef, KEETA_CONNECTOR_ID, KEETA_SETTINGS } from './keeta/connectorDef';
4
+ export { uberEatsConnectorDef, UBER_EATS_CONNECTOR_ID, UBER_EATS_SETTINGS } from './ubereats/connectorDef';
5
+ export { rappiConnectorDef, RAPPI_CONNECTOR_ID, RAPPI_SETTINGS } from './rappi/connectorDef';
6
+ export { aiqfomeConnectorDef, AIQFOME_CONNECTOR_ID, AIQFOME_SETTINGS } from './aiqfome/connectorDef';
4
7
  export { marketplacePermissions, AUTO_ACCEPT_SETTING, PREP_TIME_SETTING } from './shared';
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC1G,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpG,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
2
+ export declare const RAPPI_CONNECTOR_ID = "rappi";
3
+ export declare const RAPPI_SETTINGS: ConnectorSetting[];
4
+ export declare const rappiConnectorDef: ConnectorDefinition;
5
+ //# sourceMappingURL=connectorDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/rappi/connectorDef.tsx"],"names":[],"mappings":"AAeA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAGtB,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAIzC,eAAO,MAAM,cAAc,EAAE,gBAAgB,EAe5C,CAAA;AASD,eAAO,MAAM,iBAAiB,EAAE,mBA8C/B,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
2
+ export declare const UBER_EATS_CONNECTOR_ID = "ubereats";
3
+ export declare const UBER_EATS_SETTINGS: ConnectorSetting[];
4
+ export declare const uberEatsConnectorDef: ConnectorDefinition;
5
+ //# sourceMappingURL=connectorDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/ubereats/connectorDef.tsx"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,sBAAsB,aAAa,CAAA;AAIhD,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAehD,CAAA;AAWD,eAAO,MAAM,oBAAoB,EAAE,mBA2ClC,CAAA"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.10.0",
6
+ "version": "0.11.0",
7
7
  "description": "Fayz SDK — plugin-orders plugin",
8
8
  "type": "module",
9
9
  "sideEffects": false,
@@ -27,9 +27,9 @@
27
27
  "sonner": "^2.0.7"
28
28
  },
29
29
  "dependencies": {
30
- "@fayz-ai/core": "^0.14.0",
31
- "@fayz-ai/sdk": "^0.12.0",
32
- "@fayz-ai/admin": "^0.14.0"
30
+ "@fayz-ai/core": "^0.15.0",
31
+ "@fayz-ai/sdk": "^0.15.0",
32
+ "@fayz-ai/admin": "^0.15.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/react": "^18.3.0",