@fayz-ai/plugin-reservations 0.2.1 → 0.2.3

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.
@@ -59,6 +59,7 @@ function createCoreReservationsProvider(options) {
59
59
  orderId: r.order_id ?? void 0,
60
60
  orderReference: r.order_reference ?? void 0,
61
61
  seatedAt: r.seated_at ?? void 0,
62
+ arrivedAt: r.arrived_at ?? void 0,
62
63
  tenantId: r.tenant_id,
63
64
  createdAt: r.created_at,
64
65
  updatedAt: r.updated_at
@@ -130,14 +131,22 @@ function createCoreReservationsProvider(options) {
130
131
  if (status === "seated") {
131
132
  throw new Error('Acomodar abre a comanda \u2014 use "sentar" em vez de marcar o estado.');
132
133
  }
133
- const { error } = await db().from(RESERVATIONS).update({ status }).eq("id", id);
134
+ const patch = { status };
135
+ if (status === "arrived") patch.arrived_at = (/* @__PURE__ */ new Date()).toISOString();
136
+ const { data: tocadas, error } = await db().from(RESERVATIONS).update(patch).eq("id", id).select("id");
134
137
  if (error) throw new Error(error.message);
138
+ if ((tocadas ?? []).length === 0) {
139
+ throw new Error("O servidor n\xE3o confirmou a mudan\xE7a de estado da reserva.");
140
+ }
135
141
  return byId(id);
136
142
  },
137
143
  async deleteReservation(id) {
138
144
  requireWrites();
139
- const { error } = await db().from(RESERVATIONS).delete().eq("id", id);
145
+ const { data: apagadas, error } = await db().from(RESERVATIONS).delete().eq("id", id).select("id");
140
146
  if (error) throw new Error(error.message);
147
+ if ((apagadas ?? []).length === 0) {
148
+ throw new Error("O servidor n\xE3o confirmou a remo\xE7\xE3o da reserva.");
149
+ }
141
150
  },
142
151
  async seatReservation(input) {
143
152
  const writes = requireWrites();
@@ -331,5 +340,5 @@ function createCoreReservationsProvider(options) {
331
340
  }
332
341
 
333
342
  export { DEFAULT_SETTINGS, createCoreReservationsProvider };
334
- //# sourceMappingURL=chunk-7KXGSUHT.js.map
335
- //# sourceMappingURL=chunk-7KXGSUHT.js.map
343
+ //# sourceMappingURL=chunk-CJIXUAFI.js.map
344
+ //# sourceMappingURL=chunk-CJIXUAFI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/core-supabase.ts"],"names":[],"mappings":"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","file":"chunk-CJIXUAFI.js","sourcesContent":["import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { ReservationsDataProvider } from './types'\nimport type {\n Reservation, CapacityRule, CapacityException, ReservationSettings,\n DaySlot, ReservationZone, ReservationTable, ReservationStatus,\n CreateReservationInput, ReservationQuery, SeatReservationInput,\n ReservationsSummary, Occasion,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Reservations, over the plugin's own schema.\n//\n// public.plg_reservations the reservations\n// public.plg_reservations_capacity_rules the weekly grid\n// public.plg_reservations_capacity_exceptions what overrides it\n// public.plg_reservations_settings the policy\n// public.v_reservations the reservation with names\n// public.reservations_day_capacity(date) the slots of a day\n//\n// The salão is BORROWED, not copied: zones and mesas are plugin-tables' tables.\n// Capacity is per praça for one reason — the V1 keeps them apart\n// (`service_locations` for capacity, `restaurant_sections` for the mesa) and its\n// own document records the consequence: \"nada na tela avisa\", so whoever\n// registered the praças cannot find those names when configuring the lotação.\n// ---------------------------------------------------------------------------\n\nconst RESERVATIONS = 'plg_reservations'\nconst VIEW = 'v_reservations'\nconst RULES = 'plg_reservations_capacity_rules'\nconst EXCEPTIONS = 'plg_reservations_capacity_exceptions'\nconst SETTINGS = 'plg_reservations_settings'\nconst ZONES = 'plg_tables_zones'\nconst TABLES_VIEW = 'v_tables'\n\nexport const DEFAULT_SETTINGS: ReservationSettings = {\n capacityMode: 'no_duration',\n defaultDurationMinutes: 120,\n minAdvanceHours: 24,\n maxAdvanceDays: 90,\n autoConfirm: false,\n requirePhone: true,\n requireEmail: false,\n}\n\nexport interface CoreReservationsWriteOptions {\n /** The active org, stamped on insert. RLS checks it again on the way in. */\n tenantId: () => string | undefined | null\n /**\n * How a seated party becomes a comanda.\n *\n * NOT reimplemented here. Opening a comanda means inserting into\n * `public.orders`, drawing a number off the app's own sequence and writing\n * `plg_tables_order_extensions` — that is plugin-tables' `seatGuests`, and a\n * second copy of it is how two screens start numbering comandas in two\n * series. The app wires its tables provider in; see resto-saas\n * `src/restaurant/reservations.ts`.\n *\n * Absent, seating still moves the status — it just leaves no comanda, and the\n * screen says as much rather than pretending.\n */\n openComanda?: (input: { tableId: string; guests: number; notes?: string }) => Promise<{ orderId?: string }>\n}\n\nexport interface CoreReservationsProviderOptions {\n writes?: CoreReservationsWriteOptions\n}\n\nconst READ_ONLY = 'This provider reads reservations; pass `writes` to let the app that owns it change them.'\n\n/** \"HH:MM:SS\" from Postgres → \"HH:MM\" for a form. Null stays undefined. */\nfunction hhmm(value?: string | null): string | undefined {\n if (!value) return undefined\n return value.slice(0, 5)\n}\n\nexport function createCoreReservationsProvider(\n options?: CoreReservationsProviderOptions,\n): ReservationsDataProvider {\n const db = () => {\n const client = getSupabaseClientOptional() as any\n if (!client) throw new Error('Supabase client is not configured')\n return client\n }\n\n function requireWrites(): CoreReservationsWriteOptions {\n if (!options?.writes) throw new Error(READ_ONLY)\n return options.writes\n }\n\n function tenant(): string {\n const id = requireWrites().tenantId()\n if (!id) throw new Error('No active tenant')\n return id\n }\n\n function rowToReservation(r: any): Reservation {\n return {\n id: r.id,\n personId: r.person_id ?? undefined,\n guestName: r.guest_name,\n phone: r.phone ?? undefined,\n email: r.email ?? undefined,\n zoneId: r.zone_id ?? undefined,\n zoneName: r.zone_name ?? undefined,\n zoneColor: r.zone_color ?? undefined,\n tableId: r.table_id ?? undefined,\n tableNumber: r.table_number ?? undefined,\n reservedOn: r.reserved_on,\n startTime: hhmm(r.start_time) ?? '00:00',\n endTime: hhmm(r.end_time),\n partySize: r.party_size,\n occasion: (r.occasion ?? undefined) as Occasion | undefined,\n notes: r.notes ?? undefined,\n status: r.status as ReservationStatus,\n orderId: r.order_id ?? undefined,\n orderReference: r.order_reference ?? undefined,\n seatedAt: r.seated_at ?? undefined,\n arrivedAt: r.arrived_at ?? undefined,\n tenantId: r.tenant_id,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n }\n }\n\n async function byId(id: string): Promise<Reservation> {\n const { data, error } = await db().from(VIEW).select('*').eq('id', id).maybeSingle()\n if (error) throw new Error(error.message)\n if (!data) throw new Error('Reserva não encontrada')\n return rowToReservation(data)\n }\n\n /** The columns a write touches. `undefined` means \"leave alone\"; the caller\n * clears a field by passing null through `Partial`. */\n function toRow(input: Partial<CreateReservationInput>): Record<string, unknown> {\n const row: Record<string, unknown> = {}\n if (input.personId !== undefined) row.person_id = input.personId || null\n if (input.guestName !== undefined) row.guest_name = input.guestName\n if (input.phone !== undefined) row.phone = input.phone || null\n if (input.email !== undefined) row.email = input.email || null\n if (input.zoneId !== undefined) row.zone_id = input.zoneId || null\n if (input.tableId !== undefined) row.table_id = input.tableId || null\n if (input.reservedOn !== undefined) row.reserved_on = input.reservedOn\n if (input.startTime !== undefined) row.start_time = input.startTime\n if (input.endTime !== undefined) row.end_time = input.endTime || null\n if (input.partySize !== undefined) row.party_size = input.partySize\n if (input.occasion !== undefined) row.occasion = input.occasion || null\n if (input.notes !== undefined) row.notes = input.notes || null\n if (input.status !== undefined) row.status = input.status\n return row\n }\n\n return {\n async getReservations(query?: ReservationQuery): Promise<Reservation[]> {\n let q = db().from(VIEW).select('*')\n .order('reserved_on').order('start_time')\n if (query?.from) q = q.gte('reserved_on', query.from)\n if (query?.to) q = q.lte('reserved_on', query.to)\n if (query?.zoneId) q = q.eq('zone_id', query.zoneId)\n if (query?.status) {\n const wanted = Array.isArray(query.status) ? query.status : [query.status]\n q = q.in('status', wanted)\n }\n if (query?.search) {\n // Name OR phone — reception searches by whichever one the caller gave.\n const term = `%${query.search}%`\n q = q.or(`guest_name.ilike.${term},phone.ilike.${term}`)\n }\n const { data, error } = await q\n if (error) throw new Error(error.message)\n return (data ?? []).map(rowToReservation)\n },\n\n async getReservation(id: string): Promise<Reservation | null> {\n const { data, error } = await db().from(VIEW).select('*').eq('id', id).maybeSingle()\n if (error) throw new Error(error.message)\n return data ? rowToReservation(data) : null\n },\n\n async createReservation(input: CreateReservationInput): Promise<Reservation> {\n const tenantId = tenant()\n const { data, error } = await db().from(RESERVATIONS)\n .insert({ ...toRow(input), tenant_id: tenantId })\n .select('id').single()\n if (error) throw new Error(error.message)\n return byId(data.id)\n },\n\n async updateReservation(id: string, data: Partial<CreateReservationInput>): Promise<Reservation> {\n requireWrites()\n const patch = toRow(data)\n if (Object.keys(patch).length) {\n const { error } = await db().from(RESERVATIONS).update(patch).eq('id', id)\n if (error) throw new Error(error.message)\n }\n return byId(id)\n },\n\n async setStatus(id: string, status: ReservationStatus): Promise<Reservation> {\n requireWrites()\n if (status === 'seated') {\n throw new Error('Acomodar abre a comanda — use \"sentar\" em vez de marcar o estado.')\n }\n // Chegar CARIMBA a hora: \"está aqui desde quando\" é a pergunta seguinte\n // do anfitrião, e sem o instante a lista de entrada não sabe ordenar quem\n // espera de pé há mais tempo.\n const patch: Record<string, unknown> = { status }\n if (status === 'arrived') patch.arrived_at = new Date().toISOString()\n // CONFERIR que mudou, não supor.\n //\n // Um `update` do PostgREST que casa ZERO linhas **não devolve erro**:\n // responde 200 com lista vazia. Sem pedir as linhas de volta, uma RLS\n // que barra a escrita dizia «tudo bem», o `byId` relia a reserva ANTIGA\n // e a tela mostrava o estado velho sem uma palavra — que foi exatamente\n // o que aconteceu ao provar o «Chegou»: o anfitrião marcava, a linha não\n // mudava, e ninguém sabia por quê.\n const { data: tocadas, error } = await db().from(RESERVATIONS)\n .update(patch).eq('id', id).select('id')\n if (error) throw new Error(error.message)\n if ((tocadas ?? []).length === 0) {\n throw new Error('O servidor não confirmou a mudança de estado da reserva.')\n }\n return byId(id)\n },\n\n async deleteReservation(id: string): Promise<void> {\n requireWrites()\n const { data: apagadas, error } = await db().from(RESERVATIONS)\n .delete().eq('id', id).select('id')\n if (error) throw new Error(error.message)\n if ((apagadas ?? []).length === 0) {\n throw new Error('O servidor não confirmou a remoção da reserva.')\n }\n },\n\n async seatReservation(input: SeatReservationInput): Promise<Reservation> {\n const writes = requireWrites()\n const reservation = await byId(input.reservationId)\n if (reservation.status === 'seated') throw new Error('Esta reserva já foi acomodada')\n if (reservation.status === 'cancelled') throw new Error('Reserva cancelada não senta')\n\n const guests = input.guests ?? reservation.partySize\n // The comanda first: if it fails, the reservation is untouched and\n // reception tries another mesa. Marking `seated` and then failing to open\n // would leave a party the floor plan cannot see.\n let orderId: string | undefined\n if (writes.openComanda) {\n const opened = await writes.openComanda({\n tableId: input.tableId,\n guests,\n notes: `Reserva · ${reservation.guestName}`,\n })\n orderId = opened.orderId\n }\n\n const { error } = await db().from(RESERVATIONS).update({\n status: 'seated',\n table_id: input.tableId,\n party_size: guests,\n order_id: orderId ?? null,\n seated_at: new Date().toISOString(),\n }).eq('id', input.reservationId)\n if (error) throw new Error(error.message)\n return byId(input.reservationId)\n },\n\n // -- The grid ------------------------------------------------------------\n\n async getDayCapacity(date: string): Promise<DaySlot[]> {\n const { data, error } = await db().rpc('reservations_day_capacity', { p_date: date })\n if (error) throw new Error(error.message)\n return (data ?? []).map((s: any) => ({\n zoneId: s.zone_id ?? undefined,\n zoneName: s.zone_name ?? undefined,\n zoneColor: s.zone_color ?? undefined,\n startTime: hhmm(s.start_time) ?? '00:00',\n endTime: hhmm(s.end_time) ?? '23:59',\n capacity: Number(s.capacity) || 0,\n booked: Number(s.booked) || 0,\n remaining: Number(s.remaining) || 0,\n isException: !!s.is_exception,\n }))\n },\n\n async getCapacityRules(): Promise<CapacityRule[]> {\n const { data, error } = await db().from(RULES)\n .select('*, plg_tables_zones(name)').order('start_time')\n if (error) throw new Error(error.message)\n return (data ?? []).map((r: any) => ({\n id: r.id,\n zoneId: r.zone_id ?? undefined,\n zoneName: r.plg_tables_zones?.name ?? undefined,\n capacity: r.capacity,\n startTime: hhmm(r.start_time) ?? '00:00',\n endTime: hhmm(r.end_time) ?? '23:59',\n weekdays: (r.weekdays ?? []).map(Number),\n durationMinutes: r.duration_minutes ?? undefined,\n isActive: r.is_active !== false,\n tenantId: r.tenant_id,\n }))\n },\n\n async saveCapacityRule(rule): Promise<CapacityRule> {\n const tenantId = tenant()\n const row: Record<string, unknown> = {\n tenant_id: tenantId,\n zone_id: rule.zoneId || null,\n capacity: rule.capacity,\n start_time: rule.startTime,\n end_time: rule.endTime,\n weekdays: rule.weekdays ?? [0, 1, 2, 3, 4, 5, 6],\n duration_minutes: rule.durationMinutes ?? null,\n is_active: rule.isActive !== false,\n }\n const q = rule.id\n ? db().from(RULES).update(row).eq('id', rule.id)\n : db().from(RULES).insert(row)\n const { data, error } = await q.select('id').single()\n if (error) throw new Error(error.message)\n const all = await this.getCapacityRules()\n return all.find((r) => r.id === data.id)!\n },\n\n async deleteCapacityRule(id: string): Promise<void> {\n requireWrites()\n const { error } = await db().from(RULES).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n async getCapacityExceptions(): Promise<CapacityException[]> {\n const { data, error } = await db().from(EXCEPTIONS)\n .select('*, plg_tables_zones(name)').order('starts_on')\n if (error) throw new Error(error.message)\n return (data ?? []).map((e: any) => ({\n id: e.id,\n zoneId: e.zone_id ?? undefined,\n zoneName: e.plg_tables_zones?.name ?? undefined,\n startsOn: e.starts_on,\n endsOn: e.ends_on,\n startTime: hhmm(e.start_time),\n endTime: hhmm(e.end_time),\n capacity: e.capacity,\n reason: e.reason ?? undefined,\n tenantId: e.tenant_id,\n }))\n },\n\n async saveCapacityException(ex): Promise<CapacityException> {\n const tenantId = tenant()\n const row: Record<string, unknown> = {\n tenant_id: tenantId,\n zone_id: ex.zoneId || null,\n starts_on: ex.startsOn,\n ends_on: ex.endsOn ?? ex.startsOn,\n start_time: ex.startTime || null,\n end_time: ex.endTime || null,\n capacity: ex.capacity ?? 0,\n reason: ex.reason || null,\n }\n const q = ex.id\n ? db().from(EXCEPTIONS).update(row).eq('id', ex.id)\n : db().from(EXCEPTIONS).insert(row)\n const { data, error } = await q.select('id').single()\n if (error) throw new Error(error.message)\n const all = await this.getCapacityExceptions()\n return all.find((e) => e.id === data.id)!\n },\n\n async deleteCapacityException(id: string): Promise<void> {\n requireWrites()\n const { error } = await db().from(EXCEPTIONS).delete().eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // -- The policy ----------------------------------------------------------\n\n async getSettings(): Promise<ReservationSettings> {\n const { data, error } = await db().from(SETTINGS).select('*').maybeSingle()\n if (error) throw new Error(error.message)\n if (!data) return { ...DEFAULT_SETTINGS }\n return {\n capacityMode: data.capacity_mode,\n defaultDurationMinutes: data.default_duration_minutes,\n minAdvanceHours: data.min_advance_hours,\n maxAdvanceDays: data.max_advance_days,\n autoConfirm: !!data.auto_confirm,\n requirePhone: !!data.require_phone,\n requireEmail: !!data.require_email,\n }\n },\n\n async saveSettings(settings: ReservationSettings): Promise<ReservationSettings> {\n const tenantId = tenant()\n const { error } = await db().from(SETTINGS).upsert({\n tenant_id: tenantId,\n capacity_mode: settings.capacityMode,\n default_duration_minutes: settings.defaultDurationMinutes,\n min_advance_hours: settings.minAdvanceHours,\n max_advance_days: settings.maxAdvanceDays,\n auto_confirm: settings.autoConfirm,\n require_phone: settings.requirePhone,\n require_email: settings.requireEmail,\n }, { onConflict: 'tenant_id' })\n if (error) throw new Error(error.message)\n return settings\n },\n\n // -- The salão, borrowed -------------------------------------------------\n\n async getZones(): Promise<ReservationZone[]> {\n const { data, error } = await db().from(ZONES)\n .select('id, name, color').eq('is_active', true).order('sort_order')\n // A house that has not installed the floor plan yet is not an error: the\n // grid falls back to the restaurant as a whole.\n if (error) return []\n return (data ?? []).map((z: any) => ({ id: z.id, name: z.name, color: z.color ?? undefined }))\n },\n\n async getTables(zoneId?: string): Promise<ReservationTable[]> {\n let q = db().from(TABLES_VIEW).select('id, number, name, seats, zone_id, status').order('number')\n if (zoneId) q = q.eq('zone_id', zoneId)\n const { data, error } = await q\n if (error) return []\n return (data ?? []).map((t: any) => ({\n id: t.id,\n number: t.number,\n name: t.name ?? undefined,\n seats: t.seats ?? 0,\n zoneId: t.zone_id ?? undefined,\n // `occupied` is derived by v_tables from the open comanda — the one\n // fact, read here too rather than guessed from a stored column.\n isOccupied: t.status === 'occupied',\n }))\n },\n\n async getSummary(date: string): Promise<ReservationsSummary> {\n const { data, error } = await db().from(RESERVATIONS)\n .select('status, party_size').eq('reserved_on', date)\n if (error) throw new Error(error.message)\n const rows = data ?? []\n const count = (s: ReservationStatus) => rows.filter((r: any) => r.status === s).length\n return {\n total: rows.length,\n pending: count('pending'),\n confirmed: count('confirmed'),\n seated: count('seated'),\n noShow: count('no_show'),\n cancelled: count('cancelled'),\n // Cancelled and no-show do not eat. This is the number the kitchen\n // plans against, not the row count.\n expectedGuests: rows\n .filter((r: any) => !['cancelled', 'no_show'].includes(r.status))\n .reduce((sum: number, r: any) => sum + (r.party_size ?? 0), 0),\n }\n },\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"core-supabase.d.ts","sourceRoot":"","sources":["../../src/data/core-supabase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EACoC,mBAAmB,EAIlE,MAAM,UAAU,CAAA;AA2BjB,eAAO,MAAM,gBAAgB,EAAE,mBAQ9B,CAAA;AAED,MAAM,WAAW,4BAA4B;IAC3C,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACzC;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5G;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,4BAA4B,CAAA;CACtC;AAUD,wBAAgB,8BAA8B,CAC5C,OAAO,CAAC,EAAE,+BAA+B,GACxC,wBAAwB,CAoW1B"}
1
+ {"version":3,"file":"core-supabase.d.ts","sourceRoot":"","sources":["../../src/data/core-supabase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EACoC,mBAAmB,EAIlE,MAAM,UAAU,CAAA;AA2BjB,eAAO,MAAM,gBAAgB,EAAE,mBAQ9B,CAAA;AAED,MAAM,WAAW,4BAA4B;IAC3C,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACzC;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5G;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,4BAA4B,CAAA;CACtC;AAUD,wBAAgB,8BAA8B,CAC5C,OAAO,CAAC,EAAE,+BAA+B,GACxC,wBAAwB,CA0X1B"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { DEFAULT_SETTINGS } from './chunk-7KXGSUHT.js';
2
- export { DEFAULT_SETTINGS, createCoreReservationsProvider } from './chunk-7KXGSUHT.js';
1
+ import { DEFAULT_SETTINGS } from './chunk-CJIXUAFI.js';
2
+ export { DEFAULT_SETTINGS, createCoreReservationsProvider } from './chunk-CJIXUAFI.js';
3
3
  import React from 'react';
4
4
  import { createStore } from 'zustand/vanilla';
5
5
  import { toast } from 'sonner';
@@ -410,6 +410,7 @@ var reservationsLocales = { en, "pt-BR": ptBR };
410
410
  var RESERVATION_STATUSES = [
411
411
  "pending",
412
412
  "confirmed",
413
+ "arrived",
413
414
  "seated",
414
415
  "no_show",
415
416
  "cancelled"
@@ -763,14 +764,81 @@ CREATE UNIQUE INDEX IF NOT EXISTS plg_reservations_settings_unit_uidx
763
764
  ON public.plg_reservations_settings USING btree (tenant_id, unit_id)
764
765
  WHERE unit_id IS NOT NULL;
765
766
  `;
767
+ var MIGRATION_003_QUEM_CHEGOU_JA_ESTA_NA_CASA_ANTES_DE_SENTAR = `-- Quem chegou j\xE1 est\xE1 na casa, antes de sentar.
768
+ --
769
+ -- A reserva tinha cinco estados e nenhum deles respondia \xE0 pergunta que o
770
+ -- anfitri\xE3o faz a noite inteira: **essa gente j\xE1 est\xE1 aqui?** Entre \xABConfirmada\xBB
771
+ -- (prometeu vir) e \xABAcomodada\xBB (est\xE1 na mesa) existe um terceiro fato \u2014 o grupo
772
+ -- est\xE1 de p\xE9 na recep\xE7\xE3o esperando a mesa vagar \u2014, e sem ele o anfitri\xE3o marca
773
+ -- a reserva como acomodada s\xF3 para tir\xE1-la da lista, o que abre uma comanda
774
+ -- numa mesa que ningu\xE9m ocupou.
775
+ --
776
+ -- N\xC3O \xE9 porte: o V1 tamb\xE9m tem cinco estados
777
+ -- (\`pending,confirmed,seated,no_show,cancelled\`, em
778
+ -- \`20260622220606_*.sql\`) e nunca teve check-in. \xC9 desenho novo, pedido pelo
779
+ -- founder para a tela de controle de entrada, onde reserva e fila de espera
780
+ -- passam a conviver: chegar \xE9 o gesto que p\xF5e a reserva NA FILA, e sentar
781
+ -- continua sendo o gesto que abre a comanda.
782
+ --
783
+ -- \`arrived\` entra ANTES de \`seated\` na ordem do CHECK para deixar a leitura do
784
+ -- ciclo \xF3bvia para quem abrir esta tabela depois.
785
+ --
786
+ -- Idempotente.
787
+
788
+ ALTER TABLE public.plg_reservations
789
+ ADD COLUMN IF NOT EXISTS arrived_at timestamptz;
790
+
791
+ -- O CHECK \xE9 reescrito, n\xE3o somado: um \`ADD CONSTRAINT\` com outro nome deixaria
792
+ -- os dois valendo, e o antigo recusaria \`arrived\` de qualquer jeito \u2014 Postgres
793
+ -- exige que TODOS passem.
794
+ ALTER TABLE public.plg_reservations
795
+ DROP CONSTRAINT IF EXISTS plg_reservations_status_check;
796
+ ALTER TABLE public.plg_reservations
797
+ ADD CONSTRAINT plg_reservations_status_check
798
+ CHECK (status IN ('pending','confirmed','arrived','seated','no_show','cancelled'));
799
+
800
+ COMMENT ON COLUMN public.plg_reservations.arrived_at IS
801
+ 'Quando o grupo se apresentou na recep\xE7\xE3o. Chegar N\xC3O abre comanda: quem abre \xE9 o seat.';
802
+
803
+ -- A VISTA precisa carregar a coluna nova, sen\xE3o o motor existe e a tela n\xE3o o
804
+ -- enxerga: \`v_reservations\` lista coluna a coluna (n\xE3o \xE9 \`r.*\`), e toda leitura
805
+ -- do plugin passa por ela. Sem esta parte, \`arrived_at\` seria gravado e nunca
806
+ -- lido \u2014 o defeito de "ler de A e escrever em B", que s\xF3 aparece na tela.
807
+ --
808
+ -- \`security_invoker=true\` \xE9 repetido de prop\xF3sito: um \`CREATE OR REPLACE\` sem
809
+ -- ele devolveria a vista para o dono e a RLS deixaria de recortar por conta.
810
+ --
811
+ -- E \`arrived_at\` vai no FIM da lista, n\xE3o ao lado de \`seated_at\` onde ele
812
+ -- faria sentido para quem l\xEA: \`CREATE OR REPLACE VIEW\` s\xF3 sabe ACRESCENTAR
813
+ -- coluna no fim \u2014 p\xF4-la no meio renomeia as seguintes e o Postgres recusa
814
+ -- (\xABuse ALTER VIEW ... RENAME COLUMN\xBB). Trocar por DROP + CREATE derrubaria
815
+ -- as permiss\xF5es junto.
816
+ CREATE OR REPLACE VIEW public.v_reservations
817
+ WITH (security_invoker = true) AS
818
+ SELECT r.id, r.tenant_id, r.person_id, r.guest_name, r.phone, r.email,
819
+ r.zone_id, z.name AS zone_name, z.color AS zone_color,
820
+ r.table_id, t.number AS table_number,
821
+ r.reserved_on, r.start_time, r.end_time, r.party_size,
822
+ r.occasion, r.notes, r.status, r.order_id, r.seated_at,
823
+ o.reference_number AS order_reference,
824
+ r.created_at, r.updated_at,
825
+ r.arrived_at
826
+ FROM public.plg_reservations r
827
+ LEFT JOIN public.plg_tables_zones z ON z.id = r.zone_id
828
+ LEFT JOIN public.plg_tables_tables t ON t.id = r.table_id
829
+ LEFT JOIN public.orders o ON o.id = r.order_id;
830
+
831
+ GRANT SELECT ON public.v_reservations TO authenticated;
832
+ `;
766
833
  var MIGRATIONS = [
767
834
  { id: "001_reservations", sql: MIGRATION_001_RESERVATIONS },
768
- { id: "002_a_reserva_e_de_uma_casa", sql: MIGRATION_002_A_RESERVA_E_DE_UMA_CASA }
835
+ { id: "002_a_reserva_e_de_uma_casa", sql: MIGRATION_002_A_RESERVA_E_DE_UMA_CASA },
836
+ { id: "003_quem_chegou_ja_esta_na_casa_antes_de_sentar", sql: MIGRATION_003_QUEM_CHEGOU_JA_ESTA_NA_CASA_ANTES_DE_SENTAR }
769
837
  ];
770
838
 
771
839
  // src/index.ts
772
- var ReservationsPage = React.lazy(() => import('./ReservationsPage-5GTINCF3.js').then((m) => ({ default: m.ReservationsPage })));
773
- var ReservationsSettingsPage = React.lazy(() => import('./ReservationsPage-5GTINCF3.js').then((m) => ({ default: m.ReservationsSettingsPage })));
840
+ var ReservationsPage = React.lazy(() => import('./ReservationsPage-NLJHGAPG.js').then((m) => ({ default: m.ReservationsPage })));
841
+ var ReservationsSettingsPage = React.lazy(() => import('./ReservationsPage-NLJHGAPG.js').then((m) => ({ default: m.ReservationsSettingsPage })));
774
842
  var DEFAULT_LABELS = {
775
843
  pageTitle: "Reservas",
776
844
  pageSubtitle: "Mesas guardadas por hor\xE1rio",