@fayz-ai/orders 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +38 -2
- package/dist/chunk-A4AGOZHO.js +168 -0
- package/dist/chunk-A4AGOZHO.js.map +1 -0
- package/dist/components/CommercialOrderCard.d.ts +7 -0
- package/dist/components/CommercialOrderCard.d.ts.map +1 -0
- package/dist/components/CommercialOrderCard.js +18 -0
- package/dist/components/CommercialOrderCard.js.map +1 -0
- package/dist/components/OrderBoardCard.d.ts +10 -0
- package/dist/components/OrderBoardCard.d.ts.map +1 -0
- package/dist/components/OrderBoardCard.js +35 -0
- package/dist/components/OrderBoardCard.js.map +1 -0
- package/dist/components/OrderStatusDot.d.ts +8 -0
- package/dist/components/OrderStatusDot.d.ts.map +1 -0
- package/dist/components/OrderStatusDot.js +22 -0
- package/dist/components/OrderStatusDot.js.map +1 -0
- package/dist/components/PaymentStateBadge.d.ts +6 -0
- package/dist/components/PaymentStateBadge.d.ts.map +1 -0
- package/dist/components/PaymentStateBadge.js +27 -0
- package/dist/components/PaymentStateBadge.js.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/mock.js +208 -0
- package/dist/data/mock.js.map +1 -0
- package/dist/data/platform.d.ts +19 -0
- package/dist/data/platform.d.ts.map +1 -0
- package/dist/data/platform.js +362 -0
- package/dist/data/platform.js.map +1 -0
- package/dist/data/provider.d.ts +14 -0
- package/dist/data/provider.d.ts.map +1 -0
- package/dist/data/provider.js +3 -0
- package/dist/data/provider.js.map +1 -0
- package/dist/data/supabase.d.ts +19 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/supabase.js +316 -0
- package/dist/data/supabase.js.map +1 -0
- package/dist/domain/order.d.ts +172 -0
- package/dist/domain/order.d.ts.map +1 -0
- package/dist/domain/order.js +3 -0
- package/dist/domain/order.js.map +1 -0
- package/dist/store.d.ts +30 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +146 -0
- package/dist/store.js.map +1 -0
- package/package.json +52 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/platform.ts"],"names":[],"mappings":"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","file":"platform.js","sourcesContent":["import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport {\n lineTotal, matchesQuery, orderTotals, paginate, summarizeOrders, withCancellationNote,\n type CreateOrderInput, type CreateOrderItemInput, type OrderKind, type OrderQuery, type OrderStatus,\n type RestaurantOrder, type RestaurantOrderItem,\n} from '../domain/order'\nimport type { OrdersDataProvider } from './provider'\n\nexport interface FayzOrdersProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n ordersTable?: string\n orderItemsTable?: string\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * canonical orders and items tables. When omitted, scoping is left to\n * the runtime/RLS context.\n */\n tenantId?: string | (() => string | undefined | null)\n /** Active unit id stamped on new orders and their items when available. */\n unitId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: string | null\n party_id?: string | null\n party_name?: string | null\n assignee_id?: string | null\n assignee_name?: string | null\n location_id?: string | null\n subtotal?: number | string | null\n discount?: number | string | null\n tax?: number | string | null\n total?: number | string | null\n currency?: string | null\n notes?: string | null\n tags?: string[] | null\n source?: string | null\n table_id?: string | null\n table_name?: string | null\n estimated_minutes?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n completed_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n tenant_id?: string | null\n unit_id?: string | null\n order_id?: string | null\n product_id?: string | null\n name?: string | null\n description?: string | null\n quantity?: number | string | null\n unit_price?: number | string | null\n discount?: number | string | null\n total?: number | string | null\n sort_order?: number | null\n modifiers?: string | null\n kitchen_notes?: string | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n}\n\nconst DEFAULT_ORDERS_TABLE = 'orders'\nconst DEFAULT_ORDER_ITEMS_TABLE = 'items'\nconst ORDERS_METADATA_KEY = 'fayzOrders'\nconst RESTAURANT_STATUSES = new Set<OrderStatus>([\n 'new',\n 'confirmed',\n 'preparing',\n 'ready',\n 'served',\n 'picked_up',\n 'dispatched',\n 'delivered',\n 'completed',\n 'cancelled',\n])\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction referenceNumber(): string {\n return `ORD-${Date.now().toString().slice(-6)}`\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nfunction canonicalStatus(status: OrderStatus): 'draft' | 'confirmed' | 'completed' | 'cancelled' {\n if (status === 'new') return 'draft'\n if (status === 'completed' || status === 'cancelled') return status\n return 'confirmed'\n}\n\nfunction restaurantStatus(rowStatus: string | null | undefined, metadata: Record<string, unknown>): OrderStatus {\n // Terminal base states are authoritative even if a legacy/external writer\n // changed the spine without updating the restaurant metadata atomically.\n if (rowStatus === 'completed' || rowStatus === 'cancelled') return rowStatus\n const stored = metadata.restaurantStatus\n if (typeof stored === 'string' && RESTAURANT_STATUSES.has(stored as OrderStatus)) return stored as OrderStatus\n if (rowStatus === 'draft') return 'new'\n if (typeof rowStatus === 'string' && RESTAURANT_STATUSES.has(rowStatus as OrderStatus)) return rowStatus as OrderStatus\n return 'confirmed'\n}\n\nfunction ordersMetadata(metadata: Record<string, unknown> | null | undefined): Record<string, unknown> {\n return objectValue(metadata?.[ORDERS_METADATA_KEY])\n}\n\nfunction mergeOrdersMetadata(\n metadata: Record<string, unknown> | null | undefined,\n patch: Record<string, unknown>,\n): Record<string, unknown> {\n const base = { ...(metadata ?? {}) }\n const current = ordersMetadata(base)\n const definedPatch = Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n )\n const next = { ...current, ...definedPatch }\n return { ...base, [ORDERS_METADATA_KEY]: next }\n}\n\nfunction itemToRow(\n item: CreateOrderItemInput,\n orderId: string,\n sortOrder: number,\n tenantId?: string,\n unitId?: string,\n): Record<string, unknown> {\n return {\n order_id: orderId,\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: sortOrder,\n metadata: mergeOrdersMetadata(undefined, {\n modifiers: item.modifiers ?? null,\n kitchenNotes: item.kitchenNotes ?? null,\n }),\n }\n}\n\nfunction rowToItem(row: OrderItemRow): RestaurantOrderItem {\n const quantity = numberValue(row.quantity)\n const unitPrice = numberValue(row.unit_price)\n const discount = numberValue(row.discount)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n orderId: row.order_id ?? '',\n productId: row.product_id ?? undefined,\n name: row.name ?? 'Item',\n description: row.description ?? undefined,\n quantity,\n unitPrice,\n discount,\n total: numberValue(row.total) || quantity * unitPrice - discount,\n sortOrder: row.sort_order ?? 0,\n modifiers: row.modifiers ?? (typeof restaurant.modifiers === 'string' ? restaurant.modifiers : undefined),\n kitchenNotes: row.kitchen_notes ?? (typeof restaurant.kitchenNotes === 'string' ? restaurant.kitchenNotes : undefined),\n metadata: row.metadata ?? {},\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrder(row: OrderRow, items: RestaurantOrderItem[] = []): RestaurantOrder {\n const subtotal = numberValue(row.subtotal) || items.reduce((sum, item) => sum + item.total, 0)\n const discount = numberValue(row.discount)\n const tax = numberValue(row.tax)\n const restaurant = ordersMetadata(row.metadata)\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: restaurantStatus(row.status, restaurant),\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? (typeof restaurant.partyName === 'string' ? restaurant.partyName : undefined),\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? (typeof restaurant.assigneeName === 'string' ? restaurant.assigneeName : undefined),\n locationId: row.location_id ?? undefined,\n subtotal,\n discount,\n tax,\n total: numberValue(row.total) || subtotal - discount + tax,\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: row.tags ?? [],\n source: row.source ?? (typeof restaurant.source === 'string' ? restaurant.source : 'pos'),\n tableId: row.table_id ?? (typeof restaurant.tableId === 'string' ? restaurant.tableId : undefined),\n tableName: row.table_name ?? (typeof restaurant.tableName === 'string' ? restaurant.tableName : undefined),\n estimatedMinutes: row.estimated_minutes\n ?? (typeof restaurant.estimatedMinutes === 'number' ? restaurant.estimatedMinutes : undefined),\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n unitId: row.unit_id ?? undefined,\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction orderPayload(input: CreateOrderInput): Record<string, unknown> {\n const subtotal = input.items.reduce((sum, item) => sum + lineTotal(item), 0)\n return {\n reference_number: referenceNumber(),\n kind: input.kind,\n status: 'draft',\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n metadata: mergeOrdersMetadata(undefined, {\n source: input.source ?? 'pos',\n tableId: input.tableId ?? null,\n estimatedMinutes: input.estimatedMinutes ?? null,\n restaurantStatus: 'new',\n }),\n }\n}\n\nfunction updatePayload(\n data: Partial<RestaurantOrder>,\n existingMetadata?: Record<string, unknown>,\n): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.referenceNumber !== undefined) payload.reference_number = data.referenceNumber\n if (data.kind !== undefined) payload.kind = data.kind\n if (data.status !== undefined) payload.status = canonicalStatus(data.status)\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.locationId !== undefined) payload.location_id = data.locationId\n if (data.subtotal !== undefined) payload.subtotal = data.subtotal\n if (data.discount !== undefined) payload.discount = data.discount\n if (data.tax !== undefined) payload.tax = data.tax\n if (data.total !== undefined) payload.total = data.total\n if (data.currency !== undefined) payload.currency = data.currency\n if (data.notes !== undefined) payload.notes = data.notes\n if (data.tags !== undefined) payload.tags = data.tags\n const metadataBase = data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata\n const metadataPatch = {\n partyName: data.partyName,\n assigneeName: data.assigneeName,\n source: data.source,\n tableId: data.tableId,\n tableName: data.tableName,\n estimatedMinutes: data.estimatedMinutes,\n restaurantStatus: data.status,\n }\n if (data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)) {\n payload.metadata = mergeOrdersMetadata(metadataBase, metadataPatch)\n }\n if (data.completedAt !== undefined) payload.completed_at = data.completedAt\n return payload\n}\n\nfunction filtersFromQuery(query: OrderQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = []\n if (query.kind && !Array.isArray(query.kind)) filters.push({ column: 'kind', operator: 'eq', value: query.kind })\n if (query.assigneeId) filters.push({ column: 'assignee_id', operator: 'eq', value: query.assigneeId })\n return filters\n}\n\nexport function createFayzOrdersProvider(options: FayzOrdersProviderOptions = {}): OrdersDataProvider {\n const client = createFayzClient(options)\n const ordersTable = options.ordersTable ?? DEFAULT_ORDERS_TABLE\n const orderItemsTable = options.orderItemsTable ?? DEFAULT_ORDER_ITEMS_TABLE\n const tableOptions = { projectId: options.projectId, schema: options.schema, runtime: options.runtime }\n\n function resolveTenant(): string | undefined {\n const value = typeof options.tenantId === 'function' ? options.tenantId() : options.tenantId\n return value ?? undefined\n }\n\n function resolveUnit(): string | undefined {\n const value = typeof options.unitId === 'function' ? options.unitId() : options.unitId\n return value ?? undefined\n }\n\n function withTenant(filters: FayzTableFilter[]): FayzTableFilter[] {\n const tenantId = resolveTenant()\n return tenantId ? [{ column: 'tenant_id', operator: 'eq', value: tenantId }, ...filters] : filters\n }\n\n async function listItemRows(orderIds: string[]): Promise<OrderItemRow[]> {\n if (orderIds.length === 0) return []\n const rows: OrderItemRow[] = []\n await Promise.all(orderIds.map(async (orderId) => {\n const response = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'order_id', operator: 'eq', value: orderId }],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 200,\n })\n rows.push(...response.rows)\n }))\n return rows\n }\n\n async function hydrate(rows: OrderRow[]): Promise<RestaurantOrder[]> {\n const itemRows = await listItemRows(rows.map((row) => row.id))\n const byOrder = new Map<string, RestaurantOrderItem[]>()\n for (const itemRow of itemRows) {\n const item = rowToItem(itemRow)\n const list = byOrder.get(item.orderId) ?? []\n list.push(item)\n byOrder.set(item.orderId, list)\n }\n return rows.map((row) => rowToOrder(row, byOrder.get(row.id) ?? []))\n }\n\n async function listOrders(query: OrderQuery = {}): Promise<RestaurantOrder[]> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'created_at',\n sortDirection: 'desc',\n limit: 500,\n })\n return (await hydrate(response.rows)).filter((order) => matchesQuery(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 async function updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n const existing = await getById(id)\n const row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data, existing?.metadata),\n })\n return (await getById(row.id)) ?? rowToOrder(row)\n }\n\n return {\n async getOrders(query) {\n return paginate(await listOrders(query), query.page, query.pageSize)\n },\n\n async getOrderById(id) {\n return getById(id)\n },\n\n async createOrder(input) {\n const tenantId = resolveTenant()\n const unitId = resolveUnit()\n const orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: {\n ...orderPayload(input),\n ...(tenantId ? { tenant_id: tenantId } : {}),\n ...(unitId ? { unit_id: unitId } : {}),\n },\n })\n await Promise.all(input.items.map((item, index) => client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderRow.id, index, tenantId, unitId),\n })))\n return (await getById(orderRow.id)) ?? rowToOrder(orderRow)\n },\n\n async updateOrderStatus(input) {\n const completedAt = input.status === 'completed' ? nowIso() : undefined\n return updateOrder(input.orderId, { status: input.status, completedAt })\n },\n\n updateOrder,\n\n async cancelOrder(id, reason) {\n const order = await getById(id)\n await updateOrder(id, { status: 'cancelled', notes: withCancellationNote(order?.notes, reason) })\n },\n\n async addOrderItem(orderId, item) {\n const order = await getById(orderId)\n const row = await client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderId, order?.items.length ?? 0, order?.tenantId, order?.unitId ?? resolveUnit()),\n })\n const created = rowToItem(row)\n await updateOrder(orderId, orderTotals([...(order?.items ?? []), created], order ?? {}))\n return created\n },\n\n async removeOrderItem(itemId) {\n const orders = await listOrders()\n const order = orders.find((candidate) => candidate.items.some((orderItem) => orderItem.id === itemId))\n await client.data.deleteRows({ ...tableOptions, table: orderItemsTable, rows: [{ id: itemId }] })\n if (order) {\n await updateOrder(order.id, orderTotals(order.items.filter((item) => item.id !== itemId), order))\n }\n },\n\n async updateOrderItem(itemId, data) {\n const existingResult = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'id', operator: 'eq', value: itemId }],\n limit: 1,\n })\n const existingMetadata = existingResult.rows[0]?.metadata ?? undefined\n const metadataPatch = {\n modifiers: data.modifiers,\n kitchenNotes: data.kitchenNotes,\n }\n const row = await client.data.updateRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n primaryKeys: { id: itemId },\n row: {\n product_id: data.productId,\n name: data.name,\n description: data.description,\n quantity: data.quantity,\n unit_price: data.unitPrice,\n discount: data.discount,\n total: data.total,\n sort_order: data.sortOrder,\n metadata: data.metadata !== undefined || Object.values(metadataPatch).some((value) => value !== undefined)\n ? mergeOrdersMetadata(\n data.metadata !== undefined\n ? { ...(existingMetadata ?? {}), ...data.metadata }\n : existingMetadata,\n metadataPatch,\n )\n : undefined,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarizeOrders(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CreateOrderInput, CreateOrderItemInput, DateRange, OrderQuery, OrdersSummary, PaginatedResult, RestaurantOrder, RestaurantOrderItem, UpdateOrderStatusInput } from '../domain/order';
|
|
2
|
+
export interface OrdersDataProvider {
|
|
3
|
+
getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>>;
|
|
4
|
+
getOrderById(id: string): Promise<RestaurantOrder | null>;
|
|
5
|
+
createOrder(input: CreateOrderInput): Promise<RestaurantOrder>;
|
|
6
|
+
updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder>;
|
|
7
|
+
updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder>;
|
|
8
|
+
cancelOrder(id: string, reason?: string): Promise<void>;
|
|
9
|
+
addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem>;
|
|
10
|
+
removeOrderItem(itemId: string): Promise<void>;
|
|
11
|
+
updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem>;
|
|
12
|
+
getSummary(dateRange?: DateRange): Promise<OrdersSummary>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/data/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAAE,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAC7F,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAC7D,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAA;IACvE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;IACzD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC9D,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC1E,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IACjF,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACvF,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACjG,UAAU,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAC1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"provider.js"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OrdersDataProvider } from './provider';
|
|
2
|
+
export interface SupabaseOrdersWriteOptions {
|
|
3
|
+
/** The org stamped on a new order; RLS checks it again. Defaults to the active tenant. */
|
|
4
|
+
tenantId?: () => string | undefined | null;
|
|
5
|
+
unitId?: () => string | undefined | null;
|
|
6
|
+
/** `public.orders.channel` accepts only balcao · shop · dine_in · delivery, so takeout must pick one. */
|
|
7
|
+
channelFor?: (kind: string) => string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface SupabaseOrdersProviderOptions {
|
|
10
|
+
/** Restrict the list to these kinds. Omitted means all of them. */
|
|
11
|
+
kinds?: string[];
|
|
12
|
+
/** Restrict the list to one channel (balcao · shop · dine_in · delivery). */
|
|
13
|
+
channel?: string;
|
|
14
|
+
/** Present makes the provider writable; without it every mutation refuses. */
|
|
15
|
+
writes?: SupabaseOrdersWriteOptions;
|
|
16
|
+
}
|
|
17
|
+
/** Reads `public.v_orders` (delivery state derived) joined with `v_order_payment_status`. */
|
|
18
|
+
export declare function createSupabaseOrdersProvider(options?: SupabaseOrdersProviderOptions): OrdersDataProvider;
|
|
19
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/data/supabase.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAiEpD,MAAM,WAAW,0BAA0B;IACzC,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IAC1C,MAAM,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACxC,yGAAyG;IACzG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAClD;AAED,MAAM,WAAW,6BAA6B;IAC5C,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,0BAA0B,CAAA;CACpC;AAyGD,6FAA6F;AAC7F,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,6BAA6B,GAAG,kBAAkB,CAkQxG"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { summarizeOrders, lineTotal } from '../chunk-A4AGOZHO.js';
|
|
2
|
+
import { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core';
|
|
3
|
+
|
|
4
|
+
var ORDERS_VIEW = "v_orders";
|
|
5
|
+
var ORDERS_TABLE = "orders";
|
|
6
|
+
var ITEMS_TABLE = "items";
|
|
7
|
+
var PEOPLE_TABLE = "people";
|
|
8
|
+
var PAYMENT_STATUS_VIEW = "v_order_payment_status";
|
|
9
|
+
var ORDER_COLUMNS = "id, tenant_id, unit_id, kind, channel, status, reference_number, party_id, assignee_id, subtotal, discount, tax, total, currency, notes, created_at, updated_at, completed_at, fulfillment_status, metadata";
|
|
10
|
+
var ITEM_COLUMNS = "id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at";
|
|
11
|
+
var READ_ONLY = "This provider reads the core order archetype; pass `writes` to let the app that owns the flow create and edit them.";
|
|
12
|
+
var DEFAULT_CHANNELS = {
|
|
13
|
+
dine_in: "dine_in",
|
|
14
|
+
delivery: "delivery",
|
|
15
|
+
takeout: "balcao"
|
|
16
|
+
};
|
|
17
|
+
function searchTerm(raw) {
|
|
18
|
+
return (raw ?? "").replace(/[,()%*\\"]/g, " ").trim();
|
|
19
|
+
}
|
|
20
|
+
function num(value) {
|
|
21
|
+
return Number(value) || 0;
|
|
22
|
+
}
|
|
23
|
+
function text(meta, key) {
|
|
24
|
+
return typeof meta[key] === "string" ? meta[key] : void 0;
|
|
25
|
+
}
|
|
26
|
+
function itemMetadata(item) {
|
|
27
|
+
return {
|
|
28
|
+
...item.modifiers ? { modifiers: item.modifiers } : {},
|
|
29
|
+
...item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function toItem(row) {
|
|
33
|
+
const meta = row.metadata ?? {};
|
|
34
|
+
return {
|
|
35
|
+
id: row.id,
|
|
36
|
+
orderId: row.order_id,
|
|
37
|
+
productId: row.product_id ?? void 0,
|
|
38
|
+
name: row.name ?? "",
|
|
39
|
+
description: row.description ?? void 0,
|
|
40
|
+
quantity: num(row.quantity),
|
|
41
|
+
unitPrice: num(row.unit_price),
|
|
42
|
+
discount: num(row.discount),
|
|
43
|
+
total: num(row.total),
|
|
44
|
+
sortOrder: row.sort_order ?? 0,
|
|
45
|
+
modifiers: text(meta, "modifiers"),
|
|
46
|
+
kitchenNotes: text(meta, "kitchenNotes"),
|
|
47
|
+
metadata: meta,
|
|
48
|
+
createdAt: row.created_at
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function toOrder(row, items, names, payment, shipmentStatuses = []) {
|
|
52
|
+
const meta = row.metadata ?? {};
|
|
53
|
+
return {
|
|
54
|
+
id: row.id,
|
|
55
|
+
referenceNumber: row.reference_number ?? row.id.slice(0, 8),
|
|
56
|
+
kind: row.kind,
|
|
57
|
+
status: row.status,
|
|
58
|
+
partyId: row.party_id ?? void 0,
|
|
59
|
+
partyName: row.party_id ? names.get(row.party_id) : void 0,
|
|
60
|
+
assigneeId: row.assignee_id ?? void 0,
|
|
61
|
+
assigneeName: row.assignee_id ? names.get(row.assignee_id) : void 0,
|
|
62
|
+
subtotal: num(row.subtotal),
|
|
63
|
+
discount: num(row.discount),
|
|
64
|
+
tax: num(row.tax),
|
|
65
|
+
total: num(row.total),
|
|
66
|
+
currency: row.currency ?? "BRL",
|
|
67
|
+
notes: row.notes ?? void 0,
|
|
68
|
+
tags: [],
|
|
69
|
+
// A counter sale has no channel, and 'balcao' is what that means.
|
|
70
|
+
source: row.channel ?? "balcao",
|
|
71
|
+
// Not location_id: that is the branch (`app.units`); a table has no row of its own yet.
|
|
72
|
+
tableId: text(meta, "tableId"),
|
|
73
|
+
estimatedMinutes: typeof meta.estimatedMinutes === "number" ? meta.estimatedMinutes : void 0,
|
|
74
|
+
items,
|
|
75
|
+
metadata: {
|
|
76
|
+
...meta,
|
|
77
|
+
channel: row.channel ?? null,
|
|
78
|
+
fulfillmentStatus: row.fulfillment_status ?? null,
|
|
79
|
+
paymentStatus: payment?.status ?? "none",
|
|
80
|
+
invoicedAmount: num(payment?.total_amount),
|
|
81
|
+
paidAmount: num(payment?.paid_amount),
|
|
82
|
+
shipmentStatuses
|
|
83
|
+
},
|
|
84
|
+
tenantId: row.tenant_id,
|
|
85
|
+
unitId: row.unit_id ?? void 0,
|
|
86
|
+
createdAt: row.created_at,
|
|
87
|
+
updatedAt: row.updated_at,
|
|
88
|
+
completedAt: row.completed_at ?? void 0
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function db() {
|
|
92
|
+
const client = getSupabaseClientOptional();
|
|
93
|
+
if (!client) throw new Error("Supabase client is not configured");
|
|
94
|
+
return client;
|
|
95
|
+
}
|
|
96
|
+
function fail(error) {
|
|
97
|
+
if (error) throw new Error(error.message);
|
|
98
|
+
}
|
|
99
|
+
function createSupabaseOrdersProvider(options) {
|
|
100
|
+
const writes = options?.writes;
|
|
101
|
+
function requireWrites() {
|
|
102
|
+
if (!writes) throw new Error(READ_ONLY);
|
|
103
|
+
return writes;
|
|
104
|
+
}
|
|
105
|
+
async function load(query, onlyId) {
|
|
106
|
+
const client = db();
|
|
107
|
+
let q = client.from(ORDERS_VIEW).select(ORDER_COLUMNS, { count: "exact" }).order("created_at", { ascending: false });
|
|
108
|
+
if (onlyId) q = q.eq("id", onlyId);
|
|
109
|
+
if (options?.kinds?.length) q = q.in("kind", options.kinds);
|
|
110
|
+
if (options?.channel) q = q.eq("channel", options.channel);
|
|
111
|
+
if (query?.kind) q = Array.isArray(query.kind) ? q.in("kind", query.kind) : q.eq("kind", query.kind);
|
|
112
|
+
if (query?.status) q = Array.isArray(query.status) ? q.in("status", query.status) : q.eq("status", query.status);
|
|
113
|
+
if (query?.channel) q = q.eq("channel", query.channel);
|
|
114
|
+
if (query?.excludeKinds?.length) q = q.not("kind", "in", `(${query.excludeKinds.join(",")})`);
|
|
115
|
+
if (query?.fulfillmentStatus) q = q.eq("fulfillment_status", query.fulfillmentStatus);
|
|
116
|
+
if (query?.tableId) q = q.eq("metadata->>tableId", query.tableId);
|
|
117
|
+
if (query?.assigneeId) q = q.eq("assignee_id", query.assigneeId);
|
|
118
|
+
if (query?.dateRange) q = q.gte("created_at", query.dateRange.from).lte("created_at", query.dateRange.to);
|
|
119
|
+
const term = searchTerm(query?.search);
|
|
120
|
+
if (term) {
|
|
121
|
+
const { data: named } = await client.from(PEOPLE_TABLE).select("id").ilike("name", `%${term}%`).limit(50);
|
|
122
|
+
const partyIds = (named ?? []).map((p) => p.id);
|
|
123
|
+
q = q.or([
|
|
124
|
+
`reference_number.ilike.%${term}%`,
|
|
125
|
+
...partyIds.length ? [`party_id.in.(${partyIds.join(",")})`] : []
|
|
126
|
+
].join(","));
|
|
127
|
+
}
|
|
128
|
+
const pageSize = query?.pageSize ?? 100;
|
|
129
|
+
const from = ((query?.page ?? 1) - 1) * pageSize;
|
|
130
|
+
q = q.range(from, from + pageSize - 1);
|
|
131
|
+
const { data, error, count } = await q;
|
|
132
|
+
fail(error);
|
|
133
|
+
const rows = data ?? [];
|
|
134
|
+
if (rows.length === 0) return { data: [], total: count ?? 0 };
|
|
135
|
+
const ids = rows.map((r) => r.id);
|
|
136
|
+
const personIds = [...new Set(rows.flatMap((r) => [r.party_id, r.assignee_id]).filter((id) => !!id))];
|
|
137
|
+
const withItems = query?.withItems !== false;
|
|
138
|
+
const [people, payments, items, shipments] = await Promise.all([
|
|
139
|
+
client.from(PEOPLE_TABLE).select("id, name").in("id", personIds),
|
|
140
|
+
client.from(PAYMENT_STATUS_VIEW).select("order_id, status, total_amount, paid_amount").in("order_id", ids),
|
|
141
|
+
withItems ? client.from(ITEMS_TABLE).select(ITEM_COLUMNS).in("order_id", ids).order("sort_order") : Promise.resolve({ data: [] }),
|
|
142
|
+
client.from("fulfillments").select("order_id, status").in("order_id", ids).in("kind", ["shipment", "pickup"])
|
|
143
|
+
]);
|
|
144
|
+
const shipmentsByOrder = /* @__PURE__ */ new Map();
|
|
145
|
+
for (const row of shipments.data ?? []) {
|
|
146
|
+
shipmentsByOrder.set(row.order_id, [...shipmentsByOrder.get(row.order_id) ?? [], row.status]);
|
|
147
|
+
}
|
|
148
|
+
const names = new Map((people.data ?? []).map((p) => [p.id, p.name]));
|
|
149
|
+
const paymentByOrder = new Map((payments.data ?? []).map((p) => [p.order_id, p]));
|
|
150
|
+
const itemsByOrder = /* @__PURE__ */ new Map();
|
|
151
|
+
for (const row of items.data ?? []) {
|
|
152
|
+
const list = itemsByOrder.get(row.order_id) ?? [];
|
|
153
|
+
list.push(toItem(row));
|
|
154
|
+
itemsByOrder.set(row.order_id, list);
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
data: rows.map((r) => toOrder(r, itemsByOrder.get(r.id) ?? [], names, paymentByOrder.get(r.id), shipmentsByOrder.get(r.id))),
|
|
158
|
+
total: count ?? rows.length
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
async function loadOne(id) {
|
|
162
|
+
return (await load(void 0, id)).data[0] ?? null;
|
|
163
|
+
}
|
|
164
|
+
async function recalc(orderId) {
|
|
165
|
+
const client = db();
|
|
166
|
+
const { data, error } = await client.from(ITEMS_TABLE).select("total").eq("order_id", orderId);
|
|
167
|
+
fail(error);
|
|
168
|
+
const subtotal = (data ?? []).reduce((sum, r) => sum + num(r.total), 0);
|
|
169
|
+
const { error: updateError } = await client.from(ORDERS_TABLE).update({ subtotal, total: subtotal }).eq("id", orderId);
|
|
170
|
+
fail(updateError);
|
|
171
|
+
}
|
|
172
|
+
async function orderIdOfItem(itemId) {
|
|
173
|
+
const { data, error } = await db().from(ITEMS_TABLE).select("order_id").eq("id", itemId).single();
|
|
174
|
+
fail(error);
|
|
175
|
+
return data.order_id;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
getOrders: (query) => load(query),
|
|
179
|
+
getOrderById: loadOne,
|
|
180
|
+
async createOrder(input) {
|
|
181
|
+
const w = requireWrites();
|
|
182
|
+
const client = db();
|
|
183
|
+
const tenantId = (w.tenantId ?? getActiveTenantId)();
|
|
184
|
+
if (!tenantId) throw new Error("No active organization: an order cannot be opened without one");
|
|
185
|
+
const channel = (w.channelFor ?? ((kind) => DEFAULT_CHANNELS[kind]))(input.kind);
|
|
186
|
+
const subtotal = input.items.reduce((sum, item) => sum + lineTotal(item), 0);
|
|
187
|
+
const { data: order, error } = await client.from(ORDERS_TABLE).insert({
|
|
188
|
+
tenant_id: tenantId,
|
|
189
|
+
unit_id: w.unitId?.() ?? null,
|
|
190
|
+
kind: input.kind,
|
|
191
|
+
status: "new",
|
|
192
|
+
...channel ? { channel } : {},
|
|
193
|
+
// Without a party, `trg_orders_require_party` fills in the tenant's walk-in party.
|
|
194
|
+
...input.partyId ? { party_id: input.partyId } : {},
|
|
195
|
+
...input.assigneeId ? { assignee_id: input.assigneeId } : {},
|
|
196
|
+
...input.notes ? { notes: input.notes } : {},
|
|
197
|
+
subtotal,
|
|
198
|
+
total: subtotal,
|
|
199
|
+
currency: "BRL",
|
|
200
|
+
metadata: {
|
|
201
|
+
...input.tableId ? { tableId: input.tableId } : {},
|
|
202
|
+
...input.estimatedMinutes ? { estimatedMinutes: input.estimatedMinutes } : {}
|
|
203
|
+
}
|
|
204
|
+
}).select("id").single();
|
|
205
|
+
fail(error);
|
|
206
|
+
const orderId = order.id;
|
|
207
|
+
if (input.items.length) {
|
|
208
|
+
const { error: itemsError } = await client.from(ITEMS_TABLE).insert(
|
|
209
|
+
input.items.map((item, index) => ({
|
|
210
|
+
order_id: orderId,
|
|
211
|
+
product_id: item.productId ?? null,
|
|
212
|
+
name: item.name,
|
|
213
|
+
quantity: item.quantity,
|
|
214
|
+
unit_price: item.unitPrice,
|
|
215
|
+
discount: item.discount ?? 0,
|
|
216
|
+
total: lineTotal(item),
|
|
217
|
+
sort_order: index,
|
|
218
|
+
metadata: itemMetadata(item)
|
|
219
|
+
}))
|
|
220
|
+
);
|
|
221
|
+
fail(itemsError);
|
|
222
|
+
}
|
|
223
|
+
const created = await loadOne(orderId);
|
|
224
|
+
if (!created) throw new Error("The order was created but is not readable \u2014 check the orders.read permission");
|
|
225
|
+
return created;
|
|
226
|
+
},
|
|
227
|
+
async updateOrderStatus(input) {
|
|
228
|
+
requireWrites();
|
|
229
|
+
const { error } = await db().from(ORDERS_TABLE).update({ status: input.status }).eq("id", input.orderId);
|
|
230
|
+
fail(error);
|
|
231
|
+
const order = await loadOne(input.orderId);
|
|
232
|
+
if (!order) throw new Error("Order not found after the status change");
|
|
233
|
+
return order;
|
|
234
|
+
},
|
|
235
|
+
async updateOrder(id, data) {
|
|
236
|
+
requireWrites();
|
|
237
|
+
const patch = {};
|
|
238
|
+
if (data.status !== void 0) patch.status = data.status;
|
|
239
|
+
if (data.notes !== void 0) patch.notes = data.notes;
|
|
240
|
+
if (data.partyId !== void 0) patch.party_id = data.partyId;
|
|
241
|
+
if (data.assigneeId !== void 0) patch.assignee_id = data.assigneeId;
|
|
242
|
+
if (data.discount !== void 0) patch.discount = data.discount;
|
|
243
|
+
if (data.tax !== void 0) patch.tax = data.tax;
|
|
244
|
+
if (Object.keys(patch).length) {
|
|
245
|
+
const { error } = await db().from(ORDERS_TABLE).update(patch).eq("id", id);
|
|
246
|
+
fail(error);
|
|
247
|
+
}
|
|
248
|
+
const order = await loadOne(id);
|
|
249
|
+
if (!order) throw new Error("Order not found after the update");
|
|
250
|
+
return order;
|
|
251
|
+
},
|
|
252
|
+
async cancelOrder(id, reason) {
|
|
253
|
+
requireWrites();
|
|
254
|
+
const { error } = await db().from(ORDERS_TABLE).update({ status: "cancelled", ...reason ? { notes: reason } : {} }).eq("id", id);
|
|
255
|
+
fail(error);
|
|
256
|
+
},
|
|
257
|
+
async addOrderItem(orderId, item) {
|
|
258
|
+
requireWrites();
|
|
259
|
+
const client = db();
|
|
260
|
+
const { count } = await client.from(ITEMS_TABLE).select("id", { count: "exact", head: true }).eq("order_id", orderId);
|
|
261
|
+
const { data, error } = await client.from(ITEMS_TABLE).insert({
|
|
262
|
+
order_id: orderId,
|
|
263
|
+
product_id: item.productId ?? null,
|
|
264
|
+
name: item.name,
|
|
265
|
+
quantity: item.quantity,
|
|
266
|
+
unit_price: item.unitPrice,
|
|
267
|
+
discount: item.discount ?? 0,
|
|
268
|
+
total: lineTotal(item),
|
|
269
|
+
sort_order: count ?? 0,
|
|
270
|
+
metadata: itemMetadata(item)
|
|
271
|
+
}).select(ITEM_COLUMNS).single();
|
|
272
|
+
fail(error);
|
|
273
|
+
await recalc(orderId);
|
|
274
|
+
return toItem(data);
|
|
275
|
+
},
|
|
276
|
+
async removeOrderItem(itemId) {
|
|
277
|
+
requireWrites();
|
|
278
|
+
const orderId = await orderIdOfItem(itemId);
|
|
279
|
+
const { error } = await db().from(ITEMS_TABLE).delete().eq("id", itemId);
|
|
280
|
+
fail(error);
|
|
281
|
+
await recalc(orderId);
|
|
282
|
+
},
|
|
283
|
+
async updateOrderItem(itemId, data) {
|
|
284
|
+
requireWrites();
|
|
285
|
+
const client = db();
|
|
286
|
+
const orderId = await orderIdOfItem(itemId);
|
|
287
|
+
const patch = {};
|
|
288
|
+
if (data.name !== void 0) patch.name = data.name;
|
|
289
|
+
if (data.quantity !== void 0) patch.quantity = data.quantity;
|
|
290
|
+
if (data.unitPrice !== void 0) patch.unit_price = data.unitPrice;
|
|
291
|
+
if (data.discount !== void 0) patch.discount = data.discount;
|
|
292
|
+
if (data.quantity !== void 0 || data.unitPrice !== void 0 || data.discount !== void 0) {
|
|
293
|
+
const { data: current, error: readError } = await client.from(ITEMS_TABLE).select("quantity, unit_price, discount").eq("id", itemId).single();
|
|
294
|
+
fail(readError);
|
|
295
|
+
const row = current;
|
|
296
|
+
patch.total = lineTotal({
|
|
297
|
+
quantity: num(data.quantity ?? row.quantity),
|
|
298
|
+
unitPrice: num(data.unitPrice ?? row.unit_price),
|
|
299
|
+
discount: num(data.discount ?? row.discount)
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const { data: updated, error } = await client.from(ITEMS_TABLE).update(patch).eq("id", itemId).select(ITEM_COLUMNS).single();
|
|
303
|
+
fail(error);
|
|
304
|
+
await recalc(orderId);
|
|
305
|
+
return toItem(updated);
|
|
306
|
+
},
|
|
307
|
+
async getSummary(dateRange) {
|
|
308
|
+
const page = await load({ pageSize: 500, ...dateRange ? { dateRange } : {} });
|
|
309
|
+
return summarizeOrders(page.data, dateRange);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export { createSupabaseOrdersProvider };
|
|
315
|
+
//# sourceMappingURL=supabase.js.map
|
|
316
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/supabase.ts"],"names":[],"mappings":"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","file":"supabase.js","sourcesContent":["import type { SupabaseClient } from '@supabase/supabase-js'\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport {\n lineTotal, summarizeOrders,\n type CreateOrderItemInput, type OrderKind, type OrderQuery, type OrderStatus, type PaginatedResult,\n type RestaurantOrder, type RestaurantOrderItem,\n} from '../domain/order'\nimport type { OrdersDataProvider } from './provider'\n\nconst ORDERS_VIEW = 'v_orders'\nconst ORDERS_TABLE = 'orders'\nconst ITEMS_TABLE = 'items'\nconst PEOPLE_TABLE = 'people'\nconst PAYMENT_STATUS_VIEW = 'v_order_payment_status'\n\nconst ORDER_COLUMNS = 'id, tenant_id, unit_id, kind, channel, status, reference_number, party_id, assignee_id, subtotal, discount, tax, total, currency, notes, created_at, updated_at, completed_at, fulfillment_status, metadata'\nconst ITEM_COLUMNS = 'id, order_id, product_id, name, description, quantity, unit_price, discount, total, sort_order, metadata, created_at'\n\nconst READ_ONLY = 'This provider reads the core order archetype; pass `writes` to let the app that owns the flow create and edit them.'\n\ntype Numeric = number | string | null\n\ninterface OrderRow {\n id: string\n tenant_id: string\n unit_id: string | null\n kind: OrderKind\n channel: string | null\n status: OrderStatus\n reference_number: string | null\n party_id: string | null\n assignee_id: string | null\n subtotal: Numeric\n discount: Numeric\n tax: Numeric\n total: Numeric\n currency: string | null\n notes: string | null\n created_at: string\n updated_at: string\n completed_at: string | null\n fulfillment_status: string | null\n metadata: Record<string, unknown> | null\n}\n\ninterface ItemRow {\n id: string\n order_id: string\n product_id: string | null\n name: string | null\n description: string | null\n quantity: Numeric\n unit_price: Numeric\n discount: Numeric\n total: Numeric\n sort_order: number | null\n metadata: Record<string, unknown> | null\n created_at: string\n}\n\ninterface PaymentStatusRow {\n order_id: string\n status: string | null\n total_amount: Numeric\n paid_amount: Numeric\n}\n\ninterface PersonRow {\n id: string\n name: string\n}\n\nexport interface SupabaseOrdersWriteOptions {\n /** The org stamped on a new order; RLS checks it again. Defaults to the active tenant. */\n tenantId?: () => string | undefined | null\n unitId?: () => string | undefined | null\n /** `public.orders.channel` accepts only balcao · shop · dine_in · delivery, so takeout must pick one. */\n channelFor?: (kind: string) => string | undefined\n}\n\nexport interface SupabaseOrdersProviderOptions {\n /** Restrict the list to these kinds. Omitted means all of them. */\n kinds?: string[]\n /** Restrict the list to one channel (balcao · shop · dine_in · delivery). */\n channel?: string\n /** Present makes the provider writable; without it every mutation refuses. */\n writes?: SupabaseOrdersWriteOptions\n}\n\nconst DEFAULT_CHANNELS: Record<string, string> = {\n dine_in: 'dine_in',\n delivery: 'delivery',\n takeout: 'balcao',\n}\n\n/** PostgREST reads `,` `(` `)` as syntax inside `or=`; a search term is never that. */\nfunction searchTerm(raw?: string): string {\n return (raw ?? '').replace(/[,()%*\\\\\"]/g, ' ').trim()\n}\n\nfunction num(value: Numeric | undefined): number {\n return Number(value) || 0\n}\n\nfunction text(meta: Record<string, unknown>, key: string): string | undefined {\n return typeof meta[key] === 'string' ? (meta[key] as string) : undefined\n}\n\nfunction itemMetadata(item: CreateOrderItemInput): Record<string, unknown> {\n return {\n ...(item.modifiers ? { modifiers: item.modifiers } : {}),\n ...(item.kitchenNotes ? { kitchenNotes: item.kitchenNotes } : {}),\n }\n}\n\nfunction toItem(row: ItemRow): RestaurantOrderItem {\n const meta = row.metadata ?? {}\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? undefined,\n name: row.name ?? '',\n description: row.description ?? undefined,\n quantity: num(row.quantity),\n unitPrice: num(row.unit_price),\n discount: num(row.discount),\n total: num(row.total),\n sortOrder: row.sort_order ?? 0,\n modifiers: text(meta, 'modifiers'),\n kitchenNotes: text(meta, 'kitchenNotes'),\n metadata: meta,\n createdAt: row.created_at,\n }\n}\n\nfunction toOrder(\n row: OrderRow,\n items: RestaurantOrderItem[],\n names: Map<string, string>,\n payment: PaymentStatusRow | undefined,\n shipmentStatuses: string[] = [],\n): RestaurantOrder {\n const meta = row.metadata ?? {}\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id.slice(0, 8),\n kind: row.kind,\n status: row.status,\n partyId: row.party_id ?? undefined,\n partyName: row.party_id ? names.get(row.party_id) : undefined,\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_id ? names.get(row.assignee_id) : undefined,\n subtotal: num(row.subtotal),\n discount: num(row.discount),\n tax: num(row.tax),\n total: num(row.total),\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: [],\n // A counter sale has no channel, and 'balcao' is what that means.\n source: row.channel ?? 'balcao',\n // Not location_id: that is the branch (`app.units`); a table has no row of its own yet.\n tableId: text(meta, 'tableId'),\n estimatedMinutes: typeof meta.estimatedMinutes === 'number' ? meta.estimatedMinutes : undefined,\n items,\n metadata: {\n ...meta,\n channel: row.channel ?? null,\n fulfillmentStatus: row.fulfillment_status ?? null,\n paymentStatus: payment?.status ?? 'none',\n invoicedAmount: num(payment?.total_amount),\n paidAmount: num(payment?.paid_amount),\n shipmentStatuses,\n },\n tenantId: row.tenant_id,\n unitId: row.unit_id ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction db(): SupabaseClient {\n const client = getSupabaseClientOptional() as SupabaseClient | null\n if (!client) throw new Error('Supabase client is not configured')\n return client\n}\n\nfunction fail(error: { message: string } | null): void {\n if (error) throw new Error(error.message)\n}\n\n/** Reads `public.v_orders` (delivery state derived) joined with `v_order_payment_status`. */\nexport function createSupabaseOrdersProvider(options?: SupabaseOrdersProviderOptions): OrdersDataProvider {\n const writes = options?.writes\n\n function requireWrites(): SupabaseOrdersWriteOptions {\n if (!writes) throw new Error(READ_ONLY)\n return writes\n }\n\n async function load(query?: OrderQuery, onlyId?: string): Promise<PaginatedResult<RestaurantOrder>> {\n const client = db()\n let q = client.from(ORDERS_VIEW).select(ORDER_COLUMNS, { count: 'exact' }).order('created_at', { ascending: false })\n\n if (onlyId) q = q.eq('id', onlyId)\n if (options?.kinds?.length) q = q.in('kind', options.kinds)\n if (options?.channel) q = q.eq('channel', options.channel)\n if (query?.kind) q = Array.isArray(query.kind) ? q.in('kind', query.kind) : q.eq('kind', query.kind)\n if (query?.status) q = Array.isArray(query.status) ? q.in('status', query.status) : q.eq('status', query.status)\n if (query?.channel) q = q.eq('channel', query.channel)\n if (query?.excludeKinds?.length) q = q.not('kind', 'in', `(${query.excludeKinds.join(',')})`)\n if (query?.fulfillmentStatus) q = q.eq('fulfillment_status', query.fulfillmentStatus)\n if (query?.tableId) q = q.eq('metadata->>tableId', query.tableId)\n if (query?.assigneeId) q = q.eq('assignee_id', query.assigneeId)\n if (query?.dateRange) q = q.gte('created_at', query.dateRange.from).lte('created_at', query.dateRange.to)\n const term = searchTerm(query?.search)\n if (term) {\n // The customer's name is not on v_orders, so it is resolved to ids first.\n const { data: named } = await client.from(PEOPLE_TABLE).select('id').ilike('name', `%${term}%`).limit(50)\n const partyIds = ((named ?? []) as Pick<PersonRow, 'id'>[]).map((p) => p.id)\n q = q.or([\n `reference_number.ilike.%${term}%`,\n ...(partyIds.length ? [`party_id.in.(${partyIds.join(',')})`] : []),\n ].join(','))\n }\n const pageSize = query?.pageSize ?? 100\n const from = ((query?.page ?? 1) - 1) * pageSize\n q = q.range(from, from + pageSize - 1)\n\n const { data, error, count } = await q\n fail(error)\n const rows = (data ?? []) as OrderRow[]\n if (rows.length === 0) return { data: [], total: count ?? 0 }\n\n const ids = rows.map((r) => r.id)\n const personIds = [...new Set(rows.flatMap((r) => [r.party_id, r.assignee_id]).filter((id): id is string => !!id))]\n const withItems = query?.withItems !== false\n const [people, payments, items, shipments] = await Promise.all([\n client.from(PEOPLE_TABLE).select('id, name').in('id', personIds),\n client.from(PAYMENT_STATUS_VIEW).select('order_id, status, total_amount, paid_amount').in('order_id', ids),\n withItems\n ? client.from(ITEMS_TABLE).select(ITEM_COLUMNS).in('order_id', ids).order('sort_order')\n : Promise.resolve({ data: [] as ItemRow[] }),\n client.from('fulfillments').select('order_id, status').in('order_id', ids).in('kind', ['shipment', 'pickup']),\n ])\n const shipmentsByOrder = new Map<string, string[]>()\n for (const row of (shipments.data ?? []) as Array<{ order_id: string; status: string }>) {\n shipmentsByOrder.set(row.order_id, [...(shipmentsByOrder.get(row.order_id) ?? []), row.status])\n }\n\n const names = new Map(((people.data ?? []) as PersonRow[]).map((p) => [p.id, p.name]))\n const paymentByOrder = new Map(((payments.data ?? []) as PaymentStatusRow[]).map((p) => [p.order_id, p]))\n const itemsByOrder = new Map<string, RestaurantOrderItem[]>()\n for (const row of (items.data ?? []) as ItemRow[]) {\n const list = itemsByOrder.get(row.order_id) ?? []\n list.push(toItem(row))\n itemsByOrder.set(row.order_id, list)\n }\n\n return {\n data: rows.map((r) => toOrder(r, itemsByOrder.get(r.id) ?? [], names, paymentByOrder.get(r.id), shipmentsByOrder.get(r.id))),\n total: count ?? rows.length,\n }\n }\n\n async function loadOne(id: string): Promise<RestaurantOrder | null> {\n return (await load(undefined, id)).data[0] ?? null\n }\n\n // Nothing in the database keeps orders.subtotal/total in step with its items.\n async function recalc(orderId: string): Promise<void> {\n const client = db()\n const { data, error } = await client.from(ITEMS_TABLE).select('total').eq('order_id', orderId)\n fail(error)\n const subtotal = ((data ?? []) as Pick<ItemRow, 'total'>[]).reduce((sum, r) => sum + num(r.total), 0)\n const { error: updateError } = await client.from(ORDERS_TABLE).update({ subtotal, total: subtotal }).eq('id', orderId)\n fail(updateError)\n }\n\n async function orderIdOfItem(itemId: string): Promise<string> {\n const { data, error } = await db().from(ITEMS_TABLE).select('order_id').eq('id', itemId).single()\n fail(error)\n return (data as Pick<ItemRow, 'order_id'>).order_id\n }\n\n return {\n getOrders: (query) => load(query),\n getOrderById: loadOne,\n\n async createOrder(input) {\n const w = requireWrites()\n const client = db()\n const tenantId = (w.tenantId ?? getActiveTenantId)()\n if (!tenantId) throw new Error('No active organization: an order cannot be opened without one')\n\n const channel = (w.channelFor ?? ((kind: string) => DEFAULT_CHANNELS[kind]))(input.kind)\n const subtotal = input.items.reduce((sum, item) => sum + lineTotal(item), 0)\n\n const { data: order, error } = await client\n .from(ORDERS_TABLE)\n .insert({\n tenant_id: tenantId,\n unit_id: w.unitId?.() ?? null,\n kind: input.kind,\n status: 'new',\n ...(channel ? { channel } : {}),\n // Without a party, `trg_orders_require_party` fills in the tenant's walk-in party.\n ...(input.partyId ? { party_id: input.partyId } : {}),\n ...(input.assigneeId ? { assignee_id: input.assigneeId } : {}),\n ...(input.notes ? { notes: input.notes } : {}),\n subtotal,\n total: subtotal,\n currency: 'BRL',\n metadata: {\n ...(input.tableId ? { tableId: input.tableId } : {}),\n ...(input.estimatedMinutes ? { estimatedMinutes: input.estimatedMinutes } : {}),\n },\n })\n .select('id')\n .single()\n fail(error)\n const orderId = (order as Pick<OrderRow, 'id'>).id\n\n if (input.items.length) {\n // tenant_id and parent_kind come from the parent through `trg_items_inherit`.\n const { error: itemsError } = await client.from(ITEMS_TABLE).insert(\n input.items.map((item, index) => ({\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: index,\n metadata: itemMetadata(item),\n })),\n )\n fail(itemsError)\n }\n\n const created = await loadOne(orderId)\n if (!created) throw new Error('The order was created but is not readable — check the orders.read permission')\n return created\n },\n\n async updateOrderStatus(input) {\n requireWrites()\n // `trg_orders_kind_guard` stamps completed_at and refuses a status the kind never declared.\n const { error } = await db().from(ORDERS_TABLE).update({ status: input.status }).eq('id', input.orderId)\n fail(error)\n const order = await loadOne(input.orderId)\n if (!order) throw new Error('Order not found after the status change')\n return order\n },\n\n async updateOrder(id, data) {\n requireWrites()\n const patch: Record<string, unknown> = {}\n if (data.status !== undefined) patch.status = data.status\n if (data.notes !== undefined) patch.notes = data.notes\n if (data.partyId !== undefined) patch.party_id = data.partyId\n if (data.assigneeId !== undefined) patch.assignee_id = data.assigneeId\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.tax !== undefined) patch.tax = data.tax\n if (Object.keys(patch).length) {\n const { error } = await db().from(ORDERS_TABLE).update(patch).eq('id', id)\n fail(error)\n }\n const order = await loadOne(id)\n if (!order) throw new Error('Order not found after the update')\n return order\n },\n\n async cancelOrder(id, reason) {\n requireWrites()\n const { error } = await db()\n .from(ORDERS_TABLE)\n .update({ status: 'cancelled', ...(reason ? { notes: reason } : {}) })\n .eq('id', id)\n fail(error)\n },\n\n async addOrderItem(orderId, item) {\n requireWrites()\n const client = db()\n const { count } = await client\n .from(ITEMS_TABLE)\n .select('id', { count: 'exact', head: true })\n .eq('order_id', orderId)\n const { data, error } = await client\n .from(ITEMS_TABLE)\n .insert({\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount: item.discount ?? 0,\n total: lineTotal(item),\n sort_order: count ?? 0,\n metadata: itemMetadata(item),\n })\n .select(ITEM_COLUMNS)\n .single()\n fail(error)\n await recalc(orderId)\n return toItem(data as ItemRow)\n },\n\n async removeOrderItem(itemId) {\n requireWrites()\n const orderId = await orderIdOfItem(itemId)\n const { error } = await db().from(ITEMS_TABLE).delete().eq('id', itemId)\n fail(error)\n await recalc(orderId)\n },\n\n async updateOrderItem(itemId, data) {\n requireWrites()\n const client = db()\n const orderId = await orderIdOfItem(itemId)\n const patch: Record<string, unknown> = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.quantity !== undefined) patch.quantity = data.quantity\n if (data.unitPrice !== undefined) patch.unit_price = data.unitPrice\n if (data.discount !== undefined) patch.discount = data.discount\n if (data.quantity !== undefined || data.unitPrice !== undefined || data.discount !== undefined) {\n const { data: current, error: readError } = await client\n .from(ITEMS_TABLE).select('quantity, unit_price, discount').eq('id', itemId).single()\n fail(readError)\n const row = current as Pick<ItemRow, 'quantity' | 'unit_price' | 'discount'>\n patch.total = lineTotal({\n quantity: num(data.quantity ?? row.quantity),\n unitPrice: num(data.unitPrice ?? row.unit_price),\n discount: num(data.discount ?? row.discount),\n })\n }\n const { data: updated, error } = await client\n .from(ITEMS_TABLE).update(patch).eq('id', itemId).select(ITEM_COLUMNS).single()\n fail(error)\n await recalc(orderId)\n return toItem(updated as ItemRow)\n },\n\n async getSummary(dateRange) {\n const page = await load({ pageSize: 500, ...(dateRange ? { dateRange } : {}) })\n return summarizeOrders(page.data, dateRange)\n },\n }\n}\n"]}
|