@fayz-ai/plugin-agenda 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +3 -3
  2. package/dist/bridges/create-financial-bridge.d.ts +1 -1
  3. package/dist/bridges/create-financial-bridge.d.ts.map +1 -1
  4. package/dist/bridges/financial-bridge.d.ts.map +1 -0
  5. package/dist/{chunk-Q2PAWBPR.js → chunk-76ZOHRBM.js} +2 -2
  6. package/dist/{chunk-Q2PAWBPR.js.map → chunk-76ZOHRBM.js.map} +1 -1
  7. package/dist/components/PaymentStatusBadge.d.ts +1 -1
  8. package/dist/components/PaymentStatusBadge.d.ts.map +1 -1
  9. package/dist/config.d.ts +2 -2
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/{AgendaContext.d.ts → context.d.ts} +1 -1
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/data/registries.d.ts.map +1 -0
  14. package/dist/index.d.ts +2 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +170 -7
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/message-events.d.ts +12 -0
  19. package/dist/lib/message-events.d.ts.map +1 -0
  20. package/dist/public/{data.d.ts → data/index.d.ts} +4 -4
  21. package/dist/public/data/index.d.ts.map +1 -0
  22. package/dist/public/{data.supabase.d.ts → data/supabase.d.ts} +2 -2
  23. package/dist/public/data/supabase.d.ts.map +1 -0
  24. package/dist/public/{hooks.d.ts → hooks/index.d.ts} +4 -4
  25. package/dist/public/hooks/index.d.ts.map +1 -0
  26. package/dist/public/index.d.ts +4 -4
  27. package/dist/public/index.d.ts.map +1 -1
  28. package/dist/public/index.js +3 -3
  29. package/dist/public/index.js.map +1 -1
  30. package/dist/public/{format.d.ts → lib/format.d.ts} +1 -1
  31. package/dist/public/lib/format.d.ts.map +1 -0
  32. package/dist/public/views/BookingWidget.d.ts.map +1 -0
  33. package/dist/public/{steps → views/steps}/ContactStep.d.ts +1 -1
  34. package/dist/public/views/steps/ContactStep.d.ts.map +1 -0
  35. package/dist/public/{steps → views/steps}/DateTimeStep.d.ts +3 -3
  36. package/dist/public/views/steps/DateTimeStep.d.ts.map +1 -0
  37. package/dist/public/{steps → views/steps}/OverviewStep.d.ts +1 -1
  38. package/dist/public/views/steps/OverviewStep.d.ts.map +1 -0
  39. package/dist/public/{steps → views/steps}/PaymentStep.d.ts +1 -1
  40. package/dist/public/views/steps/PaymentStep.d.ts.map +1 -0
  41. package/dist/store.d.ts +1 -1
  42. package/dist/store.d.ts.map +1 -1
  43. package/dist/styles/calendar-styles.d.ts.map +1 -0
  44. package/dist/types.d.ts +1 -1
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/{AgendaPage.d.ts → views/AgendaPage.d.ts} +3 -3
  47. package/dist/views/AgendaPage.d.ts.map +1 -0
  48. package/package.json +6 -9
  49. package/dist/AgendaContext.d.ts.map +0 -1
  50. package/dist/AgendaPage.d.ts.map +0 -1
  51. package/dist/calendar-styles.d.ts.map +0 -1
  52. package/dist/financial-bridge.d.ts.map +0 -1
  53. package/dist/public/BookingWidget.d.ts.map +0 -1
  54. package/dist/public/data.d.ts.map +0 -1
  55. package/dist/public/data.supabase.d.ts.map +0 -1
  56. package/dist/public/format.d.ts.map +0 -1
  57. package/dist/public/hooks.d.ts.map +0 -1
  58. package/dist/public/steps/ContactStep.d.ts.map +0 -1
  59. package/dist/public/steps/DateTimeStep.d.ts.map +0 -1
  60. package/dist/public/steps/OverviewStep.d.ts.map +0 -1
  61. package/dist/public/steps/PaymentStep.d.ts.map +0 -1
  62. package/dist/registries.d.ts.map +0 -1
  63. package/src/AgendaContext.tsx +0 -11
  64. package/src/AgendaPage.tsx +0 -33
  65. package/src/bridges/create-financial-bridge.ts +0 -296
  66. package/src/calendar-styles.css +0 -245
  67. package/src/calendar-styles.ts +0 -285
  68. package/src/components/AgendaGeneralSettings.tsx +0 -86
  69. package/src/components/AgendaMobileList.tsx +0 -103
  70. package/src/components/AppointmentModal.tsx +0 -1050
  71. package/src/components/AppointmentPopover.tsx +0 -231
  72. package/src/components/BookingPaymentPanel.tsx +0 -394
  73. package/src/components/CalendarSidebar.tsx +0 -119
  74. package/src/components/CalendarToolbar.tsx +0 -86
  75. package/src/components/EventContextMenu.tsx +0 -125
  76. package/src/components/FloatingPanel.tsx +0 -123
  77. package/src/components/MiniCalendar.tsx +0 -120
  78. package/src/components/PaymentStatusBadge.tsx +0 -62
  79. package/src/components/StatusBadge.tsx +0 -23
  80. package/src/config.ts +0 -368
  81. package/src/data/index.ts +0 -4
  82. package/src/data/mock.ts +0 -344
  83. package/src/data/supabase.ts +0 -636
  84. package/src/data/types.ts +0 -37
  85. package/src/financial-bridge.ts +0 -96
  86. package/src/hooks/useAgendaSettings.ts +0 -17
  87. package/src/index.ts +0 -297
  88. package/src/integrations/google-calendar/GoogleCalendarSettings.tsx +0 -136
  89. package/src/integrations/google-calendar/components/CalendarColorDot.tsx +0 -23
  90. package/src/integrations/google-calendar/components/ChannelMappingList.tsx +0 -329
  91. package/src/integrations/google-calendar/components/ImportEventsWizard.tsx +0 -215
  92. package/src/integrations/google-calendar/components/useAgendaLookups.ts +0 -100
  93. package/src/integrations/google-calendar/connector.ts +0 -20
  94. package/src/integrations/google-calendar/connectorDef.tsx +0 -185
  95. package/src/integrations/google-calendar/data/supabase.ts +0 -170
  96. package/src/integrations/google-calendar/data/tables.ts +0 -12
  97. package/src/integrations/google-calendar/index.ts +0 -45
  98. package/src/integrations/google-calendar/integration.test.ts +0 -199
  99. package/src/integrations/google-calendar/mapping.ts +0 -183
  100. package/src/integrations/google-calendar/migrations/001_google_calendar.sql +0 -97
  101. package/src/integrations/google-calendar/migrations/002_smart_sync.sql +0 -517
  102. package/src/integrations/google-calendar/migrations/003_plg_rename.sql +0 -273
  103. package/src/integrations/google-calendar/types.ts +0 -142
  104. package/src/lib/tenant.ts +0 -3
  105. package/src/locales/en.ts +0 -220
  106. package/src/locales/index.ts +0 -7
  107. package/src/locales/pt-BR.ts +0 -220
  108. package/src/migrations/000b_v_bookings_rename.sql +0 -21
  109. package/src/migrations/000c_dedupe_customer_phones.sql +0 -43
  110. package/src/migrations/001_public_booking.sql +0 -296
  111. package/src/migrations/002_v_bookings_compat.sql +0 -14
  112. package/src/migrations/003_public_client_kind.sql +0 -175
  113. package/src/migrations/004_public_booking_assignee.sql +0 -176
  114. package/src/migrations/005_agent_rpcs.sql +0 -168
  115. package/src/migrations/006_agent_rpc_localtime.sql +0 -181
  116. package/src/migrations/007_schedule_exception_precedence.sql +0 -290
  117. package/src/migrations/008_agent_rpc_exception_precedence.sql +0 -172
  118. package/src/migrations/009_public_booking_location.sql +0 -162
  119. package/src/migrations/010_public_service_curation.sql +0 -31
  120. package/src/migrations/011_default_assignee.sql +0 -167
  121. package/src/migrations/012_drop_legacy_booking_overload.sql +0 -29
  122. package/src/migrations/013_normalize_v_appointments.sql +0 -199
  123. package/src/migrations/014_agent_rpc_update_appointment.sql +0 -199
  124. package/src/migrations/index.ts +0 -2377
  125. package/src/public/BookingWidget.tsx +0 -324
  126. package/src/public/components/BrandHeader.tsx +0 -27
  127. package/src/public/components/ServiceCard.tsx +0 -39
  128. package/src/public/components/SidebarExtras.tsx +0 -30
  129. package/src/public/components/StepRailItem.tsx +0 -27
  130. package/src/public/components/SuccessPanel.tsx +0 -27
  131. package/src/public/components/SummaryRail.tsx +0 -90
  132. package/src/public/components/defaults.ts +0 -14
  133. package/src/public/context.tsx +0 -103
  134. package/src/public/createPublicBookingPlugin.ts +0 -281
  135. package/src/public/data.supabase.ts +0 -97
  136. package/src/public/data.ts +0 -105
  137. package/src/public/format.ts +0 -96
  138. package/src/public/hooks.ts +0 -110
  139. package/src/public/index.ts +0 -69
  140. package/src/public/steps/ContactStep.tsx +0 -184
  141. package/src/public/steps/DateTimeStep.tsx +0 -138
  142. package/src/public/steps/OverviewStep.tsx +0 -81
  143. package/src/public/steps/PaymentStep.tsx +0 -180
  144. package/src/public/types.ts +0 -250
  145. package/src/registries.ts +0 -35
  146. package/src/store.ts +0 -311
  147. package/src/types.ts +0 -273
  148. package/src/views/CalendarView.tsx +0 -1112
  149. package/src/views/ConfirmationsView.tsx +0 -155
  150. /package/dist/{financial-bridge.d.ts → bridges/financial-bridge.d.ts} +0 -0
  151. /package/dist/{registries.d.ts → data/registries.d.ts} +0 -0
  152. /package/dist/public/{BookingWidget.d.ts → views/BookingWidget.d.ts} +0 -0
  153. /package/dist/{calendar-styles.d.ts → styles/calendar-styles.d.ts} +0 -0
package/README.md CHANGED
@@ -24,11 +24,11 @@ It snaps into any `defineSaas` app and reshapes itself per vertical — booking
24
24
  ```bash
25
25
  npm install @fayz-ai/plugin-agenda
26
26
  ```
27
- Peer deps: `react`, `react-dom`. Runtime deps include `@fayz-ai/core`, `@fayz-ai/ui`, `@fayz-ai/saas`, `@fayz-ai/plugin-financial`, and FullCalendar.
27
+ Peer deps: `react`, `react-dom`. Runtime deps include `@fayz-ai/core`, `@fayz-ai/ui`, `@fayz-ai/admin`, `@fayz-ai/plugin-financial`, and FullCalendar.
28
28
 
29
29
  ## Usage
30
30
  ```tsx
31
- import { defineSaas } from '@fayz-ai/saas'
31
+ import { defineSaas } from '@fayz-ai/admin'
32
32
  import { createAgendaPlugin } from '@fayz-ai/plugin-agenda'
33
33
 
34
34
  export const app = defineSaas({
@@ -50,4 +50,4 @@ export const app = defineSaas({
50
50
  `plugin-agenda` is the front door for any booking-driven vertical (beauty, health, services). It pairs naturally with `@fayz-ai/plugin-financial` via the financial bridge, and with `@fayz-ai/plugin-reports` for occupancy and revenue analytics.
51
51
 
52
52
  ## Roadmap & contributing
53
- Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/ROADMAP.md#plugin-agenda) for current gaps, missing features, and good first issues.
53
+ Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/platform/ROADMAP.md#plugin-agenda) for current gaps, missing features, and good first issues.
@@ -1,5 +1,5 @@
1
1
  import type { FinancialDataProvider } from '@fayz-ai/plugin-financial';
2
- import type { AgendaFinancialBridge } from '../financial-bridge';
2
+ import type { AgendaFinancialBridge } from './financial-bridge';
3
3
  /**
4
4
  * Pure commission math: percentage of a realized order total, rounded to cents.
5
5
  * Exported for unit-testing and reuse; the bridge method below wraps the I/O.
@@ -1 +1 @@
1
- {"version":3,"file":"create-financial-bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/create-financial-bridge.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAqE,MAAM,qBAAqB,CAAA;AAGnI;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlF;AAeD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,qBAAqB,CA0O5F"}
1
+ {"version":3,"file":"create-financial-bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/create-financial-bridge.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAqE,MAAM,oBAAoB,CAAA;AAGlI;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlF;AAeD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,qBAAqB,CA0O5F"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/financial-bridge.ts"],"names":[],"mappings":"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"}
@@ -476,5 +476,5 @@ function createSupabasePublicBookingProvider(options) {
476
476
  }
477
477
 
478
478
  export { createMockAgendaProvider, createSupabasePublicBookingProvider };
479
- //# sourceMappingURL=chunk-Q2PAWBPR.js.map
480
- //# sourceMappingURL=chunk-Q2PAWBPR.js.map
479
+ //# sourceMappingURL=chunk-76ZOHRBM.js.map
480
+ //# sourceMappingURL=chunk-76ZOHRBM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/mock.ts","../src/public/data.supabase.ts"],"names":[],"mappings":"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","file":"chunk-Q2PAWBPR.js","sourcesContent":["import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet nextId = 1\nfunction uid(): string { return `mock-${nextId++}` }\nfunction now(): string { return new Date().toISOString() }\n\nfunction addMinutes(date: string, minutes: number): string {\n const d = new Date(date)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction timeOverlaps(aStart: string, aEnd: string, bStart: string, bEnd: string): boolean {\n return aStart < bEnd && aEnd > bStart\n}\n\n// ---------------------------------------------------------------------------\n// Sample data\n// ---------------------------------------------------------------------------\n\nconst SAMPLE_PROFESSIONALS: Professional[] = [\n { id: 'prof-1', name: 'Ana Silva', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-2', name: 'Carlos Santos', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-3', name: 'Maria Oliveira', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n]\n\nfunction createSampleBookings(): CalendarBooking[] {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n function dt(hour: number, minute = 0): string {\n return new Date(year, month, day, hour, minute).toISOString()\n }\n\n return [\n {\n id: 'bk-1', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(9, 0), endsAt: dt(10, 30), status: 'confirmed',\n notes: null, orderId: 'ord-1', locationId: 'loc-1', metadata: {},\n clientId: 'cl-1', clientName: 'Sarah Johnson', clientPhone: '(11) 99999-1111', clientEmail: 'sarah@email.com', clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 250, orderStatus: 'draft',\n services: [{ id: 'bi-1', serviceId: 'svc-1', name: 'Balayage', durationMinutes: 90, price: 250, assigneeId: 'prof-1' }],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-2', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(10, 0), endsAt: dt(11, 0), status: 'scheduled',\n notes: null, orderId: 'ord-2', locationId: 'loc-1', metadata: {},\n clientId: 'cl-2', clientName: 'Emily Carter', clientPhone: '(11) 99999-2222', clientEmail: 'emily@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 80, orderStatus: 'draft',\n services: [{ id: 'bi-2', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 60, price: 80, assigneeId: 'prof-2' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-3', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(14, 0), endsAt: dt(15, 0), status: 'confirmed',\n notes: 'First visit', orderId: 'ord-3', locationId: 'loc-1', metadata: {},\n clientId: 'cl-3', clientName: 'Rachel Kim', clientPhone: '(11) 99999-3333', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-3', professionalName: 'Maria Oliveira', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 120, orderStatus: 'draft',\n services: [{ id: 'bi-3', serviceId: 'svc-3', name: 'Facial Treatment', durationMinutes: 60, price: 120, assigneeId: 'prof-3' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-4', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(11, 0), endsAt: dt(12, 0), status: 'scheduled',\n notes: null, orderId: 'ord-4', locationId: 'loc-1', metadata: {},\n clientId: 'cl-4', clientName: 'Jessica Lima', clientPhone: '(11) 99999-4444', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 60, orderStatus: 'draft',\n services: [{ id: 'bi-4', serviceId: 'svc-4', name: 'Manicure', durationMinutes: 60, price: 60, assigneeId: 'prof-1' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-5', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(15, 30), endsAt: dt(17, 0), status: 'confirmed',\n notes: null, orderId: 'ord-5', locationId: 'loc-1', metadata: {},\n clientId: 'cl-5', clientName: 'Amanda Wright', clientPhone: '(11) 99999-5555', clientEmail: 'amanda@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 350, orderStatus: 'draft',\n services: [\n { id: 'bi-5', serviceId: 'svc-1', name: 'Highlights', durationMinutes: 60, price: 200, assigneeId: 'prof-2' },\n { id: 'bi-6', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 30, price: 150, assigneeId: 'prof-2' },\n ],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n ]\n}\n\nfunction createSampleSchedules(): Schedule[] {\n const schedules: Schedule[] = []\n for (const prof of SAMPLE_PROFESSIONALS) {\n // Mon-Fri 08:00-12:00, 13:00-18:00\n for (let day = 1; day <= 5; day++) {\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '08:00', endsAt: '12:00', isActive: true, metadata: {},\n })\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '13:00', endsAt: '18:00', isActive: true, metadata: {},\n })\n }\n // Saturday 08:00-14:00\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: 6, specificDate: null,\n startsAt: '08:00', endsAt: '14:00', isActive: true, metadata: {},\n })\n }\n return schedules\n}\n\n// ---------------------------------------------------------------------------\n// Mock provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-populated agenda data. Any omitted collection falls back to the built-in\n * salon-style sample. Pass `bookings` (and optionally an empty `professionals`)\n * to render a calendar seeded with app-specific events.\n */\nexport interface MockAgendaSeed {\n bookings?: CalendarBooking[]\n professionals?: Professional[]\n schedules?: Schedule[]\n}\n\nexport interface MockAgendaProviderOptions {\n seed?: MockAgendaSeed\n}\n\nexport function createMockAgendaProvider(options?: MockAgendaProviderOptions): AgendaDataProvider {\n const seed = options?.seed\n const bookings: CalendarBooking[] = seed?.bookings ? [...seed.bookings] : createSampleBookings()\n const schedules: Schedule[] = seed?.schedules ? [...seed.schedules] : createSampleSchedules()\n const professionals: Professional[] = seed?.professionals ? [...seed.professionals] : [...SAMPLE_PROFESSIONALS]\n\n return {\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n return []\n },\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n return bookings.filter((b) => {\n if (query.kind && b.kind !== query.kind) return false\n if (query.statuses?.length && !query.statuses.includes(b.status)) return false\n if (query.professionalIds?.length && !query.professionalIds.includes(b.professionalId ?? '')) return false\n if (query.locationId && b.locationId !== query.locationId) return false\n if (query.dateRange) {\n if (b.startsAt > query.dateRange.end || (b.endsAt ?? b.startsAt) < query.dateRange.start) return false\n }\n return true\n })\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n return bookings.find((b) => b.id === id) ?? null\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const totalDuration = input.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const totalPrice = input.services.reduce((sum, s) => sum + s.price, 0)\n const booking: CalendarBooking = {\n id: uid(), tenantId: 'mock', kind: input.kind ?? 'appointment',\n startsAt: input.startsAt, endsAt: addMinutes(input.startsAt, totalDuration || 30),\n status: 'scheduled', notes: input.notes ?? null,\n orderId: input.services.length > 0 ? uid() : null, locationId: input.locationId ?? null, metadata: {},\n clientId: input.clientId, clientName: input.title?.trim() || 'New Client', clientPhone: null, clientEmail: null, clientAvatarUrl: null,\n professionalId: input.professionalId,\n professionalName: professionals.find((p) => p.id === input.professionalId)?.name ?? 'Unknown',\n professionalAvatarUrl: null,\n locationName: null, orderTotal: totalPrice, orderStatus: 'draft',\n services: input.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? input.professionalId,\n })),\n totalDurationMinutes: totalDuration, createdAt: now(), updatedAt: now(),\n }\n bookings.push(booking)\n return booking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n const existing = bookings[idx]\n const serviceUpdates: Partial<CalendarBooking> = {}\n if (data.services) {\n serviceUpdates.services = data.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? existing.professionalId ?? '',\n }))\n serviceUpdates.totalDurationMinutes = data.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n serviceUpdates.orderTotal = data.services.reduce((sum, s) => sum + s.price, 0)\n }\n const updated: CalendarBooking = {\n ...existing,\n ...(data.startsAt && { startsAt: data.startsAt }),\n ...(data.endsAt && { endsAt: data.endsAt }),\n ...(data.title !== undefined && { clientName: data.title }),\n ...(data.status && { status: data.status }),\n ...(data.notes !== undefined && { notes: data.notes ?? null }),\n ...(data.professionalId && { professionalId: data.professionalId }),\n ...(data.clientId && { clientId: data.clientId }),\n ...(data.locationId && { locationId: data.locationId }),\n ...serviceUpdates,\n updatedAt: now(),\n }\n bookings[idx] = updated\n return updated\n },\n\n async deleteBooking(id: string): Promise<void> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx !== -1) bookings.splice(idx, 1)\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: status as BookingStatus, updatedAt: now() }\n return bookings[idx]\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n return bookings.some((b) => {\n if (params.excludeBookingId && b.id === params.excludeBookingId) return false\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, params.startsAt, params.endsAt)\n })\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n // Parse 'YYYY-MM-DD' as LOCAL midnight (not UTC) so the weekday and the\n // generated slot instants land on the requested calendar day in any tz.\n const [yy, mm, dd] = params.date.split('-').map(Number)\n const date = new Date(yy, (mm ?? 1) - 1, dd ?? 1)\n const dayOfWeek = date.getDay()\n const interval = params.slotInterval ?? 30\n\n // Get working hours for this professional on this day\n const daySchedules = schedules.filter((s) =>\n s.assigneeId === params.assigneeId && s.isActive &&\n (s.dayOfWeek === dayOfWeek || s.specificDate === params.date)\n )\n\n const slots: TimeSlot[] = []\n for (const sched of daySchedules) {\n const [startH, startM] = sched.startsAt.split(':').map(Number)\n const [endH, endM] = sched.endsAt.split(':').map(Number)\n const schedStart = new Date(date); schedStart.setHours(startH, startM, 0, 0)\n const schedEnd = new Date(date); schedEnd.setHours(endH, endM, 0, 0)\n\n let slotStart = new Date(schedStart)\n while (true) {\n const slotEnd = new Date(slotStart.getTime() + params.durationMinutes * 60000)\n if (slotEnd > schedEnd) break\n const startIso = slotStart.toISOString()\n const endIso = slotEnd.toISOString()\n const hasConflict = bookings.some((b) => {\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, startIso, endIso)\n })\n if (!hasConflict) {\n slots.push({ start: startIso, end: endIso })\n }\n slotStart = new Date(slotStart.getTime() + interval * 60000)\n }\n }\n return slots\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n if (professionalId) return schedules.filter((s) => s.assigneeId === professionalId)\n return [...schedules]\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const schedule: Schedule = {\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: input.assigneeId, locationId: input.locationId ?? null,\n dayOfWeek: input.dayOfWeek ?? null, specificDate: input.specificDate ?? null,\n startsAt: input.startsAt, endsAt: input.endsAt,\n isActive: input.isActive !== false, metadata: input.metadata ?? {},\n }\n schedules.push(schedule)\n return schedule\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const idx = schedules.findIndex((s) => s.id === id)\n if (idx !== -1) schedules.splice(idx, 1)\n },\n\n async getProfessionals(): Promise<Professional[]> {\n return [...professionals]\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n return bookings.filter((b) =>\n b.status === 'scheduled' && new Date(b.startsAt) <= cutoff && new Date(b.startsAt) >= new Date()\n )\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const booking = bookings.find((b) => b.id === bookingId)\n if (!booking) throw new Error('Booking not found')\n const confirmations = (booking.metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: now(), status: 'sent' })\n booking.metadata = { ...booking.metadata, confirmations }\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const idx = bookings.findIndex((b) => b.id === bookingId)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: 'completed', updatedAt: now() }\n return { booking: bookings[idx], orderId: bookings[idx].orderId ?? '' }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Supabase implementation of PublicBookingDataProvider — anon-safe.\n//\n// Public booking pages run with the publishable (anon) key and NO user session,\n// so the canonical tenant RLS (`tenant_id IN user_tenant_ids()`) yields nothing.\n// This provider therefore only touches objects designed for anon access:\n// - public.v_public_services (column-whitelisted view of active services)\n// - public.get_available_slots (SECURITY DEFINER RPC, mirrors the mock algo)\n// - public.create_public_booking (SECURITY DEFINER RPC: validates the slot,\n// upserts the customer person, writes order+booking+order_item atomically)\n// Shipped by plugins/plugin-agenda/src/migrations/001_public_booking.sql.\n// ---------------------------------------------------------------------------\n\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { TimeSlot } from '../types'\nimport type { PublicService } from './types'\nimport type { PublicBookingDataProvider } from './data'\n\nexport interface SupabasePublicBookingOptions {\n /** The tenant this public page books against (RPC arg — required). */\n tenantId: string\n}\n\ninterface SupabaseLikeClient {\n from(table: string): any\n rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }>\n}\n\nfunction getClient(): SupabaseLikeClient {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('No Supabase client registered — call setGlobalSupabaseClient() at app startup.')\n return client as SupabaseLikeClient\n}\n\n/** Digits-only phone (RPC normalizes again server-side; keep the dial code). */\nfunction toPhoneDigits(phone: string | undefined): string {\n return (phone ?? '').replace(/\\D/g, '')\n}\n\nexport function createSupabasePublicBookingProvider(options: SupabasePublicBookingOptions): PublicBookingDataProvider {\n const { tenantId } = options\n\n return {\n async getServices(): Promise<PublicService[]> {\n const { data, error } = await getClient()\n .from('v_public_services')\n .select('id, name, description, price, currency, duration_minutes, sort_order')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n if (error) throw new Error(`[plugin-agenda/public] getServices: ${error.message}`)\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n id: String(row.id),\n name: String(row.name),\n description: (row.description as string | null) ?? undefined,\n price: Number(row.price ?? 0),\n durationMinutes: Number(row.duration_minutes ?? 30),\n }))\n },\n\n async getAvailableSlots(query): Promise<TimeSlot[]> {\n const { data, error } = await getClient().rpc('get_available_slots', {\n p_tenant_id: tenantId,\n p_assignee_id: query.assigneeId,\n p_date: query.date,\n p_duration_minutes: query.durationMinutes,\n p_slot_interval: query.slotInterval,\n })\n if (error) throw new Error(`[plugin-agenda/public] getAvailableSlots: ${error.message}`)\n return ((data ?? []) as Array<{ slot_start: string; slot_end: string }>).map((row) => ({\n start: row.slot_start,\n end: row.slot_end,\n }))\n },\n\n async createBooking(input) {\n const phone = toPhoneDigits(input.contact.phone)\n const { data, error } = await getClient().rpc('create_public_booking', {\n p_tenant_id: tenantId,\n p_service_id: input.serviceId,\n p_starts_at: input.startsAt,\n p_name: input.contact.name.trim(),\n p_phone: phone,\n p_email: input.contact.email?.trim() || null,\n p_notes: input.contact.notes?.trim() || null,\n // Only sent when pinned — keeps compatibility with pools still running\n // the pre-004 7-arg function (unknown named arg would 404 on PostgREST).\n ...(input.assigneeId ? { p_assignee_id: input.assigneeId } : {}),\n })\n if (error) throw new Error(`[plugin-agenda/public] createBooking: ${error.message}`)\n const row = (Array.isArray(data) ? data[0] : data) as\n | { booking_id: string; starts_at: string; ends_at: string }\n | undefined\n if (!row) throw new Error('[plugin-agenda/public] createBooking: empty RPC response')\n return { bookingId: row.booking_id, startsAt: row.starts_at, endsAt: row.ends_at }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/data/mock.ts","../src/public/data/supabase.ts"],"names":[],"mappings":"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","file":"chunk-76ZOHRBM.js","sourcesContent":["import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nlet nextId = 1\nfunction uid(): string { return `mock-${nextId++}` }\nfunction now(): string { return new Date().toISOString() }\n\nfunction addMinutes(date: string, minutes: number): string {\n const d = new Date(date)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction timeOverlaps(aStart: string, aEnd: string, bStart: string, bEnd: string): boolean {\n return aStart < bEnd && aEnd > bStart\n}\n\n// ---------------------------------------------------------------------------\n// Sample data\n// ---------------------------------------------------------------------------\n\nconst SAMPLE_PROFESSIONALS: Professional[] = [\n { id: 'prof-1', name: 'Ana Silva', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-2', name: 'Carlos Santos', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n { id: 'prof-3', name: 'Maria Oliveira', avatarUrl: null, locationId: 'loc-1', locationName: 'Main Branch', isActive: true },\n]\n\nfunction createSampleBookings(): CalendarBooking[] {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n function dt(hour: number, minute = 0): string {\n return new Date(year, month, day, hour, minute).toISOString()\n }\n\n return [\n {\n id: 'bk-1', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(9, 0), endsAt: dt(10, 30), status: 'confirmed',\n notes: null, orderId: 'ord-1', locationId: 'loc-1', metadata: {},\n clientId: 'cl-1', clientName: 'Sarah Johnson', clientPhone: '(11) 99999-1111', clientEmail: 'sarah@email.com', clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 250, orderStatus: 'draft',\n services: [{ id: 'bi-1', serviceId: 'svc-1', name: 'Balayage', durationMinutes: 90, price: 250, assigneeId: 'prof-1' }],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-2', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(10, 0), endsAt: dt(11, 0), status: 'scheduled',\n notes: null, orderId: 'ord-2', locationId: 'loc-1', metadata: {},\n clientId: 'cl-2', clientName: 'Emily Carter', clientPhone: '(11) 99999-2222', clientEmail: 'emily@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 80, orderStatus: 'draft',\n services: [{ id: 'bi-2', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 60, price: 80, assigneeId: 'prof-2' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-3', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(14, 0), endsAt: dt(15, 0), status: 'confirmed',\n notes: 'First visit', orderId: 'ord-3', locationId: 'loc-1', metadata: {},\n clientId: 'cl-3', clientName: 'Rachel Kim', clientPhone: '(11) 99999-3333', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-3', professionalName: 'Maria Oliveira', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 120, orderStatus: 'draft',\n services: [{ id: 'bi-3', serviceId: 'svc-3', name: 'Facial Treatment', durationMinutes: 60, price: 120, assigneeId: 'prof-3' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-4', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(11, 0), endsAt: dt(12, 0), status: 'scheduled',\n notes: null, orderId: 'ord-4', locationId: 'loc-1', metadata: {},\n clientId: 'cl-4', clientName: 'Jessica Lima', clientPhone: '(11) 99999-4444', clientEmail: null, clientAvatarUrl: null,\n professionalId: 'prof-1', professionalName: 'Ana Silva', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 60, orderStatus: 'draft',\n services: [{ id: 'bi-4', serviceId: 'svc-4', name: 'Manicure', durationMinutes: 60, price: 60, assigneeId: 'prof-1' }],\n totalDurationMinutes: 60, createdAt: now(), updatedAt: now(),\n },\n {\n id: 'bk-5', tenantId: 'mock', kind: 'appointment',\n startsAt: dt(15, 30), endsAt: dt(17, 0), status: 'confirmed',\n notes: null, orderId: 'ord-5', locationId: 'loc-1', metadata: {},\n clientId: 'cl-5', clientName: 'Amanda Wright', clientPhone: '(11) 99999-5555', clientEmail: 'amanda@email.com', clientAvatarUrl: null,\n professionalId: 'prof-2', professionalName: 'Carlos Santos', professionalAvatarUrl: null,\n locationName: 'Main Branch', orderTotal: 350, orderStatus: 'draft',\n services: [\n { id: 'bi-5', serviceId: 'svc-1', name: 'Highlights', durationMinutes: 60, price: 200, assigneeId: 'prof-2' },\n { id: 'bi-6', serviceId: 'svc-2', name: 'Haircut', durationMinutes: 30, price: 150, assigneeId: 'prof-2' },\n ],\n totalDurationMinutes: 90, createdAt: now(), updatedAt: now(),\n },\n ]\n}\n\nfunction createSampleSchedules(): Schedule[] {\n const schedules: Schedule[] = []\n for (const prof of SAMPLE_PROFESSIONALS) {\n // Mon-Fri 08:00-12:00, 13:00-18:00\n for (let day = 1; day <= 5; day++) {\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '08:00', endsAt: '12:00', isActive: true, metadata: {},\n })\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: day, specificDate: null,\n startsAt: '13:00', endsAt: '18:00', isActive: true, metadata: {},\n })\n }\n // Saturday 08:00-14:00\n schedules.push({\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: prof.id, locationId: prof.locationId,\n dayOfWeek: 6, specificDate: null,\n startsAt: '08:00', endsAt: '14:00', isActive: true, metadata: {},\n })\n }\n return schedules\n}\n\n// ---------------------------------------------------------------------------\n// Mock provider factory\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-populated agenda data. Any omitted collection falls back to the built-in\n * salon-style sample. Pass `bookings` (and optionally an empty `professionals`)\n * to render a calendar seeded with app-specific events.\n */\nexport interface MockAgendaSeed {\n bookings?: CalendarBooking[]\n professionals?: Professional[]\n schedules?: Schedule[]\n}\n\nexport interface MockAgendaProviderOptions {\n seed?: MockAgendaSeed\n}\n\nexport function createMockAgendaProvider(options?: MockAgendaProviderOptions): AgendaDataProvider {\n const seed = options?.seed\n const bookings: CalendarBooking[] = seed?.bookings ? [...seed.bookings] : createSampleBookings()\n const schedules: Schedule[] = seed?.schedules ? [...seed.schedules] : createSampleSchedules()\n const professionals: Professional[] = seed?.professionals ? [...seed.professionals] : [...SAMPLE_PROFESSIONALS]\n\n return {\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n return []\n },\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n return bookings.filter((b) => {\n if (query.kind && b.kind !== query.kind) return false\n if (query.statuses?.length && !query.statuses.includes(b.status)) return false\n if (query.professionalIds?.length && !query.professionalIds.includes(b.professionalId ?? '')) return false\n if (query.locationId && b.locationId !== query.locationId) return false\n if (query.dateRange) {\n if (b.startsAt > query.dateRange.end || (b.endsAt ?? b.startsAt) < query.dateRange.start) return false\n }\n return true\n })\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n return bookings.find((b) => b.id === id) ?? null\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const totalDuration = input.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const totalPrice = input.services.reduce((sum, s) => sum + s.price, 0)\n const booking: CalendarBooking = {\n id: uid(), tenantId: 'mock', kind: input.kind ?? 'appointment',\n startsAt: input.startsAt, endsAt: addMinutes(input.startsAt, totalDuration || 30),\n status: 'scheduled', notes: input.notes ?? null,\n orderId: input.services.length > 0 ? uid() : null, locationId: input.locationId ?? null, metadata: {},\n clientId: input.clientId, clientName: input.title?.trim() || 'New Client', clientPhone: null, clientEmail: null, clientAvatarUrl: null,\n professionalId: input.professionalId,\n professionalName: professionals.find((p) => p.id === input.professionalId)?.name ?? 'Unknown',\n professionalAvatarUrl: null,\n locationName: null, orderTotal: totalPrice, orderStatus: 'draft',\n services: input.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? input.professionalId,\n })),\n totalDurationMinutes: totalDuration, createdAt: now(), updatedAt: now(),\n }\n bookings.push(booking)\n return booking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n const existing = bookings[idx]\n const serviceUpdates: Partial<CalendarBooking> = {}\n if (data.services) {\n serviceUpdates.services = data.services.map((s) => ({\n id: uid(), serviceId: s.serviceId, name: s.name,\n durationMinutes: s.durationMinutes, price: s.price,\n assigneeId: s.assigneeId ?? existing.professionalId ?? '',\n }))\n serviceUpdates.totalDurationMinutes = data.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n serviceUpdates.orderTotal = data.services.reduce((sum, s) => sum + s.price, 0)\n }\n const updated: CalendarBooking = {\n ...existing,\n ...(data.startsAt && { startsAt: data.startsAt }),\n ...(data.endsAt && { endsAt: data.endsAt }),\n ...(data.title !== undefined && { clientName: data.title }),\n ...(data.status && { status: data.status }),\n ...(data.notes !== undefined && { notes: data.notes ?? null }),\n ...(data.professionalId && { professionalId: data.professionalId }),\n ...(data.clientId && { clientId: data.clientId }),\n ...(data.locationId && { locationId: data.locationId }),\n ...serviceUpdates,\n updatedAt: now(),\n }\n bookings[idx] = updated\n return updated\n },\n\n async deleteBooking(id: string): Promise<void> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx !== -1) bookings.splice(idx, 1)\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n const idx = bookings.findIndex((b) => b.id === id)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: status as BookingStatus, updatedAt: now() }\n return bookings[idx]\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n return bookings.some((b) => {\n if (params.excludeBookingId && b.id === params.excludeBookingId) return false\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, params.startsAt, params.endsAt)\n })\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n // Parse 'YYYY-MM-DD' as LOCAL midnight (not UTC) so the weekday and the\n // generated slot instants land on the requested calendar day in any tz.\n const [yy, mm, dd] = params.date.split('-').map(Number)\n const date = new Date(yy, (mm ?? 1) - 1, dd ?? 1)\n const dayOfWeek = date.getDay()\n const interval = params.slotInterval ?? 30\n\n // Get working hours for this professional on this day\n const daySchedules = schedules.filter((s) =>\n s.assigneeId === params.assigneeId && s.isActive &&\n (s.dayOfWeek === dayOfWeek || s.specificDate === params.date)\n )\n\n const slots: TimeSlot[] = []\n for (const sched of daySchedules) {\n const [startH, startM] = sched.startsAt.split(':').map(Number)\n const [endH, endM] = sched.endsAt.split(':').map(Number)\n const schedStart = new Date(date); schedStart.setHours(startH, startM, 0, 0)\n const schedEnd = new Date(date); schedEnd.setHours(endH, endM, 0, 0)\n\n let slotStart = new Date(schedStart)\n while (true) {\n const slotEnd = new Date(slotStart.getTime() + params.durationMinutes * 60000)\n if (slotEnd > schedEnd) break\n const startIso = slotStart.toISOString()\n const endIso = slotEnd.toISOString()\n const hasConflict = bookings.some((b) => {\n if (b.professionalId !== params.assigneeId) return false\n if (b.status === 'cancelled' || b.status === 'no_show') return false\n return timeOverlaps(b.startsAt, b.endsAt ?? b.startsAt, startIso, endIso)\n })\n if (!hasConflict) {\n slots.push({ start: startIso, end: endIso })\n }\n slotStart = new Date(slotStart.getTime() + interval * 60000)\n }\n }\n return slots\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n if (professionalId) return schedules.filter((s) => s.assigneeId === professionalId)\n return [...schedules]\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const schedule: Schedule = {\n id: uid(), tenantId: 'mock', kind: 'working_hours',\n assigneeId: input.assigneeId, locationId: input.locationId ?? null,\n dayOfWeek: input.dayOfWeek ?? null, specificDate: input.specificDate ?? null,\n startsAt: input.startsAt, endsAt: input.endsAt,\n isActive: input.isActive !== false, metadata: input.metadata ?? {},\n }\n schedules.push(schedule)\n return schedule\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const idx = schedules.findIndex((s) => s.id === id)\n if (idx !== -1) schedules.splice(idx, 1)\n },\n\n async getProfessionals(): Promise<Professional[]> {\n return [...professionals]\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n return bookings.filter((b) =>\n b.status === 'scheduled' && new Date(b.startsAt) <= cutoff && new Date(b.startsAt) >= new Date()\n )\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const booking = bookings.find((b) => b.id === bookingId)\n if (!booking) throw new Error('Booking not found')\n const confirmations = (booking.metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: now(), status: 'sent' })\n booking.metadata = { ...booking.metadata, confirmations }\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const idx = bookings.findIndex((b) => b.id === bookingId)\n if (idx === -1) throw new Error('Booking not found')\n bookings[idx] = { ...bookings[idx], status: 'completed', updatedAt: now() }\n return { booking: bookings[idx], orderId: bookings[idx].orderId ?? '' }\n },\n }\n}\n","// ---------------------------------------------------------------------------\n// Supabase implementation of PublicBookingDataProvider — anon-safe.\n//\n// Public booking pages run with the publishable (anon) key and NO user session,\n// so the canonical tenant RLS (`tenant_id IN user_tenant_ids()`) yields nothing.\n// This provider therefore only touches objects designed for anon access:\n// - public.v_public_services (column-whitelisted view of active services)\n// - public.get_available_slots (SECURITY DEFINER RPC, mirrors the mock algo)\n// - public.create_public_booking (SECURITY DEFINER RPC: validates the slot,\n// upserts the customer person, writes order+booking+order_item atomically)\n// Shipped by plugins/plugin-agenda/src/migrations/001_public_booking.sql.\n// ---------------------------------------------------------------------------\n\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { TimeSlot } from '../../types'\nimport type { PublicService } from '../types'\nimport type { PublicBookingDataProvider } from './index'\n\nexport interface SupabasePublicBookingOptions {\n /** The tenant this public page books against (RPC arg — required). */\n tenantId: string\n}\n\ninterface SupabaseLikeClient {\n from(table: string): any\n rpc(fn: string, args: Record<string, unknown>): PromiseLike<{ data: unknown; error: { message: string } | null }>\n}\n\nfunction getClient(): SupabaseLikeClient {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('No Supabase client registered — call setGlobalSupabaseClient() at app startup.')\n return client as SupabaseLikeClient\n}\n\n/** Digits-only phone (RPC normalizes again server-side; keep the dial code). */\nfunction toPhoneDigits(phone: string | undefined): string {\n return (phone ?? '').replace(/\\D/g, '')\n}\n\nexport function createSupabasePublicBookingProvider(options: SupabasePublicBookingOptions): PublicBookingDataProvider {\n const { tenantId } = options\n\n return {\n async getServices(): Promise<PublicService[]> {\n const { data, error } = await getClient()\n .from('v_public_services')\n .select('id, name, description, price, currency, duration_minutes, sort_order')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n if (error) throw new Error(`[plugin-agenda/public] getServices: ${error.message}`)\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n id: String(row.id),\n name: String(row.name),\n description: (row.description as string | null) ?? undefined,\n price: Number(row.price ?? 0),\n durationMinutes: Number(row.duration_minutes ?? 30),\n }))\n },\n\n async getAvailableSlots(query): Promise<TimeSlot[]> {\n const { data, error } = await getClient().rpc('get_available_slots', {\n p_tenant_id: tenantId,\n p_assignee_id: query.assigneeId,\n p_date: query.date,\n p_duration_minutes: query.durationMinutes,\n p_slot_interval: query.slotInterval,\n })\n if (error) throw new Error(`[plugin-agenda/public] getAvailableSlots: ${error.message}`)\n return ((data ?? []) as Array<{ slot_start: string; slot_end: string }>).map((row) => ({\n start: row.slot_start,\n end: row.slot_end,\n }))\n },\n\n async createBooking(input) {\n const phone = toPhoneDigits(input.contact.phone)\n const { data, error } = await getClient().rpc('create_public_booking', {\n p_tenant_id: tenantId,\n p_service_id: input.serviceId,\n p_starts_at: input.startsAt,\n p_name: input.contact.name.trim(),\n p_phone: phone,\n p_email: input.contact.email?.trim() || null,\n p_notes: input.contact.notes?.trim() || null,\n // Only sent when pinned — keeps compatibility with pools still running\n // the pre-004 7-arg function (unknown named arg would 404 on PostgREST).\n ...(input.assigneeId ? { p_assignee_id: input.assigneeId } : {}),\n })\n if (error) throw new Error(`[plugin-agenda/public] createBooking: ${error.message}`)\n const row = (Array.isArray(data) ? data[0] : data) as\n | { booking_id: string; starts_at: string; ends_at: string }\n | undefined\n if (!row) throw new Error('[plugin-agenda/public] createBooking: empty RPC response')\n return { bookingId: row.booking_id, startsAt: row.starts_at, endsAt: row.ends_at }\n },\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { BookingPaymentStatus } from '../financial-bridge';
2
+ import type { BookingPaymentStatus } from '../bridges/financial-bridge';
3
3
  interface PaymentStatusBadgeProps {
4
4
  status: BookingPaymentStatus;
5
5
  totalAmount?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentStatusBadge.d.ts","sourceRoot":"","sources":["../../src/components/PaymentStatusBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAiB/D,UAAU,uBAAuB;IAC/B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAClE,EAAE,uBAAuB,qBA+BzB"}
1
+ {"version":3,"file":"PaymentStatusBadge.d.ts","sourceRoot":"","sources":["../../src/components/PaymentStatusBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAiBvE,UAAU,uBAAuB;IAC/B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAClE,EAAE,uBAAuB,qBA+BzB"}
package/dist/config.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core';
2
- import type { EntityLookup } from '@fayz-ai/saas';
2
+ import type { EntityLookup } from '@fayz-ai/admin';
3
3
  import type { AgendaDataProvider } from './data/types';
4
4
  import type { StatusConfig, BookingTypeConfig } from './types';
5
- import type { AgendaFinancialBridge } from './financial-bridge';
5
+ import type { AgendaFinancialBridge } from './bridges/financial-bridge';
6
6
  import type { EntityDef } from '@fayz-ai/core';
7
7
  export interface AgendaPluginLabels {
8
8
  pageTitle: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,4 @@ export declare const AgendaContextProvider: import("react").FC<{
10
10
  export declare const useAgendaConfig: () => ResolvedAgendaConfig;
11
11
  export declare const useAgendaProvider: () => AgendaDataProvider;
12
12
  export declare const useAgendaStore: <T>(selector: (state: AgendaUIState) => T) => T;
13
- //# sourceMappingURL=AgendaContext.d.ts.map
13
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAI5C,eAAO,MAAM,qBAAqB;;;;;EAAsB,CAAA;AACxD,eAAO,MAAM,eAAe,4BAAgB,CAAA;AAC5C,eAAO,MAAM,iBAAiB,0BAAkB,CAAA;AAChD,eAAO,MAAM,cAAc,iDAAe,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../../src/data/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AA2BtD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAO/C,CAAA"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,8 @@ export type { ResolvedAgendaConfig } from './config';
6
6
  export type { AgendaDataProvider } from './data/types';
7
7
  export { createMockAgendaProvider } from './data/mock';
8
8
  export type { MockAgendaSeed, MockAgendaProviderOptions } from './data/mock';
9
- export type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './financial-bridge';
9
+ export type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './bridges/financial-bridge';
10
10
  export { createFinancialBridge, computeCommissionAmount } from './bridges/create-financial-bridge';
11
11
  export { createGoogleCalendarPlugin, createGoogleCalendarProvider, googleCalendarConnector, bookingToEvent, eventToBookingPatch } from './integrations/google-calendar';
12
+ export { buildAgendaDomainEvents, buildAgendaMessageDefaults } from './lib/message-events';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAiBnD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAsQhF;AAGD,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAC5E,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAClI,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAGlG,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAGnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAiBnD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CA4QhF;AAGD,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAC5E,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC1I,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAGlG,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAIvK,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { createMockAgendaProvider, createSupabasePublicBookingProvider } from './chunk-Q2PAWBPR.js';
2
- export { createMockAgendaProvider } from './chunk-Q2PAWBPR.js';
1
+ import { createMockAgendaProvider, createSupabasePublicBookingProvider } from './chunk-76ZOHRBM.js';
2
+ export { createMockAgendaProvider } from './chunk-76ZOHRBM.js';
3
3
  import React13, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
4
- import { getSupabaseClientOptional, getActiveTenantId, registerTranslations, createSafeDataProvider, emitDataChanged, usePluginRuntimeOptional, useTranslation, getCurrentLocale, useDataChanged, formatCurrency } from '@fayz-ai/core';
5
- import { createPluginContext, setScheduleBlockConfig, getScheduleBlockConfig, PluginSettingsPanel, dedup, useTenantPluginSettings, SettingsGroup, ToggleRow, SelectRow, usePluginPrefs, PersonLink, useLimitGuard, CrudFormPage, CrudDetailPage, ContactPicker, invalidateLimit } from '@fayz-ai/saas';
4
+ import { getSupabaseClientOptional, getActiveTenantId, registerTranslations, registerMessageDefaults, createSafeDataProvider, emitDataChanged, usePluginRuntimeOptional, useTranslation, getCurrentLocale, useDataChanged, formatCurrency } from '@fayz-ai/core';
5
+ import { createPluginContext, setScheduleBlockConfig, getScheduleBlockConfig, PluginSettingsPanel, dedup, useTenantPluginSettings, SettingsGroup, ToggleRow, SelectRow, usePluginPrefs, PersonLink, useLimitGuard, CrudFormPage, CrudDetailPage, ContactPicker, invalidateLimit } from '@fayz-ai/admin';
6
6
  import FullCalendar from '@fullcalendar/react';
7
7
  import dayGridPlugin from '@fullcalendar/daygrid';
8
8
  import timeGridPlugin from '@fullcalendar/timegrid';
@@ -16,6 +16,166 @@ import { createPortal } from 'react-dom';
16
16
  import { Button, toast, Checkbox, Badge, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, ConfirmDialog, Modal, ModalContent, ModalTitle, SearchCombobox, cn, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '@fayz-ai/ui';
17
17
  import { createStore } from 'zustand/vanilla';
18
18
 
19
+ // src/lib/message-events.ts
20
+ var BOOKING_FIELDS = [
21
+ { name: "customer_name", label: "Cliente", type: "string", example: "Maria Silva" },
22
+ { name: "service_name", label: "Servi\xE7o", type: "string", example: "Corte + Escova" },
23
+ { name: "professional_name", label: "Profissional", type: "string", example: "Camila Duarte" },
24
+ { name: "booking_date", label: "Data", type: "date", example: "12/08/2026" },
25
+ { name: "booking_time", label: "Hor\xE1rio", type: "string", example: "14:30" },
26
+ { name: "location_name", label: "Local", type: "string", example: "Unidade Centro" },
27
+ { name: "business_name", label: "Seu neg\xF3cio", type: "string", example: "Seu Neg\xF3cio" }
28
+ ];
29
+ function buildAgendaDomainEvents() {
30
+ return [
31
+ {
32
+ name: "agenda.booking_created",
33
+ title: "Agendamento criado",
34
+ icon: "CalendarPlus",
35
+ audit: true,
36
+ description: "Um hor\xE1rio foi marcado",
37
+ trigger: "Quando o agendamento \xE9 criado (recep\xE7\xE3o, site ou app)",
38
+ fields: BOOKING_FIELDS
39
+ },
40
+ {
41
+ name: "agenda.booking_reminder",
42
+ title: "Lembrete de hor\xE1rio",
43
+ icon: "BellRing",
44
+ audit: false,
45
+ description: "V\xE9spera do atendimento",
46
+ trigger: "No dia anterior ao hor\xE1rio marcado",
47
+ fields: BOOKING_FIELDS
48
+ },
49
+ {
50
+ name: "agenda.booking_rescheduled",
51
+ title: "Hor\xE1rio remarcado",
52
+ icon: "CalendarClock",
53
+ audit: true,
54
+ description: "O atendimento mudou de dia ou de hora",
55
+ trigger: "Quando a data ou o hor\xE1rio do agendamento muda",
56
+ fields: BOOKING_FIELDS
57
+ },
58
+ {
59
+ name: "agenda.booking_cancelled",
60
+ title: "Agendamento cancelado",
61
+ icon: "CalendarX",
62
+ audit: true,
63
+ description: "O hor\xE1rio foi desmarcado",
64
+ trigger: "Quando o agendamento \xE9 cancelado",
65
+ fields: BOOKING_FIELDS
66
+ },
67
+ {
68
+ name: "agenda.booking_completed",
69
+ title: "Atendimento conclu\xEDdo",
70
+ icon: "CalendarCheck",
71
+ audit: true,
72
+ description: "O atendimento aconteceu",
73
+ trigger: "Quando o agendamento \xE9 marcado como conclu\xEDdo",
74
+ fields: BOOKING_FIELDS
75
+ },
76
+ {
77
+ name: "agenda.booking_no_show",
78
+ title: "Cliente n\xE3o compareceu",
79
+ icon: "UserX",
80
+ audit: true,
81
+ description: "O hor\xE1rio foi perdido",
82
+ trigger: "Quando o agendamento \xE9 marcado como falta",
83
+ fields: BOOKING_FIELDS
84
+ }
85
+ ];
86
+ }
87
+ function buildAgendaMessageDefaults() {
88
+ return [
89
+ {
90
+ eventKey: "agenda.booking_created",
91
+ kind: "transactional",
92
+ // WhatsApp na frente em toda a agenda: confirmação de horário é lida no
93
+ // celular, e no Brasil é lá que a cliente responde.
94
+ channels: ["whatsapp", "email"],
95
+ defaults: {
96
+ whatsapp: {
97
+ body: "Oi {{customer_name}}! Seu hor\xE1rio est\xE1 marcado \u2705\n\n*{{service_name}}*\n{{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n\nQualquer coisa \xE9 s\xF3 chamar aqui. \u2014 {{business_name}}"
98
+ },
99
+ email: {
100
+ subject: "Hor\xE1rio confirmado \u2014 {{booking_date}} \xE0s {{booking_time}}",
101
+ body: "Ol\xE1 {{customer_name}},\n\nSeu hor\xE1rio est\xE1 confirmado:\n\n{{service_name}}\n{{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n{{location_name}}\n\nAt\xE9 l\xE1!\n{{business_name}}"
102
+ }
103
+ },
104
+ // Confirmar por e-mail é o mínimo que se espera de quem acabou de marcar
105
+ // um horário — nasce ligado. O WhatsApp custa por mensagem e exige número
106
+ // aprovado; ligá-lo sozinho gastaria o dinheiro de alguém sem ser pedido.
107
+ defaultEnabled: { email: true }
108
+ },
109
+ {
110
+ eventKey: "agenda.booking_reminder",
111
+ kind: "transactional",
112
+ channels: ["whatsapp", "email"],
113
+ defaults: {
114
+ whatsapp: {
115
+ body: "Oi {{customer_name}}! Passando para lembrar do seu hor\xE1rio amanh\xE3 \u{1F487}\n\n*{{service_name}}*\n{{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n\nConsegue vir? Se precisar remarcar, me avisa por aqui. \u2014 {{business_name}}"
116
+ },
117
+ email: {
118
+ subject: "Lembrete: seu hor\xE1rio \xE9 amanh\xE3, {{booking_time}}",
119
+ body: "Ol\xE1 {{customer_name}},\n\nSeu hor\xE1rio \xE9 amanh\xE3:\n\n{{service_name}}\n{{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n{{location_name}}\n\nSe precisar remarcar, \xE9 s\xF3 responder este e-mail.\n\n{{business_name}}"
120
+ }
121
+ },
122
+ defaultEnabled: { email: true }
123
+ },
124
+ {
125
+ eventKey: "agenda.booking_rescheduled",
126
+ kind: "transactional",
127
+ channels: ["whatsapp", "email"],
128
+ defaults: {
129
+ whatsapp: {
130
+ body: "Oi {{customer_name}}! Seu hor\xE1rio foi remarcado \u{1F5D3}\n\n*{{service_name}}*\nAgora: {{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n\n\u2014 {{business_name}}"
131
+ },
132
+ email: {
133
+ subject: "Seu hor\xE1rio mudou para {{booking_date}}, {{booking_time}}",
134
+ body: "Ol\xE1 {{customer_name}},\n\nSeu hor\xE1rio foi remarcado:\n\n{{service_name}}\n{{booking_date}} \xE0s {{booking_time}}\ncom {{professional_name}}\n\n{{business_name}}"
135
+ }
136
+ },
137
+ defaultEnabled: { email: true }
138
+ },
139
+ {
140
+ eventKey: "agenda.booking_cancelled",
141
+ kind: "transactional",
142
+ channels: ["whatsapp", "email"],
143
+ defaults: {
144
+ whatsapp: {
145
+ body: "Oi {{customer_name}}, seu hor\xE1rio de {{booking_date}} \xE0s {{booking_time}} foi cancelado.\n\nQuer que eu veja outra data para voc\xEA? \u2014 {{business_name}}"
146
+ },
147
+ email: {
148
+ subject: "Hor\xE1rio de {{booking_date}} cancelado",
149
+ body: "Ol\xE1 {{customer_name}},\n\nSeu hor\xE1rio de {{booking_date}} \xE0s {{booking_time}} foi cancelado.\n\nSe quiser remarcar, \xE9 s\xF3 responder este e-mail.\n\n{{business_name}}"
150
+ }
151
+ },
152
+ defaultEnabled: { email: true }
153
+ },
154
+ {
155
+ eventKey: "agenda.booking_completed",
156
+ kind: "marketing",
157
+ // Pedir opinião é iniciativa do negócio, não resposta a um ato da
158
+ // pessoa — e é por isso que nasce desligado.
159
+ channels: ["whatsapp"],
160
+ defaults: {
161
+ whatsapp: {
162
+ body: "Oi {{customer_name}}! Foi \xF3timo te atender hoje \u{1F49B}\n\nComo foi a experi\xEAncia com {{professional_name}}? Sua opini\xE3o ajuda demais.\n\n\u2014 {{business_name}}"
163
+ }
164
+ }
165
+ },
166
+ {
167
+ eventKey: "agenda.booking_no_show",
168
+ kind: "transactional",
169
+ channels: ["whatsapp"],
170
+ defaults: {
171
+ whatsapp: {
172
+ body: "Oi {{customer_name}}, senti sua falta no hor\xE1rio de {{booking_date}} \u{1F614}\n\nAconteceu alguma coisa? Se quiser, j\xE1 deixo outro hor\xE1rio separado para voc\xEA. \u2014 {{business_name}}"
173
+ }
174
+ }
175
+ }
176
+ ];
177
+ }
178
+
19
179
  // src/config.ts
20
180
  var DEFAULT_LABELS = {
21
181
  pageTitle: "Agenda",
@@ -140,7 +300,7 @@ var useAgendaConfig = ctx.useConfig;
140
300
  var useAgendaProvider = ctx.useProvider;
141
301
  var useAgendaStore = ctx.useStore;
142
302
 
143
- // src/calendar-styles.ts
303
+ // src/styles/calendar-styles.ts
144
304
  var STYLE_ID = "saas-agenda-calendar-styles";
145
305
  var css = (
146
306
  /* css */
@@ -3827,7 +3987,7 @@ function createAgendaStore(provider2, financialBridge) {
3827
3987
  }));
3828
3988
  }
3829
3989
 
3830
- // src/registries.ts
3990
+ // src/data/registries.ts
3831
3991
  var holidayEntity = {
3832
3992
  name: "Holiday",
3833
3993
  namePlural: "Holidays",
@@ -5654,6 +5814,7 @@ function createGoogleCalendarPlugin() {
5654
5814
  function createAgendaPlugin(options) {
5655
5815
  const config = resolveConfig(options);
5656
5816
  registerTranslations(agendaLocales);
5817
+ registerMessageDefaults(buildAgendaMessageDefaults());
5657
5818
  const provider2 = options?.dataProvider ?? createSafeDataProvider(
5658
5819
  () => createSupabaseAgendaProvider({ professionalKind: config.professionalKind }),
5659
5820
  () => createMockAgendaProvider()
@@ -5688,6 +5849,8 @@ function createAgendaPlugin(options) {
5688
5849
  scaffolds: ["saas"],
5689
5850
  defaultEnabled: true,
5690
5851
  dependencies: [],
5852
+ // Os FATOS da agenda — só expostos enquanto o módulo está ATIVO.
5853
+ events: buildAgendaDomainEvents(),
5691
5854
  declaredFeatures: [
5692
5855
  { id: "appointments", label: config.labels.pageTitle, group: config.labels.pageTitle },
5693
5856
  { id: "agenda.schedules", label: "Schedule Management", group: config.labels.pageTitle }
@@ -5893,6 +6056,6 @@ function createAgendaPlugin(options) {
5893
6056
  };
5894
6057
  }
5895
6058
 
5896
- export { bookingToEvent2 as bookingToEvent, computeCommissionAmount, createAgendaPlugin, createFinancialBridge, createGoogleCalendarPlugin, createGoogleCalendarProvider, eventToBookingPatch, googleCalendarConnector };
6059
+ export { bookingToEvent2 as bookingToEvent, buildAgendaDomainEvents, buildAgendaMessageDefaults, computeCommissionAmount, createAgendaPlugin, createFinancialBridge, createGoogleCalendarPlugin, createGoogleCalendarProvider, eventToBookingPatch, googleCalendarConnector };
5897
6060
  //# sourceMappingURL=index.js.map
5898
6061
  //# sourceMappingURL=index.js.map